public_uid 1.2.2 → 2.1.1

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: 7323c6067a97bf3479759130f27f3ab6a2629084
4
- data.tar.gz: 2a5aa34772776cc391d103d9f1ecb776899f0b0e
2
+ SHA256:
3
+ metadata.gz: 789c1469292aaeac0682a128fa3edcb9a4e2adcb792c94acef5c41fa20a56160
4
+ data.tar.gz: 9fe04f567ebd19658ea950585fadccf98a42f0414a2d35451b23d7245f301287
5
5
  SHA512:
6
- metadata.gz: 51f04e7f8a1331cacee37033b013237a49cbd9946d9f564998705c4ba5be1a1a2e16960a09d9de298579178cc97bcb612d361301795aa80c21178974eb4ff4c9
7
- data.tar.gz: 935f54f79fcd7b681e8ad76f28a5b98d45810236ed2fc86862a6a38dad9e1d1b0a30c13a6815a460d27ffc45c3411ac55b839236c043dc67c5ead9e1eee9d49e
6
+ metadata.gz: 26d3176ede91d962cf2a3debfcbf967c50e20cff478ea67176d6ea4f60ebbdf2a086c4941b823a49717fbf724d342d725291a92979bcd35bf987db21845d80ce
7
+ data.tar.gz: f55e66e2fb2a868e28c6b2bf209a39d13a6cb68635c5af308623e3f0939442b3df9c85e581e5c3667e932e8de056271b0d820907fecb657c2c8ccee654252242
@@ -1,8 +1,7 @@
1
1
  language: ruby
2
2
  rvm:
3
- - 2.0.0
4
- - 2.1.0
5
- - 2.1.1
6
- - 2.2.2
7
- - 2.3.0
8
- - ruby-head
3
+ - 2.4.5
4
+ - 2.5.3
5
+ - 2.6.5
6
+ before_install:
7
+ - gem install bundler
data/README.md CHANGED
@@ -48,16 +48,67 @@ And then execute:
48
48
 
49
49
  ## Usage
50
50
 
51
+
52
+ ### Step 1 - db column
53
+
51
54
  Create database column for public unique ID.
52
55
 
53
56
  ```ruby
54
57
  class AddPublicUidToUsers < ActiveRecord::Migration
55
58
  def change
56
59
  add_column :users, :public_uid, :string
60
+ add_index :users, :public_uid
57
61
  end
58
62
  end
59
63
  ```
60
64
 
65
+ ### Step 2a - Using Rails concern
66
+
67
+ > a.k.a - the easy way for Rails (availible since version 2.1.0)
68
+
69
+ ```ruby
70
+ class User < ActiveRecord::Base
71
+ include PublicUid::ModelConcern
72
+ end
73
+ ```
74
+
75
+ Example:
76
+
77
+
78
+ ```ruby
79
+ user = User.create
80
+ user.public_uid
81
+ # => "xxxxxxxx"
82
+
83
+ user.to_param
84
+ # => "xxxxxxxx"
85
+
86
+ User.find_puid('xxxxxxxx')
87
+ # => <#User ...>
88
+ User.find_puid('not_existing')
89
+ # => nil
90
+
91
+ User.find_puid!('xxxxxxxx')
92
+ # => <#User ...>
93
+ User.find_puid!('not_existing')
94
+ # PublicUid::RecordNotFound (User 'not_existing' not found)
95
+ ```
96
+
97
+ This will automatically:
98
+
99
+ * assumes your model has `public_uid` column and generate public_uid value for you
100
+ * will automatically tell model to use `public_uid` as `to_param` method ffectively turning `user.public_uid` the attribute passed in routes when you do routes (instead of `id`). Example `user_path(@user)` => `/users/xxxxxxx`
101
+ * provides `User.find_puid('xxxxxx')` and `User.find_puid!('xxxxxx')` class methods as more convenient replacement for `find_by!(public_uid: 'xxxxxxx')` to find records in controllers.
102
+ * `User.find_puid!('xxxxxx')` will raise `PublicUid::RecordNotFound` instead of `ActiveRecord::RecordNotFound` for more accurate error handling in Rails controller (check [Rails rescue_from](https://apidock.com/rails/ActiveSupport/Rescuable/ClassMethods/rescue_from) for inspiration)
103
+
104
+ > more info check > [source](https://github.com/equivalent/public_uid/blob/master/lib/public_uid/model_concern.rb)
105
+
106
+ If you need more customization please follow **Step 2b** instead
107
+
108
+ ### Step 2b - Using manual generate method
109
+
110
+ > a.k.a bit harder than `2.a` but more flexible way for Rails
111
+
61
112
  Tell your model to generate the public identifier
62
113
 
63
114
  ```ruby
@@ -84,7 +135,7 @@ Then you can do more clever things like having urls based on `public_uid` and `t
84
135
  class User < ActiveRecord::Base
85
136
  generate_public_uid
86
137
 
87
- def self.find_param(param)
138
+ def self.find_puid(param)
88
139
  find_by! public_uid: param.split('-').first
89
140
  end
90
141
 
@@ -97,7 +148,7 @@ end
97
148
  class UsersController < ActionController::Base
98
149
  # ...
99
150
  def show
100
- @user = User.find_param(param[:id])
151
+ @user = User.find_puid(param[:id])
101
152
  # ...
102
153
  end
103
154
  # ...
@@ -141,6 +192,36 @@ generator wont work if your public uniq ID column is a String (as the
141
192
  gem would try to set Integer on a String). If you really want a number
142
193
  like string you can specify number range for Range String Generator
143
194
 
195
+ If you want to generate random Integer using SecureRandom ruby library you can use built-in number secure generator:
196
+
197
+ ```ruby
198
+ class User < ActiveRecord::Base
199
+ generate_public_uid generator: PublicUid::Generators::NumberSecureRandom.new
200
+ end
201
+ ```
202
+
203
+ ```irb
204
+ u = User.new
205
+ u.public_uid #=> nil
206
+ u.save! #=> true
207
+ u.public_uid #=> 4567123
208
+ ```
209
+
210
+ If you want to generate random Hexadecimal String using SecureRandom ruby library you can use built-in hexadecimal string secure generator:
211
+
212
+ ```ruby
213
+ class User < ActiveRecord::Base
214
+ generate_public_uid generator: PublicUid::Generators::HexStringSecureRandom.new
215
+ end
216
+ ```
217
+
218
+ ```irb
219
+ u = User.new
220
+ u.public_uid #=> nil
221
+ u.save! #=> true
222
+ u.public_uid #=> 0b30ffbc7de3b362
223
+ ```
224
+
144
225
  ### Customizing generated string
145
226
 
146
227
  ```ruby
@@ -150,6 +231,14 @@ class User < ActiveRecord::Base
150
231
  end
151
232
  ```
152
233
 
234
+ or in case you are using SecureRandom ruby library:
235
+
236
+ ```ruby
237
+ class User < ActiveRecord::Base
238
+ generate_public_uid generator: PublicUid::Generators::HexStringSecureRandom.new(4) #4 is length of hexadecimal string. If this argument is not set, length of hexadecimal string will be 8 characters.
239
+ end
240
+ ```
241
+
153
242
  ```irb
154
243
  u = User.new
155
244
  u.public_uid #=> nil
@@ -177,6 +266,14 @@ class User < ActiveRecord::Base
177
266
  end
178
267
  ```
179
268
 
269
+ or in case you are using SecureRandom ruby library:
270
+ ```ruby
271
+ class User < ActiveRecord::Base
272
+ UID_RANGE = 1_000..4_000
273
+ generate_public_uid generator: PublicUid::Generators::NumberSecureRandom.new(UID_RANGE)
274
+ end
275
+ ```
276
+
180
277
  ```irb
181
278
  u = User.new
182
279
  u.public_uid #=> nil
@@ -264,3 +361,23 @@ In future gem version we will actually introduce this two generators.
264
361
  3. Commit your changes (`git commit -am 'Add some feature'`)
265
362
  4. Push to the branch (`git push origin my-new-feature`)
266
363
  5. Create new Pull Request
364
+
365
+ ## Changelog
366
+
367
+ ##### 2019-11-29
368
+
369
+ Version 2.0.0 released
370
+
371
+ Till version [public_uid 1.3.1](https://github.com/equivalent/public_uid/tree/version-1.3.1) gem used [orm_adapter](https://github.com/ianwhite/orm_adapter) which mean
372
+ that you could use ActiveRecord or any other data mapping adapter (e.g. Mongoid) supported by orm adapter.
373
+
374
+ Problem is that orm_adapter is not maintained for 6 years now and cause some
375
+ gem conflicts with latest ActiveRecord development environment. That's
376
+ why I've decided to remove the ORM adapter ([commit](https://github.com/equivalent/public_uid/commit/e66b5dbf659fcdddc6b284b3eb2051a9b8a31968))
377
+ and use `ActiveRecord::Base` directly.
378
+
379
+ That means any Rails application using `public_uid` gem ActiveRecord will **not** be affected by the 2.0 release.
380
+ If anyone want to see public_uid v 2.0 to support other data mappers (e.g. mongo) please open an issue or create PR with the fix.
381
+
382
+ Sorry for any inconvenience
383
+
@@ -1,10 +1,16 @@
1
- require 'orm_adapter'
1
+ require 'active_record'
2
2
  require "public_uid/version"
3
3
  require "public_uid/set_public_uid"
4
4
  require "public_uid/model"
5
5
  require "public_uid/generators/number_random"
6
6
  require "public_uid/generators/range_string"
7
-
7
+ require "public_uid/generators/number_secure_random"
8
+ require "public_uid/generators/hex_string_secure_random"
9
+ require 'public_uid/model_concern'
8
10
  require 'public_uid/tasks' if defined?(Rails)
9
11
 
10
- require 'orm/active_record' if defined?(ActiveRecord::Base)
12
+ module PublicUid
13
+ RecordNotFound = Class.new(StandardError)
14
+ end
15
+
16
+ ActiveRecord::Base.send(:include, PublicUid::Model)
@@ -0,0 +1,20 @@
1
+ require 'securerandom'
2
+
3
+ module PublicUid
4
+ module Generators
5
+ class HexStringSecureRandom
6
+ def initialize(length=8)
7
+ @length = length
8
+ end
9
+
10
+ def generate
11
+ if @length.odd?
12
+ result = SecureRandom.hex( (@length+1)/2 ) #because in "SecureRandom.hex(@length)" @length means length in bytes = 2 hexadecimal characters
13
+ return result[0...-1]
14
+ else
15
+ SecureRandom.hex(@length/2)
16
+ end
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,16 @@
1
+ require 'securerandom'
2
+
3
+ module PublicUid
4
+ module Generators
5
+ class NumberSecureRandom
6
+ def initialize(scale = 1_000_000..9_999_999)
7
+ @scale = scale
8
+ end
9
+
10
+ def generate()
11
+ generated_number = SecureRandom.random_number( (@scale.max - @scale.min) ) #because SecureRandom.random_number can have only one argument = max value.
12
+ return (generated_number + @scale.min)
13
+ end
14
+ end
15
+ end
16
+ end
@@ -34,7 +34,7 @@ module PublicUid
34
34
  end
35
35
 
36
36
  def public_uid_generator
37
- @public_uid_generator || Generators::RangeString.new
37
+ @public_uid_generator || Generators::HexStringSecureRandom.new
38
38
  end
39
39
 
40
40
  private
@@ -0,0 +1,29 @@
1
+ module PublicUid
2
+ module ModelConcern
3
+ RecordNotFound = Class.new(StandardError)
4
+
5
+ extend ActiveSupport::Concern
6
+
7
+ included do
8
+ generate_public_uid
9
+ end
10
+
11
+ class_methods do
12
+ def find_puid!(public_uid)
13
+ find_by!(public_uid: public_uid)
14
+ rescue ActiveRecord::RecordNotFound
15
+ raise PublicUid::RecordNotFound, "#{self.name} '#{public_uid}' not found"
16
+ end
17
+
18
+ def find_puid(public_uid)
19
+ find_puid!(public_uid)
20
+ rescue PublicUid::RecordNotFound
21
+ nil
22
+ end
23
+ end
24
+
25
+ def to_param
26
+ public_uid
27
+ end
28
+ end
29
+ end
@@ -27,7 +27,7 @@ module PublicUid
27
27
  private
28
28
 
29
29
  def similar_uid_exist?
30
- @klass.where(@column => new_uid).count > 0
30
+ @klass.where(@column => new_uid).exists?
31
31
  end
32
32
 
33
33
  def check_column_existance
@@ -3,6 +3,7 @@ require 'rake'
3
3
  namespace :public_uid do
4
4
  desc "Generate public_uid on Models that have public_uid column on records that have nil value"
5
5
  task :generate => :environment do
6
+ Rails.application.eager_load! if defined?(Rails)
6
7
  ActiveRecord::Base.descendants.each do |model|
7
8
  model.connection # establish conection
8
9
 
@@ -14,7 +15,7 @@ namespace :public_uid do
14
15
  .tap { |scope| puts " * generating #{scope.count} #{uid_column_name}(s) for #{model.table_name}" }
15
16
  .find_each do |record_without_public_uid|
16
17
  record_without_public_uid.generate_uid
17
- record_without_public_uid.save!
18
+ record_without_public_uid.save!(validate: false)
18
19
  end
19
20
  puts ''
20
21
  end
@@ -1,3 +1,3 @@
1
1
  module PublicUid
2
- VERSION = "1.2.2"
2
+ VERSION = "2.1.1"
3
3
  end
@@ -18,11 +18,12 @@ Gem::Specification.new do |spec|
18
18
  spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
19
  spec.require_paths = ["lib"]
20
20
 
21
- spec.add_dependency "orm_adapter", "~> 0.5"
22
- spec.add_development_dependency "bundler", "~> 1.3"
21
+ spec.add_dependency "activerecord", '> 4.2' # ensures compatibility for ruby 2.0.0+ to head
22
+ spec.add_development_dependency "bundler"
23
+ spec.add_development_dependency "pry"
23
24
  spec.add_development_dependency "rake"
24
25
  spec.add_development_dependency "minitest", "~> 5"
25
26
  spec.add_development_dependency "rr", "~> 1.1.2"
26
- spec.add_development_dependency "sqlite3"
27
- spec.add_development_dependency "activerecord", '~> 4.2' # ensures compatibility for ruby 2.0.0+ to head
27
+ spec.add_development_dependency "sqlite3", "~> 1.4.1"
28
+ spec.add_development_dependency "activesupport", '> 4.2'
28
29
  end
@@ -0,0 +1,34 @@
1
+ require 'test_helper'
2
+
3
+ describe 'HexStringSecureRandom' do
4
+
5
+ describe "#generate" do
6
+ subject{ instance.generate }
7
+
8
+ context 'by default' do
9
+ let(:instance){ PublicUid::Generators::HexStringSecureRandom.new }
10
+ it 'generates 8 chars hexa string' do
11
+ expect(subject.length).must_equal 8
12
+ expect(subject).must_be_kind_of String
13
+ end
14
+
15
+ it 'generates hexadecimal chars' do
16
+ expect(subject).must_match(/^[a-f0-9]*$/)
17
+ end
18
+ end
19
+
20
+ context 'when 10 hexa chars' do
21
+ let(:instance){ PublicUid::Generators::HexStringSecureRandom.new(10) }
22
+ it 'generates 10 chars string' do
23
+ expect(subject.length).must_equal 10
24
+ end
25
+ end
26
+
27
+ context 'when 11 hexa chars' do
28
+ let(:instance){ PublicUid::Generators::HexStringSecureRandom.new(11) }
29
+ it 'generates 11 chars string' do
30
+ expect(subject.length).must_equal 11
31
+ end
32
+ end
33
+ end
34
+ end
@@ -8,20 +8,20 @@ describe 'NumberRandom' do
8
8
  context 'by default' do
9
9
  let(:instance){ PublicUid::Generators::NumberRandom.new }
10
10
  it 'generates 7 digits' do
11
- subject.to_i.to_s.length.must_equal 7
12
- subject.must_be_kind_of Integer
11
+ expect(subject.to_i.to_s.length).must_equal 7
12
+ expect(subject).must_be_kind_of Integer
13
13
  end
14
14
  end
15
15
 
16
16
  context 'when specifying number between 20 - 21' do
17
17
  let(:instance){ PublicUid::Generators::NumberRandom.new(20..21) }
18
18
  it 'generates 2 digits' do
19
- subject.to_i.to_s.length.must_equal 2
20
- subject.must_be_kind_of Integer
19
+ expect(subject.to_i.to_s.length).must_equal 2
20
+ expect(subject).must_be_kind_of Integer
21
21
  end
22
22
 
23
- it 'generates string containing chars x,y,z' do
24
- [20, 21].must_include subject
23
+ it 'generates integer has to be 20 or 21' do
24
+ expect([20, 21]).must_include subject
25
25
  end
26
26
  end
27
27
  end
@@ -0,0 +1,40 @@
1
+ require 'test_helper'
2
+
3
+ describe 'NumberSecureRandom' do
4
+
5
+ describe "#generate" do
6
+ subject{ instance.generate }
7
+
8
+ context 'by default' do
9
+ let(:instance){ PublicUid::Generators::NumberSecureRandom.new }
10
+ it 'generates 7 digits' do
11
+ expect(subject.to_i.to_s.length).must_equal 7
12
+ expect(subject).must_be_kind_of Integer
13
+ end
14
+ end
15
+
16
+ context 'when specifying number between 20 - 21' do
17
+ let(:instance){ PublicUid::Generators::NumberSecureRandom.new(20..21) }
18
+ it 'generates 2 digits' do
19
+ expect(subject.to_i.to_s.length).must_equal 2
20
+ expect(subject).must_be_kind_of Integer
21
+ end
22
+
23
+ it 'generates integer has to be 20 or 21' do
24
+ expect([20, 21]).must_include subject
25
+ end
26
+ end
27
+
28
+ context 'when specifying number between 1000 - 9999' do
29
+ let(:instance){ PublicUid::Generators::NumberSecureRandom.new(1000..9999) }
30
+ it 'generates 4 digits' do
31
+ expect(subject.to_i.to_s.length).must_equal 4
32
+ expect(subject).must_be_kind_of Integer
33
+ end
34
+
35
+ it 'generates integer has to be between 1000 and 9999' do
36
+ expect((1000..9999)).must_include subject
37
+ end
38
+ end
39
+ end
40
+ end
@@ -8,23 +8,23 @@ describe 'RangeString' do
8
8
  context 'by default' do
9
9
  let(:instance){ PublicUid::Generators::RangeString.new }
10
10
  it 'generates 8 chars string' do
11
- subject.length.must_equal 8
12
- subject.must_be_kind_of String
11
+ expect(subject.length).must_equal 8
12
+ expect(subject).must_be_kind_of String
13
13
  end
14
14
 
15
15
  it 'generates downcase chars' do
16
- subject.must_match(/^[a-z]*$/)
16
+ expect(subject).must_match(/^[a-z]*$/)
17
17
  end
18
18
  end
19
19
 
20
20
  context 'when 10 chars x-y' do
21
21
  let(:instance){ PublicUid::Generators::RangeString.new(3, ('x'..'z')) }
22
22
  it 'generates 10 chars string' do
23
- subject.length.must_equal 3
23
+ expect(subject.length).must_equal 3
24
24
  end
25
25
 
26
26
  it 'generates string containing chars x,y,z' do
27
- subject.must_match(/^[x-z]*$/)
27
+ expect(subject).must_match(/^[x-z]*$/)
28
28
  end
29
29
  end
30
30
  end
@@ -26,12 +26,20 @@ TestConf.orm_modules.each do |orm_module|
26
26
  describe 'initialization' do
27
27
  context 'when column not specified' do
28
28
  let(:options) { { record: record } }
29
- it{ ->{ instance } .must_raise(PublicUid::SetPublicUid::NoPublicUidColumnSpecified) }
29
+ it do
30
+ assert_raises PublicUid::SetPublicUid::NoPublicUidColumnSpecified do
31
+ instance
32
+ end
33
+ end
30
34
  end
31
35
 
32
36
  context 'when record not specified' do
33
37
  let(:options) { {column: :foo} }
34
- it{ ->{ instance } .must_raise(PublicUid::SetPublicUid::NoRecordSpecified) }
38
+ it do
39
+ assert_raises PublicUid::SetPublicUid::NoRecordSpecified do
40
+ instance
41
+ end
42
+ end
35
43
  end
36
44
  end
37
45
 
@@ -40,7 +48,7 @@ TestConf.orm_modules.each do |orm_module|
40
48
 
41
49
  it "should ask generator to generate random string" do
42
50
  instance.generate(DummyGenerator.new)
43
- subject.must_equal 'first try'
51
+ expect(subject).must_equal 'first try'
44
52
  end
45
53
 
46
54
  context 'when record match random' do
@@ -49,7 +57,7 @@ TestConf.orm_modules.each do |orm_module|
49
57
 
50
58
  it "should generate string once again" do
51
59
  instance.generate(DummyGenerator.new)
52
- subject.must_equal 'second try'
60
+ expect(subject).must_equal 'second try'
53
61
  end
54
62
  end
55
63
  end
@@ -58,7 +66,11 @@ TestConf.orm_modules.each do |orm_module|
58
66
  subject { instance.new_uid }
59
67
 
60
68
  context 'when @new id is not set' do
61
- it{ ->{ instance.set }.must_raise(PublicUid::SetPublicUid::NewUidNotSetYet) }
69
+ it do
70
+ assert_raises PublicUid::SetPublicUid::NewUidNotSetYet do
71
+ instance.set
72
+ end
73
+ end
62
74
  end
63
75
 
64
76
  context 'when @new id is set' do
@@ -66,7 +78,7 @@ TestConf.orm_modules.each do |orm_module|
66
78
 
67
79
  it 'must set new_uid for record pubilc_uid column' do
68
80
  instance.set
69
- subject.must_equal '123'
81
+ expect(subject).must_equal '123'
70
82
  end
71
83
  end
72
84
  end
@@ -84,7 +96,7 @@ TestConf.orm_modules.each do |orm_module|
84
96
  count_mock = stub(record_class).count { 10 }
85
97
  stub(record_class).where( { public_uid: 567 } ) { count_mock }
86
98
 
87
- trigger.must_equal true
99
+ expect(trigger).must_equal true
88
100
  end
89
101
  end
90
102
  end
@@ -29,23 +29,20 @@ describe 'Generate' do
29
29
  initial_uid = user.send(uid_column)
30
30
 
31
31
  # simulate an existing record with no uid value
32
- user.update_attribute(uid_column, nil).must_equal true
33
- user.send(uid_column).must_be_nil
32
+ expect(user.update_attribute(uid_column, nil)).must_equal true
33
+ expect(user.send(uid_column)).must_be_nil
34
34
 
35
35
  # run the rake task
36
36
  run_generate_task
37
37
 
38
38
  user.reload
39
- user.send(uid_column).must_be_kind_of String
40
- user.send(uid_column).wont_be_empty
41
- user.send(uid_column).wont_be_same_as initial_uid
39
+ expect(user.send(uid_column)).must_be_kind_of String
40
+ expect(user.send(uid_column)).wont_be_empty
41
+ expect(user.send(uid_column)).wont_be_same_as initial_uid
42
42
  end
43
43
  end
44
44
  end
45
-
46
45
  end
47
-
48
46
  end
49
47
  end
50
-
51
48
  end
@@ -9,14 +9,14 @@ TestConf.orm_modules.each do |orm_module|
9
9
  subject{ user.custom_uid }
10
10
 
11
11
  context 'in new record' do
12
- it{ subject.must_be_nil }
12
+ it{ expect(subject).must_be_nil }
13
13
 
14
14
  describe '#generate_uid' do
15
15
  before do
16
16
  user.generate_uid
17
17
  end
18
18
 
19
- it { subject.wont_be_nil }
19
+ it { expect(subject).wont_be_nil }
20
20
  end
21
21
  end
22
22
 
@@ -27,8 +27,8 @@ TestConf.orm_modules.each do |orm_module|
27
27
  user.reload
28
28
  end
29
29
 
30
- it{ subject.must_be_kind_of(String) }
31
- it{ subject.length.must_equal(8) }
30
+ it{ expect(subject).must_be_kind_of(String) }
31
+ it{ expect(subject.length).must_equal(8) }
32
32
  end
33
33
  end
34
34
  end
@@ -9,7 +9,7 @@ TestConf.orm_modules.each do |orm_module|
9
9
  end
10
10
 
11
11
  it 'model should not expose :generate_uid public instance method' do
12
- model.instance_methods.wont_include :generate_uid
12
+ expect(model.instance_methods).wont_include :generate_uid
13
13
  end
14
14
  end
15
15
 
@@ -19,7 +19,7 @@ TestConf.orm_modules.each do |orm_module|
19
19
  end
20
20
 
21
21
  it 'model should expose :generate_uid public instance method' do
22
- model.instance_methods.must_include :generate_uid
22
+ expect(model.instance_methods).must_include :generate_uid
23
23
  end
24
24
  end
25
25
  end
@@ -9,14 +9,14 @@ TestConf.orm_modules.each do |orm_module|
9
9
  subject{ user.public_uid }
10
10
 
11
11
  context 'in new record' do
12
- it{ subject.must_be_nil }
12
+ it{ expect(subject).must_be_nil }
13
13
 
14
14
  describe '#generate_uid' do
15
15
  before do
16
16
  user.generate_uid
17
17
  end
18
18
 
19
- it { subject.wont_be_nil }
19
+ it { expect(subject).wont_be_nil }
20
20
  end
21
21
  end
22
22
 
@@ -27,12 +27,12 @@ TestConf.orm_modules.each do |orm_module|
27
27
  end
28
28
 
29
29
  it 'should generate 10 chars' do
30
- subject.must_be_kind_of String
31
- subject.length.must_equal(10)
30
+ expect(subject).must_be_kind_of String
31
+ expect(subject.length).must_equal(10)
32
32
  end
33
33
 
34
34
  it 'string including up & down case' do
35
- subject.must_match(/^[a-zA-Z]+$/)
35
+ expect(subject).must_match(/^[a-zA-Z]+$/)
36
36
  end
37
37
  end
38
38
  end
@@ -9,14 +9,14 @@ TestConf.orm_modules.each do |orm_module|
9
9
  subject{ user.public_uid }
10
10
 
11
11
  context 'in new record' do
12
- it{ subject.must_be_nil }
12
+ it{ expect(subject).must_be_nil }
13
13
 
14
14
  describe '#generate_uid' do
15
15
  before do
16
16
  user.generate_uid
17
17
  end
18
18
 
19
- it { subject.wont_be_nil }
19
+ it { expect(subject).wont_be_nil }
20
20
  end
21
21
  end
22
22
 
@@ -27,8 +27,8 @@ TestConf.orm_modules.each do |orm_module|
27
27
  user.reload
28
28
  end
29
29
 
30
- it{ subject.must_be_kind_of(String) }
31
- it{ subject.length.must_equal(8) }
30
+ it{ expect(subject).must_be_kind_of(String) }
31
+ it{ expect(subject.length).must_equal(8) }
32
32
  end
33
33
  end
34
34
  end
@@ -0,0 +1,49 @@
1
+ require 'test_helper'
2
+
3
+ TestConf.orm_modules.each do |orm_module|
4
+ describe orm_module.description do
5
+ context 'Model with default generator' do
6
+ let(:model_class) { "#{orm_module}::ModelWithPublicUidConcern".constantize }
7
+ let(:user) { model_class.new }
8
+
9
+ describe '#public_uid' do
10
+ subject{ user.public_uid }
11
+
12
+ context 'in new record' do
13
+ it{ expect(subject).must_be_nil }
14
+
15
+ describe '#generate_uid' do
16
+ before do
17
+ user.generate_uid
18
+ end
19
+
20
+ it { expect(subject).wont_be_nil }
21
+ end
22
+ end
23
+
24
+ context 'after save' do
25
+
26
+ before do
27
+ user.save
28
+ user.reload
29
+ end
30
+
31
+ it{ expect(subject).must_be_kind_of(String) }
32
+ it{ expect(subject.length).must_equal(8) }
33
+
34
+ it{ expect(user.to_param).must_equal(subject) }
35
+ it{ expect(model_class.find_puid(subject)).must_equal(user) }
36
+ it{ expect(model_class.find_puid!(subject)).must_equal(user) }
37
+
38
+
39
+ it{ expect(model_class.find_puid('nonexisting')).must_be_nil }
40
+ it do
41
+ assert_raises PublicUid::RecordNotFound do
42
+ model_class.find_puid!('nonexisting')
43
+ end
44
+ end
45
+ end
46
+ end
47
+ end
48
+ end
49
+ end
@@ -29,6 +29,12 @@ module ActRec
29
29
  generate_public_uid
30
30
  end
31
31
 
32
+ class ModelWithPublicUidConcern < ActiveRecord::Base
33
+ include PublicUid::ModelConcern
34
+ self.table_name = 'user_puids'
35
+ generate_public_uid
36
+ end
37
+
32
38
  class ModelWithoutGenaratePublicUid < ActiveRecord::Base
33
39
  self.table_name = 'users'
34
40
  end
metadata CHANGED
@@ -1,43 +1,57 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: public_uid
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.2.2
4
+ version: 2.1.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Tomas Valent
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-12-04 00:00:00.000000000 Z
11
+ date: 2020-06-10 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
- name: orm_adapter
14
+ name: activerecord
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - "~>"
17
+ - - ">"
18
18
  - !ruby/object:Gem::Version
19
- version: '0.5'
19
+ version: '4.2'
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: '0.5'
26
+ version: '4.2'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: bundler
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - "~>"
31
+ - - ">="
32
32
  - !ruby/object:Gem::Version
33
- version: '1.3'
33
+ version: '0'
34
34
  type: :development
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
- - - "~>"
38
+ - - ">="
39
39
  - !ruby/object:Gem::Version
40
- version: '1.3'
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: pry
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
41
55
  - !ruby/object:Gem::Dependency
42
56
  name: rake
43
57
  requirement: !ruby/object:Gem::Requirement
@@ -84,28 +98,28 @@ dependencies:
84
98
  name: sqlite3
85
99
  requirement: !ruby/object:Gem::Requirement
86
100
  requirements:
87
- - - ">="
101
+ - - "~>"
88
102
  - !ruby/object:Gem::Version
89
- version: '0'
103
+ version: 1.4.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'
110
+ version: 1.4.1
97
111
  - !ruby/object:Gem::Dependency
98
- name: activerecord
112
+ name: activesupport
99
113
  requirement: !ruby/object:Gem::Requirement
100
114
  requirements:
101
- - - "~>"
115
+ - - ">"
102
116
  - !ruby/object:Gem::Version
103
117
  version: '4.2'
104
118
  type: :development
105
119
  prerelease: false
106
120
  version_requirements: !ruby/object:Gem::Requirement
107
121
  requirements:
108
- - - "~>"
122
+ - - ">"
109
123
  - !ruby/object:Gem::Version
110
124
  version: '4.2'
111
125
  description: Automatic generates public unique identifier for model
@@ -121,17 +135,21 @@ files:
121
135
  - LICENSE.txt
122
136
  - README.md
123
137
  - Rakefile
124
- - lib/orm/active_record.rb
125
138
  - lib/public_uid.rb
139
+ - lib/public_uid/generators/hex_string_secure_random.rb
126
140
  - lib/public_uid/generators/number_random.rb
141
+ - lib/public_uid/generators/number_secure_random.rb
127
142
  - lib/public_uid/generators/range_string.rb
128
143
  - lib/public_uid/model.rb
144
+ - lib/public_uid/model_concern.rb
129
145
  - lib/public_uid/set_public_uid.rb
130
146
  - lib/public_uid/tasks.rb
131
147
  - lib/public_uid/tasks/generate.rake
132
148
  - lib/public_uid/version.rb
133
149
  - public_uid.gemspec
150
+ - test/lib/generators/hex_string_secure_random_test.rb
134
151
  - test/lib/generators/number_random_test.rb
152
+ - test/lib/generators/number_secure_random_test.rb
135
153
  - test/lib/generators/range_string_test.rb
136
154
  - test/lib/set_public_uid_test.rb
137
155
  - test/lib/tasks/generate_test.rb
@@ -139,6 +157,7 @@ files:
139
157
  - test/models/instance_methods_initialization_test.rb
140
158
  - test/models/model_with_custom_generator_test.rb
141
159
  - test/models/model_with_generator_defaults_test.rb
160
+ - test/models/model_with_public_uid_concern_test.rb
142
161
  - test/support/orm/active_record.rb
143
162
  - test/support/test_conf.rb
144
163
  - test/test_helper.rb
@@ -161,13 +180,14 @@ required_rubygems_version: !ruby/object:Gem::Requirement
161
180
  - !ruby/object:Gem::Version
162
181
  version: '0'
163
182
  requirements: []
164
- rubyforge_project:
165
- rubygems_version: 2.6.11
183
+ rubygems_version: 3.0.3
166
184
  signing_key:
167
185
  specification_version: 4
168
186
  summary: Automatic generates public UID column
169
187
  test_files:
188
+ - test/lib/generators/hex_string_secure_random_test.rb
170
189
  - test/lib/generators/number_random_test.rb
190
+ - test/lib/generators/number_secure_random_test.rb
171
191
  - test/lib/generators/range_string_test.rb
172
192
  - test/lib/set_public_uid_test.rb
173
193
  - test/lib/tasks/generate_test.rb
@@ -175,6 +195,7 @@ test_files:
175
195
  - test/models/instance_methods_initialization_test.rb
176
196
  - test/models/model_with_custom_generator_test.rb
177
197
  - test/models/model_with_generator_defaults_test.rb
198
+ - test/models/model_with_public_uid_concern_test.rb
178
199
  - test/support/orm/active_record.rb
179
200
  - test/support/test_conf.rb
180
201
  - test/test_helper.rb
@@ -1,2 +0,0 @@
1
- require 'orm_adapter/adapters/active_record'
2
- ActiveRecord::Base.send(:include, PublicUid::Model)