basket 0.0.3 → 0.0.4
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 +4 -4
- data/Gemfile.lock +1 -1
- data/README.md +13 -3
- data/basket.gemspec +1 -1
- data/lib/basket/backend_adapter/redis_backend.rb +23 -5
- data/lib/basket/configuration.rb +2 -1
- data/lib/basket/handle_add.rb +35 -20
- data/lib/basket/version.rb +1 -1
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: fe1bb079417239ff859572188cdc08c280e471752d2e5bca308e26b57d375640
|
4
|
+
data.tar.gz: f8f4cb0b630b7f07b492a4281e04302322c4661266f0da966e4b5b4dc5f1b37c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 5cfa5e413c339a9f354457c7f2cf2a05edb21fecabaa63da9a6d8e51987d1e4ddef90b01235835ff330357834881836aa48dcf52edb8cc43e7d466e5f5528a6c
|
7
|
+
data.tar.gz: d880195c4f2d3ef24ed92e3ac288de53cfaca6990b1e8a8c596b0ad5fef126907b62336478edbf38c317c9f6a721bbcc5578c2a84af26047031acc25b0e5a11e
|
data/Gemfile.lock
CHANGED
data/README.md
CHANGED
@@ -26,7 +26,7 @@ If bundler is not being used to manage dependencies, install the gem by executin
|
|
26
26
|
Add items to your basket as they come along. They might come along quickly, or there might be a delay between them. Regardless, you want to collect items into your basket before going and doing something with them.
|
27
27
|
|
28
28
|
```ruby
|
29
|
-
while chicken.laying do
|
29
|
+
while chicken.laying? do
|
30
30
|
egg = { egg: {color: brown, size: medium}}
|
31
31
|
Basket.add('QuicheBasket', egg)
|
32
32
|
end
|
@@ -89,7 +89,7 @@ Defining `on_add`, `on_failure`, and `on_success` is optional.
|
|
89
89
|
In an initializer, or somewhere equally appropriate, you might put something like this:
|
90
90
|
|
91
91
|
```ruby
|
92
|
-
Basket.
|
92
|
+
Basket.configure do |config|
|
93
93
|
config.redis_host = "127.0.0.2"
|
94
94
|
config.redis_port = 6390
|
95
95
|
config.redis_db = 10
|
@@ -98,10 +98,18 @@ Basket.config do |config|
|
|
98
98
|
end
|
99
99
|
```
|
100
100
|
|
101
|
-
The defaults for a redis backend are the standard "127.0.0.1"
|
101
|
+
The defaults for a redis backend are the standard `"127.0.0.1"`, `6379`, `15` with a namespace of `:basket`.
|
102
102
|
|
103
103
|
The default for the backend is the HashBackend, which can be set by passing `:hash` to `config.backend`, but you don't have to do that. Because it's the default!
|
104
104
|
|
105
|
+
For the redis configuration, you can alternatively pass a url, thusly:
|
106
|
+
|
107
|
+
```ruby
|
108
|
+
Basket.configure do |config|
|
109
|
+
config.backend = :redis
|
110
|
+
config.redis_url = "redis://:p4ssw0rd@10.0.1.1:6380/15"
|
111
|
+
end
|
112
|
+
```
|
105
113
|
## Development
|
106
114
|
|
107
115
|
After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake spec` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
|
@@ -110,6 +118,8 @@ To install this gem onto your local machine, run `bundle exec rake install`. To
|
|
110
118
|
|
111
119
|
This project uses Guard to facilitate local development. You can run it with `bundle exec guard`. It will run specs on change to files and will run `standard --fix` after passing tests.
|
112
120
|
|
121
|
+
Looking through the code base, the majority of the work happens in [lib/basket/handle_add.rb](https://github.com/nicholalexander/basket/blob/main/lib/basket/handle_add.rb). Alternatively, you might be interested in the [backend adapters](https://github.com/nicholalexander/basket/tree/main/lib/basket/backend_adapter) for how the gem works with in memory hashes and/or a redis backend.
|
122
|
+
|
113
123
|
## Contributing
|
114
124
|
|
115
125
|
Bug reports and pull requests are welcome on GitHub at https://github.com/nicholalexander/basket. 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/nicholalexander/basket/blob/main/CODE_OF_CONDUCT.md).
|
data/basket.gemspec
CHANGED
@@ -12,7 +12,7 @@ Gem::Specification.new do |spec|
|
|
12
12
|
spec.description = "A simple way of accumulating things and then acting on them."
|
13
13
|
spec.homepage = "https://github.com/nicholalexander/basket"
|
14
14
|
spec.license = "MIT"
|
15
|
-
spec.required_ruby_version = ">=
|
15
|
+
spec.required_ruby_version = ">= 3.0.6"
|
16
16
|
|
17
17
|
spec.metadata["homepage_uri"] = spec.homepage
|
18
18
|
spec.metadata["source_code_uri"] = "https://github.com/nicholalexander/basket"
|
@@ -6,11 +6,7 @@ module Basket
|
|
6
6
|
attr_reader :client
|
7
7
|
|
8
8
|
def initialize
|
9
|
-
redis_connection =
|
10
|
-
host: Basket.config.redis_host,
|
11
|
-
port: Basket.config.redis_port,
|
12
|
-
db: Basket.config.redis_db
|
13
|
-
)
|
9
|
+
redis_connection = select_redis_connection
|
14
10
|
|
15
11
|
@client = Redis::Namespace.new(
|
16
12
|
Basket.config.namespace,
|
@@ -51,6 +47,28 @@ module Basket
|
|
51
47
|
def deserialized_queue_data(queue)
|
52
48
|
@client.lrange(queue, 0, -1).reverse.map { |marshalled_data| Marshal.load(marshalled_data) }
|
53
49
|
end
|
50
|
+
|
51
|
+
def select_redis_connection
|
52
|
+
if Basket.config.redis_url
|
53
|
+
redis_connection_from_url
|
54
|
+
else
|
55
|
+
redis_connection_from_host
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
def redis_connection_from_host
|
60
|
+
Redis.new(
|
61
|
+
host: Basket.config.redis_host,
|
62
|
+
port: Basket.config.redis_port,
|
63
|
+
db: Basket.config.redis_db
|
64
|
+
)
|
65
|
+
end
|
66
|
+
|
67
|
+
def redis_connection_from_url
|
68
|
+
Redis.new(
|
69
|
+
url: Basket.config.redis_url
|
70
|
+
)
|
71
|
+
end
|
54
72
|
end
|
55
73
|
end
|
56
74
|
end
|
data/lib/basket/configuration.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
module Basket
|
2
2
|
class Configuration
|
3
|
-
attr_accessor :redis_host, :redis_port, :redis_db, :namespace
|
3
|
+
attr_accessor :redis_host, :redis_port, :redis_db, :namespace, :redis_url
|
4
4
|
attr_reader :backend
|
5
5
|
|
6
6
|
def initialize
|
@@ -9,6 +9,7 @@ module Basket
|
|
9
9
|
@redis_db = 15
|
10
10
|
@backend = BackendAdapter::HashBackend
|
11
11
|
@namespace = :basket
|
12
|
+
@redis_url = nil
|
12
13
|
end
|
13
14
|
|
14
15
|
def backend=(backend)
|
data/lib/basket/handle_add.rb
CHANGED
@@ -7,43 +7,58 @@ module Basket
|
|
7
7
|
def initialize(queue, data)
|
8
8
|
@queue = queue
|
9
9
|
@data = data
|
10
|
-
@queue_collection = Basket.queue_collection
|
11
10
|
end
|
12
11
|
|
13
|
-
def call
|
14
|
-
|
15
|
-
|
16
|
-
|
12
|
+
def call
|
13
|
+
setup_batchers
|
14
|
+
add_to_basket
|
15
|
+
perform if basket_full?(@queue_length, @queue_class)
|
16
|
+
rescue => error
|
17
|
+
maybe_raise_basket_error(error)
|
18
|
+
failure(error)
|
19
|
+
end
|
17
20
|
|
18
|
-
|
19
|
-
queue_instance.on_add
|
21
|
+
private
|
20
22
|
|
21
|
-
|
23
|
+
def setup_batchers
|
24
|
+
@queue_collection = Basket.queue_collection
|
25
|
+
@queue_class = class_for_queue
|
26
|
+
@queue_instance = @queue_class.new
|
27
|
+
end
|
22
28
|
|
23
|
-
|
24
|
-
|
25
|
-
@
|
26
|
-
|
27
|
-
|
29
|
+
def add_to_basket(data = @data)
|
30
|
+
@queue_length = @queue_collection.push(@queue, data)
|
31
|
+
@queue_instance.define_singleton_method(:element) { data }
|
32
|
+
@queue_instance.on_add
|
33
|
+
end
|
28
34
|
|
29
|
-
|
30
|
-
queue_instance.
|
35
|
+
def perform
|
36
|
+
@queue_instance.perform
|
37
|
+
@queue_instance.on_success
|
38
|
+
@queue_collection.clear(@queue)
|
31
39
|
end
|
32
40
|
|
33
|
-
|
41
|
+
def failure(error)
|
42
|
+
@queue_instance.define_singleton_method(:error) { error }
|
43
|
+
@queue_instance.on_failure
|
44
|
+
end
|
34
45
|
|
35
46
|
def class_for_queue
|
47
|
+
raise_basket_not_found unless Object.const_defined?(@queue)
|
36
48
|
Object.const_get(@queue)
|
37
|
-
|
38
|
-
|
49
|
+
end
|
50
|
+
|
51
|
+
def raise_basket_not_found
|
52
|
+
raise Basket::BasketNotFoundError, "We couldn't find that basket anywhere, please make sure it is defined."
|
39
53
|
end
|
40
54
|
|
41
55
|
def basket_full?(queue_length, queue_class)
|
42
56
|
queue_length == queue_class.basket_options_hash[:size]
|
43
57
|
end
|
44
58
|
|
45
|
-
def
|
46
|
-
e
|
59
|
+
def maybe_raise_basket_error(e)
|
60
|
+
raise e if e.instance_of?(Basket::Error)
|
61
|
+
raise e if e.instance_of?(Basket::BasketNotFoundError)
|
47
62
|
end
|
48
63
|
end
|
49
64
|
end
|
data/lib/basket/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: basket
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- nichol alexander
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: exe
|
11
11
|
cert_chain: []
|
12
|
-
date: 2023-
|
12
|
+
date: 2023-04-04 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: redis
|
@@ -98,7 +98,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
98
98
|
requirements:
|
99
99
|
- - ">="
|
100
100
|
- !ruby/object:Gem::Version
|
101
|
-
version:
|
101
|
+
version: 3.0.6
|
102
102
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
103
103
|
requirements:
|
104
104
|
- - ">="
|