has_calculated_fields 1.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 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