delta_attributes 0.0.4 → 1.0.2
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 +7 -0
- data/README.md +1 -1
- data/delta_attributes.gemspec +8 -7
- data/lib/delta_attributes.rb +9 -2
- data/lib/{delta_attributes → delta_attributes3_2}/crud.rb +0 -0
- data/lib/{delta_attributes → delta_attributes3_2}/main.rb +6 -6
- data/lib/{delta_attributes → delta_attributes3_2}/mysql.rb +0 -0
- data/lib/delta_attributes3_2/railtie.rb +9 -0
- data/lib/{delta_attributes → delta_attributes3_2}/to_sql.rb +0 -0
- data/lib/{delta_attributes → delta_attributes3_2}/update_manager.rb +0 -0
- data/lib/{delta_attributes → delta_attributes3_2}/update_statement.rb +0 -0
- data/lib/{delta_attributes → delta_attributes3_2}/visitor.rb +0 -0
- data/lib/delta_attributes4/bind_visitor.rb +25 -0
- data/lib/delta_attributes4/main.rb +39 -0
- data/lib/delta_attributes4/persistence.rb +36 -0
- data/lib/delta_attributes4/railtie.rb +9 -0
- data/lib/{delta_attributes → shared}/version.rb +1 -1
- metadata +59 -72
- data/lib/delta_attributes/railtie.rb +0 -8
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: a71dc316af524b943bef7a6af497e90077d4c636
|
4
|
+
data.tar.gz: 44411f7fcf26f7784227866a2eefd07c63911fef
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 418d3a188bb3b6cdc36eb1d918ae3fdc4fc6493c27fbf2dd12785f188c9fd5f83e6f09ea0b7723f44cfd7802905a5f911ec55b9e743bf951a51cb74231f074a2
|
7
|
+
data.tar.gz: 5d6e5763c209d8d4eda6de700930e12afa3e544cd282cc664d5e05c57c2f5e487501b739bc9261bcf00881fd2e5eb5c8409a9ff079f4f8665f3b56c55be893a7
|
data/README.md
CHANGED
@@ -78,7 +78,7 @@ Or install it yourself as:
|
|
78
78
|
It doesn't matter as delta is calculated as difference between original value received from database and new value
|
79
79
|
before update.
|
80
80
|
|
81
|
-
Tested with rails
|
81
|
+
Tested with rails 4.0, 3.2.9, 3.2.8, 3.2.0, 3.1.0
|
82
82
|
|
83
83
|
## Contributing
|
84
84
|
|
data/delta_attributes.gemspec
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
# -*- encoding: utf-8 -*-
|
2
2
|
lib = File.expand_path('../lib', __FILE__)
|
3
3
|
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
-
require '
|
4
|
+
require 'shared/version'
|
5
5
|
|
6
6
|
Gem::Specification.new do |gem|
|
7
|
-
gem.name =
|
7
|
+
gem.name = 'delta_attributes'
|
8
8
|
gem.version = DeltaAttributes::VERSION
|
9
|
-
gem.authors = [
|
10
|
-
gem.email =
|
9
|
+
gem.authors = ['Oleh Novosad, Yuriy Lavryk, Arya']
|
10
|
+
gem.email = %w(oleh.novosad@gmail.com)
|
11
11
|
gem.description = %q{
|
12
12
|
This gem makes updating specified number fields by ActiveRecord in unusual way.
|
13
13
|
|
@@ -31,11 +31,12 @@ Gem::Specification.new do |gem|
|
|
31
31
|
Source code: https://github.com/izbor/delta_attributes
|
32
32
|
}
|
33
33
|
gem.summary = %q{ delta attributes }
|
34
|
-
gem.homepage =
|
34
|
+
gem.homepage = 'https://github.com/izbor/delta_attributes'
|
35
35
|
|
36
36
|
gem.files = `git ls-files`.split($/)
|
37
37
|
gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
|
38
38
|
gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
|
39
|
-
gem.require_paths =
|
40
|
-
gem.add_dependency
|
39
|
+
gem.require_paths = %w(lib)
|
40
|
+
gem.add_dependency 'rails', '>= 3.2'
|
41
|
+
gem.license = 'MIT'
|
41
42
|
end
|
data/lib/delta_attributes.rb
CHANGED
@@ -1,2 +1,9 @@
|
|
1
|
-
require
|
2
|
-
|
1
|
+
require 'shared/version'
|
2
|
+
|
3
|
+
if defined?(Rails)
|
4
|
+
|
5
|
+
load 'delta_attributes3_2/railtie.rb' if Rails::VERSION::MAJOR == 3
|
6
|
+
|
7
|
+
load 'delta_attributes4/railtie.rb' if Rails::VERSION::MAJOR == 4
|
8
|
+
|
9
|
+
end
|
File without changes
|
@@ -1,10 +1,10 @@
|
|
1
1
|
require 'set'
|
2
|
-
require
|
3
|
-
require
|
4
|
-
require
|
5
|
-
require
|
6
|
-
require
|
7
|
-
require
|
2
|
+
require 'delta_attributes3_2/update_statement'
|
3
|
+
require 'delta_attributes3_2/update_manager'
|
4
|
+
require 'delta_attributes3_2/to_sql'
|
5
|
+
require 'delta_attributes3_2/mysql'
|
6
|
+
require 'delta_attributes3_2/crud'
|
7
|
+
require 'delta_attributes3_2/visitor'
|
8
8
|
|
9
9
|
module ActiveRecord
|
10
10
|
# = Active Record Persistence
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
@@ -0,0 +1,25 @@
|
|
1
|
+
module Arel
|
2
|
+
module Visitors
|
3
|
+
module BindVisitor
|
4
|
+
private
|
5
|
+
|
6
|
+
def visit_Arel_Nodes_Assignment(o)
|
7
|
+
if o.right.is_a? Arel::Nodes::BindParam
|
8
|
+
if o.left && o.left.expr && o.left.expr.relation \
|
9
|
+
&& o.left.expr.relation.engine \
|
10
|
+
&& o.left.expr.relation.engine.respond_to?(:delta_attributes) \
|
11
|
+
&& o.left.expr.relation.engine.delta_attributes.include?(o.left.name)
|
12
|
+
|
13
|
+
l = visit o.left
|
14
|
+
"#{l} = #{l} + #{visit o.right}"
|
15
|
+
else
|
16
|
+
"#{visit o.left} = #{visit o.right}"
|
17
|
+
end
|
18
|
+
else
|
19
|
+
super
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
require 'delta_attributes4/bind_visitor'
|
2
|
+
require 'delta_attributes4/persistence'
|
3
|
+
|
4
|
+
module ActiveRecord
|
5
|
+
# = Active Record Persistence
|
6
|
+
module Persistence
|
7
|
+
|
8
|
+
class InvalidDeltaColumn < StandardError;
|
9
|
+
end
|
10
|
+
|
11
|
+
def self.included(base) #:nodoc:
|
12
|
+
base.extend ClassMethods
|
13
|
+
end
|
14
|
+
|
15
|
+
module ClassMethods
|
16
|
+
|
17
|
+
def delta_attributes(*args)
|
18
|
+
@_delta_attributes ||= Set.new
|
19
|
+
|
20
|
+
return @_delta_attributes if args.empty?
|
21
|
+
|
22
|
+
args.each do |attribute|
|
23
|
+
|
24
|
+
if self.columns_hash[attribute.to_s].blank?
|
25
|
+
raise InvalidDeltaColumn.new("#{self.to_s} model doesn't have attribute with name '#{attribute}.")
|
26
|
+
end
|
27
|
+
|
28
|
+
if self.columns_hash[attribute.to_s] && !self.columns_hash[attribute.to_s].number?
|
29
|
+
raise InvalidDeltaColumn.new("Delta attributes only work with number attributes, column `#{attribute}` is not a number.")
|
30
|
+
end
|
31
|
+
|
32
|
+
@_delta_attributes.add(attribute.to_s)
|
33
|
+
end
|
34
|
+
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
module ActiveRecord
|
2
|
+
# = Active Record Persistence
|
3
|
+
module Persistence
|
4
|
+
|
5
|
+
# Updates the associated record with values matching those of the instance attributes.
|
6
|
+
# Returns the number of affected rows.
|
7
|
+
def update_record(attribute_names = @attributes.keys)
|
8
|
+
attributes_with_values = arel_attributes_with_values_for_update(attribute_names)
|
9
|
+
if attributes_with_values.empty?
|
10
|
+
0
|
11
|
+
else
|
12
|
+
klass = self.class
|
13
|
+
column_hash = klass.connection.schema_cache.columns_hash klass.table_name
|
14
|
+
db_columns_with_values = attributes_with_values.map { |attr,value|
|
15
|
+
real_column = column_hash[attr.name]
|
16
|
+
|
17
|
+
v = value
|
18
|
+
if self.class.respond_to?(:delta_attributes) && self.class.delta_attributes.include?(attr.name)
|
19
|
+
if @changed_attributes.include?(attr.name)
|
20
|
+
v = value - @changed_attributes[attr.name]
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
[real_column, v]
|
25
|
+
}
|
26
|
+
bind_attrs = attributes_with_values.dup
|
27
|
+
bind_attrs.keys.each_with_index do |column, i|
|
28
|
+
real_column = db_columns_with_values[i].first
|
29
|
+
bind_attrs[column] = klass.connection.substitute_at(real_column, i)
|
30
|
+
end
|
31
|
+
stmt = klass.unscoped.where(klass.arel_table[klass.primary_key].eq(id_was || id)).arel.compile_update(bind_attrs)
|
32
|
+
klass.connection.update stmt, 'SQL', db_columns_with_values
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
metadata
CHANGED
@@ -1,49 +1,43 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: delta_attributes
|
3
|
-
version: !ruby/object:Gem::Version
|
4
|
-
|
5
|
-
prerelease:
|
6
|
-
segments:
|
7
|
-
- 0
|
8
|
-
- 0
|
9
|
-
- 4
|
10
|
-
version: 0.0.4
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 1.0.2
|
11
5
|
platform: ruby
|
12
|
-
authors:
|
13
|
-
- Oleh
|
6
|
+
authors:
|
7
|
+
- Oleh Novosad, Yuriy Lavryk, Arya
|
14
8
|
autorequire:
|
15
9
|
bindir: bin
|
16
10
|
cert_chain: []
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
dependencies:
|
21
|
-
- !ruby/object:Gem::Dependency
|
11
|
+
date: 2013-08-30 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
22
14
|
name: rails
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
- !ruby/object:Gem::Version
|
29
|
-
hash: 3
|
30
|
-
segments:
|
31
|
-
- 3
|
32
|
-
- 1
|
33
|
-
- 0
|
34
|
-
version: 3.1.0
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - '>='
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '3.2'
|
35
20
|
type: :runtime
|
36
|
-
|
37
|
-
|
38
|
-
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - '>='
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '3.2'
|
27
|
+
description: "\n This gem makes updating specified number fields by ActiveRecord
|
28
|
+
in unusual way.\n\n Instead of generating sql script to update value in usual
|
29
|
+
way like this:\n\n UPDATE users\n SET money = 10\n WHERE id = 1;\n\n
|
30
|
+
\ It replaces it with\n\n UPDATE users\n SET money = money + delta\n
|
31
|
+
\ WHERE id = 1;\n\n where delta is difference between old value and new value
|
32
|
+
of that field.\n\n This solves problem with simultaneous updating of the same
|
33
|
+
field by different threads\n (problem known as race condition).\n\n Source
|
34
|
+
code: https://github.com/izbor/delta_attributes\n "
|
35
|
+
email:
|
39
36
|
- oleh.novosad@gmail.com
|
40
37
|
executables: []
|
41
|
-
|
42
38
|
extensions: []
|
43
|
-
|
44
39
|
extra_rdoc_files: []
|
45
|
-
|
46
|
-
files:
|
40
|
+
files:
|
47
41
|
- .gitignore
|
48
42
|
- Gemfile
|
49
43
|
- LICENSE.txt
|
@@ -51,48 +45,41 @@ files:
|
|
51
45
|
- Rakefile
|
52
46
|
- delta_attributes.gemspec
|
53
47
|
- lib/delta_attributes.rb
|
54
|
-
- lib/
|
55
|
-
- lib/
|
56
|
-
- lib/
|
57
|
-
- lib/
|
58
|
-
- lib/
|
59
|
-
- lib/
|
60
|
-
- lib/
|
61
|
-
- lib/
|
62
|
-
- lib/
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
48
|
+
- lib/delta_attributes3_2/crud.rb
|
49
|
+
- lib/delta_attributes3_2/main.rb
|
50
|
+
- lib/delta_attributes3_2/mysql.rb
|
51
|
+
- lib/delta_attributes3_2/railtie.rb
|
52
|
+
- lib/delta_attributes3_2/to_sql.rb
|
53
|
+
- lib/delta_attributes3_2/update_manager.rb
|
54
|
+
- lib/delta_attributes3_2/update_statement.rb
|
55
|
+
- lib/delta_attributes3_2/visitor.rb
|
56
|
+
- lib/delta_attributes4/bind_visitor.rb
|
57
|
+
- lib/delta_attributes4/main.rb
|
58
|
+
- lib/delta_attributes4/persistence.rb
|
59
|
+
- lib/delta_attributes4/railtie.rb
|
60
|
+
- lib/shared/version.rb
|
61
|
+
homepage: https://github.com/izbor/delta_attributes
|
62
|
+
licenses:
|
63
|
+
- MIT
|
64
|
+
metadata: {}
|
67
65
|
post_install_message:
|
68
66
|
rdoc_options: []
|
69
|
-
|
70
|
-
require_paths:
|
67
|
+
require_paths:
|
71
68
|
- lib
|
72
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
none: false
|
83
|
-
requirements:
|
84
|
-
- - ">="
|
85
|
-
- !ruby/object:Gem::Version
|
86
|
-
hash: 3
|
87
|
-
segments:
|
88
|
-
- 0
|
89
|
-
version: "0"
|
69
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
70
|
+
requirements:
|
71
|
+
- - '>='
|
72
|
+
- !ruby/object:Gem::Version
|
73
|
+
version: '0'
|
74
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
75
|
+
requirements:
|
76
|
+
- - '>='
|
77
|
+
- !ruby/object:Gem::Version
|
78
|
+
version: '0'
|
90
79
|
requirements: []
|
91
|
-
|
92
80
|
rubyforge_project:
|
93
|
-
rubygems_version:
|
81
|
+
rubygems_version: 2.0.3
|
94
82
|
signing_key:
|
95
|
-
specification_version:
|
83
|
+
specification_version: 4
|
96
84
|
summary: delta attributes
|
97
85
|
test_files: []
|
98
|
-
|