emerson 0.1.0.pre.1 → 0.1.0.pre.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (70) hide show
  1. data/.gitignore +17 -23
  2. data/.wiprc +0 -0
  3. data/.yardopts +1 -0
  4. data/Gemfile +6 -0
  5. data/Gemfile.lock +177 -0
  6. data/Rakefile +18 -1
  7. data/emerson.gemspec +28 -15
  8. data/lib/emerson.rb +58 -1
  9. data/lib/emerson/engine.rb +5 -0
  10. data/lib/emerson/matchers.rb +5 -0
  11. data/lib/emerson/matchers/action_controller.rb +30 -0
  12. data/lib/emerson/matchers/action_controller/send_json_matcher.rb +106 -0
  13. data/lib/emerson/matchers/integrations/rspec.rb +11 -0
  14. data/lib/emerson/matchers/integrations/test_unit.rb +12 -0
  15. data/lib/emerson/responder.rb +61 -51
  16. data/lib/emerson/response.rb +17 -3
  17. data/lib/emerson/scope.rb +2 -7
  18. data/lib/emerson/version.rb +1 -1
  19. data/spec/dummy/README.rdoc +261 -0
  20. data/spec/dummy/Rakefile +7 -0
  21. data/spec/dummy/app/assets/javascripts/application.js +15 -0
  22. data/spec/dummy/app/assets/stylesheets/application.css +13 -0
  23. data/spec/dummy/app/controllers/application_controller.rb +3 -0
  24. data/spec/dummy/app/helpers/application_helper.rb +2 -0
  25. data/spec/dummy/app/mailers/.gitkeep +0 -0
  26. data/spec/dummy/app/models/.gitkeep +0 -0
  27. data/spec/dummy/app/views/layouts/application.html.erb +14 -0
  28. data/spec/dummy/config.ru +4 -0
  29. data/spec/dummy/config/application.rb +65 -0
  30. data/spec/dummy/config/boot.rb +10 -0
  31. data/spec/dummy/config/database.yml +25 -0
  32. data/spec/dummy/config/environment.rb +5 -0
  33. data/spec/dummy/config/environments/development.rb +37 -0
  34. data/spec/dummy/config/environments/production.rb +67 -0
  35. data/spec/dummy/config/environments/test.rb +37 -0
  36. data/spec/dummy/config/initializers/backtrace_silencers.rb +7 -0
  37. data/spec/dummy/config/initializers/inflections.rb +15 -0
  38. data/spec/dummy/config/initializers/jasmine.rb +3 -0
  39. data/spec/dummy/config/initializers/mime_types.rb +5 -0
  40. data/spec/dummy/config/initializers/secret_token.rb +7 -0
  41. data/spec/dummy/config/initializers/session_store.rb +8 -0
  42. data/spec/dummy/config/initializers/wrap_parameters.rb +14 -0
  43. data/spec/dummy/config/locales/en.yml +5 -0
  44. data/spec/dummy/config/routes.rb +6 -0
  45. data/spec/dummy/lib/assets/.gitkeep +0 -0
  46. data/spec/dummy/log/.gitkeep +0 -0
  47. data/spec/dummy/public/404.html +26 -0
  48. data/spec/dummy/public/422.html +26 -0
  49. data/spec/dummy/public/500.html +25 -0
  50. data/spec/dummy/public/favicon.ico +0 -0
  51. data/spec/dummy/script/rails +6 -0
  52. data/spec/dummy/spec/support/fixtures/responses/products/extend-array.json +1 -0
  53. data/spec/dummy/spec/support/fixtures/responses/products/extend-failure.json +1 -0
  54. data/spec/dummy/spec/support/fixtures/responses/products/extend-success.json +4 -0
  55. data/spec/dummy/spec/support/fixtures/responses/products/simple.json +4 -0
  56. data/spec/emerson/matchers/action_controller/send_json_matcher_spec.rb +126 -0
  57. data/spec/emerson/responder_spec.rb +222 -0
  58. data/spec/emerson/response_spec.rb +75 -0
  59. data/spec/emerson/scope_spec.rb +146 -0
  60. data/spec/emerson_spec.rb +105 -0
  61. data/spec/spec_helper.rb +67 -0
  62. data/spec/support/helpers/controller_helpers.rb +98 -0
  63. data/spec/support/helpers/feature_helpers.rb +12 -0
  64. data/spec/support/helpers/resource_helpers.rb +95 -0
  65. data/spec/support/helpers/template_helpers.rb +31 -0
  66. data/vendor/assets/javascripts/emerson.js +1 -0
  67. data/vendor/assets/javascripts/emerson/sink.js +3 -0
  68. metadata +309 -11
  69. data/lib/emerson/rails.rb +0 -6
  70. data/lib/emerson/rails/engine.rb +0 -7
data/.gitignore CHANGED
@@ -1,24 +1,18 @@
1
- *.gem
2
- *.rbc
3
- .bundle
4
- .config
5
- .yardoc
6
- Gemfile.lock
7
- InstalledFiles
8
- _yardoc
9
- coverage
10
- doc/
11
- lib/bundler/man
12
- pkg
13
- rdoc
14
- spec/reports
15
- test/tmp
16
- test/version_tmp
17
- tmp
1
+ /.bundle
2
+ /.env
3
+ /.gemset
4
+ /.import
5
+ /.rvmrc
6
+ /.rspec
7
+ /.sublime*
8
+ /.yardoc
18
9
 
19
- .gemset
20
- .rspec
21
- .rvmrc
22
- .import/
23
- .sublime*
24
- .wiprc
10
+ /doc/*
11
+ /log/*.log
12
+ /pkg/*
13
+ /tmp/*
14
+
15
+ /spec/dummy/db/*.sqlite3
16
+ /spec/dummy/log/*.log
17
+ /spec/dummy/tmp/
18
+ /spec/dummy/.sass-cache
data/.wiprc ADDED
File without changes
@@ -0,0 +1 @@
1
+ --markup markdown --protected --plugin yard-rails lib/**/*.rb - README.md LICENSE
data/Gemfile CHANGED
@@ -2,3 +2,9 @@ source 'https://rubygems.org'
2
2
 
3
3
  # Specify your gem's dependencies in emerson.gemspec
4
4
  gemspec
5
+
6
+ # jquery-rails is used by the dummy application
7
+ gem "jquery-rails"
8
+ gem 'jasminerice',
9
+ :git => 'git://github.com/coreyti/jasminerice.git'
10
+ gem "jasminerice-runner"
@@ -0,0 +1,177 @@
1
+ GIT
2
+ remote: git://github.com/coreyti/jasminerice.git
3
+ revision: 37e379c271cef665d71f54d7dd035687d6377c7d
4
+ specs:
5
+ jasminerice (0.0.8)
6
+ coffee-rails
7
+ haml
8
+
9
+ PATH
10
+ remote: .
11
+ specs:
12
+ emerson (0.1.0.pre.2)
13
+ jquery-rails
14
+ rails (>= 3.2.0)
15
+
16
+ GEM
17
+ remote: https://rubygems.org/
18
+ specs:
19
+ actionmailer (3.2.8)
20
+ actionpack (= 3.2.8)
21
+ mail (~> 2.4.4)
22
+ actionpack (3.2.8)
23
+ activemodel (= 3.2.8)
24
+ activesupport (= 3.2.8)
25
+ builder (~> 3.0.0)
26
+ erubis (~> 2.7.0)
27
+ journey (~> 1.0.4)
28
+ rack (~> 1.4.0)
29
+ rack-cache (~> 1.2)
30
+ rack-test (~> 0.6.1)
31
+ sprockets (~> 2.1.3)
32
+ activemodel (3.2.8)
33
+ activesupport (= 3.2.8)
34
+ builder (~> 3.0.0)
35
+ activerecord (3.2.8)
36
+ activemodel (= 3.2.8)
37
+ activesupport (= 3.2.8)
38
+ arel (~> 3.0.2)
39
+ tzinfo (~> 0.3.29)
40
+ activeresource (3.2.8)
41
+ activemodel (= 3.2.8)
42
+ activesupport (= 3.2.8)
43
+ activesupport (3.2.8)
44
+ i18n (~> 0.6)
45
+ multi_json (~> 1.0)
46
+ addressable (2.3.2)
47
+ arel (3.0.2)
48
+ backports (2.6.4)
49
+ builder (3.0.4)
50
+ capybara (1.1.2)
51
+ mime-types (>= 1.16)
52
+ nokogiri (>= 1.3.3)
53
+ rack (>= 1.0.0)
54
+ rack-test (>= 0.5.4)
55
+ selenium-webdriver (~> 2.0)
56
+ xpath (~> 0.1.4)
57
+ childprocess (0.3.6)
58
+ ffi (~> 1.0, >= 1.0.6)
59
+ coffee-rails (3.2.2)
60
+ coffee-script (>= 2.2.0)
61
+ railties (~> 3.2.0)
62
+ coffee-script (2.2.0)
63
+ coffee-script-source
64
+ execjs
65
+ coffee-script-source (1.3.3)
66
+ diff-lcs (1.1.3)
67
+ erubis (2.7.0)
68
+ execjs (1.4.0)
69
+ multi_json (~> 1.0)
70
+ ffaker (1.15.0)
71
+ ffi (1.1.5)
72
+ haml (3.1.7)
73
+ hike (1.2.1)
74
+ i18n (0.6.1)
75
+ jasmine (1.2.1)
76
+ jasmine-core (>= 1.2.0)
77
+ rack (~> 1.0)
78
+ rspec (>= 1.3.1)
79
+ selenium-webdriver (>= 0.1.3)
80
+ jasmine-core (1.2.0)
81
+ jasminerice-runner (0.0.3)
82
+ capybara
83
+ journey (1.0.4)
84
+ jquery-rails (2.1.3)
85
+ railties (>= 3.1.0, < 5.0)
86
+ thor (~> 0.14)
87
+ json (1.7.5)
88
+ libwebsocket (0.1.5)
89
+ addressable
90
+ mail (2.4.4)
91
+ i18n (>= 0.4.0)
92
+ mime-types (~> 1.16)
93
+ treetop (~> 1.4.8)
94
+ mime-types (1.19)
95
+ multi_json (1.3.6)
96
+ nokogiri (1.5.5)
97
+ polyglot (0.3.3)
98
+ rack (1.4.1)
99
+ rack-cache (1.2)
100
+ rack (>= 0.4)
101
+ rack-ssl (1.3.2)
102
+ rack
103
+ rack-test (0.6.2)
104
+ rack (>= 1.0)
105
+ rails (3.2.8)
106
+ actionmailer (= 3.2.8)
107
+ actionpack (= 3.2.8)
108
+ activerecord (= 3.2.8)
109
+ activeresource (= 3.2.8)
110
+ activesupport (= 3.2.8)
111
+ bundler (~> 1.0)
112
+ railties (= 3.2.8)
113
+ railties (3.2.8)
114
+ actionpack (= 3.2.8)
115
+ activesupport (= 3.2.8)
116
+ rack-ssl (~> 1.3.2)
117
+ rake (>= 0.8.7)
118
+ rdoc (~> 3.4)
119
+ thor (>= 0.14.6, < 2.0)
120
+ rake (0.9.2.2)
121
+ rdoc (3.12)
122
+ json (~> 1.4)
123
+ rspec (2.11.0)
124
+ rspec-core (~> 2.11.0)
125
+ rspec-expectations (~> 2.11.0)
126
+ rspec-mocks (~> 2.11.0)
127
+ rspec-core (2.11.1)
128
+ rspec-expectations (2.11.3)
129
+ diff-lcs (~> 1.1.3)
130
+ rspec-mocks (2.11.3)
131
+ rspec-rails (2.11.4)
132
+ actionpack (>= 3.0)
133
+ activesupport (>= 3.0)
134
+ railties (>= 3.0)
135
+ rspec (~> 2.11.0)
136
+ rubyzip (0.9.9)
137
+ selenium-webdriver (2.25.0)
138
+ childprocess (>= 0.2.5)
139
+ libwebsocket (~> 0.1.3)
140
+ multi_json (~> 1.0)
141
+ rubyzip
142
+ sprockets (2.1.3)
143
+ hike (~> 1.2)
144
+ rack (~> 1.0)
145
+ tilt (~> 1.1, != 1.3.0)
146
+ sqlite3 (1.3.6)
147
+ thor (0.16.0)
148
+ tilt (1.3.3)
149
+ treetop (1.4.15)
150
+ polyglot
151
+ polyglot (>= 0.3.1)
152
+ tzinfo (0.3.37)
153
+ virtus (0.5.2)
154
+ backports (~> 2.6.1)
155
+ xpath (0.1.4)
156
+ nokogiri (~> 1.3)
157
+ yard (0.8.3)
158
+ yard-rails (0.3.0)
159
+ yard
160
+
161
+ PLATFORMS
162
+ ruby
163
+
164
+ DEPENDENCIES
165
+ capybara
166
+ coffee-script
167
+ emerson!
168
+ ffaker
169
+ jasmine
170
+ jasminerice!
171
+ jasminerice-runner
172
+ jquery-rails
173
+ rspec-rails
174
+ sqlite3
175
+ virtus
176
+ yard
177
+ yard-rails
data/Rakefile CHANGED
@@ -1,2 +1,19 @@
1
1
  #!/usr/bin/env rake
2
- require "bundler/gem_tasks"
2
+ begin
3
+ require 'bundler/setup'
4
+ rescue LoadError
5
+ puts 'You must `gem install bundler` and `bundle install` to run rake tasks'
6
+ exit 1
7
+ end
8
+
9
+ require 'bundler/gem_tasks'
10
+ require 'rspec/core/rake_task'
11
+
12
+ RSpec::Core::RakeTask.new do |t|
13
+ t.pattern = "spec/**/*_spec.rb"
14
+ t.rspec_opts = '--color --format progress'
15
+ t.verbose = false
16
+ end
17
+
18
+ desc 'Default: run specs'
19
+ task :default => [:spec]
@@ -1,19 +1,32 @@
1
- # -*- encoding: utf-8 -*-
2
- require File.expand_path('../lib/emerson/version', __FILE__)
1
+ $:.push File.expand_path("../lib", __FILE__)
3
2
 
4
- Gem::Specification.new do |gem|
5
- gem.authors = ["Corey Innis"]
6
- gem.email = ["corey@coolerator.net"]
7
- gem.description = %q{transcendent views}
8
- gem.summary = %q{emerson believes in the inherent good in...}
9
- gem.homepage = "https://github.com/coreyti/emerson"
3
+ require "emerson/version"
10
4
 
11
- gem.files = `git ls-files`.split($\)
12
- gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
13
- gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
14
- gem.name = "emerson"
15
- gem.require_paths = ["lib"]
16
- gem.version = Emerson::VERSION
5
+ Gem::Specification.new do |s|
6
+ s.name = "emerson"
7
+ s.version = Emerson::VERSION
8
+ s.authors = ["Corey Innis"]
9
+ s.email = ["corey@coolerator.net"]
10
+ s.homepage = "https://github.com/coreyti/emerson"
11
+ s.summary = %q{transcendent views}
12
+ s.description = %q{emerson believes in the inherent good in...}
17
13
 
18
- gem.add_dependency "rails", "~> 3.2.0"
14
+ s.files = `git ls-files`.split($\)
15
+ s.executables = s.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
16
+ s.test_files = s.files.grep(%r{^(test|spec|features)/})
17
+
18
+ s.add_dependency "rails", ">= 3.2.0"
19
+ s.add_dependency "jquery-rails" # for now.
20
+
21
+ s.add_development_dependency "capybara"
22
+ s.add_development_dependency "coffee-script"
23
+ s.add_development_dependency "ffaker"
24
+ s.add_development_dependency "jasmine"
25
+ s.add_development_dependency "jasminerice"
26
+ s.add_development_dependency "jasminerice-runner"
27
+ s.add_development_dependency "rspec-rails"
28
+ s.add_development_dependency "sqlite3"
29
+ s.add_development_dependency "virtus"
30
+ s.add_development_dependency "yard"
31
+ s.add_development_dependency "yard-rails"
19
32
  end
@@ -1,8 +1,65 @@
1
1
  require "emerson/version"
2
- require "emerson/rails"
2
+ require "emerson/engine"
3
3
 
4
4
  module Emerson
5
5
  autoload :Responder, 'emerson/responder'
6
6
  autoload :Response, 'emerson/response'
7
7
  autoload :Scope, 'emerson/scope'
8
+
9
+ # Hook for enabling a specific set of Emerson "features".
10
+ #
11
+ # @note The disabling arguments (`nil`, `false`) are included for
12
+ # completeness. A better way to disable Emerson features would be to
13
+ # **not** include `Emerson::Response` in your controller(s).
14
+ #
15
+ # @param value [Array, Symbol, false, nil] The list of features,
16
+ # `:all` (default), `nil` or `false` (to disable completely).
17
+ mattr_accessor :features
18
+ @@features = :all
19
+
20
+ # Custom path for fixture files.
21
+ #
22
+ # @note This attribute **must** be set in order to use the included response
23
+ # matchers. If RSpec fixtures are disabled, be sure to enable specifically
24
+ # for Emerson.
25
+ #
26
+ # @param value [String] The path. Defaults to RSpec's `fixture_path`.
27
+ mattr_accessor :fixture_path
28
+ @@fixture_path = nil
29
+
30
+ mattr_accessor :response_config
31
+ @@response_config = {
32
+ :json_default => 'full'
33
+ }
34
+
35
+ # Default way to setup Emerson. For Rails, call from an initializer.
36
+ #
37
+ # @example in 'config/initializers/emerson.rb'
38
+ # Emerson.setup do |config|
39
+ # config.fixture_path = Rails.root.join('custom/path')
40
+ # end
41
+ def self.setup
42
+ # environmental defaults:
43
+ if defined?(RSpec)
44
+ self.fixture_path ||= RSpec.configuration.fixture_path
45
+ end
46
+
47
+ yield self
48
+ end
49
+
50
+ # Helper to determine whether `Emerson::Responder` is enabled.
51
+ def self.responder_enabled?
52
+ self.feature_enabled?(:responder)
53
+ end
54
+
55
+ # Helper to determine whether `Emerson::Scope` is enabled.
56
+ def self.scope_enabled?
57
+ self.feature_enabled?(:scope)
58
+ end
59
+
60
+ private
61
+
62
+ def self.feature_enabled?(key)
63
+ self.features.present? && (self.features == :all || self.features.include?(key))
64
+ end
8
65
  end
@@ -0,0 +1,5 @@
1
+ module Emerson
2
+ class Engine < ::Rails::Engine
3
+ isolate_namespace Emerson
4
+ end
5
+ end
@@ -0,0 +1,5 @@
1
+ if defined?(RSpec)
2
+ require 'emerson/matchers/integrations/rspec'
3
+ else
4
+ require 'emerson/matchers/integrations/test_unit'
5
+ end
@@ -0,0 +1,30 @@
1
+ # require 'emerson/matchers/action_controller/send_html_matcher'
2
+ require 'emerson/matchers/action_controller/send_json_matcher'
3
+
4
+ module Emerson
5
+ module Matchers
6
+ # By using the matchers you can quickly and easily create concise and
7
+ # easy to read test suites.
8
+ #
9
+ # This code segment:
10
+ #
11
+ # describe UsersController, "on GET to show with a valid id" do
12
+ # before(:each) do
13
+ # get :show, :id => User.first.to_param
14
+ # end
15
+ #
16
+ # it { should assign_to(:user) }
17
+ # it { should respond_with(:success) }
18
+ # it { should render_template(:show) }
19
+ # it { should not_set_the_flash) }
20
+ #
21
+ # it "should do something else really cool" do
22
+ # assigns[:user].id.should == 1
23
+ # end
24
+ # end
25
+ #
26
+ # Would produce 5 tests for the show action
27
+ module ActionController
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,106 @@
1
+ module Emerson
2
+ module Matchers
3
+ module ActionController
4
+ # Example:
5
+ #
6
+ # expect(response).to send_json({ :key => 'value' })
7
+ # expect(response).to send_json('path/to/fixture')
8
+ #
9
+ # Example fixture definitions:
10
+ #
11
+ # # 'data-fixture.json'
12
+ # {
13
+ # "data" : {
14
+ # "user" : 1
15
+ # }
16
+ # }
17
+ #
18
+ # # 'view-fixture.json'
19
+ # {
20
+ # "view" : "<article class=\"user\"></article>"
21
+ # }
22
+ #
23
+ # # 'full-fixture.json' (will merge data & view)
24
+ # {
25
+ # "$extends" : ["data-fixture.json", "view-fixture.json"]
26
+ # }
27
+ def send_json(expected)
28
+ SendJsonMatcher.new(expected, self)
29
+ end
30
+
31
+ class SendJsonMatcher
32
+ attr_reader :expected, :actual, :mode
33
+
34
+ def initialize(expected, context)
35
+ @context = context
36
+ @expected = prepare(expected)
37
+ end
38
+
39
+ def description
40
+ ['send JSON:', @mode_description].join(' ')
41
+ end
42
+
43
+ def matches?(response)
44
+ @actual = JSON.parse(response.body)
45
+ actual == expected
46
+ end
47
+
48
+ def failure_message
49
+ msg = <<-MSG
50
+ Expected actual response:
51
+ #{'-' * 60}
52
+ #{JSON.pretty_generate(actual)}
53
+ to match:
54
+ #{'-' * 60}
55
+ #{JSON.pretty_generate(expected)}
56
+ MSG
57
+
58
+ msg.gsub(/^\s{12}/, '')
59
+ end
60
+
61
+ private
62
+
63
+ def filename(name)
64
+ "#{name.sub(/\.json\z/, '')}.json"
65
+ end
66
+
67
+ def fixture(name)
68
+ File.join(fixture_path, filename(name))
69
+ end
70
+
71
+ # TODO: allow Test::Unit definition
72
+ def fixture_path
73
+ # @_fixture_path ||= "#{Emerson.fixture_path || RSpec.configuration.fixture_path}/responses"
74
+ @_fixture_path ||= File.join(Emerson.fixture_path, 'responses')
75
+ end
76
+
77
+ def prepare(source)
78
+ result = begin
79
+ case source
80
+ when String
81
+ @mode_description = filename(source)
82
+ path = fixture(source)
83
+ File.exist?(path) ? JSON.parse(File.read(path)) : { :missing => path.to_s }
84
+ when Array, Hash
85
+ @mode_description = '(provided)'
86
+ JSON.parse(source.to_json)
87
+ else
88
+ raise ArgumentError.new('expected "JSON" should be a Hash, or a String lookup')
89
+ end
90
+ end
91
+
92
+ if result.is_a?(Hash) && result.keys.include?('$extends')
93
+ refs = [result.delete('$extends')].flatten
94
+
95
+ result = {}.tap do |hash|
96
+ refs.each { |ref| hash.merge!(prepare(ref)) }
97
+ hash.merge!(result)
98
+ end
99
+ end
100
+
101
+ result
102
+ end
103
+ end
104
+ end
105
+ end
106
+ end