bulky 0.9.1 → 2.0.0
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 +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
|
+
[](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
|