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 +6 -0
- data/gemfiles/Gemfile.rails3-0 +2 -0
- data/gemfiles/Gemfile.rails4-0 +2 -0
- data/lib/roar-rails.rb +1 -1
- data/lib/roar/rails/controller_additions.rb +46 -12
- data/lib/roar/rails/railtie.rb +1 -1
- data/lib/roar/rails/test_case.rb +8 -6
- data/lib/roar/rails/version.rb +1 -1
- data/roar-rails.gemspec +5 -3
- data/test/consume_test.rb +30 -35
- data/test/dummy/app/models/artist.rb +2 -0
- data/test/dummy/config/application.rb +1 -0
- data/test/dummy/db/test.sqlite3 +0 -0
- data/test/representer_computer_test.rb +70 -5
- data/test/responder_test.rb +7 -4
- data/test/test_case_test.rb +14 -14
- data/test/test_helper.rb +2 -0
- metadata +42 -9
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.
|
data/gemfiles/Gemfile.rails3-0
CHANGED
data/gemfiles/Gemfile.rails4-0
CHANGED
data/lib/roar-rails.rb
CHANGED
@@ -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
|
-
|
60
|
+
model_name = opts.name.underscore
|
61
61
|
opts = {
|
62
|
-
:entity => add_representer_suffix(
|
63
|
-
:collection => add_representer_suffix(
|
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
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
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
|
-
|
86
|
-
|
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}
|
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
|
data/lib/roar/rails/railtie.rb
CHANGED
@@ -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
|
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
|
data/lib/roar/rails/test_case.rb
CHANGED
@@ -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
|
data/lib/roar/rails/version.rb
CHANGED
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.
|
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", "
|
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
|
-
|
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
|
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 <
|
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
|
36
|
+
represents :json, :entity => MusicianRepresenter
|
42
37
|
|
43
38
|
def consume_json
|
44
39
|
singer = consume!(Singer.new)
|
45
|
-
render :text => singer.
|
40
|
+
render :text => singer.inspect
|
46
41
|
end
|
47
42
|
end
|
48
43
|
|
49
44
|
tests SingersController
|
50
|
-
|
51
|
-
test "#consume uses
|
52
|
-
post :consume_json,
|
53
|
-
assert_equal
|
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 <
|
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 =>
|
67
|
-
render :text => singer.
|
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,
|
75
|
-
assert_equal
|
69
|
+
post :consume_json, %{{"called":"Bumi"}}, :format => :json
|
70
|
+
assert_equal %{#<struct Singer name="Bumi">}, @response.body
|
76
71
|
end
|
77
72
|
end
|
data/test/dummy/db/test.sqlite3
CHANGED
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 "
|
43
|
-
subject.for(:json, [], "
|
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
|
data/test/responder_test.rb
CHANGED
@@ -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
|
-
|
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
|
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.
|
data/test/test_case_test.rb
CHANGED
@@ -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
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
|
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-
|
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:
|
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:
|
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:
|
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:
|
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:
|
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:
|
157
|
+
version: '0'
|
126
158
|
- !ruby/object:Gem::Dependency
|
127
|
-
name:
|
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
|