ractor-cache 0.1.0 → 0.2.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: 377a50819a1cba2fe238c388c7d493cddf0260f97edaa88952bdfde0bb46f8f9
4
- data.tar.gz: 4723d13d9e5b3a41cb84be4aff50061d67e2bf9850275c098cc05197b6c549c1
3
+ metadata.gz: c2fb8ce98adad688d2ff0e150265154ba963c62a4c7cd88e87bb09ab366db535
4
+ data.tar.gz: fda4eb8307bb638e87841f418895c4f57297c975349c9502026b3346ad570256
5
5
  SHA512:
6
- metadata.gz: 7e7ed096e89d921bbd30bfb3884a29c4ec4d83fe56d38865394f85b8eb5e88806a41f06dcf061a6370450f06e9249b7ef4c70dcddf64c4015ba7d1ba2e379a2d
7
- data.tar.gz: 3bf00fd952e7f8dbe610160c1d34320181821d6bb5aaecbe89866f64e2239e909a5e499f81ed12bdb8746e887013b23411dbc4089f437a16c4c22554bc61bb73
6
+ metadata.gz: 38ad35d50bf189e0dc9f0da88f91f484664811824f1310e2e4a040f49b19d3f9f079c826d9667956d5d3ec4949e440583f7f38d74c6f6841af40a9f65b672453
7
+ data.tar.gz: fa23e9e4cebd2891ba3bfdfe81e8d88fe693e2efd770e2f08cc1be576bb3a46ddae543562c95c760e917f39f895ba64bb5e039fff6a68ea9e4eccb690194a8db
data/README.md CHANGED
@@ -41,7 +41,7 @@ f.freeze
41
41
  f.long_calc # => FrozenError, can't set `@long_calc`
42
42
  ```
43
43
 
44
- Some techniques could include storing the cache in a mutable data structures:
44
+ Some techniques could include storing the cache in a mutable data structure:
45
45
 
46
46
  ```ruby
47
47
  class Foo
@@ -76,6 +76,8 @@ This gem will:
76
76
  - not write to the cache,
77
77
  - (or maybe use a separate Ractor / `SharedHash`)
78
78
 
79
+ Implementation details pexplained here](hacker_guide.md)
80
+
79
81
  ## Contributing
80
82
 
81
83
  Bug reports and pull requests are welcome on GitHub at https://github.com/marcandre/ractor-cache. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the [code of conduct](https://github.com/marcandre/ractor-cache/blob/master/CODE_OF_CONDUCT.md).
@@ -2,6 +2,8 @@
2
2
 
3
3
  class Ractor
4
4
  module Cache
5
+ EMPTY_CACHE = Class.new.freeze # lazy way to get a name
6
+
5
7
  module Strategy
6
8
  class Base
7
9
  attr_reader :parameters, :method_name
@@ -12,7 +14,8 @@ class Ractor
12
14
  end
13
15
 
14
16
  def compile_store_init
15
- "@#{method_name} = {}" if @has_arguments
17
+ init = @has_arguments ? "Hash.new { #{EMPTY_CACHE} }" : EMPTY_CACHE
18
+ "@#{method_name} = #{init}"
16
19
  end
17
20
 
18
21
  private def analyse_parameters(parameters) # rubocop:disable Metrics/CyclomaticComplexity, Metrics/MethodLength
@@ -53,7 +56,7 @@ class Ractor
53
56
  class Prebuild < Base
54
57
  def initialize(*)
55
58
  super
56
- raise "Can not cache method #{method_name} by prebuilding because it accepts arguments" if @has_arguments
59
+ raise ArgumentError, "Can not cache method #{method_name} by prebuilding because it accepts arguments" if @has_arguments
57
60
  end
58
61
 
59
62
  def deep_freeze_callback(instance)
@@ -63,7 +66,10 @@ class Ractor
63
66
  def compile_accessor
64
67
  <<~RUBY
65
68
  def #{method_name}(#{signature})
66
- ractor_cache.#{method_name} ||= super
69
+ r = ractor_cache.#{method_name}
70
+ return r unless r == EMPTY_CACHE
71
+
72
+ ractor_cache.#{method_name} = super
67
73
  end
68
74
  RUBY
69
75
  end
@@ -73,11 +79,12 @@ class Ractor
73
79
  def compile_accessor
74
80
  <<~RUBY
75
81
  def #{method_name}(#{signature})
76
- ractor_cache.#{method_name}#{compile_lookup} || begin
77
- result = super
78
- ractor_cache.#{method_name}#{compile_lookup} = result unless ractor_cache.frozen?
79
- result
80
- end
82
+ r = ractor_cache.#{method_name}#{compile_lookup}
83
+ return r unless r == EMPTY_CACHE
84
+
85
+ r = super
86
+ ractor_cache.#{method_name}#{compile_lookup} = r unless ractor_cache.frozen?
87
+ r
81
88
  end
82
89
  RUBY
83
90
  end
@@ -104,7 +111,7 @@ class Ractor
104
111
  ) # => Strategy
105
112
  self[strategy || :prebuild].new(to_cache)
106
113
  rescue ArgumentError
107
- return new(:prebuild, to_cache: to_cache) if strategy == nil
114
+ return new(:disable, to_cache: to_cache) if strategy == nil
108
115
 
109
116
  raise
110
117
  end
@@ -2,6 +2,6 @@
2
2
 
3
3
  class Ractor
4
4
  module Cache
5
- VERSION = '0.1.0'
5
+ VERSION = '0.2.0'
6
6
  end
7
7
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ractor-cache
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Marc-Andre Lafortune
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2020-11-10 00:00:00.000000000 Z
11
+ date: 2020-11-11 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: require_relative_dir