gumball 0.0.1 → 0.0.7
Sign up to get free protection for your applications and to get access to all the features.
- 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 ![Build Status](https://github.com/kevinstuffandthings/gumball/actions/workflows/ruby.yml/badge.svg) [![Gem Version](https://badge.fury.io/rb/gumball.svg)](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:
|