update_cardinals_by 0.0.1

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: b4c004461c19b5e0aefe58e948cfb03811159e6b
4
+ data.tar.gz: cba4dafca4758e506b028221e8d54f7df3cf1643
5
+ SHA512:
6
+ metadata.gz: f1d5c44273f2949c2406615f227df62eb212ee7f9ba4abbaaf66e189d21f28502da60e656b47542c7187caad5ce1627eec565f70d29dd8ab37c1d147b6fabdd7
7
+ data.tar.gz: fcb907362971985e948276a6fd10d4081850acc69e538c81e09170c4c34a6c17c7b2863bfb49ec68163db290115cbb90ee27b5d18c087393101a56ba4f633b40
data/MIT-LICENSE ADDED
@@ -0,0 +1,20 @@
1
+ Copyright 2016 Henk van der Veen
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,22 @@
1
+ # Update Cardinals
2
+
3
+ A gem to more safely update cardinal numbers like credits.
4
+
5
+ It will start a transaction, make the change with a delta and call the given block. If any exceptions are thrown in the block, the change will be reverted.
6
+
7
+ Sql will be like
8
+
9
+ ```sql
10
+ update accounts set credits = credit + -20 where id = 6
11
+ ```
12
+
13
+
14
+ Usage:
15
+
16
+ ```ruby
17
+ change_counters_by!(credits: -20) do |res|
18
+ fail 'not enough credits' if res[:credits] < 0
19
+ CreateWantedItems.run(..)
20
+ CreditMutation.create(credits_new: res[:credits], credits_change: -20)
21
+ end
22
+ ```
data/Rakefile ADDED
@@ -0,0 +1,70 @@
1
+ begin
2
+ require 'bundler/setup'
3
+ rescue LoadError
4
+ puts 'You must `gem install bundler` and `bundle install` to run rake tasks'
5
+ end
6
+
7
+ require 'rdoc/task'
8
+
9
+ Bundler::GemHelper.install_tasks
10
+
11
+ task default: :spec
12
+
13
+ task :setup do
14
+ if File.exist?('.env')
15
+ puts 'This will overwrite your existing .env file'
16
+ end
17
+ print 'Enter your database name: [update_cardinals_by] '
18
+ db_name = STDIN.gets.chomp
19
+ print 'Enter your database user: [] '
20
+ db_user = STDIN.gets.chomp
21
+ print 'Enter your database password: [] '
22
+ db_password = STDIN.gets.chomp
23
+ print 'Enter your database server: [localhost] '
24
+ db_server = STDIN.gets.chomp
25
+
26
+ db_name = 'update_cardinals_by' if db_name.empty?
27
+ db_password = ":#{db_password}" unless db_password.empty?
28
+ db_server = 'localhost' if db_server.empty?
29
+
30
+ db_server = "@#{db_server}" unless db_user.empty?
31
+
32
+ env_path = File.expand_path('./.env')
33
+ File.open(env_path, 'w') do |file|
34
+ file.puts "DATABASE_NAME=#{db_name}"
35
+ file.puts "DATABASE_URL=\"postgres://#{db_user}#{db_password}#{db_server}/#{db_name}\""
36
+ end
37
+
38
+ puts '.env file saved'
39
+ end
40
+
41
+ namespace :db do
42
+ task :load_db_settings do
43
+ require 'active_record'
44
+ unless ENV['DATABASE_URL']
45
+ require 'dotenv'
46
+ Dotenv.load
47
+ end
48
+ end
49
+
50
+ task :drop => :load_db_settings do
51
+ %x{ dropdb #{ENV['DATABASE_NAME']} }
52
+ end
53
+
54
+ task :create => :load_db_settings do
55
+ %x{ createdb #{ENV['DATABASE_NAME']} }
56
+ end
57
+
58
+ task :migrate => :load_db_settings do
59
+ ActiveRecord::Base.establish_connection
60
+
61
+ ActiveRecord::Base.connection.enable_extension 'hstore'
62
+
63
+ ActiveRecord::Base.connection.create_table :accounts, force: true do |t|
64
+ t.integer "credits"
65
+ t.decimal "money"
66
+ end
67
+
68
+ puts 'Database migrated'
69
+ end
70
+ end
@@ -0,0 +1,3 @@
1
+ module UpdateCardinalsBy
2
+ VERSION = "0.0.1"
3
+ end
@@ -0,0 +1,29 @@
1
+ require 'active_support/concern'
2
+
3
+ module UpdateCardinalsBy
4
+ extend ActiveSupport::Concern
5
+
6
+ #
7
+ # returns indifferent hash of new values.
8
+ def update_cardinals_by!(attributes, &block)
9
+ db_attributes = attributes.map { |k, v| [self.class.connection.quote_column_name(k), v] }
10
+ updates = db_attributes.map.with_index { |(k, v), i| "#{k} = #{k} + $#{i+1}" }
11
+ binds = db_attributes.map { |k, v| [column_for_attribute(k), v] }
12
+
13
+ transaction do
14
+ res = self.class.connection.exec_query(
15
+ "update #{self.class.table_name} " \
16
+ "set #{updates.join(', ')} " \
17
+ "where id = #{id} " \
18
+ "returning #{db_attributes.map(&:first).join(', ')}",
19
+ 'SQL', binds
20
+ ).first
21
+ .map { |k, v| [k, column_for_attribute(k).type_cast_from_database(v)] }
22
+ res = HashWithIndifferentAccess[ res ]
23
+
24
+ yield res if block_given?
25
+
26
+ res.each { |attr, v| raw_write_attribute attr, v }
27
+ end
28
+ end
29
+ end
metadata ADDED
@@ -0,0 +1,134 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: update_cardinals_by
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Hampei
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2016-11-24 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: activerecord
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: 4.2.7
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: 4.2.7
27
+ - !ruby/object:Gem::Dependency
28
+ name: pg
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rake
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: rspec
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: dotenv
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: database_cleaner
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
97
+ description:
98
+ email:
99
+ - henk.van.der.veen@gmail.com
100
+ executables: []
101
+ extensions: []
102
+ extra_rdoc_files: []
103
+ files:
104
+ - MIT-LICENSE
105
+ - README.md
106
+ - Rakefile
107
+ - lib/update_cardinals_by.rb
108
+ - lib/update_cardinals_by/version.rb
109
+ homepage: https://github.com/hampei/update_cardinals_by
110
+ licenses:
111
+ - MIT
112
+ metadata: {}
113
+ post_install_message:
114
+ rdoc_options: []
115
+ require_paths:
116
+ - lib
117
+ required_ruby_version: !ruby/object:Gem::Requirement
118
+ requirements:
119
+ - - ">="
120
+ - !ruby/object:Gem::Version
121
+ version: '0'
122
+ required_rubygems_version: !ruby/object:Gem::Requirement
123
+ requirements:
124
+ - - ">="
125
+ - !ruby/object:Gem::Version
126
+ version: '0'
127
+ requirements: []
128
+ rubyforge_project:
129
+ rubygems_version: 2.5.1
130
+ signing_key:
131
+ specification_version: 4
132
+ summary: postgres database extension to increment/decrement values safely and get
133
+ back result.
134
+ test_files: []