has_calculated_fields 1.0.0

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
+ SHA256:
3
+ metadata.gz: a813ff50e480a6825a04c5c2716584344a19f55f1fae56e44331095bb4c052ae
4
+ data.tar.gz: c79bab42c03712ffdda782bce4e7bcc4df0692102f7d53d1bf2a335197749bc5
5
+ SHA512:
6
+ metadata.gz: c1a8034c1ceee80ba59a7878a6c5a764bf224024a63559250e2e6d2b694f1e64e59a57e86622067f954d23502bf7172d607968856f0e4f52375ec872eddc3bb4
7
+ data.tar.gz: 8209ea84a770f0720415f6bbbfb25e19f0e6623a6b7f9a83ccd24f84f94e572e9e9c99e1dca13b0a55d3f6dae62464d76afa94bb78625c4891e06705208280dd
data/.DS_Store ADDED
Binary file
data/.gitignore ADDED
@@ -0,0 +1,49 @@
1
+ *.rbc
2
+ capybara-*.html
3
+ .rspec
4
+ /log
5
+ /tmp
6
+ /db/*.sqlite3
7
+ /db/*.sqlite3-journal
8
+ /public/system
9
+ /coverage/
10
+ /spec/tmp
11
+ *.orig
12
+ rerun.txt
13
+ pickle-email-*.html
14
+
15
+ # TODO Comment out this rule if you are OK with secrets being uploaded to the repo
16
+ config/initializers/secret_token.rb
17
+ config/master.key
18
+
19
+ # Only include if you have production secrets in this file, which is no longer a Rails default
20
+ # config/secrets.yml
21
+
22
+ # dotenv
23
+ # TODO Comment out this rule if environment variables can be committed
24
+ .env
25
+
26
+ ## Environment normalization:
27
+ /.bundle
28
+ /vendor/bundle
29
+
30
+ # these should all be checked in to normalize the environment:
31
+ # Gemfile.lock, .ruby-version, .ruby-gemset
32
+
33
+ # unless supporting rvm < 1.11.0 or doing something fancy, ignore this:
34
+ .rvmrc
35
+
36
+ # if using bower-rails ignore default bower_components path bower.json files
37
+ /vendor/assets/bower_components
38
+ *.bowerrc
39
+ bower.json
40
+
41
+ # Ignore pow environment settings
42
+ .powenv
43
+
44
+ # Ignore Byebug command history file.
45
+ .byebug_history
46
+
47
+ # Ignore node_modules
48
+ node_modules/
49
+
data/Gemfile ADDED
@@ -0,0 +1,3 @@
1
+ source "https://rubygems.org"
2
+
3
+ gemspec
data/Gemfile.lock ADDED
@@ -0,0 +1,99 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ has_calculated_fields (1.0.0)
5
+
6
+ GEM
7
+ remote: https://rubygems.org/
8
+ specs:
9
+ active_model_serializers (0.9.7)
10
+ activemodel (>= 3.2)
11
+ concurrent-ruby (~> 1.0)
12
+ activemodel (4.2.11.1)
13
+ activesupport (= 4.2.11.1)
14
+ builder (~> 3.1)
15
+ activerecord (4.2.11.1)
16
+ activemodel (= 4.2.11.1)
17
+ activesupport (= 4.2.11.1)
18
+ arel (~> 6.0)
19
+ activesupport (4.2.11.1)
20
+ i18n (~> 0.7)
21
+ minitest (~> 5.1)
22
+ thread_safe (~> 0.3, >= 0.3.4)
23
+ tzinfo (~> 1.1)
24
+ appraisal (2.2.0)
25
+ bundler
26
+ rake
27
+ thor (>= 0.14.0)
28
+ arel (6.0.4)
29
+ ast (2.4.0)
30
+ builder (3.2.3)
31
+ byebug (11.0.1)
32
+ concurrent-ruby (1.1.5)
33
+ database_cleaner (1.7.0)
34
+ diff-lcs (1.3)
35
+ docile (1.1.5)
36
+ factory_bot (4.11.1)
37
+ activesupport (>= 3.0.0)
38
+ i18n (0.9.5)
39
+ concurrent-ruby (~> 1.0)
40
+ json (2.2.0)
41
+ minitest (5.11.3)
42
+ parallel (1.17.0)
43
+ parser (2.6.3.0)
44
+ ast (~> 2.4.0)
45
+ powerpack (0.1.2)
46
+ rainbow (2.2.2)
47
+ rake
48
+ rake (12.3.3)
49
+ rspec (3.8.0)
50
+ rspec-core (~> 3.8.0)
51
+ rspec-expectations (~> 3.8.0)
52
+ rspec-mocks (~> 3.8.0)
53
+ rspec-core (3.8.2)
54
+ rspec-support (~> 3.8.0)
55
+ rspec-expectations (3.8.4)
56
+ diff-lcs (>= 1.2.0, < 2.0)
57
+ rspec-support (~> 3.8.0)
58
+ rspec-mocks (3.8.1)
59
+ diff-lcs (>= 1.2.0, < 2.0)
60
+ rspec-support (~> 3.8.0)
61
+ rspec-support (3.8.2)
62
+ rubocop (0.49.1)
63
+ parallel (~> 1.10)
64
+ parser (>= 2.3.3.1, < 3.0)
65
+ powerpack (~> 0.1)
66
+ rainbow (>= 1.99.1, < 3.0)
67
+ ruby-progressbar (~> 1.7)
68
+ unicode-display_width (~> 1.0, >= 1.0.1)
69
+ ruby-progressbar (1.10.1)
70
+ simplecov (0.15.1)
71
+ docile (~> 1.1.0)
72
+ json (>= 1.8, < 3)
73
+ simplecov-html (~> 0.10.0)
74
+ simplecov-html (0.10.2)
75
+ sqlite3 (1.3.13)
76
+ thor (0.20.3)
77
+ thread_safe (0.3.6)
78
+ tzinfo (1.2.5)
79
+ thread_safe (~> 0.1)
80
+ unicode-display_width (1.6.0)
81
+
82
+ PLATFORMS
83
+ ruby
84
+
85
+ DEPENDENCIES
86
+ active_model_serializers (~> 0.9.3)
87
+ activerecord (= 4.2.11.1)
88
+ appraisal (~> 2.2)
89
+ byebug
90
+ database_cleaner
91
+ factory_bot (~> 4.8)
92
+ has_calculated_fields!
93
+ rspec (~> 3.6)
94
+ rubocop (~> 0.49.1)
95
+ simplecov (~> 0.15.0)
96
+ sqlite3 (~> 1.3.6)
97
+
98
+ BUNDLED WITH
99
+ 1.16.6
data/Rakefile ADDED
@@ -0,0 +1,12 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "bundler"
4
+ Bundler::GemHelper.install_tasks
5
+
6
+ require "rspec/core/rake_task"
7
+
8
+ desc "Run specs"
9
+ RSpec::Core::RakeTask.new(:spec)
10
+
11
+ desc "Default: run specs."
12
+ task default: :spec
@@ -0,0 +1,33 @@
1
+ # -*- encoding: utf-8 -*-
2
+ # frozen_string_literal: true
3
+
4
+ $:.push File.expand_path("../lib", __FILE__)
5
+
6
+ Gem::Specification.new do |s|
7
+ s.name = "has_calculated_fields"
8
+ s.version = "1.0.0"
9
+ s.platform = Gem::Platform::RUBY
10
+ s.author = ["Adrian Fernandez"]
11
+ s.email = ["adrianfernandez85@gmail.com"]
12
+ s.homepage = "http://github.com/adrian-fernandez/has_calculated_fields"
13
+ s.summary = "Rails gem to allow models to save auto calculated fields"
14
+ s.description = "Rails gem to allow models to save auto calculated fields"
15
+ s.license = "MIT"
16
+
17
+ s.files = `git ls-files`.split("\n")
18
+ s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
19
+ s.executables = `git ls-files -- bin/*`.split("\n").map { |f| File.basename(f) }
20
+ s.require_paths = ["lib"]
21
+
22
+ s.add_development_dependency "rspec", "~> 3.6"
23
+ s.add_development_dependency "activerecord", "4.2.11.1"
24
+ s.add_development_dependency "sqlite3", "~> 1.3.6"
25
+ s.add_development_dependency "rubocop", "~> 0.49.1"
26
+ s.add_development_dependency "simplecov", "~> 0.15.0"
27
+ s.add_development_dependency "appraisal", "~> 2.2"
28
+ s.add_development_dependency "byebug"
29
+ s.add_development_dependency "factory_bot", "~> 4.8"
30
+ s.add_development_dependency "database_cleaner"
31
+ s.add_development_dependency "active_model_serializers", "~> 0.9.3"
32
+
33
+ end
data/lib/.DS_Store ADDED
Binary file
@@ -0,0 +1,15 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "active_record"
4
+ require "active_support/inflector"
5
+ require "active_model_serializers"
6
+
7
+ $LOAD_PATH.unshift(File.dirname(__FILE__))
8
+
9
+ module HasCalculatedFields
10
+ if defined?(ActiveRecord::Base)
11
+ require "has_calculated_fields/has_calculated_fields"
12
+
13
+ ActiveRecord::Base.extend HasCalculatedFields
14
+ end
15
+ end
Binary file
@@ -0,0 +1,73 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'active_support/concern'
4
+
5
+ module HasCalculatedFields
6
+ module HasCalculatedFields
7
+ extend ActiveSupport::Concern
8
+
9
+ module ClassMethods
10
+ def has_calculated_fields(args = {})
11
+ define_method :has_calculated_fields_options do
12
+ self.class.instance_variable_get("@has_calculated_fields_options")
13
+ end
14
+
15
+ class_eval do
16
+ @has_calculated_fields_options = { }.merge(args)
17
+
18
+ def self.has_calculated_fields?
19
+ true
20
+ end
21
+ end
22
+ end
23
+ end
24
+
25
+ included do
26
+ before_save :_has_calculated_fields__on_before_save
27
+ end
28
+
29
+ def _has_calculated_fields__on_before_save
30
+ return unless has_calculated_fields_options.has_key?(:on_before_save)
31
+
32
+ has_calculated_fields_options[:on_before_save].each do |data|
33
+ attr_equal = "#{data[:calculated_field]}="
34
+
35
+ value = case data[:type]
36
+ when :date
37
+ if data[:format]
38
+ I18n.l(_has_calculated_fields__field_value(data), format: data[:format])
39
+ else
40
+ I18n.l(_has_calculated_fields__field_value(data))
41
+ end
42
+ when :method
43
+ data[:method].call(self)
44
+ end
45
+
46
+ send(attr_equal, value)
47
+ end
48
+ end
49
+
50
+ def _has_calculated_fields__field_value(data)
51
+ field = data.fetch(:field, nil)
52
+ if field.present?
53
+ send(field) || _has_calculated_fields__default_field_value(data)
54
+ else
55
+ _has_calculated_fields__default_field_value(data)
56
+ end
57
+ end
58
+
59
+ def _has_calculated_fields__default_field_value(data)
60
+ value = data.fetch(:default, nil)
61
+ case value
62
+ when :now
63
+ Time.current
64
+ when :nil
65
+ nil
66
+ else
67
+ value
68
+ end
69
+ end
70
+ end
71
+ end
72
+
73
+ ActiveRecord::Base.send(:include, HasCalculatedFields::HasCalculatedFields)
data/spec/.DS_Store ADDED
Binary file
@@ -0,0 +1,6 @@
1
+ #frozen_string_literal: true
2
+
3
+ FactoryBot.define do
4
+ factory :sample_model do
5
+ end
6
+ end
@@ -0,0 +1,42 @@
1
+ require "spec_helper"
2
+ require "byebug"
3
+
4
+ describe HasCalculatedFields do
5
+ describe "runs before_save callbacks" do
6
+ let(:name) { "name" }
7
+ let(:created_at) { Time.find_zone("Madrid").parse("2019-05-03 2pm") }
8
+ let(:obj) { create(:sample_model, created_at: created_at, name: name) }
9
+
10
+ context "using time" do
11
+ context "when attribute has value" do
12
+ it "assigns formatted time attribute" do
13
+ new_date = Time.find_zone("Madrid").parse("2019-05-04 4pm")
14
+
15
+ obj.created_at = new_date
16
+ expect { obj.save }.to change { obj.calculated_created_at }
17
+ .from("Fri, 03 May 2019 14:00:00 +0200")
18
+ .to("Sat, 04 May 2019 16:00:00 +0200")
19
+ end
20
+ end
21
+
22
+ context "when attribute hasn't value" do
23
+ let(:created_at) { nil }
24
+ it "assigns formatted time attribute" do
25
+ expect { obj.save }.to change { obj.calculated_created_at }
26
+ .from(I18n.l(Time.current))
27
+ .to(I18n.l(Time.current.in_time_zone("UTC")))
28
+ end
29
+ end
30
+ end
31
+
32
+ context "using method" do
33
+ it "assigns new value to the calculated attribute" do
34
+ obj.name = "new name"
35
+
36
+ expect { obj.save }.to change { obj.calculated_name }
37
+ .from("name calculated!")
38
+ .to("new name calculated!")
39
+ end
40
+ end
41
+ end
42
+ end
@@ -0,0 +1,53 @@
1
+ # frozen_string_literal: true
2
+
3
+ $LOAD_PATH << File.join(File.dirname(__FILE__), "..", "lib")
4
+ require "sqlite3"
5
+ require "has_calculated_fields"
6
+ require "factory_bot"
7
+ require 'database_cleaner'
8
+ require "active_model_serializers"
9
+
10
+ Dir["./spec/support/**/*.rb"].sort.each { |f| require f }
11
+
12
+ RSpec.configure do |config|
13
+ config.before(:suite) do
14
+ DatabaseCleaner.strategy = :transaction
15
+ DatabaseCleaner.clean_with(:truncation)
16
+ end
17
+
18
+ config.around(:each) do |example|
19
+ DatabaseCleaner.cleaning do
20
+ example.run
21
+ end
22
+ end
23
+ end
24
+
25
+ ActiveRecord::Base.establish_connection(adapter: "sqlite3", database: ":memory:")
26
+
27
+ ActiveRecord::Schema.define(version: 1) do
28
+ create_table :sample_models do |t|
29
+ t.string :name
30
+ t.datetime :created_at
31
+
32
+ t.string :calculated_name
33
+ t.string :calculated_created_at
34
+ end
35
+ end
36
+
37
+ class SampleModel < ActiveRecord::Base
38
+ has_calculated_fields on_before_save: [
39
+ {
40
+ calculated_field: :calculated_created_at,
41
+ field: :created_at,
42
+ type: :date,
43
+ default: :now
44
+ },
45
+ {
46
+ calculated_field: :calculated_name,
47
+ type: :method,
48
+ method: Proc.new do |obj|
49
+ obj.name + " calculated!"
50
+ end
51
+ }
52
+ ]
53
+ end
@@ -0,0 +1,9 @@
1
+ # frozen_string_literal: true
2
+
3
+ RSpec.configure do |config|
4
+ config.include FactoryBot::Syntax::Methods
5
+
6
+ config.before(:suite) do
7
+ FactoryBot.find_definitions
8
+ end
9
+ end
metadata ADDED
@@ -0,0 +1,203 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: has_calculated_fields
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
5
+ platform: ruby
6
+ authors:
7
+ - Adrian Fernandez
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2019-08-11 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: rspec
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '3.6'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '3.6'
27
+ - !ruby/object:Gem::Dependency
28
+ name: activerecord
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - '='
32
+ - !ruby/object:Gem::Version
33
+ version: 4.2.11.1
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - '='
39
+ - !ruby/object:Gem::Version
40
+ version: 4.2.11.1
41
+ - !ruby/object:Gem::Dependency
42
+ name: sqlite3
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: 1.3.6
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: 1.3.6
55
+ - !ruby/object:Gem::Dependency
56
+ name: rubocop
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: 0.49.1
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: 0.49.1
69
+ - !ruby/object:Gem::Dependency
70
+ name: simplecov
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: 0.15.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.15.0
83
+ - !ruby/object:Gem::Dependency
84
+ name: appraisal
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: '2.2'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - "~>"
95
+ - !ruby/object:Gem::Version
96
+ version: '2.2'
97
+ - !ruby/object:Gem::Dependency
98
+ name: byebug
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - ">="
102
+ - !ruby/object:Gem::Version
103
+ version: '0'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - ">="
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
111
+ - !ruby/object:Gem::Dependency
112
+ name: factory_bot
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - "~>"
116
+ - !ruby/object:Gem::Version
117
+ version: '4.8'
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - "~>"
123
+ - !ruby/object:Gem::Version
124
+ version: '4.8'
125
+ - !ruby/object:Gem::Dependency
126
+ name: database_cleaner
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - ">="
130
+ - !ruby/object:Gem::Version
131
+ version: '0'
132
+ type: :development
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - ">="
137
+ - !ruby/object:Gem::Version
138
+ version: '0'
139
+ - !ruby/object:Gem::Dependency
140
+ name: active_model_serializers
141
+ requirement: !ruby/object:Gem::Requirement
142
+ requirements:
143
+ - - "~>"
144
+ - !ruby/object:Gem::Version
145
+ version: 0.9.3
146
+ type: :development
147
+ prerelease: false
148
+ version_requirements: !ruby/object:Gem::Requirement
149
+ requirements:
150
+ - - "~>"
151
+ - !ruby/object:Gem::Version
152
+ version: 0.9.3
153
+ description: Rails gem to allow models to save auto calculated fields
154
+ email:
155
+ - adrianfernandez85@gmail.com
156
+ executables: []
157
+ extensions: []
158
+ extra_rdoc_files: []
159
+ files:
160
+ - ".DS_Store"
161
+ - ".gitignore"
162
+ - Gemfile
163
+ - Gemfile.lock
164
+ - Rakefile
165
+ - has_calculated_fields.gemspec
166
+ - lib/.DS_Store
167
+ - lib/has_calculated_fields.rb
168
+ - lib/has_calculated_fields/.DS_Store
169
+ - lib/has_calculated_fields/has_calculated_fields.rb
170
+ - spec/.DS_Store
171
+ - spec/factories/other_event.rb
172
+ - spec/has_calculated_fields_spec.rb
173
+ - spec/spec_helper.rb
174
+ - spec/support/factory_bot.rb
175
+ homepage: http://github.com/adrian-fernandez/has_calculated_fields
176
+ licenses:
177
+ - MIT
178
+ metadata: {}
179
+ post_install_message:
180
+ rdoc_options: []
181
+ require_paths:
182
+ - lib
183
+ required_ruby_version: !ruby/object:Gem::Requirement
184
+ requirements:
185
+ - - ">="
186
+ - !ruby/object:Gem::Version
187
+ version: '0'
188
+ required_rubygems_version: !ruby/object:Gem::Requirement
189
+ requirements:
190
+ - - ">="
191
+ - !ruby/object:Gem::Version
192
+ version: '0'
193
+ requirements: []
194
+ rubyforge_project:
195
+ rubygems_version: 2.7.8
196
+ signing_key:
197
+ specification_version: 4
198
+ summary: Rails gem to allow models to save auto calculated fields
199
+ test_files:
200
+ - spec/factories/other_event.rb
201
+ - spec/has_calculated_fields_spec.rb
202
+ - spec/spec_helper.rb
203
+ - spec/support/factory_bot.rb