diff --git a/Gemfile b/Gemfile index 3f0e187ff..584fd0025 100644 --- a/Gemfile +++ b/Gemfile @@ -1,7 +1,7 @@ source 'https://rubygems.org' ruby '2.0.0' -gem 'rails', '~> 4.0.5' +gem 'rails', '~> 4.1.1' gem 'magiconf' gem 'omniauth' @@ -56,7 +56,7 @@ group :test do gem 'capybara' gem 'factory_girl' gem 'poltergeist' - gem 'shoulda-matchers' + gem 'shoulda-matchers', github: 'thoughtbot/shoulda-matchers', ref: '380d18f0621c66a79445ebc6dcc0048fcc969911' gem 'database_cleaner' gem 'vcr', require: false gem 'webmock', require: false diff --git a/Gemfile.lock b/Gemfile.lock index 12f464be4..b582fe14d 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -5,6 +5,14 @@ GIT octokit (3.0.0) sawyer (~> 0.5.3) +GIT + remote: git://github.com/thoughtbot/shoulda-matchers.git + revision: 380d18f0621c66a79445ebc6dcc0048fcc969911 + ref: 380d18f0621c66a79445ebc6dcc0048fcc969911 + specs: + shoulda-matchers (2.6.1) + activesupport (>= 3.0.0) + GIT remote: git://github.com/tobiassvn/sidetiq.git revision: 4f7d7daea3873443b17bf2f3da61619532bbeba2 @@ -26,35 +34,37 @@ GIT GEM remote: https://rubygems.org/ specs: - actionmailer (4.0.5) - actionpack (= 4.0.5) + actionmailer (4.1.1) + actionpack (= 4.1.1) + actionview (= 4.1.1) mail (~> 2.5.4) - actionpack (4.0.5) - activesupport (= 4.0.5) - builder (~> 3.1.0) - erubis (~> 2.7.0) + actionpack (4.1.1) + actionview (= 4.1.1) + activesupport (= 4.1.1) rack (~> 1.5.2) rack-test (~> 0.6.2) - activemodel (4.0.5) - activesupport (= 4.0.5) - builder (~> 3.1.0) - activerecord (4.0.5) - activemodel (= 4.0.5) - activerecord-deprecated_finders (~> 1.0.2) - activesupport (= 4.0.5) - arel (~> 4.0.0) - activerecord-deprecated_finders (1.0.3) - activesupport (4.0.5) + actionview (4.1.1) + activesupport (= 4.1.1) + builder (~> 3.1) + erubis (~> 2.7.0) + activemodel (4.1.1) + activesupport (= 4.1.1) + builder (~> 3.1) + activerecord (4.1.1) + activemodel (= 4.1.1) + activesupport (= 4.1.1) + arel (~> 5.0.0) + activesupport (4.1.1) i18n (~> 0.6, >= 0.6.9) - minitest (~> 4.2) - multi_json (~> 1.3) + json (~> 1.7, >= 1.7.7) + minitest (~> 5.1) thread_safe (~> 0.1) - tzinfo (~> 0.3.37) + tzinfo (~> 1.1) addressable (2.3.6) analytics-ruby (1.0.0) and_feathers (1.0.0.pre.1) and_feathers-gzipped_tarball (1.0.0.pre) - arel (4.0.2) + arel (5.0.1.20140414130214) ast (1.1.0) aws-sdk (1.38.0) json (~> 1.4) @@ -64,7 +74,7 @@ GEM descendants_tracker (~> 0.0.4) ice_nine (~> 0.11.0) thread_safe (~> 0.3, >= 0.3.1) - builder (3.1.4) + builder (3.2.2) byebug (2.7.0) columnize (~> 0.3) debugger-linecache (~> 1.2) @@ -153,7 +163,7 @@ GEM highline (1.6.21) hike (1.2.3) htmlentities (4.3.1) - httparty (0.13.0) + httparty (0.13.1) json (~> 1.8) multi_xml (>= 0.5.2) i18n (0.6.9) @@ -172,7 +182,7 @@ GEM kgio (2.9.2) launchy (2.4.2) addressable (~> 2.3) - license_finder (1.0.0.0) + license_finder (1.1.0) bundler httparty sequel @@ -188,7 +198,7 @@ GEM method_source (0.8.2) mime-types (1.25.1) mini_portile (0.6.0) - minitest (4.7.5) + minitest (5.3.4) mixlib-authentication (1.3.0) mixlib-log mixlib-cli (1.4.0) @@ -196,7 +206,7 @@ GEM mixlib-log (1.6.0) mixlib-shellout (1.3.0) moneta (0.6.0) - multi_json (1.10.0) + multi_json (1.10.1) multi_xml (0.5.5) multipart-post (2.0.0) net-ssh (2.8.0) @@ -251,7 +261,7 @@ GEM cliver (~> 0.3.1) multi_json (~> 1.0) websocket-driver (>= 0.2.0) - polyglot (0.3.4) + polyglot (0.3.5) powerpack (0.0.9) premailer (1.8.2) css_parser (>= 1.3.5) @@ -272,17 +282,19 @@ GEM rack (1.5.2) rack-test (0.6.2) rack (>= 1.0) - rails (4.0.5) - actionmailer (= 4.0.5) - actionpack (= 4.0.5) - activerecord (= 4.0.5) - activesupport (= 4.0.5) + rails (4.1.1) + actionmailer (= 4.1.1) + actionpack (= 4.1.1) + actionview (= 4.1.1) + activemodel (= 4.1.1) + activerecord (= 4.1.1) + activesupport (= 4.1.1) bundler (>= 1.3.0, < 2.0) - railties (= 4.0.5) - sprockets-rails (~> 2.0.0) - railties (4.0.5) - actionpack (= 4.0.5) - activesupport (= 4.0.5) + railties (= 4.1.1) + sprockets-rails (~> 2.0) + railties (4.1.1) + actionpack (= 4.1.1) + activesupport (= 4.1.1) rake (>= 0.8.7) thor (>= 0.18.1, < 2.0) rainbow (2.0.0) @@ -328,9 +340,7 @@ GEM faraday (>= 0.7.6) hashie (>= 1.1.0) uuidtools - sequel (4.9.0) - shoulda-matchers (2.5.0) - activesupport (>= 3.0.0) + sequel (4.11.0) sidekiq (3.0.0) celluloid (>= 0.15.2) connection_pool (>= 2.0.0) @@ -353,7 +363,7 @@ GEM multi_json (~> 1.0) rack (~> 1.0) tilt (~> 1.1, != 1.3.0) - sprockets-rails (2.0.1) + sprockets-rails (2.1.3) actionpack (>= 3.0) activesupport (>= 3.0) sprockets (~> 2.8) @@ -363,14 +373,15 @@ GEM term-ansicolor (1.3.0) tins (~> 1.0) thor (0.19.1) - thread_safe (0.3.3) + thread_safe (0.3.4) tilt (1.4.1) timers (1.1.0) tins (1.1.0) treetop (1.4.15) polyglot polyglot (>= 0.3.1) - tzinfo (0.3.39) + tzinfo (1.2.1) + thread_safe (~> 0.1) uglifier (2.5.0) execjs (>= 0.3.0) json (>= 1.8.0) @@ -438,14 +449,14 @@ DEPENDENCIES premailer-rails pundit quiet_assets - rails (~> 4.0.5) + rails (~> 4.1.1) redcarpet rspec-rails rubocop sass-rails (~> 4.0.1) semverse sentry-raven (~> 0.8.0) - shoulda-matchers + shoulda-matchers! sidekiq sidetiq! sitemap_generator diff --git a/app/assets/stylesheets/variables.scss b/app/assets/stylesheets/variables.scss index f9c2b3cd5..fb0a600fa 100644 --- a/app/assets/stylesheets/variables.scss +++ b/app/assets/stylesheets/variables.scss @@ -100,11 +100,9 @@ O Generic */ @font-face { font-family: "platform_icons"; - src: url(image-path('platform_icons.ttf')); - src: url(image-path('platform_icons?#iefix')) format('embedded-opentype'), - url(image-path('platform_icons.woff')) format('woff'), - url(image-path('platform_icons.ttf')) format('truetype'), - url(image-path('platform_icons.svg#platform_icons')) format('svg'); + src: url(asset-path('platform_icons.woff')) format('woff'), + url(asset-path('platform_icons.ttf')) format('truetype'), + url(asset-path('platform_icons.svg')) format('svg'); font-weight: normal; font-style: normal; } diff --git a/app/controllers/api/v1/cookbooks_controller.rb b/app/controllers/api/v1/cookbooks_controller.rb index 979c6e4bc..c7544fe1e 100644 --- a/app/controllers/api/v1/cookbooks_controller.rb +++ b/app/controllers/api/v1/cookbooks_controller.rb @@ -55,6 +55,8 @@ def search @results = Cookbook.search( params.fetch(:q, nil) ).offset(@start).limit(@items) + + @total = @results.count(:all) end private diff --git a/app/controllers/cookbooks_controller.rb b/app/controllers/cookbooks_controller.rb index 61e854de8..b1c2d3a2d 100644 --- a/app/controllers/cookbooks_controller.rb +++ b/app/controllers/cookbooks_controller.rb @@ -27,6 +27,7 @@ def index @cookbooks = @cookbooks.search(params[:q]) end + @number_of_cookbooks = @cookbooks.count(:all) @cookbooks = @cookbooks.page(params[:page]).per(20) respond_to do |format| diff --git a/app/views/api/v1/cookbooks/search.json.jbuilder b/app/views/api/v1/cookbooks/search.json.jbuilder index 4b6cd2f8b..f118051ec 100644 --- a/app/views/api/v1/cookbooks/search.json.jbuilder +++ b/app/views/api/v1/cookbooks/search.json.jbuilder @@ -1,5 +1,5 @@ json.start @start -json.total @results.count +json.total @total json.items @results do |cookbook| json.cookbook_name cookbook.name json.cookbook_maintainer cookbook.maintainer diff --git a/app/views/application/_flash.html.erb b/app/views/application/_flash.html.erb index 07650a66a..3cf0f2449 100644 --- a/app/views/application/_flash.html.erb +++ b/app/views/application/_flash.html.erb @@ -1,6 +1,6 @@ <% flash.each do |name, msg| %> <% if msg.is_a?(String) %> -
"> +
"> <%= content_tag :div, msg %> ×
diff --git a/app/views/cookbooks/index.html.erb b/app/views/cookbooks/index.html.erb index 2c0bd2df9..a539af345 100644 --- a/app/views/cookbooks/index.html.erb +++ b/app/views/cookbooks/index.html.erb @@ -11,7 +11,7 @@

- <%= pluralize(@cookbooks.count, 'Cookbook') %> + <%= pluralize(@number_of_cookbooks, 'Cookbook') %> <%= link_to ' RSS'.html_safe, params.merge(format: 'atom'), :class => 'rss_feed_link show-for-medium-up' %> diff --git a/spec/authorizers/cla_signature_authorizer_spec.rb b/spec/authorizers/cla_signature_authorizer_spec.rb index 2c312236f..7842d6521 100644 --- a/spec/authorizers/cla_signature_authorizer_spec.rb +++ b/spec/authorizers/cla_signature_authorizer_spec.rb @@ -8,25 +8,25 @@ context 'as an admin' do let(:user) { build(:user, roles: 'admin') } - it { should permit(:index) } - it { should permit(:show) } - it { should permit(:create) } - it { should permit(:update) } - it { should permit(:destroy) } - it { should permit(:edit) } - it { should permit(:new) } + it { should permit_authorization(:index) } + it { should permit_authorization(:show) } + it { should permit_authorization(:create) } + it { should permit_authorization(:update) } + it { should permit_authorization(:destroy) } + it { should permit_authorization(:edit) } + it { should permit_authorization(:new) } end context 'as a user with a cla owned by said user' do let(:user) { build(:user) } let(:record) { build(:icla_signature, user: user) } - it { should permit(:index) } - it { should permit(:show) } - it { should permit(:create) } - it { should permit(:update) } - it { should permit(:destroy) } - it { should permit(:edit) } - it { should permit(:new) } + it { should permit_authorization(:index) } + it { should permit_authorization(:show) } + it { should permit_authorization(:create) } + it { should permit_authorization(:update) } + it { should permit_authorization(:destroy) } + it { should permit_authorization(:edit) } + it { should permit_authorization(:new) } end end diff --git a/spec/authorizers/cookbook_authorizer_spec.rb b/spec/authorizers/cookbook_authorizer_spec.rb index c6e2b82d1..1ad294474 100644 --- a/spec/authorizers/cookbook_authorizer_spec.rb +++ b/spec/authorizers/cookbook_authorizer_spec.rb @@ -8,10 +8,10 @@ subject { described_class.new(user, record) } - it { should permit(:create) } - it { should permit(:destroy) } - it { should permit(:create_collaborator) } - it { should permit(:manage_cookbook_urls) } + it { should permit_authorization(:create) } + it { should permit_authorization(:destroy) } + it { should permit_authorization(:create_collaborator) } + it { should permit_authorization(:manage_cookbook_urls) } end context 'as a cookbook collaborator' do @@ -23,10 +23,10 @@ create(:cookbook_collaborator, user: user, cookbook: record) end - it { should_not permit(:create_collaborator) } - it { should_not permit(:destroy) } - it { should permit(:create) } - it { should permit(:manage_cookbook_urls) } + it { should_not permit_authorization(:create_collaborator) } + it { should_not permit_authorization(:destroy) } + it { should permit_authorization(:create) } + it { should permit_authorization(:manage_cookbook_urls) } end context 'as not the cookbook owner or a cookbook collaborator' do @@ -34,9 +34,9 @@ subject { described_class.new(user, record) } - it { should_not permit(:create) } - it { should_not permit(:destroy) } - it { should_not permit(:create_collaborator) } - it { should_not permit(:manage_cookbook_urls) } + it { should_not permit_authorization(:create) } + it { should_not permit_authorization(:destroy) } + it { should_not permit_authorization(:create_collaborator) } + it { should_not permit_authorization(:manage_cookbook_urls) } end end diff --git a/spec/authorizers/cookbook_collaborator_authorizer_spec.rb b/spec/authorizers/cookbook_collaborator_authorizer_spec.rb index 852d8abc7..e0dfd1e1c 100644 --- a/spec/authorizers/cookbook_collaborator_authorizer_spec.rb +++ b/spec/authorizers/cookbook_collaborator_authorizer_spec.rb @@ -9,17 +9,17 @@ context 'as the cookbook owner' do subject { described_class.new(sally, cookbook_collaborator) } - it { should permit(:transfer) } - it { should permit(:create) } - it { should permit(:destroy) } + it { should permit_authorization(:transfer) } + it { should permit_authorization(:create) } + it { should permit_authorization(:destroy) } end context 'as a cookbook collaborator' do subject { described_class.new(hank, cookbook_collaborator) } - it { should_not permit(:transfer) } - it { should_not permit(:create) } - it { should permit(:destroy) } + it { should_not permit_authorization(:transfer) } + it { should_not permit_authorization(:create) } + it { should permit_authorization(:destroy) } end context 'as neither the owner nor a collaborator' do @@ -27,8 +27,8 @@ subject { described_class.new(pete, cookbook_collaborator) } - it { should_not permit(:transfer) } - it { should_not permit(:create) } - it { should_not permit(:destroy) } + it { should_not permit_authorization(:transfer) } + it { should_not permit_authorization(:create) } + it { should_not permit_authorization(:destroy) } end end diff --git a/spec/authorizers/invitation_authorizer_spec.rb b/spec/authorizers/invitation_authorizer_spec.rb index 196a1ce37..676bf9677 100644 --- a/spec/authorizers/invitation_authorizer_spec.rb +++ b/spec/authorizers/invitation_authorizer_spec.rb @@ -14,11 +14,11 @@ .user end - it { should permit(:index) } - it { should permit(:create) } - it { should permit(:update) } - it { should permit(:resend) } - it { should permit(:revoke) } + it { should permit_authorization(:index) } + it { should permit_authorization(:create) } + it { should permit_authorization(:update) } + it { should permit_authorization(:resend) } + it { should permit_authorization(:revoke) } end context 'as an organization contributor' do @@ -30,10 +30,10 @@ ).user end - it { should_not permit(:index) } - it { should_not permit(:create) } - it { should_not permit(:update) } - it { should_not permit(:resend) } - it { should_not permit(:revoke) } + it { should_not permit_authorization(:index) } + it { should_not permit_authorization(:create) } + it { should_not permit_authorization(:update) } + it { should_not permit_authorization(:resend) } + it { should_not permit_authorization(:revoke) } end end diff --git a/spec/controllers/api/v1/cookbooks_controller_spec.rb b/spec/controllers/api/v1/cookbooks_controller_spec.rb index 5fa552e44..4cb2f9a67 100644 --- a/spec/controllers/api/v1/cookbooks_controller_spec.rb +++ b/spec/controllers/api/v1/cookbooks_controller_spec.rb @@ -144,6 +144,12 @@ expect(assigns[:results]).to include(redis) end + it 'sends the total number of search results to the view' do + get :search, q: 'redis', format: :json + + expect(assigns[:total]).to eql(2) + end + it 'searches based on the query' do get :search, q: 'postgres', format: :json @@ -178,7 +184,7 @@ get :search, q: 'jam', items: 5, format: :json cookbooks = assigns[:results] - expect(cookbooks.size).to eql 5 + expect(cookbooks.count(:all)).to eql 5 end end end diff --git a/spec/controllers/collaborators_controller_spec.rb b/spec/controllers/collaborators_controller_spec.rb index 137b07d74..e0c709893 100644 --- a/spec/controllers/collaborators_controller_spec.rb +++ b/spec/controllers/collaborators_controller_spec.rb @@ -24,7 +24,7 @@ it 'returns only collaborators matching the query string' do get :index, cookbook_id: cookbook, q: 'hank', format: :json collaborators = assigns[:collaborators] - expect(collaborators.size).to eql(2) + expect(collaborators.count(:all)).to eql(2) expect(collaborators.first).to eql(hank) expect(response).to be_success end diff --git a/spec/controllers/cookbooks_controller_spec.rb b/spec/controllers/cookbooks_controller_spec.rb index 75531e479..c26c66fb0 100644 --- a/spec/controllers/cookbooks_controller_spec.rb +++ b/spec/controllers/cookbooks_controller_spec.rb @@ -8,11 +8,9 @@ expect(assigns[:cookbooks]).to_not be_nil end - it 'paginates @cookbooks' do - create_list(:cookbook, 30) + it 'assigns @number_of_cookbooks' do get :index - - expect(assigns[:cookbooks].count).to eql(20) + expect(assigns[:number_of_cookbooks]).to_not be_nil end end diff --git a/spec/features/curry/curry_management_spec.rb b/spec/features/curry/curry_management_spec.rb index 4cb0cb37d..9dc65f8ab 100644 --- a/spec/features/curry/curry_management_spec.rb +++ b/spec/features/curry/curry_management_spec.rb @@ -37,7 +37,7 @@ end VCR.use_cassette('curry_remove_repo', record: :once) do - follow_relation 'remove_repository' + follow_first_relation 'remove_repository' end expect_to_see_success_message diff --git a/spec/support/matchers/authorizer_matcher.rb b/spec/support/matchers/authorizer_matcher.rb index cdfe9db8c..1c3bee394 100644 --- a/spec/support/matchers/authorizer_matcher.rb +++ b/spec/support/matchers/authorizer_matcher.rb @@ -1,4 +1,4 @@ -RSpec::Matchers.define :permit do |action| +RSpec::Matchers.define :permit_authorization do |action| match do |authorizer| authorizer.public_send("#{action}?") end diff --git a/spec/views/api/v1/cookbooks/search.json.jbuilder_spec.rb b/spec/views/api/v1/cookbooks/search.json.jbuilder_spec.rb index c8aaf86c9..dbf2018a2 100644 --- a/spec/views/api/v1/cookbooks/search.json.jbuilder_spec.rb +++ b/spec/views/api/v1/cookbooks/search.json.jbuilder_spec.rb @@ -4,6 +4,7 @@ let(:cookbook_record) { create(:cookbook, name: 'redis') } before do + assign(:total, 1) assign(:results, [cookbook_record]) assign(:start, 1) end