ephemeron 0.2.1 → 0.6.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 85b00f989b7f6a03f398cf1bcca07ff5ad6af716d25dfbf4927fcbe6753f51ca
4
- data.tar.gz: c73dbe174fc3b31fcd41e0825a081e2168ee7fa7aa4074dd5d227cf24215a92e
3
+ metadata.gz: ace736b9303d937a44b00aa85605953a10c758a821cdcdd8a9645ac69640379a
4
+ data.tar.gz: 3bc12d1a15769e6270d2f4aa3fbb049bfe6688bd38adf4228346b452c43807aa
5
5
  SHA512:
6
- metadata.gz: cfa43027d3191f849a467a54dec03a7228e0c75bec118d737b2b37ea3c2b0e56f8f9b9973cd4f8a6387377305ed1cb7c41352cfd17c5e1430370d3e96b780ab6
7
- data.tar.gz: 54d98852dbb6f365396fb2c3db14b7ccfddb4b5d41dc54935d8c37415d6c3ebc416b0f4ceb6f289747b74234db70cc965e0edca41477c0b967472df30a4ab19f
6
+ metadata.gz: fbf16a76ebb392addee9d80b821942f76a3dfcf2c30cc7e0c427c55f2525ad120b3b890f60b93e50d6f22c65884fc273d1dd87e7d44848fbd241a9771921c185
7
+ data.tar.gz: 338c9fbb205aea61d902f0be7dbcff341177cf04fc02ae2289121570a4ac92f790472fe3c20b1c6aca7b73b91fb054b1fc9d7e6a66f1c5bf86c710a363ce5238
@@ -6,7 +6,7 @@ module Ephemeron
6
6
 
7
7
  included do
8
8
  after_find lambda { |model|
9
- Ephemeron.add model
9
+ Store.add model, log: true
10
10
  }
11
11
 
12
12
  after_validation lambda { |model|
@@ -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
@@ -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(&: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
@@ -7,7 +7,7 @@ module Ephemeron
7
7
  module_function
8
8
 
9
9
  def call
10
- model = Ephemeron::Logger::Finders.find_first_allowed_but_unsaved
10
+ model = Ephemeron::Store::Finders.find_first_allowed_but_unsaved
11
11
  return if model.nil?
12
12
 
13
13
  raise(
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Ephemeron
4
- VERSION = '0.2.1'
4
+ VERSION = '0.6.0'
5
5
  end
@@ -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 ||= []
@@ -19,14 +19,10 @@ module Ephemeron
19
19
  def add(model, opts = {})
20
20
  return unless Validators::StoreElement.call(model)
21
21
 
22
- key = Convert.call model
23
- in_store = !store[key].nil?
24
- store[key] = model unless in_store
25
- if !opts[:as].nil?
26
- aliases[opts[: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
 
@@ -63,5 +59,23 @@ module Ephemeron
63
59
  self.ts_store = {}
64
60
  self.ts_aliases = {}
65
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
66
80
  end
67
81
  end
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
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.2.1
4
+ version: 0.6.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Zbigniew Humeniuk
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-08-25 00:00:00.000000000 Z
11
+ date: 2022-02-07 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
@@ -19,7 +19,7 @@ dependencies:
19
19
  version: '5.0'
20
20
  - - "<"
21
21
  - !ruby/object:Gem::Version
22
- version: '7.0'
22
+ version: '8.0'
23
23
  type: :runtime
24
24
  prerelease: false
25
25
  version_requirements: !ruby/object:Gem::Requirement
@@ -29,35 +29,35 @@ dependencies:
29
29
  version: '5.0'
30
30
  - - "<"
31
31
  - !ruby/object:Gem::Version
32
- version: '7.0'
32
+ version: '8.0'
33
33
  - !ruby/object:Gem::Dependency
34
34
  name: jb
35
35
  requirement: !ruby/object:Gem::Requirement
36
36
  requirements:
37
37
  - - "~>"
38
38
  - !ruby/object:Gem::Version
39
- version: 0.7.0
39
+ version: '0.8'
40
40
  type: :development
41
41
  prerelease: false
42
42
  version_requirements: !ruby/object:Gem::Requirement
43
43
  requirements:
44
44
  - - "~>"
45
45
  - !ruby/object:Gem::Version
46
- version: 0.7.0
46
+ version: '0.8'
47
47
  - !ruby/object:Gem::Dependency
48
48
  name: rspec-mocks
49
49
  requirement: !ruby/object:Gem::Requirement
50
50
  requirements:
51
51
  - - "~>"
52
52
  - !ruby/object:Gem::Version
53
- version: '3.9'
53
+ version: '3.10'
54
54
  type: :development
55
55
  prerelease: false
56
56
  version_requirements: !ruby/object:Gem::Requirement
57
57
  requirements:
58
58
  - - "~>"
59
59
  - !ruby/object:Gem::Version
60
- version: '3.9'
60
+ version: '3.10'
61
61
  - !ruby/object:Gem::Dependency
62
62
  name: rubocop
63
63
  requirement: !ruby/object:Gem::Requirement
@@ -126,7 +126,9 @@ files:
126
126
  - lib/ephemeron/logger/finders.rb
127
127
  - lib/ephemeron/railtie.rb
128
128
  - lib/ephemeron/settings.rb
129
+ - lib/ephemeron/store/allow_fetch.rb
129
130
  - lib/ephemeron/store/convert.rb
131
+ - lib/ephemeron/store/finders.rb
130
132
  - lib/ephemeron/store/update.rb
131
133
  - lib/ephemeron/validators/before_save.rb
132
134
  - lib/ephemeron/validators/store.rb
@@ -142,8 +144,9 @@ files:
142
144
  homepage: https://artofcode.co
143
145
  licenses:
144
146
  - MIT
145
- metadata: {}
146
- post_install_message:
147
+ metadata:
148
+ rubygems_mfa_required: 'true'
149
+ post_install_message:
147
150
  rdoc_options: []
148
151
  require_paths:
149
152
  - lib
@@ -151,15 +154,15 @@ required_ruby_version: !ruby/object:Gem::Requirement
151
154
  requirements:
152
155
  - - ">="
153
156
  - !ruby/object:Gem::Version
154
- version: 2.6.0
157
+ version: 2.7.0
155
158
  required_rubygems_version: !ruby/object:Gem::Requirement
156
159
  requirements:
157
160
  - - ">="
158
161
  - !ruby/object:Gem::Version
159
162
  version: '0'
160
163
  requirements: []
161
- rubygems_version: 3.1.2
162
- signing_key:
164
+ rubygems_version: 3.3.3
165
+ signing_key:
163
166
  specification_version: 4
164
167
  summary: The organic DDD
165
168
  test_files: []