conglomerate 0.8.1 → 0.9.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 35e29cbdebf5437c615db1edc75d9b24accf5494
4
- data.tar.gz: d9061aea37cc1b044ff55a23767d418311b8ba1d
3
+ metadata.gz: c59715a987bfcf05b5005344ef0c1a72330193a9
4
+ data.tar.gz: 5fdd51b3702d7a807473064c048351ff411c73af
5
5
  SHA512:
6
- metadata.gz: 0a90ff5aec3808eb7fa85e6177c9b0342d6ccd6b492cd23650b38026dc0d3a3c03996127781d54bdfc5b9c321d34dcd616c339689bfecfc78b9e7a5b45fed3d9
7
- data.tar.gz: 904ba11b106db17f93037080ec86627f6e0376a92f57c0c78e6cc4992236a40c57f1f7ba133be0c7efddf59c7ad92062d39f61b4f2344cd5c4ea10d4263084ab
6
+ metadata.gz: b9255df416476d667a41e07d141aa613ae57704c59b798f501df9c61bb3d779e566ce0383d2a4eaae4c880ae99d84cf5a4284788e9a4db8b2ab4c7cac306eeb7
7
+ data.tar.gz: e40f478b4a9d83bc8bd697cba3c666608cd30e494a2855a5809a6440dda256fcf2c447e82a3258a172845afa0dad7100351ee3ec2db2a666d5a0117a24469248
data/README.md CHANGED
@@ -48,6 +48,8 @@ class TeamSerializer
48
48
  link :root { root_url }
49
49
 
50
50
  query :search, :data => :id { search_teams_url }
51
+
52
+ command :populate, :data => :id { populate_teams_url }
51
53
  end
52
54
 
53
55
  # Step 2: Serialize any object
@@ -105,6 +107,15 @@ end
105
107
  ]
106
108
  }
107
109
  ],
110
+ "commands": [
111
+ {
112
+ "rel": "populate",
113
+ "href": "http://example.com/teams/populate",
114
+ "data": [
115
+ {"name": "id", "value": ""}
116
+ ]
117
+ }
118
+ ],
108
119
  "template": {
109
120
  "data": [
110
121
  {"name": "name", "value": ""}
data/lib/conglomerate.rb CHANGED
@@ -8,6 +8,7 @@ require_relative "conglomerate/datum"
8
8
  require_relative "conglomerate/template"
9
9
  require_relative "conglomerate/item"
10
10
  require_relative "conglomerate/query"
11
+ require_relative "conglomerate/command"
11
12
  require_relative "conglomerate/collection"
12
13
  require_relative "conglomerate/tree_deserializer"
13
14
 
@@ -11,5 +11,6 @@ module Conglomerate
11
11
  array :items, :contains => Item
12
12
  array :links, :contains => Link
13
13
  array :queries, :contains => Query
14
+ array :commands, :contains => Command
14
15
  end
15
16
  end
@@ -0,0 +1,12 @@
1
+ module Conglomerate
2
+ class Command
3
+ include Conglomerate::Particle
4
+
5
+ attribute :href, :type => String, :required => true
6
+ attribute :rel, :type => String, :required => true
7
+ attribute :name, :type => String
8
+ attribute :prompt, :type => String
9
+
10
+ array :data, :contains => Datum
11
+ end
12
+ end
@@ -22,7 +22,7 @@ module Conglomerate
22
22
  attr_accessor :objects, :context
23
23
 
24
24
  def actions
25
- [:version, :href, :queries, :items, :template, :links]
25
+ [:version, :href, :queries, :commands, :items, :template, :links]
26
26
  end
27
27
 
28
28
  def apply_version(collection)
@@ -78,6 +78,20 @@ module Conglomerate
78
78
  end
79
79
  end
80
80
 
81
+ def apply_commands(collection)
82
+ commands = self.class._commands.map do |command|
83
+ build_command(
84
+ command[:rel], command[:data], command[:prompt], command[:block]
85
+ )
86
+ end
87
+
88
+ if commands.empty?
89
+ collection
90
+ else
91
+ collection.merge({"commands" => commands})
92
+ end
93
+ end
94
+
81
95
  def apply_items(collection)
82
96
  items = objects.map do |object|
83
97
  item = {}
@@ -166,6 +180,13 @@ module Conglomerate
166
180
  apply_data(query, :data => data, :default_value => "")
167
181
  end
168
182
 
183
+ def build_command(rel, data, prompt, block)
184
+ command = {"rel" => rel.to_s}
185
+ command = apply_href(command, :proc => block)
186
+ command["prompt"] = prompt if prompt
187
+ apply_data(command, :data => data, :default_value => "")
188
+ end
189
+
169
190
  def build_item_link(rel, proc: nil, object: nil)
170
191
  link = {"rel" => rel.to_s}
171
192
  apply_href(link, :proc => proc, :object => object)
@@ -229,6 +250,14 @@ module Conglomerate
229
250
  }
230
251
  end
231
252
 
253
+ def command(rel, data: [], prompt: nil, &block)
254
+ data = [*data]
255
+ data = data.map { |datum| {:name => datum} }
256
+ self._commands = self._commands << {
257
+ :rel => rel, :data => data, :prompt => prompt, :block => block
258
+ }
259
+ end
260
+
232
261
  def attribute(
233
262
  name, template: false, rel: nil, type: :value, prompt: nil, &block
234
263
  )
@@ -257,7 +286,7 @@ module Conglomerate
257
286
  end
258
287
 
259
288
  attr_writer :_href, :_item_href, :_queries, :_attributes, :_links,
260
- :_item_links, :_templates
289
+ :_item_links, :_templates, :_commands
261
290
 
262
291
  def _href
263
292
  @_href || nil
@@ -271,6 +300,10 @@ module Conglomerate
271
300
  @_queries || []
272
301
  end
273
302
 
303
+ def _commands
304
+ @_commands || []
305
+ end
306
+
274
307
  def _attributes
275
308
  @_attributes || []
276
309
  end
@@ -1,6 +1,8 @@
1
1
  module Conglomerate
2
2
  class TreeDeserializer
3
- PARTICLES = [Collection, Item, Error, Template, Datum, Query, Item]
3
+ PARTICLES = [
4
+ Collection, Item, Error, Template, Datum, Query, Command, Item
5
+ ]
4
6
 
5
7
  def initialize(object)
6
8
  self.object = object
@@ -26,7 +28,7 @@ module Conglomerate
26
28
  end
27
29
  end
28
30
 
29
- particle = klass.new(attributes)
31
+ klass.new(attributes)
30
32
  end
31
33
 
32
34
  def deserialize_attribute(attribute, attr_metadata)
@@ -1,3 +1,3 @@
1
1
  module Conglomerate
2
- VERSION = "0.8.1"
2
+ VERSION = "0.9.0"
3
3
  end
@@ -37,4 +37,16 @@ describe Conglomerate::Collection do
37
37
  expect(Conglomerate.serialize(collection)["queries"]).to include(Conglomerate.serialize(query))
38
38
  end
39
39
  end
40
+
41
+ context "commands" do
42
+ it "serializes commands correctly" do
43
+ command = Conglomerate::Command.new(
44
+ :href => "http://this.is.a.command",
45
+ :rel => "Something"
46
+ )
47
+
48
+ collection.commands << command
49
+ expect(Conglomerate.serialize(collection)["commands"]).to include(Conglomerate.serialize(command))
50
+ end
51
+ end
40
52
  end
@@ -0,0 +1,30 @@
1
+ require_relative "spec_helper"
2
+ require_relative "../lib/conglomerate"
3
+
4
+ describe Conglomerate::Command do
5
+ let(:command) {
6
+ Conglomerate::Command.new(
7
+ :href => "http://this.is.a.command/",
8
+ :rel => "some_command"
9
+ )
10
+ }
11
+
12
+ context "required attributes" do
13
+ specify "href" do
14
+ expect { Conglomerate::Command.new(:rel => "") }.to raise_error("MissingAttribute")
15
+ end
16
+
17
+ specify "rel" do
18
+ expect { Conglomerate::Command.new(:href => "") }.to raise_error("MissingAttribute")
19
+ end
20
+ end
21
+
22
+ context "data" do
23
+ it "serializes properly" do
24
+ datum = Conglomerate::Datum.new(:name => "name")
25
+
26
+ command.data << datum
27
+ expect(Conglomerate.serialize(command)["data"]).to include(Conglomerate.serialize(datum))
28
+ end
29
+ end
30
+ end
@@ -34,6 +34,10 @@ class ConglomerateTestSerializer
34
34
  search_items_url
35
35
  end
36
36
 
37
+ command :populate, :data => :id, :prompt => "test 123" do
38
+ populate_items_url
39
+ end
40
+
37
41
  template :repeats, :prompt => "true|false"
38
42
  end
39
43
 
@@ -70,6 +74,7 @@ describe Conglomerate do
70
74
  "Context",
71
75
  :request => request,
72
76
  :search_items_url => "https://example.com/items/search",
77
+ :populate_items_url => "https://example.com/items/populate",
73
78
  ).tap do |context|
74
79
  allow(context).to receive(:item_url).with(1) {
75
80
  "https://example.com/items/1"
@@ -145,6 +150,27 @@ describe Conglomerate do
145
150
  end
146
151
  end
147
152
 
153
+ describe "#command" do
154
+ it "doesn't include any command templates if none are provided" do
155
+ expect(null_collection.keys).to_not include("commands")
156
+ end
157
+
158
+ it "adds a command template to the collection" do
159
+ expect(test_collection["commands"]).to match_array(
160
+ [
161
+ {
162
+ "href" => "https://example.com/items/populate",
163
+ "rel" => "populate",
164
+ "prompt" => "test 123",
165
+ "data" => [
166
+ {"name" => "id", "value" => ""}
167
+ ]
168
+ }
169
+ ]
170
+ )
171
+ end
172
+ end
173
+
148
174
  describe "#attribute(s)" do
149
175
  context "items" do
150
176
  it "skips items if there are no attributes" do
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: conglomerate
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.8.1
4
+ version: 0.9.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Shane Emmons
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2014-05-19 00:00:00.000000000 Z
12
+ date: 2014-05-20 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: bundler
@@ -69,6 +69,7 @@ files:
69
69
  - lib/conglomerate.rb
70
70
  - lib/conglomerate/array.rb
71
71
  - lib/conglomerate/collection.rb
72
+ - lib/conglomerate/command.rb
72
73
  - lib/conglomerate/datum.rb
73
74
  - lib/conglomerate/error.rb
74
75
  - lib/conglomerate/item.rb
@@ -82,6 +83,7 @@ files:
82
83
  - lib/conglomerate/tree_serializer.rb
83
84
  - lib/conglomerate/version.rb
84
85
  - spec/collection_spec.rb
86
+ - spec/command_spec.rb
85
87
  - spec/conglomerate_spec.rb
86
88
  - spec/datum_spec.rb
87
89
  - spec/link_spec.rb
@@ -115,6 +117,7 @@ specification_version: 4
115
117
  summary: A library to serialize Ruby objects into collection+json
116
118
  test_files:
117
119
  - spec/collection_spec.rb
120
+ - spec/command_spec.rb
118
121
  - spec/conglomerate_spec.rb
119
122
  - spec/datum_spec.rb
120
123
  - spec/link_spec.rb