roar 1.0.4 → 1.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.
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