uniqueness 0.5.0 → 0.6.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
2
  SHA1:
3
- metadata.gz: 7826153c6e988edbd91c51573a98dab137b7d9d6
4
- data.tar.gz: 1bee0f48405859310b879fbb1d915fa21aa73d94
3
+ metadata.gz: b9103e34b3744f24b43bc7d6b5c8bbeff052e7bd
4
+ data.tar.gz: fbbb46f768b37161ee05abc657d9ff35cbb8a09c
5
5
  SHA512:
6
- metadata.gz: 839a11df5197d0536084b015a033b279512b3c31a017654b66f8ae09fa95c2dd6b6f5134d0525fc9e262d345c3d58ed82bfe51103a45a364ad4dc100f554ccf7
7
- data.tar.gz: 996b20e7644bf4cd2cff8f166312c24bb7c88a89781ea27c56646db53cc26efd216059044f9002864dfc97d539cd64266b7f396b4903cac3542d74bfcfd9e746
6
+ metadata.gz: 10fe4f821e8aaa584e7bb6a79c771e72c4949e1f10373f86ce016d473198d281e963e9248cb11d6e1b74e1a9fd98fcc17c7dc26ab2f55bf2c845a656de00ddba
7
+ data.tar.gz: 538b5d94051fc97a83ec06415a8ae11528c8b6d06f3d3e72ed7cb8d70d43cc135cbaae0c5bce67754bc35fea772f9d021a8626ef7161929c00db339a0b041134
data/.travis.yml CHANGED
@@ -4,8 +4,6 @@ rvm:
4
4
  - 2.2.4
5
5
  - 2.1.8
6
6
  - 2.0.0
7
- - 1.9.3
8
- - jruby-19mode
9
7
  - rbx-2
10
8
  before_install:
11
9
  - gem install bundler -v '~> 1.11'
@@ -14,5 +12,13 @@ gemfile:
14
12
  - gemfiles/41.gemfile
15
13
  - gemfiles/42.gemfile
16
14
  - gemfiles/50.gemfile
15
+ matrix:
16
+ exclude:
17
+ - rvm: 2.0.0
18
+ gemfile: gemfiles/50.gemfile
19
+ - rvm: 2.1.8
20
+ gemfile: gemfiles/50.gemfile
21
+ - rvm: rbx-2
22
+ gemfile: gemfiles/50.gemfile
17
23
  cache:
18
24
  - bundler
data/README.md CHANGED
@@ -3,11 +3,20 @@
3
3
  [![Code Climate](https://codeclimate.com/github/owahab/uniqueness/badges/gpa.svg)](https://codeclimate.com/github/owahab/uniqueness)
4
4
  [![Build Status](https://travis-ci.org/owahab/uniqueness.svg?branch=master)](https://travis-ci.org/owahab/uniqueness)
5
5
  [![Coverage Status](https://coveralls.io/repos/github/owahab/uniqueness/badge.svg?branch=master)](https://coveralls.io/github/owahab/uniqueness?branch=master)
6
+ [![Inline docs](http://inch-ci.org/github/owahab/uniqueness.svg?branch=master)](http://inch-ci.org/github/owahab/uniqueness)
7
+ [![security](https://hakiri.io/github/owahab/uniqueness/master.svg)](https://hakiri.io/github/owahab/uniqueness/master)
6
8
 
7
9
  Rails recently introduced `has_secure_token` but it's very primitive.
8
10
  Meet the competition.
9
11
 
10
- [Documentation](http://www.rubydoc.info/github/owahab/uniqueness)
12
+ [Code Documentation](http://www.rubydoc.info/github/owahab/uniqueness)
13
+
14
+ ## Requirements
15
+
16
+ Minimum requirements are:
17
+
18
+ 1. Rails __4.0.0+__
19
+ 2. Ruby __2.0.0+__
11
20
 
12
21
  ## Installation
13
22
 
@@ -27,7 +36,26 @@ Or install it yourself as:
27
36
 
28
37
  ## Usage
29
38
 
39
+ Adds random field support to Rails models.
40
+
41
+ To auto-generate a new random string for field `foo`:
42
+
43
+ class Example < ActiveRecord::Base
44
+ has_unique_field :foo
45
+ end
46
+
47
+ You can customize the generated string by
48
+ passing an options hash. The following keys are supported:
30
49
 
50
+ `:length` number of characters, defaults to __32__
51
+
52
+ `:type` type of string, can be one of: `:human`, `:auto`, defaults to __:auto__
53
+
54
+ Human type generates strings easier to read by excluding ambiguous characters like `1, 5, 8, B, o, O, I, l, s, u`.
55
+
56
+ `:blacklist` characters to exclude when generating the random string, defaults to __[]__
57
+
58
+ `:scope` scopes, defines the `ActiveRecord` `scope` applied before calculating the `position` field value. Defaults to __[]__
31
59
 
32
60
  ## Development
33
61
 
@@ -40,4 +68,7 @@ To install this gem onto your local machine, run `bundle exec rake install`. To
40
68
  Please see CONTRIBUTING.md for details.
41
69
 
42
70
  ## Credits
43
- recognition was originally written by Omar Abdel-Wahab.
71
+
72
+ [![Eventtus](http://eventtus.com/css/images/logo.png)](http://eventtus.com)
73
+
74
+ Project is sponsored by [Eventtus](http://eventtus.com).
@@ -1,5 +1,5 @@
1
1
  module Uniqueness
2
- class Engine < Rails::Engine #:nodoc:
2
+ class Engine < Rails::Engine # :nodoc:
3
3
  ActiveSupport.on_load(:active_record) do
4
4
  ActiveRecord::Base.send(:include, Uniqueness::Model)
5
5
  end
@@ -2,6 +2,8 @@ module Uniqueness
2
2
  module Model # :nodoc:
3
3
  def self.included(base)
4
4
  base.extend ClassMethods
5
+ # Track all uniqueness arguments
6
+ base.class_attribute :uniqueness_options
5
7
  end
6
8
 
7
9
  module ClassMethods
@@ -18,28 +20,45 @@ module Uniqueness
18
20
  #
19
21
  # +:case_sensitive+ defaults to <tt>true</tt>
20
22
  #
21
- # +:type+ type of string, defaults to <tt>:hash</tt>
22
- # can be one of: <tt>:human</tt>, <tt>:hash</tt>
23
+ # +:type+ type of string, defaults to <tt>:auto</tt>
24
+ # can be one of: <tt>:human</tt>, <tt>:auto</tt>
23
25
  #
24
- # +:blacklist+ characters to exclude when generating the random string,
25
- # defaults to <tt>[]</tt>
26
+ # +:blacklist+ characters to exclude when generating the random
27
+ # string, defaults to <tt>[]</tt>
28
+ #
29
+ # +:scope+ defines the `ActiveRecord` `scope` applied before
30
+ # calculating the `position` field value.
31
+ # defaults to <tt>[]</tt>
26
32
  def has_unique_field(name, options = {})
27
- validates name, presence: true, uniqueness: true
28
- before_validation do
29
- value = self.send(name)
30
- self.send("#{name}=", uniqueness_generate(options)) unless value
31
- end
33
+ self.uniqueness_options ||= {}
34
+ self.uniqueness_options[name] = self.uniqueness_default_options.merge(options)
35
+ before_validation :uniqueness_generate
36
+ validate :uniqueness_validation
37
+ end
38
+
39
+ # Default sorting options
40
+ def uniqueness_default_options
41
+ {
42
+ length: 32,
43
+ type: :auto,
44
+ blacklist: [],
45
+ scope: []
46
+ }
32
47
  end
33
48
  end
34
49
 
35
50
  # Generates a new code based on given options
36
- def uniqueness_generate(opts = {})
37
- options = { length: 32, type: :auto, blacklist: [] }
38
- options.merge!(opts)
39
- dict = uniqueness_dictionary - options[:blacklist]
40
- dict = dict - [*(:A..:Z)].map(&:to_s) unless options[:case_sensitive]
41
- dict = dict - uniqueness_ambigious_dictionary if options[:type].to_sym == :human
42
- Array.new(options[:length]).map { dict[rand(dict.length)] }.join
51
+ def uniqueness_generate
52
+ self.uniqueness_options.each do |field, options|
53
+ value = send(field)
54
+ unless value.present?
55
+ dict = uniqueness_dictionary - options[:blacklist]
56
+ dict -= [*(:A..:Z)].map(&:to_s) unless options[:case_sensitive]
57
+ dict -= uniqueness_ambigious_dictionary if options[:type].to_sym == :human
58
+ value = Array.new(options[:length]).map { dict[rand(dict.length)] }.join
59
+ self.send("#{field}=", value)
60
+ end
61
+ end
43
62
  end
44
63
 
45
64
  # Dictionary used for uniqueness generation
@@ -48,7 +67,24 @@ module Uniqueness
48
67
  end
49
68
 
50
69
  def uniqueness_ambigious_dictionary
51
- [1, 5, 8, :B, :o, :O, :I, :l, :L, :s, :S, :u, :U].map(&:to_s)
70
+ [:b, :B, :o, :O, :q, :I, :l, :L, :s, :S, :u, :U, :z, :Z].map(&:to_s)
71
+ end
72
+
73
+ def uniqueness_validation
74
+ self.class.uniqueness_options.each do |field, options|
75
+ value = send(field)
76
+ if value.nil?
77
+ errors.add(field, 'should not be empty')
78
+ else
79
+ conditions = {}
80
+ options[:scope].each do |s|
81
+ conditions[s] = send(s)
82
+ end
83
+ conditions[field] = value
84
+ query = self.class.where(conditions)
85
+ errors.add(field, 'should be unique') if query.any?
86
+ end
87
+ end
52
88
  end
53
89
  end
54
90
  end
@@ -1,3 +1,3 @@
1
1
  module Uniqueness
2
- VERSION = "0.5.0"
2
+ VERSION = "0.6.0"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: uniqueness
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.0
4
+ version: 0.6.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Omar Abdel-Wahab
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2016-03-28 00:00:00.000000000 Z
11
+ date: 2016-04-20 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler