ephemeron 0.1.0 → 0.5.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 +4 -4
- data/lib/ephemeron.rb +13 -1
- data/lib/ephemeron/addons/model_addons.rb +1 -1
- data/lib/ephemeron/logger/finders.rb +0 -10
- data/lib/ephemeron/store/allow_fetch.rb +18 -0
- data/lib/ephemeron/store/convert.rb +4 -2
- data/lib/ephemeron/store/finders.rb +19 -0
- data/lib/ephemeron/store/update.rb +2 -2
- data/lib/ephemeron/validators/store/allowed_but_unsaved.rb +1 -1
- data/lib/ephemeron/version.rb +1 -1
- data/lib/ephemeron/writers/logger.rb +3 -3
- data/lib/ephemeron/writers/store.rb +27 -12
- metadata +33 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 3bb6daaac01582150f1f3c3cd12865e5766966ca1671afb2f29f2b5ff536b30a
|
4
|
+
data.tar.gz: 1fb117784cfc5135b48d8a4dc4cee7fc43c29cdc1e256a760b15318b08b86a3e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 0e0d60880cbbf2005071bfe83a1ed0ef8abb634160130dea0488c8a3dc30b534a89649f29628d999db156e6d94dd830a4fd9339cafb0727664df8d19f113d9c3
|
7
|
+
data.tar.gz: 88dc0d8d8280b61f8fb705d02e7493e9a87f560e28a7afe9435f01b8aaab89003eb0c872d46d29eecf18f68fb315f3d57d2f265dce746d38822f35644a607232
|
data/lib/ephemeron.rb
CHANGED
@@ -14,7 +14,9 @@ require 'ephemeron/errors'
|
|
14
14
|
require 'ephemeron/logger/convert'
|
15
15
|
require 'ephemeron/logger/finders'
|
16
16
|
require 'ephemeron/settings'
|
17
|
+
require 'ephemeron/store/allow_fetch'
|
17
18
|
require 'ephemeron/store/convert'
|
19
|
+
require 'ephemeron/store/finders'
|
18
20
|
require 'ephemeron/store/update'
|
19
21
|
require 'ephemeron/validators/before_save'
|
20
22
|
require 'ephemeron/validators/store'
|
@@ -46,8 +48,9 @@ module Ephemeron
|
|
46
48
|
|
47
49
|
def proxy
|
48
50
|
Logger.log nil, :proxy_start
|
49
|
-
yield
|
51
|
+
res = yield
|
50
52
|
Logger.log nil, :proxy_end
|
53
|
+
res
|
51
54
|
end
|
52
55
|
|
53
56
|
def get(key)
|
@@ -64,6 +67,15 @@ module Ephemeron
|
|
64
67
|
model_s
|
65
68
|
end
|
66
69
|
|
70
|
+
def allow_fetch!(model_or_key)
|
71
|
+
model = if model_or_key.is_a?(String)
|
72
|
+
Ephemeron.get(model_or_key)
|
73
|
+
else
|
74
|
+
model_or_key
|
75
|
+
end
|
76
|
+
model.tap { |m| Logger.log m, :fetch_allowed }
|
77
|
+
end
|
78
|
+
|
67
79
|
def allow_save!(model)
|
68
80
|
model.tap { |m| Logger.log m, :save_allowed }
|
69
81
|
end
|
@@ -9,16 +9,6 @@ module Ephemeron
|
|
9
9
|
Logger.logs
|
10
10
|
.filter { |l| events.any? { |e| l == Logger::Convert.call(model, e) } }
|
11
11
|
end
|
12
|
-
|
13
|
-
def find_first_allowed_but_unsaved
|
14
|
-
ary = Logger.logs
|
15
|
-
.reverse
|
16
|
-
.map { |line| line.split ' ' }
|
17
|
-
.find { |arr| %w[save_allowed saved].include?(arr[1]) }
|
18
|
-
return nil if ary.nil? || ary[1] == 'saved'
|
19
|
-
|
20
|
-
Store.store[ary[0]]
|
21
|
-
end
|
22
12
|
end
|
23
13
|
end
|
24
14
|
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Ephemeron
|
4
|
+
class Store
|
5
|
+
module AllowFetch
|
6
|
+
module_function
|
7
|
+
|
8
|
+
def call(model)
|
9
|
+
last_events = Ephemeron::Logger::Finders
|
10
|
+
.find_all_events_for(model, :fetch_allowed, :fetched)
|
11
|
+
.last(2)
|
12
|
+
cond1 = last_events[0] == Logger::Convert.call(model, :fetch_allowed)
|
13
|
+
cond2 = last_events[1] == Logger::Convert.call(model, :fetched)
|
14
|
+
cond1 && cond2
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -5,14 +5,16 @@ module Ephemeron
|
|
5
5
|
class Convert
|
6
6
|
class << self
|
7
7
|
def call(model_s, as_new_record: false)
|
8
|
-
|
8
|
+
if model_s.is_a?(ActiveRecord::Base)
|
9
|
+
return class_name_and_id(model_s, as_new_record: as_new_record)
|
10
|
+
end
|
9
11
|
|
10
12
|
model_s.map { |model| class_name_and_id(model) }.join ', '
|
11
13
|
end
|
12
14
|
|
13
15
|
private
|
14
16
|
|
15
|
-
def class_name_and_id(model, as_new_record
|
17
|
+
def class_name_and_id(model, as_new_record: false)
|
16
18
|
new_record = as_new_record || model.new_record?
|
17
19
|
name = model.class.name.downcase
|
18
20
|
id = new_record ? "new_record##{model.object_id}" : model.id
|
@@ -0,0 +1,19 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Ephemeron
|
4
|
+
class Store
|
5
|
+
module Finders
|
6
|
+
module_function
|
7
|
+
|
8
|
+
def find_first_allowed_but_unsaved
|
9
|
+
ary = Logger.logs
|
10
|
+
.reverse
|
11
|
+
.map { |line| line.split ' ' }
|
12
|
+
.find { |arr| %w[save_allowed saved].include?(arr[1]) }
|
13
|
+
return nil if ary.nil? || ary[1] == 'saved'
|
14
|
+
|
15
|
+
Store.store[ary[0]]
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -12,8 +12,8 @@ module Ephemeron
|
|
12
12
|
Store.store.delete Convert.call(model, as_new_record: true)
|
13
13
|
|
14
14
|
Store.aliases.find_all { |_, v| v == Convert.call(model, as_new_record: true) }
|
15
|
-
.to_h
|
16
|
-
.
|
15
|
+
.to_h
|
16
|
+
.each_key { |key| Store.aliases[key] = Convert.call(model) }
|
17
17
|
end
|
18
18
|
end
|
19
19
|
end
|
data/lib/ephemeron/version.rb
CHANGED
@@ -5,7 +5,7 @@ module Ephemeron
|
|
5
5
|
attribute :ts_logs
|
6
6
|
|
7
7
|
PROXY_EVENTS = %i[proxy_start proxy_end].freeze
|
8
|
-
VALID_EVENTS = %i[saved save_allowed skip_save used] + PROXY_EVENTS
|
8
|
+
VALID_EVENTS = %i[fetched fetch_allowed saved save_allowed skip_save used] + PROXY_EVENTS
|
9
9
|
|
10
10
|
def logs
|
11
11
|
self.ts_logs ||= []
|
@@ -16,11 +16,11 @@ module Ephemeron
|
|
16
16
|
logs.include? Convert.call(model, event)
|
17
17
|
end
|
18
18
|
|
19
|
-
def log(model, event,
|
19
|
+
def log(model, event, opts = {})
|
20
20
|
validate model, event
|
21
21
|
logs << Convert.call(model, event)
|
22
22
|
rescue LoggerError, StoreError => e
|
23
|
-
raise e unless soft
|
23
|
+
raise e unless opts[:soft]
|
24
24
|
end
|
25
25
|
|
26
26
|
def reset
|
@@ -16,24 +16,21 @@ module Ephemeron
|
|
16
16
|
!store[Convert.call(model, as_new_record: as_new_record)].nil?
|
17
17
|
end
|
18
18
|
|
19
|
-
def add(model,
|
19
|
+
def add(model, opts = {})
|
20
20
|
return unless Validators::StoreElement.call(model)
|
21
21
|
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
aliases[as] = key
|
27
|
-
elsif in_store
|
28
|
-
raise StoreError, "#{key} is already in the store"
|
29
|
-
end
|
22
|
+
in_store_before = stored?(model)
|
23
|
+
store[to_store_key(model)] = model unless stored?(model)
|
24
|
+
Logger.log(model, :fetched) if opts[:log]
|
25
|
+
add_alias(model, opts[:as], in_store_before)
|
30
26
|
model
|
31
27
|
end
|
32
28
|
|
33
29
|
def get(key)
|
34
|
-
store[
|
35
|
-
|
36
|
-
|
30
|
+
model = store[key]
|
31
|
+
model ||= store[aliases[key]]
|
32
|
+
Logger.log(model, :used) if model
|
33
|
+
model
|
37
34
|
end
|
38
35
|
|
39
36
|
def validate
|
@@ -62,5 +59,23 @@ module Ephemeron
|
|
62
59
|
self.ts_store = {}
|
63
60
|
self.ts_aliases = {}
|
64
61
|
end
|
62
|
+
|
63
|
+
private
|
64
|
+
|
65
|
+
def to_store_key(model)
|
66
|
+
Convert.call(model)
|
67
|
+
end
|
68
|
+
|
69
|
+
def stored?(model)
|
70
|
+
!store[to_store_key(model)].nil?
|
71
|
+
end
|
72
|
+
|
73
|
+
def add_alias(model, as, in_store_before)
|
74
|
+
if !as.nil?
|
75
|
+
aliases[as] = to_store_key(model)
|
76
|
+
elsif in_store_before && !Store::AllowFetch.call(model)
|
77
|
+
raise StoreError, "#{to_store_key(model)} is already in the store"
|
78
|
+
end
|
79
|
+
end
|
65
80
|
end
|
66
81
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ephemeron
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.5.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Zbigniew Humeniuk
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2020-
|
11
|
+
date: 2020-08-28 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rails
|
@@ -58,6 +58,34 @@ dependencies:
|
|
58
58
|
- - "~>"
|
59
59
|
- !ruby/object:Gem::Version
|
60
60
|
version: '3.9'
|
61
|
+
- !ruby/object:Gem::Dependency
|
62
|
+
name: rubocop
|
63
|
+
requirement: !ruby/object:Gem::Requirement
|
64
|
+
requirements:
|
65
|
+
- - ">="
|
66
|
+
- !ruby/object:Gem::Version
|
67
|
+
version: '0'
|
68
|
+
type: :development
|
69
|
+
prerelease: false
|
70
|
+
version_requirements: !ruby/object:Gem::Requirement
|
71
|
+
requirements:
|
72
|
+
- - ">="
|
73
|
+
- !ruby/object:Gem::Version
|
74
|
+
version: '0'
|
75
|
+
- !ruby/object:Gem::Dependency
|
76
|
+
name: rubocop-rails
|
77
|
+
requirement: !ruby/object:Gem::Requirement
|
78
|
+
requirements:
|
79
|
+
- - ">="
|
80
|
+
- !ruby/object:Gem::Version
|
81
|
+
version: '0'
|
82
|
+
type: :development
|
83
|
+
prerelease: false
|
84
|
+
version_requirements: !ruby/object:Gem::Requirement
|
85
|
+
requirements:
|
86
|
+
- - ">="
|
87
|
+
- !ruby/object:Gem::Version
|
88
|
+
version: '0'
|
61
89
|
- !ruby/object:Gem::Dependency
|
62
90
|
name: sqlite3
|
63
91
|
requirement: !ruby/object:Gem::Requirement
|
@@ -98,7 +126,9 @@ files:
|
|
98
126
|
- lib/ephemeron/logger/finders.rb
|
99
127
|
- lib/ephemeron/railtie.rb
|
100
128
|
- lib/ephemeron/settings.rb
|
129
|
+
- lib/ephemeron/store/allow_fetch.rb
|
101
130
|
- lib/ephemeron/store/convert.rb
|
131
|
+
- lib/ephemeron/store/finders.rb
|
102
132
|
- lib/ephemeron/store/update.rb
|
103
133
|
- lib/ephemeron/validators/before_save.rb
|
104
134
|
- lib/ephemeron/validators/store.rb
|
@@ -123,7 +153,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
123
153
|
requirements:
|
124
154
|
- - ">="
|
125
155
|
- !ruby/object:Gem::Version
|
126
|
-
version:
|
156
|
+
version: 2.6.0
|
127
157
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
128
158
|
requirements:
|
129
159
|
- - ">="
|