acts_as_living 0.1.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 +7 -0
- data/Changelog.md +12 -0
- data/README.md +39 -0
- data/lib/acts_as_living.rb +16 -0
- data/lib/acts_as_living/callbacks_definer.rb +136 -0
- data/lib/acts_as_living/class_methods.rb +97 -0
- data/lib/acts_as_living/enum_definer.rb +22 -0
- data/lib/acts_as_living/instance_methods_definer.rb +141 -0
- data/lib/acts_as_living/railtie.rb +14 -0
- data/lib/acts_as_living/scopes_definer.rb +23 -0
- data/lib/acts_as_living/validations_definer.rb +32 -0
- data/lib/acts_as_living/version.rb +3 -0
- metadata +117 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: de0cdd11d713c73fa97d94da8f0812ffbeeb5bf7b724c86a8f6d1fa01cf79ebc
|
4
|
+
data.tar.gz: fa9f2638f6e04047cbb7954792d1acdfb375939b65ede0af9f97055b31eef6f7
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: f944327ad557443227149617a1ecc5fc79bd78a3715d96e1db986e71d782c7d1b110e28ff88023cbea0b86d6f6eb4e079ae062d4a95b3427b827b5cdf73b0e2a
|
7
|
+
data.tar.gz: 3d96447eec1760afd73458b059d5659c58b6020edd38cd45295db1558463d6c6dc5b98484ccae61ace9b34c6d8cf5ed4c8c590d02670bc18d7566158c39ccec4
|
data/Changelog.md
ADDED
@@ -0,0 +1,12 @@
|
|
1
|
+
# Changelog
|
2
|
+
All notable changes to this project will be documented in this file.
|
3
|
+
|
4
|
+
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
|
5
|
+
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
6
|
+
|
7
|
+
## [Unreleased]
|
8
|
+
|
9
|
+
## [0.1.0] - 2020-07-01
|
10
|
+
### Added
|
11
|
+
- First Release with 2 included flight routes: Email and SMS. (plugged with Twilio and ActionMailer)
|
12
|
+
- FlyJob included
|
data/README.md
ADDED
@@ -0,0 +1,39 @@
|
|
1
|
+
# Activerecord::ActsAsLiving
|
2
|
+
|
3
|
+
Welcome to your new gem! In this directory, you'll find the files you need to be able to package up your Ruby library into a gem. Put your Ruby code in the file `lib/activerecord/acts_as_living`. To experiment with that code, run `bin/console` for an interactive prompt.
|
4
|
+
|
5
|
+
TODO: Delete this and the text above, and describe your gem
|
6
|
+
|
7
|
+
## Installation
|
8
|
+
|
9
|
+
Add this line to your application's Gemfile:
|
10
|
+
|
11
|
+
```ruby
|
12
|
+
gem 'activerecord-acts_as_living'
|
13
|
+
```
|
14
|
+
|
15
|
+
And then execute:
|
16
|
+
|
17
|
+
$ bundle
|
18
|
+
|
19
|
+
Or install it yourself as:
|
20
|
+
|
21
|
+
$ gem install activerecord-acts_as_living
|
22
|
+
|
23
|
+
## Usage
|
24
|
+
|
25
|
+
TODO: Write usage instructions here
|
26
|
+
|
27
|
+
## Development
|
28
|
+
|
29
|
+
After checking out the repo, run `bin/setup` to install dependencies. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
|
30
|
+
|
31
|
+
To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
|
32
|
+
|
33
|
+
## Contributing
|
34
|
+
|
35
|
+
Bug reports and pull requests are welcome on GitHub at https://github.com/[USERNAME]/activerecord-acts_as_living.
|
36
|
+
|
37
|
+
## License
|
38
|
+
|
39
|
+
The gem is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT).
|
@@ -0,0 +1,16 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'active_support'
|
4
|
+
require 'acts_as_living/version'
|
5
|
+
require 'acts_as_living/class_methods'
|
6
|
+
require 'acts_as_living/enum_definer'
|
7
|
+
require 'acts_as_living/callbacks_definer'
|
8
|
+
require 'acts_as_living/instance_methods_definer'
|
9
|
+
require 'acts_as_living/scopes_definer'
|
10
|
+
require 'acts_as_living/validations_definer'
|
11
|
+
|
12
|
+
module ActsAsLiving
|
13
|
+
extend ActiveSupport::Autoload
|
14
|
+
end
|
15
|
+
|
16
|
+
require 'acts_as_living/railtie' if defined?(Rails)
|
@@ -0,0 +1,136 @@
|
|
1
|
+
# # frozen_string_literal: true
|
2
|
+
|
3
|
+
# module ActsAsLiving::CallbacksDefiner #:nodoc:
|
4
|
+
# CALLBACK_TERMINATOR = if ::ActiveSupport::VERSION::MAJOR >= 5
|
5
|
+
# ->(_target, result) { result.call == false }
|
6
|
+
# else
|
7
|
+
# ->(_target, result) { result == false }
|
8
|
+
# end
|
9
|
+
|
10
|
+
# # defines before, after and around callbaks for each stage of the acts_as_living
|
11
|
+
# # e.g. before_cancelled { do_something }
|
12
|
+
# # e.g. after_activated :run_method
|
13
|
+
# # e.g. after_status_change :run_method
|
14
|
+
|
15
|
+
# def self.call(klass)
|
16
|
+
# klass.class_eval do
|
17
|
+
# include ActiveSupport::Callbacks
|
18
|
+
# extend ClassMethods
|
19
|
+
# include InstanceMethods
|
20
|
+
|
21
|
+
# callbacks_for(:status_change)
|
22
|
+
# callbacks_for(:life_stage_change)
|
23
|
+
# status_keys.each(&method(:status_callbacks_for))
|
24
|
+
# @life_stages.keys.each(&method(:lifestage_callbacks_for))
|
25
|
+
# end
|
26
|
+
# end
|
27
|
+
|
28
|
+
# module InstanceMethods
|
29
|
+
# def save(*args)
|
30
|
+
# return super(*args) unless valid? && status_changed? || valid? && new_record?
|
31
|
+
|
32
|
+
# _run_status_change_callbacks do
|
33
|
+
# run_callbacks("status_change_to_#{status}") do
|
34
|
+
# binding.pry if notice_of_termination_received?
|
35
|
+
# life_stage_changed? ? run_life_stage_callbacks { binding.pry; 'hey'; super(*args) } : super(*args)
|
36
|
+
# end
|
37
|
+
# end
|
38
|
+
# end
|
39
|
+
|
40
|
+
# def save!(*args)
|
41
|
+
# return super(*args) unless valid? && status_changed? || valid? && new_record?
|
42
|
+
|
43
|
+
# _run_status_change_callbacks do
|
44
|
+
# run_callbacks("status_change_to_#{status}") do
|
45
|
+
# life_stage_changed? ? run_life_stage_callbacks { binding.pry; 'hey'; super(*args) } : super(*args)
|
46
|
+
# end
|
47
|
+
# end
|
48
|
+
# end
|
49
|
+
|
50
|
+
# protected
|
51
|
+
|
52
|
+
# def run_life_stage_callbacks(&block)
|
53
|
+
# _run_life_stage_change_callbacks do
|
54
|
+
# _run_life_stage_started_callbacks do
|
55
|
+
# _run_life_stage_ended_callbacks(&block)
|
56
|
+
# end
|
57
|
+
# end
|
58
|
+
# end
|
59
|
+
|
60
|
+
# def _run_life_stage_started_callbacks(&block)
|
61
|
+
# life_stages_started.inject(block) do |blk, stage|
|
62
|
+
# _run_stage_started_callbacks(stage, &blk)
|
63
|
+
# end
|
64
|
+
# end
|
65
|
+
|
66
|
+
# def _run_life_stage_ended_callbacks(&block)
|
67
|
+
# life_stages_ended.inject(block) do |blk, stage|
|
68
|
+
# _run_stage_ended_callbacks(stage, &blk)
|
69
|
+
# end
|
70
|
+
# end
|
71
|
+
|
72
|
+
# def _run_stage_started_callbacks(stage, &block)
|
73
|
+
# run_callbacks("#{stage}_started".to_sym, &block)
|
74
|
+
# end
|
75
|
+
|
76
|
+
# def _run_stage_ended_callbacks(stage, &block)
|
77
|
+
# run_callbacks("#{stage}_ended".to_sym, &block)
|
78
|
+
# end
|
79
|
+
# end
|
80
|
+
|
81
|
+
# module ClassMethods
|
82
|
+
# def lifestage_callbacks_for(stage)
|
83
|
+
# define_callback_methods_for("#{stage}_started".to_sym)
|
84
|
+
# define_callback_methods_for("#{stage}_ended".to_sym)
|
85
|
+
# end
|
86
|
+
|
87
|
+
# def callbacks_for(callback_name)
|
88
|
+
# define_callback_methods_for(callback_name)
|
89
|
+
# end
|
90
|
+
|
91
|
+
# def status_callbacks_for(status_name)
|
92
|
+
# define_callback_methods_for("status_change_to_#{status_name}")
|
93
|
+
# end
|
94
|
+
|
95
|
+
# def _normalize_callback_options(options)
|
96
|
+
# _normalize_callback_option(options, :only, :if)
|
97
|
+
# _normalize_callback_option(options, :except, :unless)
|
98
|
+
# end
|
99
|
+
|
100
|
+
# def _normalize_callback_option(options, from, to)
|
101
|
+
# return unless (from = options[from])
|
102
|
+
|
103
|
+
# from_set = Array(from).map(&:to_s).to_set
|
104
|
+
# from = proc { |c| from_set.include? c.notification_name.to_s }
|
105
|
+
# options[to] = Array(options[to]).unshift(from)
|
106
|
+
# end
|
107
|
+
|
108
|
+
# # rubocop:disable Metrics/MethodLength
|
109
|
+
# def define_callback_methods_for(callback_name)
|
110
|
+
# define_callbacks(
|
111
|
+
# callback_name,
|
112
|
+
# terminator: CALLBACK_TERMINATOR,
|
113
|
+
# skip_after_callbacks_if_terminated: true
|
114
|
+
# )
|
115
|
+
|
116
|
+
# define_singleton_method("before_#{callback_name}") do |method_or_block = nil, **options, &block|
|
117
|
+
# method_or_block ||= block
|
118
|
+
# _normalize_callback_options(options)
|
119
|
+
# set_callback callback_name, :before, method_or_block, options
|
120
|
+
# end
|
121
|
+
|
122
|
+
# define_singleton_method("after_#{callback_name}") do |method_or_block = nil, **options, &block|
|
123
|
+
# method_or_block ||= block
|
124
|
+
# _normalize_callback_options(options)
|
125
|
+
# set_callback callback_name, :after, method_or_block, options
|
126
|
+
# end
|
127
|
+
|
128
|
+
# define_singleton_method("around_#{callback_name}") do |method_or_block = nil, **options, &block|
|
129
|
+
# method_or_block ||= block
|
130
|
+
# _normalize_callback_options(options)
|
131
|
+
# set_callback callback_name, :around, method_or_block, options
|
132
|
+
# end
|
133
|
+
# end
|
134
|
+
# # rubocop:enable Metrics/MethodLength
|
135
|
+
# end
|
136
|
+
# end
|
@@ -0,0 +1,97 @@
|
|
1
|
+
|
2
|
+
module ActsAsLiving::ClassMethods
|
3
|
+
# validates :status, presence: true
|
4
|
+
|
5
|
+
def acts_as_living(keys, **options)
|
6
|
+
@status_keys = keys
|
7
|
+
@life_stages = options.dig(:life_stages)
|
8
|
+
@locked_statuses = options.dig(:lock_on)
|
9
|
+
@death = options.dig(:death)
|
10
|
+
@spread = options.dig(:spread)
|
11
|
+
@column = options.dig(:column)
|
12
|
+
|
13
|
+
ActsAsLiving::EnumDefiner.call(self)
|
14
|
+
|
15
|
+
run_definers
|
16
|
+
end
|
17
|
+
|
18
|
+
def run_definers
|
19
|
+
ActsAsLiving::ScopesDefiner.call(self)
|
20
|
+
ActsAsLiving::InstanceMethodsDefiner.call(self)
|
21
|
+
# ActsAsLiving::CallbacksDefiner.call(self)
|
22
|
+
ActsAsLiving::ValidationsDefiner.call(self)
|
23
|
+
end
|
24
|
+
|
25
|
+
def alive_statuses
|
26
|
+
statuses.except(@death).keys
|
27
|
+
end
|
28
|
+
|
29
|
+
def status_keys
|
30
|
+
statuses.keys
|
31
|
+
end
|
32
|
+
|
33
|
+
def statuses_after(status)
|
34
|
+
return [] if final_status?(status)
|
35
|
+
|
36
|
+
statuses[status_after(status)..]
|
37
|
+
end
|
38
|
+
|
39
|
+
def statuses_before(status)
|
40
|
+
return [] if initial_status?(status)
|
41
|
+
|
42
|
+
index = status_keys.find_index(status)
|
43
|
+
status_keys[0...index]
|
44
|
+
end
|
45
|
+
|
46
|
+
def status_after(status)
|
47
|
+
return if final_status?(status)
|
48
|
+
|
49
|
+
index = status_keys.find_index(status)
|
50
|
+
status_keys[index + 1]
|
51
|
+
end
|
52
|
+
|
53
|
+
def status_before(status)
|
54
|
+
return if initial_status?(status)
|
55
|
+
|
56
|
+
index = status_keys.find_index(status)
|
57
|
+
status_keys[index - 1]
|
58
|
+
end
|
59
|
+
|
60
|
+
def final_status
|
61
|
+
status_keys.last
|
62
|
+
end
|
63
|
+
|
64
|
+
def final_status?(status)
|
65
|
+
final_status == status
|
66
|
+
end
|
67
|
+
|
68
|
+
def initial_status
|
69
|
+
statuses.key(0)
|
70
|
+
end
|
71
|
+
|
72
|
+
def dead_status
|
73
|
+
@death
|
74
|
+
end
|
75
|
+
|
76
|
+
def initial_status?(status)
|
77
|
+
initial_status == status
|
78
|
+
end
|
79
|
+
|
80
|
+
def stages_with_ranges
|
81
|
+
@life_stages.map(&method(:to_stage_with_range)).to_h
|
82
|
+
end
|
83
|
+
|
84
|
+
def to_stage_with_range(stage, delimiter)
|
85
|
+
[stage, (statuses[delimiter.first]..statuses[delimiter.last])]
|
86
|
+
end
|
87
|
+
|
88
|
+
def life_stages
|
89
|
+
@life_stages
|
90
|
+
end
|
91
|
+
|
92
|
+
def life_stages_for(status)
|
93
|
+
stages_with_ranges.keys.select do |stage|
|
94
|
+
stages_with_ranges[stage].include? statuses[status]
|
95
|
+
end
|
96
|
+
end
|
97
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module ActsAsLiving::EnumDefiner
|
4
|
+
def self.call(klass)
|
5
|
+
klass.class_eval do
|
6
|
+
extend ClassMethods
|
7
|
+
|
8
|
+
enum @column => enum_options
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
module ClassMethods
|
13
|
+
def enum_options
|
14
|
+
statuses = @status_keys.map.with_index(&method(:to_enum_map)).to_h
|
15
|
+
statuses.merge(@death => @spread * -1)
|
16
|
+
end
|
17
|
+
|
18
|
+
def to_enum_map(status, index)
|
19
|
+
[status, index * @spread]
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,141 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module ActsAsLiving::InstanceMethodsDefiner
|
4
|
+
def self.call(klass)
|
5
|
+
klass.class_eval do
|
6
|
+
extend ClassMethods
|
7
|
+
include InstanceMethods
|
8
|
+
|
9
|
+
@life_stages.each(&method(:define_stage_queries))
|
10
|
+
|
11
|
+
@status_keys.each(&method(:define_changed_queries))
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
module InstanceMethods
|
16
|
+
def status_after(status)
|
17
|
+
self.class.status_after(status)
|
18
|
+
end
|
19
|
+
|
20
|
+
def statuses
|
21
|
+
self.class.statuses
|
22
|
+
end
|
23
|
+
|
24
|
+
def status_before(status)
|
25
|
+
self.class.status_before(status)
|
26
|
+
end
|
27
|
+
|
28
|
+
def to_next_status
|
29
|
+
update(status: next_status)
|
30
|
+
end
|
31
|
+
|
32
|
+
def to_next_status!
|
33
|
+
update!(status: next_status)
|
34
|
+
end
|
35
|
+
|
36
|
+
def next_status
|
37
|
+
status_after(status) if status
|
38
|
+
end
|
39
|
+
|
40
|
+
def to_previous_status
|
41
|
+
update(status: previous_status)
|
42
|
+
end
|
43
|
+
|
44
|
+
def to_previous_status!
|
45
|
+
update!(status: previous_status)
|
46
|
+
end
|
47
|
+
|
48
|
+
def previous_status
|
49
|
+
status_before(status)
|
50
|
+
end
|
51
|
+
|
52
|
+
def final_status?
|
53
|
+
self.class.final_status?(status)
|
54
|
+
end
|
55
|
+
|
56
|
+
def initial_status?
|
57
|
+
self.class.initial_status?(status)
|
58
|
+
end
|
59
|
+
|
60
|
+
def dead_status?
|
61
|
+
self.class.dead_status == status
|
62
|
+
end
|
63
|
+
|
64
|
+
def dead_or_finalized?
|
65
|
+
dead_status? || final_status?
|
66
|
+
end
|
67
|
+
|
68
|
+
def klass_stages_with_ranges
|
69
|
+
self.class.stages_with_ranges
|
70
|
+
end
|
71
|
+
|
72
|
+
def klass_life_stages_for(status)
|
73
|
+
self.class.life_stages_for(status)
|
74
|
+
end
|
75
|
+
|
76
|
+
def klass_statuses
|
77
|
+
self.class.statuses
|
78
|
+
end
|
79
|
+
|
80
|
+
def locked?(&block)
|
81
|
+
return unless block
|
82
|
+
|
83
|
+
@locked_on.to_set.intersect? [status, status_was].to_set
|
84
|
+
end
|
85
|
+
|
86
|
+
def life_stages
|
87
|
+
klass_life_stages_for(status)
|
88
|
+
end
|
89
|
+
|
90
|
+
def life_stage_changed?
|
91
|
+
klass_life_stages_for(status) != klass_life_stages_for(status_was)
|
92
|
+
end
|
93
|
+
|
94
|
+
def life_stages_started
|
95
|
+
klass_life_stages_for(status) - klass_life_stages_for(status_was)
|
96
|
+
end
|
97
|
+
|
98
|
+
def life_stages_ended
|
99
|
+
klass_life_stages_for(status_was) - klass_life_stages_for(status)
|
100
|
+
end
|
101
|
+
end
|
102
|
+
|
103
|
+
module ClassMethods
|
104
|
+
def define_stage_queries(stage, delimiters)
|
105
|
+
define_method("#{stage}?") do
|
106
|
+
if delimiters.length == 1
|
107
|
+
klass_statuses[status] == klass_statuses[delimiters]
|
108
|
+
else
|
109
|
+
klass_statuses[status] >= klass_statuses[delimiters.first] &&
|
110
|
+
klass_statuses[status] <= klass_statuses[delimiters.second]
|
111
|
+
end
|
112
|
+
end
|
113
|
+
|
114
|
+
define_method("pre_#{stage}?") do
|
115
|
+
klass_statuses[status] < klass_statuses[delimiters.first] unless cancelled?
|
116
|
+
end
|
117
|
+
|
118
|
+
define_method("past_#{stage}?") do
|
119
|
+
klass_statuses[status] > klass_statuses[delimiters.last] || cancelled?
|
120
|
+
end
|
121
|
+
end
|
122
|
+
|
123
|
+
def define_changed_queries(status_key)
|
124
|
+
define_method("status_changed_to_#{status_key}?") do
|
125
|
+
status_changed? && status_was == status_key
|
126
|
+
end
|
127
|
+
|
128
|
+
define_method("pre_#{status_key}?") do
|
129
|
+
klass_statuses[status] < klass_statuses[status_key] unless cancelled?
|
130
|
+
end
|
131
|
+
|
132
|
+
define_method("past_#{status_key}?") do
|
133
|
+
klass_statuses[status] > klass_statuses[status_key] || cancelled?
|
134
|
+
end
|
135
|
+
|
136
|
+
define_method("cancelled_from_#{status_key}?") do
|
137
|
+
status == 'cancelled' && status_was == status_key
|
138
|
+
end
|
139
|
+
end
|
140
|
+
end
|
141
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'active_support'
|
4
|
+
require 'rails/railtie'
|
5
|
+
|
6
|
+
module ActsAsLiving
|
7
|
+
class Railtie < Rails::Railtie
|
8
|
+
config.to_prepare do
|
9
|
+
ActiveSupport.on_load(:active_record) do
|
10
|
+
extend ActsAsLiving::ClassMethods
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
module ActsAsLiving::ScopesDefiner
|
2
|
+
def self.call(klass)
|
3
|
+
klass.class_eval do
|
4
|
+
statuses.each do |status, _num|
|
5
|
+
scope "past_#{status}", -> { where('status >= ?', statuses[status]) }
|
6
|
+
scope "pre_#{status}", -> { where('status < ?', statuses[status]) }
|
7
|
+
scope "not_#{status}", -> { where.not(status: status) }
|
8
|
+
end
|
9
|
+
|
10
|
+
scope :cancelled, -> { where('status < 0') }
|
11
|
+
|
12
|
+
@life_stages.each do |stage, delimiters|
|
13
|
+
if delimiters.length == 1
|
14
|
+
scope stage, -> { where(status: delimiters.first) }
|
15
|
+
else
|
16
|
+
scope stage, lambda {
|
17
|
+
where('status >= ? AND status <= ?', statuses[delimiters.first], statuses[delimiters.second])
|
18
|
+
}
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
module ActsAsLiving::ValidationsDefiner
|
2
|
+
def self.call(klass)
|
3
|
+
klass.class_eval do
|
4
|
+
include InstanceMethods
|
5
|
+
|
6
|
+
validates :status, presence: true
|
7
|
+
|
8
|
+
validate :status_progression, on: :update, if: :status_changed?
|
9
|
+
validate :initialized_status, on: :create, if: :status_changed?
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
module InstanceMethods
|
14
|
+
def status_progression
|
15
|
+
return if status.to_s == self.class.dead_status.to_s || status == status_after(status_was)
|
16
|
+
|
17
|
+
message = if status_was == self.class.final_status
|
18
|
+
"The contract can only be updated to '#{self.class.dead_status}'"
|
19
|
+
else
|
20
|
+
"The contract can only be updated to '#{self.class.dead_status}' or '#{status_after(status_was)}'"
|
21
|
+
end
|
22
|
+
|
23
|
+
errors.add(:status, message)
|
24
|
+
end
|
25
|
+
|
26
|
+
def initialized_status
|
27
|
+
return if status == self.class.initial_status
|
28
|
+
|
29
|
+
errors.add(:status, "Contract has to be initialized with '#{self.class.initial_status}' status")
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
metadata
ADDED
@@ -0,0 +1,117 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: acts_as_living
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Guilherme Andrade
|
8
|
+
autorequire:
|
9
|
+
bindir: exe
|
10
|
+
cert_chain: []
|
11
|
+
date: 2020-07-01 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: '6.0'
|
20
|
+
- - ">="
|
21
|
+
- !ruby/object:Gem::Version
|
22
|
+
version: 6.0.3
|
23
|
+
type: :runtime
|
24
|
+
prerelease: false
|
25
|
+
version_requirements: !ruby/object:Gem::Requirement
|
26
|
+
requirements:
|
27
|
+
- - "~>"
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: '6.0'
|
30
|
+
- - ">="
|
31
|
+
- !ruby/object:Gem::Version
|
32
|
+
version: 6.0.3
|
33
|
+
- !ruby/object:Gem::Dependency
|
34
|
+
name: activesupport
|
35
|
+
requirement: !ruby/object:Gem::Requirement
|
36
|
+
requirements:
|
37
|
+
- - "~>"
|
38
|
+
- !ruby/object:Gem::Version
|
39
|
+
version: '6.0'
|
40
|
+
- - ">="
|
41
|
+
- !ruby/object:Gem::Version
|
42
|
+
version: 6.0.3
|
43
|
+
type: :runtime
|
44
|
+
prerelease: false
|
45
|
+
version_requirements: !ruby/object:Gem::Requirement
|
46
|
+
requirements:
|
47
|
+
- - "~>"
|
48
|
+
- !ruby/object:Gem::Version
|
49
|
+
version: '6.0'
|
50
|
+
- - ">="
|
51
|
+
- !ruby/object:Gem::Version
|
52
|
+
version: 6.0.3
|
53
|
+
- !ruby/object:Gem::Dependency
|
54
|
+
name: railties
|
55
|
+
requirement: !ruby/object:Gem::Requirement
|
56
|
+
requirements:
|
57
|
+
- - "~>"
|
58
|
+
- !ruby/object:Gem::Version
|
59
|
+
version: '6.0'
|
60
|
+
- - ">="
|
61
|
+
- !ruby/object:Gem::Version
|
62
|
+
version: 6.0.3
|
63
|
+
type: :runtime
|
64
|
+
prerelease: false
|
65
|
+
version_requirements: !ruby/object:Gem::Requirement
|
66
|
+
requirements:
|
67
|
+
- - "~>"
|
68
|
+
- !ruby/object:Gem::Version
|
69
|
+
version: '6.0'
|
70
|
+
- - ">="
|
71
|
+
- !ruby/object:Gem::Version
|
72
|
+
version: 6.0.3
|
73
|
+
description: An ActiveRecord plugin that assists in acts_as_living status progressions.
|
74
|
+
email:
|
75
|
+
- guilherme.andrade.ao@gmail.com
|
76
|
+
executables: []
|
77
|
+
extensions: []
|
78
|
+
extra_rdoc_files: []
|
79
|
+
files:
|
80
|
+
- Changelog.md
|
81
|
+
- README.md
|
82
|
+
- lib/acts_as_living.rb
|
83
|
+
- lib/acts_as_living/callbacks_definer.rb
|
84
|
+
- lib/acts_as_living/class_methods.rb
|
85
|
+
- lib/acts_as_living/enum_definer.rb
|
86
|
+
- lib/acts_as_living/instance_methods_definer.rb
|
87
|
+
- lib/acts_as_living/railtie.rb
|
88
|
+
- lib/acts_as_living/scopes_definer.rb
|
89
|
+
- lib/acts_as_living/validations_definer.rb
|
90
|
+
- lib/acts_as_living/version.rb
|
91
|
+
homepage: https://github.com/guilherme-andrade/acts_as_living
|
92
|
+
licenses:
|
93
|
+
- MIT
|
94
|
+
metadata:
|
95
|
+
homepage_uri: https://github.com/guilherme-andrade/acts_as_living
|
96
|
+
source_code_uri: https://github.com/guilherme-andrade/acts_as_living
|
97
|
+
changelog_uri: https://github.com/guilherme-andrade/acts_as_living/blob/master/Changelog.md
|
98
|
+
post_install_message:
|
99
|
+
rdoc_options: []
|
100
|
+
require_paths:
|
101
|
+
- lib
|
102
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
103
|
+
requirements:
|
104
|
+
- - ">="
|
105
|
+
- !ruby/object:Gem::Version
|
106
|
+
version: '0'
|
107
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
108
|
+
requirements:
|
109
|
+
- - ">="
|
110
|
+
- !ruby/object:Gem::Version
|
111
|
+
version: '0'
|
112
|
+
requirements: []
|
113
|
+
rubygems_version: 3.0.3
|
114
|
+
signing_key:
|
115
|
+
specification_version: 4
|
116
|
+
summary: An ActiveRecord plugin that assists in acts_as_living status progressions.
|
117
|
+
test_files: []
|