sqids 0.2.0 → 0.2.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: f504d0947f3ffd6f0fe3f9dfb4044a056b4c0d30a9d2b95a8ac5b5a043a5c45b
4
- data.tar.gz: 62fc2e00992383a7632b5f2a155ecfc09a2d221db4e2a31c505b8c54ea6ec12e
3
+ metadata.gz: 59ddd592b26f4e6e11fa12ce1a9b20438f4aabf58f1a4ea8e14bb7180afe54e8
4
+ data.tar.gz: ce4692b53fdb5dd5f849e7c236511877a15e9cfc1658faa66e4f67664b0f2e9c
5
5
  SHA512:
6
- metadata.gz: 596b48c403f99904706390dfeb23cfd9c59a075da4d970fada135aa75b9a54e39744bfd810de68b62852c7effe64fe21e3edf376d8f965455a8add0a594ab66e
7
- data.tar.gz: 74fbcc76ed257c80fd0a03fc4133ccb1b897ec62381c5377c84b873e372bc58d777194359e2765a67d9e4e38cbac5927a89336eec9a2b0241fe11e29d2e92bc6
6
+ metadata.gz: 621bfad75a7b8c12ae514ff88a8c282ee795f1ccfc03b62aff497570c96a6d4912f0b1d8eab17f6d3039180def2950b20f6d402a017971abba96280e38f36864
7
+ data.tar.gz: b5f6856e38408ea64d78cdccec7f26b86abd3907819da248d2ece727850c2c1d652807fd5eb2530f5fcc3058134d4fd7ccd1199e7152becc4affb04342bcfd97
data/CHANGELOG.md CHANGED
@@ -1,5 +1,11 @@
1
1
  # CHANGELOG
2
2
 
3
+ **v0.2.2:**
4
+ - Improvement: Encoding floats creates large encoded string: [[PR #8](https://github.com/sqids/sqids-ruby/pull/8)] (thanks to [@akeenl-sp](https://github.com/akeenl-sp))
5
+
6
+ **v0.2.1:**
7
+ - Improvement: speeding up Sqids.new: [[PR #7](https://github.com/sqids/sqids-ruby/pull/7)] (thanks to [@lawrencegripper](https://github.com/lawrencegripper))
8
+
3
9
  **v0.2.0:** **⚠️ BREAKING CHANGE**
4
10
  - **Breaking change**: IDs change. Algorithm has been fine-tuned for better performance [[Issue #11](https://github.com/sqids/sqids-spec/issues/11)]
5
11
  - `alphabet` cannot contain multibyte characters
data/README.md CHANGED
@@ -86,6 +86,11 @@ id = sqids.encode([1, 2, 3]) # 'se8ojk'
86
86
  numbers = sqids.decode(id) # [1, 2, 3]
87
87
  ```
88
88
 
89
+ > [!WARNING]
90
+ > If you provide a large custom blocklist and/or custom alphabet, calls to `Sqids.new` can take
91
+ > ~1ms. You should create a singleton instance of `Sqids` at service start and reusing that rather than
92
+ > repeatedly calling `Sqids.new`
93
+
89
94
  ## 📝 License
90
95
 
91
96
  [MIT](LICENSE)
data/lib/sqids.rb CHANGED
@@ -29,9 +29,19 @@ class Sqids
29
29
  "Minimum length has to be between 0 and #{min_length_limit}"
30
30
  end
31
31
 
32
- filtered_blocklist = blocklist.select do |word|
33
- word.length >= 3 && (word.downcase.chars - alphabet.downcase.chars).empty?
34
- end.to_set(&:downcase)
32
+ filtered_blocklist = if blocklist == DEFAULT_BLOCKLIST && alphabet == DEFAULT_ALPHABET
33
+ # If the blocklist is the default one, we don't need to filter it
34
+ # we already know it's valid (lowercase and words longer than 3 chars)
35
+ blocklist
36
+ else
37
+ # Downcase the alphabet once, rather than in the loop, to save significant time
38
+ # with large blocklists
39
+ downcased_alphabet = alphabet.downcase.chars
40
+ # Filter the blocklist
41
+ blocklist.select do |word|
42
+ word.length >= 3 && (word.downcase.chars - downcased_alphabet).empty?
43
+ end.to_set(&:downcase)
44
+ end
35
45
 
36
46
  @alphabet = shuffle(alphabet)
37
47
  @min_length = min_length
@@ -41,7 +51,7 @@ class Sqids
41
51
  def encode(numbers)
42
52
  return '' if numbers.empty?
43
53
 
44
- in_range_numbers = numbers.select { |n| n >= 0 && n <= Sqids.max_value }
54
+ in_range_numbers = numbers.map(&:to_i).select { |n| n >= 0 && n <= Sqids.max_value }
45
55
  unless in_range_numbers.length == numbers.length
46
56
  raise ArgumentError,
47
57
  "Encoding supports numbers between 0 and #{Sqids.max_value}"
@@ -100,6 +100,14 @@ describe 'Sqids' do
100
100
  expect(sqids.encode([])).to eq('')
101
101
  end
102
102
 
103
+ it 'encoding with float' do
104
+ sqids = Sqids.new
105
+ float = 3.14159265
106
+ encoded_float = sqids.encode([float])
107
+ encoded_int = sqids.encode([float.to_i])
108
+ expect(encoded_float).to eq(encoded_int)
109
+ end
110
+
103
111
  it 'decoding empty string' do
104
112
  sqids = Sqids.new
105
113
  expect(sqids.decode('')).to eq([])
data/sqids.gemspec CHANGED
@@ -7,7 +7,7 @@ require 'sqids'
7
7
 
8
8
  Gem::Specification.new do |gem|
9
9
  gem.name = 'sqids'
10
- gem.version = '0.2.0'
10
+ gem.version = '0.2.2'
11
11
  gem.authors = ['Sqids Maintainers']
12
12
  gem.summary = 'Generate YouTube-like ids from numbers.'
13
13
  gem.homepage = 'https://sqids.org/ruby'
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sqids
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 0.2.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Sqids Maintainers
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2023-09-10 00:00:00.000000000 Z
11
+ date: 2025-04-19 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description:
14
14
  email:
@@ -27,7 +27,6 @@ files:
27
27
  - spec/blocklist_spec.rb
28
28
  - spec/encoding_spec.rb
29
29
  - spec/minlength_spec.rb
30
- - spec/uniques_spec.rb
31
30
  - sqids.gemspec
32
31
  homepage: https://sqids.org/ruby
33
32
  licenses:
data/spec/uniques_spec.rb DELETED
@@ -1,62 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'rspec'
4
- require_relative '../lib/sqids'
5
-
6
- upper = 1_000
7
-
8
- describe Sqids do
9
- let(:sqids) { Sqids.new(min_length: Sqids::DEFAULT_ALPHABET.length) }
10
-
11
- it 'uniques, with padding' do
12
- set = Set.new
13
-
14
- (0...upper).each do |i|
15
- numbers = [i]
16
- id = sqids.encode(numbers)
17
- set.add(id)
18
- expect(sqids.decode(id)).to eq(numbers)
19
- end
20
-
21
- expect(set.size).to eq(upper)
22
- end
23
-
24
- it 'uniques, low ranges' do
25
- set = Set.new
26
-
27
- (0...upper).each do |i|
28
- numbers = [i]
29
- id = sqids.encode(numbers)
30
- set.add(id)
31
- expect(sqids.decode(id)).to eq(numbers)
32
- end
33
-
34
- expect(set.size).to eq(upper)
35
- end
36
-
37
- it 'uniques, high ranges' do
38
- set = Set.new
39
-
40
- (100_000_000...(100_000_000 + upper)).each do |i|
41
- numbers = [i]
42
- id = sqids.encode(numbers)
43
- set.add(id)
44
- expect(sqids.decode(id)).to eq(numbers)
45
- end
46
-
47
- expect(set.size).to eq(upper)
48
- end
49
-
50
- it 'uniques, multi' do
51
- set = Set.new
52
-
53
- (0...upper).each do |i|
54
- numbers = [i, i, i, i, i]
55
- id = sqids.encode(numbers)
56
- set.add(id)
57
- expect(sqids.decode(id)).to eq(numbers)
58
- end
59
-
60
- expect(set.size).to eq(upper)
61
- end
62
- end