multi_sync 0.0.3 → 0.0.4
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 +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:
|