gumball 0.0.1 → 0.0.7
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 +5 -5
- data/.github/workflows/gem-push.yml +31 -0
- data/.github/workflows/{ruby.yml → ruby-build.yml} +7 -5
- data/.travis.yml +3 -2
- data/Gemfile +2 -1
- data/README.md +3 -2
- data/Rakefile +3 -1
- data/gumball.gemspec +15 -14
- data/lib/gumball.rb +1 -0
- data/lib/gumball/dispenser.rb +10 -2
- data/lib/gumball/version.rb +2 -1
- data/spec/dispenser_spec.rb +38 -7
- data/spec/spec_helper.rb +1 -1
- metadata +22 -8
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
|
-
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
2
|
+
SHA256:
|
|
3
|
+
metadata.gz: 433f05d0f09a006ff0377604af119ee8b15caaef113947241bd3bd98b263f9d7
|
|
4
|
+
data.tar.gz: 6ad50e2602e18e7aa76ca103a6bc4e6d7d479594176ed7baa832dec159ee6a61
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 8199f329c68fb2412374a57cdbab0232152ada9a3aae7ddc5121bfc99307853c558ac8db9f101d3c634b7ec8d93d98122e13a91dd54c7bb3a16c1ff68b12dde5
|
|
7
|
+
data.tar.gz: df736c193c10978a2756c87214e73b98ea58c98d6b35626f784a02d43083b1f579dea5261df030a547cc8d2e4924da7a38d1063fae987b8547bed37d5cea6314
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
name: Ruby Gem
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
release:
|
|
5
|
+
types: [published]
|
|
6
|
+
|
|
7
|
+
jobs:
|
|
8
|
+
build:
|
|
9
|
+
name: Build + Publish
|
|
10
|
+
runs-on: ubuntu-latest
|
|
11
|
+
permissions:
|
|
12
|
+
contents: read
|
|
13
|
+
packages: write
|
|
14
|
+
|
|
15
|
+
steps:
|
|
16
|
+
- uses: actions/checkout@v2
|
|
17
|
+
- name: Set up Ruby 2.6
|
|
18
|
+
uses: actions/setup-ruby@v1
|
|
19
|
+
with:
|
|
20
|
+
ruby-version: 2.6.x
|
|
21
|
+
|
|
22
|
+
- name: Publish to RubyGems
|
|
23
|
+
run: |
|
|
24
|
+
mkdir -p $HOME/.gem
|
|
25
|
+
touch $HOME/.gem/credentials
|
|
26
|
+
chmod 0600 $HOME/.gem/credentials
|
|
27
|
+
printf -- "---\n:rubygems_api_key: ${GEM_HOST_API_KEY}\n" > $HOME/.gem/credentials
|
|
28
|
+
gem build *.gemspec
|
|
29
|
+
gem push *.gem
|
|
30
|
+
env:
|
|
31
|
+
GEM_HOST_API_KEY: "${{secrets.RUBYGEMS_AUTH_TOKEN}}"
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
# This workflow will download a prebuilt Ruby version, install dependencies and run tests with Rake
|
|
6
6
|
# For more information see: https://github.com/marketplace/actions/setup-ruby-jruby-and-truffleruby
|
|
7
7
|
|
|
8
|
-
name: Ruby
|
|
8
|
+
name: Ruby Build
|
|
9
9
|
|
|
10
10
|
on:
|
|
11
11
|
push:
|
|
@@ -17,6 +17,9 @@ jobs:
|
|
|
17
17
|
test:
|
|
18
18
|
|
|
19
19
|
runs-on: ubuntu-latest
|
|
20
|
+
strategy:
|
|
21
|
+
matrix:
|
|
22
|
+
ruby-version: ['2.6', '2.7', '3.0']
|
|
20
23
|
|
|
21
24
|
steps:
|
|
22
25
|
- uses: actions/checkout@v2
|
|
@@ -24,10 +27,9 @@ jobs:
|
|
|
24
27
|
# To automatically get bug fixes and new Ruby versions for ruby/setup-ruby,
|
|
25
28
|
# change this to (see https://github.com/ruby/setup-ruby#versioning):
|
|
26
29
|
# uses: ruby/setup-ruby@v1
|
|
27
|
-
uses: ruby/setup-ruby@
|
|
30
|
+
uses: ruby/setup-ruby@473e4d8fe5dd94ee328fdfca9f8c9c7afc9dae5e
|
|
28
31
|
with:
|
|
29
|
-
ruby-version:
|
|
30
|
-
|
|
31
|
-
run: bundle install
|
|
32
|
+
ruby-version: ${{ matrix.ruby-version }}
|
|
33
|
+
bundler-cache: true # runs 'bundle install' and caches installed gems automatically
|
|
32
34
|
- name: Run tests
|
|
33
35
|
run: bundle exec rspec
|
data/.travis.yml
CHANGED
|
@@ -1,14 +1,15 @@
|
|
|
1
1
|
language: ruby
|
|
2
2
|
rvm:
|
|
3
|
-
- 2.4
|
|
4
3
|
- 2.5
|
|
5
4
|
- 2.6
|
|
5
|
+
- 2.7
|
|
6
|
+
- 3.0
|
|
6
7
|
script:
|
|
7
8
|
- bundle exec rspec
|
|
8
9
|
deploy:
|
|
9
10
|
provider: rubygems
|
|
10
11
|
api_key:
|
|
11
|
-
secure:
|
|
12
|
+
secure: OUlCntNtWloKunpBLvEIgrNthLtVl04uk7VD76kx8h+xXorjJCWaU3KKfi2MSyEtWB/fgUrAnEbzETfCt154Hq8TyKyMQqixAgDVTvXt84fB0IjKcszhtv3yUNGb+l1LWdEVkdzcRyf/yTZE3rPJi5VHqHe++G6hehmm417sPS/Wo+xEJ+2EVq/KX0aMahtrhqvuYJCSv/L25e3ExAHx27u8Q3w5vUQW3cy/FcyYUxGWL6JIWHMcI9fGu417AQd9nHOOys6DsLl+/7yMblbPNz0UyBaKqioEv+EFWpcvV8qKRi81s4sAbzJwF5DcOxYvtumrNJWi2slRiDmUx7q821hscsRlfMfYARMVLm0CuFhg9q7ldagOdCdD/reE88ofqStVVjDNj7u3zwBeeuwtKY6frGO2fR81pec/JYA8LlKEeVjFv/HZL4qJ5vgf/BSX4EQ6vEmL0gTXvS3CBFEL36h1PPSnzrwB7ktiCG8typ0CVrYPjDqm1naneraXm2dCVw2wAXLqOdJGq9pAFnKnwi3b+twTE9px5ttEkoEIZ2ASEK4L1edK508Uh90127kokfCKmv0wCSr3zr4F3tQy0pRiNuDUvZaF9QwE4uzzp2HYHvptT5OkcA1B9TQ9x9dsdQe+4siTkcF0Rz/LWmlrmVrExYhxptyeS6yP7rLotiM=
|
|
12
13
|
gem: gumball
|
|
13
14
|
on:
|
|
14
15
|
tags: true
|
data/Gemfile
CHANGED
data/README.md
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
# Gumball
|
|
1
|
+
# Gumball  [](https://badge.fury.io/rb/gumball)
|
|
2
2
|
|
|
3
3
|
A gem providing a mechanism to dispense instances of a class, somewhere between a true singleton and new instance each time.
|
|
4
4
|
|
|
@@ -63,7 +63,8 @@ dispenser.item # we've saved our refreshed version, and our response is immediat
|
|
|
63
63
|
If we want to be able to set up our dispenser so that we can perform some other operation in the event the value actually changes:
|
|
64
64
|
|
|
65
65
|
```ruby
|
|
66
|
-
|
|
66
|
+
# note the optional logger paseed in below...
|
|
67
|
+
dispenser = Gumball::Dispenser.new(300, logger: Logger.new($stdout)) { ExpensiveThing.value }
|
|
67
68
|
dispenser.on_change { |o, n| puts "OUR VALUE CHANGED: #{o} -> #{n}" }
|
|
68
69
|
```
|
|
69
70
|
|
data/Rakefile
CHANGED
data/gumball.gemspec
CHANGED
|
@@ -1,22 +1,22 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
lib = File.expand_path(
|
|
2
|
+
|
|
3
|
+
lib = File.expand_path("../lib", __FILE__)
|
|
4
4
|
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
|
5
|
-
require
|
|
5
|
+
require "gumball/version"
|
|
6
6
|
|
|
7
7
|
Gem::Specification.new do |spec|
|
|
8
|
-
spec.name
|
|
9
|
-
spec.version
|
|
10
|
-
spec.authors
|
|
11
|
-
spec.email
|
|
12
|
-
spec.summary
|
|
13
|
-
spec.description
|
|
14
|
-
spec.homepage
|
|
15
|
-
spec.license
|
|
8
|
+
spec.name = "gumball"
|
|
9
|
+
spec.version = Gumball::VERSION
|
|
10
|
+
spec.authors = ["Kevin McDonald"]
|
|
11
|
+
spec.email = ["kevinstuffandthings@gmail.com"]
|
|
12
|
+
spec.summary = "Dispense expensive objects with ease"
|
|
13
|
+
spec.description = spec.summary
|
|
14
|
+
spec.homepage = "https://github.com/kevinstuffandthings/gumball"
|
|
15
|
+
spec.license = "MIT"
|
|
16
16
|
|
|
17
|
-
spec.files
|
|
18
|
-
spec.executables
|
|
19
|
-
spec.test_files
|
|
17
|
+
spec.files = `git ls-files -z`.split("\x0")
|
|
18
|
+
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
|
19
|
+
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
|
20
20
|
spec.require_paths = ["lib"]
|
|
21
21
|
|
|
22
22
|
spec.add_development_dependency "bundler"
|
|
@@ -25,5 +25,6 @@ Gem::Specification.new do |spec|
|
|
|
25
25
|
spec.add_development_dependency "rack-test"
|
|
26
26
|
spec.add_development_dependency "rake"
|
|
27
27
|
spec.add_development_dependency "rspec"
|
|
28
|
+
spec.add_development_dependency "standard"
|
|
28
29
|
spec.add_development_dependency "yard"
|
|
29
30
|
end
|
data/lib/gumball.rb
CHANGED
data/lib/gumball/dispenser.rb
CHANGED
|
@@ -1,4 +1,7 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require "logger"
|
|
4
|
+
|
|
2
5
|
module Gumball
|
|
3
6
|
class Dispenser
|
|
4
7
|
attr_reader :ttl
|
|
@@ -7,8 +10,9 @@ module Gumball
|
|
|
7
10
|
# @param ttl [???]
|
|
8
11
|
# @param block
|
|
9
12
|
# @return [Dispenser]
|
|
10
|
-
def initialize(ttl, &block)
|
|
13
|
+
def initialize(ttl, logger: nil, &block)
|
|
11
14
|
@ttl = ttl
|
|
15
|
+
@logger = logger || Logger.new("/dev/null")
|
|
12
16
|
@last_refreshed = nil
|
|
13
17
|
@refresh_block = block
|
|
14
18
|
@on_change_block = nil
|
|
@@ -33,7 +37,11 @@ module Gumball
|
|
|
33
37
|
@_item = nil if expired?
|
|
34
38
|
unless @_item
|
|
35
39
|
@_item = @refresh_block.call
|
|
36
|
-
@
|
|
40
|
+
@logger.info "#{self.class} refreshed, new_value=#{@_item}"
|
|
41
|
+
if @last_refreshed && @on_change_block && (old_item != @_item)
|
|
42
|
+
@logger.debug "#{self.class} executing on_change block; detected change from previous value #{old_item}"
|
|
43
|
+
@on_change_block.call(old_item, @_item)
|
|
44
|
+
end
|
|
37
45
|
@last_refreshed = now
|
|
38
46
|
end
|
|
39
47
|
@_item
|
data/lib/gumball/version.rb
CHANGED
data/spec/dispenser_spec.rb
CHANGED
|
@@ -1,27 +1,58 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
|
+
|
|
2
3
|
module Gumball
|
|
3
4
|
describe Dispenser do
|
|
4
5
|
def now
|
|
5
6
|
Time.now.to_i
|
|
6
7
|
end
|
|
7
8
|
|
|
9
|
+
let(:ttl) { 5 }
|
|
10
|
+
let(:logger) { nil }
|
|
11
|
+
let(:subject) { described_class.new(ttl, logger: logger) { now }.on_change { |_, nv| @about = {new_value: nv, now: now} } }
|
|
12
|
+
|
|
8
13
|
it "lives for a bit, and then refreshes" do
|
|
9
|
-
|
|
10
|
-
data = described_class.new(ttl) { now }.on_change { |_, nv| @about = {new_value: nv, now: now} }
|
|
11
|
-
data.item # this "primes" it
|
|
14
|
+
subject.item # this "primes" it
|
|
12
15
|
|
|
13
16
|
n = now
|
|
14
|
-
5.times { expect(
|
|
17
|
+
5.times { expect(subject.item).to be <= n }
|
|
15
18
|
expect(@about).to be nil
|
|
16
19
|
|
|
17
20
|
sleep ttl - 1
|
|
18
|
-
5.times { expect(
|
|
21
|
+
5.times { expect(subject.item).to be <= n }
|
|
19
22
|
expect(@about).to be nil
|
|
20
23
|
|
|
21
24
|
sleep 2
|
|
22
|
-
5.times { expect(
|
|
23
|
-
expect(@about[:new_value]).to eq
|
|
25
|
+
5.times { expect(subject.item).to be > n }
|
|
26
|
+
expect(@about[:new_value]).to eq subject.item
|
|
24
27
|
expect(@about[:now]).to be > n
|
|
25
28
|
end
|
|
29
|
+
|
|
30
|
+
context "with logger" do
|
|
31
|
+
let(:log) { StringIO.new }
|
|
32
|
+
let(:logger) { Logger.new(log) }
|
|
33
|
+
let(:log_lines) { log.string.lines }
|
|
34
|
+
|
|
35
|
+
it "lives for a bit, and then refreshes" do
|
|
36
|
+
subject.item # this "primes" it
|
|
37
|
+
|
|
38
|
+
n = now
|
|
39
|
+
5.times { expect(subject.item).to be <= n }
|
|
40
|
+
expect(@about).to be nil
|
|
41
|
+
|
|
42
|
+
sleep ttl - 1
|
|
43
|
+
5.times { expect(subject.item).to be <= n }
|
|
44
|
+
expect(@about).to be nil
|
|
45
|
+
|
|
46
|
+
sleep 2
|
|
47
|
+
5.times { expect(subject.item).to be > n }
|
|
48
|
+
expect(@about[:new_value]).to eq subject.item
|
|
49
|
+
expect(@about[:now]).to be > n
|
|
50
|
+
|
|
51
|
+
expect(log_lines.length).to eq 3
|
|
52
|
+
expect(log_lines[0]).to include("INFO", described_class.to_s, "refreshed, new_value=")
|
|
53
|
+
expect(log_lines[1]).to include("INFO", described_class.to_s, "refreshed, new_value=")
|
|
54
|
+
expect(log_lines[2]).to include("DEBUG", described_class.to_s, "executing on_change")
|
|
55
|
+
end
|
|
56
|
+
end
|
|
26
57
|
end
|
|
27
58
|
end
|
data/spec/spec_helper.rb
CHANGED
metadata
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: gumball
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.0.
|
|
4
|
+
version: 0.0.7
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Kevin McDonald
|
|
8
|
-
autorequire:
|
|
8
|
+
autorequire:
|
|
9
9
|
bindir: bin
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date:
|
|
11
|
+
date: 2021-07-31 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: bundler
|
|
@@ -94,6 +94,20 @@ dependencies:
|
|
|
94
94
|
- - ">="
|
|
95
95
|
- !ruby/object:Gem::Version
|
|
96
96
|
version: '0'
|
|
97
|
+
- !ruby/object:Gem::Dependency
|
|
98
|
+
name: standard
|
|
99
|
+
requirement: !ruby/object:Gem::Requirement
|
|
100
|
+
requirements:
|
|
101
|
+
- - ">="
|
|
102
|
+
- !ruby/object:Gem::Version
|
|
103
|
+
version: '0'
|
|
104
|
+
type: :development
|
|
105
|
+
prerelease: false
|
|
106
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
107
|
+
requirements:
|
|
108
|
+
- - ">="
|
|
109
|
+
- !ruby/object:Gem::Version
|
|
110
|
+
version: '0'
|
|
97
111
|
- !ruby/object:Gem::Dependency
|
|
98
112
|
name: yard
|
|
99
113
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -117,7 +131,8 @@ extra_rdoc_files: []
|
|
|
117
131
|
files:
|
|
118
132
|
- ".github/ISSUE_TEMPLATE/bug_report.md"
|
|
119
133
|
- ".github/ISSUE_TEMPLATE/feature_request.md"
|
|
120
|
-
- ".github/workflows/
|
|
134
|
+
- ".github/workflows/gem-push.yml"
|
|
135
|
+
- ".github/workflows/ruby-build.yml"
|
|
121
136
|
- ".gitignore"
|
|
122
137
|
- ".rspec"
|
|
123
138
|
- ".travis.yml"
|
|
@@ -137,7 +152,7 @@ homepage: https://github.com/kevinstuffandthings/gumball
|
|
|
137
152
|
licenses:
|
|
138
153
|
- MIT
|
|
139
154
|
metadata: {}
|
|
140
|
-
post_install_message:
|
|
155
|
+
post_install_message:
|
|
141
156
|
rdoc_options: []
|
|
142
157
|
require_paths:
|
|
143
158
|
- lib
|
|
@@ -152,9 +167,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
|
152
167
|
- !ruby/object:Gem::Version
|
|
153
168
|
version: '0'
|
|
154
169
|
requirements: []
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
signing_key:
|
|
170
|
+
rubygems_version: 3.0.3.1
|
|
171
|
+
signing_key:
|
|
158
172
|
specification_version: 4
|
|
159
173
|
summary: Dispense expensive objects with ease
|
|
160
174
|
test_files:
|