idy 0.1.3 → 1.2.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: f991a3fc046a1c984dd2ea37acf5f2881614ab7d
4
- data.tar.gz: 437136e2d1abb67b41d882cfbb60ec4c579dd6ec
2
+ SHA256:
3
+ metadata.gz: 5c1011342e7f8209b6c228fd8942f1d4e5b95032a2e30d541d0440c9edc9c9b8
4
+ data.tar.gz: a3033d0cc45ddde615174dc662e1c33f21e24a33739d1e4ae7b7cfa454a993d4
5
5
  SHA512:
6
- metadata.gz: a93e16c6d3ebdeaff9b27e5e264995d62cca1ba0301a80bbbc66faa080514aaf7b67df46bbaa429ecf6e11aca237e09d439adc1265b42a55efd53b958e0b7c87
7
- data.tar.gz: f820c5618fe37624fe239d4b18c277acda0cd0db54114aad24e7ba6cfc09633861f6d6b83e82c1dd700accb76e75ca8aee937d1279c5d855d8f9f6e08d65538f
6
+ metadata.gz: e4972508e537e35f40bcc2126f738ffb31b1181e7d322d80375f1f7fce30dca31ca732130384017c22af25a7d1f74bcb0c344588adbaaffdd38ddd932910a1ea
7
+ data.tar.gz: b42199aa35fb78fb891e893ee3975964f1b02f84675ac0be0b7da6f9031732c8d1af5762fa8ab25d13b25070e9d22c1754da2e078285c42437465bc93e35e1dc
data/CHANGELOG.md CHANGED
@@ -1,21 +1,52 @@
1
+ ## v1.2.0
2
+
3
+ ### Fixes
4
+
5
+ - Allows namespaced class to be obfuscated. [#10](https://github.com/wbotelhos/idy/pull/10) by [vitobotta](https://github.com/vitobotta)
6
+
7
+ ### Updates
8
+
9
+ - Adds all previous version on the [Releases page](https://github.com/wbotelhos/idy/releases);
10
+ - Adds coverage via [Codecov](https://app.codecov.io/gh/wbotelhos/idy);
11
+ - Moves the CI to [Github Actions](https://github.com/wbotelhos/idy/actions);
12
+ - Removes spec files from the gem to keep the package smaller;
13
+
14
+ ## v1.1.0
15
+
16
+ ### Updates
17
+
18
+ - Does not restrict Rails version;
19
+ - Does not restrict Hashids version;
20
+ - Bump Ruby version to 2.6.4;
21
+
22
+ ## v1.0.0
23
+
24
+ ### Break Changes
25
+
26
+ - Drops `find` override method to avoid finding on a hash that looks like a number issue [#1](https://github.com/wbotelhos/idy/issues/1)
27
+
1
28
  ## v0.1.3
2
29
 
3
- - features
4
- - Added `find` method to find directly via idy returning `nil` when record is not found;
5
- - Added `find!` method to find directly via idy raising error when record is not found.
30
+ ### Features
31
+
32
+ - Added `find` method to find directly via idy returning `nil` when the record is not found;
33
+ - Added `find!` method to find directly via idy raising an error when the record is not found.
6
34
 
7
- - bug fixes
8
- - String that is integer like is not passed to original find method.
35
+ ### Fixes
36
+
37
+ - String that is integer-like is not passed to the original find method.
9
38
 
10
39
  ## v0.1.2
11
40
 
12
- - bug fixes
13
- - Set options on a prefixed var to avoid conflict.
41
+ ### Fixes
42
+
43
+ - Set options on a prefixed var to avoid conflict.
14
44
 
15
45
  ## v0.1.1
16
46
 
17
- - bug fixes
18
- - v0.1.0 had problem on `push`.
47
+ ### Fixes
48
+
49
+ - v0.1.0 had a problem with `push`.
19
50
 
20
51
  ## v0.1.0
21
52
 
data/README.md CHANGED
@@ -1,7 +1,10 @@
1
1
  # Idy
2
2
 
3
- [![Build Status](https://travis-ci.org/wbotelhos/idy.svg)](https://travis-ci.org/wbotelhos/idy)
3
+ [![CI](https://github.com/wbotelhos/idy/workflows/CI/badge.svg)](https://github.com/wbotelhos/idy/actions)
4
4
  [![Gem Version](https://badge.fury.io/rb/idy.svg)](https://badge.fury.io/rb/idy)
5
+ [![Maintainability](https://api.codeclimate.com/v1/badges/f312587b4f126bb13e85/maintainability)](https://codeclimate.com/github/wbotelhos/idy/maintainability)
6
+ [![Coverage](https://codecov.io/gh/wbotelhos/idy/branch/main/graph/badge.svg)](https://codecov.io/gh/wbotelhos/idy)
7
+ [![Sponsor](https://img.shields.io/badge/sponsor-%3C3-green)](https://www.patreon.com/wbotelhos)
5
8
 
6
9
  An ID obfuscator for ActiveRecord.
7
10
 
@@ -45,7 +48,7 @@ Article.new(id: 1).idy
45
48
  # My
46
49
  ```
47
50
 
48
- It will build you Rals URL with that ID too:
51
+ It will build your Rails URL with that ID too:
49
52
 
50
53
  ```ruby
51
54
  Article.new(id: 1).to_param
@@ -60,7 +63,7 @@ If you want a *unbreakable* hash, it is not for you.
60
63
  ## Collision
61
64
 
62
65
  To avoid two differents models to generates the same hash for the same ID,
63
- by default, the class name is used as a [Salt](https://en.wikipedia.org/wiki/Salt_(cryptography).
66
+ by default, the class name is used as a [Salt](https://en.wikipedia.org/wiki/Salt_cryptography).
64
67
 
65
68
  ```ruby
66
69
  Article.new(id: 1).idy
@@ -85,6 +88,25 @@ Article.new(id: 1).idy
85
88
  # 9A
86
89
  ```
87
90
 
91
+ ## Idy
92
+
93
+ As you could see, the method `idy`, returns the hash representation of your ID:
94
+
95
+ ```ruby
96
+ Article.new(id: 1).idy
97
+ # My
98
+ ```
99
+
100
+ If you want get all idys from a collection, just map it:
101
+
102
+ ```ruby
103
+ Article.create
104
+ Article.create
105
+
106
+ Article.select(:id).map(&:idy)
107
+ # ["My", "aL"]
108
+ ```
109
+
88
110
  ## Find
89
111
 
90
112
  Since you add the `idy` callback to your model, `find` method will be decorated:
@@ -125,13 +147,31 @@ Article.findy! 'missing'
125
147
  # ActiveRecord::RecordNotFound: Couldn't find Article with 'idy'="missing"
126
148
  ```
127
149
 
150
+ ## Functions
151
+
152
+ You can encode a number manually:
153
+
154
+ ```ruby
155
+ Model.idy_encode(idy)
156
+ ```
157
+
158
+ You can decode an idy in case you want to use the ActiveRecord methods with the original ID:
159
+
160
+ ```ruby
161
+ Model.idy_decode(idy)
162
+ ```
163
+
164
+ ## Testing
165
+ Check if your model responds to idy method:
166
+
167
+ ### RSpec
168
+ ```ruby
169
+ it { is_expected.to respond_to(:idy) }
170
+ ```
171
+
128
172
  ## Inspiration
129
173
 
130
- It was inpired and improved from:
174
+ It was inspired and improved from:
131
175
 
132
176
  - [obfuscate_id](https://github.com/namick/obfuscate_id)
133
177
  - [hashids_uri](https://github.com/danieldraper/hashids_uri)
134
-
135
- ## Love it!
136
-
137
- Via [PayPal](https://www.paypal.com/cgi-bin/webscr?cmd=_donations&business=X8HEP2878NDEG&item_name=idy) or [Gratipay](https://gratipay.com/~wbotelhos). Thanks! (:
data/lib/idy/extension.rb CHANGED
@@ -21,18 +21,6 @@ module Idy
21
21
  end
22
22
 
23
23
  module ClassMethods
24
- def find(*args)
25
- id = args.first
26
-
27
- return super if args.count != 1 || integer?(id)
28
-
29
- scope = try(:idy?) ? [id].flatten.map { |id| idy_decode(id) } : id
30
-
31
- not_found!(id) if scope.compact.blank?
32
-
33
- super scope.size == 1 ? scope[0] : scope
34
- end
35
-
36
24
  def findy(hash)
37
25
  find_by id: idy_decode(hash)
38
26
  end
@@ -58,7 +46,7 @@ module Idy
58
46
  def idy_default_salt
59
47
  alphabet = Array('a'..'z')
60
48
 
61
- indexes = name.downcase.split('').map do |char|
49
+ indexes = name.downcase.tr(':', '').split('').map do |char|
62
50
  alphabet.index(char) + 1
63
51
  end
64
52
 
@@ -85,12 +73,6 @@ module Idy
85
73
  Hashids.new salt.to_s
86
74
  end
87
75
 
88
- def integer?(id)
89
- Integer id
90
- rescue
91
- false
92
- end
93
-
94
76
  def not_found!(hash)
95
77
  raise ActiveRecord::RecordNotFound, "Couldn't find User with 'idy'=#{hash.inspect}"
96
78
  end
data/lib/idy/version.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Idy
4
- VERSION = '0.1.3'.freeze
4
+ VERSION = '1.2.0'
5
5
  end
metadata CHANGED
@@ -1,51 +1,45 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: idy
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.3
4
+ version: 1.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Washington Botelho
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-05-06 00:00:00.000000000 Z
11
+ date: 2022-04-05 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
- name: hashids
14
+ name: activerecord
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - "~>"
17
+ - - ">="
18
18
  - !ruby/object:Gem::Version
19
- version: '1.0'
19
+ version: '0'
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - "~>"
24
+ - - ">="
25
25
  - !ruby/object:Gem::Version
26
- version: '1.0'
26
+ version: '0'
27
27
  - !ruby/object:Gem::Dependency
28
- name: rails
28
+ name: hashids
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
31
  - - ">="
32
32
  - !ruby/object:Gem::Version
33
- version: '5'
34
- - - "<"
35
- - !ruby/object:Gem::Version
36
- version: '6'
33
+ version: '0'
37
34
  type: :runtime
38
35
  prerelease: false
39
36
  version_requirements: !ruby/object:Gem::Requirement
40
37
  requirements:
41
38
  - - ">="
42
39
  - !ruby/object:Gem::Version
43
- version: '5'
44
- - - "<"
45
- - !ruby/object:Gem::Version
46
- version: '6'
40
+ version: '0'
47
41
  - !ruby/object:Gem::Dependency
48
- name: database_cleaner
42
+ name: codecov
49
43
  requirement: !ruby/object:Gem::Requirement
50
44
  requirements:
51
45
  - - ">="
@@ -59,7 +53,7 @@ dependencies:
59
53
  - !ruby/object:Gem::Version
60
54
  version: '0'
61
55
  - !ruby/object:Gem::Dependency
62
- name: guard-rspec
56
+ name: database_cleaner
63
57
  requirement: !ruby/object:Gem::Requirement
64
58
  requirements:
65
59
  - - ">="
@@ -73,7 +67,7 @@ dependencies:
73
67
  - !ruby/object:Gem::Version
74
68
  version: '0'
75
69
  - !ruby/object:Gem::Dependency
76
- name: rspec-rails
70
+ name: pry-byebug
77
71
  requirement: !ruby/object:Gem::Requirement
78
72
  requirements:
79
73
  - - ">="
@@ -87,7 +81,7 @@ dependencies:
87
81
  - !ruby/object:Gem::Version
88
82
  version: '0'
89
83
  - !ruby/object:Gem::Dependency
90
- name: rubocop-rspec
84
+ name: rspec-rails
91
85
  requirement: !ruby/object:Gem::Requirement
92
86
  requirements:
93
87
  - - ">="
@@ -101,7 +95,7 @@ dependencies:
101
95
  - !ruby/object:Gem::Version
102
96
  version: '0'
103
97
  - !ruby/object:Gem::Dependency
104
- name: rubocop
98
+ name: rubocop-performance
105
99
  requirement: !ruby/object:Gem::Requirement
106
100
  requirements:
107
101
  - - ">="
@@ -115,7 +109,7 @@ dependencies:
115
109
  - !ruby/object:Gem::Version
116
110
  version: '0'
117
111
  - !ruby/object:Gem::Dependency
118
- name: sqlite3
112
+ name: rubocop-rspec
119
113
  requirement: !ruby/object:Gem::Requirement
120
114
  requirements:
121
115
  - - ">="
@@ -129,7 +123,7 @@ dependencies:
129
123
  - !ruby/object:Gem::Version
130
124
  version: '0'
131
125
  - !ruby/object:Gem::Dependency
132
- name: pry-byebug
126
+ name: sqlite3
133
127
  requirement: !ruby/object:Gem::Requirement
134
128
  requirements:
135
129
  - - ">="
@@ -146,7 +140,10 @@ description: An ID obfuscator for ActiveRecord.
146
140
  email: wbotelhos@gmail.com
147
141
  executables: []
148
142
  extensions: []
149
- extra_rdoc_files: []
143
+ extra_rdoc_files:
144
+ - CHANGELOG.md
145
+ - LICENSE
146
+ - README.md
150
147
  files:
151
148
  - CHANGELOG.md
152
149
  - LICENSE
@@ -154,34 +151,11 @@ files:
154
151
  - lib/idy.rb
155
152
  - lib/idy/extension.rb
156
153
  - lib/idy/version.rb
157
- - spec/lib/idy/extension/find_by_spec.rb
158
- - spec/lib/idy/extension/find_spec.rb
159
- - spec/lib/idy/extension/findy_bump_spec.rb
160
- - spec/lib/idy/extension/findy_spec.rb
161
- - spec/lib/idy/extension/idy_decode_spec.rb
162
- - spec/lib/idy/extension/idy_default_salt_spec.rb
163
- - spec/lib/idy/extension/idy_encode_spec.rb
164
- - spec/lib/idy/extension/idy_spec.rb
165
- - spec/lib/idy/extension/lock_spec.rb
166
- - spec/lib/idy/extension/options_spec.rb
167
- - spec/lib/idy/extension/salt_spec.rb
168
- - spec/lib/idy/extension/to_param_spec.rb
169
- - spec/rails_helper.rb
170
- - spec/support/common.rb
171
- - spec/support/database_cleaner.rb
172
- - spec/support/db/migrate/create_tables.rb
173
- - spec/support/migrate.rb
174
- - spec/support/models/abcdefghijklm.rb
175
- - spec/support/models/article.rb
176
- - spec/support/models/clean.rb
177
- - spec/support/models/comment.rb
178
- - spec/support/models/post.rb
179
- - spec/support/models/user.rb
180
154
  homepage: https://github.com/wbotelhos/idy
181
155
  licenses:
182
156
  - MIT
183
157
  metadata: {}
184
- post_install_message:
158
+ post_install_message:
185
159
  rdoc_options: []
186
160
  require_paths:
187
161
  - lib
@@ -196,32 +170,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
196
170
  - !ruby/object:Gem::Version
197
171
  version: '0'
198
172
  requirements: []
199
- rubyforge_project:
200
- rubygems_version: 2.6.11
201
- signing_key:
173
+ rubygems_version: 3.2.22
174
+ signing_key:
202
175
  specification_version: 4
203
176
  summary: An ID obfuscator for ActiveRecord.
204
- test_files:
205
- - spec/lib/idy/extension/find_by_spec.rb
206
- - spec/lib/idy/extension/find_spec.rb
207
- - spec/lib/idy/extension/findy_bump_spec.rb
208
- - spec/lib/idy/extension/findy_spec.rb
209
- - spec/lib/idy/extension/idy_decode_spec.rb
210
- - spec/lib/idy/extension/idy_default_salt_spec.rb
211
- - spec/lib/idy/extension/idy_encode_spec.rb
212
- - spec/lib/idy/extension/idy_spec.rb
213
- - spec/lib/idy/extension/lock_spec.rb
214
- - spec/lib/idy/extension/options_spec.rb
215
- - spec/lib/idy/extension/salt_spec.rb
216
- - spec/lib/idy/extension/to_param_spec.rb
217
- - spec/rails_helper.rb
218
- - spec/support/common.rb
219
- - spec/support/database_cleaner.rb
220
- - spec/support/db/migrate/create_tables.rb
221
- - spec/support/migrate.rb
222
- - spec/support/models/abcdefghijklm.rb
223
- - spec/support/models/article.rb
224
- - spec/support/models/clean.rb
225
- - spec/support/models/comment.rb
226
- - spec/support/models/post.rb
227
- - spec/support/models/user.rb
177
+ test_files: []
@@ -1,13 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'rails_helper'
4
-
5
- RSpec.describe Article, '.find_by' do
6
- subject { described_class.create title: 'title' }
7
-
8
- it 'works with normal id' do
9
- record = described_class.find_by(id: subject.id)
10
-
11
- expect(subject).to eq record
12
- end
13
- end
@@ -1,87 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'rails_helper'
4
-
5
- RSpec.describe Article do
6
- context 'with idy enabled' do
7
- context 'on reload' do
8
- subject { described_class.create id: 42, title: 'title' }
9
-
10
- it 'reloads' do
11
- record = described_class.find(subject.to_param)
12
-
13
- record.update_attribute :title, 'title.updated'
14
-
15
- expect(subject.title).to eq 'title'
16
- expect(subject.reload.title).to eq 'title.updated'
17
- end
18
-
19
- context 'while locking' do
20
- it 'does not throw an error' do
21
- expect(-> { subject.lock! }).not_to raise_error
22
- end
23
- end
24
- end
25
-
26
- context 'finding one record as id' do
27
- subject { described_class.find record.id }
28
-
29
- let!(:record) { described_class.create id: 42, title: 'title-1' }
30
-
31
- specify { expect(subject).to eq record }
32
- end
33
-
34
- context 'finding one record as idy' do
35
- subject { described_class.find record.to_param }
36
-
37
- let!(:record) { described_class.create id: 42, title: 'title-1' }
38
-
39
- specify { expect(subject).to eq record }
40
- end
41
-
42
- context 'finding multiple records' do
43
- subject { described_class.find [record_1.to_param, record_2.to_param] }
44
-
45
- let!(:record_1) { described_class.create id: 42, title: 'title-1' }
46
- let!(:record_2) { described_class.create id: 1 , title: 'title-2' }
47
-
48
- it 'finds all' do
49
- expect(subject).to eq [record_1, record_2]
50
- end
51
- end
52
-
53
- context 'finding via has_many' do
54
- let!(:article) { described_class.create }
55
- let!(:comment) { Comment.create article: article }
56
-
57
- specify { expect(article.comments.find(comment.id)).to eq comment }
58
- end
59
-
60
- context 'when id is an integer like' do
61
- let!(:record) { described_class.create id: 1 }
62
- let!(:idy) { '1a' }
63
-
64
- it 'does not tries to use the integer part on normal find' do
65
- expect { described_class.find(idy) }.to raise_error ActiveRecord::RecordNotFound, %(Couldn't find User with 'idy'="1a")
66
- end
67
- end
68
- end
69
-
70
- context 'with idy disabled' do
71
- let!(:record) { Clean.create }
72
-
73
- context 'of one record' do
74
- it 'finds by normal id' do
75
- expect(Clean.find(record.id)).to eq record
76
- end
77
- end
78
-
79
- context 'of multiple record' do
80
- let!(:record_2) { Clean.create }
81
-
82
- it 'finds by normal id' do
83
- expect(Clean.find([record.id, record_2.id])).to eq [record, record_2]
84
- end
85
- end
86
- end
87
- end
@@ -1,24 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'rails_helper'
4
-
5
- RSpec.describe '#findy!' do
6
- context 'when a hash is given' do
7
- context 'and record is found' do
8
- let!(:record) { Article.create id: 1 }
9
- let!(:hash) { 'My' }
10
-
11
- it 'finds the record' do
12
- expect(Article.findy!(hash)).to eq record
13
- end
14
- end
15
-
16
- context 'and record is not found' do
17
- let!(:hash) { 'My' }
18
-
19
- it 'raises' do
20
- expect { Article.findy!(hash) }.to raise_error ActiveRecord::RecordNotFound, %(Couldn't find User with 'idy'="My")
21
- end
22
- end
23
- end
24
- end
@@ -1,24 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'rails_helper'
4
-
5
- RSpec.describe '#findy' do
6
- context 'when a hash is given' do
7
- context 'and record is found' do
8
- let!(:record) { Article.create id: 1 }
9
- let!(:hash) { 'My' }
10
-
11
- it 'finds the record' do
12
- expect(Article.findy(hash)).to eq record
13
- end
14
- end
15
-
16
- context 'and record is not found' do
17
- let!(:hash) { 'My' }
18
-
19
- it 'returns nil' do
20
- expect(Article.findy(hash)).to be_nil
21
- end
22
- end
23
- end
24
- end
@@ -1,37 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'rails_helper'
4
-
5
- RSpec.describe '#idy_decode' do
6
- context 'with no given salt' do
7
- it 'undos the obfuscation of id with default class salt' do
8
- expect(Article.idy_decode('My')).to eq 1
9
- end
10
- end
11
-
12
- context 'with empty salt' do
13
- let!(:salt) { '' }
14
-
15
- it 'undos the obfuscation of id with given salt' do
16
- expect(Article.idy_decode('jR', salt: salt)).to eq 1
17
- end
18
- end
19
-
20
- context 'with salt' do
21
- context 'as string' do
22
- let!(:salt) { 'salt' }
23
-
24
- it 'undos the obfuscation of id with given salt' do
25
- expect(Article.idy_decode('XG', salt: salt)).to eq 1
26
- end
27
- end
28
-
29
- context 'as number' do
30
- let!(:salt) { 1 }
31
-
32
- it 'undos the obfuscation of id with given salt as string' do
33
- expect(Article.idy_decode('kL', salt: 1)).to eq 1
34
- end
35
- end
36
- end
37
- end
@@ -1,11 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'rails_helper'
4
-
5
- RSpec.describe '#idy_default_salt' do
6
- context 'when class name has a big length' do
7
- it 'is bases on the first 10 class letter position index on alphabet' do
8
- expect(Abcdefghijklm.idy_default_salt).to eq '12345678910'
9
- end
10
- end
11
- end
@@ -1,50 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'rails_helper'
4
-
5
- RSpec.describe '#idy_encode' do
6
- context 'with no given salt' do
7
- let!(:model) { Article.new id: 1 }
8
-
9
- it 'obfuscates the id with default class salt' do
10
- expect(model.class.idy_encode(model.id)).to eq 'My'
11
- end
12
- end
13
-
14
- context 'with empty salt' do
15
- let!(:model) { Article.new id: 1 }
16
- let!(:salt) { '' }
17
-
18
- it 'obfuscates the id with empty salt' do
19
- expect(model.class.idy_encode(model.id, salt: salt)).to eq 'jR'
20
- end
21
- end
22
-
23
- context 'with salt' do
24
- let!(:model) { Article.new id: 1 }
25
-
26
- context 'as string' do
27
- let!(:salt) { 'salt' }
28
-
29
- it 'obfuscates the id with given salt' do
30
- expect(model.class.idy_encode(model.id, salt: salt)).to eq 'XG'
31
- end
32
- end
33
-
34
- context 'as number' do
35
- let!(:salt) { 1 }
36
-
37
- it 'obfuscates the id with given salt as string' do
38
- expect(model.class.idy_encode(model.id, salt: salt)).to eq 'kL'
39
- end
40
- end
41
- end
42
-
43
- context 'with nil id' do
44
- let!(:model) { Article.new }
45
-
46
- it 'returns nil' do
47
- expect(model.class.idy_encode(model.id)).to be_nil
48
- end
49
- end
50
- end
@@ -1,11 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'rails_helper'
4
-
5
- RSpec.describe '.idy' do
6
- subject { Article.new id: 1 }
7
-
8
- it 'returns the encoded id' do
9
- expect(subject.idy).to eq 'My'
10
- end
11
- end
@@ -1,13 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'rails_helper'
4
-
5
- RSpec.describe Article, '.lock!' do
6
- subject { described_class.create title: 'title' }
7
-
8
- it 'works' do
9
- record = described_class.find(subject.to_param)
10
-
11
- expect { record.lock! }.not_to raise_error
12
- end
13
- end
@@ -1,17 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'rails_helper'
4
-
5
- RSpec.describe '.idy_options' do
6
- context 'when options is not given' do
7
- it 'returns a default options with a salt generated based on model name' do
8
- expect(Article.idy_options).to eq(salt: article_default_salt)
9
- end
10
- end
11
-
12
- context 'when salt is given' do
13
- it 'returns a default options with a salt equal the given one' do
14
- expect(Comment.idy_options).to eq(salt: 'salt')
15
- end
16
- end
17
- end
@@ -1,23 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'rails_helper'
4
-
5
- RSpec.describe ':salt' do
6
- describe '#salt' do
7
- before do
8
- allow(Clean).to receive(:idy_options) { { salt: :salty } }
9
- end
10
-
11
- it 'fetchs the salt options' do
12
- expect(Clean.salt).to eq(:salty)
13
- end
14
- end
15
-
16
- describe '.salt' do
17
- before { allow(Clean).to receive(:salt) { :salt } }
18
-
19
- it 'delegates to class method' do
20
- expect(Clean.new.salt).to eq :salt
21
- end
22
- end
23
- end
@@ -1,51 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'rails_helper'
4
-
5
- RSpec.describe '.to_param' do
6
- context 'when object does not acts as idy' do
7
- subject { Clean.new id: 1 }
8
-
9
- it 'behaves as default' do
10
- expect(subject.to_param).to eq '1'
11
- end
12
- end
13
-
14
- context 'when object acts as idy' do
15
- context 'with no given salt' do
16
- let!(:model_1) { Article.new id: 1 }
17
-
18
- it 'generates a hash' do
19
- expect(model_1.to_param).to eq 'My'
20
- end
21
-
22
- context 'with comparison' do
23
- let!(:model_2) { Post.new }
24
-
25
- context 'with other object with same id' do
26
- before { model_2.id = 1 }
27
-
28
- it 'generates different hash' do
29
- expect(model_1.to_param).not_to eq model_2.to_param
30
- end
31
- end
32
- end
33
-
34
- context 'when object is not persisted' do
35
- context 'and has no id' do
36
- subject { Article.new }
37
-
38
- specify { expect(subject.to_param).to be_nil }
39
- end
40
-
41
- context 'and has id' do
42
- subject { Article.new id: 1 }
43
-
44
- it 'generates a hash' do
45
- expect(model_1.to_param).to eq 'My'
46
- end
47
- end
48
- end
49
- end
50
- end
51
- end
data/spec/rails_helper.rb DELETED
@@ -1,27 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- ENV['RAILS_ENV'] ||= 'test'
4
-
5
- require 'active_record/railtie'
6
- require 'idy'
7
- require 'pry-byebug'
8
-
9
- ActiveRecord::Base.establish_connection adapter: :sqlite3, database: ':memory:'
10
-
11
- Dir[File.expand_path('support/**/*.rb', __dir__)].each { |file| require file }
12
-
13
- def article_default_salt
14
- '1182093125'
15
- end
16
-
17
- def clean_default_salt
18
- '3125114'
19
- end
20
-
21
- def comment_default_salt
22
- ''
23
- end
24
-
25
- def user_default_salt
26
- '1182093125'
27
- end
@@ -1,11 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'rspec/rails'
4
-
5
- RSpec.configure do |config|
6
- config.filter_run_when_matching :focus
7
-
8
- config.disable_monkey_patching!
9
-
10
- config.order = :random
11
- end
@@ -1,21 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'database_cleaner'
4
-
5
- RSpec.configure do |config|
6
- config.before :suite do
7
- DatabaseCleaner.strategy = :transaction
8
-
9
- DatabaseCleaner.clean_with :transaction
10
- end
11
-
12
- config.before :each do
13
- DatabaseCleaner.start
14
- end
15
-
16
- config.around do |spec|
17
- DatabaseCleaner.cleaning do
18
- spec.run
19
- end
20
- end
21
- end
@@ -1,29 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- class CreateTables < ActiveRecord::Migration[5.0]
4
- def change
5
- create_table :abcdefghijklms do |t|
6
- end
7
-
8
- create_table :articles do |t|
9
- t.string :title
10
- end
11
-
12
- create_table :cleans do |t|
13
- end
14
-
15
- create_table :comments do |t|
16
- t.string :body
17
-
18
- t.references :article, index: true, foreign_key: true
19
- end
20
-
21
- create_table :posts do |t|
22
- t.string :title
23
- end
24
-
25
- create_table :users do |t|
26
- t.string :name
27
- end
28
- end
29
- end
@@ -1,3 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- CreateTables.new.change
@@ -1,4 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- class Abcdefghijklm < ActiveRecord::Base
4
- end
@@ -1,7 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- class Article < ::ActiveRecord::Base
4
- idy
5
-
6
- has_many :comments
7
- end
@@ -1,4 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- class Clean < ::ActiveRecord::Base
4
- end
@@ -1,7 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- class Comment < ::ActiveRecord::Base
4
- idy salt: 'salt'
5
-
6
- belongs_to :article
7
- end
@@ -1,5 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- class Post < ::ActiveRecord::Base
4
- idy
5
- end
@@ -1,4 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- class User < ::ActiveRecord::Base
4
- end