activeadmin-async_exporter 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/lib/active_admin/async_exporter.rb +21 -0
- data/lib/active_admin/async_exporter/config.rb +25 -0
- data/lib/active_admin/async_exporter/reports/dsl.rb +67 -0
- data/lib/active_admin/async_exporter/reports/worker.rb +73 -0
- data/lib/active_admin/async_exporter/services/aws_s3_service.rb +44 -0
- data/lib/active_admin/async_exporter/services/disk_service.rb +40 -0
- data/lib/active_admin/async_exporter/services/storage_service.rb +20 -0
- data/lib/active_admin/async_exporter/version.rb +7 -0
- data/lib/activeadmin-async_exporter.rb +3 -0
- data/lib/generators/active_admin/async_exporter/config/config_generator.rb +13 -0
- data/lib/generators/active_admin/async_exporter/config/templates/async_exporter_config.rb.tt +15 -0
- data/lib/generators/active_admin/async_exporter/install/install_generator.rb +56 -0
- data/lib/generators/active_admin/async_exporter/install/templates/admin_report.rb.tt +7 -0
- data/lib/generators/active_admin/async_exporter/install/templates/admin_reports.rb.tt +53 -0
- data/lib/generators/active_admin/async_exporter/install/templates/migration.rb.tt +15 -0
- metadata +159 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 8e9c289aefbcaad8af51ff0246db57904394a35f
|
4
|
+
data.tar.gz: 447a795995d280e8108aa4a59fd40ed4328f5a4b
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 873deb4aad5fea35066b3611980ef38ad9aaa6618521b8a3084772a662a276792857689bdd6ec3654a08f69e713d45df4ae383e4f19b4bd2fbdec5d72178f030
|
7
|
+
data.tar.gz: '09b210f28ea23c0e74ed46cf35734091489a6fb645d4958eca1e936159ff5d676dc10934763178631e37760cc2104a054bdca2751ec32521c274d78e1e952917'
|
@@ -0,0 +1,21 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'active_admin'
|
4
|
+
|
5
|
+
require 'active_admin/async_exporter/version'
|
6
|
+
require 'active_admin/async_exporter/config'
|
7
|
+
require 'active_admin/async_exporter/reports/dsl'
|
8
|
+
require 'active_admin/async_exporter/reports/worker'
|
9
|
+
require 'active_admin/async_exporter/services/storage_service'
|
10
|
+
require 'active_admin/async_exporter/services/disk_service'
|
11
|
+
require 'active_admin/async_exporter/services/aws_s3_service'
|
12
|
+
|
13
|
+
module ActiveAdmin
|
14
|
+
module AsyncExporter
|
15
|
+
class Railtie < ::Rails::Railtie
|
16
|
+
config.after_initialize do
|
17
|
+
ActiveAdmin::ResourceDSL.include ActiveAdmin::AsyncExporter::Reports::DSL
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module ActiveAdmin
|
4
|
+
module AsyncExporter
|
5
|
+
class << self
|
6
|
+
def configure
|
7
|
+
yield config
|
8
|
+
end
|
9
|
+
|
10
|
+
def config
|
11
|
+
@config ||= Config.new
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
class Config
|
16
|
+
attr_accessor :service, :aws_bucket_name, :aws_bucket_folder_path, :disk_folder_path
|
17
|
+
|
18
|
+
def initialize
|
19
|
+
@aws_bucket_name = nil
|
20
|
+
@aws_bucket_folder_path = nil
|
21
|
+
@disk_folder_path = nil
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,67 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module ActiveAdmin
|
4
|
+
module AsyncExporter
|
5
|
+
module Reports
|
6
|
+
module DSL
|
7
|
+
attr_reader :csv_fields
|
8
|
+
|
9
|
+
def csv_async(decorate_model: false, file_name: nil)
|
10
|
+
@csv_fields ||= {}
|
11
|
+
|
12
|
+
yield
|
13
|
+
|
14
|
+
csv_report(columns: csv_fields, decorate_model: decorate_model, file_name: file_name)
|
15
|
+
end
|
16
|
+
|
17
|
+
def csv_column(column_name, column_value = nil, &block)
|
18
|
+
column_value ||= column_name
|
19
|
+
|
20
|
+
column_value = block.source if block_given?
|
21
|
+
|
22
|
+
raise ActiveAdmin::AsyncExporter::Error, 'No argument given' if block_given? &&
|
23
|
+
block.parameters.blank?
|
24
|
+
|
25
|
+
csv_fields[column_name.to_sym] = { block: block_given?, value: column_value.to_s }
|
26
|
+
end
|
27
|
+
|
28
|
+
def csv_report(columns:, decorate_model: false, file_name: nil)
|
29
|
+
action_item :download_csv, only: :index do
|
30
|
+
link_to 'Download CSV',
|
31
|
+
{ action: :download_csv, params: params.to_enum.to_h },
|
32
|
+
method: :post,
|
33
|
+
data: { confirm: 'Are you sure you want to generate this report?' }
|
34
|
+
end
|
35
|
+
|
36
|
+
collection_action :download_csv, method: :post do
|
37
|
+
admin_report = AdminReport.create!(
|
38
|
+
author_id: current_admin_user.id,
|
39
|
+
entity: current_collection.name,
|
40
|
+
status: :pending
|
41
|
+
)
|
42
|
+
|
43
|
+
options = {
|
44
|
+
admin_report_id: admin_report.id,
|
45
|
+
controller: self.class.name,
|
46
|
+
columns: columns,
|
47
|
+
decorate_model: decorate_model,
|
48
|
+
file_name: file_name,
|
49
|
+
query: params['q']
|
50
|
+
}
|
51
|
+
|
52
|
+
ActiveAdmin::AsyncExporter::Worker.perform_later(options)
|
53
|
+
redirect_to admin_admin_report_path(admin_report)
|
54
|
+
end
|
55
|
+
|
56
|
+
controller do
|
57
|
+
def current_collection
|
58
|
+
scoped_collection
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
class Error < ActiveAdmin::Error; end
|
66
|
+
end
|
67
|
+
end
|
@@ -0,0 +1,73 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module ActiveAdmin
|
4
|
+
module AsyncExporter
|
5
|
+
class Worker < ApplicationJob
|
6
|
+
def perform(options = {})
|
7
|
+
controller = options[:controller].classify.constantize.new
|
8
|
+
columns = options[:columns]
|
9
|
+
file_name = filename(options[:file_name], controller)
|
10
|
+
|
11
|
+
path = Rails.root.join('tmp', file_name)
|
12
|
+
|
13
|
+
CSV.open(path, 'wb', headers: true) do |csv|
|
14
|
+
build_csv(csv, columns, controller, options)
|
15
|
+
end
|
16
|
+
|
17
|
+
file = Services::StorageService.call(path: path, name: file_name).store
|
18
|
+
AdminReport.find(options[:admin_report_id]).update_attributes!(
|
19
|
+
status: :ready,
|
20
|
+
location_url: file.url
|
21
|
+
)
|
22
|
+
end
|
23
|
+
|
24
|
+
private
|
25
|
+
|
26
|
+
def proc_from_string(code_string)
|
27
|
+
proc_string = code_from_string(code_string)
|
28
|
+
Proc.class_eval("proc #{proc_string}")
|
29
|
+
end
|
30
|
+
|
31
|
+
def code_from_string(code_string)
|
32
|
+
code_string.scan(%r{/(do|{)\s+(\|.*\|)(.*)(end|})/m}).flatten.join('')
|
33
|
+
end
|
34
|
+
|
35
|
+
def collection(controller, options)
|
36
|
+
controller.current_collection.ransack(options[:query]).result
|
37
|
+
end
|
38
|
+
|
39
|
+
def filename(file_name, controller)
|
40
|
+
file_name ||= controller.current_collection.name.pluralize.downcase
|
41
|
+
[file_name, Time.current.to_i].join('_') + '.csv'
|
42
|
+
end
|
43
|
+
|
44
|
+
def build_csv(csv, columns, controller, options)
|
45
|
+
headers = columns.keys
|
46
|
+
evaluators = columns.values
|
47
|
+
|
48
|
+
csv << headers.map(&:to_s)
|
49
|
+
|
50
|
+
collection(controller, options).find_in_batches do |group|
|
51
|
+
group.each do |model|
|
52
|
+
model = model.decorate if options[:decorate_model]
|
53
|
+
|
54
|
+
csv << csv_field_value(model, evaluators)
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
def csv_field_value(model, evaluators)
|
60
|
+
evaluators.collect do |ev|
|
61
|
+
value = ev[:value]
|
62
|
+
|
63
|
+
if ev[:block]
|
64
|
+
code_proc = proc_from_string(value)
|
65
|
+
code_proc.yield(model)
|
66
|
+
else
|
67
|
+
model.send(value)
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
73
|
+
end
|
@@ -0,0 +1,44 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module ActiveAdmin
|
4
|
+
module AsyncExporter
|
5
|
+
module Services
|
6
|
+
class AwsS3Service
|
7
|
+
attr_accessor :file, :s3, :bucket, :object
|
8
|
+
|
9
|
+
def initialize(file)
|
10
|
+
@file = file
|
11
|
+
@s3 = Aws::S3::Resource.new
|
12
|
+
@bucket = s3.bucket(ActiveAdmin::AsyncExporter.config.aws_bucket_name)
|
13
|
+
end
|
14
|
+
|
15
|
+
def store
|
16
|
+
@object = bucket.object(filename)
|
17
|
+
object.upload_file(Pathname.new(file[:path]), { acl: 'public-read' })
|
18
|
+
self
|
19
|
+
end
|
20
|
+
|
21
|
+
def url
|
22
|
+
object.public_url.to_s
|
23
|
+
end
|
24
|
+
|
25
|
+
def delete
|
26
|
+
bucket.delete_objects({ delete: { objects: [{ key: filename }] } })
|
27
|
+
end
|
28
|
+
|
29
|
+
private
|
30
|
+
|
31
|
+
def filename
|
32
|
+
@filename ||= "#{bucket_folder}#{file[:name]}"
|
33
|
+
end
|
34
|
+
|
35
|
+
def bucket_folder
|
36
|
+
path = ActiveAdmin::AsyncExporter.config.aws_bucket_folder_path
|
37
|
+
return '' if path.blank?
|
38
|
+
|
39
|
+
"#{path}/"
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module ActiveAdmin
|
4
|
+
module AsyncExporter
|
5
|
+
module Services
|
6
|
+
class DiskService
|
7
|
+
attr_accessor :file, :folder
|
8
|
+
|
9
|
+
def initialize(file)
|
10
|
+
@file = file
|
11
|
+
@folder = ActiveAdmin::AsyncExporter.config.disk_folder_path
|
12
|
+
end
|
13
|
+
|
14
|
+
def store
|
15
|
+
make_dir
|
16
|
+
@object = IO.copy_stream(file[:path], filename)
|
17
|
+
self
|
18
|
+
end
|
19
|
+
|
20
|
+
def url
|
21
|
+
filename
|
22
|
+
end
|
23
|
+
|
24
|
+
def delete
|
25
|
+
File.delete(filename)
|
26
|
+
end
|
27
|
+
|
28
|
+
private
|
29
|
+
|
30
|
+
def make_dir
|
31
|
+
FileUtils.mkdir_p(folder)
|
32
|
+
end
|
33
|
+
|
34
|
+
def filename
|
35
|
+
@filename ||= "#{folder}/#{file[:name]}"
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module ActiveAdmin
|
4
|
+
module AsyncExporter
|
5
|
+
module Services
|
6
|
+
class StorageService
|
7
|
+
private_class_method :new
|
8
|
+
|
9
|
+
def self.call(*args)
|
10
|
+
case ActiveAdmin::AsyncExporter.config.service
|
11
|
+
when :amazon
|
12
|
+
Services::AwsS3Service.new(*args)
|
13
|
+
else
|
14
|
+
Services::DiskService.new(*args)
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
module ActiveAdmin
|
2
|
+
module AsyncExporter
|
3
|
+
module Generators
|
4
|
+
class ConfigGenerator < Rails::Generators::Base
|
5
|
+
source_root File.join(__dir__, 'templates')
|
6
|
+
|
7
|
+
def copy_config_file
|
8
|
+
template 'async_exporter_config.rb', 'config/initializers/activeadmin-async_exporter.rb'
|
9
|
+
end
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
ActiveAdmin::AsyncExporter.configure do |config|
|
4
|
+
## Storage Service
|
5
|
+
# The available options are :local, :amazon
|
6
|
+
# default option: :local
|
7
|
+
# config.service = :local
|
8
|
+
|
9
|
+
## AWS S3
|
10
|
+
# config.aws_bucket_name = nil
|
11
|
+
# config.aws_bucket_folder_path = nil
|
12
|
+
|
13
|
+
## Disk
|
14
|
+
config.disk_folder_path = Rails.root.join('exporter')
|
15
|
+
end
|
@@ -0,0 +1,56 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'rails/generators/active_record'
|
4
|
+
|
5
|
+
module ActiveAdmin
|
6
|
+
module AsyncExporter
|
7
|
+
module Generators
|
8
|
+
class InstallGenerator < Rails::Generators::Base
|
9
|
+
include ActiveRecord::Generators::Migration
|
10
|
+
|
11
|
+
argument :user_class, type: :string, default: 'User'
|
12
|
+
|
13
|
+
source_root File.join(__dir__, 'templates')
|
14
|
+
|
15
|
+
def configure
|
16
|
+
create_admin_reports_migration
|
17
|
+
create_admin_reports_model
|
18
|
+
create_active_admin_view
|
19
|
+
end
|
20
|
+
|
21
|
+
private
|
22
|
+
|
23
|
+
def create_admin_reports_migration
|
24
|
+
migration_template(
|
25
|
+
'migration.rb',
|
26
|
+
'db/migrate/add_admin_reports.rb',
|
27
|
+
user_table_name: user_table_name
|
28
|
+
)
|
29
|
+
end
|
30
|
+
|
31
|
+
def create_admin_reports_model
|
32
|
+
template(
|
33
|
+
'admin_report.rb',
|
34
|
+
'app/models/admin_report.rb',
|
35
|
+
user_class: user_class
|
36
|
+
)
|
37
|
+
end
|
38
|
+
|
39
|
+
def create_active_admin_view
|
40
|
+
template(
|
41
|
+
'admin_reports.rb',
|
42
|
+
'app/admin/admin_reports.rb'
|
43
|
+
)
|
44
|
+
end
|
45
|
+
|
46
|
+
def user_class_name
|
47
|
+
user_class.underscore.singularize
|
48
|
+
end
|
49
|
+
|
50
|
+
def user_table_name
|
51
|
+
user_class_name.pluralize
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
@@ -0,0 +1,53 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
# encoding: utf-8
|
3
|
+
|
4
|
+
require 'open-uri'
|
5
|
+
|
6
|
+
ActiveAdmin.register AdminReport do
|
7
|
+
actions :index, :show, :destroy
|
8
|
+
|
9
|
+
filter :entity
|
10
|
+
filter :format
|
11
|
+
filter :created_at
|
12
|
+
filter :location_url
|
13
|
+
|
14
|
+
index do
|
15
|
+
id_column
|
16
|
+
column :author
|
17
|
+
column :entity
|
18
|
+
column :format
|
19
|
+
column :status
|
20
|
+
column :file do |report|
|
21
|
+
link_to 'Download CSV', download_file_admin_admin_report_path(report) if report.ready?
|
22
|
+
end
|
23
|
+
column :created_at
|
24
|
+
|
25
|
+
actions
|
26
|
+
end
|
27
|
+
|
28
|
+
show do
|
29
|
+
attributes_table_for(admin_report) do
|
30
|
+
row :id
|
31
|
+
row :author
|
32
|
+
row :entity
|
33
|
+
row :format
|
34
|
+
row 'Status' do
|
35
|
+
status_tag (admin_report.ready? ? 'green' : 'orange'), label: admin_report.status
|
36
|
+
end
|
37
|
+
row :file do
|
38
|
+
link_to 'Download CSV', download_file_admin_admin_report_path if admin_report.ready?
|
39
|
+
end
|
40
|
+
row :created_at
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
member_action :download_file, method: :get do
|
45
|
+
send_data(open(resource.location_url).read, disposition: 'attachment', filename: /(?!.*\/).+/.match(resource.location_url)[0])
|
46
|
+
end
|
47
|
+
|
48
|
+
controller do
|
49
|
+
def scoped_collection
|
50
|
+
AdminReport.includes(:author)
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
class <%= migration_class_name %> < ActiveRecord::Migration[<%= ActiveRecord::Migration.current_version %>]
|
2
|
+
def change
|
3
|
+
create_table :admin_reports do |t|
|
4
|
+
t.references :author
|
5
|
+
t.foreign_key :<%= user_table_name %>, column: :author_id, primary_key: 'id'
|
6
|
+
|
7
|
+
t.string :entity, null: false
|
8
|
+
t.string :format, null: false, default: :csv
|
9
|
+
t.integer :status, null: false
|
10
|
+
t.string :location_url
|
11
|
+
|
12
|
+
t.timestamps
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
metadata
ADDED
@@ -0,0 +1,159 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: activeadmin-async_exporter
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Franco Pariani
|
8
|
+
- Horacio Bertorello
|
9
|
+
- Ricardo Cortio
|
10
|
+
autorequire:
|
11
|
+
bindir: bin
|
12
|
+
cert_chain: []
|
13
|
+
date: 2019-10-09 00:00:00.000000000 Z
|
14
|
+
dependencies:
|
15
|
+
- !ruby/object:Gem::Dependency
|
16
|
+
name: activeadmin
|
17
|
+
requirement: !ruby/object:Gem::Requirement
|
18
|
+
requirements:
|
19
|
+
- - ">="
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: 1.0.0.pre1
|
22
|
+
type: :runtime
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
25
|
+
requirements:
|
26
|
+
- - ">="
|
27
|
+
- !ruby/object:Gem::Version
|
28
|
+
version: 1.0.0.pre1
|
29
|
+
- !ruby/object:Gem::Dependency
|
30
|
+
name: aws-sdk-s3
|
31
|
+
requirement: !ruby/object:Gem::Requirement
|
32
|
+
requirements:
|
33
|
+
- - "~>"
|
34
|
+
- !ruby/object:Gem::Version
|
35
|
+
version: '1'
|
36
|
+
type: :runtime
|
37
|
+
prerelease: false
|
38
|
+
version_requirements: !ruby/object:Gem::Requirement
|
39
|
+
requirements:
|
40
|
+
- - "~>"
|
41
|
+
- !ruby/object:Gem::Version
|
42
|
+
version: '1'
|
43
|
+
- !ruby/object:Gem::Dependency
|
44
|
+
name: rails
|
45
|
+
requirement: !ruby/object:Gem::Requirement
|
46
|
+
requirements:
|
47
|
+
- - ">="
|
48
|
+
- !ruby/object:Gem::Version
|
49
|
+
version: 1.0.0
|
50
|
+
type: :runtime
|
51
|
+
prerelease: false
|
52
|
+
version_requirements: !ruby/object:Gem::Requirement
|
53
|
+
requirements:
|
54
|
+
- - ">="
|
55
|
+
- !ruby/object:Gem::Version
|
56
|
+
version: 1.0.0
|
57
|
+
- !ruby/object:Gem::Dependency
|
58
|
+
name: rspec
|
59
|
+
requirement: !ruby/object:Gem::Requirement
|
60
|
+
requirements:
|
61
|
+
- - "~>"
|
62
|
+
- !ruby/object:Gem::Version
|
63
|
+
version: 3.9.0
|
64
|
+
type: :development
|
65
|
+
prerelease: false
|
66
|
+
version_requirements: !ruby/object:Gem::Requirement
|
67
|
+
requirements:
|
68
|
+
- - "~>"
|
69
|
+
- !ruby/object:Gem::Version
|
70
|
+
version: 3.9.0
|
71
|
+
- !ruby/object:Gem::Dependency
|
72
|
+
name: rubocop-rails
|
73
|
+
requirement: !ruby/object:Gem::Requirement
|
74
|
+
requirements:
|
75
|
+
- - "~>"
|
76
|
+
- !ruby/object:Gem::Version
|
77
|
+
version: '2.3'
|
78
|
+
type: :development
|
79
|
+
prerelease: false
|
80
|
+
version_requirements: !ruby/object:Gem::Requirement
|
81
|
+
requirements:
|
82
|
+
- - "~>"
|
83
|
+
- !ruby/object:Gem::Version
|
84
|
+
version: '2.3'
|
85
|
+
- !ruby/object:Gem::Dependency
|
86
|
+
name: rubocop-rootstrap
|
87
|
+
requirement: !ruby/object:Gem::Requirement
|
88
|
+
requirements:
|
89
|
+
- - "~>"
|
90
|
+
- !ruby/object:Gem::Version
|
91
|
+
version: 0.1.0
|
92
|
+
type: :development
|
93
|
+
prerelease: false
|
94
|
+
version_requirements: !ruby/object:Gem::Requirement
|
95
|
+
requirements:
|
96
|
+
- - "~>"
|
97
|
+
- !ruby/object:Gem::Version
|
98
|
+
version: 0.1.0
|
99
|
+
- !ruby/object:Gem::Dependency
|
100
|
+
name: simplecov
|
101
|
+
requirement: !ruby/object:Gem::Requirement
|
102
|
+
requirements:
|
103
|
+
- - "~>"
|
104
|
+
- !ruby/object:Gem::Version
|
105
|
+
version: 0.17.1
|
106
|
+
type: :development
|
107
|
+
prerelease: false
|
108
|
+
version_requirements: !ruby/object:Gem::Requirement
|
109
|
+
requirements:
|
110
|
+
- - "~>"
|
111
|
+
- !ruby/object:Gem::Version
|
112
|
+
version: 0.17.1
|
113
|
+
description: Async exporter for Active Admin using ActiveJob
|
114
|
+
email: franco@rootstrap.com
|
115
|
+
executables: []
|
116
|
+
extensions: []
|
117
|
+
extra_rdoc_files: []
|
118
|
+
files:
|
119
|
+
- lib/active_admin/async_exporter.rb
|
120
|
+
- lib/active_admin/async_exporter/config.rb
|
121
|
+
- lib/active_admin/async_exporter/reports/dsl.rb
|
122
|
+
- lib/active_admin/async_exporter/reports/worker.rb
|
123
|
+
- lib/active_admin/async_exporter/services/aws_s3_service.rb
|
124
|
+
- lib/active_admin/async_exporter/services/disk_service.rb
|
125
|
+
- lib/active_admin/async_exporter/services/storage_service.rb
|
126
|
+
- lib/active_admin/async_exporter/version.rb
|
127
|
+
- lib/activeadmin-async_exporter.rb
|
128
|
+
- lib/generators/active_admin/async_exporter/config/config_generator.rb
|
129
|
+
- lib/generators/active_admin/async_exporter/config/templates/async_exporter_config.rb.tt
|
130
|
+
- lib/generators/active_admin/async_exporter/install/install_generator.rb
|
131
|
+
- lib/generators/active_admin/async_exporter/install/templates/admin_report.rb.tt
|
132
|
+
- lib/generators/active_admin/async_exporter/install/templates/admin_reports.rb.tt
|
133
|
+
- lib/generators/active_admin/async_exporter/install/templates/migration.rb.tt
|
134
|
+
homepage: https://rubygems.org/gems/activeadmin-async_exporter
|
135
|
+
licenses:
|
136
|
+
- MIT
|
137
|
+
metadata:
|
138
|
+
source_code_uri: https://github.com/rootstrap/activeadmin-async_exporter
|
139
|
+
post_install_message:
|
140
|
+
rdoc_options: []
|
141
|
+
require_paths:
|
142
|
+
- lib
|
143
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
144
|
+
requirements:
|
145
|
+
- - ">="
|
146
|
+
- !ruby/object:Gem::Version
|
147
|
+
version: '0'
|
148
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
149
|
+
requirements:
|
150
|
+
- - ">="
|
151
|
+
- !ruby/object:Gem::Version
|
152
|
+
version: '0'
|
153
|
+
requirements: []
|
154
|
+
rubyforge_project:
|
155
|
+
rubygems_version: 2.5.2.3
|
156
|
+
signing_key:
|
157
|
+
specification_version: 4
|
158
|
+
summary: Async exporter for Active Admin using ActiveJob
|
159
|
+
test_files: []
|