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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 032a79004b77bffee915f105cd807beb01fcc60c52e829c478fcf615a8fa8184
4
- data.tar.gz: 65168d9788376856e6745c083f2a0d467b18deace844719e59024e9027a47db4
3
+ metadata.gz: 3bb6daaac01582150f1f3c3cd12865e5766966ca1671afb2f29f2b5ff536b30a
4
+ data.tar.gz: 1fb117784cfc5135b48d8a4dc4cee7fc43c29cdc1e256a760b15318b08b86a3e
5
5
  SHA512:
6
- metadata.gz: 88ddba6984c039180c74433d9dc9447eae247b040700f3de02c0338e6a9ffe95dc3472c7eb982b81a867044d1c214c15cafe0ede0bf9286308d15f59664e403b
7
- data.tar.gz: 6488f41b9df17130dbedb9f1db5bfa72e1aeded337863e46fe03e898728ed6aa5dfac2666f8cdaaf7004bf0623900f1073195327e06653994d4b974a17f67f1a
6
+ metadata.gz: 0e0d60880cbbf2005071bfe83a1ed0ef8abb634160130dea0488c8a3dc30b534a89649f29628d999db156e6d94dd830a4fd9339cafb0727664df8d19f113d9c3
7
+ data.tar.gz: 88dc0d8d8280b61f8fb705d02e7493e9a87f560e28a7afe9435f01b8aaab89003eb0c872d46d29eecf18f68fb315f3d57d2f265dce746d38822f35644a607232
@@ -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
@@ -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
@@ -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
- return class_name_and_id(model_s, as_new_record) if model_s.is_a?(ActiveRecord::Base)
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 = false)
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.keys
16
- .each { |key| Store.aliases[key] = Convert.call(model) }
15
+ .to_h
16
+ .each_key { |key| Store.aliases[key] = Convert.call(model) }
17
17
  end
18
18
  end
19
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.1.0'
4
+ VERSION = '0.5.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 ||= []
@@ -16,11 +16,11 @@ module Ephemeron
16
16
  logs.include? Convert.call(model, event)
17
17
  end
18
18
 
19
- def log(model, event, soft: false)
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, as: nil)
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 !as.nil?
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[aliases[key]].tap do |model|
35
- Logger.log(model, :used) if model
36
- end
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.1.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-01-14 00:00:00.000000000 Z
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: '0'
156
+ version: 2.6.0
127
157
  required_rubygems_version: !ruby/object:Gem::Requirement
128
158
  requirements:
129
159
  - - ">="