ettu 3.1.1 → 3.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (46) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +1 -1
  3. data/README.md +1 -3
  4. data/ettu.gemspec +1 -2
  5. data/lib/ettu.rb +3 -2
  6. data/lib/ettu/version.rb +1 -1
  7. data/spec/controllers/users_controller_spec.rb +66 -0
  8. data/spec/dummy/.gitignore +3 -0
  9. data/spec/dummy/Rakefile +7 -0
  10. data/spec/dummy/app/assets/javascripts/application.js +15 -0
  11. data/spec/dummy/app/assets/javascripts/test.js +1 -0
  12. data/spec/dummy/app/assets/stylesheets/application.css +13 -0
  13. data/spec/dummy/app/controllers/application_controller.rb +11 -0
  14. data/spec/dummy/app/controllers/users_controller.rb +9 -0
  15. data/spec/dummy/app/models/user.rb +12 -0
  16. data/spec/dummy/app/views/layouts/application.html.erb +14 -0
  17. data/spec/dummy/app/views/users/index.html.erb +1 -0
  18. data/spec/dummy/config.ru +4 -0
  19. data/spec/dummy/config/application.rb +65 -0
  20. data/spec/dummy/config/boot.rb +10 -0
  21. data/spec/dummy/config/environment.rb +9 -0
  22. data/spec/dummy/config/environments/test.rb +35 -0
  23. data/spec/dummy/config/initializers/secret_token.rb +7 -0
  24. data/spec/dummy/config/initializers/session_store.rb +8 -0
  25. data/spec/dummy/config/initializers/wrap_parameters.rb +10 -0
  26. data/spec/dummy/config/locales/en.yml +5 -0
  27. data/spec/dummy/config/routes.rb +3 -0
  28. data/spec/dummy/db/.keep +0 -0
  29. data/spec/dummy/public/assets/application-5d535630590bf232c0d869f6b8fa6479.js +15 -0
  30. data/spec/dummy/public/assets/application-5d535630590bf232c0d869f6b8fa6479.js.gz +0 -0
  31. data/spec/dummy/public/assets/application-e1e25f5530998b76317739a1762b3401.css +14 -0
  32. data/spec/dummy/public/assets/application-e1e25f5530998b76317739a1762b3401.css.gz +0 -0
  33. data/spec/dummy/public/assets/application.css +14 -0
  34. data/spec/dummy/public/assets/application.css.gz +0 -0
  35. data/spec/dummy/public/assets/application.js +15 -0
  36. data/spec/dummy/public/assets/application.js.gz +0 -0
  37. data/spec/dummy/public/assets/manifest.yml +5 -0
  38. data/spec/dummy/script/rails +6 -0
  39. data/spec/{ettu_spec.rb → ettu/ettu_spec.rb} +51 -36
  40. data/spec/{fresh_when_spec.rb → ettu/fresh_when_spec.rb} +4 -0
  41. data/spec/spec_helper.rb +18 -17
  42. data/spec/support/fixtures.rb +38 -0
  43. data/spec/support/include_hash.rb +5 -0
  44. data/spec/support/memory_store.rb +9 -0
  45. metadata +78 -24
  46. data/spec/fixtures.rb +0 -57
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 239a634c699a8dd6bc7e5bf8639121858852402d
4
- data.tar.gz: 40d6f53bcab2f4963308720e9b591ba62ce3371b
3
+ metadata.gz: b1a5e5a4fa5edd6f0599a6fc900eae50f7cf25c0
4
+ data.tar.gz: bacdad06438bbc50ae3fb847a6f649dba2fa7b82
5
5
  SHA512:
6
- metadata.gz: 25d08b35bab26c22c31e31d6aa4bd5091a360f4b426933a8307aa80c16afcd0a4711c0c67de7344112676bdc76ee9d12446a05e86db1c79a1a4929c9eeb5ecf7
7
- data.tar.gz: 9aefc9b359b8c8e7a6169134648647b07ee9c8cf723cd7d3aa4f3107ae93d554e405603b3e18dd1aed9063430185984c2fd7b7bff8b6aef0ebb2fbdb5ca7a39e
6
+ metadata.gz: 8b195b10a8128e2d0ac5fd5449e95c51f4c4ac7fee5a2f14bf7560ed72d6bed06205d2a5d755213ea3fe82f6281c4f64518be10d16d489be92aa4856fd52c3e7
7
+ data.tar.gz: b6f133486cdc146eefd50ec7a788045e9547e032e95d8553674eb31fd85038b12d3325e12e1f2b3e289f29b1d7b084a794bbf4ef2b51d6acd88cfae6dc20cd98
data/.travis.yml CHANGED
@@ -3,4 +3,4 @@ rvm:
3
3
  - 1.9.3
4
4
  - 2.0.0
5
5
  - jruby-19mode
6
- - rbx-19mode
6
+ - rbx
data/README.md CHANGED
@@ -1,8 +1,6 @@
1
- Ettu
1
+ Ettu [![Build Status](https://travis-ci.org/cloudspace/ettu.png?branch=v3)](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 3'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
data/ettu.gemspec CHANGED
@@ -22,6 +22,5 @@ Gem::Specification.new do |spec|
22
22
  spec.add_dependency 'cache_digests'
23
23
  spec.add_development_dependency 'bundler', '~> 1.3'
24
24
  spec.add_development_dependency 'rake'
25
- spec.add_development_dependency 'rspec'
26
- spec.add_development_dependency 'simplecov'
25
+ spec.add_development_dependency 'rspec-rails'
27
26
  end
data/lib/ettu.rb CHANGED
@@ -78,8 +78,9 @@ class Ettu
78
78
  def asset_digest(asset)
79
79
  return nil unless asset.present?
80
80
  # Check already computed assets (production)
81
- if manifest = Rails.application.config.assets.digests
82
- manifest[asset]
81
+ manifest = Rails.application.config.assets.digests
82
+ if digest = manifest.try(:[], asset)
83
+ digest
83
84
  else
84
85
  # Compute it in
85
86
  Rails.application.assets[asset].digest
data/lib/ettu/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  class Ettu
2
- VERSION = '3.1.1'
2
+ VERSION = '3.2.0'
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 = ::CacheDigests::TemplateDigestor.cache.keys.first
46
+
47
+ expect(page).to match(/#{path['controller']}\/#{path['action']}/)
48
+ expect(etags).to include(::CacheDigests::TemplateDigestor.cache.fetch(page))
49
+ end
50
+
51
+ it 'includes all asset digests' do
52
+ expect(etags).to include(*(Rails.application.config.assets.digests.values.uniq))
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,7 @@
1
+ #!/usr/bin/env rake
2
+ # Add your own tasks in files placed in lib/tasks ending in .rake,
3
+ # for example lib/tasks/capistrano.rake, and they will automatically be available to Rake.
4
+
5
+ require File.expand_path('../config/application', __FILE__)
6
+
7
+ 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
+ // the compiled file.
9
+ //
10
+ // WARNING: THE FIRST BLANK LINE MARKS THE END OF WHAT'S TO BE PROCESSED, ANY BLANK LINE SHOULD
11
+ // GO AFTER THE REQUIRES BELOW.
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,11 @@
1
+ class ApplicationController < ActionController::Base
2
+ protect_from_forgery
3
+ end
4
+
5
+ module ::ActionController
6
+ module ConditionalGet
7
+ def fresh_when(*args)
8
+ [*args].last
9
+ end
10
+ end
11
+ 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" %>
6
+ <%= javascript_include_tag "application" %>
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 Dummy::Application
@@ -0,0 +1,65 @@
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 "active_resource/railtie"
8
+ require "sprockets/railtie"
9
+ # require "rails/test_unit/railtie"
10
+
11
+ Bundler.require(*Rails.groups)
12
+ require "ettu"
13
+
14
+ module Dummy
15
+ class Application < Rails::Application
16
+ # Settings in config/environments/* take precedence over those specified here.
17
+ # Application configuration should go into files in config/initializers
18
+ # -- all .rb files in that directory are automatically loaded.
19
+
20
+ # Custom directories with classes and modules you want to be autoloadable.
21
+ # config.autoload_paths += %W(#{config.root}/extras)
22
+
23
+ # Only load the plugins named here, in the order given (default is alphabetical).
24
+ # :all can be used as a placeholder for all plugins not explicitly named.
25
+ # config.plugins = [ :exception_notification, :ssl_requirement, :all ]
26
+
27
+ # Activate observers that should always be running.
28
+ # config.active_record.observers = :cacher, :garbage_collector, :forum_observer
29
+
30
+ # Set Time.zone default to the specified zone and make Active Record auto-convert to this zone.
31
+ # Run "rake -D time" for a list of tasks for finding time zone names. Default is UTC.
32
+ # config.time_zone = 'Central Time (US & Canada)'
33
+
34
+ # The default locale is :en and all translations from config/locales/*.rb,yml are auto loaded.
35
+ # config.i18n.load_path += Dir[Rails.root.join('my', 'locales', '*.{rb,yml}').to_s]
36
+ # config.i18n.default_locale = :de
37
+
38
+ # Configure the default encoding used in templates for Ruby 1.9.
39
+ config.encoding = "utf-8"
40
+
41
+ # Configure sensitive parameters which will be filtered from the log file.
42
+ config.filter_parameters += [:password]
43
+
44
+ # Enable escaping HTML in JSON.
45
+ config.active_support.escape_html_entities_in_json = true
46
+
47
+ # Use SQL instead of Active Record's schema dumper when creating the database.
48
+ # This is necessary if your schema can't be completely dumped by the schema dumper,
49
+ # like if you have constraints or database-specific column types
50
+ # config.active_record.schema_format = :sql
51
+
52
+ # Enforce whitelist mode for mass assignment.
53
+ # This will create an empty whitelist of attributes available for mass-assignment for all models
54
+ # in your app. As such, your models will need to explicitly whitelist or blacklist accessible
55
+ # parameters by using an attr_accessible or attr_protected declaration.
56
+ # config.active_record.whitelist_attributes = true
57
+
58
+ # Enable the asset pipeline
59
+ config.assets.enabled = true
60
+
61
+ # Version of your assets, change this if you want to expire all your assets
62
+ config.assets.version = '1.0'
63
+ end
64
+ end
65
+
@@ -0,0 +1,10 @@
1
+ require 'rubygems'
2
+ gemfile = File.expand_path('../../../../Gemfile', __FILE__)
3
+
4
+ if File.exist?(gemfile)
5
+ ENV['BUNDLE_GEMFILE'] = gemfile
6
+ require 'bundler'
7
+ Bundler.setup
8
+ end
9
+
10
+ $:.unshift File.expand_path('../../../../lib', __FILE__)
@@ -0,0 +1,9 @@
1
+ # Load the rails application
2
+ require File.expand_path('../application', __FILE__)
3
+
4
+ # Initialize the rails application
5
+ Dummy::Application.initialize!
6
+
7
+ Dummy::Application.configure do
8
+ config.assets.digest = true
9
+ end
@@ -0,0 +1,35 @@
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
+ # Configure static asset server for tests with Cache-Control for performance
11
+ config.serve_static_assets = true
12
+ config.static_cache_control = "public, max-age=3600"
13
+
14
+ # Log error messages when you accidentally call methods on nil
15
+ config.whiny_nils = true
16
+
17
+ # Show full error reports and disable caching
18
+ config.consider_all_requests_local = true
19
+ config.action_controller.perform_caching = false
20
+
21
+ # Raise exceptions instead of rendering exception templates
22
+ config.action_dispatch.show_exceptions = false
23
+
24
+ # Disable request forgery protection in test environment
25
+ config.action_controller.allow_forgery_protection = false
26
+
27
+ # Tell Action Mailer not to deliver emails to the real world.
28
+ # The :test delivery method accumulates sent emails in the
29
+ # ActionMailer::Base.deliveries array.
30
+ config.action_mailer.delivery_method = :test
31
+
32
+
33
+ # Print deprecation notices to the stderr
34
+ config.active_support.deprecation = :stderr
35
+ end
@@ -0,0 +1,7 @@
1
+ # Be sure to restart your server when you modify this file.
2
+
3
+ # Your secret key for verifying the integrity of signed cookies.
4
+ # If you change this key, all old signed cookies will become invalid!
5
+ # Make sure the secret is at least 30 characters and all random,
6
+ # no regular words or you'll be exposed to dictionary attacks.
7
+ Dummy::Application.config.secret_token = 'c73defd757d28e3dcebf7d902e6acbb1ec4f5b3587ba7218092142a469af71e50d8cbac772c8963ac4eace9945e6d570cbf6526ca48a76eba528f8e4d0dd9b5f'
@@ -0,0 +1,8 @@
1
+ # Be sure to restart your server when you modify this file.
2
+
3
+ Dummy::Application.config.session_store :cookie_store, key: '_dummy_session'
4
+
5
+ # Use the database for sessions instead of the cookie-based default,
6
+ # which shouldn't be used to store highly confidential information
7
+ # (create the session table with "rails generate session_migration")
8
+ # Dummy::Application.config.session_store :active_record_store
@@ -0,0 +1,10 @@
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]
9
+ end
10
+
@@ -0,0 +1,5 @@
1
+ # Sample localization file for English. Add more files in this directory for other locales.
2
+ # See https://github.com/svenfuchs/rails-i18n/tree/master/rails%2Flocale for starting points.
3
+
4
+ en:
5
+ hello: "Hello world"
@@ -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
+ // the compiled file.
9
+ //
10
+ // WARNING: THE FIRST BLANK LINE MARKS THE END OF WHAT'S TO BE PROCESSED, ANY BLANK LINE SHOULD
11
+ // GO AFTER THE REQUIRES BELOW.
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,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,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
+ // the compiled file.
9
+ //
10
+ // WARNING: THE FIRST BLANK LINE MARKS THE END OF WHAT'S TO BE PROCESSED, ANY BLANK LINE SHOULD
11
+ // GO AFTER THE REQUIRES BELOW.
12
+ //
13
+
14
+
15
+ var test = true;
@@ -0,0 +1,5 @@
1
+ ---
2
+ application.js: application-5d535630590bf232c0d869f6b8fa6479.js
3
+ application/index.js: application-5d535630590bf232c0d869f6b8fa6479.js
4
+ application.css: application-e1e25f5530998b76317739a1762b3401.css
5
+ application/index.css: application-e1e25f5530998b76317739a1762b3401.css
@@ -0,0 +1,6 @@
1
+ #!/usr/bin/env ruby
2
+ # This command will automatically be run when you run "rails" with Rails 3 gems installed from the root of your application.
3
+
4
+ APP_PATH = File.expand_path('../../config/application', __FILE__)
5
+ require File.expand_path('../../config/boot', __FILE__)
6
+ require 'rails/commands'
@@ -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) { Rails.application.config.assets.digests }
14
+ let(:files) { assets.keys.reject { |f| f[/index/] } }
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.manifest'])
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.manifest', 'second.ext.manifest'])
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
@@ -0,0 +1,9 @@
1
+ class ActiveSupport::Cache::MemoryStore
2
+ def keys
3
+ @data.keys
4
+ end
5
+
6
+ def values
7
+ @data.values.map(&:value)
8
+ end
9
+ 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: 3.1.1
4
+ version: 3.2.0
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-10-24 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
@@ -67,21 +67,7 @@ dependencies:
67
67
  - !ruby/object:Gem::Version
68
68
  version: '0'
69
69
  - !ruby/object:Gem::Dependency
70
- name: rspec
71
- requirement: !ruby/object:Gem::Requirement
72
- requirements:
73
- - - '>='
74
- - !ruby/object:Gem::Version
75
- version: '0'
76
- type: :development
77
- prerelease: false
78
- version_requirements: !ruby/object:Gem::Requirement
79
- requirements:
80
- - - '>='
81
- - !ruby/object:Gem::Version
82
- version: '0'
83
- - !ruby/object:Gem::Dependency
84
- name: simplecov
70
+ name: rspec-rails
85
71
  requirement: !ruby/object:Gem::Requirement
86
72
  requirements:
87
73
  - - '>='
@@ -114,10 +100,44 @@ files:
114
100
  - lib/ettu/fresh_when.rb
115
101
  - lib/ettu/railtie.rb
116
102
  - lib/ettu/version.rb
117
- - spec/ettu_spec.rb
118
- - spec/fixtures.rb
119
- - spec/fresh_when_spec.rb
103
+ - spec/controllers/users_controller_spec.rb
104
+ - spec/dummy/.gitignore
105
+ - spec/dummy/Rakefile
106
+ - spec/dummy/app/assets/javascripts/application.js
107
+ - spec/dummy/app/assets/javascripts/test.js
108
+ - spec/dummy/app/assets/stylesheets/application.css
109
+ - spec/dummy/app/controllers/application_controller.rb
110
+ - spec/dummy/app/controllers/users_controller.rb
111
+ - spec/dummy/app/models/user.rb
112
+ - spec/dummy/app/views/layouts/application.html.erb
113
+ - spec/dummy/app/views/users/index.html.erb
114
+ - spec/dummy/config.ru
115
+ - spec/dummy/config/application.rb
116
+ - spec/dummy/config/boot.rb
117
+ - spec/dummy/config/environment.rb
118
+ - spec/dummy/config/environments/test.rb
119
+ - spec/dummy/config/initializers/secret_token.rb
120
+ - spec/dummy/config/initializers/session_store.rb
121
+ - spec/dummy/config/initializers/wrap_parameters.rb
122
+ - spec/dummy/config/locales/en.yml
123
+ - spec/dummy/config/routes.rb
124
+ - spec/dummy/db/.keep
125
+ - spec/dummy/public/assets/application-5d535630590bf232c0d869f6b8fa6479.js
126
+ - spec/dummy/public/assets/application-5d535630590bf232c0d869f6b8fa6479.js.gz
127
+ - spec/dummy/public/assets/application-e1e25f5530998b76317739a1762b3401.css
128
+ - spec/dummy/public/assets/application-e1e25f5530998b76317739a1762b3401.css.gz
129
+ - spec/dummy/public/assets/application.css
130
+ - spec/dummy/public/assets/application.css.gz
131
+ - spec/dummy/public/assets/application.js
132
+ - spec/dummy/public/assets/application.js.gz
133
+ - spec/dummy/public/assets/manifest.yml
134
+ - spec/dummy/script/rails
135
+ - spec/ettu/ettu_spec.rb
136
+ - spec/ettu/fresh_when_spec.rb
120
137
  - spec/spec_helper.rb
138
+ - spec/support/fixtures.rb
139
+ - spec/support/include_hash.rb
140
+ - spec/support/memory_store.rb
121
141
  homepage: http://github.com/cloudspace/ettu
122
142
  licenses:
123
143
  - MIT
@@ -138,12 +158,46 @@ required_rubygems_version: !ruby/object:Gem::Requirement
138
158
  version: '0'
139
159
  requirements: []
140
160
  rubyforge_project:
141
- rubygems_version: 2.0.0
161
+ rubygems_version: 2.0.2
142
162
  signing_key:
143
163
  specification_version: 4
144
164
  summary: Add Assets and Views into the Rails ETag Equation.
145
165
  test_files:
146
- - spec/ettu_spec.rb
147
- - spec/fixtures.rb
148
- - spec/fresh_when_spec.rb
166
+ - spec/controllers/users_controller_spec.rb
167
+ - spec/dummy/.gitignore
168
+ - spec/dummy/Rakefile
169
+ - spec/dummy/app/assets/javascripts/application.js
170
+ - spec/dummy/app/assets/javascripts/test.js
171
+ - spec/dummy/app/assets/stylesheets/application.css
172
+ - spec/dummy/app/controllers/application_controller.rb
173
+ - spec/dummy/app/controllers/users_controller.rb
174
+ - spec/dummy/app/models/user.rb
175
+ - spec/dummy/app/views/layouts/application.html.erb
176
+ - spec/dummy/app/views/users/index.html.erb
177
+ - spec/dummy/config.ru
178
+ - spec/dummy/config/application.rb
179
+ - spec/dummy/config/boot.rb
180
+ - spec/dummy/config/environment.rb
181
+ - spec/dummy/config/environments/test.rb
182
+ - spec/dummy/config/initializers/secret_token.rb
183
+ - spec/dummy/config/initializers/session_store.rb
184
+ - spec/dummy/config/initializers/wrap_parameters.rb
185
+ - spec/dummy/config/locales/en.yml
186
+ - spec/dummy/config/routes.rb
187
+ - spec/dummy/db/.keep
188
+ - spec/dummy/public/assets/application-5d535630590bf232c0d869f6b8fa6479.js
189
+ - spec/dummy/public/assets/application-5d535630590bf232c0d869f6b8fa6479.js.gz
190
+ - spec/dummy/public/assets/application-e1e25f5530998b76317739a1762b3401.css
191
+ - spec/dummy/public/assets/application-e1e25f5530998b76317739a1762b3401.css.gz
192
+ - spec/dummy/public/assets/application.css
193
+ - spec/dummy/public/assets/application.css.gz
194
+ - spec/dummy/public/assets/application.js
195
+ - spec/dummy/public/assets/application.js.gz
196
+ - spec/dummy/public/assets/manifest.yml
197
+ - spec/dummy/script/rails
198
+ - spec/ettu/ettu_spec.rb
199
+ - spec/ettu/fresh_when_spec.rb
149
200
  - spec/spec_helper.rb
201
+ - spec/support/fixtures.rb
202
+ - spec/support/include_hash.rb
203
+ - spec/support/memory_store.rb
data/spec/fixtures.rb DELETED
@@ -1,57 +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 = Rails.application.assets.keys.reduce({}) do |hash, asset|
55
- hash[asset.to_s] = asset.to_s + '.manifest'
56
- hash
57
- end