active_admin_importer 0.1.0 → 0.1.1

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: c4469bf0e26ddf3c84800aed672a1729c0893b06
4
- data.tar.gz: b85ef234d5ed264bb327f2d4936a79e245032827
3
+ metadata.gz: 63ec9935374bfd592cc9c2035ce8304660ca4e1b
4
+ data.tar.gz: 5674df2b7741e145b0b6d128397170cfb64ed11e
5
5
  SHA512:
6
- metadata.gz: 8f84bb74980ef292b9946ec7bf1105f81ff1ee574becf5389e41e317d38d2a6d9623d1de016a26f00233781e2f0daee81f51795336f6ebe8dd3e02c318322dfb
7
- data.tar.gz: d6d117b5e3f695b6f56d17c30676961e661457b76aff559244fac8db8cdf72fd31a202fb226d8aab401901b2f49c42a021de5e665b74a8adaeeebbdc1eb41bfb
6
+ metadata.gz: be21e9b80705a71d7fcdda60bf34cdf0057b9ffe06a9e45301e19f41b6fb0349f6a0a14dfbd7f05a187d1e2fb136a491723714b7be2c10fc4ea42ea34594a759
7
+ data.tar.gz: 4d08eaf02625782de3537837cf5357091835f4129064cd044c06ab099df9e2247c6be3a34e9289c91018b86f9918c8d47c31b7c2fba012c4730a5be548007157
data/README.md CHANGED
@@ -12,27 +12,61 @@ Simple CSV imports for active_admin, that (shouldn't) destroy your servers memor
12
12
 
13
13
  ``` ruby
14
14
  ::ActiveAdmin.register Product do
15
- define_import_for :products do |model, import_params, controller|
16
- product_attributes = import_params.slice(*[:name, :price])
17
- product_attributes[:user_id] = controller.current_user.id
18
- model.create!(product_attributes)
15
+ define_import_for :products do
16
+ each_row do |params, import|
17
+ product_attributes = params.slice(*[:name, :price])
18
+ product_attributes[:user_id] = import.controller.current_user.id
19
+ import.model.create!(product_attributes)
20
+ end
19
21
  end
20
22
 
21
23
  #Example: require headers to be present
22
- define_import_for :products_on_sale, :required_headers => ["sale_price"] do |model, import_params, controller|
23
- product_attributes = import_params.slice(*[:name, :price, :sale_price])
24
- product_attributes[:user_id] = controller.current_user.id
25
- model.create!(product_attributes)
24
+ define_import_for :products_on_sale do
25
+ required_headers "sale_price", "price"
26
+
27
+ each_row do |params, import|
28
+ product_attributes = params.slice(*[:name, :price, :sale_price])
29
+ product_attributes[:user_id] = import.controller.current_user.id
30
+ import.model.create!(product_attributes)
31
+ end
26
32
  end
27
33
 
28
34
  # Example: using a custom view
29
35
  # assume the view has a dropdown which allows you to select a particular store during import
30
- define_import_for :products_for_store, :view => "myactiveadmin/products/upload_products_for_store_csv"
31
- do |model, import_params, controller|
32
- product_attributes = import_params.slice(*[:name, :price, :sale_price])
33
- product_attributes[:user_id] = controller.current_user.id
34
- product_attributes[:store_id] = controller.params["store_id"]
35
- model.create!(product_attributes)
36
+ define_import_for :products_for_store do
37
+ view "myactiveadmin/products/upload_products_for_store_csv"
38
+
39
+ each_row do |params, import|
40
+ product_attributes = params.slice(*[:name, :price, :sale_price])
41
+ product_attributes[:user_id] = import.controller.current_user.id
42
+ product_attributes[:store_id] = import.controller.params["store_id"]
43
+ import.model.create!(product_attributes)
44
+ end
45
+ end
46
+
47
+ # Example: using a Trax::Core transformer class,
48
+ # or transformer that responds to to_hash
49
+ define_import_for :products_for_store do
50
+ view "myactiveadmin/products/upload_products_for_store_csv"
51
+ transformer ::ProductForStoreTransformer
52
+
53
+ each_row do |params, import|
54
+ product_attributes[:user_id] = import.controller.current_user.id
55
+ product_attributes[:store_id] = import.controller.params["store_id"]
56
+ import.model.create!(product_attributes)
57
+ end
58
+ end
59
+
60
+ # Example: using transform as callback
61
+ define_import_for :products_for_store do
62
+ view "myactiveadmin/products/upload_products_for_store_csv"
63
+ transform { |row| ::ProductForStoreTransformer.new(row).to_hash }
64
+
65
+ each_row do |params, import|
66
+ product_attributes[:user_id] = import.controller.current_user.id
67
+ product_attributes[:store_id] = import.controller.params["store_id"]
68
+ import.model.create!(product_attributes)
69
+ end
36
70
  end
37
71
  end
38
72
  ```
@@ -1,14 +1,17 @@
1
1
  require "active_admin_importer/version"
2
2
  require "active_support/all"
3
3
  require "active_admin_importer/engine"
4
+ require "pry"
4
5
 
5
6
  module ActiveAdminImporter
6
7
  extend ::ActiveSupport::Autoload
7
8
 
9
+ autoload :Definition
8
10
  autoload :DSL
9
11
  autoload :Engine
10
12
  autoload :CsvFile
11
13
  autoload :Import
14
+ autoload :Registry
12
15
 
13
16
  def self.import(csv_file, **options, &block)
14
17
  io = csv_file.is_a?(::ActionDispatch::Http::UploadedFile) ? csv_file.tempfile : csv_file
@@ -22,4 +25,21 @@ module ActiveAdminImporter
22
25
  _import.run if _import.valid?
23
26
  _import
24
27
  end
28
+
29
+ def self.[](val)
30
+ registry[val]
31
+ end
32
+
33
+ def self.registry
34
+ @registry ||= ::ActiveAdminImporter::Registry.new
35
+ end
36
+
37
+ def self.register(definition)
38
+ @registry[definition.key] = definition
39
+ end
40
+ end
41
+
42
+ unless ENV["SKIP_ACTIVE_ADMIN_REQUIRE"]
43
+ require 'activeadmin' unless defined?(::ActiveAdmin)
44
+ ::ActiveAdmin::DSL.send(:include, ActiveAdminImporter::DSL)
25
45
  end
@@ -0,0 +1,63 @@
1
+ module ActiveAdminImporter
2
+ class Definition
3
+ def initialize(_name=:records, _controller, &block)
4
+ @_name = _name
5
+ @_action = "import_#{@_name}"
6
+ @_form_action = "upload_#{@_name}"
7
+ @_view = "admin/csv/upload"
8
+ @_required_headers ||= []
9
+ @_controller = _controller
10
+ @_model = @_controller.resource_class
11
+ @_each_row = lambda{ |params| @_model.create!(params) }
12
+ self.instance_eval(&block) if block_given?
13
+ end
14
+
15
+ def [](val)
16
+ self.instance_variable_get(:"@_#{val}")
17
+ end
18
+
19
+ def action(val)
20
+ @_action = val
21
+ end
22
+
23
+ def after(&block)
24
+ @_after = block
25
+ end
26
+
27
+ def before(&block)
28
+ @_before = block
29
+ end
30
+
31
+ def key
32
+ "#{self[:controller].name.underscore}/#{self[:name]}"
33
+ end
34
+
35
+ def model(val)
36
+ @_model = val
37
+ end
38
+
39
+ def each_row(&block)
40
+ @_each_row = block
41
+ end
42
+
43
+ def form_action(val)
44
+ @_form_action = val
45
+ end
46
+
47
+ def required_headers(*_values)
48
+ @_required_headers = _values
49
+ end
50
+
51
+ def transformer(val)
52
+ @_transformer = val
53
+ end
54
+
55
+ def transform(&block)
56
+ @_transform = block
57
+ end
58
+
59
+ def view(value)
60
+ @_view = value
61
+ end
62
+ end
63
+ end
@@ -1,29 +1,23 @@
1
1
  module ActiveAdminImporter
2
2
  module DSL
3
- def define_import_for(name='records', **options, &block)
4
- options[:action] ||= "import_#{name}"
5
- options[:form_action] ||= "upload_#{name}"
6
- options[:view] ||= "admin/csv/upload"
7
- options[:required_headers] ||= []
3
+ def define_import_for(name='records', &block)
4
+ definition = ::ActiveAdminImporter::Definition.new(name, self.controller, &block)
8
5
 
9
6
  action_item :edit, :only => :index do
10
- link_to options[:action].titleize, :action => options[:form_action]
7
+ link_to definition[:action].titleize, :action => definition[:form_action]
11
8
  end
12
9
 
13
- collection_action(options[:form_action]) do
14
- render options[:view], :locals => { :target_action => options[:action] }
10
+ collection_action(definition[:form_action]) do
11
+ render definition[:view], :locals => { :target_action => definition[:action] }
15
12
  end
16
13
 
17
- collection_action(options[:action], :method => :post) do
14
+ collection_action(definition[:action], :method => :post) do
18
15
  parent if parent?
19
- import = ::ActiveAdminImporter.import(params[:dump][:file],
20
- :model => active_admin_config.resource_class,
21
- :controller => self,
22
- :required_headers => options[:required_headers],
23
- &block)
24
-
16
+ import = ::ActiveAdminImporter.import(params[:dump][:file], :controller => self, :definition => definition)
25
17
  redirect_to collection_path(), alert: import.result
26
18
  end
19
+
20
+ ::ActiveAdminImporter.register(definition)
27
21
  end
28
22
  end
29
23
  end
@@ -3,10 +3,5 @@ require 'rails'
3
3
  module ActiveAdminImporter
4
4
  class Engine < ::Rails::Engine
5
5
  config.mount_at = '/'
6
-
7
- config.after_initialize do
8
- require "active_admin"
9
- ::ActiveAdmin::DSL.send(:include, ActiveAdminImporter::DSL)
10
- end
11
6
  end
12
7
  end
@@ -1,14 +1,14 @@
1
1
  module ActiveAdminImporter
2
2
  class Import
3
- attr_reader :current_row, :csv_file
3
+ attr_reader :controller, :current_row, :csv_file, :definition, :model
4
4
 
5
- def initialize(csv_file, controller:, model:, required_headers:[], &block)
5
+ def initialize(csv_file, definition:, controller:)
6
6
  @csv_file = ::ActiveAdminImporter::CsvFile.new(csv_file)
7
7
  @controller = controller
8
- @model = model
9
- @required_headers = required_headers
8
+ @definition = definition
9
+ @model = definition[:model]
10
+ @required_headers = definition[:required_headers]
10
11
  @current_row = 0
11
- @block = block if block_given?
12
12
  end
13
13
 
14
14
  def failed_rows
@@ -19,7 +19,12 @@ module ActiveAdminImporter
19
19
  @headers ||= @csv_file.headers
20
20
  end
21
21
 
22
+ def md5
23
+ @md5 ||= @csv_file.md5
24
+ end
25
+
22
26
  def run
27
+ run_before_callback if run_before_callback?
23
28
  log_info("STARTING IMPORT")
24
29
 
25
30
  ::CSV.parse(@csv_file, :headers => true, :header_converters => :symbol) do |row|
@@ -32,6 +37,7 @@ module ActiveAdminImporter
32
37
 
33
38
  log_error("FAILED TO PARSE ROWS #{failed_rows}") if failed_rows.any?
34
39
  log_info("FINISHED IMPORT")
40
+ run_after_callback if run_after_callback?
35
41
  end
36
42
 
37
43
  def result
@@ -50,17 +56,23 @@ module ActiveAdminImporter
50
56
 
51
57
  private
52
58
 
59
+ def log_error(message)
60
+ ::Rails.logger.error("[IMPORT: #{self.md5}]: #{message}")
61
+ end
62
+
63
+ def log_info(message)
64
+ ::Rails.logger.info("[IMPORT: #{self.md5}]: #{message}")
65
+ end
66
+
53
67
  def process_row(row)
54
68
  @current_row += 1
55
69
  log_info("IMPORTING ROW - #{current_row}")
56
70
  data = row.to_hash
57
71
 
58
72
  if data.present?
59
- if @block
60
- @block.call(@model, data, @controller)
61
- else
62
- @model.create!(data)
63
- end
73
+ data = @definition[:transformer].new(data).to_hash if @definition[:transformer]
74
+ data = @definition[:transform].call(data) if @definition[:transform]
75
+ @definition[:each_row].call(data, self)
64
76
  end
65
77
  end
66
78
 
@@ -71,12 +83,20 @@ module ActiveAdminImporter
71
83
  ::Rails.logger.error(e.message)
72
84
  end
73
85
 
74
- def log_error(message)
75
- ::Rails.logger.error("[IMPORT: #{@csv_file.md5}]: #{message}")
86
+ def run_after_callback
87
+ self.instance_eval(&@definition[:after])
76
88
  end
77
89
 
78
- def log_info(message)
79
- ::Rails.logger.info("[IMPORT: #{@csv_file.md5}]: #{message}")
90
+ def run_after_callback?
91
+ @definition[:after]
92
+ end
93
+
94
+ def run_before_callback
95
+ self.instance_eval(&@definition[:before])
96
+ end
97
+
98
+ def run_before_callback?
99
+ @definition[:before]
80
100
  end
81
101
  end
82
102
  end
@@ -0,0 +1,11 @@
1
+ module ActiveAdminImporter
2
+ class Registry < SimpleDelegator
3
+ def initialize
4
+ @obj = {}
5
+ end
6
+
7
+ def [](val)
8
+ @obj[val]
9
+ end
10
+ end
11
+ end
@@ -1,3 +1,3 @@
1
1
  module ActiveAdminImporter
2
- VERSION = "0.1.0"
2
+ VERSION = "0.1.1"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: active_admin_importer
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.1.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jason Ayre
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2017-03-23 00:00:00.000000000 Z
11
+ date: 2017-04-17 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -143,9 +143,11 @@ files:
143
143
  - bin/setup
144
144
  - lib/active_admin_importer.rb
145
145
  - lib/active_admin_importer/csv_file.rb
146
+ - lib/active_admin_importer/definition.rb
146
147
  - lib/active_admin_importer/dsl.rb
147
148
  - lib/active_admin_importer/engine.rb
148
149
  - lib/active_admin_importer/import.rb
150
+ - lib/active_admin_importer/registry.rb
149
151
  - lib/active_admin_importer/version.rb
150
152
  homepage: https://github.com/jasonayre/active_admin_importer
151
153
  licenses: