ephemeron 0.1.0 → 0.5.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|
- - ">="
|