roar-rails 0.0.15 → 0.1.0

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.
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