bulky 0.9.1 → 2.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +18 -4
- data/Rakefile +16 -10
- data/app/controllers/bulky/updates_controller.rb +10 -8
- data/app/helpers/bulky/form_helper.rb +1 -1
- data/app/models/bulky/bulk_update.rb +0 -8
- data/app/views/bulky/updates/edit.html.haml +1 -1
- data/db/migrate/{20120911145530_create_bulky_tables.rb → 20150817161700_create_bulky_tables.rb} +3 -8
- data/lib/bulky.rb +3 -1
- data/lib/bulky/engine.rb +1 -5
- data/lib/bulky/model.rb +14 -0
- data/lib/bulky/updater.rb +21 -20
- data/lib/bulky/version.rb +1 -1
- data/lib/bulky/worker.rb +14 -0
- metadata +27 -38
- data/lib/tasks/bulky_tasks.rake +0 -11
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 999ba588ee91221f137ec28ba41c87dbb6175abf
|
4
|
+
data.tar.gz: 8bb0db2a47673d74a37931ced4af31f798bde1a1
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 8ce5fe1e6170abf327e8157b29236f303c7e91d469247540d087b328c892771bb1e34ba9c497c04fee4b414fed2887d0a622c7988c4bef5f6f3c677c08b2b674
|
7
|
+
data.tar.gz: 33b23828b38639dda4db435bec6a32ca37da8faa299f32b1e6ff0c8c7d625dd704722648af701f498ffa9f96ea74c718439df7b82e949bf3fb60b2571d24a8b7
|
data/README.md
CHANGED
@@ -1,18 +1,31 @@
|
|
1
1
|
# Bulky
|
2
2
|
|
3
|
+
[![Circle CI](https://circleci.com/gh/tma1/bulky.svg?style=svg)](https://circleci.com/gh/tma1/bulky)
|
4
|
+
|
3
5
|
## Installation
|
4
6
|
|
5
|
-
In your Gemfile
|
7
|
+
In your Gemfile use one of the following
|
6
8
|
``` ruby
|
7
|
-
gem 'bulky',
|
9
|
+
gem 'bulky', '~> 2.0.0'
|
10
|
+
# or
|
11
|
+
gem 'bulky', github: 'tma1/bulky'
|
12
|
+
# or in bash run
|
13
|
+
git submodule add git@github.com:tma1/bulky.git vendor/bulky
|
14
|
+
# then add to your gemfile
|
15
|
+
gem 'bulky', path: 'vendor/bulky'
|
16
|
+
# users add a submodule (aka path...) need to run
|
17
|
+
git submodule init --update
|
18
|
+
```
|
19
|
+
```bash
|
8
20
|
```
|
21
|
+
Then edit your
|
9
22
|
|
10
23
|
Then in your shell prompt
|
11
24
|
```bash
|
12
25
|
bundle
|
13
26
|
rake bulky_engine:install:migrations
|
14
27
|
rake db:migrate
|
15
|
-
|
28
|
+
sidekiq
|
16
29
|
```
|
17
30
|
|
18
31
|
## Usage
|
@@ -27,4 +40,5 @@ Command Line
|
|
27
40
|
Bulky.enqueue_update(Account, [10,25], {"contact" => "Yes, please."})
|
28
41
|
```
|
29
42
|
|
30
|
-
This will enqueue the `Bulky::Updater` to update each account when the job is
|
43
|
+
This will enqueue the `Bulky::Updater` to update each account when the job is
|
44
|
+
processed by Sidekiq
|
data/Rakefile
CHANGED
@@ -1,17 +1,10 @@
|
|
1
|
-
#!/usr/bin/env rake
|
2
|
-
|
3
1
|
begin
|
4
2
|
require 'bundler/setup'
|
5
3
|
rescue LoadError
|
6
4
|
puts 'You must `gem install bundler` and `bundle install` to run rake tasks'
|
7
5
|
end
|
8
|
-
|
9
|
-
|
10
|
-
rescue LoadError
|
11
|
-
require 'rdoc/rdoc'
|
12
|
-
require 'rake/rdoctask'
|
13
|
-
RDoc::Task = Rake::RDocTask
|
14
|
-
end
|
6
|
+
|
7
|
+
require 'rdoc/task'
|
15
8
|
|
16
9
|
RDoc::Task.new(:rdoc) do |rdoc|
|
17
10
|
rdoc.rdoc_dir = 'rdoc'
|
@@ -21,8 +14,21 @@ RDoc::Task.new(:rdoc) do |rdoc|
|
|
21
14
|
rdoc.rdoc_files.include('lib/**/*.rb')
|
22
15
|
end
|
23
16
|
|
17
|
+
APP_RAKEFILE = File.expand_path("../spec/dummy/Rakefile", __FILE__)
|
18
|
+
load 'rails/tasks/engine.rake'
|
24
19
|
|
25
|
-
|
20
|
+
# load 'rails/tasks/statistics.rake'
|
26
21
|
|
27
22
|
Bundler::GemHelper.install_tasks
|
28
23
|
|
24
|
+
# require 'rake/testtask'
|
25
|
+
|
26
|
+
# Rake::TestTask.new(:test) do |t|
|
27
|
+
# t.libs << 'lib'
|
28
|
+
# t.libs << 'test'
|
29
|
+
# t.pattern = 'test/**/*_test.rb'
|
30
|
+
# t.verbose = false
|
31
|
+
# end
|
32
|
+
|
33
|
+
|
34
|
+
# task default: :test
|
@@ -1,7 +1,5 @@
|
|
1
1
|
class Bulky::UpdatesController < ApplicationController
|
2
2
|
|
3
|
-
helper_method :model
|
4
|
-
|
5
3
|
def edit
|
6
4
|
end
|
7
5
|
|
@@ -18,20 +16,24 @@ class Bulky::UpdatesController < ApplicationController
|
|
18
16
|
redirect_to bulky_edit_path(model: params[:model]), notice: I18n.t('flash.notice.enqueue_update')
|
19
17
|
end
|
20
18
|
|
19
|
+
def params
|
20
|
+
@params ||= delete_blank(super)
|
21
|
+
end
|
22
|
+
|
21
23
|
private
|
22
24
|
|
23
|
-
def
|
24
|
-
|
25
|
+
helper_method def model_name
|
26
|
+
params.require(:model)
|
27
|
+
end
|
28
|
+
|
29
|
+
helper_method def model
|
30
|
+
@model ||= model_name.classify.constantize
|
25
31
|
end
|
26
32
|
|
27
33
|
def ids
|
28
34
|
Bulky.parse_ids(params[:ids])
|
29
35
|
end
|
30
36
|
|
31
|
-
def params
|
32
|
-
@params ||= delete_blank(super)
|
33
|
-
end
|
34
|
-
|
35
37
|
def delete_blank(hash)
|
36
38
|
hash.delete_if { |k,v| v.empty? or Hash === v && delete_blank(v).empty? }
|
37
39
|
end
|
@@ -7,12 +7,4 @@ class Bulky::BulkUpdate < ActiveRecord::Base
|
|
7
7
|
validates :ids, :updates, presence: true
|
8
8
|
|
9
9
|
has_many :updated_records, class_name: 'Bulky::UpdatedRecord', foreign_key: :bulk_update_id
|
10
|
-
|
11
|
-
validates_each :updates do |record, attr, value|
|
12
|
-
record.errors[:updates] << "must be a hash" unless Hash === value
|
13
|
-
end
|
14
|
-
|
15
|
-
validates_each :ids do |record, attr, value|
|
16
|
-
record.errors[:ids] << "must be an Array" unless Array === value
|
17
|
-
end
|
18
10
|
end
|
@@ -1,6 +1,6 @@
|
|
1
1
|
%h1 Bulky
|
2
2
|
|
3
|
-
= form_for :bulk, url: bulky_update_path(model:
|
3
|
+
= form_for :bulk, url: bulky_update_path(model: model_name), html: {method: :put} do |f|
|
4
4
|
%p
|
5
5
|
= f.select :attribute, whitelisted_attributes_collection(model), {include_blank: "Choose an Attribute"},
|
6
6
|
name: "attribute", onchange: "document.getElementById('bulk_value').name = 'bulk[' + this.value + ']'"
|
data/db/migrate/{20120911145530_create_bulky_tables.rb → 20150817161700_create_bulky_tables.rb}
RENAMED
@@ -1,11 +1,11 @@
|
|
1
1
|
class CreateBulkyTables < ActiveRecord::Migration
|
2
|
-
def
|
2
|
+
def change
|
3
3
|
create_table :bulky_bulk_updates, force: true do |t|
|
4
4
|
t.text :ids, null: false
|
5
5
|
t.text :updates, null: false
|
6
6
|
t.integer :initiated_by_id
|
7
7
|
|
8
|
-
t.timestamps
|
8
|
+
t.timestamps null: false
|
9
9
|
end
|
10
10
|
add_index :bulky_bulk_updates, :initiated_by_id
|
11
11
|
|
@@ -17,14 +17,9 @@ class CreateBulkyTables < ActiveRecord::Migration
|
|
17
17
|
t.string :error_message
|
18
18
|
t.text :error_backtrace
|
19
19
|
|
20
|
-
t.timestamps
|
20
|
+
t.timestamps null: false
|
21
21
|
end
|
22
22
|
add_index :bulky_updated_records, :bulk_update_id
|
23
23
|
add_index :bulky_updated_records, [:updatable_type, :updatable_id]
|
24
24
|
end
|
25
|
-
|
26
|
-
def down
|
27
|
-
drop_table :bulky_updated_records
|
28
|
-
drop_table :bulky_bulk_updates
|
29
|
-
end
|
30
25
|
end
|
data/lib/bulky.rb
CHANGED
@@ -7,7 +7,7 @@ module Bulky
|
|
7
7
|
bulk_update = log_bulk_update(ids, updates)
|
8
8
|
|
9
9
|
ids.each do |update_id|
|
10
|
-
|
10
|
+
Bulky::Worker.perform_async model.name, update_id, bulk_update.id
|
11
11
|
end
|
12
12
|
end
|
13
13
|
|
@@ -24,4 +24,6 @@ module Bulky
|
|
24
24
|
|
25
25
|
end
|
26
26
|
|
27
|
+
require 'bulky/model'
|
27
28
|
require 'bulky/updater'
|
29
|
+
require 'bulky/worker'
|
data/lib/bulky/engine.rb
CHANGED
@@ -1,11 +1,7 @@
|
|
1
1
|
require 'haml'
|
2
|
-
require '
|
2
|
+
require 'sidekiq'
|
3
3
|
|
4
4
|
module Bulky
|
5
5
|
class Engine < ::Rails::Engine
|
6
|
-
initializer "bulky.engine.queue_name" do |app|
|
7
|
-
Bulky::Updater::QUEUE = :"#{app.class.parent_name.underscore}_bulky_updates"
|
8
|
-
Bulky::Updater.instance_variable_set(:@queue, Bulky::Updater::QUEUE)
|
9
|
-
end
|
10
6
|
end
|
11
7
|
end
|
data/lib/bulky/model.rb
ADDED
data/lib/bulky/updater.rb
CHANGED
@@ -1,34 +1,35 @@
|
|
1
1
|
module Bulky
|
2
2
|
class Updater
|
3
3
|
|
4
|
-
|
5
|
-
model = model_name.constantize.find(update_id)
|
6
|
-
new(model, bulk_update_id).update!
|
7
|
-
end
|
4
|
+
attr_reader :model, :bulk_update
|
8
5
|
|
9
6
|
def initialize(model, bulk_update_id)
|
10
7
|
@bulk_update = Bulky::BulkUpdate.find(bulk_update_id)
|
11
8
|
@model = model
|
12
|
-
@updates = @bulk_update.updates
|
13
9
|
end
|
14
10
|
|
15
|
-
def
|
16
|
-
@
|
17
|
-
|
11
|
+
def log
|
12
|
+
@log ||= bulk_update.updated_records.build { |r| r.updatable = model }
|
13
|
+
end
|
18
14
|
|
19
|
-
|
20
|
-
|
21
|
-
@log.updatable_changes = @model.changes
|
22
|
-
@model.save!
|
23
|
-
rescue => e
|
24
|
-
@log.error_message = e.message
|
25
|
-
@log.error_backtrace = e.backtrace.join("\n")
|
26
|
-
raise e
|
27
|
-
ensure
|
28
|
-
@log.save!
|
29
|
-
end
|
30
|
-
end
|
15
|
+
def strong_updates
|
16
|
+
ActionController::Parameters.new(bulk_update.updates)
|
31
17
|
end
|
32
18
|
|
19
|
+
def updates
|
20
|
+
@updates ||= strong_updates.permit(*model.bulky_attributes)
|
21
|
+
end
|
22
|
+
|
23
|
+
def update!
|
24
|
+
model.attributes = updates
|
25
|
+
log.updatable_changes = model.changes
|
26
|
+
model.save!
|
27
|
+
rescue => e
|
28
|
+
log.error_message = e.message
|
29
|
+
log.error_backtrace = e.backtrace.join("\n")
|
30
|
+
raise e
|
31
|
+
ensure
|
32
|
+
log.save!
|
33
|
+
end
|
33
34
|
end
|
34
35
|
end
|
data/lib/bulky/version.rb
CHANGED
data/lib/bulky/worker.rb
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
module Bulky
|
2
|
+
class Worker
|
3
|
+
QUEUE = ENV.fetch('BULKY_QUEUE', 'default').freeze
|
4
|
+
|
5
|
+
include Sidekiq::Worker
|
6
|
+
sidekiq_options queue: QUEUE
|
7
|
+
|
8
|
+
def perform(model_name, update_id, bulk_update_id)
|
9
|
+
model = model_name.constantize.find(update_id)
|
10
|
+
Bulky::Updater.new(model, bulk_update_id).update!
|
11
|
+
end
|
12
|
+
|
13
|
+
end
|
14
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,15 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: bulky
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 2.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Adam Hunter
|
8
|
+
- Ben Vandgrift
|
8
9
|
autorequire:
|
9
10
|
bindir: bin
|
10
11
|
cert_chain: []
|
11
|
-
date:
|
12
|
+
date: 2015-08-18 00:00:00.000000000 Z
|
12
13
|
dependencies:
|
13
14
|
- !ruby/object:Gem::Dependency
|
14
15
|
name: rails
|
@@ -16,44 +17,44 @@ dependencies:
|
|
16
17
|
requirements:
|
17
18
|
- - "~>"
|
18
19
|
- !ruby/object:Gem::Version
|
19
|
-
version:
|
20
|
+
version: 4.2.0
|
20
21
|
type: :runtime
|
21
22
|
prerelease: false
|
22
23
|
version_requirements: !ruby/object:Gem::Requirement
|
23
24
|
requirements:
|
24
25
|
- - "~>"
|
25
26
|
- !ruby/object:Gem::Version
|
26
|
-
version:
|
27
|
+
version: 4.2.0
|
27
28
|
- !ruby/object:Gem::Dependency
|
28
|
-
name:
|
29
|
+
name: sidekiq
|
29
30
|
requirement: !ruby/object:Gem::Requirement
|
30
31
|
requirements:
|
31
32
|
- - "~>"
|
32
33
|
- !ruby/object:Gem::Version
|
33
|
-
version:
|
34
|
+
version: 3.4.2
|
34
35
|
type: :runtime
|
35
36
|
prerelease: false
|
36
37
|
version_requirements: !ruby/object:Gem::Requirement
|
37
38
|
requirements:
|
38
39
|
- - "~>"
|
39
40
|
- !ruby/object:Gem::Version
|
40
|
-
version:
|
41
|
+
version: 3.4.2
|
41
42
|
- !ruby/object:Gem::Dependency
|
42
43
|
name: haml
|
43
44
|
requirement: !ruby/object:Gem::Requirement
|
44
45
|
requirements:
|
45
46
|
- - ">="
|
46
47
|
- !ruby/object:Gem::Version
|
47
|
-
version: '
|
48
|
+
version: '4.0'
|
48
49
|
type: :runtime
|
49
50
|
prerelease: false
|
50
51
|
version_requirements: !ruby/object:Gem::Requirement
|
51
52
|
requirements:
|
52
53
|
- - ">="
|
53
54
|
- !ruby/object:Gem::Version
|
54
|
-
version: '
|
55
|
+
version: '4.0'
|
55
56
|
- !ruby/object:Gem::Dependency
|
56
|
-
name:
|
57
|
+
name: pry
|
57
58
|
requirement: !ruby/object:Gem::Requirement
|
58
59
|
requirements:
|
59
60
|
- - ">="
|
@@ -67,66 +68,53 @@ dependencies:
|
|
67
68
|
- !ruby/object:Gem::Version
|
68
69
|
version: '0'
|
69
70
|
- !ruby/object:Gem::Dependency
|
70
|
-
name:
|
71
|
+
name: sqlite3
|
71
72
|
requirement: !ruby/object:Gem::Requirement
|
72
73
|
requirements:
|
73
|
-
- - "
|
74
|
+
- - ">="
|
74
75
|
- !ruby/object:Gem::Version
|
75
|
-
version: 0
|
76
|
+
version: '0'
|
76
77
|
type: :development
|
77
78
|
prerelease: false
|
78
79
|
version_requirements: !ruby/object:Gem::Requirement
|
79
80
|
requirements:
|
80
|
-
- - "
|
81
|
+
- - ">="
|
81
82
|
- !ruby/object:Gem::Version
|
82
|
-
version: 0
|
83
|
+
version: '0'
|
83
84
|
- !ruby/object:Gem::Dependency
|
84
85
|
name: rspec-rails
|
85
86
|
requirement: !ruby/object:Gem::Requirement
|
86
87
|
requirements:
|
87
88
|
- - "~>"
|
88
89
|
- !ruby/object:Gem::Version
|
89
|
-
version:
|
90
|
-
type: :development
|
91
|
-
prerelease: false
|
92
|
-
version_requirements: !ruby/object:Gem::Requirement
|
93
|
-
requirements:
|
94
|
-
- - "~>"
|
95
|
-
- !ruby/object:Gem::Version
|
96
|
-
version: 2.11.0
|
97
|
-
- !ruby/object:Gem::Dependency
|
98
|
-
name: capybara
|
99
|
-
requirement: !ruby/object:Gem::Requirement
|
100
|
-
requirements:
|
101
|
-
- - "~>"
|
102
|
-
- !ruby/object:Gem::Version
|
103
|
-
version: 1.1.2
|
90
|
+
version: 3.3.3
|
104
91
|
type: :development
|
105
92
|
prerelease: false
|
106
93
|
version_requirements: !ruby/object:Gem::Requirement
|
107
94
|
requirements:
|
108
95
|
- - "~>"
|
109
96
|
- !ruby/object:Gem::Version
|
110
|
-
version:
|
97
|
+
version: 3.3.3
|
111
98
|
- !ruby/object:Gem::Dependency
|
112
99
|
name: database_cleaner
|
113
100
|
requirement: !ruby/object:Gem::Requirement
|
114
101
|
requirements:
|
115
102
|
- - ">="
|
116
103
|
- !ruby/object:Gem::Version
|
117
|
-
version:
|
104
|
+
version: 1.4.1
|
118
105
|
type: :development
|
119
106
|
prerelease: false
|
120
107
|
version_requirements: !ruby/object:Gem::Requirement
|
121
108
|
requirements:
|
122
109
|
- - ">="
|
123
110
|
- !ruby/object:Gem::Version
|
124
|
-
version:
|
111
|
+
version: 1.4.1
|
125
112
|
description: Bulky allows you bulk update your ActiveRecord models. It will enqueue
|
126
113
|
the bulk update and run it through the model's lifecycle to ensure validation are
|
127
114
|
performed. Bulky also provides logging of bulk update success or failure.
|
128
115
|
email:
|
129
|
-
- adamhunter@
|
116
|
+
- adamhunter@tma1.com
|
117
|
+
- ben@tma1.com
|
130
118
|
executables: []
|
131
119
|
extensions: []
|
132
120
|
extra_rdoc_files: []
|
@@ -141,13 +129,14 @@ files:
|
|
141
129
|
- app/views/bulky/updates/edit.html.haml
|
142
130
|
- config/locales/en.yml
|
143
131
|
- config/routes.rb
|
144
|
-
- db/migrate/
|
132
|
+
- db/migrate/20150817161700_create_bulky_tables.rb
|
145
133
|
- lib/bulky.rb
|
146
134
|
- lib/bulky/engine.rb
|
135
|
+
- lib/bulky/model.rb
|
147
136
|
- lib/bulky/updater.rb
|
148
137
|
- lib/bulky/version.rb
|
149
|
-
- lib/
|
150
|
-
homepage: https://github.com/
|
138
|
+
- lib/bulky/worker.rb
|
139
|
+
homepage: https://github.com/tma1/bulky
|
151
140
|
licenses: []
|
152
141
|
metadata: {}
|
153
142
|
post_install_message:
|
@@ -166,7 +155,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
166
155
|
version: '0'
|
167
156
|
requirements: []
|
168
157
|
rubyforge_project:
|
169
|
-
rubygems_version: 2.
|
158
|
+
rubygems_version: 2.4.6
|
170
159
|
signing_key:
|
171
160
|
specification_version: 4
|
172
161
|
summary: Bulk update your ActiveRecord models.
|
data/lib/tasks/bulky_tasks.rake
DELETED
@@ -1,11 +0,0 @@
|
|
1
|
-
load "tasks/resque.rake"
|
2
|
-
|
3
|
-
namespace :bulky do
|
4
|
-
task :setup do
|
5
|
-
ENV['QUEUE'] = Bulky::Updater::QUEUE.to_s
|
6
|
-
ENV['BACKGROUND'] = true.to_s
|
7
|
-
end
|
8
|
-
|
9
|
-
desc "start a bulky queue worker (in the background)"
|
10
|
-
task :work => [:environment, :setup, :"resque:work"]
|
11
|
-
end
|