activekit 0.2.3.dev1 → 0.2.3.dev2
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 +4 -4
- data/lib/active_kit/{activekitable.rb → base/activekitable.rb} +2 -1
- data/lib/active_kit/base/activekiter.rb +17 -0
- data/lib/active_kit/base/ensure.rb +29 -0
- data/lib/active_kit/base/middleware.rb +26 -0
- data/lib/active_kit/base/relation.rb +9 -0
- data/lib/active_kit/base.rb +10 -0
- data/lib/active_kit/engine.rb +3 -3
- data/lib/active_kit/schedule/middleware.rb +12 -0
- data/lib/active_kit/schedule/schedule.rb +24 -0
- data/lib/active_kit/schedule/scheduleable.rb +97 -0
- data/lib/active_kit/schedule.rb +8 -0
- data/lib/active_kit/sequence/sequence.rb +1 -1
- data/lib/active_kit/sequence/sequenceable.rb +1 -1
- data/lib/active_kit/version.rb +1 -1
- data/lib/active_kit.rb +2 -4
- metadata +11 -6
- data/lib/active_kit/activekiter.rb +0 -11
- data/lib/active_kit/loader.rb +0 -26
- data/lib/active_kit/middleware.rb +0 -24
- data/lib/active_kit/relation.rb +0 -7
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 95241693c8cee6d5b29f2f8172abf1a5b31f70ea29a529595db9d5f71d24b948
|
4
|
+
data.tar.gz: e00f4986129a42c3444daee94921081738e763f9edd9de704567b0f9aab7eb3e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 29b391870a0332435dcfdd39aa7995483689e5bb1b1c3a54fe81b7a0ace8165295f953b2afd82bf973e152b63cfb9d396a4a9dedc99bcaeb12e1d93b0682fa07
|
7
|
+
data.tar.gz: b9855efff5f9d7de6e0ec73f5dde1f501cab9cba507d2a0d7914fc2920e66443553df7ade87b411e0fbb2fdcbb5141c49a4687e5a0a505d37d4e77ee2ff6844b
|
@@ -2,9 +2,9 @@ require 'active_support/concern'
|
|
2
2
|
require "active_kit/sequence/sequenceable"
|
3
3
|
|
4
4
|
module ActiveKit
|
5
|
+
module Base
|
5
6
|
module Activekitable
|
6
7
|
extend ActiveSupport::Concern
|
7
|
-
include ActiveKit::Loader
|
8
8
|
include ActiveKit::Sequence::Sequenceable
|
9
9
|
|
10
10
|
included do
|
@@ -13,4 +13,5 @@ module ActiveKit
|
|
13
13
|
class_methods do
|
14
14
|
end
|
15
15
|
end
|
16
|
+
end
|
16
17
|
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
module ActiveKit
|
2
|
+
module Base
|
3
|
+
class Activekiter
|
4
|
+
def initialize(current_class:)
|
5
|
+
@current_class = current_class
|
6
|
+
end
|
7
|
+
|
8
|
+
def schedule
|
9
|
+
@schedule ||= ActiveKit::Schedule::Schedule.new(current_class: @current_class)
|
10
|
+
end
|
11
|
+
|
12
|
+
def sequence
|
13
|
+
@sequence ||= ActiveKit::Sequence::Sequence.new(current_class: @current_class)
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
module ActiveKit
|
2
|
+
module Base
|
3
|
+
class Ensure
|
4
|
+
def self.middleware_for!(request:)
|
5
|
+
ActiveKit::Schedule::Middleware.run
|
6
|
+
end
|
7
|
+
|
8
|
+
def self.setup_for!(current_class:)
|
9
|
+
current_class.class_eval do
|
10
|
+
unless self.reflect_on_association :activekit_association
|
11
|
+
has_one :activekit_association, as: :record, dependent: :destroy, class_name: "ActiveKit::Attribute"
|
12
|
+
|
13
|
+
def activekit
|
14
|
+
@activekit ||= Relation.new(current_object: self)
|
15
|
+
end
|
16
|
+
|
17
|
+
def self.activekiter
|
18
|
+
@activekiter ||= Activekiter.new(current_class: self)
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
def self.has_one_association_for!(record:)
|
25
|
+
record.create_activekit_association unless record.activekit_association
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
module ActiveKit
|
2
|
+
module Base
|
3
|
+
class Middleware
|
4
|
+
def initialize(app)
|
5
|
+
@app = app
|
6
|
+
end
|
7
|
+
|
8
|
+
# Middleware that determines which ActiveKit middlewares to run.
|
9
|
+
def call(env)
|
10
|
+
request = ActionDispatch::Request.new(env)
|
11
|
+
|
12
|
+
activekit_runner(request) do
|
13
|
+
@app.call(env)
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
private
|
18
|
+
|
19
|
+
def activekit_runner(request, &blk)
|
20
|
+
Ensure.middleware_for!(request: request)
|
21
|
+
|
22
|
+
yield
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
data/lib/active_kit/engine.rb
CHANGED
@@ -4,14 +4,14 @@ module ActiveKit
|
|
4
4
|
config.eager_load_namespaces << ActiveKit
|
5
5
|
|
6
6
|
initializer "active_kit.add_middleware" do |app|
|
7
|
-
app.middleware.use ActiveKit::Middleware
|
7
|
+
app.middleware.use ActiveKit::Base::Middleware
|
8
8
|
end
|
9
9
|
|
10
10
|
initializer "active_kit.activekitable" do
|
11
|
-
require "active_kit/activekitable"
|
11
|
+
require "active_kit/base/activekitable"
|
12
12
|
|
13
13
|
ActiveSupport.on_load(:active_record) do
|
14
|
-
include ActiveKit::Activekitable
|
14
|
+
include ActiveKit::Base::Activekitable
|
15
15
|
end
|
16
16
|
end
|
17
17
|
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
module ActiveKit
|
2
|
+
module Schedule
|
3
|
+
class Middleware
|
4
|
+
def self.run(request:)
|
5
|
+
logger.info "coming from middleware of activekit schedule"
|
6
|
+
# activekit_attribute = ActiveKit::Attribute.where(value: schedule: timestamp < DateTime.now).order(updated_at: :desc)
|
7
|
+
# json_where = 'value->"$.schedule.attributes.' + attribute_name.to_s + '" = "' + word_for_position + '"'
|
8
|
+
# record_at_position = ActiveKit::Attribute.where(record_type: record.class.name).where(json_where).first&.record
|
9
|
+
end
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
module ActiveKit
|
2
|
+
module Schedule
|
3
|
+
class Schedule
|
4
|
+
attr_reader :defined_attributes
|
5
|
+
|
6
|
+
def initialize(current_class:)
|
7
|
+
@current_class = current_class
|
8
|
+
|
9
|
+
@defined_attributes = {}
|
10
|
+
end
|
11
|
+
|
12
|
+
def add(record:, attribute_name:, datetime:, method:)
|
13
|
+
ActiveKit::Base::Ensure.has_one_association_for!(record: record)
|
14
|
+
|
15
|
+
record.activekit_association.schedule[:attributes][attribute_name.to_sym] = nil
|
16
|
+
record.activekit_association.save!
|
17
|
+
end
|
18
|
+
|
19
|
+
def add_attribute(name:, options:)
|
20
|
+
@defined_attributes.store(name, options)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,97 @@
|
|
1
|
+
require 'active_support/concern'
|
2
|
+
|
3
|
+
module ActiveKit
|
4
|
+
module Schedule
|
5
|
+
module Scheduleable
|
6
|
+
extend ActiveSupport::Concern
|
7
|
+
|
8
|
+
included do
|
9
|
+
end
|
10
|
+
|
11
|
+
class_methods do
|
12
|
+
# Usage Options
|
13
|
+
# schedule_attribute :name, :run_method, :begin_at, :end_at
|
14
|
+
# schedule_attribute :name, :run_method, :timestamp_method, updater: {}
|
15
|
+
# schedule_attribute :name, :run_method, :timestamp_method, updater: { on: {} }
|
16
|
+
# schedule_attribute :name, :run_method, :timestamp_method, updater: { via: :assoc, on: {} }
|
17
|
+
# schedule_attribute :name, :run_method, :timestamp_method, updater: { via: {}, on: {} }
|
18
|
+
# Note: :on and :via in :updater can accept nested associations.
|
19
|
+
def schedule_attribute(name, run_method, timestamp_method, interval, **options)
|
20
|
+
ActiveKit::Base::Ensure.setup_for!(current_class: self)
|
21
|
+
|
22
|
+
name = name.to_sym
|
23
|
+
options.store(:run_method, run_method&.to_sym)
|
24
|
+
options.store(:timestamp_method, datetime_method&.to_sym)
|
25
|
+
options.deep_symbolize_keys!
|
26
|
+
|
27
|
+
set_activekit_schedule_callbacks(name: name, options: options)
|
28
|
+
activekiter.schedule.add_attribute(name: name, options: options)
|
29
|
+
end
|
30
|
+
|
31
|
+
def set_activekit_schedule_callbacks(name:, options:)
|
32
|
+
run_method = options.dig(:run_method)
|
33
|
+
updater = options.dig(:updater) || {}
|
34
|
+
|
35
|
+
if updater.empty?
|
36
|
+
after_save do
|
37
|
+
self.class.activekiter.schedule.update(record: self, name: name, run_method: run_method)
|
38
|
+
logger.info "ActiveKit | Schedule - Scheduling from #{self.class.name}: Done."
|
39
|
+
end
|
40
|
+
else
|
41
|
+
raise ":updater should be a hash while setting sequence_attribute. " unless updater.is_a?(Hash)
|
42
|
+
raise ":on in :updater should be a hash while setting sequence_attribute. " if updater.key?(:on) && !updater[:on].is_a?(Hash)
|
43
|
+
raise "Cannot use :via without :on in :updater while setting sequence_attribute. " if updater.key?(:via) && !updater.key?(:on)
|
44
|
+
|
45
|
+
updater_via = updater.delete(:via)
|
46
|
+
updater_on = updater.delete(:on) || updater
|
47
|
+
|
48
|
+
base_klass = search_base_klass(self.name, updater_via)
|
49
|
+
klass = reflected_klass(base_klass, updater_on.keys.first)
|
50
|
+
klass.constantize.class_eval do
|
51
|
+
after_save :activekit_sequence_sequenceable_callback
|
52
|
+
after_destroy :activekit_sequence_sequenceable_callback
|
53
|
+
|
54
|
+
define_method :activekit_sequence_sequenceable_callback do
|
55
|
+
inverse_assoc = self.class.search_inverse_assoc(self, updater_on)
|
56
|
+
position = positioning_method ? self.public_send(positioning_method) : nil
|
57
|
+
if inverse_assoc.respond_to?(:each)
|
58
|
+
inverse_assoc.each { |instance| instance.class.activekiter.sequence.update(record: instance, attribute_name: attribute_name, position: position) }
|
59
|
+
else
|
60
|
+
inverse_assoc.class.activekiter.sequence.update(record: inverse_assoc, attribute_name: attribute_name, position: position)
|
61
|
+
end
|
62
|
+
logger.info "ActiveSequence - Sequencing from #{self.class.name}: Done."
|
63
|
+
end
|
64
|
+
private :activekit_sequence_sequenceable_callback
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
def search_base_klass(classname, updater_via)
|
70
|
+
if updater_via.blank?
|
71
|
+
classname
|
72
|
+
elsif updater_via.is_a? Symbol
|
73
|
+
reflected_klass(classname, updater_via)
|
74
|
+
elsif updater_via.is_a? Hash
|
75
|
+
klass = reflected_klass(classname, updater_via.keys.first)
|
76
|
+
updater_via.values.first.is_a?(Hash) ? search_base_klass(klass, updater_via.values.first) : reflected_klass(klass, updater_via.values.first)
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
def reflected_klass(classname, key)
|
81
|
+
klass = classname.constantize.reflect_on_all_associations.map { |assoc| [assoc.name, assoc.klass.name] }.to_h[key]
|
82
|
+
raise "Could not find reflected klass for classname '#{classname}' and key '#{key}' while setting sequence_attribute" unless klass
|
83
|
+
klass
|
84
|
+
end
|
85
|
+
|
86
|
+
def search_inverse_assoc(klass_object, updater_on)
|
87
|
+
if updater_on.values.first.is_a?(Hash)
|
88
|
+
klass_object = klass_object.public_send(updater_on.values.first.keys.first)
|
89
|
+
search_inverse_assoc(klass_object, updater_on.values.first)
|
90
|
+
else
|
91
|
+
klass_object.public_send(updater_on.values.first)
|
92
|
+
end
|
93
|
+
end
|
94
|
+
end
|
95
|
+
end
|
96
|
+
end
|
97
|
+
end
|
@@ -11,7 +11,7 @@ module ActiveKit
|
|
11
11
|
end
|
12
12
|
|
13
13
|
def update(record:, attribute_name:, position:)
|
14
|
-
ActiveKit::
|
14
|
+
ActiveKit::Base::Ensure.has_one_association_for!(record: record)
|
15
15
|
|
16
16
|
if position
|
17
17
|
raise "position '#{position}' is not a valid unsigned integer value greater than 0." unless position.is_a?(Integer) && position > 0
|
@@ -18,7 +18,7 @@ module ActiveKit
|
|
18
18
|
# sequence_attribute :name, :positioning_method, updater: { via: {}, on: {} }
|
19
19
|
# Note: :on and :via in :updater can accept nested associations.
|
20
20
|
def sequence_attribute(name, positioning_method = nil, **options)
|
21
|
-
ActiveKit::
|
21
|
+
ActiveKit::Base::Ensure.setup_for!(current_class: self)
|
22
22
|
|
23
23
|
name = name.to_sym
|
24
24
|
options.store(:positioning_method, positioning_method&.to_sym)
|
data/lib/active_kit/version.rb
CHANGED
data/lib/active_kit.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: activekit
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.3.
|
4
|
+
version: 0.2.3.dev2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- plainsource
|
@@ -52,12 +52,17 @@ files:
|
|
52
52
|
- config/routes.rb
|
53
53
|
- db/migrate/20231016050208_create_active_kit_attributes.rb
|
54
54
|
- lib/active_kit.rb
|
55
|
-
- lib/active_kit/
|
56
|
-
- lib/active_kit/
|
55
|
+
- lib/active_kit/base.rb
|
56
|
+
- lib/active_kit/base/activekitable.rb
|
57
|
+
- lib/active_kit/base/activekiter.rb
|
58
|
+
- lib/active_kit/base/ensure.rb
|
59
|
+
- lib/active_kit/base/middleware.rb
|
60
|
+
- lib/active_kit/base/relation.rb
|
57
61
|
- lib/active_kit/engine.rb
|
58
|
-
- lib/active_kit/
|
59
|
-
- lib/active_kit/middleware.rb
|
60
|
-
- lib/active_kit/
|
62
|
+
- lib/active_kit/schedule.rb
|
63
|
+
- lib/active_kit/schedule/middleware.rb
|
64
|
+
- lib/active_kit/schedule/schedule.rb
|
65
|
+
- lib/active_kit/schedule/scheduleable.rb
|
61
66
|
- lib/active_kit/sequence.rb
|
62
67
|
- lib/active_kit/sequence/sequence.rb
|
63
68
|
- lib/active_kit/sequence/sequenceable.rb
|
data/lib/active_kit/loader.rb
DELETED
@@ -1,26 +0,0 @@
|
|
1
|
-
module ActiveKit
|
2
|
-
module Loader
|
3
|
-
def self.ensure_middleware_for!(request:)
|
4
|
-
end
|
5
|
-
|
6
|
-
def self.ensure_setup_for!(current_class:)
|
7
|
-
current_class.class_eval do
|
8
|
-
unless self.reflect_on_association :activekit_association
|
9
|
-
has_one :activekit_association, as: :record, dependent: :destroy, class_name: "ActiveKit::Attribute"
|
10
|
-
|
11
|
-
def activekit
|
12
|
-
@activekit ||= Relation.new(current_object: self)
|
13
|
-
end
|
14
|
-
|
15
|
-
def self.activekiter
|
16
|
-
@activekiter ||= Activekiter.new(current_class: self)
|
17
|
-
end
|
18
|
-
end
|
19
|
-
end
|
20
|
-
end
|
21
|
-
|
22
|
-
def self.ensure_has_one_association_for!(record:)
|
23
|
-
record.create_activekit_association unless record.activekit_association
|
24
|
-
end
|
25
|
-
end
|
26
|
-
end
|
@@ -1,24 +0,0 @@
|
|
1
|
-
module ActiveKit
|
2
|
-
class Middleware
|
3
|
-
def initialize(app)
|
4
|
-
@app = app
|
5
|
-
end
|
6
|
-
|
7
|
-
# Middleware that determines which ActiveKit schedules to run.
|
8
|
-
def call(env)
|
9
|
-
request = ActionDispatch::Request.new(env)
|
10
|
-
|
11
|
-
activekit_runner(request) do
|
12
|
-
@app.call(env)
|
13
|
-
end
|
14
|
-
end
|
15
|
-
|
16
|
-
private
|
17
|
-
|
18
|
-
def activekit_runner(request, &blk)
|
19
|
-
ActiveKit::Loader.ensure_middleware_for!(request: request)
|
20
|
-
|
21
|
-
yield
|
22
|
-
end
|
23
|
-
end
|
24
|
-
end
|