delta_attributes 0.0.4 → 1.0.2

Sign up to get free protection for your applications and to get access to all the features.
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 3.1.0, 3.2.0, 3.2.8, 3.2.9.
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
 
@@ -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 'delta_attributes/version'
4
+ require 'shared/version'
5
5
 
6
6
  Gem::Specification.new do |gem|
7
- gem.name = "delta_attributes"
7
+ gem.name = 'delta_attributes'
8
8
  gem.version = DeltaAttributes::VERSION
9
- gem.authors = ["Oleh (izbor) Novosad, Yuriy Lavryk, Arya"]
10
- gem.email = ["oleh.novosad@gmail.com"]
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 = ["lib"]
40
- gem.add_dependency "rails", ">= 3.1.0"
39
+ gem.require_paths = %w(lib)
40
+ gem.add_dependency 'rails', '>= 3.2'
41
+ gem.license = 'MIT'
41
42
  end
@@ -1,2 +1,9 @@
1
- require "delta_attributes/version"
2
- require 'delta_attributes/railtie' if defined?(Rails)
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
@@ -1,10 +1,10 @@
1
1
  require 'set'
2
- require "delta_attributes/update_statement"
3
- require "delta_attributes/update_manager"
4
- require "delta_attributes/to_sql"
5
- require "delta_attributes/mysql"
6
- require "delta_attributes/crud"
7
- require "delta_attributes/visitor"
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
@@ -0,0 +1,9 @@
1
+ class DeltaAttributesRailtie < Rails::Railtie
2
+
3
+ initializer 'delta_attributes.configure_rails_initialization' do
4
+ ActiveSupport.on_load(:active_record) do
5
+ require 'delta_attributes3_2/main.rb'
6
+ end
7
+ end
8
+
9
+ end
@@ -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
@@ -0,0 +1,9 @@
1
+ class DeltaAttributesRailtie < Rails::Railtie
2
+
3
+ initializer 'delta_attributes.configure_rails_initialization' do
4
+ ActiveSupport.on_load(:active_record) do
5
+ require 'delta_attributes4/main.rb'
6
+ end
7
+ end
8
+
9
+ end
@@ -1,3 +1,3 @@
1
1
  module DeltaAttributes
2
- VERSION = "0.0.4"
2
+ VERSION = '1.0.2'
3
3
  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
- hash: 23
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 (izbor) Novosad, Yuriy Lavryk, Arya
6
+ authors:
7
+ - Oleh Novosad, Yuriy Lavryk, Arya
14
8
  autorequire:
15
9
  bindir: bin
16
10
  cert_chain: []
17
-
18
- date: 2012-11-21 00:00:00 +02:00
19
- default_executable:
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
- prerelease: false
24
- requirement: &id001 !ruby/object:Gem::Requirement
25
- none: false
26
- requirements:
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
- version_requirements: *id001
37
- description: "\n This gem makes updating specified number fields by ActiveRecord in unusual way.\n\n Instead of generating sql script to update value in usual way like this:\n\n UPDATE users\n SET money = 10\n WHERE id = 1;\n\n It replaces it with\n\n UPDATE users\n SET money = money + delta\n WHERE id = 1;\n\n where delta is difference between old value and new value of that field.\n\n This solves problem with simultaneous updating of the same field by different threads\n (problem known as race condition).\n\n Source code: https://github.com/izbor/delta_attributes\n "
38
- email:
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/delta_attributes/crud.rb
55
- - lib/delta_attributes/main.rb
56
- - lib/delta_attributes/mysql.rb
57
- - lib/delta_attributes/railtie.rb
58
- - lib/delta_attributes/to_sql.rb
59
- - lib/delta_attributes/update_manager.rb
60
- - lib/delta_attributes/update_statement.rb
61
- - lib/delta_attributes/version.rb
62
- - lib/delta_attributes/visitor.rb
63
- has_rdoc: true
64
- homepage: ""
65
- licenses: []
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
- none: false
74
- requirements:
75
- - - ">="
76
- - !ruby/object:Gem::Version
77
- hash: 3
78
- segments:
79
- - 0
80
- version: "0"
81
- required_rubygems_version: !ruby/object:Gem::Requirement
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: 1.5.3
81
+ rubygems_version: 2.0.3
94
82
  signing_key:
95
- specification_version: 3
83
+ specification_version: 4
96
84
  summary: delta attributes
97
85
  test_files: []
98
-
@@ -1,8 +0,0 @@
1
-
2
- class DeltaAttributesRailtie < Rails::Railtie
3
-
4
- initializer "delta_attributes.configure_rails_initialization", {:after => 1} do
5
- load "delta_attributes/main.rb"
6
- end
7
-
8
- end