aratak-syncdb 0.0.4 → 0.0.5
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.
- data/lib/array_mix.rb +31 -0
- data/lib/synchronizator.rb +68 -0
- data/syncdb.gemspec +2 -2
- metadata +5 -2
data/lib/array_mix.rb
ADDED
@@ -0,0 +1,31 @@
|
|
1
|
+
class Array
|
2
|
+
def product(*arg)
|
3
|
+
r = self
|
4
|
+
def product_2d a1, a2
|
5
|
+
res = []
|
6
|
+
a1.each do |a|
|
7
|
+
a2.each do |b|
|
8
|
+
res.push [a,b].flatten
|
9
|
+
end
|
10
|
+
end
|
11
|
+
res.empty? ? a2.map { |a| [a] } : res
|
12
|
+
end
|
13
|
+
|
14
|
+
[*arg].each do |a|
|
15
|
+
r = product_2d r, a
|
16
|
+
end
|
17
|
+
|
18
|
+
return r
|
19
|
+
end unless method_defined? :product
|
20
|
+
|
21
|
+
def minus arr, &closure
|
22
|
+
closure ||= lambda do |a,b|
|
23
|
+
a==b
|
24
|
+
end
|
25
|
+
|
26
|
+
self.find_all do |minuend|
|
27
|
+
!(arr.find { |subtrahend| closure.call(minuend,subtrahend) })
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
end
|
@@ -0,0 +1,68 @@
|
|
1
|
+
require 'singleton'
|
2
|
+
require "array_mix"
|
3
|
+
|
4
|
+
module Syncdb
|
5
|
+
class Synchronizator
|
6
|
+
include Singleton
|
7
|
+
|
8
|
+
def self.sync(array_of_hashs, model_objects, model_name, &closure)
|
9
|
+
puts ">> synchronizator started"
|
10
|
+
@old_objects = model_objects
|
11
|
+
@klass = model_name
|
12
|
+
@objects_for_adding = []
|
13
|
+
@objects_for_removing = []
|
14
|
+
|
15
|
+
@closure = closure || lambda do |item, model_item|
|
16
|
+
# return true if model_item.nil?
|
17
|
+
verifing_columns = model_item.class.columns_hash.keys - ["id", "created_at", "updated_at"]
|
18
|
+
ActiveRecord::Base.include_root_in_json = false
|
19
|
+
jsoned_model = model_item.to_json :only => verifing_columns
|
20
|
+
jsoned_item = item.to_json :only => verifing_columns
|
21
|
+
JSON(jsoned_item) == JSON(jsoned_model)
|
22
|
+
end
|
23
|
+
|
24
|
+
@new_objects = array_of_hashs.map do |item_of_hash|
|
25
|
+
@klass.new(item_of_hash)
|
26
|
+
end
|
27
|
+
raise("#{@klass.humanize} names in not unique") unless @new_objects.minus(@new_objects, &@closure).empty?
|
28
|
+
|
29
|
+
self.models_for_removing
|
30
|
+
self.models_for_adding
|
31
|
+
|
32
|
+
self.remove_models
|
33
|
+
self.add_models
|
34
|
+
puts ">>> synchronize success"
|
35
|
+
end
|
36
|
+
|
37
|
+
private
|
38
|
+
|
39
|
+
def self.models_for_removing
|
40
|
+
# closure = @closure
|
41
|
+
objs = @old_objects.minus @new_objects, &@closure
|
42
|
+
puts ">>> should be removed: #{objs.size}"
|
43
|
+
@objects_for_removing = objs
|
44
|
+
end
|
45
|
+
|
46
|
+
def self.models_for_adding
|
47
|
+
# closure = @closure
|
48
|
+
objs = @new_objects.minus @old_objects, &@closure
|
49
|
+
puts ">>> should be added: #{objs.size}"
|
50
|
+
@objects_for_adding = objs
|
51
|
+
end
|
52
|
+
|
53
|
+
def self.remove_models
|
54
|
+
puts ">>> remove_models: " unless @objects_for_removing.empty?
|
55
|
+
@objects_for_removing.each do |obj|
|
56
|
+
obj.destroy
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
def self.add_models
|
61
|
+
puts ">>> add_models: " unless @objects_for_adding.empty?
|
62
|
+
@objects_for_adding.each do |obj|
|
63
|
+
obj.save!
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
end
|
68
|
+
end
|
data/syncdb.gemspec
CHANGED
@@ -1,9 +1,9 @@
|
|
1
1
|
spec = Gem::Specification.new do |s|
|
2
2
|
s.name = "syncdb"
|
3
|
-
s.version = '0.0.
|
3
|
+
s.version = '0.0.5'
|
4
4
|
s.summary = "Synchronization file and db-table."
|
5
5
|
s.description = "syncdb: description will be here."
|
6
|
-
s.files = ['README', 'syncdb.gemspec', 'lib/syncdb.rb']
|
6
|
+
s.files = ['README', 'syncdb.gemspec', 'lib/syncdb.rb', 'lib/array_mix.rb', 'lib/synchronizator.rb']
|
7
7
|
s.require_path = 'lib'
|
8
8
|
s.autorequire = ['lib/array_mix', 'lib/synchronizator', 'lib/syncdb']
|
9
9
|
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: aratak-syncdb
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.5
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Alexey Osipenko
|
@@ -37,8 +37,11 @@ files:
|
|
37
37
|
- README
|
38
38
|
- syncdb.gemspec
|
39
39
|
- lib/syncdb.rb
|
40
|
+
- lib/array_mix.rb
|
41
|
+
- lib/synchronizator.rb
|
40
42
|
has_rdoc: true
|
41
43
|
homepage: http://alexey.osipenko.name/ruby/syncdb
|
44
|
+
licenses:
|
42
45
|
post_install_message:
|
43
46
|
rdoc_options:
|
44
47
|
- --inline-source
|
@@ -60,7 +63,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
60
63
|
requirements: []
|
61
64
|
|
62
65
|
rubyforge_project:
|
63
|
-
rubygems_version: 1.
|
66
|
+
rubygems_version: 1.3.5
|
64
67
|
signing_key:
|
65
68
|
specification_version: 2
|
66
69
|
summary: Synchronization file and db-table.
|