roar 1.0.4 → 1.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (52) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +14 -6
  3. data/CHANGES.markdown +75 -58
  4. data/CONTRIBUTING.md +31 -0
  5. data/Gemfile +12 -2
  6. data/ISSUE_TEMPLATE.md +20 -0
  7. data/LICENSE +1 -1
  8. data/README.markdown +126 -250
  9. data/Rakefile +3 -1
  10. data/examples/example.rb +0 -0
  11. data/examples/example_server.rb +0 -0
  12. data/lib/roar.rb +3 -3
  13. data/lib/roar/client.rb +8 -3
  14. data/lib/roar/decorator.rb +2 -2
  15. data/lib/roar/http_verbs.rb +0 -16
  16. data/lib/roar/hypermedia.rb +30 -56
  17. data/lib/roar/json.rb +5 -5
  18. data/lib/roar/json/collection.rb +10 -2
  19. data/lib/roar/json/hal.rb +72 -82
  20. data/lib/roar/version.rb +1 -1
  21. data/lib/roar/xml.rb +1 -1
  22. data/roar.gemspec +6 -6
  23. data/test/client_test.rb +1 -1
  24. data/test/coercion_feature_test.rb +7 -2
  25. data/test/decorator_test.rb +17 -7
  26. data/test/hal_json_test.rb +98 -106
  27. data/test/hypermedia_feature_test.rb +13 -31
  28. data/test/hypermedia_test.rb +26 -92
  29. data/test/{decorator_client_test.rb → integration/decorator_client_test.rb} +5 -4
  30. data/test/{faraday_http_transport_test.rb → integration/faraday_http_transport_test.rb} +1 -0
  31. data/test/{http_verbs_test.rb → integration/http_verbs_test.rb} +3 -2
  32. data/test/integration/json_collection_test.rb +35 -0
  33. data/test/{net_http_transport_test.rb → integration/net_http_transport_test.rb} +1 -0
  34. data/test/integration/runner.rb +2 -3
  35. data/test/integration/server.rb +6 -0
  36. data/test/json_representer_test.rb +2 -29
  37. data/test/lonely_test.rb +1 -2
  38. data/test/ssl_client_certs_test.rb +1 -1
  39. data/test/test_helper.rb +21 -3
  40. data/test/xml_representer_test.rb +6 -5
  41. metadata +22 -36
  42. data/gemfiles/Gemfile.representable-1.7 +0 -6
  43. data/gemfiles/Gemfile.representable-1.8 +0 -6
  44. data/gemfiles/Gemfile.representable-2.0 +0 -5
  45. data/gemfiles/Gemfile.representable-2.1 +0 -5
  46. data/gemfiles/Gemfile.representable-head +0 -6
  47. data/lib/roar/json/collection_json.rb +0 -208
  48. data/lib/roar/json/json_api.rb +0 -233
  49. data/test/collection_json_test.rb +0 -132
  50. data/test/hal_links_test.rb +0 -31
  51. data/test/json_api_test.rb +0 -451
  52. data/test/lib/runner.rb +0 -134
@@ -4,6 +4,5 @@ require "roar/json/collection"
4
4
  require "roar/json/hash"
5
5
 
6
6
  class LonelyCollectionTest < MiniTest::Spec
7
- it { Roar::JSON::Collection.must_equal Representable::JSON::Collection }
8
7
  it { Roar::JSON::Hash.must_equal Representable::JSON::Hash }
9
- end
8
+ end
@@ -57,7 +57,7 @@ class SslClientCertsTest < MiniTest::Spec
57
57
 
58
58
  describe "when a pem file has been provided with the request options" do
59
59
 
60
- let(:pem_file) { File.expand_path("test/fixtures/sample.pem", Roar.root) }
60
+ let(:pem_file) { File.expand_path("test/fixtures/sample.pem", File.expand_path('../..', __FILE__)) }
61
61
 
62
62
  let(:pem) { File.read(pem_file) }
63
63
  let(:cert) { OpenSSL::X509::Certificate.new(pem) }
@@ -1,9 +1,15 @@
1
+ # require "pry"
1
2
  require 'minitest/autorun'
2
3
  require 'ostruct'
3
4
 
4
5
  require 'roar/representer'
5
6
  require 'roar/http_verbs'
6
- require 'roar/json/hal'
7
+
8
+ require "roar/json"
9
+ require "roar/json/hal"
10
+
11
+ require "representable/debug"
12
+ require "pp"
7
13
 
8
14
  module AttributesConstructor # TODO: remove me.
9
15
  def initialize(attrs={})
@@ -26,13 +32,22 @@ end
26
32
  require "test_xml/mini_test"
27
33
  require "roar/xml"
28
34
 
29
- require "integration/runner"
30
35
 
31
36
  MiniTest::Spec.class_eval do
32
37
  def link(options)
33
38
  Roar::Hypermedia::Hyperlink.new(options)
34
39
  end
35
40
 
41
+ def self.decorator_for(modules=[Roar::JSON, Roar::Hypermedia], &block)
42
+ let(:decorator_class) do
43
+ Class.new(Roar::Decorator) do
44
+ include *modules.reverse
45
+
46
+ instance_eval(&block)
47
+ end
48
+ end
49
+ end
50
+
36
51
  def self.representer_for(modules=[Roar::JSON, Roar::Hypermedia], &block)
37
52
  let (:rpr) do
38
53
  Module.new do
@@ -42,6 +57,9 @@ MiniTest::Spec.class_eval do
42
57
  end
43
58
  end
44
59
  end
60
+ def representer
61
+ rpr # TODO: unify with representable.
62
+ end
45
63
 
46
64
  def self.representer!(*args, &block)
47
65
  representer_for(*args, &block)
@@ -57,4 +75,4 @@ Roar::Hypermedia::Hyperlink.class_eval do
57
75
  def ==(b)
58
76
  @attrs == b.instance_variable_get(:@attrs)
59
77
  end
60
- end
78
+ end
@@ -1,7 +1,8 @@
1
1
  require 'test_helper'
2
+ require 'roar/decorator'
2
3
 
3
4
  class XMLRepresenterFunctionalTest < MiniTest::Spec
4
- module OrderRepresenter
5
+ class OrderRepresenter < Roar::Decorator
5
6
  include Roar::XML
6
7
 
7
8
  property :id
@@ -11,10 +12,10 @@ class XMLRepresenterFunctionalTest < MiniTest::Spec
11
12
  Order = Struct.new(:id, :items)
12
13
 
13
14
  describe "#to_xml" do
14
- let (:order) { Order.new(1).extend(OrderRepresenter) }
15
+ let (:order) { OrderRepresenter.new(Order.new(1)) }
15
16
 
16
17
  # empty model
17
- it { Order.new.extend(OrderRepresenter).to_xml.must_equal_xml "<order/>" }
18
+ it { OrderRepresenter.new(Order.new).to_xml.must_equal_xml "<order/>" }
18
19
 
19
20
  # populated model
20
21
  it { order.to_xml.must_equal_xml "<order><id>1</id></order>" }
@@ -30,7 +31,7 @@ class XMLRepresenterFunctionalTest < MiniTest::Spec
30
31
  end
31
32
 
32
33
  describe "#from_xml" do
33
- let (:order) { Order.new.extend(OrderRepresenter) }
34
+ let (:order) { OrderRepresenter.new(Order.new) }
34
35
 
35
36
  # parses
36
37
  it { order.from_xml("<order><id>1</id></order>").id.must_equal "1" }
@@ -39,7 +40,7 @@ class XMLRepresenterFunctionalTest < MiniTest::Spec
39
40
  it { order.deserialize("<order><id>1</id></order>").id.must_equal "1" }
40
41
 
41
42
  # accepts options
42
- it { order.from_xml("<order><id>1</id></order>", exclude: [:id]).id.must_equal nil }
43
+ it { order.from_xml("<order><id>1</id></order>", exclude: [:id]).id.must_be_nil }
43
44
  end
44
45
  end
45
46
 
metadata CHANGED
@@ -1,35 +1,29 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: roar
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.4
4
+ version: 1.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Nick Sutterer
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-11-30 00:00:00.000000000 Z
11
+ date: 2017-01-12 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: representable
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - ">="
18
- - !ruby/object:Gem::Version
19
- version: 2.0.1
20
- - - "<"
17
+ - - "~>"
21
18
  - !ruby/object:Gem::Version
22
- version: 2.4.0
19
+ version: 3.0.0
23
20
  type: :runtime
24
21
  prerelease: false
25
22
  version_requirements: !ruby/object:Gem::Requirement
26
23
  requirements:
27
- - - ">="
28
- - !ruby/object:Gem::Version
29
- version: 2.0.1
30
- - - "<"
24
+ - - "~>"
31
25
  - !ruby/object:Gem::Version
32
- version: 2.4.0
26
+ version: 3.0.0
33
27
  - !ruby/object:Gem::Dependency
34
28
  name: rake
35
29
  requirement: !ruby/object:Gem::Requirement
@@ -64,42 +58,42 @@ dependencies:
64
58
  requirements:
65
59
  - - ">="
66
60
  - !ruby/object:Gem::Version
67
- version: 5.4.2
61
+ version: '5.10'
68
62
  type: :development
69
63
  prerelease: false
70
64
  version_requirements: !ruby/object:Gem::Requirement
71
65
  requirements:
72
66
  - - ">="
73
67
  - !ruby/object:Gem::Version
74
- version: 5.4.2
68
+ version: '5.10'
75
69
  - !ruby/object:Gem::Dependency
76
70
  name: sinatra
77
71
  requirement: !ruby/object:Gem::Requirement
78
72
  requirements:
79
73
  - - ">="
80
74
  - !ruby/object:Gem::Version
81
- version: '0'
75
+ version: 2.0.0
82
76
  type: :development
83
77
  prerelease: false
84
78
  version_requirements: !ruby/object:Gem::Requirement
85
79
  requirements:
86
80
  - - ">="
87
81
  - !ruby/object:Gem::Version
88
- version: '0'
82
+ version: 2.0.0
89
83
  - !ruby/object:Gem::Dependency
90
84
  name: sinatra-contrib
91
85
  requirement: !ruby/object:Gem::Requirement
92
86
  requirements:
93
87
  - - ">="
94
88
  - !ruby/object:Gem::Version
95
- version: '0'
89
+ version: 2.0.0
96
90
  type: :development
97
91
  prerelease: false
98
92
  version_requirements: !ruby/object:Gem::Requirement
99
93
  requirements:
100
94
  - - ">="
101
95
  - !ruby/object:Gem::Version
102
- version: '0'
96
+ version: 2.0.0
103
97
  - !ruby/object:Gem::Dependency
104
98
  name: virtus
105
99
  requirement: !ruby/object:Gem::Requirement
@@ -129,7 +123,7 @@ dependencies:
129
123
  - !ruby/object:Gem::Version
130
124
  version: '0'
131
125
  - !ruby/object:Gem::Dependency
132
- name: json
126
+ name: multi_json
133
127
  requirement: !ruby/object:Gem::Requirement
134
128
  requirements:
135
129
  - - ">="
@@ -153,18 +147,15 @@ files:
153
147
  - ".gitignore"
154
148
  - ".travis.yml"
155
149
  - CHANGES.markdown
150
+ - CONTRIBUTING.md
156
151
  - Gemfile
152
+ - ISSUE_TEMPLATE.md
157
153
  - LICENSE
158
154
  - README.markdown
159
155
  - Rakefile
160
156
  - TODO.markdown
161
157
  - examples/example.rb
162
158
  - examples/example_server.rb
163
- - gemfiles/Gemfile.representable-1.7
164
- - gemfiles/Gemfile.representable-1.8
165
- - gemfiles/Gemfile.representable-2.0
166
- - gemfiles/Gemfile.representable-2.1
167
- - gemfiles/Gemfile.representable-head
168
159
  - lib/roar.rb
169
160
  - lib/roar/client.rb
170
161
  - lib/roar/coercion.rb
@@ -173,10 +164,8 @@ files:
173
164
  - lib/roar/hypermedia.rb
174
165
  - lib/roar/json.rb
175
166
  - lib/roar/json/collection.rb
176
- - lib/roar/json/collection_json.rb
177
167
  - lib/roar/json/hal.rb
178
168
  - lib/roar/json/hash.rb
179
- - lib/roar/json/json_api.rb
180
169
  - lib/roar/representer.rb
181
170
  - lib/roar/transport/faraday.rb
182
171
  - lib/roar/transport/net_http.rb
@@ -186,31 +175,28 @@ files:
186
175
  - roar.gemspec
187
176
  - test/client_test.rb
188
177
  - test/coercion_feature_test.rb
189
- - test/collection_json_test.rb
190
- - test/decorator_client_test.rb
191
178
  - test/decorator_test.rb
192
- - test/faraday_http_transport_test.rb
193
179
  - test/fixtures/sample.pem
194
180
  - test/hal_json_test.rb
195
- - test/hal_links_test.rb
196
- - test/http_verbs_test.rb
197
181
  - test/hypermedia_feature_test.rb
198
182
  - test/hypermedia_test.rb
199
183
  - test/integration/Gemfile
200
184
  - test/integration/band_representer.rb
185
+ - test/integration/decorator_client_test.rb
186
+ - test/integration/faraday_http_transport_test.rb
187
+ - test/integration/http_verbs_test.rb
188
+ - test/integration/json_collection_test.rb
189
+ - test/integration/net_http_transport_test.rb
201
190
  - test/integration/runner.rb
202
191
  - test/integration/server.rb
203
192
  - test/integration/ssl_server.rb
204
- - test/json_api_test.rb
205
193
  - test/json_representer_test.rb
206
- - test/lib/runner.rb
207
194
  - test/lonely_test.rb
208
- - test/net_http_transport_test.rb
209
195
  - test/representer_test.rb
210
196
  - test/ssl_client_certs_test.rb
211
197
  - test/test_helper.rb
212
198
  - test/xml_representer_test.rb
213
- homepage: http://rubygems.org/gems/roar
199
+ homepage: http://trailblazer.to/gems/roar
214
200
  licenses:
215
201
  - MIT
216
202
  metadata: {}
@@ -230,7 +216,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
230
216
  version: '0'
231
217
  requirements: []
232
218
  rubyforge_project:
233
- rubygems_version: 2.4.8
219
+ rubygems_version: 2.5.1
234
220
  signing_key:
235
221
  specification_version: 4
236
222
  summary: Parse and render REST API documents using representers.
@@ -1,6 +0,0 @@
1
- source "http://rubygems.org"
2
-
3
- gemspec path: '../'
4
-
5
- gem 'representable', '~> 1.7.0'
6
- gem 'sinatra-contrib', github: 'apotonick/sinatra-contrib', branch: 'runner'
@@ -1,6 +0,0 @@
1
- source "http://rubygems.org"
2
-
3
- gemspec path: '../'
4
-
5
- gem 'representable', '~> 1.8.0'
6
- gem 'sinatra-contrib', github: 'apotonick/sinatra-contrib', branch: 'runner'
@@ -1,5 +0,0 @@
1
- source "http://rubygems.org"
2
-
3
- gemspec path: '../'
4
-
5
- gem 'representable', '~> 2.0.0'
@@ -1,5 +0,0 @@
1
- source "http://rubygems.org"
2
-
3
- gemspec path: '../'
4
-
5
- gem 'representable', '~> 2.1.5'
@@ -1,6 +0,0 @@
1
- source "http://rubygems.org"
2
-
3
- gemspec path: '../'
4
-
5
- gem 'representable', github: 'apotonick/representable'
6
- gem 'sinatra-contrib', github: 'apotonick/sinatra-contrib', branch: 'runner'
@@ -1,208 +0,0 @@
1
- module Roar::JSON
2
- # Implementation of the Collection+JSON media format, http://amundsen.com/media-types/collection/format/
3
- #
4
- # When clients want to add or update an item the collection's filled out template is POSTed or PUT. You can parse that using the
5
- # +SongCollectionRepresenter::template_representer+ module.
6
- #
7
- # Song.new.extend(SongCollectionRepresenter.template_representer).from_json("{template: ...")
8
- module CollectionJSON
9
- def self.included(base)
10
- base.class_eval do
11
- include Roar::Representer
12
- include Roar::JSON
13
- include Roar::Hypermedia
14
-
15
- extend ClassMethods
16
-
17
- self.representation_wrap= :collection # FIXME: move outside of this block for inheritance!
18
-
19
- property :__template, :as => :template, :extend => lambda {|*| representable_attrs.collection_representers[:template] }, :class => Array
20
- def __template
21
- OpenStruct.new # TODO: handle preset values.
22
- end
23
-
24
- collection :queries, :extend => Roar::JSON::HyperlinkRepresenter, :class => lambda { |fragment,*| ::Hash }
25
- def queries
26
- compile_links_for(representable_attrs.collection_representers[:queries].link_configs)
27
- end
28
- def queries=(v)
29
- end
30
-
31
-
32
- def items
33
- self
34
- end
35
- def items=(v)
36
- replace(v)
37
- end
38
-
39
- property :__version, :as => :version
40
- def __version
41
- representable_attrs.collection_representers[:version]
42
- end
43
-
44
- property :__href, :as => :href
45
- def __href
46
- compile_links_for(representable_attrs.collection_representers[:href].link_configs).first.href
47
- end
48
-
49
-
50
-
51
- include ClientMethods
52
- end
53
- end
54
-
55
- module ClassMethods
56
- module PropertyWithRenderNil
57
- def property(name, options={})
58
- super(name, options.merge!(:render_nil => true))
59
- end
60
- end
61
-
62
- # TODO: provide automatic copying from the ItemRepresenter here.
63
- def template(&block)
64
- mod = representable_attrs.collection_representers[:object_template] = Module.new do
65
- include Roar::JSON
66
- include Roar::JSON::CollectionJSON::DataMethods
67
-
68
- extend PropertyWithRenderNil
69
-
70
- module_exec(&block)
71
-
72
- #self.representation_wrap = :template
73
- def from_hash(hash, *args) # overridden in :template representer.
74
- super(hash["template"])
75
- end
76
- end
77
-
78
- representable_attrs.collection_representers[:template] = Module.new do
79
- include Roar::JSON
80
- include mod
81
-
82
- #self.representation_wrap = false
83
-
84
- # DISCUSS: currently we skip real deserialization here and just store the :data hash.
85
- def from_hash(hash, *args)
86
- replace(hash["data"])
87
- end
88
- end
89
- end
90
- def template_representer
91
- representable_attrs.collection_representers[:object_template]
92
- end
93
-
94
- def queries(&block)
95
- mod = representable_attrs.collection_representers[:queries] = Module.new do
96
- include Roar::JSON
97
- include Roar::Hypermedia
98
-
99
- module_exec(&block)
100
-
101
- def to_hash(*)
102
- hash = super
103
- hash["links"] # TODO: make it easier to render collection of links.
104
- end
105
- end
106
- end
107
-
108
- def items(options={}, &block)
109
- collection :items, { :extend => lambda {|*| representable_attrs.collection_representers[:items] } }.merge!(options)
110
-
111
- mod = representable_attrs.collection_representers[:items] = Module.new do
112
- include Roar::JSON
113
- include Roar::Hypermedia
114
- include Roar::JSON::CollectionJSON::DataMethods
115
- extend SharedClassMethodsBullshit
116
-
117
- module_exec(&block)
118
-
119
- # TODO: share with main module!
120
- property :__href, :as => :href
121
- def __href
122
- compile_links_for(representable_attrs.collection_representers[:href].link_configs).first.href
123
- end
124
- def __href=(v)
125
- @__href = Roar::Hypermedia::Hyperlink.new(:href => v)
126
- end
127
- def href
128
- @__href
129
- end
130
- end
131
- end
132
-
133
- def version(v)
134
- representable_attrs.collection_representers[:version] = v
135
- end
136
-
137
- module SharedClassMethodsBullshit
138
- def href(&block)
139
- mod = representable_attrs.collection_representers[:href] = Module.new do
140
- include Roar::JSON
141
- include Roar::Hypermedia
142
-
143
-
144
- link(:href, &block)
145
- end
146
- end
147
-
148
- def representable_attrs
149
- super.tap do |attrs|
150
- attrs.instance_eval do # FIXME: of course, this is WIP.
151
- def collection_representers
152
- @collection_representers ||= {}
153
- end
154
- end
155
- end
156
- end
157
- end
158
- include SharedClassMethodsBullshit
159
- end
160
-
161
- module DataMethods
162
- def to_hash(*)
163
- hash = super.tap do |hsh|
164
- data = []
165
- hsh.keys.each do |n|
166
- next if ["href", "links"].include?(n)
167
-
168
- v = hsh.delete(n.to_s)
169
- data << {:name => n, :value => v} # TODO: get :prompt from Definition.
170
- end
171
- hsh[:data] = data
172
- end
173
- end
174
-
175
- def from_hash(hash, *args)
176
- data = {}
177
- hash.delete("data").collect do |item|
178
- data[item["name"]] = item["value"]
179
- end
180
- super(hash.merge!(data))
181
- end
182
- end
183
-
184
- module ClientMethods
185
- def __version=(v)
186
- @__version = v
187
- end
188
- def version
189
- @__version
190
- end
191
-
192
- def __href=(v)
193
- @__href = Roar::Hypermedia::Hyperlink.new(:href => v)
194
- end
195
- def href
196
- @__href
197
- end
198
-
199
- def __template=(v)
200
- @__template = v
201
- end
202
- # DISCUSS: this might return a Template instance, soon.
203
- def template
204
- @__template
205
- end
206
- end
207
- end
208
- end