rusty_lru 0.1.1 → 0.1.2

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 9399a03cbd7053c84f2ae56bb4946a48f1ea440ee47c718bfa7ce83801cfe4a7
4
- data.tar.gz: a3e939c3f19dba442aab8a6f18f6db0f19ab73171939d08acc8f9cf9869649f4
3
+ metadata.gz: 30ed50fd6948de08b1f9f2bc8a58053f635a7faa13801cfb13572417cd7f9fec
4
+ data.tar.gz: efeafff2352f14125000dfa0fffabcfed70a2bb9549abc337dc7cf72925eeb6e
5
5
  SHA512:
6
- metadata.gz: 187ddb3e30329533df0a14ab7de078aac83cba4cbd34c2990004c04c7f0949088b079b878aaaa91bfa1f002331263c5d6fc987bf14954e1fa75d9f502943e52a
7
- data.tar.gz: e2b06a2dd7ce7ab705065e473ca839964e764b99cb5e5a28d0ed803595fc7e14d7e9bd7896398e7ae782ed6f210c1579391fb4b9a999f5a4990ff5fec886b7e6
6
+ metadata.gz: 6dec4ee648d15e81ffa8ba035d53802148bf14e7a9858cc78f40804db626a25d2f3835a459fe7d6d06c652cb069105c08280579a34ac1a38e90e2cf18c65a06a
7
+ data.tar.gz: 04c6053d58b507e978fd11c242e04ba937db3a195fc42caa8b3fca3fb0c638af740c689efa38ec7f41b40e1d463488ffa195023876495165f2690f1b4e2b694d
@@ -0,0 +1,86 @@
1
+ name: CI
2
+
3
+ on:
4
+ push:
5
+ branches: [ master ]
6
+ pull_request:
7
+ branches: [ master ]
8
+
9
+ jobs:
10
+ cargo-test:
11
+ name: Cargo test
12
+ runs-on: ubuntu-latest
13
+
14
+ strategy:
15
+ fail-fast: false
16
+
17
+ matrix:
18
+ rust-version: [stable, nightly]
19
+
20
+ steps:
21
+ - uses: actions/checkout@v2
22
+
23
+ - name: Set up Rust ${{ matrix.rust-version }}
24
+ uses: actions-rs/toolchain@v1
25
+ with:
26
+ profile: minimal
27
+ toolchain: ${{ matrix.rust-version }}
28
+ override: true
29
+
30
+ - name: Set up Ruby
31
+ uses: ruby/setup-ruby@v1
32
+ with:
33
+ ruby-version: 3.0
34
+ bundler: latest
35
+ bundler-cache: true
36
+
37
+ - name: Cargo test
38
+ uses: actions-rs/cargo@v1
39
+ with:
40
+ command: test
41
+
42
+ rspec:
43
+ name: RSpec
44
+ runs-on: ubuntu-latest
45
+
46
+ strategy:
47
+ fail-fast: false
48
+
49
+ matrix:
50
+ ruby-version: [3.0, 2.7, 2.6, 2.5]
51
+
52
+ steps:
53
+ - uses: actions/checkout@v2
54
+
55
+ - uses: actions-rs/toolchain@v1
56
+ with:
57
+ profile: minimal
58
+ toolchain: stable
59
+ override: true
60
+
61
+ - name: Set up Ruby ${{ matrix.ruby-version }}
62
+ uses: ruby/setup-ruby@v1
63
+ with:
64
+ ruby-version: ${{ matrix.ruby-version }}
65
+ bundler: latest
66
+ bundler-cache: true
67
+
68
+ - name: RSpec
69
+ run: bundle exec rake spec
70
+
71
+ rubocop:
72
+ name: Rubocop
73
+ runs-on: ubuntu-latest
74
+
75
+ steps:
76
+ - uses: actions/checkout@v2
77
+
78
+ - name: Set up Ruby
79
+ uses: ruby/setup-ruby@v1
80
+ with:
81
+ ruby-version: 3.0
82
+ bundler: latest
83
+ bundler-cache: true
84
+
85
+ - name: Rubocop
86
+ run: bundle exec rubocop
data/.rubocop.yml CHANGED
@@ -1,14 +1,35 @@
1
+ require:
2
+ - rubocop-rake
3
+ - rubocop-rspec
4
+
1
5
  AllCops:
2
- TargetRubyVersion: 2.6.3
6
+ NewCops: enable
7
+ TargetRubyVersion: 2.5.0
3
8
  Exclude:
4
9
  - vendor/**/*
5
10
 
11
+ Layout/LineLength:
12
+ Enabled: false
13
+
14
+ Lint/EmptyBlock:
15
+ Enabled: false
16
+
6
17
  Metrics/BlockLength:
7
18
  Exclude:
8
19
  - ./*.gemspec
9
20
  - spec/**/*.rb
21
+ - tasks/**/*.rake
22
+
23
+ RSpec/ExampleLength:
24
+ Enabled: false
25
+
26
+ RSpec/MultipleDescribes:
27
+ Enabled: false
28
+
29
+ RSpec/MultipleExpectations:
30
+ Enabled: false
10
31
 
11
- Metrics/LineLength:
32
+ RSpec/VerifiedDoubles:
12
33
  Enabled: false
13
34
 
14
35
  Style/FrozenStringLiteralComment:
data/CHANGELOG.md CHANGED
@@ -4,11 +4,18 @@ All notable changes to this project will be documented in this file.
4
4
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
5
5
  and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
6
6
 
7
+
8
+ ## [v0.1.2] - 2021-06-05
9
+ ### Changed
10
+ - rutie bumped to v0.8.2.
11
+ - lru bumped to v0.6.5.
12
+ - Some other dev dependency bumps.
13
+
7
14
  ## [v0.1.1] - 2019-08-30
8
15
  ### Changed
9
16
  - Just an update to the README and the gemspec.
10
17
 
11
- ## [v0.1.0] - 2019-08-29
18
+ ## [v0.1.0] - 2019-08-30
12
19
  ### Added
13
20
  - Implement basic Hash-like functionality by using
14
21
  [rutie](https://rubygems.org/gems/rutie) to wrap the
@@ -17,5 +24,6 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
17
24
  - [YARD](https://yardoc.org/) docs.
18
25
  - [Rubocop](https://www.rubocop.org/).
19
26
 
27
+ [v0.1.2]: https://github.com/asppsa/rusty_lru/compare/v0.1.1...v0.1.2
20
28
  [v0.1.1]: https://github.com/asppsa/rusty_lru/compare/v0.1.0...v0.1.1
21
29
  [v0.1.0]: https://github.com/asppsa/rusty_lru/releases/tag/v0.1.0
data/Cargo.toml CHANGED
@@ -1,13 +1,13 @@
1
1
  [package]
2
2
  name = "rusty_lru"
3
- version = "0.1.1"
3
+ version = "0.1.2"
4
4
  authors = ["Alastair Pharo <me@asph.dev>"]
5
5
  edition = "2018"
6
6
 
7
7
  [dependencies]
8
- rutie = "0.6.1"
9
- lru = "0.1.17"
10
- lazy_static = "1.3.0"
8
+ rutie = "0.8.2"
9
+ lru = "0.6.5"
10
+ lazy_static = "1.4.0"
11
11
 
12
12
  [lib]
13
13
  name = "rusty_lru"
data/Gemfile CHANGED
@@ -2,3 +2,7 @@ source 'https://rubygems.org'
2
2
 
3
3
  # Specify your gem's dependencies in rusty_lru.gemspec
4
4
  gemspec
5
+
6
+ group :benchmark do
7
+ gem 'lru_redux', '~> 1.1'
8
+ end
data/README.md CHANGED
@@ -1,6 +1,7 @@
1
1
  # RustyLRU
2
2
 
3
- [![Build Status](https://travis-ci.org/asppsa/rusty_lru.svg?branch=master)](https://travis-ci.org/asppsa/rusty_lru)
3
+ [![Gem Version](https://badge.fury.io/rb/rusty_lru.svg)](https://badge.fury.io/rb/rusty_lru)
4
+ [![CI](https://github.com/asppsa/rusty_lru/actions/workflows/ci.yml/badge.svg?branch=master)](https://github.com/asppsa/rusty_lru/actions/workflows/ci.yml)
4
5
 
5
6
  This gem provides an [LRU
6
7
  cache](https://en.wikipedia.org/wiki/Cache_replacement_policies#Least_recently_used_(LRU))
data/Rakefile CHANGED
@@ -1,8 +1,9 @@
1
1
  require 'bundler/gem_tasks'
2
2
  require 'rspec/core/rake_task'
3
- load 'tasks/cargo.rake'
3
+ Dir['tasks/*.rake'].each(&method(:load))
4
4
 
5
5
  RSpec::Core::RakeTask.new(spec: 'cargo:build')
6
6
 
7
+ desc 'Run Ruby and Rust tests'
7
8
  task test: [:spec, 'cargo:test']
8
9
  task default: :test
data/lib/rusty_lru.rb CHANGED
@@ -7,5 +7,5 @@ module RustyLRU
7
7
  Rutie.new(:rusty_lru).init 'Init_rusty_lru', __dir__
8
8
 
9
9
  # Now load the additional methods
10
- require_relative './rusty_lru/cache.rb'
10
+ require_relative './rusty_lru/cache'
11
11
  end
@@ -1,3 +1,3 @@
1
1
  module RustyLRU
2
- VERSION = '0.1.1'.freeze
2
+ VERSION = '0.1.2'.freeze
3
3
  end
data/rusty_lru.gemspec CHANGED
@@ -7,6 +7,7 @@ Gem::Specification.new do |spec|
7
7
  spec.version = RustyLRU::VERSION
8
8
  spec.authors = ['Alastair Pharo']
9
9
  spec.email = ['me@asph.dev']
10
+ spec.required_ruby_version = '>= 2.5'
10
11
 
11
12
  spec.summary = 'An LRU cache implemented in Rust'
12
13
  spec.description = <<-DESC
@@ -34,8 +35,10 @@ Gem::Specification.new do |spec|
34
35
  spec.add_runtime_dependency 'rutie', '~> 0.0.3'
35
36
 
36
37
  spec.add_development_dependency 'bundler', '~> 2.0'
37
- spec.add_development_dependency 'irb', '~> 1.0.0'
38
- spec.add_development_dependency 'rake', '~> 10.0'
38
+ spec.add_development_dependency 'irb', '~> 1.3.5'
39
+ spec.add_development_dependency 'rake', '>= 12.3.3'
39
40
  spec.add_development_dependency 'rspec', '~> 3.0'
40
- spec.add_development_dependency 'rubocop', '~> 0.74.0'
41
+ spec.add_development_dependency 'rubocop', '~> 1.16.0'
42
+ spec.add_development_dependency 'rubocop-rake', '~> 0.5.1'
43
+ spec.add_development_dependency 'rubocop-rspec', '~> 2.3.0'
41
44
  end
data/src/lib.rs CHANGED
@@ -13,7 +13,7 @@ pub struct HashableObject {
13
13
 
14
14
  impl HashableObject {
15
15
  fn get_hash<T: Object>(object: &T) -> i64 {
16
- object.send("hash", &[])
16
+ unsafe { object.send("hash", &[]) }
17
17
  .try_convert_to::<Integer>()
18
18
  .map_err(|e| VM::raise_ex(e))
19
19
  .unwrap()
@@ -297,7 +297,7 @@ mod tests {
297
297
  let mut hasher1 = DefaultHasher::new();
298
298
  let mut hasher2 = DefaultHasher::new();
299
299
 
300
- nil.send("hash", &[]).try_convert_to::<Integer>().unwrap().to_i64().hash(&mut hasher1);
300
+ unsafe { nil.send("hash", &[]) }.try_convert_to::<Integer>().unwrap().to_i64().hash(&mut hasher1);
301
301
  ho.hash(&mut hasher2);
302
302
 
303
303
  let hash1 = hasher1.finish();
data/tasks/cargo.rake CHANGED
@@ -1,8 +1,10 @@
1
1
  namespace :cargo do
2
+ desc 'Cargo build'
2
3
  task :build do
3
4
  sh 'cargo build --release'
4
5
  end
5
6
 
7
+ desc 'Cargo test'
6
8
  task :test do
7
9
  sh 'cargo test'
8
10
  end
data/tasks/check.rake ADDED
@@ -0,0 +1,72 @@
1
+ namespace :check do
2
+ desc 'Benchmark Rusty against lru_redux'
3
+ task bench: 'cargo:build' do
4
+ require 'benchmark'
5
+ require 'lru_redux'
6
+ require 'rusty_lru'
7
+
8
+ rusty = RustyLRU::Cache.new(1_000)
9
+
10
+ redux = LruRedux::Cache.new(1_000)
11
+ redux_thread_safe = LruRedux::ThreadSafeCache.new(1_000)
12
+
13
+ Benchmark.bmbm do |bm|
14
+ bm.report 'RustyLRU::Cache' do
15
+ 1_000_000.times { rusty[rand(2_000)] = :value }
16
+ end
17
+
18
+ bm.report 'LruRedux::Cache' do
19
+ 1_000_000.times { redux[rand(2_000)] = :value }
20
+ end
21
+
22
+ bm.report 'LruRedux::ThreadSafeCache' do
23
+ 1_000_000.times { redux_thread_safe[rand(2_000)] = :value }
24
+ end
25
+ end
26
+ end
27
+
28
+ desc 'Check memory consumption'
29
+ task mem: 'cargo:build' do
30
+ require 'rusty_lru'
31
+ require 'securerandom'
32
+
33
+ rusty = RustyLRU::Cache.new(1_000_000)
34
+ statm = File.open("/proc/#{Process.pid}/statm")
35
+
36
+ loop do
37
+ 1_000_000.times { rusty[SecureRandom.random_bytes(100)] ||= SecureRandom.random_bytes(100) }
38
+ p %i[size resident shared text lib data dt].zip(statm.read.split.map(&:to_i)).to_h.slice(:size, :resident, :data)
39
+ statm.rewind
40
+ end
41
+ end
42
+
43
+ desc 'Check thread safety'
44
+ task threadsafe: 'cargo:build' do
45
+ require 'rusty_lru'
46
+ require 'securerandom'
47
+
48
+ rusty = RustyLRU::Cache.new(1000)
49
+ pairs = (0..100).map do |j|
50
+ [j, SecureRandom.uuid]
51
+ end
52
+
53
+ return_values = pairs.map do |j, v|
54
+ Thread.new do
55
+ (0...100).map do
56
+ # Each thread tries to create the same pair. Only one should
57
+ # succeed.
58
+ Thread.new { rusty.create(j, v) }
59
+ end.map(&:value)
60
+ end
61
+ end
62
+
63
+ return_values.each do |values|
64
+ count = values.select(&:itself).size
65
+ raise "#{j}: Got #{count}" unless count == 1
66
+ end
67
+
68
+ pairs.each do |k, v|
69
+ p [k, v, rusty.delete(k) == v]
70
+ end
71
+ end
72
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rusty_lru
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.1
4
+ version: 0.1.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Alastair Pharo
8
- autorequire:
8
+ autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2019-08-30 00:00:00.000000000 Z
11
+ date: 2021-06-05 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rutie
@@ -44,28 +44,28 @@ dependencies:
44
44
  requirements:
45
45
  - - "~>"
46
46
  - !ruby/object:Gem::Version
47
- version: 1.0.0
47
+ version: 1.3.5
48
48
  type: :development
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
52
  - - "~>"
53
53
  - !ruby/object:Gem::Version
54
- version: 1.0.0
54
+ version: 1.3.5
55
55
  - !ruby/object:Gem::Dependency
56
56
  name: rake
57
57
  requirement: !ruby/object:Gem::Requirement
58
58
  requirements:
59
- - - "~>"
59
+ - - ">="
60
60
  - !ruby/object:Gem::Version
61
- version: '10.0'
61
+ version: 12.3.3
62
62
  type: :development
63
63
  prerelease: false
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
- - - "~>"
66
+ - - ">="
67
67
  - !ruby/object:Gem::Version
68
- version: '10.0'
68
+ version: 12.3.3
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: rspec
71
71
  requirement: !ruby/object:Gem::Requirement
@@ -86,14 +86,42 @@ dependencies:
86
86
  requirements:
87
87
  - - "~>"
88
88
  - !ruby/object:Gem::Version
89
- version: 0.74.0
89
+ version: 1.16.0
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - "~>"
95
+ - !ruby/object:Gem::Version
96
+ version: 1.16.0
97
+ - !ruby/object:Gem::Dependency
98
+ name: rubocop-rake
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - "~>"
102
+ - !ruby/object:Gem::Version
103
+ version: 0.5.1
90
104
  type: :development
91
105
  prerelease: false
92
106
  version_requirements: !ruby/object:Gem::Requirement
93
107
  requirements:
94
108
  - - "~>"
95
109
  - !ruby/object:Gem::Version
96
- version: 0.74.0
110
+ version: 0.5.1
111
+ - !ruby/object:Gem::Dependency
112
+ name: rubocop-rspec
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - "~>"
116
+ - !ruby/object:Gem::Version
117
+ version: 2.3.0
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - "~>"
123
+ - !ruby/object:Gem::Version
124
+ version: 2.3.0
97
125
  description: |2
98
126
  This gem provides an LRU cache with an interface close to Hash. It uses Rutie
99
127
  to wrap the Rust 'lru' crate.
@@ -104,10 +132,10 @@ extensions:
104
132
  - ext/Rakefile
105
133
  extra_rdoc_files: []
106
134
  files:
135
+ - ".github/workflows/ci.yml"
107
136
  - ".gitignore"
108
137
  - ".rspec"
109
138
  - ".rubocop.yml"
110
- - ".travis.yml"
111
139
  - CHANGELOG.md
112
140
  - Cargo.toml
113
141
  - Gemfile
@@ -122,6 +150,7 @@ files:
122
150
  - rusty_lru.gemspec
123
151
  - src/lib.rs
124
152
  - tasks/cargo.rake
153
+ - tasks/check.rake
125
154
  homepage: https://github.com/asppsa/rusty_lru
126
155
  licenses:
127
156
  - Apache-2.0
@@ -130,7 +159,7 @@ metadata:
130
159
  documentation_uri: https://rubydoc.info/gems/rusty_lru
131
160
  homepage_uri: https://github.com/asppsa/rusty_lru
132
161
  source_code_uri: https://github.com/asppsa/rusty_lru.git
133
- post_install_message:
162
+ post_install_message:
134
163
  rdoc_options: []
135
164
  require_paths:
136
165
  - lib
@@ -138,15 +167,15 @@ required_ruby_version: !ruby/object:Gem::Requirement
138
167
  requirements:
139
168
  - - ">="
140
169
  - !ruby/object:Gem::Version
141
- version: '0'
170
+ version: '2.5'
142
171
  required_rubygems_version: !ruby/object:Gem::Requirement
143
172
  requirements:
144
173
  - - ">="
145
174
  - !ruby/object:Gem::Version
146
175
  version: '0'
147
176
  requirements: []
148
- rubygems_version: 3.0.4
149
- signing_key:
177
+ rubygems_version: 3.2.15
178
+ signing_key:
150
179
  specification_version: 4
151
180
  summary: An LRU cache implemented in Rust
152
181
  test_files: []
data/.travis.yml DELETED
@@ -1,29 +0,0 @@
1
- language: ruby
2
- os:
3
- - osx
4
- - linux
5
- rvm:
6
- - 2.6
7
- - 2.5
8
- - 2.4
9
- env:
10
- - RUST_VERSION=stable
11
- - RUST_VERSION=nightly
12
- before_install:
13
- - gem update --system
14
- - gem install bundler
15
- - curl https://sh.rustup.rs -sSf | sh -s -- -y --default-toolchain $RUST_VERSION
16
- - source $HOME/.cargo/env
17
- cache:
18
- bundler: true
19
- directories:
20
- - $HOME/.cargo
21
- script:
22
- - LD_LIBRARY_PATH=$(ruby -e "print RbConfig::CONFIG['libdir']") cargo test
23
- - bundle exec rake spec
24
- - bundle exec rubocop
25
- matrix:
26
- allow_failures:
27
- - env: RUST_VERSION=nightly
28
- branches:
29
- only: master