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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: 46cbe13b04129dc45db4d922b943eba73b653745
4
- data.tar.gz: 24dc7b3f61ff28295d104ffa4b4e53965d6c2af4
2
+ SHA256:
3
+ metadata.gz: 433f05d0f09a006ff0377604af119ee8b15caaef113947241bd3bd98b263f9d7
4
+ data.tar.gz: 6ad50e2602e18e7aa76ca103a6bc4e6d7d479594176ed7baa832dec159ee6a61
5
5
  SHA512:
6
- metadata.gz: 520b55c18544eadda7c062ed83a1fc1d574119400994020cf23a36dd183b1404a46064da6022d50965805b4da109f87ced5fa06646f441e81d147365636bf642
7
- data.tar.gz: 9b98c5891ff0b3c69ef9b19203e14695ad32081680d7587d850530e168a01c5e1d0759d09d2a976dbc54da905ccc071d1215836c594adcf2c538f6754adf6b17
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@ec106b438a1ff6ff109590de34ddc62c540232e0
30
+ uses: ruby/setup-ruby@473e4d8fe5dd94ee328fdfca9f8c9c7afc9dae5e
28
31
  with:
29
- ruby-version: 2.6
30
- - name: Install dependencies
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: jUWa2Jx0HRVv7Dl0zYPTskHQ+RJGy2TUcBWOjyFbBUbeDKiRh8J/NnbMuCOvmL94htSaFk5lcs6k74Itu6jW12+KyT98OAnOardFPFuI0cHHhIMEhF6ms8EhyOCZ0vvR9zav11gfNzyF716qO09DQSDuoKWWNdhrYj8a5paLdbHuRqQiw3YUmnjVQ/v9SPYaZ7ziXC4X4tBxQhK2ujNsNfztSVrpYb6pnsXnt+hFQOnskzi0+er4854iymykeyNVgB71KgivrE3T55ZTXPPglshsZQE7M7FlYA5L3bwzR7SlA202yFYHB3hUN3obwO3BjO4OiAdKQnSosBHaXI13ZvCOz02AfEJhwoxkBXw1/2CvSQ12QQPVgqkpxWY03h+URk+gGHCV+JaqZPCV9excmVWg/IOQou0IJ6h84VFViyVc2aFVN2AIdoaG3NsppbV3j4VuLG6J2VVpNmUzN3pGgi5YSjVq9Hp+huXZFfWpnUgAxc680hKgcFajE3JNANG+NbNEeoDmITvZyV5kvJklgUKPsl2wNk+wY/GGrSBgNOVlyXqTWLZb/8Z/cSrN5DEc6D5BIS/SG95wlCRT8jUqbyEPjT+H77TH2ySfwWZzblLqbIxaLiZr3hX16oMdUx7Cya5LKLFgQBpU6cFUxvZX7SqHwjk1vnuG592Kxd9GkX4=
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
@@ -1,3 +1,4 @@
1
1
  # frozen_string_literal: true
2
- source 'https://rubygems.org'
2
+
3
+ source "https://rubygems.org"
3
4
  gemspec
data/README.md CHANGED
@@ -1,4 +1,4 @@
1
- # Gumball [![Build Status](https://travis-ci.com/kevinstuffandthings/gumball.svg?branch=master)](https://travis-ci.com/kevinstuffandthings/gumball) [![Gem Version](https://badge.fury.io/rb/gumball.svg)](https://badge.fury.io/rb/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
- dispenser = Gumball::Dispenser.new(300) { ExpensiveThing.value }
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
@@ -1,5 +1,7 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  require "bundler/setup"
3
4
  require "bundler/gem_tasks"
5
+ require "standard/rake"
4
6
 
5
- Dir.glob('lib/tasks/*.rake').each { |r| load r }
7
+ Dir.glob("lib/tasks/*.rake").each { |r| load r }
data/gumball.gemspec CHANGED
@@ -1,22 +1,22 @@
1
1
  # frozen_string_literal: true
2
- # coding: utf-8
3
- lib = File.expand_path('../lib', __FILE__)
2
+
3
+ lib = File.expand_path("../lib", __FILE__)
4
4
  $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
5
- require 'gumball/version'
5
+ require "gumball/version"
6
6
 
7
7
  Gem::Specification.new do |spec|
8
- spec.name = "gumball"
9
- spec.version = Gumball::VERSION
10
- spec.authors = ["Kevin McDonald"]
11
- spec.email = ["kevinstuffandthings@gmail.com"]
12
- spec.summary = %q{Dispense expensive objects with ease}
13
- spec.description = spec.summary
14
- spec.homepage = "https://github.com/kevinstuffandthings/gumball"
15
- spec.license = "MIT"
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 = `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)/})
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
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  require "gumball/version"
3
4
  require "gumball/dispenser"
4
5
 
@@ -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
- @on_change_block.call(old_item, @_item) if @last_refreshed && @on_change_block && (old_item != @_item)
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
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  module Gumball
3
- VERSION = "0.0.1"
4
+ VERSION = "0.0.7"
4
5
  end
@@ -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
- ttl = 5
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(data.item).to be <= n }
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(data.item).to be <= n }
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(data.item).to be > n }
23
- expect(@about[:new_value]).to eq data.item
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
@@ -1,4 +1,4 @@
1
- require 'gumball'
1
+ require "gumball"
2
2
 
3
3
  RSpec.configure do |config|
4
4
  config.expect_with :rspec do |expectations|
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.1
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: 2020-08-12 00:00:00.000000000 Z
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/ruby.yml"
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
- rubyforge_project:
156
- rubygems_version: 2.6.14
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: