redis-objects-periodical 0.6.0 → 0.7.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: 9a9f66a51e7b0786e3207daefee47c2ae7a792b512229e6d7b5ac6c40ed4b956
4
- data.tar.gz: 38806524dc3b3d67ab62d76c1b3416518eecb2ba301d66c08eea29f3f88da13e
3
+ metadata.gz: be8af0088e6ff4a0d8e8e26185acd940452d08f123b1820eef198f636db7b1f7
4
+ data.tar.gz: 3cd7b2fbb4ea2fd2bd6e53c3d0798ec4bb1e93b89760a4a6fec48b0215fc072e
5
5
  SHA512:
6
- metadata.gz: b3b3f462b12369d577165c968ce73fdd8d17589654ce553d0a98bf5922ad5a075808154590d7e9dc1b89555438f24bbd3052a2085b17980eb08251ec570cf3df
7
- data.tar.gz: f8ef4de2a9b40c7efada26b858edd6cb546693d18e0d2b075b4f80c26f879e06fa79308bc9b9a2fcb509fc5556a4cc3afd6584c799c6725fe87074ff21e1f3d3
6
+ metadata.gz: 284c3aca951719e4efd85195dbd6457061732a1507821b173cf8e61e879e75fc751694b2540b6716b087ec311ad71c3c9e6d59a29f46f25552e0ae5586baf715
7
+ data.tar.gz: 5fafbcc175c1303535e6e23ee9df14f41a1db5006515416171f15e73f38ee5192e6a0b9adfa6fdfb1ef94c351768bd543c7d9b08e1ce8d1e1de0ac84f621ae1b
data/.rubocop_todo.yml CHANGED
@@ -10,16 +10,17 @@
10
10
  # Configuration parameters: AllowedConstants.
11
11
  Style/Documentation:
12
12
  Exclude:
13
- - 'spec/**/*'
14
- - 'test/**/*'
15
- - 'lib/redis-objects-periodical.rb'
16
- - 'lib/redis/base_counter_object.rb'
17
- - 'lib/redis/base_hash_key_object.rb'
18
- - 'lib/redis/base_set_object.rb'
19
- - 'lib/redis/recurring_at_intervals.rb'
20
- - 'lib/redis/recurring_at_intervals/annual.rb'
21
- - 'lib/redis/recurring_at_intervals/daily.rb'
22
- - 'lib/redis/recurring_at_intervals/hourly.rb'
23
- - 'lib/redis/recurring_at_intervals/minutely.rb'
24
- - 'lib/redis/recurring_at_intervals/monthly.rb'
25
- - 'lib/redis/recurring_at_intervals/weekly.rb'
13
+ - "spec/**/*"
14
+ - "test/**/*"
15
+ - "lib/redis-objects-periodical.rb"
16
+ - "lib/redis/base_counter_object.rb"
17
+ - "lib/redis/base_hash_key_object.rb"
18
+ - "lib/redis/base_set_object.rb"
19
+ - "lib/redis/base_value_object.rb"
20
+ - "lib/redis/recurring_at_intervals.rb"
21
+ - "lib/redis/recurring_at_intervals/annual.rb"
22
+ - "lib/redis/recurring_at_intervals/daily.rb"
23
+ - "lib/redis/recurring_at_intervals/hourly.rb"
24
+ - "lib/redis/recurring_at_intervals/minutely.rb"
25
+ - "lib/redis/recurring_at_intervals/monthly.rb"
26
+ - "lib/redis/recurring_at_intervals/weekly.rb"
data/CHANGELOG.md CHANGED
@@ -1,5 +1,45 @@
1
1
  # Change log
2
2
 
3
+ ## v0.7.0 (Feb 12, 2023)
4
+
5
+ ### Feature
6
+
7
+ - [#128](https://github.com/ryz310/redis-object-daily-counter/pull/128) Support`Redis::Value` as a periodical object ([@ryz310](https://github.com/ryz310))
8
+
9
+ > The periodical values automatically switches the save destination when the date changes.
10
+ >
11
+ > ```rb
12
+ > class Homepage
13
+ > include Redis::Objects
14
+ >
15
+ > daily_value :cache, expireat: -> { Time.now + 2_678_400 } # about a month
16
+ >
17
+ > def id
18
+ > 1
19
+ > end
20
+ > end
21
+ >
22
+ > homepage = Homepage.new
23
+ >
24
+ > # 2021-04-01
25
+ > homepage.cache.value = 'a'
26
+ >
27
+ > # 2021-04-02 (next day)
28
+ > homepage.cache.value = 'b'
29
+ >
30
+ > # 2021-04-03 (next day)
31
+ > homepage.cache.value = 'c'
32
+ >
33
+ > homepage.cache[Date.new(2021, 4, 1)] # => 'a'
34
+ > homepage.cache[Date.new(2021, 4, 1), 3] # => ['a', 'b', 'c']
35
+ > homepage.cache[Date.new(2021, 4, 1)..Date.new(2021, 4, 2)] # => ['a', 'b']
36
+ >
37
+ > homepage.cache.delete_at(Date.new(2021, 4, 1))
38
+ > homepage.cache.range(Date.new(2021, 4, 1), Date.new(2021, 4, 3)) # => [nil, 'b', 'c']
39
+ > homepage.cache.at(Date.new(2021, 4, 2)) # => #<Redis::Value key="homepage:1:cache:2021-04-02">
40
+ > homepage.cache.at(Date.new(2021, 4, 2)).value # 'b'
41
+ > ```
42
+
3
43
  ## v0.6.0 (Feb 12, 2023)
4
44
 
5
45
  ### Feature
data/Gemfile.lock CHANGED
@@ -1,8 +1,8 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- redis-objects-periodical (0.6.0)
5
- redis-objects
4
+ redis-objects-periodical (0.7.0)
5
+ redis-objects (~> 1.0)
6
6
 
7
7
  GEM
8
8
  remote: https://rubygems.org/
data/README.md CHANGED
@@ -32,6 +32,7 @@ class Homepage
32
32
  daily_counter :pv, expireat: -> { Time.now + 2_678_400 } # about a month
33
33
  daily_hash_key :browsing_history, expireat: -> { Time.now + 2_678_400 } # about a month
34
34
  daily_set :dau, expireat: -> { Time.now + 2_678_400 } # about a month
35
+ daily_value :cache, expireat: -> { Time.now + 2_678_400 } # about a month
35
36
 
36
37
  def id
37
38
  1
@@ -99,6 +100,46 @@ homepage.pv.at(Date.new(2021, 4, 2)).value # 2
99
100
  - `minutely_counter`
100
101
  - Key format: `model_name:id:field_name:yyyy-mm-ddThh:mi`
101
102
 
103
+ ### Periodical Values
104
+
105
+ The periodical values automatically switches the save destination when the date changes.
106
+
107
+ ```rb
108
+ # 2021-04-01
109
+ homepage.cache.value = 'a'
110
+
111
+ # 2021-04-02 (next day)
112
+ homepage.cache.value = 'b'
113
+
114
+ # 2021-04-03 (next day)
115
+ homepage.cache.value = 'c'
116
+
117
+ homepage.cache[Date.new(2021, 4, 1)] # => 'a'
118
+ homepage.cache[Date.new(2021, 4, 1), 3] # => ['a', 'b', 'c']
119
+ homepage.cache[Date.new(2021, 4, 1)..Date.new(2021, 4, 2)] # => ['a', 'b']
120
+
121
+ homepage.cache.delete_at(Date.new(2021, 4, 1))
122
+ homepage.cache.range(Date.new(2021, 4, 1), Date.new(2021, 4, 3)) # => [nil, 'b', 'c']
123
+ homepage.cache.at(Date.new(2021, 4, 2)) # => #<Redis::Value key="homepage:1:cache:2021-04-02">
124
+ homepage.cache.at(Date.new(2021, 4, 2)).value # 'b'
125
+ ```
126
+
127
+ #### Periodical Values Family
128
+
129
+ - `annual_value`
130
+ - Key format: `model_name:id:field_name:yyyy`
131
+ - Redis is a highly volatile key-value store, so I don't recommend using it.
132
+ - `monthly_value`
133
+ - Key format: `model_name:id:field_name:yyyy-mm`
134
+ - `weekly_value`
135
+ - Key format: `model_name:id:field_name:yyyyWw`
136
+ - `daily_value`
137
+ - Key format: `model_name:id:field_name:yyyy-mm-dd`
138
+ - `hourly_value`
139
+ - Key format: `model_name:id:field_name:yyyy-mm-ddThh`
140
+ - `minutely_value`
141
+ - Key format: `model_name:id:field_name:yyyy-mm-ddThh:mi`
142
+
102
143
  ### Periodical Hashes
103
144
 
104
145
  The periodical hashes also automatically switches the save destination when the date changes.
@@ -0,0 +1,27 @@
1
+ # frozen_string_literal: true
2
+
3
+ class Redis
4
+ module BaseValueObject
5
+ private
6
+
7
+ def get_redis_object(key)
8
+ Redis::Value.new(key)
9
+ end
10
+
11
+ def get_value_from_redis(key)
12
+ unmarshal(redis.get(key))
13
+ end
14
+
15
+ def get_values_from_redis(keys)
16
+ redis.mget(*keys).map { |v| unmarshal(v) }
17
+ end
18
+
19
+ def delete_from_redis(key)
20
+ redis.del(key)
21
+ end
22
+
23
+ def empty_value
24
+ []
25
+ end
26
+ end
27
+ end
@@ -3,7 +3,7 @@
3
3
  class Redis
4
4
  module Objects
5
5
  module Periodical
6
- VERSION = '0.6.0'
6
+ VERSION = '0.7.0'
7
7
  end
8
8
  end
9
9
  end
@@ -0,0 +1,44 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'redis/periodical_value'
4
+
5
+ Redis::PERIODICALS.each do |periodical| # rubocop:disable Metrics/BlockLength
6
+ new_module = Module.new
7
+ new_module.module_eval <<~RUBY, __FILE__, __LINE__ + 1
8
+ def self.included(klass)
9
+ klass.extend ClassMethods
10
+ end
11
+
12
+ module ClassMethods
13
+ def #{periodical}_value(name, options = {})
14
+ redis_objects[name.to_sym] = options.merge(:type => :value)
15
+
16
+ mod = Module.new do
17
+ define_method(name) do
18
+ Redis::#{periodical.capitalize}Value.new(
19
+ redis_field_key(name), redis_field_redis(name), redis_options(name)
20
+ )
21
+ end
22
+ define_method(:"#\{name}=") do |value|
23
+ public_send(name).value = value
24
+ end
25
+ end
26
+
27
+ if options[:global]
28
+ extend mod
29
+
30
+ # dispatch to class methods
31
+ define_method(name) do
32
+ self.class.public_send(name)
33
+ end
34
+ define_method(:"#\{name}=") do |value|
35
+ self.class.public_send(:"#\{name}=", value)
36
+ end
37
+ else
38
+ include mod
39
+ end
40
+ end
41
+ end
42
+ RUBY
43
+ Redis::Objects.const_set("#{periodical.capitalize}Values", new_module)
44
+ end
@@ -0,0 +1,15 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "#{File.dirname(__FILE__)}/recurring_at_intervals"
4
+ require "#{File.dirname(__FILE__)}/base_value_object"
5
+
6
+ Redis::PERIODICALS.each do |periodical|
7
+ require "#{File.dirname(__FILE__)}/recurring_at_intervals/#{periodical}"
8
+
9
+ new_class = Class.new(Redis::Value) do
10
+ include Redis::RecurringAtIntervals
11
+ include Redis::BaseValueObject
12
+ include const_get("Redis::RecurringAtIntervals::#{periodical.capitalize}")
13
+ end
14
+ Redis.const_set("#{periodical.capitalize}Value", new_class)
15
+ end
@@ -9,6 +9,7 @@ class Redis
9
9
  autoload :"#{periodical.capitalize}Counter", 'redis/periodical_counter'
10
10
  autoload :"#{periodical.capitalize}HashKey", 'redis/periodical_hash_key'
11
11
  autoload :"#{periodical.capitalize}Set", 'redis/periodical_set'
12
+ autoload :"#{periodical.capitalize}Value", 'redis/periodical_value'
12
13
  end
13
14
 
14
15
  module Objects
@@ -16,6 +17,7 @@ class Redis
16
17
  autoload :"#{periodical.capitalize}Counters", 'redis/objects/periodical_counters'
17
18
  autoload :"#{periodical.capitalize}Hashes", 'redis/objects/periodical_hashes'
18
19
  autoload :"#{periodical.capitalize}Sets", 'redis/objects/periodical_sets'
20
+ autoload :"#{periodical.capitalize}Values", 'redis/objects/periodical_values'
19
21
  end
20
22
 
21
23
  class << self
@@ -29,6 +31,7 @@ class Redis
29
31
  klass.send :include, const_get("Redis::Objects::#{periodical.capitalize}Counters")
30
32
  klass.send :include, const_get("Redis::Objects::#{periodical.capitalize}Hashes")
31
33
  klass.send :include, const_get("Redis::Objects::#{periodical.capitalize}Sets")
34
+ klass.send :include, const_get("Redis::Objects::#{periodical.capitalize}Values")
32
35
  end
33
36
  end
34
37
  end
@@ -29,7 +29,7 @@ Gem::Specification.new do |spec|
29
29
 
30
30
  spec.required_ruby_version = '>= 2.7.0'
31
31
 
32
- spec.add_dependency 'redis-objects'
32
+ spec.add_dependency 'redis-objects', '~> 1.0'
33
33
 
34
34
  # For more information and examples about making a new gem, checkout our
35
35
  # guide at: https://bundler.io/guides/creating_gem.html
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: redis-objects-periodical
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.6.0
4
+ version: 0.7.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - ryz310
@@ -14,16 +14,16 @@ dependencies:
14
14
  name: redis-objects
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - ">="
17
+ - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: '0'
19
+ version: '1.0'
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - ">="
24
+ - - "~>"
25
25
  - !ruby/object:Gem::Version
26
- version: '0'
26
+ version: '1.0'
27
27
  description: Extends Redis::Objects to switch automatically the save destination within
28
28
  Redis on changing dates.
29
29
  email:
@@ -54,13 +54,16 @@ files:
54
54
  - lib/redis/base_counter_object.rb
55
55
  - lib/redis/base_hash_key_object.rb
56
56
  - lib/redis/base_set_object.rb
57
+ - lib/redis/base_value_object.rb
57
58
  - lib/redis/objects/periodical/version.rb
58
59
  - lib/redis/objects/periodical_counters.rb
59
60
  - lib/redis/objects/periodical_hashes.rb
60
61
  - lib/redis/objects/periodical_sets.rb
62
+ - lib/redis/objects/periodical_values.rb
61
63
  - lib/redis/periodical_counter.rb
62
64
  - lib/redis/periodical_hash_key.rb
63
65
  - lib/redis/periodical_set.rb
66
+ - lib/redis/periodical_value.rb
64
67
  - lib/redis/recurring_at_intervals.rb
65
68
  - lib/redis/recurring_at_intervals/annual.rb
66
69
  - lib/redis/recurring_at_intervals/daily.rb