flatpack_core 1.1 → 1.3

Sign up to get free protection for your applications and to get access to all the features.
@@ -16,6 +16,6 @@ Gem::Specification.new do |gem|
16
16
  gem.version = Flatpack::Core::VERSION
17
17
  gem.add_dependency('json', '~> 1.7')
18
18
  gem.add_dependency('uuidtools', '~> 2.1')
19
- gem.add_dependency('activesupport', "~> 2.3")
19
+ gem.add_dependency('activesupport', "= 2.3.8")
20
20
  gem.add_development_dependency "rspec", "~> 2.6"
21
21
  end
@@ -41,6 +41,11 @@ module Flatpack
41
41
  name = self.class.name.gsub(/^.*::/,'')
42
42
  name[0,1].downcase + name[1..-1]
43
43
  end
44
+
45
+ # Equality should be based solely on uuid
46
+ def <=>(other)
47
+ @uuid <=> other.uuid
48
+ end
44
49
 
45
50
  def class_for_property(property)
46
51
  klass=self.class
@@ -4,92 +4,106 @@ require 'json'
4
4
  module Flatpack
5
5
  module Core
6
6
  class Packer
7
-
7
+
8
8
  include MapInitialize
9
-
9
+
10
10
  attr_accessor :verbose, :pretty
11
-
11
+
12
12
  # Generate a FlatPack JSON string from the given entity
13
13
  def pack(entity)
14
14
  return {} unless entity
15
-
15
+
16
16
  @uuid_stack = []
17
17
  @all_entities = {}
18
18
  @data = {}
19
-
19
+
20
20
  recursive_pack(entity)
21
-
21
+
22
22
  json = {
23
- :data => @data,
24
- :value => entity.uuid
23
+ :data => @data,
24
+ :value => entity.uuid
25
25
  }
26
26
  json = @pretty ? JSON.pretty_generate(json) : json.to_json
27
-
27
+
28
28
  if(@verbose)
29
29
  puts "*** Serializing #{entity.entity_name} to FlatPack ***"
30
30
  puts json
31
31
  end
32
-
32
+
33
33
  json
34
34
  end
35
-
35
+
36
36
  private
37
-
37
+
38
38
  def recursive_pack(entity)
39
- # we only proceed if the entity has a uuid property,
39
+ # we only proceed if the entity has a uuid property,
40
40
  # and we haven't seen it before
41
41
  uuid = entity.uuid
42
+
42
43
  return if !entity.respond_to?(:uuid) or @all_entities.keys.include?(uuid)
43
-
44
+
44
45
  @all_entities[uuid] = entity
45
46
  parent_uuid = @uuid_stack.length > 0 ? @uuid_stack.last : nil
46
47
  @uuid_stack.push(uuid)
47
-
48
- # walk through our properties
49
48
  json = entity.properties
49
+
50
+ # if the entity has some embedded properties, we walk throught them
51
+ if(entity.class.const_defined?(:EMBEDDED_PROPERTY_NAMES))
52
+ entity.class::EMBEDDED_PROPERTY_NAMES.each do |embedded_property_name|
53
+ embedded = entity.send(embedded_property_name)
54
+
55
+ # Each property of the embedded value should be added to our top level JSON
56
+ if(embedded.class.const_defined?(:PROPERTY_NAMES))
57
+ embedded.class::PROPERTY_NAMES.each do |name|
58
+ json[name] = embedded.send(name)
59
+ end
60
+ end
61
+ end
62
+ end
63
+
64
+ # walk through our properties
50
65
  json.keys.each do |name|
51
66
  camel_name = name.to_s.camelize
52
67
  camel_name = camel_name[0,1].downcase + camel_name[1..-1]
53
-
54
68
  value = json[name]
55
69
  uuid_name = "#{camel_name}Uuid"
56
-
57
- # The name we're working with will be replaced with a
70
+
71
+ # The name we're working with will be replaced with a
58
72
  # properly cased name or uuid reference
59
73
  json.delete(name)
60
-
74
+
61
75
  # property is another entity
62
76
  if(value.respond_to?(:uuid))
63
77
  recursive_pack(value)
64
78
  json[uuid_name] = value.uuid
65
-
66
- # property is a collection of (potentially) other entities
79
+
80
+ # property is a collection of (potentially) other entities
67
81
  elsif(value.is_a?(Array))
68
-
82
+
69
83
  # we'll recurse down to each referenced value
70
84
  value.each do |referenced_value|
71
85
  recursive_pack(referenced_value)
72
86
  referenced_value.uuid
73
87
  end
74
-
88
+
75
89
  # and add our uuid reference
76
90
  json[uuid_name] = value.map {|v| v.uuid}
77
-
78
- # property is a plain old property
91
+
92
+ # property is a plain old property
79
93
  else
80
- # TODO how to handle local..At dates?
94
+ # TODO how to handle local..At dates?
81
95
  # Pass a timezone into the pack function as an option?
82
96
 
83
97
  json[camel_name] = value
84
98
  end
85
99
  end
86
-
100
+
87
101
  # add our parent uuid reference if neccessary
88
102
  if parent_uuid
89
103
  parent = @all_entities[parent_uuid]
90
104
  json["#{parent.entity_name}Uuid"] = parent_uuid
91
105
  end
92
-
106
+
93
107
  # add the resulting json to the correct bucket in our data hash
94
108
  bucket = @data[entity.entity_name]
95
109
  if(!bucket)
@@ -97,10 +111,10 @@ module Flatpack
97
111
  @data[entity.entity_name] = bucket
98
112
  end
99
113
  bucket.push(json)
100
-
114
+
101
115
  @uuid_stack.pop
102
116
  end
103
-
117
+
104
118
  end
105
119
  end
106
120
  end
@@ -3,20 +3,20 @@ require 'active_support/inflector'
3
3
  module Flatpack
4
4
  module Core
5
5
  class Unpacker
6
-
6
+
7
7
  include MapInitialize
8
-
8
+
9
9
  attr_accessor :verbose, :entity_module
10
10
 
11
11
  # Returns a Reified FlatPack entity from the given JSON data
12
12
  def unpack(json_map)
13
13
  @all_entities = {}
14
-
14
+
15
15
  if(@verbose)
16
16
  puts "** Deserializing entity from FlatPack **"
17
17
  puts JSON.pretty_generate(json_map)
18
18
  end
19
-
19
+
20
20
  # Make a first pass through the data to ensure stub entities exist
21
21
  uuid_to_data = {}
22
22
  (json_map['data'] || []).each do |entity_name, entities|
@@ -29,59 +29,74 @@ module Flatpack
29
29
  end
30
30
  end
31
31
  end
32
-
32
+
33
33
  # Then ingest
34
34
  uuid_to_data.each { |uuid, data| ingest_item(uuid, data) }
35
-
35
+
36
36
  # Return the unpacked entities corresponding to those in the value section
37
37
  value = json_map['value']
38
38
  value.is_a?(Array) ? value.map{|v| @all_entities[v]} : @all_entities[value]
39
39
  end
40
-
40
+
41
41
  private
42
-
42
+
43
43
  # ingests the given data into the entity associated with the given uuid
44
44
  def ingest_item(uuid, data)
45
45
  entity = @all_entities[uuid]
46
46
  collection_key = entity.entity_name.underscore.pluralize
47
47
  reified_properties = {}
48
-
48
+ embedded_entities = [];
49
+
50
+ # if this entity has some embedded properties, we'll associate each with
51
+ # a new instance of the defined type
52
+ if(entity.class.const_defined?(:EMBEDDED_PROPERTY_NAMES))
53
+ entity.class::EMBEDDED_PROPERTY_NAMES.each do |embedded_property_name|
54
+ klass = entity.class_for_property(embedded_property_name)
55
+ setter = "#{embedded_property_name}="
56
+ if(entity.respond_to?(setter))
57
+ embedded_entity = klass.new
58
+ entity.send(setter, embedded_entity)
59
+ embedded_entities.push(embedded_entity)
60
+ end
61
+ end
62
+ end
63
+
49
64
  data.each do |key, value|
50
-
65
+
51
66
  # fooBarsUuid -> foo_bars
52
67
  key = key.underscore
53
-
68
+
54
69
  # If the key name ends in _date or _at, we assume this is a date property
55
70
  if(key.end_with?('_date') or key.end_with?('_at'))
56
71
  reified_properties[key] = Time.parse(value).utc
57
72
  end
58
-
73
+
59
74
  # The value is referencing another entity or collection of entities
60
75
  if(key.end_with?('uuid'))
61
-
76
+
62
77
  # foo_bar_uuid -> foo_bar
63
78
  key = key[0..-6]
64
-
79
+
65
80
  if(value.is_a?(Array))
66
81
  reified_properties[key] = value.map { |uuid| @all_entities[uuid] }
67
-
82
+
68
83
  else
69
84
  referent = @all_entities[value]
70
-
85
+
71
86
  # If the referent doesn't exist, it's because the server has sent us a sparse
72
- # payload with a dangling fooUuid reference. We'll attempt to unpack this
87
+ # payload with a dangling fooUuid reference. We'll attempt to unpack this
73
88
  # reference using the type informtion encoded within each entity description
74
89
  unless referent
75
90
  referent_class = entity.class_for_property(key)
76
91
  referent = referent_class.new(:uuid => value) if referent_class
77
92
  end
78
-
93
+
79
94
  # If a referent was not included in the payload, and no type information exists
80
95
  # for this property name, we simply drop the property
81
96
  next unless referent
82
-
97
+
83
98
  reified_properties[key] = referent
84
-
99
+
85
100
  # Find or create a collection in the referent to establish a bidirectional mapping.
86
101
  # For example a foo.bar property should contain a bar.foos collection.
87
102
  if(referent.respond_to?(collection_key))
@@ -93,32 +108,46 @@ module Flatpack
93
108
  referent.send(collection_setter, collection)
94
109
  end
95
110
  end
96
- collection.push(entity)
111
+ collection.push(entity) unless collection.include?(entity)
97
112
  end
98
113
  end
99
-
100
- # The value is just a plain old property
114
+
115
+ # The value is just a plain old property
101
116
  else
102
- reified_properties[key] = value
117
+
118
+ # if the entity accepts a property with this key directly, we add it
119
+ if(entity.respond_to?(key))
120
+ reified_properties[key] = value
121
+
122
+ # otherwise, we attempt to set the property on to one of our
123
+ # embedded entity properties
124
+ else
125
+ embedded_entities.each do |embedded_entity|
126
+ setter = "#{key}=".to_sym
127
+ if embedded_entity.respond_to?(setter)
128
+ embedded_entity.send(setter, value)
129
+ end
130
+ end
131
+ end
103
132
  end
104
133
  end
105
-
134
+
106
135
  entity.set_properties(reified_properties)
107
136
  end
108
-
137
+
109
138
  # Finds the existing entity associated with the given uuid in the local
110
139
  # entity store, or stores and returns a new one
111
140
  def allocate_or_get_entity(entity_name, uuid)
112
141
  entity = @all_entities[uuid]
113
142
  return entity if entity
114
-
143
+
115
144
  klass = entity_class_for_name(entity_name)
116
145
  if(klass != nil)
117
146
  @all_entities[uuid] = klass.new({:uuid => uuid})
118
147
  end
119
148
  klass
120
149
  end
121
-
150
+
122
151
  # Finds the Ruby class associated with the given entity name
123
152
  def entity_class_for_name(name)
124
153
  class_name = "#{name[0,1].capitalize}#{name[1..-1]}"
@@ -134,7 +163,7 @@ module Flatpack
134
163
  puts "could not create class for name #{class_name}"
135
164
  end
136
165
 
137
- result
166
+ result
138
167
  end
139
168
  end
140
169
  end
@@ -1,5 +1,5 @@
1
1
  module Flatpack
2
2
  module Core
3
- VERSION = "1.1"
3
+ VERSION = "1.3"
4
4
  end
5
5
  end
data/spec/core_spec.rb CHANGED
@@ -1,130 +1,153 @@
1
1
  require 'flatpack_core'
2
2
 
3
+ class Merchant < Flatpack::Core::BaseHasUuid
4
+ attr_accessor :uuid, :merchant_locations;
5
+ end
6
+
7
+ class StreetAddress < Flatpack::Core::BaseHasUuid
8
+ PROPERTY_NAMES = [:address, :city, :state, :zip]
9
+ attr_accessor *PROPERTY_NAMES
10
+ end
11
+
12
+ class MerchantLocation < Flatpack::Core::BaseHasUuid
13
+ PROPERTY_NAMES = [:uuid, :merchant]
14
+ attr_accessor *PROPERTY_NAMES
15
+
16
+ EMBEDDED_PROPERTY_NAMES = [
17
+ :street_address
18
+ ]
19
+ attr_accessor *EMBEDDED_PROPERTY_NAMES
20
+
21
+ TYPE_MAP = {
22
+ :street_address => StreetAddress,
23
+ }
24
+ end
25
+
3
26
  class TestEntity < Flatpack::Core::BaseHasUuid
4
27
  PROPERTY_NAMES = [
5
- :one,
6
- :two,
7
- :test_sub_entities,
8
- :test_entities,
9
- :test_entity
28
+ :one,
29
+ :two,
30
+ :test_sub_entities,
31
+ :test_entities,
32
+ :test_entity
10
33
  ]
11
34
  attr_accessor *PROPERTY_NAMES
12
35
  end
13
36
 
14
37
  class TestSubEntity < TestEntity
15
38
  PROPERTY_NAMES = [
16
- :three
39
+ :three
17
40
  ]
18
41
  attr_accessor *PROPERTY_NAMES
19
42
  end
20
43
 
21
44
  describe Flatpack::Core do
22
-
45
+
23
46
  before(:all) do
24
47
  @flatpack = Flatpack::Core::Flatpack.new({
25
- :pretty => true,
26
- :verbose => true
27
- })
48
+ :pretty => true,
49
+ :verbose => true
50
+ })
28
51
  end
29
-
52
+
30
53
  it "serializes a simple entity" do
31
-
54
+
32
55
  root = TestEntity.new({
33
- :one => 'first',
34
- :two => 'second'
35
- })
36
-
56
+ :one => 'first',
57
+ :two => 'second'
58
+ })
59
+
37
60
  json = @flatpack.packer.pack(root)
38
-
61
+
39
62
  map = JSON.parse(json)
40
63
  map['data'].keys.length.should eq(1)
41
64
  entities = map['data']['testEntity']
42
65
  entities.length.should eq(1)
43
66
  entity = entities[0]
44
-
67
+
45
68
  entity.keys.length.should eq(3)
46
69
  entity['one'].should eq('first')
47
70
  entity['two'].should eq('second')
48
71
  entity['uuid'].should be_true
49
72
  end
50
-
73
+
51
74
  it "serializes an entity with forward references" do
52
-
75
+
53
76
  root = TestEntity.new({
54
- :one => 'first',
55
- :two => [
56
- TestSubEntity.new({:one => 'first', :three => 'third'}),
57
- TestSubEntity.new({:one => 'first', :three => 'third'})
58
- ]
59
- })
60
-
77
+ :one => 'first',
78
+ :two => [
79
+ TestSubEntity.new({:one => 'first', :three => 'third'}),
80
+ TestSubEntity.new({:one => 'first', :three => 'third'})
81
+ ]
82
+ })
83
+
61
84
  json = @flatpack.packer.pack(root)
62
-
85
+
63
86
  map = JSON.parse(json)
64
-
87
+
65
88
  map['data'].keys.length.should eq(2)
66
-
89
+
67
90
  # we should have 1 TestEntity at our root
68
91
  root_entities = map['data']['testEntity']
69
92
  root_entities.length.should eq(1)
70
93
  root_entity = root_entities[0]
71
94
  root_entity['one'].should eq('first')
72
-
95
+
73
96
  # our collection reference at :two should have been flattened away
74
97
  root_entity['two'].should be_nil
75
98
  root_entity_uuid = root_entity['uuid']
76
-
99
+
77
100
  # two TestSubEntities under our root
78
101
  sub_entities = map['data']['testSubEntity']
79
102
  sub_entities.length.should eq(2)
80
103
  sub_entity_one = sub_entities[0]
81
104
  sub_entity_two = sub_entities[1]
82
-
105
+
83
106
  # sub entities should have a reference to the parent
84
107
  sub_entity_one['testEntityUuid'].should eq(root_entity_uuid)
85
108
  sub_entity_two['testEntityUuid'].should eq(root_entity_uuid)
86
-
109
+
87
110
  # and 3 additional properties
88
111
  sub_entity_one.length.should eq(4)
89
112
  sub_entity_one['one'].should eq('first')
90
113
  sub_entity_one['three'].should eq('third')
91
114
  sub_entity_one['two'].should be_nil
92
-
115
+
93
116
  sub_entity_two.length.should eq(4)
94
117
  sub_entity_two['one'].should eq('first')
95
118
  sub_entity_two['three'].should eq('third')
96
119
  sub_entity_two['two'].should be_nil
97
120
  end
98
-
121
+
99
122
  it "serializes an entity with back reference" do
100
-
123
+
101
124
  sibling_one = TestEntity.new({
102
- :one => 'first_sibling'
103
- })
104
-
125
+ :one => 'first_sibling'
126
+ })
127
+
105
128
  sibling_two = TestEntity.new({
106
- :one => 'second_sibling',
107
- :two => sibling_one
108
- })
109
-
129
+ :one => 'second_sibling',
130
+ :two => sibling_one
131
+ })
132
+
110
133
  json = @flatpack.packer.pack(sibling_two)
111
-
134
+
112
135
  map = JSON.parse(json)
113
-
136
+
114
137
  map['data'].keys.length.should eq(1)
115
138
  entities = map['data']['testEntity']
116
139
  entities.each do |e|
117
- if(e['uuid'].eql?(sibling_one.uuid.to_s))
140
+ if(e['uuid'].eql?(sibling_one.uuid.to_s))
118
141
  e['testEntityUuid'].should eq(sibling_two.uuid.to_s)
119
142
  else
120
143
  e['testEntityUuid'].should be_nil
121
144
  end
122
145
  end
123
-
146
+
124
147
  end
125
-
148
+
126
149
  it "de-serializes a simple entity" do
127
-
150
+
128
151
  json = '{'\
129
152
  '"value": "b2197fc8-42df-4d8c-9890-0f37a4f99fc7",'\
130
153
  '"data": {'\
@@ -138,17 +161,17 @@ describe Flatpack::Core do
138
161
  ']'\
139
162
  '}'\
140
163
  '}'
141
-
164
+
142
165
  # the unpacking should succeed even when an unknown
143
166
  # entity type (unknownEntity) is present
144
167
  entity = @flatpack.unpacker.unpack(JSON.parse(json))
145
-
168
+
146
169
  entity.one.should eq('first')
147
170
  entity.two.should eq('second')
148
171
  entity.uuid.should eq('b2197fc8-42df-4d8c-9890-0f37a4f99fc7')
149
-
172
+
150
173
  end
151
-
174
+
152
175
  it "de-serializes an entity with a collection reference" do
153
176
  json = '{'\
154
177
  '"value": "d1c958ba-e6ea-4b12-8335-347289e404ac",'\
@@ -175,21 +198,73 @@ describe Flatpack::Core do
175
198
  ']'\
176
199
  '}'\
177
200
  '}'\
178
-
201
+
179
202
  entity = @flatpack.unpacker.unpack(JSON.parse(json))
180
-
203
+
181
204
  entity.uuid.should eq('d1c958ba-e6ea-4b12-8335-347289e404ac')
182
205
  entity.one.should eq('first')
183
-
206
+
184
207
  # entity should have both sub entities within the test_entities property
185
208
  entity.test_sub_entities.length.should eq(2)
186
209
  entity.test_sub_entities[0].three.should eq('third')
187
210
  entity.test_sub_entities[0].one.should eq('first')
188
211
  entity.test_sub_entities[1].three.should eq('third')
189
212
  entity.test_sub_entities[1].one.should eq('first')
190
-
213
+
191
214
  entity.test_sub_entities[0].test_entity.uuid.should eq('d1c958ba-e6ea-4b12-8335-347289e404ac')
192
-
193
215
  end
194
-
216
+
217
+ it "deserializes a complex object graph" do
218
+ json = File.open("#{File.dirname(__FILE__)}/merchant.json", "r").read
219
+ merchant = @flatpack.unpacker.unpack(JSON.parse(json))
220
+
221
+ # ensure we have the proper number of merchant locations
222
+ merchant.merchant_locations.size.should eq(4)
223
+
224
+ # with the proper uuids...
225
+
226
+ merchant.merchant_locations.detect do |ml|
227
+ ml.uuid == 'e988f216-aca6-490d-ad45-4840e05da352'
228
+ end.should_not be_nil
229
+
230
+ merchant.merchant_locations.detect do |ml|
231
+ ml.uuid == '08ab924a-9742-4e9b-8444-ffc9b43f8566'
232
+ end.should_not be_nil
233
+
234
+ merchant.merchant_locations.detect do |ml|
235
+ ml.uuid == 'f77333aa-a66c-4944-9b95-53efc3657418'
236
+ end.should_not be_nil
237
+
238
+ merchant.merchant_locations.detect do |ml|
239
+ ml.uuid == '5f72a832-02af-4dd9-8b30-7cef87f37833'
240
+ end.should_not be_nil
241
+ end
242
+
243
+ it "tests embeddable properties" do
244
+ json = File.open("#{File.dirname(__FILE__)}/merchant_location.json", "r").read
245
+ location = @flatpack.unpacker.unpack(JSON.parse(json))
246
+
247
+ # no address information should be available directly on the location entity
248
+ location.respond_to?(:address).should be_false
249
+ location.respond_to?(:city).should be_false
250
+ location.respond_to?(:state).should be_false
251
+ location.respond_to?(:zip).should be_false
252
+
253
+ # instead, they should be within an embedded StreetAddress property
254
+ location.street_address.address.should eq("1 Embarcadero Center")
255
+ location.street_address.city.should eq("San Francisco")
256
+ location.street_address.state.should eq("CA")
257
+ location.street_address.zip.should eq("94111")
258
+
259
+ # now we'll pack our location back to JSON, which should fold the
260
+ # embedded address properties onto the location directly, then unpack
261
+ # that JSON again to ensure that the address information has been preserved
262
+ location = @flatpack.unpacker.unpack(JSON.parse(@flatpack.packer.pack(location)))
263
+ location.street_address.address.should eq("1 Embarcadero Center")
264
+ location.street_address.city.should eq("San Francisco")
265
+ location.street_address.state.should eq("CA")
266
+ location.street_address.zip.should eq("94111")
267
+
268
+ end
269
+
195
270
  end
@@ -0,0 +1,94 @@
1
+ {
2
+ "value": "a7ae48c9-c0ad-4f2c-a0ca-484f2f5b351c",
3
+ "status_code": "200",
4
+ "data": {
5
+ "merchant": [
6
+ {
7
+ "merchantLocationsUuid": [
8
+ "e988f216-aca6-490d-ad45-4840e05da352",
9
+ "08ab924a-9742-4e9b-8444-ffc9b43f8566",
10
+ "f77333aa-a66c-4944-9b95-53efc3657418",
11
+ "5f72a832-02af-4dd9-8b30-7cef87f37833"
12
+ ],
13
+ "visitExpirationMinutes": 30,
14
+ "name": "The Melt (new)",
15
+ "updatedAt": "2012-09-17T20:33:02.000Z",
16
+ "pointsSignupBonus": 0,
17
+ "merchantCapabilitiesUuid": [
18
+
19
+ ],
20
+ "merchantState": "LIVE",
21
+ "headline": "Free Cheese is Awesome",
22
+ "createdAt": "2012-09-12T17:17:43.000Z",
23
+ "loyaltyType": "PUNCHCARD",
24
+ "uuid": "a7ae48c9-c0ad-4f2c-a0ca-484f2f5b351c"
25
+ }
26
+ ],
27
+ "merchantLocation": [
28
+ {
29
+ "longitude": -122.3994071,
30
+ "latitude": 37.795027,
31
+ "combinedAddress": "1 Embarcadero Center",
32
+ "merchantUuid": "a7ae48c9-c0ad-4f2c-a0ca-484f2f5b351c",
33
+ "country": "US",
34
+ "state": "CA",
35
+ "address": "1 Embarcadero Center",
36
+ "timezone": "America/Los_Angeles",
37
+ "createdAt": "2012-09-12T17:17:44.000Z",
38
+ "city": "San Francisco",
39
+ "neighborhoodName": "San Francisco",
40
+ "zip": "94111",
41
+ "smsId": "melt1",
42
+ "uuid": "e988f216-aca6-490d-ad45-4840e05da352"
43
+ },
44
+ {
45
+ "longitude": -122.4001066,
46
+ "latitude": 37.7872407,
47
+ "combinedAddress": "115 New Montgomery St",
48
+ "merchantUuid": "a7ae48c9-c0ad-4f2c-a0ca-484f2f5b351c",
49
+ "country": "US",
50
+ "state": "CA",
51
+ "address": "115 New Montgomery St",
52
+ "timezone": "America/Los_Angeles",
53
+ "createdAt": "2012-09-12T17:17:44.000Z",
54
+ "city": "San Francisco",
55
+ "neighborhoodName": "San Francisco",
56
+ "zip": "94105",
57
+ "smsId": "melt2",
58
+ "uuid": "08ab924a-9742-4e9b-8444-ffc9b43f8566"
59
+ },
60
+ {
61
+ "longitude": -122.3901921,
62
+ "latitude": 37.7897624,
63
+ "combinedAddress": "345 Spear St",
64
+ "merchantUuid": "a7ae48c9-c0ad-4f2c-a0ca-484f2f5b351c",
65
+ "country": "US",
66
+ "state": "CA",
67
+ "address": "345 Spear St",
68
+ "timezone": "America/Los_Angeles",
69
+ "createdAt": "2012-09-12T17:17:44.000Z",
70
+ "city": "San Francisco",
71
+ "neighborhoodName": "San Francisco",
72
+ "zip": "94105",
73
+ "smsId": "melt3",
74
+ "uuid": "f77333aa-a66c-4944-9b95-53efc3657418"
75
+ },
76
+ {
77
+ "longitude": -122.170764,
78
+ "latitude": 37.4442964,
79
+ "combinedAddress": "180 El Camino Real",
80
+ "merchantUuid": "a7ae48c9-c0ad-4f2c-a0ca-484f2f5b351c",
81
+ "country": "US",
82
+ "state": "California",
83
+ "address": "180 El Camino Real",
84
+ "timezone": "America/Los_Angeles",
85
+ "createdAt": "2012-09-12T17:17:44.000Z",
86
+ "city": "Palo Alto",
87
+ "neighborhoodName": "Palo Alto",
88
+ "zip": "94304",
89
+ "smsId": "melt4",
90
+ "uuid": "5f72a832-02af-4dd9-8b30-7cef87f37833"
91
+ }
92
+ ]
93
+ }
94
+ }
@@ -0,0 +1,24 @@
1
+ {
2
+ "value": "e988f216-aca6-490d-ad45-4840e05da352",
3
+ "status_code": "200",
4
+ "data": {
5
+ "merchantLocation": [
6
+ {
7
+ "longitude": -122.3994071,
8
+ "latitude": 37.795027,
9
+ "combinedAddress": "1 Embarcadero Center",
10
+ "merchantUuid": "a7ae48c9-c0ad-4f2c-a0ca-484f2f5b351c",
11
+ "country": "US",
12
+ "state": "CA",
13
+ "address": "1 Embarcadero Center",
14
+ "timezone": "America/Los_Angeles",
15
+ "createdAt": "2012-09-12T17:17:44.000Z",
16
+ "city": "San Francisco",
17
+ "neighborhoodName": "San Francisco",
18
+ "zip": "94111",
19
+ "smsId": "melt1",
20
+ "uuid": "e988f216-aca6-490d-ad45-4840e05da352"
21
+ }
22
+ ]
23
+ }
24
+ }
metadata CHANGED
@@ -1,12 +1,12 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: flatpack_core
3
3
  version: !ruby/object:Gem::Version
4
- hash: 13
4
+ hash: 9
5
5
  prerelease: false
6
6
  segments:
7
7
  - 1
8
- - 1
9
- version: "1.1"
8
+ - 3
9
+ version: "1.3"
10
10
  platform: ruby
11
11
  authors:
12
12
  - Joe Stelmach
@@ -14,7 +14,7 @@ autorequire:
14
14
  bindir: bin
15
15
  cert_chain: []
16
16
 
17
- date: 2012-09-28 00:00:00 +05:30
17
+ date: 2012-10-09 00:00:00 +05:30
18
18
  default_executable:
19
19
  dependencies:
20
20
  - !ruby/object:Gem::Dependency
@@ -53,13 +53,14 @@ dependencies:
53
53
  requirement: &id003 !ruby/object:Gem::Requirement
54
54
  none: false
55
55
  requirements:
56
- - - ~>
56
+ - - "="
57
57
  - !ruby/object:Gem::Version
58
- hash: 5
58
+ hash: 19
59
59
  segments:
60
60
  - 2
61
61
  - 3
62
- version: "2.3"
62
+ - 8
63
+ version: 2.3.8
63
64
  type: :runtime
64
65
  version_requirements: *id003
65
66
  - !ruby/object:Gem::Dependency
@@ -100,6 +101,8 @@ files:
100
101
  - lib/flatpack/core/version.rb
101
102
  - lib/flatpack_core.rb
102
103
  - spec/core_spec.rb
104
+ - spec/merchant.json
105
+ - spec/merchant_location.json
103
106
  has_rdoc: true
104
107
  homepage: ""
105
108
  licenses: []
@@ -136,3 +139,5 @@ specification_version: 3
136
139
  summary: Write a gem summary
137
140
  test_files:
138
141
  - spec/core_spec.rb
142
+ - spec/merchant.json
143
+ - spec/merchant_location.json