multi_sync 0.0.3 → 0.0.4
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +1 -3
- data/lib/multi_sync/attributes/pathname.rb +14 -1
- data/lib/multi_sync/client.rb +8 -10
- data/lib/multi_sync/configuration.rb +1 -1
- data/lib/multi_sync/resource.rb +8 -2
- data/lib/multi_sync/source.rb +7 -2
- data/lib/multi_sync/sources/local_source.rb +1 -1
- data/lib/multi_sync/sources/manifest_source.rb +1 -1
- data/lib/multi_sync/target.rb +8 -3
- data/lib/multi_sync/targets/aws_target.rb +2 -2
- data/lib/multi_sync/targets/local_target.rb +1 -1
- data/lib/multi_sync/version.rb +1 -1
- data/multi_sync.gemspec +0 -1
- data/spec/support/fog.rb +0 -1
- data/spec/unit/multi_sync/client_spec.rb +56 -59
- metadata +82 -96
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 0529edeeec3f7a128b9d191a195660b8b63f8f3c
|
4
|
+
data.tar.gz: 49f29e4ce7469cb3a8ad7ab5ab99c662003e1dd1
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a4b827ac686e355e4be1d79749b2a46bd00ddb4765a2f325738690eac2a45c37e5b7e2c1a0b743d50bbe1cb81f2acda3edb3f66fd4634beb03bd6ba6427b515f
|
7
|
+
data.tar.gz: 2fe0e6833c14b9966c79b08fbae5d2217e9c14bc66a7ccf3efb2b27b0aa603ddd69269583c6f59cdde6c26ae38d695f97d4a42457ab96f59092e9b20a952e247
|
data/README.md
CHANGED
@@ -15,7 +15,7 @@ Listed below are examples of how to get setup and started.
|
|
15
15
|
## Installation
|
16
16
|
|
17
17
|
```ruby
|
18
|
-
gem 'multi_sync', '~> 0.0.
|
18
|
+
gem 'multi_sync', '~> 0.0.4'
|
19
19
|
```
|
20
20
|
|
21
21
|
```ruby
|
@@ -196,8 +196,6 @@ implementations:
|
|
196
196
|
- [JRuby][jruby]
|
197
197
|
- [Rubinius][rubinius]
|
198
198
|
|
199
|
-
# Credits
|
200
|
-
|
201
199
|
[gem]: https://rubygems.org/gems/multi_sync
|
202
200
|
[travis]: http://travis-ci.org/karlfreeman/multi_sync
|
203
201
|
[codeclimate]: https://codeclimate.com/github/karlfreeman/multi_sync
|
@@ -5,7 +5,20 @@ module MultiSync
|
|
5
5
|
module Attributes
|
6
6
|
class Pathname < ::Virtus::Attribute
|
7
7
|
def coerce(value)
|
8
|
-
::Pathname.new(value)
|
8
|
+
return ::Pathname.new(value) unless value.nil?
|
9
|
+
value
|
10
|
+
end
|
11
|
+
|
12
|
+
def value_coerced?(value)
|
13
|
+
value.is_a?(::Pathname)
|
14
|
+
end
|
15
|
+
|
16
|
+
def coercion_method
|
17
|
+
:to_s
|
18
|
+
end
|
19
|
+
|
20
|
+
def primitive
|
21
|
+
::Pathname
|
9
22
|
end
|
10
23
|
end
|
11
24
|
end
|
data/lib/multi_sync/client.rb
CHANGED
@@ -1,5 +1,4 @@
|
|
1
1
|
require 'virtus'
|
2
|
-
require 'lazily'
|
3
2
|
require 'celluloid'
|
4
3
|
%w(sources targets helpers).each do |dir|
|
5
4
|
Dir.glob(File.expand_path("../#{dir}/**/*.rb", __FILE__), &method(:require))
|
@@ -69,7 +68,7 @@ module MultiSync
|
|
69
68
|
sync_attempted
|
70
69
|
|
71
70
|
MultiSync.debug 'Fetching upload jobs from the future...'
|
72
|
-
(running_upload_jobs | incomplete_upload_jobs).
|
71
|
+
(running_upload_jobs | incomplete_upload_jobs).each do | job |
|
73
72
|
begin
|
74
73
|
complete_upload_jobs << job.value
|
75
74
|
rescue => error
|
@@ -80,7 +79,7 @@ module MultiSync
|
|
80
79
|
end
|
81
80
|
|
82
81
|
MultiSync.debug 'Fetching delete jobs from the future...'
|
83
|
-
(running_delete_jobs | incomplete_delete_jobs).
|
82
|
+
(running_delete_jobs | incomplete_delete_jobs).each do | job |
|
84
83
|
begin
|
85
84
|
complete_delete_jobs << job.value
|
86
85
|
rescue => error
|
@@ -96,7 +95,7 @@ module MultiSync
|
|
96
95
|
private
|
97
96
|
|
98
97
|
def determine_sync
|
99
|
-
sources.
|
98
|
+
sources.each do |source|
|
100
99
|
|
101
100
|
source_files = []
|
102
101
|
|
@@ -109,7 +108,7 @@ module MultiSync
|
|
109
108
|
# when no targets are specified, assume all targets
|
110
109
|
source.targets = supervisor_actor_names if source.targets.empty?
|
111
110
|
|
112
|
-
source.targets.
|
111
|
+
source.targets.each do | target_id |
|
113
112
|
|
114
113
|
missing_files = []
|
115
114
|
abandoned_files = []
|
@@ -120,7 +119,6 @@ module MultiSync
|
|
120
119
|
MultiSync.debug 'Fetching files from the target...'
|
121
120
|
|
122
121
|
target_files = supervisor[target_id].files
|
123
|
-
target_files.sort! # sort to make sure the target's indexs match the sources
|
124
122
|
|
125
123
|
MultiSync.debug "#{pluralize(target_files.length, 'file')} found from the target"
|
126
124
|
|
@@ -142,20 +140,20 @@ module MultiSync
|
|
142
140
|
MultiSync.debug 'Scheduling jobs in the future...'
|
143
141
|
|
144
142
|
# outdated files
|
145
|
-
outdated_files.
|
143
|
+
outdated_files.each do | resource |
|
146
144
|
running_upload_jobs << supervisor[target_id].future.upload(resource)
|
147
145
|
end
|
148
146
|
|
149
147
|
# missing files
|
150
148
|
if MultiSync.upload_missing_files
|
151
|
-
missing_files.
|
149
|
+
missing_files.each do | resource |
|
152
150
|
running_upload_jobs << supervisor[target_id].future.upload(resource)
|
153
151
|
end
|
154
152
|
end
|
155
153
|
|
156
154
|
# abandoned files
|
157
155
|
if MultiSync.delete_abandoned_files
|
158
|
-
abandoned_files.
|
156
|
+
abandoned_files.each do | resource |
|
159
157
|
running_delete_jobs << supervisor[target_id].future.delete(resource)
|
160
158
|
end
|
161
159
|
end
|
@@ -224,7 +222,7 @@ module MultiSync
|
|
224
222
|
|
225
223
|
# TODO: replace with celluloid pool of futures
|
226
224
|
# check each source file against the matching target_file's etag
|
227
|
-
source_files.
|
225
|
+
source_files.each_with_index do |file, i|
|
228
226
|
if !file.matching_etag?(target_files[i]) || MultiSync.force
|
229
227
|
outdated_files << file
|
230
228
|
else
|
data/lib/multi_sync/resource.rb
CHANGED
@@ -7,8 +7,8 @@ module MultiSync
|
|
7
7
|
include Comparable
|
8
8
|
include Virtus.model
|
9
9
|
|
10
|
-
attribute :path_with_root, Pathname
|
11
|
-
attribute :path_without_root, Pathname
|
10
|
+
attribute :path_with_root, MultiSync::Attributes::Pathname
|
11
|
+
attribute :path_without_root, MultiSync::Attributes::Pathname
|
12
12
|
|
13
13
|
attribute :etag, String, default: :determine_etag, lazy: true
|
14
14
|
attribute :mtime, Time, default: :determine_mtime, lazy: true
|
@@ -45,6 +45,12 @@ module MultiSync
|
|
45
45
|
send(:attribute, attribute_hash[:name], attribute_hash[:type], def_attribute_hash)
|
46
46
|
end
|
47
47
|
|
48
|
+
def initialize(*args)
|
49
|
+
super
|
50
|
+
rescue Virtus::CoercionError => e
|
51
|
+
raise ArgumentError, e.message
|
52
|
+
end
|
53
|
+
|
48
54
|
def hash
|
49
55
|
path_without_root.hash
|
50
56
|
end
|
data/lib/multi_sync/source.rb
CHANGED
@@ -1,12 +1,11 @@
|
|
1
1
|
require 'virtus'
|
2
2
|
require 'pathname'
|
3
|
-
require 'lazily'
|
4
3
|
require 'multi_sync/attributes/pathname'
|
5
4
|
require 'multi_sync/resources/local_resource'
|
6
5
|
|
7
6
|
module MultiSync
|
8
7
|
class Source
|
9
|
-
include Virtus.model
|
8
|
+
include Virtus.model(strict: true)
|
10
9
|
|
11
10
|
attribute :source_dir, MultiSync::Attributes::Pathname
|
12
11
|
|
@@ -15,6 +14,12 @@ module MultiSync
|
|
15
14
|
attribute :include, String, default: '**/*'
|
16
15
|
attribute :exclude, String, default: ''
|
17
16
|
|
17
|
+
def initialize(*args)
|
18
|
+
super
|
19
|
+
rescue Virtus::CoercionError => e
|
20
|
+
raise ArgumentError, e.message
|
21
|
+
end
|
22
|
+
|
18
23
|
private
|
19
24
|
|
20
25
|
def path_to_local_resource(path, options = {})
|
@@ -9,7 +9,7 @@ module MultiSync
|
|
9
9
|
# making sure to skip any that do not match the include/exclude patterns
|
10
10
|
included_files = Dir.glob(source_dir + include)
|
11
11
|
excluded_files = exclude.nil? ? [] : Dir.glob(source_dir + exclude)
|
12
|
-
(included_files - excluded_files).
|
12
|
+
(included_files - excluded_files).each { |path|
|
13
13
|
next if File.directory?(path)
|
14
14
|
files << path_to_local_resource(path)
|
15
15
|
}
|
@@ -9,7 +9,7 @@ module MultiSync
|
|
9
9
|
files = []
|
10
10
|
# create a local_resource from each file
|
11
11
|
# making sure to skip any that do not match the include/exclude patterns
|
12
|
-
manifest_hash.
|
12
|
+
manifest_hash.each { |key, value|
|
13
13
|
path = source_dir + key
|
14
14
|
next if !path.fnmatch?(include.to_s) || path.fnmatch?(exclude.to_s || '')
|
15
15
|
file = path_to_local_resource(path, mtime: value['mtime'], digest: value['digest'], content_length: value['size'])
|
data/lib/multi_sync/target.rb
CHANGED
@@ -1,5 +1,4 @@
|
|
1
1
|
require 'fog'
|
2
|
-
require 'lazily'
|
3
2
|
require 'virtus'
|
4
3
|
require 'pathname'
|
5
4
|
require 'celluloid'
|
@@ -8,12 +7,18 @@ require 'multi_sync/attributes/pathname'
|
|
8
7
|
module MultiSync
|
9
8
|
class Target
|
10
9
|
include Celluloid
|
11
|
-
include Virtus.model
|
10
|
+
include Virtus.model(strict: true)
|
12
11
|
|
13
|
-
attribute :target_dir, MultiSync::Attributes::Pathname
|
12
|
+
attribute :target_dir, MultiSync::Attributes::Pathname
|
14
13
|
attribute :destination_dir, MultiSync::Attributes::Pathname, default: Pathname.new('')
|
15
14
|
attribute :credentials, Hash, default: :default_credentials
|
16
15
|
|
16
|
+
def initialize(*args)
|
17
|
+
super
|
18
|
+
rescue Virtus::CoercionError => e
|
19
|
+
raise ArgumentError, e.message
|
20
|
+
end
|
21
|
+
|
17
22
|
private
|
18
23
|
|
19
24
|
def default_credentials
|
@@ -4,7 +4,7 @@ require 'multi_sync/resources/remote_resource'
|
|
4
4
|
module MultiSync
|
5
5
|
class AwsTarget < Target
|
6
6
|
attribute :connection, Fog::Storage, lazy: true, default: lambda { |target, attribute|
|
7
|
-
Fog::Storage.new(target.credentials.merge(provider: :aws))
|
7
|
+
Fog::Storage.new(target.credentials.merge(provider: :aws, path_style: true))
|
8
8
|
}
|
9
9
|
|
10
10
|
def files
|
@@ -13,7 +13,7 @@ module MultiSync
|
|
13
13
|
directory = connection.directories.get(target_dir.to_s, prefix: destination_dir.to_s)
|
14
14
|
return files if directory.nil?
|
15
15
|
|
16
|
-
directory.files.
|
16
|
+
directory.files.each { |file|
|
17
17
|
pathname = Pathname.new(file.key)
|
18
18
|
|
19
19
|
# eg directory or overreaching AWS globbing
|
data/lib/multi_sync/version.rb
CHANGED
data/multi_sync.gemspec
CHANGED
@@ -21,7 +21,6 @@ Gem::Specification.new do |spec|
|
|
21
21
|
|
22
22
|
spec.add_dependency 'fog', '~> 1.2'
|
23
23
|
spec.add_dependency 'unf'
|
24
|
-
spec.add_dependency 'lazily', '~> 0.1'
|
25
24
|
spec.add_dependency 'virtus', '~> 1.0'
|
26
25
|
spec.add_dependency 'celluloid', '~> 0.15'
|
27
26
|
spec.add_dependency 'multi_mime', '~> 1.0'
|
data/spec/support/fog.rb
CHANGED
@@ -1,3 +1,4 @@
|
|
1
|
+
require 'cgi'
|
1
2
|
require 'spec_helper'
|
2
3
|
|
3
4
|
describe MultiSync::Client do
|
@@ -18,8 +19,10 @@ describe MultiSync::Client do
|
|
18
19
|
FileUtils.cp_r('tmp/simple', 'tmp/simple-with-outdated-file')
|
19
20
|
File.open('tmp/simple-with-outdated-file/foo.txt', File::CREAT | File::RDWR) do |f| f.write('not-foo') end
|
20
21
|
|
22
|
+
FileUtils.mkdir_p('tmp/simple-empty')
|
23
|
+
|
21
24
|
FileUtils.mkdir_p('tmp/complex')
|
22
|
-
|
25
|
+
250.times do |i|
|
23
26
|
File.open("tmp/complex/#{i.to_s.rjust(4, '0')}.txt", File::CREAT | File::RDWR) do |f| f.write('foo') end
|
24
27
|
end
|
25
28
|
|
@@ -99,29 +102,24 @@ describe MultiSync::Client do
|
|
99
102
|
expect(complex_empty_target).to have(0).files
|
100
103
|
|
101
104
|
local_source = MultiSync::LocalSource.new(local_source_options)
|
102
|
-
expect(local_source).to have(
|
105
|
+
expect(local_source).to have(250).files
|
103
106
|
|
104
107
|
MultiSync.run do
|
105
108
|
local_source(local_source_options)
|
106
109
|
local_target(complex_empty_target_options)
|
107
110
|
end
|
108
111
|
|
109
|
-
expect(complex_empty_target).to have(
|
112
|
+
expect(complex_empty_target).to have(250).files
|
110
113
|
end
|
111
114
|
end
|
112
115
|
end
|
113
116
|
|
114
117
|
context :aws, fog: true do
|
118
|
+
let(:credentials) { { region: 'us-east-1', aws_access_key_id: 'xxx', aws_secret_access_key: 'xxx' } }
|
119
|
+
let(:connection) { Fog::Storage.new(credentials.merge(provider: :aws)) }
|
115
120
|
context 'simple' do
|
116
121
|
before do
|
117
|
-
|
118
|
-
provider: :aws,
|
119
|
-
region: 'us-east-1',
|
120
|
-
aws_access_key_id: 'xxx',
|
121
|
-
aws_secret_access_key: 'xxx'
|
122
|
-
)
|
123
|
-
|
124
|
-
directory = connection.directories.create(key: 'multi_sync', public: true)
|
122
|
+
directory = connection.directories.create(key: 'simple', public: true)
|
125
123
|
|
126
124
|
%w(simple simple-with-missing-file simple-with-abandoned-file simple-with-outdated-file).each do |fixture_name|
|
127
125
|
Dir.glob("tmp/#{fixture_name}/**/*").reject { |path| File.directory?(path) }.each do |path|
|
@@ -136,33 +134,21 @@ describe MultiSync::Client do
|
|
136
134
|
|
137
135
|
it 'should work' do
|
138
136
|
missing_files_target_options = {
|
139
|
-
target_dir: '
|
137
|
+
target_dir: 'simple',
|
140
138
|
destination_dir: 'simple-with-missing-file',
|
141
|
-
credentials:
|
142
|
-
region: 'us-east-1',
|
143
|
-
aws_access_key_id: 'xxx',
|
144
|
-
aws_secret_access_key: 'xxx'
|
145
|
-
}
|
139
|
+
credentials: credentials
|
146
140
|
}
|
147
141
|
|
148
142
|
abandoned_files_target_options = {
|
149
|
-
target_dir: '
|
143
|
+
target_dir: 'simple',
|
150
144
|
destination_dir: 'simple-with-abandoned-file',
|
151
|
-
credentials:
|
152
|
-
region: 'us-east-1',
|
153
|
-
aws_access_key_id: 'xxx',
|
154
|
-
aws_secret_access_key: 'xxx'
|
155
|
-
}
|
145
|
+
credentials: credentials
|
156
146
|
}
|
157
147
|
|
158
148
|
outdated_files_target_options = {
|
159
|
-
target_dir: '
|
149
|
+
target_dir: 'simple',
|
160
150
|
destination_dir: 'simple-with-outdated-file',
|
161
|
-
credentials:
|
162
|
-
region: 'us-east-1',
|
163
|
-
aws_access_key_id: 'xxx',
|
164
|
-
aws_secret_access_key: 'xxx'
|
165
|
-
}
|
151
|
+
credentials: credentials
|
166
152
|
}
|
167
153
|
|
168
154
|
local_source_options = { source_dir: 'tmp/simple' }
|
@@ -196,25 +182,14 @@ describe MultiSync::Client do
|
|
196
182
|
|
197
183
|
context 'complex' do
|
198
184
|
before do
|
199
|
-
connection
|
200
|
-
provider: :aws,
|
201
|
-
region: 'us-east-1',
|
202
|
-
aws_access_key_id: 'xxx',
|
203
|
-
aws_secret_access_key: 'xxx'
|
204
|
-
)
|
205
|
-
|
206
|
-
connection.directories.create(key: 'multi_sync', public: true)
|
185
|
+
connection.directories.create(key: 'complex', public: true)
|
207
186
|
end
|
208
187
|
|
209
188
|
it 'should work' do
|
210
189
|
complex_empty_target_options = {
|
211
|
-
target_dir: '
|
212
|
-
destination_dir: 'complex
|
213
|
-
credentials:
|
214
|
-
region: 'us-east-1',
|
215
|
-
aws_access_key_id: 'xxx',
|
216
|
-
aws_secret_access_key: 'xxx'
|
217
|
-
}
|
190
|
+
target_dir: 'complex',
|
191
|
+
destination_dir: 'complex',
|
192
|
+
credentials: credentials
|
218
193
|
}
|
219
194
|
|
220
195
|
local_source_options = { source_dir: 'tmp/complex' }
|
@@ -223,37 +198,26 @@ describe MultiSync::Client do
|
|
223
198
|
expect(complex_empty_target).to have(0).files
|
224
199
|
|
225
200
|
local_source = MultiSync::LocalSource.new(local_source_options)
|
226
|
-
expect(local_source).to have(
|
201
|
+
expect(local_source).to have(250).files
|
227
202
|
|
228
203
|
MultiSync.run do
|
229
204
|
local_source(local_source_options)
|
230
205
|
aws_target(complex_empty_target_options)
|
231
206
|
end
|
232
207
|
|
233
|
-
expect(complex_empty_target).to have(
|
208
|
+
expect(complex_empty_target).to have(250).files
|
234
209
|
end
|
235
210
|
end
|
236
211
|
|
237
212
|
context 'without a destination_dir' do
|
238
213
|
before do
|
239
|
-
connection = Fog::Storage.new(
|
240
|
-
provider: :aws,
|
241
|
-
region: 'us-east-1',
|
242
|
-
aws_access_key_id: 'xxx',
|
243
|
-
aws_secret_access_key: 'xxx'
|
244
|
-
)
|
245
|
-
|
246
214
|
connection.directories.create(key: 'without_destination_dir', public: true)
|
247
215
|
end
|
248
216
|
|
249
217
|
it 'should work' do
|
250
218
|
without_destination_dir_target_options = {
|
251
219
|
target_dir: 'without_destination_dir',
|
252
|
-
credentials:
|
253
|
-
region: 'us-east-1',
|
254
|
-
aws_access_key_id: 'xxx',
|
255
|
-
aws_secret_access_key: 'xxx'
|
256
|
-
}
|
220
|
+
credentials: credentials
|
257
221
|
}
|
258
222
|
|
259
223
|
local_source_options = { source_dir: 'tmp/simple' }
|
@@ -274,7 +238,40 @@ describe MultiSync::Client do
|
|
274
238
|
end
|
275
239
|
|
276
240
|
context 'with resource_options' do
|
277
|
-
|
241
|
+
before do
|
242
|
+
connection.directories.create(key: 'with_resource_options', public: true)
|
243
|
+
end
|
244
|
+
|
245
|
+
it 'should work' do
|
246
|
+
with_resource_options_target_options = {
|
247
|
+
target_dir: 'with_resource_options',
|
248
|
+
credentials: credentials
|
249
|
+
}
|
250
|
+
|
251
|
+
local_source_options = {
|
252
|
+
source_dir: 'tmp/simple',
|
253
|
+
resource_options: {
|
254
|
+
cache_control: 'public, max-age=31557600',
|
255
|
+
expires: CGI.rfc1123_date(Time.now + 31_557_600)
|
256
|
+
}
|
257
|
+
}
|
258
|
+
|
259
|
+
with_resource_options_target = MultiSync::AwsTarget.new(with_resource_options_target_options)
|
260
|
+
expect(with_resource_options_target).to have(0).files
|
261
|
+
|
262
|
+
local_source = MultiSync::LocalSource.new(local_source_options)
|
263
|
+
expect(local_source).to have(3).files
|
264
|
+
|
265
|
+
MultiSync.run do
|
266
|
+
local_source(local_source_options)
|
267
|
+
aws_target(with_resource_options_target)
|
268
|
+
end
|
269
|
+
|
270
|
+
# dir = connection.directories.get('with_resource_options')
|
271
|
+
# pp with_resource_options_target.files[0].file.cache_control
|
272
|
+
|
273
|
+
expect(with_resource_options_target).to have(3).files
|
274
|
+
end
|
278
275
|
end
|
279
276
|
end
|
280
277
|
end
|
metadata
CHANGED
@@ -1,197 +1,183 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: multi_sync
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Karl Freeman
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-03-
|
11
|
+
date: 2014-03-18 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: fog
|
15
|
-
version_requirements: !ruby/object:Gem::Requirement
|
16
|
-
requirements:
|
17
|
-
- - ~>
|
18
|
-
- !ruby/object:Gem::Version
|
19
|
-
version: '1.2'
|
20
15
|
requirement: !ruby/object:Gem::Requirement
|
21
16
|
requirements:
|
22
|
-
- - ~>
|
17
|
+
- - "~>"
|
23
18
|
- !ruby/object:Gem::Version
|
24
19
|
version: '1.2'
|
25
|
-
prerelease: false
|
26
20
|
type: :runtime
|
27
|
-
|
28
|
-
name: unf
|
21
|
+
prerelease: false
|
29
22
|
version_requirements: !ruby/object:Gem::Requirement
|
30
23
|
requirements:
|
31
|
-
- -
|
24
|
+
- - "~>"
|
32
25
|
- !ruby/object:Gem::Version
|
33
|
-
version: '
|
26
|
+
version: '1.2'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: unf
|
34
29
|
requirement: !ruby/object:Gem::Requirement
|
35
30
|
requirements:
|
36
|
-
- -
|
31
|
+
- - ">="
|
37
32
|
- !ruby/object:Gem::Version
|
38
33
|
version: '0'
|
39
|
-
prerelease: false
|
40
34
|
type: :runtime
|
41
|
-
|
42
|
-
name: lazily
|
35
|
+
prerelease: false
|
43
36
|
version_requirements: !ruby/object:Gem::Requirement
|
44
37
|
requirements:
|
45
|
-
- -
|
38
|
+
- - ">="
|
46
39
|
- !ruby/object:Gem::Version
|
47
|
-
version: '0
|
40
|
+
version: '0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: virtus
|
48
43
|
requirement: !ruby/object:Gem::Requirement
|
49
44
|
requirements:
|
50
|
-
- - ~>
|
45
|
+
- - "~>"
|
51
46
|
- !ruby/object:Gem::Version
|
52
|
-
version: '0
|
53
|
-
prerelease: false
|
47
|
+
version: '1.0'
|
54
48
|
type: :runtime
|
55
|
-
|
56
|
-
name: virtus
|
49
|
+
prerelease: false
|
57
50
|
version_requirements: !ruby/object:Gem::Requirement
|
58
51
|
requirements:
|
59
|
-
- - ~>
|
52
|
+
- - "~>"
|
60
53
|
- !ruby/object:Gem::Version
|
61
54
|
version: '1.0'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: celluloid
|
62
57
|
requirement: !ruby/object:Gem::Requirement
|
63
58
|
requirements:
|
64
|
-
- - ~>
|
59
|
+
- - "~>"
|
65
60
|
- !ruby/object:Gem::Version
|
66
|
-
version: '
|
67
|
-
prerelease: false
|
61
|
+
version: '0.15'
|
68
62
|
type: :runtime
|
69
|
-
|
70
|
-
name: celluloid
|
63
|
+
prerelease: false
|
71
64
|
version_requirements: !ruby/object:Gem::Requirement
|
72
65
|
requirements:
|
73
|
-
- - ~>
|
66
|
+
- - "~>"
|
74
67
|
- !ruby/object:Gem::Version
|
75
68
|
version: '0.15'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: multi_mime
|
76
71
|
requirement: !ruby/object:Gem::Requirement
|
77
72
|
requirements:
|
78
|
-
- - ~>
|
73
|
+
- - "~>"
|
79
74
|
- !ruby/object:Gem::Version
|
80
|
-
version: '0
|
81
|
-
prerelease: false
|
75
|
+
version: '1.0'
|
82
76
|
type: :runtime
|
83
|
-
|
84
|
-
name: multi_mime
|
77
|
+
prerelease: false
|
85
78
|
version_requirements: !ruby/object:Gem::Requirement
|
86
79
|
requirements:
|
87
|
-
- - ~>
|
80
|
+
- - "~>"
|
88
81
|
- !ruby/object:Gem::Version
|
89
82
|
version: '1.0'
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: multi_json
|
90
85
|
requirement: !ruby/object:Gem::Requirement
|
91
86
|
requirements:
|
92
|
-
- - ~>
|
87
|
+
- - "~>"
|
93
88
|
- !ruby/object:Gem::Version
|
94
|
-
version: '1.
|
95
|
-
prerelease: false
|
89
|
+
version: '1.7'
|
96
90
|
type: :runtime
|
97
|
-
|
98
|
-
name: multi_json
|
91
|
+
prerelease: false
|
99
92
|
version_requirements: !ruby/object:Gem::Requirement
|
100
93
|
requirements:
|
101
|
-
- - ~>
|
94
|
+
- - "~>"
|
102
95
|
- !ruby/object:Gem::Version
|
103
96
|
version: '1.7'
|
97
|
+
- !ruby/object:Gem::Dependency
|
98
|
+
name: bundler
|
104
99
|
requirement: !ruby/object:Gem::Requirement
|
105
100
|
requirements:
|
106
|
-
- - ~>
|
101
|
+
- - "~>"
|
107
102
|
- !ruby/object:Gem::Version
|
108
|
-
version: '1.
|
103
|
+
version: '1.5'
|
104
|
+
type: :development
|
109
105
|
prerelease: false
|
110
|
-
type: :runtime
|
111
|
-
- !ruby/object:Gem::Dependency
|
112
|
-
name: bundler
|
113
106
|
version_requirements: !ruby/object:Gem::Requirement
|
114
107
|
requirements:
|
115
|
-
- - ~>
|
108
|
+
- - "~>"
|
116
109
|
- !ruby/object:Gem::Version
|
117
110
|
version: '1.5'
|
111
|
+
- !ruby/object:Gem::Dependency
|
112
|
+
name: rake
|
118
113
|
requirement: !ruby/object:Gem::Requirement
|
119
114
|
requirements:
|
120
|
-
- - ~>
|
115
|
+
- - "~>"
|
121
116
|
- !ruby/object:Gem::Version
|
122
|
-
version: '
|
123
|
-
prerelease: false
|
117
|
+
version: '10.0'
|
124
118
|
type: :development
|
125
|
-
|
126
|
-
name: rake
|
119
|
+
prerelease: false
|
127
120
|
version_requirements: !ruby/object:Gem::Requirement
|
128
121
|
requirements:
|
129
|
-
- - ~>
|
122
|
+
- - "~>"
|
130
123
|
- !ruby/object:Gem::Version
|
131
124
|
version: '10.0'
|
125
|
+
- !ruby/object:Gem::Dependency
|
126
|
+
name: kramdown
|
132
127
|
requirement: !ruby/object:Gem::Requirement
|
133
128
|
requirements:
|
134
|
-
- -
|
129
|
+
- - ">="
|
135
130
|
- !ruby/object:Gem::Version
|
136
|
-
version: '
|
137
|
-
prerelease: false
|
131
|
+
version: '0.14'
|
138
132
|
type: :development
|
139
|
-
|
140
|
-
name: kramdown
|
133
|
+
prerelease: false
|
141
134
|
version_requirements: !ruby/object:Gem::Requirement
|
142
135
|
requirements:
|
143
|
-
- -
|
136
|
+
- - ">="
|
144
137
|
- !ruby/object:Gem::Version
|
145
138
|
version: '0.14'
|
139
|
+
- !ruby/object:Gem::Dependency
|
140
|
+
name: rubocop
|
146
141
|
requirement: !ruby/object:Gem::Requirement
|
147
142
|
requirements:
|
148
|
-
- -
|
143
|
+
- - ">="
|
149
144
|
- !ruby/object:Gem::Version
|
150
|
-
version: '0
|
151
|
-
prerelease: false
|
145
|
+
version: '0'
|
152
146
|
type: :development
|
153
|
-
|
154
|
-
name: rubocop
|
147
|
+
prerelease: false
|
155
148
|
version_requirements: !ruby/object:Gem::Requirement
|
156
149
|
requirements:
|
157
|
-
- -
|
150
|
+
- - ">="
|
158
151
|
- !ruby/object:Gem::Version
|
159
152
|
version: '0'
|
153
|
+
- !ruby/object:Gem::Dependency
|
154
|
+
name: pry
|
160
155
|
requirement: !ruby/object:Gem::Requirement
|
161
156
|
requirements:
|
162
|
-
- -
|
157
|
+
- - ">="
|
163
158
|
- !ruby/object:Gem::Version
|
164
159
|
version: '0'
|
165
|
-
prerelease: false
|
166
160
|
type: :development
|
167
|
-
|
168
|
-
name: pry
|
161
|
+
prerelease: false
|
169
162
|
version_requirements: !ruby/object:Gem::Requirement
|
170
163
|
requirements:
|
171
|
-
- -
|
164
|
+
- - ">="
|
172
165
|
- !ruby/object:Gem::Version
|
173
166
|
version: '0'
|
167
|
+
- !ruby/object:Gem::Dependency
|
168
|
+
name: yard
|
174
169
|
requirement: !ruby/object:Gem::Requirement
|
175
170
|
requirements:
|
176
|
-
- -
|
171
|
+
- - ">="
|
177
172
|
- !ruby/object:Gem::Version
|
178
173
|
version: '0'
|
179
|
-
prerelease: false
|
180
174
|
type: :development
|
181
|
-
|
182
|
-
name: yard
|
175
|
+
prerelease: false
|
183
176
|
version_requirements: !ruby/object:Gem::Requirement
|
184
177
|
requirements:
|
185
|
-
- -
|
178
|
+
- - ">="
|
186
179
|
- !ruby/object:Gem::Version
|
187
180
|
version: '0'
|
188
|
-
requirement: !ruby/object:Gem::Requirement
|
189
|
-
requirements:
|
190
|
-
- - '>='
|
191
|
-
- !ruby/object:Gem::Version
|
192
|
-
version: '0'
|
193
|
-
prerelease: false
|
194
|
-
type: :development
|
195
181
|
description: Flexible synchronisation for your assets
|
196
182
|
email:
|
197
183
|
- karlfreeman@gmail.com
|
@@ -199,11 +185,11 @@ executables: []
|
|
199
185
|
extensions: []
|
200
186
|
extra_rdoc_files: []
|
201
187
|
files:
|
202
|
-
- .document
|
203
|
-
- .gitignore
|
204
|
-
- .rubocop.yml
|
205
|
-
- .travis.yml
|
206
|
-
- .yardopts
|
188
|
+
- ".document"
|
189
|
+
- ".gitignore"
|
190
|
+
- ".rubocop.yml"
|
191
|
+
- ".travis.yml"
|
192
|
+
- ".yardopts"
|
207
193
|
- CHANGELOG.md
|
208
194
|
- CONTRIBUTING.md
|
209
195
|
- Gemfile
|
@@ -252,24 +238,24 @@ homepage: https://github.com/karlfreeman/multi_sync
|
|
252
238
|
licenses:
|
253
239
|
- MIT
|
254
240
|
metadata: {}
|
255
|
-
post_install_message:
|
241
|
+
post_install_message:
|
256
242
|
rdoc_options: []
|
257
243
|
require_paths:
|
258
244
|
- lib
|
259
245
|
required_ruby_version: !ruby/object:Gem::Requirement
|
260
246
|
requirements:
|
261
|
-
- -
|
247
|
+
- - ">="
|
262
248
|
- !ruby/object:Gem::Version
|
263
249
|
version: 1.9.3
|
264
250
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
265
251
|
requirements:
|
266
|
-
- -
|
252
|
+
- - ">="
|
267
253
|
- !ruby/object:Gem::Version
|
268
254
|
version: '0'
|
269
255
|
requirements: []
|
270
|
-
rubyforge_project:
|
271
|
-
rubygems_version: 2.
|
272
|
-
signing_key:
|
256
|
+
rubyforge_project:
|
257
|
+
rubygems_version: 2.2.0
|
258
|
+
signing_key:
|
273
259
|
specification_version: 4
|
274
260
|
summary: Flexible synchronisation for your assets
|
275
261
|
test_files:
|