syncable_models 0.0.8 → 0.0.9
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 +8 -8
- data/bin/import +36 -0
- data/lib/generators/syncable_models/templates/initializer.rb +3 -0
- data/lib/syncable_models/importer.rb +88 -0
- data/lib/syncable_models/version.rb +1 -1
- data/lib/syncable_models.rb +1 -4
- data/test/dummy/log/test.log +8 -8
- metadata +6 -4
- data/lib/syncable_models_importer.rb +0 -84
checksums.yaml
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
---
|
2
2
|
!binary "U0hBMQ==":
|
3
3
|
metadata.gz: !binary |-
|
4
|
-
|
4
|
+
YzExMWFmOTBmNzJkMjVjZjBlYTY1MjVkMWE4NzVlYzQxYjY1ZmIwNQ==
|
5
5
|
data.tar.gz: !binary |-
|
6
|
-
|
6
|
+
NTk0NjI3ZTliZTVlNGQ5ZWQ2NzMwZDY2NzExOTA4N2Q5Mzg5NDEzMg==
|
7
7
|
SHA512:
|
8
8
|
metadata.gz: !binary |-
|
9
|
-
|
10
|
-
|
11
|
-
|
9
|
+
NTYxODY1NWM0ZDUwYmM4MDdiMTczYzMxOTFjMWFlODg3ZWY3YjVmMDliYjhl
|
10
|
+
ZDUyYzM3NWNjNDkyYzMwYjk0NzE4YWQ0NmVmNWU2ZTc4MzA3NGU2NTJmNjU5
|
11
|
+
M2NkMTM4MWRmNWNiMTQyNjdmMDdmMDgyNDk5ZjliZmRkNDE3NDk=
|
12
12
|
data.tar.gz: !binary |-
|
13
|
-
|
14
|
-
|
15
|
-
|
13
|
+
YWI1OTQxYTg0MmRhNGY5NjE0ZWEyNTE3NTlkNWUyNmIxNDA2MGE3NWM2YmM4
|
14
|
+
MjkxNmY1YTUwNTk3YmM2MjkzOGQwZjkyODkwZDU0NGM0ZmUyNzBlZWY2Mzk1
|
15
|
+
NzhlMTQwOWE3MTNjMmRiYWZiMzI0YjkxYThmZjgzNmE4NzcyNTk=
|
data/bin/import
ADDED
@@ -0,0 +1,36 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require File.join((ENV['APP_PATH'] || File.expand_path('.')), 'config', 'environment')
|
4
|
+
|
5
|
+
## Importer
|
6
|
+
print 'Starting Importer... '
|
7
|
+
|
8
|
+
interval = SyncableModels::Importer.interval
|
9
|
+
timeout = SyncableModels::Importer.timeout
|
10
|
+
|
11
|
+
importer = Concurrent::TimerTask.new(execution_interval: interval, timeout_interval: timeout, run_now: true) do
|
12
|
+
begin
|
13
|
+
SyncableModels::Importer.import
|
14
|
+
rescue => exc
|
15
|
+
Rails.logger.error "[Importer] Error: #{exc.message}\n" \
|
16
|
+
" backtrace:\n #{exc.backtrace.join("\n ")}"
|
17
|
+
end
|
18
|
+
end
|
19
|
+
importer.execute
|
20
|
+
print "done.\n"
|
21
|
+
|
22
|
+
# Signal catching
|
23
|
+
def shut_down
|
24
|
+
puts "\nShutting down gracefully..."
|
25
|
+
sleep 1
|
26
|
+
end
|
27
|
+
|
28
|
+
["TERM", "INT"].each do |sig|
|
29
|
+
trap(sig) do
|
30
|
+
shut_down
|
31
|
+
exit
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
|
36
|
+
loop { sleep }
|
@@ -0,0 +1,88 @@
|
|
1
|
+
require 'faraday'
|
2
|
+
|
3
|
+
module SyncableModels
|
4
|
+
module Importer
|
5
|
+
class Import
|
6
|
+
attr_accessor :api_url, :api_key, :destination
|
7
|
+
attr_reader :models
|
8
|
+
|
9
|
+
def initialize
|
10
|
+
@models = {}
|
11
|
+
end
|
12
|
+
|
13
|
+
def import_model(class_name, args = {})
|
14
|
+
class_name = class_name.to_s if class_name.is_a?(Class)
|
15
|
+
fetch_path = args[:fetch_path] || class_name.underscore.pluralize
|
16
|
+
sync_path = args[:sync_path] || "sync_" + class_name.underscore.pluralize
|
17
|
+
id_key = args[:id_key] || :uuid
|
18
|
+
@models[class_name] = {
|
19
|
+
fetch_path: fetch_path,
|
20
|
+
sync_path: sync_path,
|
21
|
+
id_key: id_key
|
22
|
+
}
|
23
|
+
end
|
24
|
+
|
25
|
+
def api_url
|
26
|
+
@api_url[-1] == '/' ? @api_url : @api_url + "/"
|
27
|
+
end
|
28
|
+
|
29
|
+
def params_with_api_key(params)
|
30
|
+
params.merge!(key: api_key) if api_key
|
31
|
+
params
|
32
|
+
end
|
33
|
+
|
34
|
+
def import
|
35
|
+
@models.each do |model_name, params|
|
36
|
+
fetch_url = self.api_url + params[:fetch_path]
|
37
|
+
sync_url = self.api_url + params[:sync_path]
|
38
|
+
|
39
|
+
conn = Faraday.new(url: fetch_url)
|
40
|
+
response = conn.get '', params_with_api_key(destination: destination)
|
41
|
+
|
42
|
+
if response.success?
|
43
|
+
response = JSON.parse(response.body)
|
44
|
+
|
45
|
+
if response["status"].to_i == 401
|
46
|
+
puts "[SyncableModels::Importer] Wrong api key!"
|
47
|
+
end
|
48
|
+
|
49
|
+
if response['objects'] && response['objects'].count > 0
|
50
|
+
klass = model_name.constantize
|
51
|
+
synced_ids = []
|
52
|
+
|
53
|
+
response['objects'].each do |o|
|
54
|
+
result = klass.from_import_hash(o)
|
55
|
+
puts "[SyncableModels::Importer] Importing #{model_name} (id=#{o[params[:id_key].to_s]}): #{ result ? 'OK' : 'FAIL' }"
|
56
|
+
synced_ids << o[params[:id_key].to_s] if result
|
57
|
+
end
|
58
|
+
|
59
|
+
if synced_ids.any?
|
60
|
+
conn = Faraday.new(url: sync_url)
|
61
|
+
response = conn.get '', params_with_api_key(destination: self.destination, ids: synced_ids)
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
mattr_accessor :imports, :interval, :timeout
|
70
|
+
@@imports = []
|
71
|
+
@@interval = 5.minutes
|
72
|
+
@@timeout = 10.seconds
|
73
|
+
|
74
|
+
def self.config
|
75
|
+
yield self
|
76
|
+
end
|
77
|
+
|
78
|
+
def self.add_import
|
79
|
+
import = Import.new
|
80
|
+
yield import
|
81
|
+
@@imports << import
|
82
|
+
end
|
83
|
+
|
84
|
+
def self.import
|
85
|
+
@@imports.each &:import
|
86
|
+
end
|
87
|
+
end
|
88
|
+
end
|
data/lib/syncable_models.rb
CHANGED
@@ -1,10 +1,7 @@
|
|
1
1
|
require "syncable_models/engine"
|
2
2
|
require "syncable_models/active_record"
|
3
3
|
require "syncable_models/controller"
|
4
|
-
require "
|
4
|
+
require "syncable_models/importer"
|
5
5
|
|
6
6
|
module SyncableModels
|
7
7
|
end
|
8
|
-
|
9
|
-
module SyncableModelsImporter
|
10
|
-
end
|
data/test/dummy/log/test.log
CHANGED
@@ -1,7 +1,7 @@
|
|
1
|
-
[1m[36m (
|
1
|
+
[1m[36m (3.9ms)[0m [1mCREATE TABLE "syncs" ("id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, "subject_id" integer, "subject_type" varchar, "destination" varchar, "created_at" datetime, "updated_at" datetime) [0m
|
2
2
|
[1m[35m (0.1ms)[0m select sqlite_version(*)
|
3
3
|
[1m[36m (1.7ms)[0m [1mCREATE INDEX "index_syncs_on_destination" ON "syncs" ("destination")[0m
|
4
|
-
[1m[35m (0.
|
4
|
+
[1m[35m (0.2ms)[0m SELECT sql
|
5
5
|
FROM sqlite_master
|
6
6
|
WHERE name='index_syncs_on_destination' AND type='index'
|
7
7
|
UNION ALL
|
@@ -9,14 +9,14 @@
|
|
9
9
|
FROM sqlite_temp_master
|
10
10
|
WHERE name='index_syncs_on_destination' AND type='index'
|
11
11
|
|
12
|
-
[1m[36m (1.
|
13
|
-
[1m[35m (1.
|
14
|
-
[1m[36m (1.
|
12
|
+
[1m[36m (1.7ms)[0m [1mCREATE INDEX "index_syncs_on_subject_id_and_subject_type_and_destination" ON "syncs" ("subject_id", "subject_type", "destination")[0m
|
13
|
+
[1m[35m (1.8ms)[0m CREATE TABLE "schema_migrations" ("version" varchar NOT NULL)
|
14
|
+
[1m[36m (1.6ms)[0m [1mCREATE UNIQUE INDEX "unique_schema_migrations" ON "schema_migrations" ("version")[0m
|
15
15
|
[1m[35m (0.1ms)[0m SELECT version FROM "schema_migrations"
|
16
16
|
[1m[36m (1.3ms)[0m [1mINSERT INTO "schema_migrations" (version) VALUES ('20160225141153')[0m
|
17
|
-
[1m[36mActiveRecord::SchemaMigration Load (0.
|
18
|
-
[1m[35m (0.
|
17
|
+
[1m[36mActiveRecord::SchemaMigration Load (0.2ms)[0m [1mSELECT "schema_migrations".* FROM "schema_migrations"[0m
|
18
|
+
[1m[35m (0.2ms)[0m begin transaction
|
19
19
|
------------------------------
|
20
20
|
SyncableModelsTest: test_truth
|
21
21
|
------------------------------
|
22
|
-
[1m[36m (0.
|
22
|
+
[1m[36m (0.1ms)[0m [1mrollback transaction[0m
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: syncable_models
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.9
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Serafim Nenarokov
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-03-
|
11
|
+
date: 2016-03-23 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activerecord
|
@@ -69,7 +69,8 @@ dependencies:
|
|
69
69
|
description: The gem provides tagged syncing functionality and API methods.
|
70
70
|
email:
|
71
71
|
- serafim.nenarokov@flant.ru
|
72
|
-
executables:
|
72
|
+
executables:
|
73
|
+
- import
|
73
74
|
extensions: []
|
74
75
|
extra_rdoc_files: []
|
75
76
|
files:
|
@@ -77,6 +78,7 @@ files:
|
|
77
78
|
- README.md
|
78
79
|
- Rakefile
|
79
80
|
- app/models/syncable_models/sync.rb
|
81
|
+
- bin/import
|
80
82
|
- config/routes.rb
|
81
83
|
- db/migrate/20160225141153_create_syncs.rb
|
82
84
|
- lib/generators/syncable_models/import_config_generator.rb
|
@@ -85,8 +87,8 @@ files:
|
|
85
87
|
- lib/syncable_models/active_record.rb
|
86
88
|
- lib/syncable_models/controller.rb
|
87
89
|
- lib/syncable_models/engine.rb
|
90
|
+
- lib/syncable_models/importer.rb
|
88
91
|
- lib/syncable_models/version.rb
|
89
|
-
- lib/syncable_models_importer.rb
|
90
92
|
- lib/tasks/syncable_models_tasks.rake
|
91
93
|
- test/dummy/README.rdoc
|
92
94
|
- test/dummy/Rakefile
|
@@ -1,84 +0,0 @@
|
|
1
|
-
require 'faraday'
|
2
|
-
|
3
|
-
module SyncableModelsImporter
|
4
|
-
class Import
|
5
|
-
attr_accessor :api_url, :api_key, :destination
|
6
|
-
attr_reader :models
|
7
|
-
|
8
|
-
def initialize
|
9
|
-
@models = {}
|
10
|
-
end
|
11
|
-
|
12
|
-
def import_model(class_name, args = {})
|
13
|
-
class_name = class_name.to_s if class_name.is_a?(Class)
|
14
|
-
fetch_path = args[:fetch_path] || class_name.underscore.pluralize
|
15
|
-
sync_path = args[:sync_path] || "sync_" + class_name.underscore.pluralize
|
16
|
-
id_key = args[:id_key] || :uuid
|
17
|
-
@models[class_name] = {
|
18
|
-
fetch_path: fetch_path,
|
19
|
-
sync_path: sync_path,
|
20
|
-
id_key: id_key
|
21
|
-
}
|
22
|
-
end
|
23
|
-
|
24
|
-
def api_url
|
25
|
-
@api_url[-1] == '/' ? @api_url : @api_url + "/"
|
26
|
-
end
|
27
|
-
|
28
|
-
def params_with_api_key(params)
|
29
|
-
params.merge!(key: api_key) if api_key
|
30
|
-
params
|
31
|
-
end
|
32
|
-
|
33
|
-
def import
|
34
|
-
@models.each do |model_name, params|
|
35
|
-
fetch_url = self.api_url + params[:fetch_path]
|
36
|
-
sync_url = self.api_url + params[:sync_path]
|
37
|
-
|
38
|
-
conn = Faraday.new(url: fetch_url)
|
39
|
-
response = conn.get '', params_with_api_key(destination: destination)
|
40
|
-
|
41
|
-
if response.success?
|
42
|
-
response = JSON.parse(response.body)
|
43
|
-
|
44
|
-
if response["status"].to_i == 401
|
45
|
-
puts "[SyncableModelsImporter] Wrong api key!"
|
46
|
-
end
|
47
|
-
|
48
|
-
if response['objects'] && response['objects'].count > 0
|
49
|
-
klass = model_name.constantize
|
50
|
-
synced_ids = []
|
51
|
-
|
52
|
-
response['objects'].each do |o|
|
53
|
-
result = klass.from_import_hash(o)
|
54
|
-
puts "[SyncableModelsImporter] Importing #{model_name} (id=#{o[params[:id_key].to_s]}): #{ result ? 'OK' : 'FAIL' }"
|
55
|
-
synced_ids << o[params[:id_key].to_s] if result
|
56
|
-
end
|
57
|
-
|
58
|
-
if synced_ids.any?
|
59
|
-
conn = Faraday.new(url: sync_url)
|
60
|
-
response = conn.get '', params_with_api_key(destination: self.destination, ids: synced_ids)
|
61
|
-
end
|
62
|
-
end
|
63
|
-
end
|
64
|
-
end
|
65
|
-
end
|
66
|
-
end
|
67
|
-
|
68
|
-
mattr_accessor :imports
|
69
|
-
@@imports = []
|
70
|
-
|
71
|
-
def self.config
|
72
|
-
yield self
|
73
|
-
end
|
74
|
-
|
75
|
-
def self.add_import
|
76
|
-
import = Import.new
|
77
|
-
yield import
|
78
|
-
@@imports << import
|
79
|
-
end
|
80
|
-
|
81
|
-
def self.import
|
82
|
-
@@imports.each &:import
|
83
|
-
end
|
84
|
-
end
|