ephemeron 0.2.1 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 85b00f989b7f6a03f398cf1bcca07ff5ad6af716d25dfbf4927fcbe6753f51ca
4
- data.tar.gz: c73dbe174fc3b31fcd41e0825a081e2168ee7fa7aa4074dd5d227cf24215a92e
3
+ metadata.gz: c50cea9d34520d0a578c05f81d621b357fc07f233fee202b0031636692e3ce1b
4
+ data.tar.gz: a81052e6ced9fbeb86711a29a7dee2a7cd7a76b4a886ad348dea64ce14dfd672
5
5
  SHA512:
6
- metadata.gz: cfa43027d3191f849a467a54dec03a7228e0c75bec118d737b2b37ea3c2b0e56f8f9b9973cd4f8a6387377305ed1cb7c41352cfd17c5e1430370d3e96b780ab6
7
- data.tar.gz: 54d98852dbb6f365396fb2c3db14b7ccfddb4b5d41dc54935d8c37415d6c3ebc416b0f4ceb6f289747b74234db70cc965e0edca41477c0b967472df30a4ab19f
6
+ metadata.gz: 17aabd88b2067ea3102789827a1215244f8ce3cdc9508f349394b5ec0b707683b02e96aa2dcc1d15214f07fff34704875662f60c3476eee7134c5cb6f1f3c47a
7
+ data.tar.gz: f1d086cddff04cb218da90a094a0c689583dc01077e96c5b7dce35a1b8cd3a61299ecdb29994f374b22e8de594f4a6ce4e114d572a2b648ca31829e414562531
@@ -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'
@@ -64,6 +66,10 @@ module Ephemeron
64
66
  model_s
65
67
  end
66
68
 
69
+ def allow_fetch!(model)
70
+ model.tap { |m| Logger.log m, :fetch_allowed }
71
+ end
72
+
67
73
  def allow_save!(model)
68
74
  model.tap { |m| Logger.log m, :save_allowed }
69
75
  end
@@ -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 { |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
@@ -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.3.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
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.3.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-08-25 00:00:00.000000000 Z
11
+ date: 2020-08-27 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
@@ -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