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 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
  - - ">="