timed_lru 0.4.0 → 0.5.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 +4 -4
- data/.github/workflows/ruby.yml +21 -0
- data/.rubocop.yml +8 -6
- data/Gemfile +0 -3
- data/Gemfile.lock +64 -46
- data/LICENSE +13 -0
- data/README.md +3 -33
- data/lib/timed_lru.rb +8 -9
- data/spec/timed_lru_spec.rb +18 -22
- data/timed_lru.gemspec +4 -3
- metadata +9 -8
- data/.travis.yml +0 -8
- data/spec/coverage_helper.rb +0 -4
    
        checksums.yaml
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            ---
         | 
| 2 2 | 
             
            SHA256:
         | 
| 3 | 
            -
              metadata.gz:  | 
| 4 | 
            -
              data.tar.gz:  | 
| 3 | 
            +
              metadata.gz: 32262a349b2bcc96380ae8cb5684ba4276ff2dd867b2d54b1f5fc92f537d0a1c
         | 
| 4 | 
            +
              data.tar.gz: 0536c7d764505d25c48e7b0041051499f32166ac0ae259f30770d2d2dc58dbd5
         | 
| 5 5 | 
             
            SHA512:
         | 
| 6 | 
            -
              metadata.gz:  | 
| 7 | 
            -
              data.tar.gz:  | 
| 6 | 
            +
              metadata.gz: e61acf070a81d2b389131302435d49b9f7c0b663dc9840948cd63686bbea01e145a6b2f0df48ab4a72b52855b888c98a502f533b665423aa17d2f00d00d9f780
         | 
| 7 | 
            +
              data.tar.gz: fda206b6600397bc0b486cfabb5a07b56bbdb67424da829ae14938e4025553f4c000ff2cbb3b3706d62d30b34c7cec78abeb5dfaf8bc7ee5949bd717d3d045c8
         | 
| @@ -0,0 +1,21 @@ | |
| 1 | 
            +
            name: Ruby
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            on:
         | 
| 4 | 
            +
              push:
         | 
| 5 | 
            +
                branches: [main]
         | 
| 6 | 
            +
              pull_request:
         | 
| 7 | 
            +
                branches: [main]
         | 
| 8 | 
            +
             | 
| 9 | 
            +
            jobs:
         | 
| 10 | 
            +
              test:
         | 
| 11 | 
            +
                runs-on: ubuntu-latest
         | 
| 12 | 
            +
                strategy:
         | 
| 13 | 
            +
                  matrix:
         | 
| 14 | 
            +
                    ruby-version: ["2.6", "2.7", "3.0"]
         | 
| 15 | 
            +
                steps:
         | 
| 16 | 
            +
                  - uses: actions/checkout@v2
         | 
| 17 | 
            +
                  - uses: ruby/setup-ruby@v1
         | 
| 18 | 
            +
                    with:
         | 
| 19 | 
            +
                      ruby-version: ${{ matrix.ruby-version }}
         | 
| 20 | 
            +
                      bundler-cache: true
         | 
| 21 | 
            +
                  - run: bundle exec rake
         | 
    
        data/.rubocop.yml
    CHANGED
    
    | @@ -1,8 +1,10 @@ | |
| 1 | 
            -
             | 
| 2 | 
            -
              - | 
| 3 | 
            -
             | 
| 1 | 
            +
            inherit_gem:
         | 
| 2 | 
            +
              rubocop-bsm:
         | 
| 3 | 
            +
                - default.yml
         | 
| 4 | 
            +
            inherit_mode:
         | 
| 5 | 
            +
              merge:
         | 
| 6 | 
            +
                - Exclude
         | 
| 4 7 | 
             
            AllCops:
         | 
| 5 | 
            -
              TargetRubyVersion: "2. | 
| 6 | 
            -
             | 
| 8 | 
            +
              TargetRubyVersion: "2.6"
         | 
| 7 9 | 
             
            Naming/MemoizedInstanceVariableName:
         | 
| 8 | 
            -
              Enabled: false
         | 
| 10 | 
            +
              Enabled: false
         | 
    
        data/Gemfile
    CHANGED
    
    
    
        data/Gemfile.lock
    CHANGED
    
    | @@ -1,70 +1,88 @@ | |
| 1 1 | 
             
            PATH
         | 
| 2 2 | 
             
              remote: .
         | 
| 3 3 | 
             
              specs:
         | 
| 4 | 
            -
                timed_lru (0. | 
| 4 | 
            +
                timed_lru (0.5.0)
         | 
| 5 5 |  | 
| 6 6 | 
             
            GEM
         | 
| 7 7 | 
             
              remote: http://rubygems.org/
         | 
| 8 8 | 
             
              specs:
         | 
| 9 | 
            -
                 | 
| 10 | 
            -
             | 
| 11 | 
            -
                   | 
| 12 | 
            -
                   | 
| 13 | 
            -
                   | 
| 14 | 
            -
                   | 
| 15 | 
            -
             | 
| 16 | 
            -
                 | 
| 17 | 
            -
                 | 
| 18 | 
            -
                 | 
| 19 | 
            -
             | 
| 20 | 
            -
                 | 
| 21 | 
            -
                 | 
| 22 | 
            -
             | 
| 9 | 
            +
                activesupport (6.1.3)
         | 
| 10 | 
            +
                  concurrent-ruby (~> 1.0, >= 1.0.2)
         | 
| 11 | 
            +
                  i18n (>= 1.6, < 2)
         | 
| 12 | 
            +
                  minitest (>= 5.1)
         | 
| 13 | 
            +
                  tzinfo (~> 2.0)
         | 
| 14 | 
            +
                  zeitwerk (~> 2.3)
         | 
| 15 | 
            +
                ast (2.4.2)
         | 
| 16 | 
            +
                concurrent-ruby (1.1.8)
         | 
| 17 | 
            +
                diff-lcs (1.4.4)
         | 
| 18 | 
            +
                i18n (1.8.9)
         | 
| 19 | 
            +
                  concurrent-ruby (~> 1.0)
         | 
| 20 | 
            +
                minitest (5.14.4)
         | 
| 21 | 
            +
                parallel (1.20.1)
         | 
| 22 | 
            +
                parser (3.0.0.0)
         | 
| 23 | 
            +
                  ast (~> 2.4.1)
         | 
| 24 | 
            +
                rack (2.2.3)
         | 
| 23 25 | 
             
                rainbow (3.0.0)
         | 
| 24 | 
            -
                rake ( | 
| 25 | 
            -
                 | 
| 26 | 
            -
             | 
| 27 | 
            -
             | 
| 28 | 
            -
                  rspec- | 
| 29 | 
            -
             | 
| 30 | 
            -
                  rspec- | 
| 31 | 
            -
                rspec- | 
| 26 | 
            +
                rake (13.0.3)
         | 
| 27 | 
            +
                regexp_parser (2.1.1)
         | 
| 28 | 
            +
                rexml (3.2.4)
         | 
| 29 | 
            +
                rspec (3.10.0)
         | 
| 30 | 
            +
                  rspec-core (~> 3.10.0)
         | 
| 31 | 
            +
                  rspec-expectations (~> 3.10.0)
         | 
| 32 | 
            +
                  rspec-mocks (~> 3.10.0)
         | 
| 33 | 
            +
                rspec-core (3.10.1)
         | 
| 34 | 
            +
                  rspec-support (~> 3.10.0)
         | 
| 35 | 
            +
                rspec-expectations (3.10.1)
         | 
| 32 36 | 
             
                  diff-lcs (>= 1.2.0, < 2.0)
         | 
| 33 | 
            -
                  rspec-support (~> 3. | 
| 34 | 
            -
                rspec-mocks (3. | 
| 37 | 
            +
                  rspec-support (~> 3.10.0)
         | 
| 38 | 
            +
                rspec-mocks (3.10.2)
         | 
| 35 39 | 
             
                  diff-lcs (>= 1.2.0, < 2.0)
         | 
| 36 | 
            -
                  rspec-support (~> 3. | 
| 37 | 
            -
                rspec-support (3. | 
| 38 | 
            -
                rubocop ( | 
| 39 | 
            -
                  jaro_winkler (~> 1.5.1)
         | 
| 40 | 
            +
                  rspec-support (~> 3.10.0)
         | 
| 41 | 
            +
                rspec-support (3.10.2)
         | 
| 42 | 
            +
                rubocop (1.11.0)
         | 
| 40 43 | 
             
                  parallel (~> 1.10)
         | 
| 41 | 
            -
                  parser (>=  | 
| 44 | 
            +
                  parser (>= 3.0.0.0)
         | 
| 42 45 | 
             
                  rainbow (>= 2.2.2, < 4.0)
         | 
| 46 | 
            +
                  regexp_parser (>= 1.8, < 3.0)
         | 
| 47 | 
            +
                  rexml
         | 
| 48 | 
            +
                  rubocop-ast (>= 1.2.0, < 2.0)
         | 
| 43 49 | 
             
                  ruby-progressbar (~> 1.7)
         | 
| 44 | 
            -
                  unicode-display_width (>= 1.4.0, <  | 
| 45 | 
            -
                 | 
| 46 | 
            -
             | 
| 47 | 
            -
             | 
| 48 | 
            -
                   | 
| 49 | 
            -
                   | 
| 50 | 
            -
             | 
| 51 | 
            -
             | 
| 52 | 
            -
                   | 
| 53 | 
            -
                 | 
| 54 | 
            -
             | 
| 55 | 
            -
             | 
| 50 | 
            +
                  unicode-display_width (>= 1.4.0, < 3.0)
         | 
| 51 | 
            +
                rubocop-ast (1.4.1)
         | 
| 52 | 
            +
                  parser (>= 2.7.1.5)
         | 
| 53 | 
            +
                rubocop-bsm (0.5.4)
         | 
| 54 | 
            +
                  rubocop (~> 1.0)
         | 
| 55 | 
            +
                  rubocop-performance
         | 
| 56 | 
            +
                  rubocop-rails
         | 
| 57 | 
            +
                  rubocop-rake
         | 
| 58 | 
            +
                  rubocop-rspec
         | 
| 59 | 
            +
                rubocop-performance (1.10.1)
         | 
| 60 | 
            +
                  rubocop (>= 0.90.0, < 2.0)
         | 
| 61 | 
            +
                  rubocop-ast (>= 0.4.0)
         | 
| 62 | 
            +
                rubocop-rails (2.9.1)
         | 
| 63 | 
            +
                  activesupport (>= 4.2.0)
         | 
| 64 | 
            +
                  rack (>= 1.1)
         | 
| 65 | 
            +
                  rubocop (>= 0.90.0, < 2.0)
         | 
| 66 | 
            +
                rubocop-rake (0.5.1)
         | 
| 67 | 
            +
                  rubocop
         | 
| 68 | 
            +
                rubocop-rspec (2.2.0)
         | 
| 69 | 
            +
                  rubocop (~> 1.0)
         | 
| 70 | 
            +
                  rubocop-ast (>= 1.1.0)
         | 
| 71 | 
            +
                ruby-progressbar (1.11.0)
         | 
| 72 | 
            +
                tzinfo (2.0.4)
         | 
| 73 | 
            +
                  concurrent-ruby (~> 1.0)
         | 
| 74 | 
            +
                unicode-display_width (2.0.0)
         | 
| 75 | 
            +
                zeitwerk (2.4.2)
         | 
| 56 76 |  | 
| 57 77 | 
             
            PLATFORMS
         | 
| 58 78 | 
             
              ruby
         | 
| 59 79 |  | 
| 60 80 | 
             
            DEPENDENCIES
         | 
| 61 81 | 
             
              bundler
         | 
| 62 | 
            -
              coveralls
         | 
| 63 | 
            -
              json (>= 1.7.7)
         | 
| 64 82 | 
             
              rake
         | 
| 65 83 | 
             
              rspec
         | 
| 66 | 
            -
              rubocop
         | 
| 84 | 
            +
              rubocop-bsm
         | 
| 67 85 | 
             
              timed_lru!
         | 
| 68 86 |  | 
| 69 87 | 
             
            BUNDLED WITH
         | 
| 70 | 
            -
               2. | 
| 88 | 
            +
               2.1.4
         | 
    
        data/LICENSE
    ADDED
    
    | @@ -0,0 +1,13 @@ | |
| 1 | 
            +
            Copyright 2021 Black Square Media Ltd
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            Licensed under the Apache License, Version 2.0 (the "License");
         | 
| 4 | 
            +
            you may not use this file except in compliance with the License.
         | 
| 5 | 
            +
            You may obtain a copy of the License at
         | 
| 6 | 
            +
             | 
| 7 | 
            +
              http://www.apache.org/licenses/LICENSE-2.0
         | 
| 8 | 
            +
             | 
| 9 | 
            +
            Unless required by applicable law or agreed to in writing, software
         | 
| 10 | 
            +
            distributed under the License is distributed on an "AS IS" BASIS,
         | 
| 11 | 
            +
            WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
         | 
| 12 | 
            +
            See the License for the specific language governing permissions and
         | 
| 13 | 
            +
            limitations under the License.
         | 
    
        data/README.md
    CHANGED
    
    | @@ -1,16 +1,13 @@ | |
| 1 | 
            -
            Timed LRU
         | 
| 2 | 
            -
            =========
         | 
| 1 | 
            +
            # Timed LRU
         | 
| 3 2 |  | 
| 4 3 | 
             
            [](https://travis-ci.org/bsm/timed_lru)
         | 
| 5 4 | 
             
            [](https://gemnasium.com/bsm/timed_lru)
         | 
| 6 | 
            -
            [](https://coveralls.io/r/bsm/timed_lru)
         | 
| 7 5 |  | 
| 8 6 | 
             
            My implementation of a simple, thread-safe LRU with (optional) TTLs
         | 
| 9 7 | 
             
            and constant time operations. There are many LRUs for Ruby available but
         | 
| 10 8 | 
             
            I was unable to find one that matches all three requirements.
         | 
| 11 9 |  | 
| 12 | 
            -
            Install
         | 
| 13 | 
            -
            -------
         | 
| 10 | 
            +
            ## Install
         | 
| 14 11 |  | 
| 15 12 | 
             
            Install it via `gem`:
         | 
| 16 13 |  | 
| @@ -20,8 +17,7 @@ gem install timed_lru | |
| 20 17 |  | 
| 21 18 | 
             
            Or just bundle it with your project.
         | 
| 22 19 |  | 
| 23 | 
            -
            Usage Example
         | 
| 24 | 
            -
            -------------
         | 
| 20 | 
            +
            ## Usage Example
         | 
| 25 21 |  | 
| 26 22 | 
             
            ```ruby
         | 
| 27 23 | 
             
            # Initialize with a max size (default: 100) and a TTL (default: none)
         | 
| @@ -45,29 +41,3 @@ sleep(4) | |
| 45 41 | 
             
            lru["c"] # => "value 3"
         | 
| 46 42 | 
             
            lru.keys # => ["c", "d"]
         | 
| 47 43 | 
             
            ```
         | 
| 48 | 
            -
             | 
| 49 | 
            -
            Licence
         | 
| 50 | 
            -
            -------
         | 
| 51 | 
            -
             | 
| 52 | 
            -
            ```
         | 
| 53 | 
            -
            Copyright (c) 2013 Black Square Media Ltd
         | 
| 54 | 
            -
             | 
| 55 | 
            -
            Permission is hereby granted, free of charge, to any person obtaining
         | 
| 56 | 
            -
            a copy of this software and associated documentation files (the
         | 
| 57 | 
            -
            "Software"), to deal in the Software without restriction, including
         | 
| 58 | 
            -
            without limitation the rights to use, copy, modify, merge, publish,
         | 
| 59 | 
            -
            distribute, sublicense, and/or sell copies of the Software, and to
         | 
| 60 | 
            -
            permit persons to whom the Software is furnished to do so, subject to
         | 
| 61 | 
            -
            the following conditions:
         | 
| 62 | 
            -
             | 
| 63 | 
            -
            The above copyright notice and this permission notice shall be
         | 
| 64 | 
            -
            included in all copies or substantial portions of the Software.
         | 
| 65 | 
            -
             | 
| 66 | 
            -
            THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
         | 
| 67 | 
            -
            EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
         | 
| 68 | 
            -
            MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
         | 
| 69 | 
            -
            NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
         | 
| 70 | 
            -
            LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
         | 
| 71 | 
            -
            OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
         | 
| 72 | 
            -
            WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
         | 
| 73 | 
            -
            ```
         | 
    
        data/lib/timed_lru.rb
    CHANGED
    
    | @@ -23,22 +23,22 @@ class TimedLRU | |
| 23 23 | 
             
              # @param [Hash] opts options
         | 
| 24 24 | 
             
              # @option opts [Integer] max_size
         | 
| 25 25 | 
             
              #   maximum allowed number of items, defaults to 100
         | 
| 26 | 
            +
              # @option opts [Integer,Float] ttl
         | 
| 27 | 
            +
              #   the TTL in seconds
         | 
| 26 28 | 
             
              # @option opts [Boolean] thread_safe
         | 
| 27 29 | 
             
              #   true by default, set to false if you are not using threads a *really* need
         | 
| 28 30 | 
             
              #   that extra bit of performance
         | 
| 29 | 
            -
               | 
| 30 | 
            -
              #   the TTL in seconds
         | 
| 31 | 
            -
              def initialize(opts={})
         | 
| 31 | 
            +
              def initialize(max_size: 100, ttl: nil, thread_safe: true)
         | 
| 32 32 | 
             
                super() # MonitorMixin
         | 
| 33 33 |  | 
| 34 34 | 
             
                @hash     = {}
         | 
| 35 | 
            -
                @max_size = Integer( | 
| 36 | 
            -
                @ttl      =  | 
| 35 | 
            +
                @max_size = Integer(max_size)
         | 
| 36 | 
            +
                @ttl      = Float(ttl) if ttl
         | 
| 37 37 |  | 
| 38 38 | 
             
                raise ArgumentError, 'Option :max_size must be > 0' unless max_size.positive?
         | 
| 39 39 | 
             
                raise ArgumentError, 'Option :ttl must be > 0' unless ttl.nil? || ttl.positive?
         | 
| 40 40 |  | 
| 41 | 
            -
                extend ThreadUnsafe if  | 
| 41 | 
            +
                extend ThreadUnsafe if thread_safe == false
         | 
| 42 42 | 
             
              end
         | 
| 43 43 |  | 
| 44 44 | 
             
              # Stores a `value` by `key`
         | 
| @@ -84,8 +84,7 @@ class TimedLRU | |
| 84 84 |  | 
| 85 85 | 
             
              def compact!
         | 
| 86 86 | 
             
                remove(@tail) while @hash.size > max_size
         | 
| 87 | 
            -
             | 
| 88 | 
            -
                remove(@tail) while ttl && @tail.expires_at < Time.now.to_i
         | 
| 87 | 
            +
                remove(@tail) while ttl && @tail.expires_at < Time.now.to_f
         | 
| 89 88 | 
             
              end
         | 
| 90 89 |  | 
| 91 90 | 
             
              def remove(node)
         | 
| @@ -98,7 +97,7 @@ class TimedLRU | |
| 98 97 | 
             
              end
         | 
| 99 98 |  | 
| 100 99 | 
             
              def touch(node)
         | 
| 101 | 
            -
                node.expires_at = Time.now. | 
| 100 | 
            +
                node.expires_at = Time.now.to_f + ttl if ttl
         | 
| 102 101 | 
             
                return if node == @head
         | 
| 103 102 |  | 
| 104 103 | 
             
                left = node.left
         | 
    
        data/spec/timed_lru_spec.rb
    CHANGED
    
    | @@ -1,7 +1,6 @@ | |
| 1 1 | 
             
            require 'spec_helper'
         | 
| 2 2 |  | 
| 3 3 | 
             
            describe TimedLRU do
         | 
| 4 | 
            -
             | 
| 5 4 | 
             
              subject { described_class.new max_size: 4 }
         | 
| 6 5 |  | 
| 7 6 | 
             
              def full_chain
         | 
| @@ -38,11 +37,13 @@ describe TimedLRU do | |
| 38 37 |  | 
| 39 38 | 
             
                describe '#max_size' do
         | 
| 40 39 | 
             
                  subject { super().max_size }
         | 
| 40 | 
            +
             | 
| 41 41 | 
             
                  it { is_expected.to be(100) }
         | 
| 42 42 | 
             
                end
         | 
| 43 43 |  | 
| 44 44 | 
             
                describe '#ttl' do
         | 
| 45 45 | 
             
                  subject { super().ttl }
         | 
| 46 | 
            +
             | 
| 46 47 | 
             
                  it { is_expected.to be_nil }
         | 
| 47 48 | 
             
                end
         | 
| 48 49 |  | 
| @@ -59,16 +60,19 @@ describe TimedLRU do | |
| 59 60 |  | 
| 60 61 | 
             
                describe '#max_size' do
         | 
| 61 62 | 
             
                  subject { super().max_size }
         | 
| 63 | 
            +
             | 
| 62 64 | 
             
                  it { is_expected.to be(25) }
         | 
| 63 65 | 
             
                end
         | 
| 64 66 |  | 
| 65 67 | 
             
                describe '#ttl' do
         | 
| 66 68 | 
             
                  subject { super().ttl }
         | 
| 67 | 
            -
             | 
| 69 | 
            +
             | 
| 70 | 
            +
                  it { is_expected.to eq(120.0) }
         | 
| 68 71 | 
             
                end
         | 
| 72 | 
            +
             | 
| 69 73 | 
             
                it { is_expected.to be_a(described_class::ThreadUnsafe) }
         | 
| 70 74 |  | 
| 71 | 
            -
                it ' | 
| 75 | 
            +
                it 'asserts correct option values' do
         | 
| 72 76 | 
             
                  expect { described_class.new(max_size: 'X') }.to raise_error(ArgumentError)
         | 
| 73 77 | 
             
                  expect { described_class.new(max_size: -1) }.to raise_error(ArgumentError)
         | 
| 74 78 | 
             
                  expect { described_class.new(max_size: 0) }.to raise_error(ArgumentError)
         | 
| @@ -80,46 +84,43 @@ describe TimedLRU do | |
| 80 84 | 
             
              end
         | 
| 81 85 |  | 
| 82 86 | 
             
              describe 'storing' do
         | 
| 83 | 
            -
             | 
| 84 | 
            -
                it 'should set head + tail on first item' do
         | 
| 87 | 
            +
                it 'sets head + tail on first item' do
         | 
| 85 88 | 
             
                  expect do
         | 
| 86 89 | 
             
                    expect(subject.store('a', 1)).to eq(1)
         | 
| 87 90 | 
             
                  end.to change { chain }.from([]).to(['a'])
         | 
| 88 91 | 
             
                end
         | 
| 89 92 |  | 
| 90 | 
            -
                it ' | 
| 93 | 
            +
                it 'shifts chain when new items are added' do
         | 
| 91 94 | 
             
                  subject['a'] = 1
         | 
| 92 95 | 
             
                  expect { subject['b'] = 2 }.to change { chain }.from(%w[a]).to(%w[b a])
         | 
| 93 96 | 
             
                  expect { subject['c'] = 3 }.to change { chain }.to(%w[c b a])
         | 
| 94 97 | 
             
                  expect { subject['d'] = 4 }.to change { chain }.to(%w[d c b a])
         | 
| 95 98 | 
             
                end
         | 
| 96 99 |  | 
| 97 | 
            -
                it ' | 
| 100 | 
            +
                it 'expires LRU items when chain exceeds max size' do
         | 
| 98 101 | 
             
                  ('a'..'d').each {|x| subject[x] = 1 }
         | 
| 99 102 | 
             
                  expect { subject['e'] = 5 }.to change { chain }.to(%w[e d c b])
         | 
| 100 103 | 
             
                  expect { subject['f'] = 6 }.to change { chain }.to(%w[f e d c])
         | 
| 101 104 | 
             
                end
         | 
| 102 105 |  | 
| 103 | 
            -
                it ' | 
| 106 | 
            +
                it 'updates items' do
         | 
| 104 107 | 
             
                  ('a'..'d').each {|x| subject[x] = 1 }
         | 
| 105 108 | 
             
                  expect { subject['d'] = 2 }.not_to change { chain }
         | 
| 106 109 | 
             
                  expect { subject['c'] = 2 }.to change { chain }.to(%w[c d b a])
         | 
| 107 110 | 
             
                  expect { subject['b'] = 2 }.to change { chain }.to(%w[b c d a])
         | 
| 108 111 | 
             
                  expect { subject['a'] = 2 }.to change { chain }.to(%w[a b c d])
         | 
| 109 112 | 
             
                end
         | 
| 110 | 
            -
             | 
| 111 113 | 
             
              end
         | 
| 112 114 |  | 
| 113 115 | 
             
              describe 'retrieving' do
         | 
| 114 | 
            -
             | 
| 115 | 
            -
                it 'should fetch values' do
         | 
| 116 | 
            +
                it 'fetches values' do
         | 
| 116 117 | 
             
                  expect(subject.fetch('a')).to be_nil
         | 
| 117 118 | 
             
                  expect(subject['a']).to be_nil
         | 
| 118 119 | 
             
                  subject['a'] = 1
         | 
| 119 120 | 
             
                  expect(subject['a']).to eq(1)
         | 
| 120 121 | 
             
                end
         | 
| 121 122 |  | 
| 122 | 
            -
                it ' | 
| 123 | 
            +
                it 'renews membership on access' do
         | 
| 123 124 | 
             
                  ('a'..'d').each {|x| subject[x] = 1 }
         | 
| 124 125 | 
             
                  expect { subject['d'] }.not_to change { chain }
         | 
| 125 126 | 
             
                  expect { subject['c'] }.to change { chain }.to(%w[c d b a])
         | 
| @@ -127,26 +128,23 @@ describe TimedLRU do | |
| 127 128 | 
             
                  expect { subject['a'] }.to change { chain }.to(%w[a b c d])
         | 
| 128 129 | 
             
                  expect { subject['x'] }.not_to change { chain }
         | 
| 129 130 | 
             
                end
         | 
| 130 | 
            -
             | 
| 131 131 | 
             
              end
         | 
| 132 132 |  | 
| 133 133 | 
             
              describe 'deleting' do
         | 
| 134 | 
            -
             | 
| 135 | 
            -
                it 'should delete an return values' do
         | 
| 134 | 
            +
                it 'deletes an return values' do
         | 
| 136 135 | 
             
                  expect(subject.delete('a')).to be_nil
         | 
| 137 136 | 
             
                  subject['a'] = 1
         | 
| 138 137 | 
             
                  expect(subject.delete('a')).to eq(1)
         | 
| 139 138 | 
             
                end
         | 
| 140 139 |  | 
| 141 | 
            -
                it ' | 
| 140 | 
            +
                it 're-arranges membership chain' do
         | 
| 142 141 | 
             
                  ('a'..'d').each {|x| subject[x] = 1 }
         | 
| 143 142 | 
             
                  expect { subject.delete('x') }.not_to change { chain }
         | 
| 144 143 | 
             
                  expect { subject.delete('c') }.to change { chain }.to(%w[d b a])
         | 
| 145 144 | 
             
                  expect { subject.delete('a') }.to change { chain }.to(%w[d b])
         | 
| 146 145 | 
             
                  expect { subject.delete('d') }.to change { chain }.to(%w[b])
         | 
| 147 | 
            -
                  expect { subject.delete('b') }.to change  | 
| 146 | 
            +
                  expect { subject.delete('b') }.to change(subject, :size).from(1).to(0)
         | 
| 148 147 | 
             
                end
         | 
| 149 | 
            -
             | 
| 150 148 | 
             
              end
         | 
| 151 149 |  | 
| 152 150 | 
             
              describe 'TTL expiration' do
         | 
| @@ -159,7 +157,7 @@ describe TimedLRU do | |
| 159 157 | 
             
                  allow(Time).to receive(:now).and_call_original
         | 
| 160 158 | 
             
                end
         | 
| 161 159 |  | 
| 162 | 
            -
                it ' | 
| 160 | 
            +
                it 'expires on access' do
         | 
| 163 161 | 
             
                  in_past(70) do
         | 
| 164 162 | 
             
                    subject['a'] = 1
         | 
| 165 163 | 
             
                    expect(chain).to eq(%w[a])
         | 
| @@ -174,7 +172,7 @@ describe TimedLRU do | |
| 174 172 | 
             
                  expect(chain).to eq(%w[c b])
         | 
| 175 173 | 
             
                end
         | 
| 176 174 |  | 
| 177 | 
            -
                it ' | 
| 175 | 
            +
                it 'renews expiration on access' do
         | 
| 178 176 | 
             
                  in_past(70) do
         | 
| 179 177 | 
             
                    subject['a'] = 1
         | 
| 180 178 | 
             
                    subject['b'] = 2
         | 
| @@ -189,7 +187,5 @@ describe TimedLRU do | |
| 189 187 | 
             
                  subject['c'] = 3
         | 
| 190 188 | 
             
                  expect(chain).to eq(%w[c a])
         | 
| 191 189 | 
             
                end
         | 
| 192 | 
            -
             | 
| 193 190 | 
             
              end
         | 
| 194 | 
            -
             | 
| 195 191 | 
             
            end
         | 
    
        data/timed_lru.gemspec
    CHANGED
    
    | @@ -1,14 +1,15 @@ | |
| 1 1 | 
             
            Gem::Specification.new do |s|
         | 
| 2 | 
            -
              s.required_ruby_version = '>= 2. | 
| 2 | 
            +
              s.required_ruby_version = '>= 2.6.0'
         | 
| 3 3 |  | 
| 4 4 | 
             
              s.name        = File.basename(__FILE__, '.gemspec')
         | 
| 5 5 | 
             
              s.summary     = 'Timed LRU'
         | 
| 6 6 | 
             
              s.description = 'Thread-safe LRU implementation with (optional) TTL and constant time operations'
         | 
| 7 | 
            -
              s.version     = '0. | 
| 7 | 
            +
              s.version     = '0.5.0'
         | 
| 8 8 |  | 
| 9 9 | 
             
              s.authors     = ['Black Square Media']
         | 
| 10 10 | 
             
              s.email       = 'info@blacksquaremedia.com'
         | 
| 11 11 | 
             
              s.homepage    = 'https://github.com/bsm/timed_lru'
         | 
| 12 | 
            +
              s.license     = 'Apache-2.0'
         | 
| 12 13 |  | 
| 13 14 | 
             
              s.require_path = 'lib'
         | 
| 14 15 | 
             
              s.files        = `git ls-files`.split("\n")
         | 
| @@ -17,5 +18,5 @@ Gem::Specification.new do |s| | |
| 17 18 | 
             
              s.add_development_dependency 'bundler'
         | 
| 18 19 | 
             
              s.add_development_dependency 'rake'
         | 
| 19 20 | 
             
              s.add_development_dependency 'rspec'
         | 
| 20 | 
            -
              s.add_development_dependency 'rubocop'
         | 
| 21 | 
            +
              s.add_development_dependency 'rubocop-bsm'
         | 
| 21 22 | 
             
            end
         | 
    
        metadata
    CHANGED
    
    | @@ -1,14 +1,14 @@ | |
| 1 1 | 
             
            --- !ruby/object:Gem::Specification
         | 
| 2 2 | 
             
            name: timed_lru
         | 
| 3 3 | 
             
            version: !ruby/object:Gem::Version
         | 
| 4 | 
            -
              version: 0. | 
| 4 | 
            +
              version: 0.5.0
         | 
| 5 5 | 
             
            platform: ruby
         | 
| 6 6 | 
             
            authors:
         | 
| 7 7 | 
             
            - Black Square Media
         | 
| 8 8 | 
             
            autorequire: 
         | 
| 9 9 | 
             
            bindir: bin
         | 
| 10 10 | 
             
            cert_chain: []
         | 
| 11 | 
            -
            date:  | 
| 11 | 
            +
            date: 2021-03-16 00:00:00.000000000 Z
         | 
| 12 12 | 
             
            dependencies:
         | 
| 13 13 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 14 14 | 
             
              name: bundler
         | 
| @@ -53,7 +53,7 @@ dependencies: | |
| 53 53 | 
             
                  - !ruby/object:Gem::Version
         | 
| 54 54 | 
             
                    version: '0'
         | 
| 55 55 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 56 | 
            -
              name: rubocop
         | 
| 56 | 
            +
              name: rubocop-bsm
         | 
| 57 57 | 
             
              requirement: !ruby/object:Gem::Requirement
         | 
| 58 58 | 
             
                requirements:
         | 
| 59 59 | 
             
                - - ">="
         | 
| @@ -73,20 +73,21 @@ executables: [] | |
| 73 73 | 
             
            extensions: []
         | 
| 74 74 | 
             
            extra_rdoc_files: []
         | 
| 75 75 | 
             
            files:
         | 
| 76 | 
            +
            - ".github/workflows/ruby.yml"
         | 
| 76 77 | 
             
            - ".gitignore"
         | 
| 77 78 | 
             
            - ".rubocop.yml"
         | 
| 78 | 
            -
            - ".travis.yml"
         | 
| 79 79 | 
             
            - Gemfile
         | 
| 80 80 | 
             
            - Gemfile.lock
         | 
| 81 | 
            +
            - LICENSE
         | 
| 81 82 | 
             
            - README.md
         | 
| 82 83 | 
             
            - Rakefile
         | 
| 83 84 | 
             
            - lib/timed_lru.rb
         | 
| 84 | 
            -
            - spec/coverage_helper.rb
         | 
| 85 85 | 
             
            - spec/spec_helper.rb
         | 
| 86 86 | 
             
            - spec/timed_lru_spec.rb
         | 
| 87 87 | 
             
            - timed_lru.gemspec
         | 
| 88 88 | 
             
            homepage: https://github.com/bsm/timed_lru
         | 
| 89 | 
            -
            licenses: | 
| 89 | 
            +
            licenses:
         | 
| 90 | 
            +
            - Apache-2.0
         | 
| 90 91 | 
             
            metadata: {}
         | 
| 91 92 | 
             
            post_install_message: 
         | 
| 92 93 | 
             
            rdoc_options: []
         | 
| @@ -96,14 +97,14 @@ required_ruby_version: !ruby/object:Gem::Requirement | |
| 96 97 | 
             
              requirements:
         | 
| 97 98 | 
             
              - - ">="
         | 
| 98 99 | 
             
                - !ruby/object:Gem::Version
         | 
| 99 | 
            -
                  version: 2. | 
| 100 | 
            +
                  version: 2.6.0
         | 
| 100 101 | 
             
            required_rubygems_version: !ruby/object:Gem::Requirement
         | 
| 101 102 | 
             
              requirements:
         | 
| 102 103 | 
             
              - - ">="
         | 
| 103 104 | 
             
                - !ruby/object:Gem::Version
         | 
| 104 105 | 
             
                  version: '0'
         | 
| 105 106 | 
             
            requirements: []
         | 
| 106 | 
            -
            rubygems_version: 3. | 
| 107 | 
            +
            rubygems_version: 3.1.4
         | 
| 107 108 | 
             
            signing_key: 
         | 
| 108 109 | 
             
            specification_version: 4
         | 
| 109 110 | 
             
            summary: Timed LRU
         | 
    
        data/.travis.yml
    DELETED
    
    
    
        data/spec/coverage_helper.rb
    DELETED