ettu 4.1.6 → 4.1.7

Sign up to get free protection for your applications and to get access to all the features.
Files changed (44) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +1 -0
  3. data/.travis.yml +5 -1
  4. data/Appraisals +7 -0
  5. data/README.md +6 -13
  6. data/Rakefile +2 -0
  7. data/ettu.gemspec +3 -4
  8. data/gemfiles/4.0.gemfile +7 -0
  9. data/gemfiles/4.1.gemfile +7 -0
  10. data/lib/ettu/configuration.rb +7 -8
  11. data/lib/ettu/version.rb +1 -1
  12. data/spec/controllers/users_controller_spec.rb +66 -0
  13. data/spec/dummy/.gitignore +3 -0
  14. data/spec/dummy/Rakefile +6 -0
  15. data/spec/dummy/app/assets/javascripts/application.js +15 -0
  16. data/spec/dummy/app/assets/javascripts/test.js +1 -0
  17. data/spec/dummy/app/assets/stylesheets/application.css +13 -0
  18. data/spec/dummy/app/controllers/application_controller.rb +13 -0
  19. data/spec/dummy/app/controllers/users_controller.rb +9 -0
  20. data/spec/dummy/app/models/user.rb +12 -0
  21. data/spec/dummy/app/views/layouts/application.html.erb +14 -0
  22. data/spec/dummy/app/views/users/index.html.erb +1 -0
  23. data/spec/dummy/config.ru +4 -0
  24. data/spec/dummy/config/application.rb +28 -0
  25. data/spec/dummy/config/boot.rb +5 -0
  26. data/spec/dummy/config/environment.rb +5 -0
  27. data/spec/dummy/config/environments/test.rb +36 -0
  28. data/spec/dummy/config/initializers/secret_token.rb +12 -0
  29. data/spec/dummy/config/initializers/session_store.rb +3 -0
  30. data/spec/dummy/config/initializers/wrap_parameters.rb +14 -0
  31. data/spec/dummy/config/routes.rb +3 -0
  32. data/spec/dummy/db/.keep +0 -0
  33. data/spec/dummy/public/assets/application-90b1f92061b701bdbc2f2c364a42eed3.js +15 -0
  34. data/spec/dummy/public/assets/application-90b1f92061b701bdbc2f2c364a42eed3.js.gz +0 -0
  35. data/spec/dummy/public/assets/application-a029bd03bea21da7d02c0e9d272edc3a.css +14 -0
  36. data/spec/dummy/public/assets/application-a029bd03bea21da7d02c0e9d272edc3a.css.gz +0 -0
  37. data/spec/dummy/public/assets/manifest-1b849aba8a84c4520cb7bc4fafa638c3.json +1 -0
  38. data/spec/{ettu_spec.rb → ettu/ettu_spec.rb} +51 -36
  39. data/spec/{fresh_when_spec.rb → ettu/fresh_when_spec.rb} +4 -0
  40. data/spec/spec_helper.rb +18 -17
  41. data/spec/support/fixtures.rb +38 -0
  42. data/spec/support/include_hash.rb +5 -0
  43. metadata +70 -13
  44. data/spec/fixtures.rb +0 -66
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: d8d18e525d41372caf60474f3435bc05ff4ba62b
4
- data.tar.gz: b2dac6236a6461d688f2f1e60ffaf4dc6cd9965c
3
+ metadata.gz: dd89c40045ea90c43db793ad2f85e69d2b62ba19
4
+ data.tar.gz: 7767fc54271d478182c3fa0f4969a07cc2336f53
5
5
  SHA512:
6
- metadata.gz: d52066c819518f1414d97a881f674fe520cf1ec063b85807cc93c606ddb726652a008361ae92663faa9c339368d6f5feb1ccef170faf090e4ff3f0fd5f335b9a
7
- data.tar.gz: 0e31c5edb6656cebc3bc306f7e65a70c0c373e929c7c6b63570db5e246bc57c39c10e0d4aa37b2eb94cd97d2ed1e627a030f05d91e7746f48b7988f5f8f3f6b2
6
+ metadata.gz: 05afbf54e850686a647f82999d4232792b985f8a27cbea0942e5bdebd9fc77bb9981f4a101a11a55ccbfd81c5e9c803e061aa3c05a432f24cb450a8c25d293ac
7
+ data.tar.gz: 284bccf8fd752796bcbe84d5c5c88ac447727e2a81d98d536011e9c87aad70def0a55fc23aa7987663a6118b76f4e7dc8947dccbc3c2a93039ceb549e96e4319
data/.gitignore CHANGED
@@ -16,3 +16,4 @@ test/tmp
16
16
  test/version_tmp
17
17
  tmp
18
18
  bin/
19
+ gemfiles/*.lock
data/.travis.yml CHANGED
@@ -3,4 +3,8 @@ rvm:
3
3
  - 1.9.3
4
4
  - 2.0.0
5
5
  - jruby-19mode
6
- - rbx-19mode
6
+ - rbx
7
+ gemfile:
8
+ - gemfiles/4.0.gemfile
9
+ - gemfiles/4.1.gemfile
10
+ script: 'bundle exec rake'
data/Appraisals ADDED
@@ -0,0 +1,7 @@
1
+ appraise '4.0' do
2
+ gem 'rails', '~> 4.0.0'
3
+ end
4
+
5
+ appraise '4.1' do
6
+ gem 'rails', '~> 4.1.0.rc1'
7
+ end
data/README.md CHANGED
@@ -1,8 +1,6 @@
1
- Ettu
1
+ Ettu [![Build Status](https://travis-ci.org/cloudspace/ettu.png)](https://travis-ci.org/cloudspace/ettu)
2
2
  ====
3
3
 
4
- [![Build Status](https://travis-ci.org/cloudspace/ettu.png?branch=v3)](https://travis-ci.org/cloudspace/ettu)
5
-
6
4
  Using Rails 4's `stale?` or `fresh_when`? Are your users seeing old view
7
5
  code even after new deploys? The Rails way `fresh_when(@product)`
8
6
  doesn't account for changes in your view code, you have to do it
@@ -100,21 +98,16 @@ implementation. Ettu makes sure to pass all the options you specify to
100
98
  Rails (like the `public` option). It's even coded as a drop-in gem that
101
99
  won't cause problems if it's not installed.
102
100
 
103
- RAILS_ENV=development Issues
104
- ----------------------------
105
-
106
- Until [rails/rails#11768](https://github.com/rails/rails/pull/11768)
107
- gets merged in, Ettu will not be able to detect changes in templates
108
- while in the **development** environment. This is not an issue that
109
- affects staging or production, because the template cache will be
110
- flushed after each deploy.
101
+ RAILS_ENV=development Gotchas
102
+ -----------------------------
111
103
 
112
- In the mean time, you can enable a monkey-patch with:
104
+ In order for Rails to detect changes to templates when testing `perform_caching`
105
+ in the **development** environment, you must disable `cache_template_loading`.
113
106
 
114
107
  ```ruby
115
108
  # config/environments/development.rb
116
109
  My::Application.configure do
117
- config.ettu.development_hack = true
110
+ config.action_view.cache_template_loading = false
118
111
  end
119
112
  ```
120
113
 
data/Rakefile CHANGED
@@ -1,5 +1,7 @@
1
+ require 'bundler/setup'
1
2
  require 'bundler/gem_tasks'
2
3
  require 'rspec/core/rake_task'
4
+ require 'appraisal'
3
5
 
4
6
  RSpec::Core::RakeTask.new(:spec)
5
7
 
data/ettu.gemspec CHANGED
@@ -8,8 +8,7 @@ Gem::Specification.new do |spec|
8
8
  spec.version = Ettu::VERSION
9
9
  spec.author = 'Justin Ridgewell'
10
10
  spec.email = 'jridgewell@cloudspace.com'
11
- spec.description = %q{Account for js, css, and views when using ETags.}
12
- spec.summary = %q{Account for view code when using ETags.}
11
+ spec.summary = %q{Add Assets and Views into the Rails ETag Equation.}
13
12
  spec.homepage = 'http://github.com/cloudspace/ettu'
14
13
  spec.license = 'MIT'
15
14
 
@@ -22,6 +21,6 @@ Gem::Specification.new do |spec|
22
21
  spec.add_dependency 'rails', '~> 4.0'
23
22
  spec.add_development_dependency 'bundler', '~> 1.3'
24
23
  spec.add_development_dependency 'rake'
25
- spec.add_development_dependency 'rspec'
26
- spec.add_development_dependency 'simplecov'
24
+ spec.add_development_dependency 'rspec-rails'
25
+ spec.add_development_dependency 'appraisal'
27
26
  end
@@ -0,0 +1,7 @@
1
+ # This file was generated by Appraisal
2
+
3
+ source "https://rubygems.org"
4
+
5
+ gem "rails", "~> 4.0.0"
6
+
7
+ gemspec :path=>"../"
@@ -0,0 +1,7 @@
1
+ # This file was generated by Appraisal
2
+
3
+ source "https://rubygems.org"
4
+
5
+ gem "rails", "~> 4.1.0.rc1"
6
+
7
+ gemspec :path=>"../"
@@ -21,7 +21,7 @@ class Ettu
21
21
  # self.view = "#{controller_name}/#{action_name}"
22
22
  delete :view if key? :view
23
23
 
24
- self.template_digestor = LateLoadTempalteDigestor.new(self, :template_digestor)
24
+ self.template_digestor = LateLoadTemplateDigestor.new(self, :template_digestor)
25
25
  end
26
26
 
27
27
  class LateLoad
@@ -37,14 +37,7 @@ class Ettu
37
37
  end
38
38
  end
39
39
 
40
- class LateLoadTempalteDigestor < LateLoad
41
- def defaults
42
- ::ActionView::Digestor
43
- end
44
- end
45
-
46
40
  class LateLoadAssets < LateLoad
47
-
48
41
  def to_a
49
42
  super
50
43
  end
@@ -53,5 +46,11 @@ class Ettu
53
46
  ::ActionView::Base.assets_manifest.assets.keys
54
47
  end
55
48
  end
49
+
50
+ class LateLoadTemplateDigestor < LateLoad
51
+ def defaults
52
+ ::ActionView::Digestor
53
+ end
54
+ end
56
55
  end
57
56
  end
data/lib/ettu/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  class Ettu
2
- VERSION = '4.1.6'
2
+ VERSION = '4.1.7'
3
3
  end
@@ -0,0 +1,66 @@
1
+ require 'spec_helper'
2
+
3
+ # This spec was generated by rspec-rails when you ran the scaffold generator.
4
+ # It demonstrates how one might use RSpec to specify the controller code that
5
+ # was generated by Rails when you ran the scaffold generator.
6
+ #
7
+ # It assumes that the implementation code is generated by the rails scaffold
8
+ # generator. If you are using any extension libraries to generate different
9
+ # controller code, this generated spec may or may not pass.
10
+ #
11
+ # It only uses APIs available in rails and/or rspec-rails. There are a number
12
+ # of tools you can use to make these specs even more expressive, but we're
13
+ # sticking to rails and rspec-rails APIs to keep things simple and stable.
14
+ #
15
+ # Compared to earlier versions of this generator, there is very limited use of
16
+ # stubs and message expectations in this spec. Stubs are only used when there
17
+ # is no simpler way to get a handle on the object needed for the example.
18
+ # Message expectations are only used when there is no simpler way to specify
19
+ # that an instance is receiving a specific message.
20
+
21
+ describe UsersController do
22
+
23
+ describe 'Integration Test' do
24
+ before(:each) { get :index }
25
+ subject(:hash) { assigns(:user) }
26
+ subject(:user) { User.instance }
27
+
28
+ it 'returns fresh_when hash' do
29
+ expect(hash).to be_a(Hash)
30
+ end
31
+
32
+ describe 'hash[:etag]' do
33
+ subject(:etags) { hash[:etag] }
34
+
35
+ it 'sets :etag to array' do
36
+ expect(etags).to be_a(Array)
37
+ end
38
+
39
+ it 'includes records cache_key' do
40
+ expect(etags).to include(user.cache_key)
41
+ end
42
+
43
+ it 'includes all views digest' do
44
+ path = controller.request.path_parameters
45
+ page = ::ActionView::Digestor.cache.keys.first
46
+
47
+ expect(page).to match(/#{path['controller']}\/#{path['action']}/)
48
+ expect(etags).to include(::ActionView::Digestor.cache[page])
49
+ end
50
+
51
+ it 'includes all asset digests' do
52
+ expect(etags).to include(*(::ActionView::Base.assets_manifest.assets.values))
53
+ end
54
+ end
55
+
56
+ describe 'hash[:last_modified]' do
57
+ subject(:last_modified) { hash[:last_modified] }
58
+
59
+ it 'sets last_modified to records updated_at' do
60
+ expect(last_modified).to eq(user.updated_at)
61
+ end
62
+ end
63
+
64
+ end
65
+
66
+ end
@@ -0,0 +1,3 @@
1
+ /db/*
2
+ !/db/.keep
3
+ /log/
@@ -0,0 +1,6 @@
1
+ # Add your own tasks in files placed in lib/tasks ending in .rake,
2
+ # for example lib/tasks/capistrano.rake, and they will automatically be available to Rake.
3
+
4
+ require File.expand_path('../config/application', __FILE__)
5
+
6
+ Dummy::Application.load_tasks
@@ -0,0 +1,15 @@
1
+ // This is a manifest file that'll be compiled into application.js, which will include all the files
2
+ // listed below.
3
+ //
4
+ // Any JavaScript/Coffee file within this directory, lib/assets/javascripts, vendor/assets/javascripts,
5
+ // or vendor/assets/javascripts of plugins, if any, can be referenced here using a relative path.
6
+ //
7
+ // It's not advisable to add code directly here, but if you do, it'll appear at the bottom of the
8
+ // compiled file.
9
+ //
10
+ // Read Sprockets README (https://github.com/sstephenson/sprockets#sprockets-directives) for details
11
+ // about supported directives.
12
+ //
13
+ //= require_tree .
14
+
15
+ var test = true;
@@ -0,0 +1 @@
1
+ var test2 = true;
@@ -0,0 +1,13 @@
1
+ /*
2
+ * This is a manifest file that'll be compiled into application.css, which will include all the files
3
+ * listed below.
4
+ *
5
+ * Any CSS and SCSS file within this directory, lib/assets/stylesheets, vendor/assets/stylesheets,
6
+ * or vendor/assets/stylesheets of plugins, if any, can be referenced here using a relative path.
7
+ *
8
+ * You're free to add application-wide styles to this file and they'll appear at the top of the
9
+ * compiled file, but it's generally better to create a new file per style scope.
10
+ *
11
+ *= require_self
12
+ *= require_tree .
13
+ */
@@ -0,0 +1,13 @@
1
+ class ApplicationController < ActionController::Base
2
+ # Prevent CSRF attacks by raising an exception.
3
+ # For APIs, you may want to use :null_session instead.
4
+ protect_from_forgery with: :exception
5
+ end
6
+
7
+ module ::ActionController
8
+ module ConditionalGet
9
+ def fresh_when(*args)
10
+ [*args].last
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,9 @@
1
+ class UsersController < ApplicationController
2
+
3
+ # GET /users
4
+ def index
5
+ user = User.instance
6
+ @user = fresh_when user
7
+ end
8
+
9
+ end
@@ -0,0 +1,12 @@
1
+ class User < Struct.new(:user)
2
+ cattr_reader :instance
3
+ @@instance = User.new(:test)
4
+
5
+ def cache_key
6
+ user
7
+ end
8
+
9
+ def updated_at
10
+ @time ||= Time.now.to_i
11
+ end
12
+ end
@@ -0,0 +1,14 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <title>Dummy</title>
5
+ <%= stylesheet_link_tag "application", media: "all", "data-turbolinks-track" => true %>
6
+ <%= javascript_include_tag "application", "data-turbolinks-track" => true %>
7
+ <%= csrf_meta_tags %>
8
+ </head>
9
+ <body>
10
+
11
+ <%= yield %>
12
+
13
+ </body>
14
+ </html>
@@ -0,0 +1 @@
1
+ <h1>Users Index</h1>
@@ -0,0 +1,4 @@
1
+ # This file is used by Rack-based servers to start the application.
2
+
3
+ require ::File.expand_path('../config/environment', __FILE__)
4
+ run Rails.application
@@ -0,0 +1,28 @@
1
+ require File.expand_path('../boot', __FILE__)
2
+
3
+ # Pick the frameworks you want:
4
+ # require "active_record/railtie"
5
+ require "action_controller/railtie"
6
+ require "action_mailer/railtie"
7
+ require "sprockets/railtie"
8
+ # require "rails/test_unit/railtie"
9
+
10
+ Bundler.require(*Rails.groups)
11
+ require "ettu"
12
+
13
+ module Dummy
14
+ class Application < Rails::Application
15
+ # Settings in config/environments/* take precedence over those specified here.
16
+ # Application configuration should go into files in config/initializers
17
+ # -- all .rb files in that directory are automatically loaded.
18
+
19
+ # Set Time.zone default to the specified zone and make Active Record auto-convert to this zone.
20
+ # Run "rake -D time" for a list of tasks for finding time zone names. Default is UTC.
21
+ # config.time_zone = 'Central Time (US & Canada)'
22
+
23
+ # The default locale is :en and all translations from config/locales/*.rb,yml are auto loaded.
24
+ # config.i18n.load_path += Dir[Rails.root.join('my', 'locales', '*.{rb,yml}').to_s]
25
+ # config.i18n.default_locale = :de
26
+ end
27
+ end
28
+
@@ -0,0 +1,5 @@
1
+ # Set up gems listed in the Gemfile.
2
+ ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../../../../Gemfile', __FILE__)
3
+
4
+ require 'bundler/setup' if File.exists?(ENV['BUNDLE_GEMFILE'])
5
+ $LOAD_PATH.unshift File.expand_path('../../../../lib', __FILE__)
@@ -0,0 +1,5 @@
1
+ # Load the Rails application.
2
+ require File.expand_path('../application', __FILE__)
3
+
4
+ # Initialize the Rails application.
5
+ Dummy::Application.initialize!
@@ -0,0 +1,36 @@
1
+ Dummy::Application.configure do
2
+ # Settings specified here will take precedence over those in config/application.rb.
3
+
4
+ # The test environment is used exclusively to run your application's
5
+ # test suite. You never need to work with it otherwise. Remember that
6
+ # your test database is "scratch space" for the test suite and is wiped
7
+ # and recreated between test runs. Don't rely on the data there!
8
+ config.cache_classes = true
9
+
10
+ # Do not eager load code on boot. This avoids loading your whole application
11
+ # just for the purpose of running a single test. If you are using a tool that
12
+ # preloads Rails for running tests, you may have to set it to true.
13
+ config.eager_load = false
14
+
15
+ # Configure static asset server for tests with Cache-Control for performance.
16
+ config.serve_static_assets = true
17
+ config.static_cache_control = "public, max-age=3600"
18
+
19
+ # Show full error reports and disable caching.
20
+ config.consider_all_requests_local = true
21
+ config.action_controller.perform_caching = false
22
+
23
+ # Raise exceptions instead of rendering exception templates.
24
+ config.action_dispatch.show_exceptions = false
25
+
26
+ # Disable request forgery protection in test environment.
27
+ config.action_controller.allow_forgery_protection = false
28
+
29
+ # Tell Action Mailer not to deliver emails to the real world.
30
+ # The :test delivery method accumulates sent emails in the
31
+ # ActionMailer::Base.deliveries array.
32
+ config.action_mailer.delivery_method = :test
33
+
34
+ # Print deprecation notices to the stderr.
35
+ config.active_support.deprecation = :stderr
36
+ end
@@ -0,0 +1,12 @@
1
+ # Be sure to restart your server when you modify this file.
2
+
3
+ # Your secret key is used for verifying the integrity of signed cookies.
4
+ # If you change this key, all old signed cookies will become invalid!
5
+
6
+ # Make sure the secret is at least 30 characters and all random,
7
+ # no regular words or you'll be exposed to dictionary attacks.
8
+ # You can use `rake secret` to generate a secure secret key.
9
+
10
+ # Make sure your secret_key_base is kept private
11
+ # if you're sharing your code publicly.
12
+ Dummy::Application.config.secret_key_base = 'aaf99661e9b1020f700b99f4be4677c0d2d0afeecebbcadb665bc71eb9fe9a9fdd710ba84a3c5467c0a6432feda39eafa6901e987ef6bc18678c3c1cb1f982bf'
@@ -0,0 +1,3 @@
1
+ # Be sure to restart your server when you modify this file.
2
+
3
+ Dummy::Application.config.session_store :cookie_store, key: '_dummy_session'
@@ -0,0 +1,14 @@
1
+ # Be sure to restart your server when you modify this file.
2
+
3
+ # This file contains settings for ActionController::ParamsWrapper which
4
+ # is enabled by default.
5
+
6
+ # Enable parameter wrapping for JSON. You can disable this by setting :format to an empty array.
7
+ ActiveSupport.on_load(:action_controller) do
8
+ wrap_parameters format: [:json] if respond_to?(:wrap_parameters)
9
+ end
10
+
11
+ # To enable root element in JSON for ActiveRecord objects.
12
+ # ActiveSupport.on_load(:active_record) do
13
+ # self.include_root_in_json = true
14
+ # end
@@ -0,0 +1,3 @@
1
+ Dummy::Application.routes.draw do
2
+ get 'users' => 'users#index'
3
+ end
File without changes
@@ -0,0 +1,15 @@
1
+ // This is a manifest file that'll be compiled into application.js, which will include all the files
2
+ // listed below.
3
+ //
4
+ // Any JavaScript/Coffee file within this directory, lib/assets/javascripts, vendor/assets/javascripts,
5
+ // or vendor/assets/javascripts of plugins, if any, can be referenced here using a relative path.
6
+ //
7
+ // It's not advisable to add code directly here, but if you do, it'll appear at the bottom of the
8
+ // compiled file.
9
+ //
10
+ // Read Sprockets README (https://github.com/sstephenson/sprockets#sprockets-directives) for details
11
+ // about supported directives.
12
+ //
13
+
14
+
15
+ var test = true;
@@ -0,0 +1,14 @@
1
+ /*
2
+ * This is a manifest file that'll be compiled into application.css, which will include all the files
3
+ * listed below.
4
+ *
5
+ * Any CSS and SCSS file within this directory, lib/assets/stylesheets, vendor/assets/stylesheets,
6
+ * or vendor/assets/stylesheets of plugins, if any, can be referenced here using a relative path.
7
+ *
8
+ * You're free to add application-wide styles to this file and they'll appear at the top of the
9
+ * compiled file, but it's generally better to create a new file per style scope.
10
+ *
11
+
12
+
13
+ */
14
+
@@ -0,0 +1 @@
1
+ {"files":{"application-90b1f92061b701bdbc2f2c364a42eed3.js":{"logical_path":"application.js","mtime":"2014-03-12T14:36:29-04:00","size":599,"digest":"90b1f92061b701bdbc2f2c364a42eed3"},"application-a029bd03bea21da7d02c0e9d272edc3a.css":{"logical_path":"application.css","mtime":"2014-03-12T14:17:39-04:00","size":513,"digest":"a029bd03bea21da7d02c0e9d272edc3a"}},"assets":{"application.js":"application-90b1f92061b701bdbc2f2c364a42eed3.js","application.css":"application-a029bd03bea21da7d02c0e9d272edc3a.css"}}
@@ -1,19 +1,35 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe Ettu do
4
+ subject(:ettu) { Ettu.new(hash, {}, controller) }
5
+
4
6
  let(:controller) { Controller.new }
5
7
  let(:record) { Record.new(DateTime.now) }
6
8
  let(:hash) { { etag: record, last_modified: DateTime.now } }
7
9
 
8
- context 'when supplied with options' do
9
- before(:all) do
10
- Ettu.configure { |config| config.template_digestor = Digestor }
10
+ # NOTE: assets were created by running `rake assets:precompile`.
11
+ # It compiled application.js and application.css (but NOT
12
+ # test.js)
13
+ let(:assets) { ::ActionView::Base.assets_manifest.assets }
14
+ let(:files) { assets.keys }
15
+ let(:digests) { assets.values }
16
+
17
+ before(:each) do
18
+ Ettu.configure do |config|
19
+ config.reset
20
+ config.template_digestor = Digestor
11
21
  end
12
- let(:hash) { { assets: 'first.ext', view: 'custom/action' } }
13
- subject(:ettu) { Ettu.new(hash, {}, controller) }
22
+ end
23
+
24
+ after(:all) do
25
+ Ettu.configure { |config| config.reset }
26
+ end
27
+
28
+ context 'when supplied with options' do
29
+ let(:hash) { { assets: files.first, view: 'custom/action' } }
14
30
 
15
31
  it 'will use :asset option over default' do
16
- expect(ettu.asset_etags).to eq(['first.ext.digest'])
32
+ expect(ettu.asset_etags).to eq([digests.first])
17
33
  end
18
34
 
19
35
  it 'will use :view option over default' do
@@ -21,26 +37,34 @@ describe Ettu do
21
37
  end
22
38
  end
23
39
 
24
- describe '.configure' do
25
- subject(:ettu) { Ettu.new(nil, {}, controller) }
26
- before(:all) do
27
- Ettu.configure { |config| config.template_digestor = Digestor }
40
+ context 'when given asset that is not precompiled' do
41
+ it 'will digest the file if it exists' do
42
+ # NOTE: test.js is located at dummy/app/assets/javascripts/test.js
43
+ # It was added AFTER running `rake assets:precompile` (which compiled
44
+ # application.js and application.css).
45
+ def hash; { assets: 'test.js' }; end
46
+
47
+ expect(ettu.asset_etags).not_to be_empty
28
48
  end
29
- after(:all) { Ettu.configure { |config| config.reset } }
30
49
 
31
- context 'when no options are specified' do
32
- before(:all) do
33
- Ettu.configure do |config|
34
- config.assets = ['first.ext', 'second.ext']
35
- config.view = 'custom/view'
36
- end
37
- end
50
+ it 'will throw error if file does not exist' do
51
+ def hash; { assets: 'does_not_exist' }; end
52
+
53
+ expect{ ettu.asset_etags }.to raise_error
54
+ end
55
+ end
56
+
57
+ describe '.configure' do
58
+ let(:hash) { nil }
38
59
 
60
+ context 'when no options are specified' do
39
61
  it 'will use the default asset files' do
40
- expect(ettu.asset_etags).to eq(['first.ext.digest', 'second.ext.digest'])
62
+ expect(ettu.asset_etags).to eq(digests)
41
63
  end
42
64
 
43
65
  it 'will use the default view file' do
66
+ Ettu.configure { |config| config.view = 'custom/view' }
67
+
44
68
  expect(ettu.view_etag).to eq('custom/view.digest')
45
69
  end
46
70
  end
@@ -61,43 +85,34 @@ describe Ettu do
61
85
  end
62
86
 
63
87
  context 'when setting default to false' do
64
- before(:all) do
65
- Ettu.configure do |config|
66
- config.assets = false
67
- config.view = false
68
- end
69
- end
70
-
71
88
  it 'will disable asset etags' do
89
+ Ettu.configure { |config| config.assets = false }
90
+
72
91
  expect(ettu.asset_etags).to eq([nil])
73
92
  end
74
93
 
75
94
  it 'will disable view etags' do
95
+ Ettu.configure { |config| config.view = false }
96
+
76
97
  expect(ettu.view_etag).to eq(nil)
77
98
  end
78
99
  end
79
100
  end
80
101
 
81
102
  describe '#etags' do
82
- before(:all) do
83
- Ettu.configure { |config| config.template_digestor = Digestor }
84
- end
85
- let(:ettu) { Ettu.new(record, {}, controller) }
103
+ subject(:ettu) { Ettu.new(record, {}, controller) }
86
104
 
87
105
  it 'will collect all etags' do
88
- expected = [
89
- record, 'controller_name/action_name.digest',
90
- 'application.js.manifest', 'application.css.manifest',
91
- 'custom.js.manifest', 'custom.css.manifest',
92
- 'first.ext.manifest', 'second.ext.manifest'
93
- ]
106
+ expected = [record, 'controller_name/action_name.digest'] | digests
94
107
  result = ettu.etags
108
+
95
109
  expect(result).to include(*expected)
96
110
  expect(expected).to include(*result)
97
111
  end
98
112
 
99
113
  it 'will not allow nils' do
100
114
  ettu = Ettu.new(nil, {assets: [nil, nil, nil]}, controller )
115
+
101
116
  expect(ettu.etags).not_to include(nil)
102
117
  end
103
118
  end
@@ -6,6 +6,10 @@ describe Ettu::FreshWhen do
6
6
  Ettu.configure { |config| config.template_digestor = Digestor }
7
7
  end
8
8
 
9
+ after(:all) do
10
+ Ettu.configure { |config| config.reset }
11
+ end
12
+
9
13
  let(:record) { Record.new(DateTime.now) }
10
14
  let(:hash) { { random: true, options: true } }
11
15
  subject(:controller) { Controller.new }
data/spec/spec_helper.rb CHANGED
@@ -1,28 +1,29 @@
1
- # This file was generated by the `rspec --init` command. Conventionally, all
2
- # specs live under a `spec` directory, which RSpec adds to the `$LOAD_PATH`.
3
- # Require this file using `require "spec_helper"` to ensure that it is only
4
- # loaded once.
5
- #
6
- # See http://rubydoc.info/gems/rspec-core/RSpec/Core/Configuration
7
-
1
+ ENV['RAILS_ENV'] ||= 'test'
2
+ require File.expand_path('../dummy/config/environment', __FILE__)
3
+ require 'rspec/rails'
4
+ require 'rspec/autorun'
8
5
  require 'date'
9
6
  require 'active_support/ordered_options'
10
7
  require 'securerandom'
11
- RSpec::Matchers.define :include_hash do |expected|
12
- match do |actual|
13
- !actual.nil? &&
14
- !actual.empty? &&
15
- (actual.to_a & expected.to_a) == expected.to_a
16
- end
17
- end
18
8
 
19
- require 'simplecov'
20
- SimpleCov.start { add_filter '/spec/' }
9
+ # Requires supporting ruby files with custom matchers and macros, etc,
10
+ # in spec/support/ and its subdirectories.
11
+ Dir[File.join(File.expand_path('..', __FILE__), 'support/**/*.rb')].each { |f| require f }
21
12
 
22
13
  require 'ettu'
23
- require 'fixtures'
14
+
24
15
 
25
16
  RSpec.configure do |config|
26
17
  config.run_all_when_everything_filtered = true
18
+
19
+ # If true, the base class of anonymous controllers will be inferred
20
+ # automatically. This will be the default behavior in future versions of
21
+ # rspec-rails.
22
+ config.infer_base_class_for_anonymous_controllers = false
23
+
24
+ # Run specs in random order to surface order dependencies. If you find an
25
+ # order dependency and want to debug it, you can fix the order by providing
26
+ # the seed, which is printed after each run.
27
+ # --seed 1234
27
28
  config.order = 'random'
28
29
  end
@@ -0,0 +1,38 @@
1
+ class Nester < ActiveSupport::OrderedOptions
2
+ def initialize
3
+ super { |h, k| h[k] = Nester.new }
4
+ end
5
+ end
6
+
7
+ class Controller < Nester
8
+ def initialize
9
+ super
10
+
11
+ self.request.format = 'html'
12
+ self.controller_name = 'controller_name'
13
+ self.action_name = 'action_name'
14
+ end
15
+
16
+ module Freshness
17
+ def fresh_when(*args)
18
+ [*args]
19
+ end
20
+ end
21
+ include Freshness
22
+
23
+ include ::Ettu::FreshWhen
24
+ end
25
+
26
+ class Digestor
27
+ def self.method_missing(name, *args, &block)
28
+ args.first.to_s + '.digest'
29
+ end
30
+ end
31
+
32
+ class Record
33
+ attr_accessor :updated_at
34
+
35
+ def initialize(updated_at)
36
+ @updated_at = updated_at
37
+ end
38
+ end
@@ -0,0 +1,5 @@
1
+ RSpec::Matchers.define :include_hash do |expected|
2
+ match do |actual|
3
+ !actual.nil? && !actual.empty? && (actual.to_a & expected.to_a) == expected.to_a
4
+ end
5
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ettu
3
3
  version: !ruby/object:Gem::Version
4
- version: 4.1.6
4
+ version: 4.1.7
5
5
  platform: ruby
6
6
  authors:
7
7
  - Justin Ridgewell
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2013-08-13 00:00:00.000000000 Z
11
+ date: 2014-03-13 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
@@ -53,7 +53,7 @@ dependencies:
53
53
  - !ruby/object:Gem::Version
54
54
  version: '0'
55
55
  - !ruby/object:Gem::Dependency
56
- name: rspec
56
+ name: rspec-rails
57
57
  requirement: !ruby/object:Gem::Requirement
58
58
  requirements:
59
59
  - - '>='
@@ -67,7 +67,7 @@ dependencies:
67
67
  - !ruby/object:Gem::Version
68
68
  version: '0'
69
69
  - !ruby/object:Gem::Dependency
70
- name: simplecov
70
+ name: appraisal
71
71
  requirement: !ruby/object:Gem::Requirement
72
72
  requirements:
73
73
  - - '>='
@@ -80,7 +80,7 @@ dependencies:
80
80
  - - '>='
81
81
  - !ruby/object:Gem::Version
82
82
  version: '0'
83
- description: Account for js, css, and views when using ETags.
83
+ description:
84
84
  email: jridgewell@cloudspace.com
85
85
  executables: []
86
86
  extensions: []
@@ -89,21 +89,51 @@ files:
89
89
  - .gitignore
90
90
  - .rspec
91
91
  - .travis.yml
92
+ - Appraisals
92
93
  - Gemfile
93
94
  - LICENSE.txt
94
95
  - README.md
95
96
  - ROADMAP.md
96
97
  - Rakefile
97
98
  - ettu.gemspec
99
+ - gemfiles/4.0.gemfile
100
+ - gemfiles/4.1.gemfile
98
101
  - lib/ettu.rb
99
102
  - lib/ettu/configuration.rb
100
103
  - lib/ettu/fresh_when.rb
101
104
  - lib/ettu/railtie.rb
102
105
  - lib/ettu/version.rb
103
- - spec/ettu_spec.rb
104
- - spec/fixtures.rb
105
- - spec/fresh_when_spec.rb
106
+ - spec/controllers/users_controller_spec.rb
107
+ - spec/dummy/.gitignore
108
+ - spec/dummy/Rakefile
109
+ - spec/dummy/app/assets/javascripts/application.js
110
+ - spec/dummy/app/assets/javascripts/test.js
111
+ - spec/dummy/app/assets/stylesheets/application.css
112
+ - spec/dummy/app/controllers/application_controller.rb
113
+ - spec/dummy/app/controllers/users_controller.rb
114
+ - spec/dummy/app/models/user.rb
115
+ - spec/dummy/app/views/layouts/application.html.erb
116
+ - spec/dummy/app/views/users/index.html.erb
117
+ - spec/dummy/config.ru
118
+ - spec/dummy/config/application.rb
119
+ - spec/dummy/config/boot.rb
120
+ - spec/dummy/config/environment.rb
121
+ - spec/dummy/config/environments/test.rb
122
+ - spec/dummy/config/initializers/secret_token.rb
123
+ - spec/dummy/config/initializers/session_store.rb
124
+ - spec/dummy/config/initializers/wrap_parameters.rb
125
+ - spec/dummy/config/routes.rb
126
+ - spec/dummy/db/.keep
127
+ - spec/dummy/public/assets/application-90b1f92061b701bdbc2f2c364a42eed3.js
128
+ - spec/dummy/public/assets/application-90b1f92061b701bdbc2f2c364a42eed3.js.gz
129
+ - spec/dummy/public/assets/application-a029bd03bea21da7d02c0e9d272edc3a.css
130
+ - spec/dummy/public/assets/application-a029bd03bea21da7d02c0e9d272edc3a.css.gz
131
+ - spec/dummy/public/assets/manifest-1b849aba8a84c4520cb7bc4fafa638c3.json
132
+ - spec/ettu/ettu_spec.rb
133
+ - spec/ettu/fresh_when_spec.rb
106
134
  - spec/spec_helper.rb
135
+ - spec/support/fixtures.rb
136
+ - spec/support/include_hash.rb
107
137
  homepage: http://github.com/cloudspace/ettu
108
138
  licenses:
109
139
  - MIT
@@ -124,12 +154,39 @@ required_rubygems_version: !ruby/object:Gem::Requirement
124
154
  version: '0'
125
155
  requirements: []
126
156
  rubyforge_project:
127
- rubygems_version: 2.0.0
157
+ rubygems_version: 2.0.2
128
158
  signing_key:
129
159
  specification_version: 4
130
- summary: Account for view code when using ETags.
160
+ summary: Add Assets and Views into the Rails ETag Equation.
131
161
  test_files:
132
- - spec/ettu_spec.rb
133
- - spec/fixtures.rb
134
- - spec/fresh_when_spec.rb
162
+ - spec/controllers/users_controller_spec.rb
163
+ - spec/dummy/.gitignore
164
+ - spec/dummy/Rakefile
165
+ - spec/dummy/app/assets/javascripts/application.js
166
+ - spec/dummy/app/assets/javascripts/test.js
167
+ - spec/dummy/app/assets/stylesheets/application.css
168
+ - spec/dummy/app/controllers/application_controller.rb
169
+ - spec/dummy/app/controllers/users_controller.rb
170
+ - spec/dummy/app/models/user.rb
171
+ - spec/dummy/app/views/layouts/application.html.erb
172
+ - spec/dummy/app/views/users/index.html.erb
173
+ - spec/dummy/config.ru
174
+ - spec/dummy/config/application.rb
175
+ - spec/dummy/config/boot.rb
176
+ - spec/dummy/config/environment.rb
177
+ - spec/dummy/config/environments/test.rb
178
+ - spec/dummy/config/initializers/secret_token.rb
179
+ - spec/dummy/config/initializers/session_store.rb
180
+ - spec/dummy/config/initializers/wrap_parameters.rb
181
+ - spec/dummy/config/routes.rb
182
+ - spec/dummy/db/.keep
183
+ - spec/dummy/public/assets/application-90b1f92061b701bdbc2f2c364a42eed3.js
184
+ - spec/dummy/public/assets/application-90b1f92061b701bdbc2f2c364a42eed3.js.gz
185
+ - spec/dummy/public/assets/application-a029bd03bea21da7d02c0e9d272edc3a.css
186
+ - spec/dummy/public/assets/application-a029bd03bea21da7d02c0e9d272edc3a.css.gz
187
+ - spec/dummy/public/assets/manifest-1b849aba8a84c4520cb7bc4fafa638c3.json
188
+ - spec/ettu/ettu_spec.rb
189
+ - spec/ettu/fresh_when_spec.rb
135
190
  - spec/spec_helper.rb
191
+ - spec/support/fixtures.rb
192
+ - spec/support/include_hash.rb
data/spec/fixtures.rb DELETED
@@ -1,66 +0,0 @@
1
- class Nester < ActiveSupport::OrderedOptions
2
- def initialize
3
- super { |h, k| h[k] = Nester.new }
4
- end
5
- end
6
-
7
- class Controller < Nester
8
- def initialize
9
- super
10
-
11
- self.request.format['html?'] = true
12
- self.controller_name = 'controller_name'
13
- self.action_name = 'action_name'
14
- end
15
-
16
- module Freshness
17
- def fresh_when(*args)
18
- [*args]
19
- end
20
- end
21
- include Freshness
22
-
23
- include ::Ettu::FreshWhen
24
- end
25
-
26
- class Digestor
27
- def self.method_missing(name, *args, &block)
28
- args.first.to_s + '.digest'
29
- end
30
- end
31
-
32
- class Record
33
- attr_accessor :updated_at
34
-
35
- def initialize(updated_at)
36
- @updated_at = updated_at
37
- end
38
- end
39
-
40
- module Rails
41
- module VERSION
42
- MAJOR = ''
43
- end
44
- def self.application
45
- @nested ||= Nester.new
46
- end
47
- end
48
- Rails.application.assets['application.js'].digest = 'application.js.digest'
49
- Rails.application.assets['application.css'].digest = 'application.css.digest'
50
- Rails.application.assets['custom.js'].digest = 'custom.js.digest'
51
- Rails.application.assets['custom.css'].digest = 'custom.css.digest'
52
- Rails.application.assets['first.ext'].digest = 'first.ext.digest'
53
- Rails.application.assets['second.ext'].digest = 'second.ext.digest'
54
- Rails.application.config.assets.digests = nil
55
-
56
- module ActionView
57
- class Base
58
- def self.assets_manifest
59
- @nested ||= Nester.new
60
- end
61
- end
62
- end
63
- ActionView::Base.assets_manifest.assets = Rails.application.assets.keys.reduce({}) do |hash, asset|
64
- hash[asset] = asset.to_s + '.manifest'
65
- hash
66
- end