sp2db 0.0.3

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,171 @@
1
+ module Sp2db
2
+ class ModelTable < BaseTable
3
+
4
+ attr_accessor :model,
5
+ :import_strategy
6
+
7
+ def initialize opts={}
8
+ if opts[:name].blank? && opts[:model].present?
9
+ opts[:name] = opts[:model].table_name.to_sym
10
+ end
11
+
12
+ super opts
13
+
14
+ if self.model.blank?
15
+ if opts[:name].present? && model = self.class.model_find_by(name: opts[:name]) \
16
+ || opts[:sheet_name].present? && model = self.class.model_find_by(sheet_name: opts[:sheet_name])
17
+ self.model = model
18
+ end
19
+ end
20
+
21
+ raise "Model cannot be nil" unless self.model.present?
22
+ end
23
+
24
+ def active_record?
25
+ true
26
+ end
27
+
28
+ def model=m
29
+ raise "Invalid arguments" unless m && m < ActiveRecord::Base
30
+ self.class.add_models m
31
+ @model = m
32
+ end
33
+
34
+ def config
35
+ model.try(:sp2db_config) || super
36
+ end
37
+
38
+ # Table name
39
+ def name
40
+ @name ||= model.table_name.to_sym
41
+ end
42
+
43
+ def import_strategy
44
+ return @import_strategy if @import_strategy.present?
45
+ strategy_name = config[:import_strategy] ||
46
+ Sp2db.config.import_strategy
47
+ @import_strategy = ImportStrategy.strategy_by_name(strategy_name)
48
+ end
49
+
50
+ def priority
51
+ @priority ||= config[:priority] || 0
52
+ end
53
+
54
+ def to_db data, strategy: nil
55
+ strategy = strategy.present? ? ImportStrategy.strategy_by_name : import_strategy
56
+ strategy = strategy.new self, data
57
+ res = strategy.import
58
+ end
59
+
60
+ def sp_to_db opts={}
61
+ data = self.sp_data
62
+ if Sp2db.config.download_before_import
63
+ write_csv to_csv(data)
64
+ end
65
+ to_db data, opts
66
+ end
67
+
68
+ def csv_to_db opts={}
69
+ to_db csv_data, opts
70
+ end
71
+
72
+
73
+ def before_import_row *args, &block
74
+ call_model_sp2db_method __method__, *args, &block
75
+ end
76
+
77
+ def after_import_row *args, &block
78
+ call_model_sp2db_method __method__, *args, &block
79
+ end
80
+
81
+ def after_import_table *args, &block
82
+ call_model_sp2db_method __method__, *args, &block
83
+ end
84
+
85
+ # Tranform data to standard csv format
86
+ def data_transform *args, &block
87
+ if (data = call_model_sp2db_method __method__, *args, &block).present?
88
+ data
89
+ else
90
+ super *args, &block
91
+ end
92
+ end
93
+
94
+ def call_process_data *args, &block
95
+ data = if (method = config[:process_data]).is_a?(Symbol)
96
+ call_model_sp2db_method :process_data, *args, &block
97
+ else
98
+ super *args, &block
99
+ end
100
+ data
101
+ end
102
+
103
+ private
104
+
105
+ def call_model_sp2db_method method_name, *args, &block
106
+ if (method = config[method_name.to_sym]).present?
107
+ if method.is_a?(Proc)
108
+ method.call(*args, &block)
109
+ else
110
+ model.send method, *args, &block
111
+ end
112
+ end
113
+ end
114
+
115
+ class << self
116
+
117
+ def all_models
118
+ @all_models ||= {}.with_indifferent_access
119
+ end
120
+
121
+ def model_find_by name: nil, sheet_name: nil
122
+ if name.present?
123
+ all_models[name]
124
+ elsif sheet_name.present?
125
+ all_models.values.find do |model|
126
+ model.try(:sp2db_sheet_name) == sheet_name
127
+ end
128
+ else
129
+ raise "Invalid arguments"
130
+ end
131
+ end
132
+
133
+ def add_models *models
134
+ models.each do |m|
135
+ m = Object.const_get(m) if m.is_a?(String) || m.is_a?(Symbol)
136
+ raise "Invalid model" unless m.is_a?(Class) && m < ActiveRecord::Base
137
+ self.all_models[m.table_name] ||= m
138
+ end
139
+ end
140
+
141
+ def all_tables
142
+ all_models.map do |name, model|
143
+ self.new name: name, model: model
144
+ end.sort_by(&:priority)
145
+ end
146
+
147
+ def sp_to_db *table_names
148
+ to_db table_by_names(*table_names), :sp
149
+ end
150
+
151
+ def csv_to_db *table_names
152
+ to_db table_by_names(*table_names), :csv
153
+ end
154
+
155
+ def to_db tables, source=:sp
156
+ res = []
157
+ ActiveRecord::Base.transaction(requires_new: true) do
158
+ tables.each do |tb|
159
+ begin
160
+ res << tb.send("#{source}_to_db")
161
+ rescue ActiveRecord::ActiveRecordError => e
162
+ next if ExceptionHandler.table_import_error(e)
163
+ end
164
+ end
165
+ end
166
+
167
+ res
168
+ end
169
+ end
170
+ end
171
+ end
@@ -0,0 +1,17 @@
1
+ module Sp2db
2
+ class NonModelTable < BaseTable
3
+
4
+ def config
5
+ @config ||= Sp2db.config.non_model_tables[self.name] || super
6
+ end
7
+
8
+ class << self
9
+ def all_tables
10
+ Sp2db.config.non_model_tables.map do |name, config|
11
+ self.new name: name
12
+ end
13
+ end
14
+ end
15
+
16
+ end
17
+ end
@@ -0,0 +1,19 @@
1
+ module Sp2db
2
+ class Spreadsheet
3
+
4
+ attr_accessor :sheet
5
+
6
+ def initialize sheet
7
+ self.sheet = sheet
8
+ end
9
+
10
+ def worksheets
11
+ sheet.worksheets.index_by(&:title).with_indifferent_access
12
+ end
13
+
14
+ def worksheet_by_name ws_name
15
+ sheet.worksheet_by_title ws_name
16
+ end
17
+
18
+ end
19
+ end
@@ -0,0 +1,3 @@
1
+ module Sp2db
2
+ VERSION = "0.0.3"
3
+ end
data/lib/sp2db.rb ADDED
@@ -0,0 +1,55 @@
1
+ require "google_drive"
2
+ require "sp2db/logging"
3
+
4
+ require "sp2db/config"
5
+ require "sp2db/client"
6
+ require "sp2db/exception_handler"
7
+ require "sp2db/import_strategy"
8
+ require "sp2db/base_table"
9
+ require "sp2db/non_model_table"
10
+ require "sp2db/model_table"
11
+ require "sp2db/spreadsheet"
12
+ require "sp2db/import_concern"
13
+ require "sp2db/version"
14
+
15
+ module Sp2db
16
+
17
+ include Logging
18
+ extend self
19
+
20
+ # @!attribute [rw] config
21
+ def config
22
+ @config ||= Config.new
23
+ yield @config if block_given?
24
+ Rails.application.eager_load!
25
+ @config
26
+ end
27
+
28
+ # Reload all configs and sessions
29
+ def reload!
30
+ @client = nil
31
+ end
32
+
33
+ # return [Gclient]
34
+ def client c=nil
35
+ Client.new
36
+ end
37
+
38
+ # Default sheet
39
+ def spreadsheet
40
+ client.spreadsheet Sp2db.config.spreadsheet_id
41
+ end
42
+
43
+ delegate :sp_to_csv,
44
+ :sp_to_db,
45
+ :csv_to_db,
46
+ to: BaseTable
47
+ end
48
+
49
+ class Railtie < Rails::Railtie
50
+ railtie_name :sp2db
51
+
52
+ rake_tasks do
53
+ load "tasks/sp2db.rake"
54
+ end
55
+ end
@@ -0,0 +1,12 @@
1
+ namespace :sp2db do
2
+ [
3
+ :sp_to_csv,
4
+ :sp_to_db,
5
+ :csv_to_db
6
+ ].each do |meth|
7
+ task meth => :environment do |task, args|
8
+ tables = args.extras
9
+ Sp2db.send meth, *tables
10
+ end
11
+ end
12
+ end
data/sp2db.gemspec ADDED
@@ -0,0 +1,32 @@
1
+
2
+ lib = File.expand_path("../lib", __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require "sp2db/version"
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "sp2db"
8
+ spec.version = Sp2db::VERSION
9
+ spec.authors = ["KhiemNS"]
10
+ spec.email = ["khiemns.k54@gmail.com.com"]
11
+
12
+ spec.summary = "Google Spreadsheet importer for Rails app."
13
+ spec.description = "Google Spreadsheet importer for Rails app."
14
+ spec.homepage = "https://github.com/khiemns54/sp2db"
15
+ spec.license = "MIT"
16
+
17
+
18
+ spec.files = `git ls-files -z`.split("\x0").reject do |f|
19
+ f.match(%r{^(test|spec|features)/})
20
+ end
21
+
22
+ spec.require_paths = ["lib"]
23
+
24
+ spec.add_dependency "rails", "~> 5.0"
25
+ spec.add_dependency "google_drive", "~> 2.1"
26
+ spec.add_dependency "google-api-client", "~> 0.11"
27
+
28
+ spec.add_development_dependency "bundler", "~> 1.16"
29
+ spec.add_development_dependency "rake", "~> 10.0"
30
+ spec.add_development_dependency "minitest", "~> 5.0"
31
+
32
+ end
metadata ADDED
@@ -0,0 +1,153 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: sp2db
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.3
5
+ platform: ruby
6
+ authors:
7
+ - KhiemNS
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2018-07-30 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: rails
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '5.0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '5.0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: google_drive
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '2.1'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '2.1'
41
+ - !ruby/object:Gem::Dependency
42
+ name: google-api-client
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '0.11'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '0.11'
55
+ - !ruby/object:Gem::Dependency
56
+ name: bundler
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '1.16'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '1.16'
69
+ - !ruby/object:Gem::Dependency
70
+ name: rake
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: '10.0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: '10.0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: minitest
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: '5.0'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - "~>"
95
+ - !ruby/object:Gem::Version
96
+ version: '5.0'
97
+ description: Google Spreadsheet importer for Rails app.
98
+ email:
99
+ - khiemns.k54@gmail.com.com
100
+ executables: []
101
+ extensions: []
102
+ extra_rdoc_files: []
103
+ files:
104
+ - ".gitignore"
105
+ - ".travis.yml"
106
+ - CODE_OF_CONDUCT.md
107
+ - Gemfile
108
+ - Gemfile.lock
109
+ - LICENSE
110
+ - LICENSE.txt
111
+ - README.md
112
+ - Rakefile
113
+ - lib/generators/sp2db/config_generator.rb
114
+ - lib/generators/sp2db/templates/sp2db.rb
115
+ - lib/sp2db.rb
116
+ - lib/sp2db/base_table.rb
117
+ - lib/sp2db/client.rb
118
+ - lib/sp2db/config.rb
119
+ - lib/sp2db/exception_handler.rb
120
+ - lib/sp2db/import_concern.rb
121
+ - lib/sp2db/import_strategy.rb
122
+ - lib/sp2db/logging.rb
123
+ - lib/sp2db/model_table.rb
124
+ - lib/sp2db/non_model_table.rb
125
+ - lib/sp2db/spreadsheet.rb
126
+ - lib/sp2db/version.rb
127
+ - lib/tasks/sp2db.rake
128
+ - sp2db.gemspec
129
+ homepage: https://github.com/khiemns54/sp2db
130
+ licenses:
131
+ - MIT
132
+ metadata: {}
133
+ post_install_message:
134
+ rdoc_options: []
135
+ require_paths:
136
+ - lib
137
+ required_ruby_version: !ruby/object:Gem::Requirement
138
+ requirements:
139
+ - - ">="
140
+ - !ruby/object:Gem::Version
141
+ version: '0'
142
+ required_rubygems_version: !ruby/object:Gem::Requirement
143
+ requirements:
144
+ - - ">="
145
+ - !ruby/object:Gem::Version
146
+ version: '0'
147
+ requirements: []
148
+ rubyforge_project:
149
+ rubygems_version: 2.5.1
150
+ signing_key:
151
+ specification_version: 4
152
+ summary: Google Spreadsheet importer for Rails app.
153
+ test_files: []