sp2db 0.0.3

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.
@@ -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: []