roar-rails 0.0.15 → 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
data/CHANGES.markdown CHANGED
@@ -1,3 +1,9 @@
1
+ h2. 0.1.0
2
+
3
+ * `ActiveRecord::Relation` is now detected as a collection and the appropriate representer should be found.
4
+ * Entity (singular) representers are now correctly infered even if you only specified `collection:` in `::represents`. That works by querying the model.
5
+ * Entity representers are now *namespaced* when guessed (i.e., when you didn't specify them explicitly in `::represents`) as it works with collection representers already. If you have a namespaced controller and it suddenly doesn't find its entity representer anymore, either namespace the representer or specify its name in `::represents`.
6
+
1
7
  h2. 0.0.14
2
8
 
3
9
  * Moved logic to infer representer names from `ControllerAdditions` to `RepresenterComputer` class.
@@ -4,4 +4,6 @@ source "http://rubygems.org"
4
4
  gemspec :path => '../'
5
5
 
6
6
  gem 'railties', '~> 3.0.11'
7
+ gem 'activerecord', '~> 3.0.11'
8
+
7
9
  gem 'roar', ">= 0.11.17"
@@ -7,4 +7,6 @@ gem 'railties', '~> 4.0.0.beta1'
7
7
  gem 'actionpack', '~> 4.0.0.beta1'
8
8
 
9
9
  gem 'activemodel', '~> 4.0.0.beta1'
10
+ gem 'activerecord', '~> 4.0.0.beta1'
11
+
10
12
  gem 'roar', ">= 0.11.17"
data/lib/roar-rails.rb CHANGED
@@ -21,7 +21,7 @@ end
21
21
  module Roar
22
22
  module Rails
23
23
  def self.rails3_0?
24
- ::Rails::VERSION::MINOR == 0
24
+ ::Rails::VERSION::MAJOR == 3 && ::Rails::VERSION::MINOR == 0
25
25
  end
26
26
 
27
27
  if rails3_0?
@@ -57,10 +57,10 @@ module Roar::Rails
57
57
  # FIXME: use controller_path here as well!
58
58
  # by pre-computing the representer name we allow "one-step inheritance": if B doesn't call ::represents it "inherits" A's settings.
59
59
  unless opts.is_a?(Hash)
60
- model = opts
60
+ model_name = opts.name.underscore
61
61
  opts = {
62
- :entity => add_representer_suffix(model.name),
63
- :collection => add_representer_suffix(model.name.pluralize)
62
+ :entity => add_representer_suffix(model_name),
63
+ :collection => add_representer_suffix(model_name.pluralize)
64
64
  }
65
65
  end
66
66
 
@@ -71,23 +71,57 @@ module Roar::Rails
71
71
  name = name_for(*args) or return
72
72
 
73
73
  return name if name.is_a?(Module) # i hate is_a? but this is really handy here.
74
- name.constantize
74
+ name.camelize.constantize
75
75
  end
76
76
 
77
77
  private
78
- def name_for(format, model, controller_path) # DISCUSS: should we pass and process options here?
79
- if self[format.to_sym].blank? # TODO: test to_sym?
80
- model_name = model.class.name
81
- model_name = controller_path.camelize if model.kind_of?(Array)
82
- return add_representer_suffix(model_name).constantize
78
+ def [](format)
79
+ super(format.to_sym) or {}
80
+ end
81
+
82
+ def name_for(format, model, controller_path) # DISCUSS: should we pass and process options here?
83
+ controller_path = Path.new(controller_path) # DISCUSS: could that be done in the initialization, maybe?
84
+ options = self[format]
85
+
86
+ if detect_collection(model)
87
+ options[:collection] or collection_representer(format, model, controller_path)
88
+ else
89
+ options[:entity] or entity_representer(format, model, controller_path)
90
+ end
91
+ end
92
+
93
+ def collection_representer(format, model, controller_path)
94
+ infer_representer(controller_path)
95
+ end
96
+
97
+ def entity_representer(format, model, controller_path)
98
+ model_name = model.class.name.underscore
99
+
100
+ if namespace = controller_path.namespace
101
+ model_name = "#{namespace}/#{model_name}"
83
102
  end
84
103
 
85
- return self[format][:collection] if model.kind_of?(Array)
86
- self[format][:entity]
104
+ infer_representer(model_name)
105
+ end
106
+
107
+ def infer_representer(model_name)
108
+ add_representer_suffix(model_name).camelize.constantize
87
109
  end
88
110
 
89
111
  def add_representer_suffix(prefix)
90
- "#{prefix}Representer"
112
+ "#{prefix}_representer"
113
+ end
114
+
115
+ def detect_collection(model)
116
+ return true if model.kind_of?(Array)
117
+ return true if Object.const_defined?("ActiveRecord") and model.kind_of?(ActiveRecord::Relation)
118
+ end
119
+
120
+ class Path < String
121
+ def namespace
122
+ return unless ns = self.match(/(.+)\/\w+$/)
123
+ ns[1]
124
+ end
91
125
  end
92
126
  end
93
127
  end
@@ -9,7 +9,7 @@ module Roar
9
9
  initializer "roar.set_configs" do |app|
10
10
  ::Roar::Representer.module_eval do
11
11
  include app.routes.url_helpers
12
- include app.routes.mounted_helpers unless ::Rails::VERSION::MINOR == 0
12
+ include app.routes.mounted_helpers unless Roar::Rails.rails3_0?
13
13
 
14
14
  include UrlMethods # provide an initial #default_url_options.
15
15
  end
@@ -1,6 +1,14 @@
1
+ if ::ActionPack::VERSION::MAJOR == 4
2
+ require 'test_xml/mini_test'
3
+ else
4
+ require 'test_xml/test_unit'
5
+ end
6
+
1
7
  module Roar
2
8
  module Rails
3
9
  module TestCase
10
+ include TestXml::Assertions # FIXME: including from test_xml in MiniTest::Test doesn't work with rails 4.
11
+
4
12
  def get(action, *args)
5
13
  process(action, "GET", *args)
6
14
  end
@@ -29,12 +37,6 @@ module Roar
29
37
  end
30
38
 
31
39
  module Assertions
32
- if ::ActionPack::VERSION::MAJOR == 4
33
- require 'test_xml/mini_test'
34
- else
35
- require 'test_xml/test_unit'
36
- end
37
-
38
40
  def assert_body(body, options={})
39
41
  return assert_xml_equal body, response.body if options[:xml]
40
42
  assert_equal body, response.body
@@ -1,5 +1,5 @@
1
1
  module Roar
2
2
  module Rails
3
- VERSION = "0.0.15"
3
+ VERSION = "0.1.0"
4
4
  end
5
5
  end
data/roar-rails.gemspec CHANGED
@@ -18,14 +18,16 @@ Gem::Specification.new do |s|
18
18
  s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
19
19
  s.require_paths = ["lib"]
20
20
 
21
- s.add_runtime_dependency "roar", "~> 0.10"
21
+ s.add_runtime_dependency "roar", "~> 0.11.13"
22
22
  s.add_runtime_dependency "representable", "~> 1.4"
23
- s.add_runtime_dependency "test_xml"
23
+ s.add_runtime_dependency "test_xml", ">= 0.1.6" # TODO: remove dependency as most people don't use XML.
24
24
  s.add_runtime_dependency "actionpack"
25
25
  s.add_runtime_dependency "railties", ">= 3.0.0"
26
26
  s.add_runtime_dependency "hooks"
27
27
 
28
- s.add_development_dependency "minitest", ">= 2.8.1"
28
+ s.add_development_dependency "minitest", "~> 4.0"
29
29
  s.add_development_dependency "activemodel"
30
+ s.add_development_dependency "activerecord"
31
+ s.add_development_dependency "sqlite3"
30
32
  s.add_development_dependency "tzinfo" # FIXME: why the hell do we need this for 3.1?
31
33
  end
data/test/consume_test.rb CHANGED
@@ -1,77 +1,72 @@
1
1
  require 'test_helper'
2
2
 
3
+ class UnnamespaceSingersController < ActionController::Base
4
+ include Roar::Rails::ControllerAdditions
5
+ respond_to :json, :xml
6
+
7
+ def consume_json
8
+ singer = consume!(Singer.new)
9
+ render :text => singer.inspect
10
+ end
11
+ end
12
+
3
13
  class ConsumeTest < ActionController::TestCase
4
14
  include Roar::Rails::TestCase
5
-
6
- class SingersController < ActionController::Base
7
- include Roar::Rails::ControllerAdditions
8
- respond_to :json, :xml
9
15
 
10
- def consume_json
11
- singer = consume!(Singer.new)
12
- render :text => singer.to_json
13
- end
14
- end
16
+ tests UnnamespaceSingersController
15
17
 
16
- tests SingersController
17
-
18
18
  test "#consume parses incoming document and updates the model" do
19
19
  post :consume_json, "{\"name\": \"Bumi\"}", :format => 'json'
20
- assert_equal singer.to_json, @response.body
21
- end
22
-
23
- def singer(name="Bumi")
24
- singer = Musician.new(name)
25
- singer.extend SingerRepresenter
20
+ assert_equal %{#<struct Singer name="Bumi">}, @response.body
26
21
  end
27
22
  end
28
23
 
29
- class ConsumeWithConfigurationTest < ConsumeTest
24
+ class ConsumeWithConfigurationTest < ActionController::TestCase
30
25
  include Roar::Rails::TestCase
31
-
26
+
32
27
  module MusicianRepresenter
33
28
  include Roar::Representer::JSON
34
29
  property :name, :from => :called
35
30
  end
36
-
37
-
31
+
32
+
38
33
  class SingersController < ActionController::Base
39
34
  include Roar::Rails::ControllerAdditions
40
35
  respond_to :json
41
- represents "json", :entity => MusicianRepresenter
36
+ represents :json, :entity => MusicianRepresenter
42
37
 
43
38
  def consume_json
44
39
  singer = consume!(Singer.new)
45
- render :text => singer.to_json
40
+ render :text => singer.inspect
46
41
  end
47
42
  end
48
43
 
49
44
  tests SingersController
50
-
51
- test "#consume uses #represents config to parse incoming document" do
52
- post :consume_json, "{\"name\": \"Bumi\"}", :format => :json
53
- assert_equal singer.to_json, @response.body
45
+
46
+ test "#consume uses ConsumeWithConfigurationTest::MusicianRepresenter to parse incoming document" do
47
+ post :consume_json, %{{"called":"Bumi"}}, :format => :json
48
+ assert_equal %{#<struct Singer name="Bumi">}, @response.body
54
49
  end
55
50
  end
56
51
 
57
- class ConsumeWithOptionsOverridingConfigurationTest < ConsumeTest
52
+ class ConsumeWithOptionsOverridingConfigurationTest < ActionController::TestCase
58
53
  include Roar::Rails::TestCase
59
-
54
+
55
+
60
56
  class SingersController < ActionController::Base
61
57
  include Roar::Rails::ControllerAdditions
62
- respond_to :json
63
58
  represents :json, :entity => Object
64
59
 
65
60
  def consume_json
66
- singer = consume!(Singer.new, :represent_with => SingerRepresenter)
67
- render :text => singer.to_json
61
+ singer = consume!(Singer.new, :represent_with => ::ConsumeWithConfigurationTest::MusicianRepresenter)
62
+ render :text => singer.inspect
68
63
  end
69
64
  end
70
65
 
71
66
  tests SingersController
72
-
67
+
73
68
  test "#consume uses #represents config to parse incoming document" do
74
- post :consume_json, "{\"name\": \"Bumi\"}", :format => :json
75
- assert_equal singer.to_json, @response.body
69
+ post :consume_json, %{{"called":"Bumi"}}, :format => :json
70
+ assert_equal %{#<struct Singer name="Bumi">}, @response.body
76
71
  end
77
72
  end
@@ -0,0 +1,2 @@
1
+ class Artist < ActiveRecord::Base
2
+ end
@@ -2,6 +2,7 @@ require File.expand_path('../boot', __FILE__)
2
2
 
3
3
  require "action_controller/railtie"
4
4
  require "action_view/railtie"
5
+ require "active_record/railtie"
5
6
 
6
7
  Bundler.require
7
8
 
Binary file
@@ -5,12 +5,22 @@ end
5
5
  module ObjectsRepresenter
6
6
  end
7
7
 
8
+ module V1
9
+ module SingerRepresenter
10
+ end
11
+ module BassistRepresenter
12
+ end
13
+ module SingersRepresenter
14
+ end
15
+ end
16
+
17
+ class Bassist
18
+ end
19
+
8
20
  class RepresenterComputerTest < MiniTest::Spec
9
21
  let (:subject) { Roar::Rails::ControllerAdditions::RepresenterComputer.new }
10
22
 
11
23
  describe "nothing configured" do
12
-
13
-
14
24
  it "uses model class" do
15
25
  subject.for(:json, Singer.new, "bands").must_equal SingerRepresenter
16
26
  end
@@ -39,8 +49,20 @@ class RepresenterComputerTest < MiniTest::Spec
39
49
  subject.for(:json, Singer.new, "bands").must_equal ObjectRepresenter
40
50
  end
41
51
 
42
- it "doesn't infer collection representer" do
43
- subject.for(:json, [], "bands").must_equal nil
52
+ it "infer collection representer" do
53
+ subject.for(:json, [], "singers").must_equal SingersRepresenter
54
+ end
55
+ end
56
+
57
+ describe "represents :json, :collection => SingersRepresenter only" do
58
+ before { subject.add(:json, :collection => SingersRepresenter) }
59
+
60
+ it "infers entity representer" do
61
+ subject.for(:json, Singer.new, "bands").must_equal SingerRepresenter
62
+ end
63
+
64
+ it "returns :collection representer" do
65
+ subject.for(:json, [Singer.new], "singers").must_equal SingersRepresenter
44
66
  end
45
67
  end
46
68
 
@@ -57,6 +79,31 @@ class RepresenterComputerTest < MiniTest::Spec
57
79
  end
58
80
  end
59
81
 
82
+ describe "namespaces" do
83
+ describe "unconfigured" do
84
+ it "returns namespaced entity" do
85
+ subject.for(:json, Singer.new, "v1/singers").must_equal V1::SingerRepresenter
86
+ end
87
+
88
+ it "returns polymorphic namespaced entity" do
89
+ subject.for(:json, Bassist.new, "v1/singers").must_equal V1::BassistRepresenter
90
+ end
91
+
92
+ it "returns namespaced collection" do
93
+ subject.for(:json, [Object.new], "v1/singers").must_equal V1::SingersRepresenter
94
+ end
95
+ end
96
+ end
97
+
98
+ describe "with ActiveRecord::Relation" do
99
+ before { subject.add(:json, :entity => ObjectRepresenter,
100
+ :collection => SingersRepresenter) }
101
+
102
+ it "detects collection in form of ActiveRecord::Relation" do
103
+ subject.for(:json, Artist.find(:all), "artists").must_equal SingersRepresenter
104
+ end
105
+ end
106
+
60
107
  describe "#add" do
61
108
  it "doesn't constantize" do
62
109
  subject.add(:json, :entity => "ObjectRepresenter")
@@ -65,9 +112,27 @@ class RepresenterComputerTest < MiniTest::Spec
65
112
  end
66
113
 
67
114
  describe "#for" do
115
+ before { subject.add(:json, :entity => "ObjectRepresenter") }
116
+
68
117
  it "constantizes strings" do
69
- subject.add(:json, :entity => "ObjectRepresenter")
70
118
  subject.for(:json, Object.new, "bands").must_equal ObjectRepresenter
71
119
  end
120
+
121
+ it "accepts string format" do
122
+ subject.for("json", Object.new, "bands").must_equal ObjectRepresenter
123
+ end
124
+
125
+ it "returns nil when not present" do
126
+ skip "not sure what to do when format is unknown"
127
+ subject.for(:xml, Class.new.new, "bands").must_equal nil
128
+ end
72
129
  end
130
+ end
131
+
132
+ class PathTest < MiniTest::Spec
133
+ let (:path) { Roar::Rails::ControllerAdditions::RepresenterComputer::Path }
134
+
135
+ it { path.new("bands").namespace.must_equal nil }
136
+ it { path.new("v1/bands").namespace.must_equal "v1" }
137
+ it { path.new("api/v1/bands").namespace.must_equal "api/v1" }
73
138
  end
@@ -1,7 +1,5 @@
1
1
  require 'test_helper'
2
2
 
3
- Singer = Struct.new(:name)
4
-
5
3
  module SingersRepresenter
6
4
  include Roar::Representer::JSON
7
5
 
@@ -49,6 +47,8 @@ class ResponderTest < ActionController::TestCase
49
47
 
50
48
  class UnconfiguredControllerTest < ResponderTest
51
49
  SingersRepresenter = ::SingersRepresenter
50
+ SingerRepresenter = ::SingerRepresenter
51
+
52
52
  class SingersController < BaseController
53
53
  end
54
54
 
@@ -69,7 +69,7 @@ class ResponderTest < ActionController::TestCase
69
69
  respond_with singers
70
70
  end
71
71
 
72
- assert_equal({:singers => singers.collect {|s| s.extend(SingerRepresenter).to_hash }}.to_json, @response.body)
72
+ @response.body.must_equal({:singers => singers.collect {|s| s.extend(SingerRepresenter).to_hash }}.to_json)
73
73
  end
74
74
 
75
75
  test "responder allows empty response bodies to pass through" do
@@ -146,8 +146,11 @@ class ResponderTest < ActionController::TestCase
146
146
  class ControllerWithDecoratorTest < ResponderTest
147
147
  class SingerRepresentation < Representable::Decorator
148
148
  include Roar::Representer::JSON
149
+ include Roar::Representer::JSON::HAL
149
150
 
150
151
  property :name
152
+
153
+ link(:self) { "http://singers/#{represented.name}" }
151
154
  end
152
155
 
153
156
  class MusicianController < BaseController
@@ -162,7 +165,7 @@ class ResponderTest < ActionController::TestCase
162
165
  respond_with singer
163
166
  end
164
167
 
165
- assert_equal "{\"name\":\"Bumi\"}", @response.body
168
+ assert_equal %{{"name":"Bumi","_links":{"self":{"href":"http://singers/Bumi"}}}}, @response.body
166
169
  end
167
170
 
168
171
  test "parsing uses decorating representer" do # FIXME: move to controller_test.
@@ -2,68 +2,68 @@ require 'test_helper'
2
2
 
3
3
  class TestCaseTest < ActionController::TestCase
4
4
  include Roar::Rails::TestCase
5
-
5
+
6
6
  class BandController < ActionController::Base
7
7
  def show
8
8
  render :text => "#{request.body.string}#{params[:id]}"
9
9
  end
10
-
10
+
11
11
  end
12
-
12
+
13
13
  tests BandController
14
-
14
+
15
15
  test "allows POST without body" do
16
16
  post :show
17
17
  assert_equal "", response.body
18
18
  end
19
-
19
+
20
20
  test "allows POST with options, only" do
21
21
  post :show, :id => 1
22
22
  assert_equal "1", response.body
23
23
  end
24
-
24
+
25
25
  test "allows POST with document" do
26
26
  post :show, "{}"
27
27
  assert_equal "{}", response.body
28
28
  end
29
-
29
+
30
30
  test "allows POST with document and options" do
31
31
  post :show, "{}", :id => 1
32
32
  assert_equal "{}1", response.body
33
33
  end
34
-
34
+
35
35
  test "allows GET" do
36
36
  get :show, :id => 1
37
37
  assert_equal "1", response.body
38
38
  end
39
-
39
+
40
40
  test "allows PUT" do
41
41
  put :show, "{}", :id => 1
42
42
  assert_equal "{}1", response.body
43
43
  end
44
-
44
+
45
45
  test "allows DELETE" do
46
46
  delete :show, "{}", :id => 1
47
47
  assert_equal "{}1", response.body
48
48
  end
49
-
49
+
50
50
  test "#assert_body" do
51
51
  get :show, :id => 1
52
52
  assert_body "1"
53
-
53
+
54
54
  # TODO: check message.
55
55
  assert_raises MiniTest::Assertion do
56
56
  assert_body "3"
57
57
  end
58
58
  end
59
-
59
+
60
60
  test "#assert_body with xml" do
61
61
  @controller.instance_eval do
62
62
  def show
63
63
  render :text => "<order/>"
64
64
  end
65
65
  end
66
-
66
+
67
67
  get :show
68
68
  assert_body "<order></order>", :xml => true
69
69
  end
data/test/test_helper.rb CHANGED
@@ -8,3 +8,5 @@ ENV['RAILS_ENV'] = 'test'
8
8
  require "dummy/config/environment"
9
9
  require "rails/test_help" # adds stuff like @routes, etc.
10
10
  require "roar/rails/test_case"
11
+
12
+ Singer = Struct.new(:name)
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: roar-rails
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.15
4
+ version: 0.1.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2013-05-06 00:00:00.000000000 Z
12
+ date: 2013-05-16 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: roar
@@ -18,7 +18,7 @@ dependencies:
18
18
  requirements:
19
19
  - - ~>
20
20
  - !ruby/object:Gem::Version
21
- version: '0.10'
21
+ version: 0.11.13
22
22
  type: :runtime
23
23
  prerelease: false
24
24
  version_requirements: !ruby/object:Gem::Requirement
@@ -26,7 +26,7 @@ dependencies:
26
26
  requirements:
27
27
  - - ~>
28
28
  - !ruby/object:Gem::Version
29
- version: '0.10'
29
+ version: 0.11.13
30
30
  - !ruby/object:Gem::Dependency
31
31
  name: representable
32
32
  requirement: !ruby/object:Gem::Requirement
@@ -50,7 +50,7 @@ dependencies:
50
50
  requirements:
51
51
  - - ! '>='
52
52
  - !ruby/object:Gem::Version
53
- version: '0'
53
+ version: 0.1.6
54
54
  type: :runtime
55
55
  prerelease: false
56
56
  version_requirements: !ruby/object:Gem::Requirement
@@ -58,7 +58,7 @@ dependencies:
58
58
  requirements:
59
59
  - - ! '>='
60
60
  - !ruby/object:Gem::Version
61
- version: '0'
61
+ version: 0.1.6
62
62
  - !ruby/object:Gem::Dependency
63
63
  name: actionpack
64
64
  requirement: !ruby/object:Gem::Requirement
@@ -109,12 +109,44 @@ dependencies:
109
109
  version: '0'
110
110
  - !ruby/object:Gem::Dependency
111
111
  name: minitest
112
+ requirement: !ruby/object:Gem::Requirement
113
+ none: false
114
+ requirements:
115
+ - - ~>
116
+ - !ruby/object:Gem::Version
117
+ version: '4.0'
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ none: false
122
+ requirements:
123
+ - - ~>
124
+ - !ruby/object:Gem::Version
125
+ version: '4.0'
126
+ - !ruby/object:Gem::Dependency
127
+ name: activemodel
128
+ requirement: !ruby/object:Gem::Requirement
129
+ none: false
130
+ requirements:
131
+ - - ! '>='
132
+ - !ruby/object:Gem::Version
133
+ version: '0'
134
+ type: :development
135
+ prerelease: false
136
+ version_requirements: !ruby/object:Gem::Requirement
137
+ none: false
138
+ requirements:
139
+ - - ! '>='
140
+ - !ruby/object:Gem::Version
141
+ version: '0'
142
+ - !ruby/object:Gem::Dependency
143
+ name: activerecord
112
144
  requirement: !ruby/object:Gem::Requirement
113
145
  none: false
114
146
  requirements:
115
147
  - - ! '>='
116
148
  - !ruby/object:Gem::Version
117
- version: 2.8.1
149
+ version: '0'
118
150
  type: :development
119
151
  prerelease: false
120
152
  version_requirements: !ruby/object:Gem::Requirement
@@ -122,9 +154,9 @@ dependencies:
122
154
  requirements:
123
155
  - - ! '>='
124
156
  - !ruby/object:Gem::Version
125
- version: 2.8.1
157
+ version: '0'
126
158
  - !ruby/object:Gem::Dependency
127
- name: activemodel
159
+ name: sqlite3
128
160
  requirement: !ruby/object:Gem::Requirement
129
161
  none: false
130
162
  requirements:
@@ -189,6 +221,7 @@ files:
189
221
  - test/dummy/app/controllers/bands_controller.rb
190
222
  - test/dummy/app/controllers/singers_controller.rb
191
223
  - test/dummy/app/helpers/application_helper.rb
224
+ - test/dummy/app/models/artist.rb
192
225
  - test/dummy/app/representers/band_representer.rb
193
226
  - test/dummy/app/representers/singer_alias_representer.rb
194
227
  - test/dummy/app/representers/singer_representer.rb