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 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.