synced 0.0.11 → 1.0.0.rc1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 90439e42a4207f1d7fb304492d01dbda6ca3c519
4
- data.tar.gz: df7f7f52f5ae49f7c8dd30178a6bb6ec07c4e723
3
+ metadata.gz: cdb428e328ca8da932f79510c83a0605cc220bcc
4
+ data.tar.gz: 70b0d79a78f4ed66802c5600dc18d5f5fa49d2d8
5
5
  SHA512:
6
- metadata.gz: 0648b7cec0c209758e6992d59377beeee9a3fdb80157013025c2ba9af4155e4acad635f0e2e5ea11490ceb8db3723328347370c76502f6222caeed1877923e21
7
- data.tar.gz: 9b9697a81e6056b27d402f8dd130af09f3c08c9f66babd7782843c3e661c53fc9a3abd397a964b50b2a2b2180171209a61a181f0a6d51c1c3323cb880fe5a651
6
+ metadata.gz: c6e6dfdc5295494cbeca0f90f02dfe17031ccc34c730f863d2c36b1a3fcf2cc27bdec9b39bc000832ad230bf93b50f073fe224a8ad24978e5dd97c5354add5e2
7
+ data.tar.gz: d4e6b75d4ddcd2580cba514ddfbf83384949868208e3a3414c9ba5f264a86c8989d0fa43b1fecc1c8a005e0b86b8e25503d2264b73a88f8492afaed1c28ffada
data/README.md CHANGED
@@ -6,34 +6,41 @@
6
6
  Synced is a Rails Engine that helps you keep local models synchronized with
7
7
  their BookingSync representation.
8
8
 
9
- Note: This synchronization is in one way only, from BookingSync to your
10
- application. If you want to do a 2 way synchronization, you will need to
11
- implement it yourself using
12
- [BookingSync-API](https://github.com/BookingSync/bookingsync-api)
9
+ It decreases time needed to fetch data from BookingSync API. If given endpoint
10
+ supports `updated_since` parameter, Synced will first perform a full
11
+ synchronization and then every next synchronization will only synchronize
12
+ added/changed/deleted objects since last synchronization.
13
13
 
14
14
  ## Requirements
15
15
 
16
16
  This engine requires Rails `>= 4.0.0` and Ruby `>= 2.0.0`.
17
17
 
18
- ## Documentation
19
-
20
- [API documentation is available at rdoc.info](http://rdoc.info/github/BookingSync/synced/master/frames).
21
-
22
18
  ## Installation
23
19
 
24
- Synced works with BookingSync API 0.0.17 onwards, Rails 4.0 onwards and Ruby
25
- 2.0 onwards. To get started, add it to your Gemfile with:
20
+ To get started, add it to your Gemfile with:
26
21
 
27
22
  ```ruby
28
23
  gem 'synced'
29
24
  ```
25
+ and run `bundle install`
26
+
27
+ ## Basic usage
28
+
29
+ Assume we want to create an application displaying rentals from multiple
30
+ BookingSync accounts and we want to synchronize rentals to make it snappy
31
+ and traffic efficient.
32
+
33
+ We will surely have `Rental` and `Account` models. Where `Account` will have
34
+ `BookingSync::Engine::Account` mixin and thus respond to `api` method.
30
35
 
31
- Generate a migration to add Synced fields for the model you want to synchronize:
36
+ First generate a migration to add synced fields to the model.
37
+ These fields will be used for storing data from the API.
32
38
 
33
39
  Example:
40
+
34
41
  ```console
35
42
  rails g migration AddSyncedFieldsToRentals synced_id:integer:index \
36
- synced_data:text synced_updated_at:datetime
43
+ synced_data:text synced_all_at:datetime
37
44
  ```
38
45
 
39
46
  and migrate:
@@ -42,82 +49,155 @@ and migrate:
42
49
  rake db:migrate
43
50
  ```
44
51
 
45
- And `synced` statement to the model you want to keep in sync.
46
-
47
- Example:
52
+ Add `synced` statement to the model you want to keep in sync and add `api`
53
+ method which return instance of `BookingSync::API::Client` used for fetching
54
+ data.
48
55
 
49
56
  ```ruby
50
57
  class Rental < ActiveRecord::Base
51
58
  synced
59
+ belongs_to :account
52
60
  end
53
61
  ```
54
62
 
55
- Run synchronization with given remote rentals
56
-
57
63
  Example:
58
64
 
65
+ Synchronize rentals for given account.
66
+
59
67
  ```ruby
60
- Rental.synchronize(remote: remote_rentals)
68
+ Rental.synchronize(scope: account)
61
69
  ```
62
70
 
63
- Run rentals synchronization in website scope
64
-
65
- Example:
71
+ Now rentals details fetched from the API are accessible through `synced_data`
72
+ method.
66
73
 
67
74
  ```ruby
68
- Rental.synchronize(remote: remote_rentals, scope: website)
75
+ rental = account.rentals.first
76
+ rental.synced_data.bedrooms # => 4
77
+ rental.synced_data.rental_type # => "villa"
69
78
  ```
70
79
 
71
- ## Custom fields for storing remote object data.
72
-
73
- By default synced stores remote object in the following db columns.
80
+ ## Synced database fields
74
81
 
75
- `synced_id` - ID of the remote object
76
- `synced_data` - Whole remote object is serialized into this attribute
77
- `synced_all_at` - Synchronization time of the local object when using
78
- updated_since param
82
+ Option name | Default value | Description | Required |
83
+ ---------------------|------------------|-----------------------------------------|----------|
84
+ `:id_key` | `:synced_id` | ID of the object fetched from the API | YES |
85
+ `:data_key` | `:synced_data` | Stores data fetched from the API | NO |
86
+ `:synced_all_at_key` | `:synced_all_at` | Stores time of the last synchronization | NO |
79
87
 
80
- You can configure your own fields in `synced` declaration in your model.
88
+ Custom fields name can be configured in the `synced` statement of your model:
81
89
 
82
- ```
90
+ ```ruby
83
91
  class Rental < ActiveRecord::Base
84
- synced id_key: :remote_id, data_key: :remote_data, synced_all_at_key: :remote_all_synced_at
92
+ synced id_key: :remote_id, data_key: :remote_data,
93
+ synced_all_at_key: :remote_all_synced_at
85
94
  end
86
95
  ```
87
96
 
88
97
  ## Local attributes
89
98
 
90
- All remote data is stored in `synced_data`, however sometimes it's useful to have some attributes directly in your model. You can use `local_attributes` for that.
99
+ Whole remote data is stored in `synced_data` column, however sometimes it's
100
+ useful (for example for sorting) to have some attributes directly in your model.
101
+ You can use `local_attributes` to achieve it:
91
102
 
92
- ```
103
+ ```ruby
93
104
  class Rental < ActiveRecord::Base
94
105
  synced local_attributes: [:name, :size]
95
106
  end
96
107
  ```
97
108
 
98
- This assumes that model has name and size attributes. On every sychronization these two attributes will be assigned with value of `remote_object.name` and `remote_object.size` appropriately.
109
+ This assumes that model has `name` and `size` attributes.
110
+ On every synchronization these two attributes will be assigned with value of
111
+ `remote_object.name` and `remote_object.size` appropriately.
99
112
 
100
- ## Disabling synchronization for selected fields.
113
+ ### Local attributes with custom names
101
114
 
102
- In some cases you only need one attribute to be synchronized and nothing more.
103
- By default even when using local_attributes, whole remote object will be
104
- saved in the `synced_data` and its updated_at in the `synced_all_at`.
105
- This may take additonal space in the database.
106
- In order to disable synchronizing these fields, set their names in the `synced` declaration to nil, as in the below example:
115
+ If you want to store attributes from remote object under different name, you
116
+ need to pass your own mapping hash to `synced` statement.
117
+ Keys are local attributes and values are remote ones. See below example:
107
118
 
119
+ ```ruby
120
+ class Rental < ActiveRecord::Base
121
+ synced local_attributes: { headline: :name, remote_size: :size }
122
+ end
108
123
  ```
124
+
125
+ During synchronization to local attribute `headline` will be assigned value of
126
+ `name` attribute of the remote object and to the local `remote_size` attribute
127
+ will be assigned value of `size` attribute of the remote object.
128
+
129
+ ### Local attributes with mapping blocks
130
+
131
+ If you want to convert an attributes value during synchronization you can
132
+ pass a block as value in the mapping hash. Block will receive remote object
133
+ as the only argument.
134
+
135
+ ```ruby
136
+ class Rental < ActiveRecord::Base
137
+ synced local_attributes: { headline: ->(rental) { rental.headline.downcase } }
138
+ end
139
+ ```
140
+
141
+ ### Local attributes with mapping modules
142
+
143
+ Converting remote object's values with blocks is really easy, but when you get
144
+ more attributes and longer code in the blocks they might become quite complex
145
+ and hard to read. In such cases you can use a mapper module.
146
+ Remote object will be extended with it.
147
+
148
+ ```ruby
149
+ class Rental < ActiveRecord::Base
150
+ module Mapper
151
+ def downcased_headline
152
+ headline.downcase
153
+ end
154
+ end
155
+ synced mapper: Mapper, local_attributes: { headline: :downcased_headline }
156
+ end
157
+ ```
158
+
159
+ If you want to define Mapper module after the synced directive, you need to
160
+ pass Mapper module inside a block to avoid "uninitialized constant" exception.
161
+
162
+ ```ruby
109
163
  class Rental < ActiveRecord::Base
110
- synced data_key: nil, synced_all_at_key: nil
164
+ synced mapper: -> { Mapper },
165
+ local_attributes: { headline: :downcased_headline }
166
+ module Mapper
167
+ end
111
168
  end
112
169
  ```
113
170
 
171
+ ## Partial updates (using updated since parameter)
172
+
173
+ Partial updates mean that first synchronization will copy all of the remote
174
+ objects into local database and next synchronizations will sync only
175
+ added/changed and removed objects. This significantly improves synchronization
176
+ time and saves network traffic.
177
+
178
+ In order to enable it add timestamp column named `synced_all_at` to your
179
+ database. Synced will automatically detect it.
180
+
181
+ NOTE: In order it to work, given endpoint needs to support updated_since
182
+ parameter. Check [API documentation](http://docs.api.bookingsync.com/reference/)
183
+ for given endpoint.
184
+
185
+ ## Disabling saving whole synced_data
186
+
187
+ If you don't need whole remote object to be stored in local object skip
188
+ creating `synced_data` column in the database or set `synced_data_key: nil`.
189
+
190
+ If you don't want to synchronize only added/changed or deleted objects but all
191
+ objects every time, don't create `synced_all_at` column in the database or set
192
+ `synced_all_at: false` in the synced statement.
193
+
114
194
  You cannot disable synchronizing `synced_id` as it's required to match local
115
195
  objects with the remote ones.
116
196
 
117
197
  ## Associations
118
198
 
119
- It's possible to synchronize objects together with it's associations. For that
120
- you need to
199
+ It's possible to synchronize objects together with it's associations. Meaning
200
+ local associated objects will be created. For that you need to:
121
201
 
122
202
  1. Specify associations you want to synchronize within `synced`
123
203
  declaration of the parent model
@@ -139,6 +219,109 @@ Then run synchronization of the parent objects. Every of the remote_locations
139
219
  objects needs to respond to `remote_location[:photos]` from where data for
140
220
  photos association will be taken.
141
221
 
222
+ ```ruby
223
+ Location.synchronize
224
+ ```
225
+
226
+ NOTE: It assumes that local association `photos` exists in `Location` model.
227
+
228
+ ## Including associations in synced_data
229
+
230
+ When you need associated data available in the local object, but you don't
231
+ need it to be a local association, you can use `include:` option in model or
232
+ synchronize method.
233
+
234
+ ```ruby
235
+ class Location < ActiveRecord::Base
236
+ synced include: :photos
237
+ end
238
+
239
+ Location.first.synced_data.photos # => [{id: 1}, {id: 2}]
240
+ ```
241
+
242
+ You can also specify `include:` option in synchronize method. In this case it
243
+ will overwrite `include:` from the model.
244
+
245
+ ```ruby
246
+ Location.synchronize(include: :addresses)
247
+ ```
248
+
249
+ ## Synchronization of given remote objects
250
+
251
+ By default synced will fetch remote objects using BookingSync::API::Client
252
+ but in some cases you might want to provide own list of remote objects to
253
+ synchronize. In order to do that provide them as `remote:` option to synchronize
254
+ method.
255
+
142
256
  ```ruby
143
257
  Location.synchronize(remote: remote_locations)
144
258
  ```
259
+
260
+ NOTE: Partial updates are disabled when providing remote objects.
261
+
262
+ ## Removing local objects
263
+
264
+ By default synchronization will not delete any local objects which are removed
265
+ on the API side. In order to remove local objects removed on the API, specify
266
+ `remove: true` in the model or as an option to synchronize method.
267
+
268
+ ```ruby
269
+ class Photo < ActiveRecord::Base
270
+ synced remove: true
271
+ end
272
+ ```
273
+
274
+ Option `remove:` passed to `Photo.synchronize` method will overwrite
275
+ configuration in the model.
276
+
277
+ For objects which need to be removed `:destroy_all` is called.
278
+ If model has `canceled_at` column, local objects will be canceled with
279
+ `:cancel_all` class method. You can force your own class method to be called on
280
+ the local objects which should be removed by passing it as an symbol.
281
+
282
+ ```ruby
283
+ class Photo < ActiveRecord::Base
284
+ synced remove: :mark_as_outdated
285
+
286
+ def self.mark_as_outdated
287
+ all.update_attributes(outdated: true)
288
+ end
289
+ end
290
+ ```
291
+
292
+ ## Selecting fields to be synchronized
293
+
294
+ Very often you don't need whole object to be fetched and stored in local
295
+ database but only several fields. You can specify which fields should be fetched
296
+ and stored with `fields:` option.
297
+
298
+ ```ruby
299
+ class Photo < ActiveRecord::Base
300
+ synced fields: [:name, :url]
301
+ end
302
+ ```
303
+
304
+ This can be overwritten in synchronize method.
305
+
306
+ ```ruby
307
+ Photo.synchronize(fields: [:name, :size])
308
+ ```
309
+
310
+ ## Synced configuration options
311
+
312
+ Option name | Default value | Description | synced | synchronize |
313
+ ---------------------|------------------|-----------------------------------------------------------------------------------|--------|-------------|
314
+ `:id_key` | `:synced_id` | ID of the object fetched from the API | YES | NO |
315
+ `:data_key` | `:synced_data` | Object fetched from the API | YES | NO |
316
+ `:synced_all_at_key` | `:synced_all_at` | Time of the last synchronization | YES | NO |
317
+ `:associations` | `[]` | [Sync remote associations to local ones](#associations) | YES | NO |
318
+ `:local_attributes` | `[]` | [Sync remote attributes to local ones](#local-attributes) | YES | NO |
319
+ `:mapper` | `nil` | [Module used for mapping remote objects](#local-attributes-with-mapping-modules) | YES | NO |
320
+ `:remove` | `false` | [If local objects should be removed when deleted on API](#removing-local-objects) | YES | YES |
321
+ `:include` | `[]` | [An array of associations to be fetched](#including-associations-in-synced_data) | YES | YES |
322
+ `:fields` | `[]` | [An array of fields to be fetched](#selecting-fields-to-be-synchronized) | YES | YES |
323
+ `:remote` | `nil` | [Remote objects to be synchronized with local ones](#synchronization-of-given-remote-objects) | NO | YES |
324
+
325
+ ## Documentation
326
+
327
+ [API documentation is available at rdoc.info](http://rdoc.info/github/BookingSync/synced/master/frames).
@@ -18,10 +18,22 @@ module Synced
18
18
  # object's data is stored.
19
19
  # @option options [Array] local_attributes: Array of attributes in the remote
20
20
  # object which will be mapped to local object attributes.
21
+ # @option options [Boolean|Symbol] remove: If it's true all local objects
22
+ # within current scope which are not present in the remote array will be
23
+ # destroyed.
24
+ # If only_updated is enabled, ids of objects to be deleted will be taken
25
+ # from the meta part. By default if cancel_at column is present, all
26
+ # missing local objects will be canceled with cancel_all,
27
+ # if it's missing, all will be destroyed with destroy_all.
28
+ # You can also force method to remove local objects by passing it
29
+ # to remove: :mark_as_missing.
21
30
  def synced(options = {})
31
+ options.assert_valid_keys(:associations, :data_key, :fields, :id_key,
32
+ :include, :local_attributes, :mapper, :only_updated, :remove,
33
+ :synced_all_at_key)
22
34
  class_attribute :synced_id_key, :synced_all_at_key, :synced_data_key,
23
35
  :synced_local_attributes, :synced_associations, :synced_only_updated,
24
- :synced_mapper_module
36
+ :synced_mapper, :synced_remove, :synced_include, :synced_fields
25
37
  self.synced_id_key = options.fetch(:id_key, :synced_id)
26
38
  self.synced_all_at_key = options.fetch(:synced_all_at_key,
27
39
  synced_column_presence(:synced_all_at))
@@ -31,7 +43,10 @@ module Synced
31
43
  self.synced_associations = options.fetch(:associations, [])
32
44
  self.synced_only_updated = options.fetch(:only_updated,
33
45
  column_names.include?(synced_all_at_key.to_s))
34
- self.synced_mapper_module = options.fetch(:mapper, nil)
46
+ self.synced_mapper = options.fetch(:mapper, nil)
47
+ self.synced_remove = options.fetch(:remove, false)
48
+ self.synced_include = options.fetch(:include, [])
49
+ self.synced_fields = options.fetch(:fields, [])
35
50
  include Synced::HasSyncedData
36
51
  end
37
52
 
@@ -50,7 +65,8 @@ module Synced
50
65
  # missing local objects will be canceled with cancel_all,
51
66
  # if it's missing, all will be destroyed with destroy_all.
52
67
  # You can also force method to remove local objects by passing it
53
- # to remove: :mark_as_missing.
68
+ # to remove: :mark_as_missing. This option can be defined in the model
69
+ # and then overwritten in the synchronize method.
54
70
  # @param api [BookingSync::API::Client] - API client to be used for fetching
55
71
  # remote objects
56
72
  # @example Synchronizing amenities
@@ -63,23 +79,24 @@ module Synced
63
79
  #
64
80
  # Rental.synchronize(remote: remote_rentals, scope: website)
65
81
  #
66
- def synchronize(remote: nil, model_class: self, scope: nil, remove: false,
67
- include: nil, api: nil)
68
- options = {
69
- scope: scope,
70
- id_key: synced_id_key,
82
+ def synchronize(options = {})
83
+ options.assert_valid_keys(:api, :fields, :include, :remote, :remove,
84
+ :scope)
85
+ options.symbolize_keys!
86
+ options[:remove] = synced_remove unless options.has_key?(:remove)
87
+ options[:include] = Array(synced_include) unless options.has_key?(:include)
88
+ options[:fields] = Array(synced_fields) unless options.has_key?(:fields)
89
+ options.merge!({
90
+ id_key: synced_id_key,
91
+ synced_data_key: synced_data_key,
71
92
  synced_all_at_key: synced_all_at_key,
72
- data_key: synced_data_key,
73
- remove: remove,
74
- local_attributes: synced_local_attributes,
75
- associations: synced_associations,
76
- only_updated: synced_only_updated,
77
- include: include,
78
- api: api,
79
- mapper: synced_mapper_module
80
- }
81
- synchronizer = Synced::Synchronizer.new(remote, model_class, options)
82
- synchronizer.perform
93
+ data_key: synced_data_key,
94
+ local_attributes: synced_local_attributes,
95
+ associations: synced_associations,
96
+ only_updated: synced_only_updated,
97
+ mapper: synced_mapper
98
+ })
99
+ Synced::Synchronizer.new(self, options).perform
83
100
  end
84
101
 
85
102
  private
@@ -37,7 +37,7 @@ module Synced
37
37
  # remote objects
38
38
  # @option options [Module] mapper: Module class which will be used for
39
39
  # mapping remote objects attributes into local object attributes
40
- def initialize(remote_objects, model_class, options = {})
40
+ def initialize(model_class, options = {})
41
41
  @model_class = model_class
42
42
  @scope = options[:scope]
43
43
  @id_key = options[:id_key]
@@ -48,9 +48,12 @@ module Synced
48
48
  @include = options[:include]
49
49
  @local_attributes = options[:local_attributes]
50
50
  @api = options[:api]
51
- @mapper = options[:mapper]
51
+ @mapper = options[:mapper].respond_to?(:call) ?
52
+ options[:mapper].call : options[:mapper]
53
+ @fields = options[:fields]
54
+ @remove = options[:remove]
52
55
  @associations = Array(options[:associations])
53
- @remote_objects = Array(remote_objects) if remote_objects
56
+ @remote_objects = Array(options[:remote]) if options.has_key?(:remote)
54
57
  @request_performed = false
55
58
  end
56
59
 
@@ -166,6 +169,7 @@ module Synced
166
169
  options[:include] ||= []
167
170
  options[:include] += @include
168
171
  end
172
+ options[:fields] = @fields if @fields.present?
169
173
  options[:updated_since] = minimum_updated_at if updated_since_enabled?
170
174
  options[:auto_paginate] = true
171
175
  end
@@ -1,3 +1,3 @@
1
1
  module Synced
2
- VERSION = "0.0.11"
2
+ VERSION = "1.0.0.rc1"
3
3
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: synced
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.11
4
+ version: 1.0.0.rc1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Sebastien Grosjean
@@ -9,132 +9,132 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2014-08-08 00:00:00.000000000 Z
12
+ date: 2014-08-16 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rails
16
16
  requirement: !ruby/object:Gem::Requirement
17
17
  requirements:
18
- - - ">="
18
+ - - '>='
19
19
  - !ruby/object:Gem::Version
20
20
  version: 4.0.0
21
21
  type: :runtime
22
22
  prerelease: false
23
23
  version_requirements: !ruby/object:Gem::Requirement
24
24
  requirements:
25
- - - ">="
25
+ - - '>='
26
26
  - !ruby/object:Gem::Version
27
27
  version: 4.0.0
28
28
  - !ruby/object:Gem::Dependency
29
29
  name: bookingsync-api
30
30
  requirement: !ruby/object:Gem::Requirement
31
31
  requirements:
32
- - - ">="
32
+ - - '>='
33
33
  - !ruby/object:Gem::Version
34
34
  version: 0.0.20
35
35
  type: :runtime
36
36
  prerelease: false
37
37
  version_requirements: !ruby/object:Gem::Requirement
38
38
  requirements:
39
- - - ">="
39
+ - - '>='
40
40
  - !ruby/object:Gem::Version
41
41
  version: 0.0.20
42
42
  - !ruby/object:Gem::Dependency
43
43
  name: hashie
44
44
  requirement: !ruby/object:Gem::Requirement
45
45
  requirements:
46
- - - ">="
46
+ - - '>='
47
47
  - !ruby/object:Gem::Version
48
48
  version: '0'
49
49
  type: :runtime
50
50
  prerelease: false
51
51
  version_requirements: !ruby/object:Gem::Requirement
52
52
  requirements:
53
- - - ">="
53
+ - - '>='
54
54
  - !ruby/object:Gem::Version
55
55
  version: '0'
56
56
  - !ruby/object:Gem::Dependency
57
57
  name: sqlite3
58
58
  requirement: !ruby/object:Gem::Requirement
59
59
  requirements:
60
- - - ">="
60
+ - - '>='
61
61
  - !ruby/object:Gem::Version
62
62
  version: '0'
63
63
  type: :development
64
64
  prerelease: false
65
65
  version_requirements: !ruby/object:Gem::Requirement
66
66
  requirements:
67
- - - ">="
67
+ - - '>='
68
68
  - !ruby/object:Gem::Version
69
69
  version: '0'
70
70
  - !ruby/object:Gem::Dependency
71
71
  name: rspec-rails
72
72
  requirement: !ruby/object:Gem::Requirement
73
73
  requirements:
74
- - - ">="
74
+ - - '>='
75
75
  - !ruby/object:Gem::Version
76
76
  version: '0'
77
77
  type: :development
78
78
  prerelease: false
79
79
  version_requirements: !ruby/object:Gem::Requirement
80
80
  requirements:
81
- - - ">="
81
+ - - '>='
82
82
  - !ruby/object:Gem::Version
83
83
  version: '0'
84
84
  - !ruby/object:Gem::Dependency
85
85
  name: guard-rspec
86
86
  requirement: !ruby/object:Gem::Requirement
87
87
  requirements:
88
- - - ">="
88
+ - - '>='
89
89
  - !ruby/object:Gem::Version
90
90
  version: '0'
91
91
  type: :development
92
92
  prerelease: false
93
93
  version_requirements: !ruby/object:Gem::Requirement
94
94
  requirements:
95
- - - ">="
95
+ - - '>='
96
96
  - !ruby/object:Gem::Version
97
97
  version: '0'
98
98
  - !ruby/object:Gem::Dependency
99
99
  name: timecop
100
100
  requirement: !ruby/object:Gem::Requirement
101
101
  requirements:
102
- - - ">="
102
+ - - '>='
103
103
  - !ruby/object:Gem::Version
104
104
  version: '0'
105
105
  type: :development
106
106
  prerelease: false
107
107
  version_requirements: !ruby/object:Gem::Requirement
108
108
  requirements:
109
- - - ">="
109
+ - - '>='
110
110
  - !ruby/object:Gem::Version
111
111
  version: '0'
112
112
  - !ruby/object:Gem::Dependency
113
113
  name: vcr
114
114
  requirement: !ruby/object:Gem::Requirement
115
115
  requirements:
116
- - - ">="
116
+ - - '>='
117
117
  - !ruby/object:Gem::Version
118
118
  version: '0'
119
119
  type: :development
120
120
  prerelease: false
121
121
  version_requirements: !ruby/object:Gem::Requirement
122
122
  requirements:
123
- - - ">="
123
+ - - '>='
124
124
  - !ruby/object:Gem::Version
125
125
  version: '0'
126
126
  - !ruby/object:Gem::Dependency
127
127
  name: webmock
128
128
  requirement: !ruby/object:Gem::Requirement
129
129
  requirements:
130
- - - ">="
130
+ - - '>='
131
131
  - !ruby/object:Gem::Version
132
132
  version: '0'
133
133
  type: :development
134
134
  prerelease: false
135
135
  version_requirements: !ruby/object:Gem::Requirement
136
136
  requirements:
137
- - - ">="
137
+ - - '>='
138
138
  - !ruby/object:Gem::Version
139
139
  version: '0'
140
140
  description: Keep your BookingSync Application synced with BookingSync.
@@ -144,16 +144,15 @@ executables: []
144
144
  extensions: []
145
145
  extra_rdoc_files: []
146
146
  files:
147
- - MIT-LICENSE
148
- - README.md
149
- - Rakefile
150
- - config/routes.rb
151
- - lib/synced.rb
152
147
  - lib/synced/has_synced_data.rb
153
148
  - lib/synced/model.rb
154
149
  - lib/synced/rails.rb
155
150
  - lib/synced/synchronizer.rb
156
151
  - lib/synced/version.rb
152
+ - lib/synced.rb
153
+ - MIT-LICENSE
154
+ - Rakefile
155
+ - README.md
157
156
  homepage: https://github.com/BookingSync/synced
158
157
  licenses:
159
158
  - MIT
@@ -164,19 +163,18 @@ require_paths:
164
163
  - lib
165
164
  required_ruby_version: !ruby/object:Gem::Requirement
166
165
  requirements:
167
- - - ">="
166
+ - - '>='
168
167
  - !ruby/object:Gem::Version
169
168
  version: '0'
170
169
  required_rubygems_version: !ruby/object:Gem::Requirement
171
170
  requirements:
172
- - - ">="
171
+ - - '>'
173
172
  - !ruby/object:Gem::Version
174
- version: '0'
173
+ version: 1.3.1
175
174
  requirements: []
176
175
  rubyforge_project:
177
- rubygems_version: 2.2.2
176
+ rubygems_version: 2.0.14
178
177
  signing_key:
179
178
  specification_version: 4
180
179
  summary: Keep your BookingSync Application synced with BookingSync.
181
180
  test_files: []
182
- has_rdoc:
@@ -1,2 +0,0 @@
1
- Rails.application.routes.draw do
2
- end