aratak-syncdb 0.0.4 → 0.0.5

Sign up to get free protection for your applications and to get access to all the features.
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.4'
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
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.2.0
66
+ rubygems_version: 1.3.5
64
67
  signing_key:
65
68
  specification_version: 2
66
69
  summary: Synchronization file and db-table.