random_unique_id 1.0.1 → 1.1.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 +4 -4
- data/Appraisals +2 -1
- data/CHANGELOG.md +5 -0
- data/Gemfile +1 -1
- data/LICENSE.txt +1 -1
- data/README.md +33 -2
- data/Rakefile +1 -1
- data/gemfiles/rails_3_2.gemfile +1 -0
- data/gemfiles/rails_3_2.gemfile.lock +27 -27
- data/gemfiles/rails_4_0.gemfile.lock +28 -33
- data/gemfiles/rails_4_1.gemfile.lock +34 -39
- data/gemfiles/rails_4_2.gemfile.lock +3 -3
- data/lib/random_unique_id.rb +94 -28
- data/lib/random_unique_id/util.rb +2 -2
- data/lib/random_unique_id/version.rb +2 -2
- data/random_unique_id.gemspec +2 -2
- data/test/random_unique_id/util_test.rb +2 -2
- data/test/random_unique_id_test.rb +112 -9
- data/test/test_helper.rb +1 -1
- metadata +3 -2
    
        checksums.yaml
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            ---
         | 
| 2 2 | 
             
            SHA1:
         | 
| 3 | 
            -
              metadata.gz:  | 
| 4 | 
            -
              data.tar.gz:  | 
| 3 | 
            +
              metadata.gz: e4fd33354ff7f7dc83c2049861a1c1834180a701
         | 
| 4 | 
            +
              data.tar.gz: e2d3966da120622d465f8ee44a8eafbfa34a07d5
         | 
| 5 5 | 
             
            SHA512:
         | 
| 6 | 
            -
              metadata.gz:  | 
| 7 | 
            -
              data.tar.gz:  | 
| 6 | 
            +
              metadata.gz: 3fc7fff7df4603a17669ba6e3a5daf6c8b564f2f1d895497e91081de7b6ef4c2c70668f34b5d554d9ff9b09e9a972d13ca3614111812967bfa5121026ee659dc
         | 
| 7 | 
            +
              data.tar.gz: 4ef6aece9431d658ad3f034ad709a7a91ca4b3021870bec305c8e8147e3cef0b30fb3f49d16f79136947a0a12d6a40bef066750789b83bdd47d878400571d910
         | 
    
        data/Appraisals
    CHANGED
    
    
    
        data/CHANGELOG.md
    CHANGED
    
    | @@ -1,5 +1,10 @@ | |
| 1 1 | 
             
            Authoritative changelog in README.md.
         | 
| 2 2 |  | 
| 3 | 
            +
            ## Version 1.1.0 (Jan 7, 2015)
         | 
| 4 | 
            +
            - Added global configuration.
         | 
| 5 | 
            +
            - Added UUID generation.
         | 
| 6 | 
            +
            - Allow changing the name of the field used for the random id.
         | 
| 7 | 
            +
             | 
| 3 8 | 
             
            ## Version 1.0.1 (Dec 22, 2014)
         | 
| 4 9 | 
             
            - Added support for Rails 4.2.
         | 
| 5 10 |  | 
    
        data/Gemfile
    CHANGED
    
    
    
        data/LICENSE.txt
    CHANGED
    
    
    
        data/README.md
    CHANGED
    
    | @@ -69,15 +69,44 @@ records. For example: | |
| 69 69 | 
             
                  end
         | 
| 70 70 | 
             
                end
         | 
| 71 71 |  | 
| 72 | 
            +
            ## Configuration
         | 
| 73 | 
            +
             | 
| 74 | 
            +
            There are 2 settings that are configurable for RandomUniqueId:
         | 
| 75 | 
            +
             | 
| 76 | 
            +
            - `min_rid_length:` If you have a large table, the default of 5 characters for an initial length may be a problem, since it may lead to
         | 
| 77 | 
            +
                several "bounces" until a new unique RID gets generated. The gem scales well with this problem, since it makes
         | 
| 78 | 
            +
                each subsequent try longer than the one before, but it may still may 3 or 4 DB hits for each record creation.
         | 
| 79 | 
            +
                In that case, you may want to set it to start with a higher number directly.
         | 
| 80 | 
            +
             | 
| 81 | 
            +
            - `random_generation_method:` If you have a very large table, and having very long IDs is not a problem, you can choose to generate UUIDs instead
         | 
| 82 | 
            +
                of short-ish Random IDs. This looks worse if you're displaying these IDs in a URL, but it allows to skip the check
         | 
| 83 | 
            +
                for existence, which in a large table can make a large difference.
         | 
| 84 | 
            +
                random_generation_method can be either `:short` (the default) or `:uuid`
         | 
| 85 | 
            +
             | 
| 86 | 
            +
            Both of these settings can be specified on a per-model basis, when adding RandomUniqueId to the model:
         | 
| 87 | 
            +
             | 
| 88 | 
            +
                has_random_unique_id(min_rid_length: 10)
         | 
| 89 | 
            +
                has_random_unique_id(random_generation_method: :uuid)
         | 
| 90 | 
            +
             | 
| 91 | 
            +
            Or globally in an initializer:
         | 
| 92 | 
            +
             | 
| 93 | 
            +
                RandomUniqueId.config(min_rid_length: 10)
         | 
| 94 | 
            +
             | 
| 72 95 | 
             
            ## Users
         | 
| 73 96 |  | 
| 74 97 | 
             
            This gem is being used by:
         | 
| 75 98 |  | 
| 76 99 | 
             
            - [Watu](https://watuapp.com)
         | 
| 100 | 
            +
            - [MSTY](https://www.msty.com)
         | 
| 77 101 | 
             
            - You? please, let us know if you are using this gem.
         | 
| 78 102 |  | 
| 79 103 | 
             
            ## Changelog
         | 
| 80 104 |  | 
| 105 | 
            +
            ### Version 1.1.0 (Jan 7, 2015)
         | 
| 106 | 
            +
            - Added global configuration.
         | 
| 107 | 
            +
            - Added UUID generation.
         | 
| 108 | 
            +
            - Allow changing the name of the field used for the random id.
         | 
| 109 | 
            +
             | 
| 81 110 | 
             
            ### Version 1.0.1 (Dec 22, 2014)
         | 
| 82 111 | 
             
            - Added support for Rails 4.2.
         | 
| 83 112 |  | 
| @@ -102,12 +131,14 @@ This gem is being used by: | |
| 102 131 |  | 
| 103 132 | 
             
            1. Fork it
         | 
| 104 133 | 
             
            1. Create your feature branch (`git checkout -b my-new-feature`)
         | 
| 105 | 
            -
            1. Code your thing | 
| 106 | 
            -
            1.  | 
| 134 | 
            +
            1. Code your thing
         | 
| 135 | 
            +
            1. Write and run tests:
         | 
| 107 136 |  | 
| 108 137 | 
             
                    bundle install
         | 
| 109 138 | 
             
                    appraisal
         | 
| 110 139 | 
             
                    appraisal rake test
         | 
| 140 | 
            +
            1. Write documentation and make sure it looks good: yard server --reload
         | 
| 141 | 
            +
            1. Add items to the changelog, both in the README and the CHANGELOG file.
         | 
| 111 142 | 
             
            1. Commit your changes (`git commit -am "Add some feature"`)
         | 
| 112 143 | 
             
            1. Push to the branch (`git push origin my-new-feature`)
         | 
| 113 144 | 
             
            1. Create new Pull Request
         | 
    
        data/Rakefile
    CHANGED
    
    
    
        data/gemfiles/rails_3_2.gemfile
    CHANGED
    
    
| @@ -1,19 +1,19 @@ | |
| 1 1 | 
             
            PATH
         | 
| 2 2 | 
             
              remote: ../
         | 
| 3 3 | 
             
              specs:
         | 
| 4 | 
            -
                random_unique_id (1.0 | 
| 4 | 
            +
                random_unique_id (1.1.0)
         | 
| 5 5 | 
             
                  activerecord (>= 3.2.0)
         | 
| 6 6 | 
             
                  activesupport (>= 3.2.0)
         | 
| 7 7 |  | 
| 8 8 | 
             
            GEM
         | 
| 9 9 | 
             
              remote: https://rubygems.org/
         | 
| 10 10 | 
             
              specs:
         | 
| 11 | 
            -
                actionmailer (3.2. | 
| 12 | 
            -
                  actionpack (= 3.2. | 
| 11 | 
            +
                actionmailer (3.2.21)
         | 
| 12 | 
            +
                  actionpack (= 3.2.21)
         | 
| 13 13 | 
             
                  mail (~> 2.5.4)
         | 
| 14 | 
            -
                actionpack (3.2. | 
| 15 | 
            -
                  activemodel (= 3.2. | 
| 16 | 
            -
                  activesupport (= 3.2. | 
| 14 | 
            +
                actionpack (3.2.21)
         | 
| 15 | 
            +
                  activemodel (= 3.2.21)
         | 
| 16 | 
            +
                  activesupport (= 3.2.21)
         | 
| 17 17 | 
             
                  builder (~> 3.0.0)
         | 
| 18 18 | 
             
                  erubis (~> 2.7.0)
         | 
| 19 19 | 
             
                  journey (~> 1.0.4)
         | 
| @@ -21,15 +21,15 @@ GEM | |
| 21 21 | 
             
                  rack-cache (~> 1.2)
         | 
| 22 22 | 
             
                  rack-test (~> 0.6.1)
         | 
| 23 23 | 
             
                  sprockets (~> 2.2.1)
         | 
| 24 | 
            -
                activemodel (3.2. | 
| 25 | 
            -
                  activesupport (= 3.2. | 
| 24 | 
            +
                activemodel (3.2.21)
         | 
| 25 | 
            +
                  activesupport (= 3.2.21)
         | 
| 26 26 | 
             
                  builder (~> 3.0.0)
         | 
| 27 | 
            -
                activerecord (3.2. | 
| 28 | 
            -
                  activemodel (= 3.2. | 
| 29 | 
            -
                  activesupport (= 3.2. | 
| 27 | 
            +
                activerecord (3.2.21)
         | 
| 28 | 
            +
                  activemodel (= 3.2.21)
         | 
| 29 | 
            +
                  activesupport (= 3.2.21)
         | 
| 30 30 | 
             
                  arel (~> 3.0.2)
         | 
| 31 31 | 
             
                  tzinfo (~> 0.3.29)
         | 
| 32 | 
            -
                activesupport (3.2. | 
| 32 | 
            +
                activesupport (3.2.21)
         | 
| 33 33 | 
             
                  i18n (~> 0.6, >= 0.6.4)
         | 
| 34 34 | 
             
                  multi_json (~> 1.0)
         | 
| 35 35 | 
             
                ansi (1.4.3)
         | 
| @@ -39,7 +39,7 @@ GEM | |
| 39 39 | 
             
                  thor (>= 0.14.0)
         | 
| 40 40 | 
             
                arel (3.0.3)
         | 
| 41 41 | 
             
                builder (3.0.4)
         | 
| 42 | 
            -
                codeclimate-test-reporter (0.4. | 
| 42 | 
            +
                codeclimate-test-reporter (0.4.4)
         | 
| 43 43 | 
             
                  simplecov (>= 0.7.1, < 1.0.0)
         | 
| 44 44 | 
             
                coveralls (0.7.1)
         | 
| 45 45 | 
             
                  multi_json (~> 1.3)
         | 
| @@ -49,9 +49,9 @@ GEM | |
| 49 49 | 
             
                  thor
         | 
| 50 50 | 
             
                docile (1.1.5)
         | 
| 51 51 | 
             
                erubis (2.7.0)
         | 
| 52 | 
            -
                hashie (3.3. | 
| 52 | 
            +
                hashie (3.3.2)
         | 
| 53 53 | 
             
                hike (1.2.3)
         | 
| 54 | 
            -
                i18n (0. | 
| 54 | 
            +
                i18n (0.7.0)
         | 
| 55 55 | 
             
                journey (1.0.4)
         | 
| 56 56 | 
             
                json (1.8.1)
         | 
| 57 57 | 
             
                mail (2.5.4)
         | 
| @@ -74,7 +74,7 @@ GEM | |
| 74 74 | 
             
                mocha (1.1.0)
         | 
| 75 75 | 
             
                  metaclass (~> 0.0.1)
         | 
| 76 76 | 
             
                multi_json (1.10.1)
         | 
| 77 | 
            -
                netrc (0. | 
| 77 | 
            +
                netrc (0.10.2)
         | 
| 78 78 | 
             
                polyglot (0.3.5)
         | 
| 79 79 | 
             
                powerbar (1.0.11)
         | 
| 80 80 | 
             
                  ansi (~> 1.4.0)
         | 
| @@ -86,14 +86,14 @@ GEM | |
| 86 86 | 
             
                  rack
         | 
| 87 87 | 
             
                rack-test (0.6.2)
         | 
| 88 88 | 
             
                  rack (>= 1.0)
         | 
| 89 | 
            -
                railties (3.2. | 
| 90 | 
            -
                  actionpack (= 3.2. | 
| 91 | 
            -
                  activesupport (= 3.2. | 
| 89 | 
            +
                railties (3.2.21)
         | 
| 90 | 
            +
                  actionpack (= 3.2.21)
         | 
| 91 | 
            +
                  activesupport (= 3.2.21)
         | 
| 92 92 | 
             
                  rack-ssl (~> 1.3.2)
         | 
| 93 93 | 
             
                  rake (>= 0.8.7)
         | 
| 94 94 | 
             
                  rdoc (~> 3.4)
         | 
| 95 95 | 
             
                  thor (>= 0.14.6, < 2.0)
         | 
| 96 | 
            -
                rake (10. | 
| 96 | 
            +
                rake (10.4.2)
         | 
| 97 97 | 
             
                rdoc (3.12.2)
         | 
| 98 98 | 
             
                  json (~> 1.4)
         | 
| 99 99 | 
             
                rest-client (1.7.2)
         | 
| @@ -105,26 +105,26 @@ GEM | |
| 105 105 | 
             
                shoulda-context (1.2.1)
         | 
| 106 106 | 
             
                shoulda-matchers (2.7.0)
         | 
| 107 107 | 
             
                  activesupport (>= 3.0.0)
         | 
| 108 | 
            -
                simplecov (0.9. | 
| 108 | 
            +
                simplecov (0.9.1)
         | 
| 109 109 | 
             
                  docile (~> 1.1.0)
         | 
| 110 | 
            -
                  multi_json
         | 
| 110 | 
            +
                  multi_json (~> 1.0)
         | 
| 111 111 | 
             
                  simplecov-html (~> 0.8.0)
         | 
| 112 112 | 
             
                simplecov-html (0.8.0)
         | 
| 113 | 
            -
                sprockets (2.2. | 
| 113 | 
            +
                sprockets (2.2.3)
         | 
| 114 114 | 
             
                  hike (~> 1.2)
         | 
| 115 115 | 
             
                  multi_json (~> 1.0)
         | 
| 116 116 | 
             
                  rack (~> 1.0)
         | 
| 117 117 | 
             
                  tilt (~> 1.1, != 1.3.0)
         | 
| 118 | 
            -
                sqlite3 (1.3. | 
| 118 | 
            +
                sqlite3 (1.3.10)
         | 
| 119 119 | 
             
                term-ansicolor (1.3.0)
         | 
| 120 120 | 
             
                  tins (~> 1.0)
         | 
| 121 121 | 
             
                thor (0.19.1)
         | 
| 122 122 | 
             
                tilt (1.4.1)
         | 
| 123 | 
            -
                tins (1.3. | 
| 123 | 
            +
                tins (1.3.3)
         | 
| 124 124 | 
             
                treetop (1.4.15)
         | 
| 125 125 | 
             
                  polyglot
         | 
| 126 126 | 
             
                  polyglot (>= 0.3.1)
         | 
| 127 | 
            -
                tzinfo (0.3. | 
| 127 | 
            +
                tzinfo (0.3.42)
         | 
| 128 128 |  | 
| 129 129 | 
             
            PLATFORMS
         | 
| 130 130 | 
             
              ruby
         | 
| @@ -135,7 +135,7 @@ DEPENDENCIES | |
| 135 135 | 
             
              bundler
         | 
| 136 136 | 
             
              codeclimate-test-reporter
         | 
| 137 137 | 
             
              coveralls
         | 
| 138 | 
            -
              minitest
         | 
| 138 | 
            +
              minitest (~> 4.7.5)
         | 
| 139 139 | 
             
              minitest-rails
         | 
| 140 140 | 
             
              minitest-reporters
         | 
| 141 141 | 
             
              mocha
         | 
| @@ -1,32 +1,32 @@ | |
| 1 1 | 
             
            PATH
         | 
| 2 2 | 
             
              remote: ../
         | 
| 3 3 | 
             
              specs:
         | 
| 4 | 
            -
                random_unique_id (1.0 | 
| 4 | 
            +
                random_unique_id (1.1.0)
         | 
| 5 5 | 
             
                  activerecord (>= 3.2.0)
         | 
| 6 6 | 
             
                  activesupport (>= 3.2.0)
         | 
| 7 7 |  | 
| 8 8 | 
             
            GEM
         | 
| 9 9 | 
             
              remote: https://rubygems.org/
         | 
| 10 10 | 
             
              specs:
         | 
| 11 | 
            -
                actionmailer (4.0. | 
| 12 | 
            -
                  actionpack (= 4.0. | 
| 13 | 
            -
                  mail (~> 2.5.4)
         | 
| 14 | 
            -
                actionpack (4.0. | 
| 15 | 
            -
                  activesupport (= 4.0. | 
| 11 | 
            +
                actionmailer (4.0.13)
         | 
| 12 | 
            +
                  actionpack (= 4.0.13)
         | 
| 13 | 
            +
                  mail (~> 2.5, >= 2.5.4)
         | 
| 14 | 
            +
                actionpack (4.0.13)
         | 
| 15 | 
            +
                  activesupport (= 4.0.13)
         | 
| 16 16 | 
             
                  builder (~> 3.1.0)
         | 
| 17 17 | 
             
                  erubis (~> 2.7.0)
         | 
| 18 18 | 
             
                  rack (~> 1.5.2)
         | 
| 19 19 | 
             
                  rack-test (~> 0.6.2)
         | 
| 20 | 
            -
                activemodel (4.0. | 
| 21 | 
            -
                  activesupport (= 4.0. | 
| 20 | 
            +
                activemodel (4.0.13)
         | 
| 21 | 
            +
                  activesupport (= 4.0.13)
         | 
| 22 22 | 
             
                  builder (~> 3.1.0)
         | 
| 23 | 
            -
                activerecord (4.0. | 
| 24 | 
            -
                  activemodel (= 4.0. | 
| 23 | 
            +
                activerecord (4.0.13)
         | 
| 24 | 
            +
                  activemodel (= 4.0.13)
         | 
| 25 25 | 
             
                  activerecord-deprecated_finders (~> 1.0.2)
         | 
| 26 | 
            -
                  activesupport (= 4.0. | 
| 26 | 
            +
                  activesupport (= 4.0.13)
         | 
| 27 27 | 
             
                  arel (~> 4.0.0)
         | 
| 28 28 | 
             
                activerecord-deprecated_finders (1.0.3)
         | 
| 29 | 
            -
                activesupport (4.0. | 
| 29 | 
            +
                activesupport (4.0.13)
         | 
| 30 30 | 
             
                  i18n (~> 0.6, >= 0.6.9)
         | 
| 31 31 | 
             
                  minitest (~> 4.2)
         | 
| 32 32 | 
             
                  multi_json (~> 1.3)
         | 
| @@ -39,7 +39,7 @@ GEM | |
| 39 39 | 
             
                  thor (>= 0.14.0)
         | 
| 40 40 | 
             
                arel (4.0.2)
         | 
| 41 41 | 
             
                builder (3.1.4)
         | 
| 42 | 
            -
                codeclimate-test-reporter (0.4. | 
| 42 | 
            +
                codeclimate-test-reporter (0.4.4)
         | 
| 43 43 | 
             
                  simplecov (>= 0.7.1, < 1.0.0)
         | 
| 44 44 | 
             
                coveralls (0.7.1)
         | 
| 45 45 | 
             
                  multi_json (~> 1.3)
         | 
| @@ -49,13 +49,12 @@ GEM | |
| 49 49 | 
             
                  thor
         | 
| 50 50 | 
             
                docile (1.1.5)
         | 
| 51 51 | 
             
                erubis (2.7.0)
         | 
| 52 | 
            -
                hashie (3.3. | 
| 53 | 
            -
                i18n (0. | 
| 54 | 
            -
                mail (2. | 
| 55 | 
            -
                  mime-types ( | 
| 56 | 
            -
                  treetop (~> 1.4.8)
         | 
| 52 | 
            +
                hashie (3.3.2)
         | 
| 53 | 
            +
                i18n (0.7.0)
         | 
| 54 | 
            +
                mail (2.6.3)
         | 
| 55 | 
            +
                  mime-types (>= 1.16, < 3)
         | 
| 57 56 | 
             
                metaclass (0.0.4)
         | 
| 58 | 
            -
                mime-types ( | 
| 57 | 
            +
                mime-types (2.4.3)
         | 
| 59 58 | 
             
                minitest (4.7.5)
         | 
| 60 59 | 
             
                minitest-rails (1.0.1)
         | 
| 61 60 | 
             
                  minitest (~> 4.7)
         | 
| @@ -71,20 +70,19 @@ GEM | |
| 71 70 | 
             
                mocha (1.1.0)
         | 
| 72 71 | 
             
                  metaclass (~> 0.0.1)
         | 
| 73 72 | 
             
                multi_json (1.10.1)
         | 
| 74 | 
            -
                netrc (0. | 
| 75 | 
            -
                polyglot (0.3.5)
         | 
| 73 | 
            +
                netrc (0.10.2)
         | 
| 76 74 | 
             
                powerbar (1.0.11)
         | 
| 77 75 | 
             
                  ansi (~> 1.4.0)
         | 
| 78 76 | 
             
                  hashie (>= 1.1.0)
         | 
| 79 77 | 
             
                rack (1.5.2)
         | 
| 80 78 | 
             
                rack-test (0.6.2)
         | 
| 81 79 | 
             
                  rack (>= 1.0)
         | 
| 82 | 
            -
                railties (4.0. | 
| 83 | 
            -
                  actionpack (= 4.0. | 
| 84 | 
            -
                  activesupport (= 4.0. | 
| 80 | 
            +
                railties (4.0.13)
         | 
| 81 | 
            +
                  actionpack (= 4.0.13)
         | 
| 82 | 
            +
                  activesupport (= 4.0.13)
         | 
| 85 83 | 
             
                  rake (>= 0.8.7)
         | 
| 86 84 | 
             
                  thor (>= 0.18.1, < 2.0)
         | 
| 87 | 
            -
                rake (10. | 
| 85 | 
            +
                rake (10.4.2)
         | 
| 88 86 | 
             
                rest-client (1.7.2)
         | 
| 89 87 | 
             
                  mime-types (>= 1.16, < 3.0)
         | 
| 90 88 | 
             
                  netrc (~> 0.7)
         | 
| @@ -94,21 +92,18 @@ GEM | |
| 94 92 | 
             
                shoulda-context (1.2.1)
         | 
| 95 93 | 
             
                shoulda-matchers (2.7.0)
         | 
| 96 94 | 
             
                  activesupport (>= 3.0.0)
         | 
| 97 | 
            -
                simplecov (0.9. | 
| 95 | 
            +
                simplecov (0.9.1)
         | 
| 98 96 | 
             
                  docile (~> 1.1.0)
         | 
| 99 | 
            -
                  multi_json
         | 
| 97 | 
            +
                  multi_json (~> 1.0)
         | 
| 100 98 | 
             
                  simplecov-html (~> 0.8.0)
         | 
| 101 99 | 
             
                simplecov-html (0.8.0)
         | 
| 102 | 
            -
                sqlite3 (1.3. | 
| 100 | 
            +
                sqlite3 (1.3.10)
         | 
| 103 101 | 
             
                term-ansicolor (1.3.0)
         | 
| 104 102 | 
             
                  tins (~> 1.0)
         | 
| 105 103 | 
             
                thor (0.19.1)
         | 
| 106 104 | 
             
                thread_safe (0.3.4)
         | 
| 107 | 
            -
                tins (1.3. | 
| 108 | 
            -
                 | 
| 109 | 
            -
                  polyglot
         | 
| 110 | 
            -
                  polyglot (>= 0.3.1)
         | 
| 111 | 
            -
                tzinfo (0.3.41)
         | 
| 105 | 
            +
                tins (1.3.3)
         | 
| 106 | 
            +
                tzinfo (0.3.42)
         | 
| 112 107 |  | 
| 113 108 | 
             
            PLATFORMS
         | 
| 114 109 | 
             
              ruby
         | 
| @@ -1,34 +1,34 @@ | |
| 1 1 | 
             
            PATH
         | 
| 2 2 | 
             
              remote: ../
         | 
| 3 3 | 
             
              specs:
         | 
| 4 | 
            -
                random_unique_id (1.0 | 
| 4 | 
            +
                random_unique_id (1.1.0)
         | 
| 5 5 | 
             
                  activerecord (>= 3.2.0)
         | 
| 6 6 | 
             
                  activesupport (>= 3.2.0)
         | 
| 7 7 |  | 
| 8 8 | 
             
            GEM
         | 
| 9 9 | 
             
              remote: https://rubygems.org/
         | 
| 10 10 | 
             
              specs:
         | 
| 11 | 
            -
                actionmailer (4.1. | 
| 12 | 
            -
                  actionpack (= 4.1. | 
| 13 | 
            -
                  actionview (= 4.1. | 
| 14 | 
            -
                  mail (~> 2.5.4)
         | 
| 15 | 
            -
                actionpack (4.1. | 
| 16 | 
            -
                  actionview (= 4.1. | 
| 17 | 
            -
                  activesupport (= 4.1. | 
| 11 | 
            +
                actionmailer (4.1.9)
         | 
| 12 | 
            +
                  actionpack (= 4.1.9)
         | 
| 13 | 
            +
                  actionview (= 4.1.9)
         | 
| 14 | 
            +
                  mail (~> 2.5, >= 2.5.4)
         | 
| 15 | 
            +
                actionpack (4.1.9)
         | 
| 16 | 
            +
                  actionview (= 4.1.9)
         | 
| 17 | 
            +
                  activesupport (= 4.1.9)
         | 
| 18 18 | 
             
                  rack (~> 1.5.2)
         | 
| 19 19 | 
             
                  rack-test (~> 0.6.2)
         | 
| 20 | 
            -
                actionview (4.1. | 
| 21 | 
            -
                  activesupport (= 4.1. | 
| 20 | 
            +
                actionview (4.1.9)
         | 
| 21 | 
            +
                  activesupport (= 4.1.9)
         | 
| 22 22 | 
             
                  builder (~> 3.1)
         | 
| 23 23 | 
             
                  erubis (~> 2.7.0)
         | 
| 24 | 
            -
                activemodel (4.1. | 
| 25 | 
            -
                  activesupport (= 4.1. | 
| 24 | 
            +
                activemodel (4.1.9)
         | 
| 25 | 
            +
                  activesupport (= 4.1.9)
         | 
| 26 26 | 
             
                  builder (~> 3.1)
         | 
| 27 | 
            -
                activerecord (4.1. | 
| 28 | 
            -
                  activemodel (= 4.1. | 
| 29 | 
            -
                  activesupport (= 4.1. | 
| 27 | 
            +
                activerecord (4.1.9)
         | 
| 28 | 
            +
                  activemodel (= 4.1.9)
         | 
| 29 | 
            +
                  activesupport (= 4.1.9)
         | 
| 30 30 | 
             
                  arel (~> 5.0.0)
         | 
| 31 | 
            -
                activesupport (4.1. | 
| 31 | 
            +
                activesupport (4.1.9)
         | 
| 32 32 | 
             
                  i18n (~> 0.6, >= 0.6.9)
         | 
| 33 33 | 
             
                  json (~> 1.7, >= 1.7.7)
         | 
| 34 34 | 
             
                  minitest (~> 5.1)
         | 
| @@ -41,7 +41,7 @@ GEM | |
| 41 41 | 
             
                  thor (>= 0.14.0)
         | 
| 42 42 | 
             
                arel (5.0.1.20140414130214)
         | 
| 43 43 | 
             
                builder (3.2.2)
         | 
| 44 | 
            -
                codeclimate-test-reporter (0.4. | 
| 44 | 
            +
                codeclimate-test-reporter (0.4.4)
         | 
| 45 45 | 
             
                  simplecov (>= 0.7.1, < 1.0.0)
         | 
| 46 46 | 
             
                coveralls (0.7.1)
         | 
| 47 47 | 
             
                  multi_json (~> 1.3)
         | 
| @@ -51,18 +51,17 @@ GEM | |
| 51 51 | 
             
                  thor
         | 
| 52 52 | 
             
                docile (1.1.5)
         | 
| 53 53 | 
             
                erubis (2.7.0)
         | 
| 54 | 
            -
                i18n (0. | 
| 54 | 
            +
                i18n (0.7.0)
         | 
| 55 55 | 
             
                json (1.8.1)
         | 
| 56 | 
            -
                mail (2. | 
| 57 | 
            -
                  mime-types ( | 
| 58 | 
            -
                  treetop (~> 1.4.8)
         | 
| 56 | 
            +
                mail (2.6.3)
         | 
| 57 | 
            +
                  mime-types (>= 1.16, < 3)
         | 
| 59 58 | 
             
                metaclass (0.0.4)
         | 
| 60 | 
            -
                mime-types ( | 
| 61 | 
            -
                minitest (5. | 
| 62 | 
            -
                minitest-rails (2.1. | 
| 59 | 
            +
                mime-types (2.4.3)
         | 
| 60 | 
            +
                minitest (5.5.0)
         | 
| 61 | 
            +
                minitest-rails (2.1.1)
         | 
| 63 62 | 
             
                  minitest (~> 5.4)
         | 
| 64 63 | 
             
                  railties (~> 4.1)
         | 
| 65 | 
            -
                minitest-reporters (1.0. | 
| 64 | 
            +
                minitest-reporters (1.0.8)
         | 
| 66 65 | 
             
                  ansi
         | 
| 67 66 | 
             
                  builder
         | 
| 68 67 | 
             
                  minitest (>= 5.0)
         | 
| @@ -70,41 +69,37 @@ GEM | |
| 70 69 | 
             
                mocha (1.1.0)
         | 
| 71 70 | 
             
                  metaclass (~> 0.0.1)
         | 
| 72 71 | 
             
                multi_json (1.10.1)
         | 
| 73 | 
            -
                netrc (0. | 
| 74 | 
            -
                polyglot (0.3.5)
         | 
| 72 | 
            +
                netrc (0.10.2)
         | 
| 75 73 | 
             
                rack (1.5.2)
         | 
| 76 74 | 
             
                rack-test (0.6.2)
         | 
| 77 75 | 
             
                  rack (>= 1.0)
         | 
| 78 | 
            -
                railties (4.1. | 
| 79 | 
            -
                  actionpack (= 4.1. | 
| 80 | 
            -
                  activesupport (= 4.1. | 
| 76 | 
            +
                railties (4.1.9)
         | 
| 77 | 
            +
                  actionpack (= 4.1.9)
         | 
| 78 | 
            +
                  activesupport (= 4.1.9)
         | 
| 81 79 | 
             
                  rake (>= 0.8.7)
         | 
| 82 80 | 
             
                  thor (>= 0.18.1, < 2.0)
         | 
| 83 | 
            -
                rake (10. | 
| 81 | 
            +
                rake (10.4.2)
         | 
| 84 82 | 
             
                rest-client (1.7.2)
         | 
| 85 83 | 
             
                  mime-types (>= 1.16, < 3.0)
         | 
| 86 84 | 
             
                  netrc (~> 0.7)
         | 
| 87 | 
            -
                ruby-progressbar (1. | 
| 85 | 
            +
                ruby-progressbar (1.7.1)
         | 
| 88 86 | 
             
                shoulda (3.5.0)
         | 
| 89 87 | 
             
                  shoulda-context (~> 1.0, >= 1.0.1)
         | 
| 90 88 | 
             
                  shoulda-matchers (>= 1.4.1, < 3.0)
         | 
| 91 89 | 
             
                shoulda-context (1.2.1)
         | 
| 92 90 | 
             
                shoulda-matchers (2.7.0)
         | 
| 93 91 | 
             
                  activesupport (>= 3.0.0)
         | 
| 94 | 
            -
                simplecov (0.9. | 
| 92 | 
            +
                simplecov (0.9.1)
         | 
| 95 93 | 
             
                  docile (~> 1.1.0)
         | 
| 96 | 
            -
                  multi_json
         | 
| 94 | 
            +
                  multi_json (~> 1.0)
         | 
| 97 95 | 
             
                  simplecov-html (~> 0.8.0)
         | 
| 98 96 | 
             
                simplecov-html (0.8.0)
         | 
| 99 | 
            -
                sqlite3 (1.3. | 
| 97 | 
            +
                sqlite3 (1.3.10)
         | 
| 100 98 | 
             
                term-ansicolor (1.3.0)
         | 
| 101 99 | 
             
                  tins (~> 1.0)
         | 
| 102 100 | 
             
                thor (0.19.1)
         | 
| 103 101 | 
             
                thread_safe (0.3.4)
         | 
| 104 | 
            -
                tins (1.3. | 
| 105 | 
            -
                treetop (1.4.15)
         | 
| 106 | 
            -
                  polyglot
         | 
| 107 | 
            -
                  polyglot (>= 0.3.1)
         | 
| 102 | 
            +
                tins (1.3.3)
         | 
| 108 103 | 
             
                tzinfo (1.2.2)
         | 
| 109 104 | 
             
                  thread_safe (~> 0.1)
         | 
| 110 105 |  | 
| @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            PATH
         | 
| 2 2 | 
             
              remote: ../
         | 
| 3 3 | 
             
              specs:
         | 
| 4 | 
            -
                random_unique_id (1.0 | 
| 4 | 
            +
                random_unique_id (1.1.0)
         | 
| 5 5 | 
             
                  activerecord (>= 3.2.0)
         | 
| 6 6 | 
             
                  activesupport (>= 3.2.0)
         | 
| 7 7 |  | 
| @@ -50,7 +50,7 @@ GEM | |
| 50 50 | 
             
                  thor (>= 0.14.0)
         | 
| 51 51 | 
             
                arel (6.0.0)
         | 
| 52 52 | 
             
                builder (3.2.2)
         | 
| 53 | 
            -
                codeclimate-test-reporter (0.4. | 
| 53 | 
            +
                codeclimate-test-reporter (0.4.4)
         | 
| 54 54 | 
             
                  simplecov (>= 0.7.1, < 1.0.0)
         | 
| 55 55 | 
             
                coveralls (0.7.1)
         | 
| 56 56 | 
             
                  multi_json (~> 1.3)
         | 
| @@ -70,7 +70,7 @@ GEM | |
| 70 70 | 
             
                  mime-types (>= 1.16, < 3)
         | 
| 71 71 | 
             
                metaclass (0.0.4)
         | 
| 72 72 | 
             
                mime-types (2.4.3)
         | 
| 73 | 
            -
                mini_portile (0.6. | 
| 73 | 
            +
                mini_portile (0.6.2)
         | 
| 74 74 | 
             
                minitest (5.5.0)
         | 
| 75 75 | 
             
                minitest-rails (2.1.1)
         | 
| 76 76 | 
             
                  minitest (~> 5.4)
         | 
    
        data/lib/random_unique_id.rb
    CHANGED
    
    | @@ -1,5 +1,5 @@ | |
| 1 1 | 
             
            # encoding: UTF-8
         | 
| 2 | 
            -
            # Copyright © 2011, 2012, 2013, 2014, Watu
         | 
| 2 | 
            +
            # Copyright © 2011, 2012, 2013, 2014, 2015, Watu
         | 
| 3 3 |  | 
| 4 4 | 
             
            require "random_unique_id/version"
         | 
| 5 5 | 
             
            require "securerandom"
         | 
| @@ -9,6 +9,27 @@ require "active_record" | |
| 9 9 | 
             
            module RandomUniqueId
         | 
| 10 10 | 
             
              extend ActiveSupport::Concern
         | 
| 11 11 |  | 
| 12 | 
            +
              @@config = nil
         | 
| 13 | 
            +
             | 
| 14 | 
            +
              # The global configuration for RandomUniqueID.
         | 
| 15 | 
            +
              # Set it in initializers
         | 
| 16 | 
            +
              #
         | 
| 17 | 
            +
              #     RandomUniqueId.config(field: :rid,
         | 
| 18 | 
            +
              #                           random_generation_method: :short,
         | 
| 19 | 
            +
              #                           min_rid_length: 5)
         | 
| 20 | 
            +
              #
         | 
| 21 | 
            +
              # @param [Hash] options
         | 
| 22 | 
            +
              # @option options [Symbol] field the name of the field where the random unique id is stored.
         | 
| 23 | 
            +
              # @option options [Symbol] random_generation_method the method to generate random IDs, `:short` or `:uuid`.
         | 
| 24 | 
            +
              #   `:short` will generate a short-ish random ID, and check that it is unique
         | 
| 25 | 
            +
              #   `:uuid` will generate a UUID, and skip the check. This is better for performance, and bad for readability of IDs
         | 
| 26 | 
            +
              # @option options [FixNum] min_rid_length the minimum length RandomUniqueID will generate. Defaults to 5
         | 
| 27 | 
            +
              # @return [Hash] the configuration.
         | 
| 28 | 
            +
              def self.config(options={})
         | 
| 29 | 
            +
                @@config ||= {field: :rid, random_generation_method: :short, min_rid_length: 5}
         | 
| 30 | 
            +
                @@config = @@config.merge(options)
         | 
| 31 | 
            +
              end
         | 
| 32 | 
            +
             | 
| 12 33 | 
             
              # Collection of methods that will end as class methods of ActiveRecord::Base.
         | 
| 13 34 | 
             
              #
         | 
| 14 35 | 
             
              # @see ActiveSupport::Concern
         | 
| @@ -25,10 +46,14 @@ module RandomUniqueId | |
| 25 46 | 
             
                #     has_random_unique_id
         | 
| 26 47 | 
             
                #     # ... other stuff
         | 
| 27 48 | 
             
                #   end
         | 
| 28 | 
            -
                 | 
| 29 | 
            -
             | 
| 30 | 
            -
             | 
| 31 | 
            -
             | 
| 49 | 
            +
                #
         | 
| 50 | 
            +
                # @param options [Hash] generation options, same as RandomUniqueID.config, in case the generation method or minimum
         | 
| 51 | 
            +
                #   length needs to be overridden for one specific model
         | 
| 52 | 
            +
                def has_random_unique_id(options={})
         | 
| 53 | 
            +
                  options = RandomUniqueId.config.merge(options)
         | 
| 54 | 
            +
                  before_validation :populate_rid_field, if: Proc.new { |r| r.send(options[:field]).blank? }
         | 
| 55 | 
            +
                  add_rid_related_validations(options)
         | 
| 56 | 
            +
                  add_rid_related_methods(options)
         | 
| 32 57 | 
             
                end
         | 
| 33 58 |  | 
| 34 59 | 
             
                # Augment the ActiveRecord belongs_to to also define rid accessors. For example: if you blog post belongs_to an
         | 
| @@ -70,9 +95,9 @@ module RandomUniqueId | |
| 70 95 | 
             
                def populate_random_unique_ids
         | 
| 71 96 | 
             
                  find_each do |record|
         | 
| 72 97 | 
             
                    rid_just_populated = false
         | 
| 73 | 
            -
                    if record. | 
| 74 | 
            -
                      record. | 
| 75 | 
            -
                      record.update_column(: | 
| 98 | 
            +
                    if record.send(record.random_unique_id_options[:field]).blank?
         | 
| 99 | 
            +
                      record.populate_rid_field
         | 
| 100 | 
            +
                      record.update_column(record.random_unique_id_options[:field], record.send(record.random_unique_id_options[:field]))
         | 
| 76 101 | 
             
                      rid_just_populated = true
         | 
| 77 102 | 
             
                    end
         | 
| 78 103 | 
             
                    yield(record, rid_just_populated) if block_given?
         | 
| @@ -81,6 +106,20 @@ module RandomUniqueId | |
| 81 106 |  | 
| 82 107 | 
             
                private
         | 
| 83 108 |  | 
| 109 | 
            +
                # Add the rid related methods to the model.
         | 
| 110 | 
            +
                # @param options [Hash] same as in RandomUniqueID.config
         | 
| 111 | 
            +
                def add_rid_related_methods(options)
         | 
| 112 | 
            +
                  define_method(:to_param) { send(options[:field]) }
         | 
| 113 | 
            +
                  define_method(:random_unique_id_options) { options } # I don't think this is the best way to store this, but I didn't find a better one.
         | 
| 114 | 
            +
                end
         | 
| 115 | 
            +
             | 
| 116 | 
            +
                # Add the rid related validations to the model.
         | 
| 117 | 
            +
                # @param options [Hash] same as in RandomUniqueID.config
         | 
| 118 | 
            +
                def add_rid_related_validations(options)
         | 
| 119 | 
            +
                  validates(options[:field], presence: true)
         | 
| 120 | 
            +
                  validates(options[:field], uniqueness: true) if options[:random_generation_method] != :uuid  # If we're generating UUIDs, don't check for uniqueness
         | 
| 121 | 
            +
                end
         | 
| 122 | 
            +
             | 
| 84 123 | 
             
                # Defines the setter and getter for the RID of a relationship.
         | 
| 85 124 | 
             
                #
         | 
| 86 125 | 
             
                # @param related_class [Class] class in which the RID methods are going to be defined.
         | 
| @@ -88,7 +127,7 @@ module RandomUniqueId | |
| 88 127 | 
             
                # @see RandomUniqueId::ClassMethods.belongs_to
         | 
| 89 128 | 
             
                def define_rid_accessors(related_class, relationship_name)
         | 
| 90 129 | 
             
                  define_method("#{relationship_name}_rid") do
         | 
| 91 | 
            -
                    self.send(relationship_name).try(: | 
| 130 | 
            +
                    self.send(relationship_name).try(random_unique_id_options[:field])
         | 
| 92 131 | 
             
                  end
         | 
| 93 132 |  | 
| 94 133 | 
             
                  define_method("#{relationship_name}_rid=") do |rid|
         | 
| @@ -101,43 +140,70 @@ module RandomUniqueId | |
| 101 140 |  | 
| 102 141 | 
             
              # Generate and store the random unique id for the object.
         | 
| 103 142 | 
             
              #
         | 
| 104 | 
            -
              # @param  | 
| 143 | 
            +
              # @param length [Integer] how long should the random string be. Only applicable for `:short` type.
         | 
| 105 144 | 
             
              # @param field [String] name of the field that contains the rid.
         | 
| 106 145 | 
             
              # @return [String] the random string.
         | 
| 107 146 | 
             
              # @see RandomUniqueId::ClassMethods#has_random_unique_id
         | 
| 108 147 | 
             
              # @see RandomUniqueId.generate_random_id
         | 
| 109 | 
            -
              def  | 
| 110 | 
            -
                 | 
| 111 | 
            -
             | 
| 112 | 
            -
             | 
| 113 | 
            -
                   | 
| 114 | 
            -
                     | 
| 115 | 
            -
                   | 
| 116 | 
            -
             | 
| 117 | 
            -
                    klass = k
         | 
| 118 | 
            -
                  end
         | 
| 148 | 
            +
              def populate_rid_field(length=random_unique_id_options[:min_rid_length], field=random_unique_id_options[:field])
         | 
| 149 | 
            +
                case random_unique_id_options[:random_generation_method]
         | 
| 150 | 
            +
                  when :short
         | 
| 151 | 
            +
                    self.send("#{field}=", generate_short_random_unique_id(length, field))
         | 
| 152 | 
            +
                  when :uuid
         | 
| 153 | 
            +
                    self.send("#{field}=", RandomUniqueId.generate_uuid)
         | 
| 154 | 
            +
                  else
         | 
| 155 | 
            +
                    raise "Invalid random generation method: #{self.random_unique_id_options[:random_generation_method]}"
         | 
| 119 156 | 
             
                end
         | 
| 157 | 
            +
              end
         | 
| 120 158 |  | 
| 159 | 
            +
              # Generate random ids, increasing their size, until one is found that is not used for another record in the database.
         | 
| 160 | 
            +
              # @param length [Integer] how long should the random string be.
         | 
| 161 | 
            +
              # @param field [String] name of the field that contains the rid.
         | 
| 162 | 
            +
              def generate_short_random_unique_id(length, field)
         | 
| 163 | 
            +
                potential_unique_random_id = nil
         | 
| 121 164 | 
             
                begin
         | 
| 122 | 
            -
                   | 
| 123 | 
            -
                   | 
| 124 | 
            -
                end while  | 
| 165 | 
            +
                  potential_unique_random_id = RandomUniqueId.generate_short_random_id(length)
         | 
| 166 | 
            +
                  length += 1
         | 
| 167 | 
            +
                end while topmost_model_class.unscoped.where(field => potential_unique_random_id).exists?
         | 
| 168 | 
            +
                potential_unique_random_id
         | 
| 169 | 
            +
              end
         | 
| 170 | 
            +
             | 
| 171 | 
            +
              # Find the topmost class before ActiveRecord::Base so that when we do queries, we don't end up with type=Whatever in
         | 
| 172 | 
            +
              # the where clause.
         | 
| 173 | 
            +
              # @return [Class] the class object
         | 
| 174 | 
            +
              def topmost_model_class
         | 
| 175 | 
            +
                @topmost_model_class ||= begin
         | 
| 176 | 
            +
                  klass = self.class
         | 
| 177 | 
            +
                  self.class.ancestors.select { |k| k.is_a? Class }.each do |k|
         | 
| 178 | 
            +
                    if k == ActiveRecord::Base
         | 
| 179 | 
            +
                      return klass
         | 
| 180 | 
            +
                    end
         | 
| 181 | 
            +
                    klass = k
         | 
| 182 | 
            +
                  end
         | 
| 183 | 
            +
                end
         | 
| 125 184 | 
             
              end
         | 
| 126 185 |  | 
| 127 186 | 
             
              # By a cunning use of SecureRandom.urlsafe_base64, quickly generate an alphanumeric random string.
         | 
| 128 187 | 
             
              #
         | 
| 129 | 
            -
              # @param  | 
| 188 | 
            +
              # @param length [Integer] how long should the random string be.
         | 
| 130 189 | 
             
              # @return [String] the random string.
         | 
| 131 | 
            -
              # @see RandomUniqueId# | 
| 132 | 
            -
              def self. | 
| 190 | 
            +
              # @see RandomUniqueId#populate_rid_field
         | 
| 191 | 
            +
              def self.generate_short_random_id(length=10)
         | 
| 133 192 | 
             
                # IMPORTANT: don't ever generate dashes or underscores in the RIDs as they are likely to end up in the UI in Rails
         | 
| 134 193 | 
             
                # and they'll be converted to something else by jquery ujs or something like that.
         | 
| 135 194 | 
             
                generated_rid = ""
         | 
| 136 | 
            -
                while generated_rid.length <  | 
| 137 | 
            -
                  generated_rid = (generated_rid + SecureRandom.urlsafe_base64( | 
| 195 | 
            +
                while generated_rid.length < length
         | 
| 196 | 
            +
                  generated_rid = (generated_rid + SecureRandom.urlsafe_base64(length * 3).downcase.gsub(/[^a-z0-9]/, ""))[0..(length-1)]
         | 
| 138 197 | 
             
                end
         | 
| 139 198 | 
             
                return generated_rid
         | 
| 140 199 | 
             
              end
         | 
| 200 | 
            +
             | 
| 201 | 
            +
              # Generate a UUID. Just a wrapper around SecureRandom.uuid
         | 
| 202 | 
            +
              # @return [String] the new UUID.
         | 
| 203 | 
            +
              # @see RandomUniqueId#populate_rid_field
         | 
| 204 | 
            +
              def self.generate_uuid
         | 
| 205 | 
            +
                SecureRandom.uuid
         | 
| 206 | 
            +
              end
         | 
| 141 207 | 
             
            end
         | 
| 142 208 |  | 
| 143 209 | 
             
            ActiveRecord::Base.send(:include, RandomUniqueId)
         | 
| @@ -1,4 +1,4 @@ | |
| 1 | 
            -
            # Copyright © 2014, Watu
         | 
| 1 | 
            +
            # Copyright © 2014, 2015, Watu
         | 
| 2 2 |  | 
| 3 3 | 
             
            # Some utilities that might be useful if you are using RandomUniqueId. This file needs to be explicitely included:
         | 
| 4 4 | 
             
            #
         | 
| @@ -35,4 +35,4 @@ module RandomUniqueId::Util | |
| 35 35 | 
             
                    raise "Don't know how to set initial ids for #{sql_connection.adapter_name}. Would you like to contribute? https://github.com/watu/random_unique_id"
         | 
| 36 36 | 
             
                end
         | 
| 37 37 | 
             
              end
         | 
| 38 | 
            -
            end
         | 
| 38 | 
            +
            end
         | 
    
        data/random_unique_id.gemspec
    CHANGED
    
    | @@ -1,5 +1,5 @@ | |
| 1 1 | 
             
            # encoding: UTF-8
         | 
| 2 | 
            -
            # Copyright © 2013, 2014, Watu
         | 
| 2 | 
            +
            # Copyright © 2013, 2014, 2015, Watu
         | 
| 3 3 |  | 
| 4 4 | 
             
            lib = File.expand_path("../lib", __FILE__)
         | 
| 5 5 | 
             
            $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
         | 
| @@ -8,7 +8,7 @@ require "random_unique_id/version" | |
| 8 8 | 
             
            Gem::Specification.new do |spec|
         | 
| 9 9 | 
             
              spec.name          = "random_unique_id"
         | 
| 10 10 | 
             
              spec.version       = RandomUniqueId::VERSION
         | 
| 11 | 
            -
              spec.authors       = ["J. Pablo Fernández"]
         | 
| 11 | 
            +
              spec.authors       = ["J. Pablo Fernández", "Daniel Magliola"]
         | 
| 12 12 | 
             
              spec.email         = ["pupeno@watuapp.com"]
         | 
| 13 13 | 
             
              spec.homepage      = "https://github.com/watu/random_unique_id"
         | 
| 14 14 | 
             
              spec.summary       = %q{Generate random but unique ids for your active record records.}
         | 
| @@ -1,4 +1,4 @@ | |
| 1 | 
            -
            # Copyright © 2014, Watu
         | 
| 1 | 
            +
            # Copyright © 2014, 2015, Watu
         | 
| 2 2 |  | 
| 3 3 | 
             
            require_relative "../test_helper"
         | 
| 4 4 |  | 
| @@ -25,4 +25,4 @@ class RandomUniqueId::UtilTest < MiniTest::Unit::TestCase | |
| 25 25 | 
             
                ActiveRecord::Base.expects(:connection).returns(sql_connection)
         | 
| 26 26 | 
             
                RandomUniqueId::Util.set_initial_ids
         | 
| 27 27 | 
             
              end
         | 
| 28 | 
            -
            end
         | 
| 28 | 
            +
            end
         | 
| @@ -1,5 +1,5 @@ | |
| 1 1 | 
             
            # encoding: UTF-8
         | 
| 2 | 
            -
            # Copyright © 2011, 2012, 2013, 2014, Watu
         | 
| 2 | 
            +
            # Copyright © 2011, 2012, 2013, 2014, 2015, Watu
         | 
| 3 3 |  | 
| 4 4 | 
             
            require_relative "test_helper"
         | 
| 5 5 |  | 
| @@ -18,6 +18,20 @@ ActiveRecord::Schema.define(version: 0) do | |
| 18 18 | 
             
                t.integer :blog_id
         | 
| 19 19 | 
             
              end
         | 
| 20 20 | 
             
              add_index :posts, :rid, unique: true
         | 
| 21 | 
            +
             | 
| 22 | 
            +
              create_table :comments do |t|
         | 
| 23 | 
            +
                t.string :random_id
         | 
| 24 | 
            +
                t.string :text
         | 
| 25 | 
            +
                t.integer :post_id
         | 
| 26 | 
            +
              end
         | 
| 27 | 
            +
              add_index :comments, :random_id, unique: true
         | 
| 28 | 
            +
             | 
| 29 | 
            +
              create_table :post_views do |t|
         | 
| 30 | 
            +
                t.string :rid
         | 
| 31 | 
            +
                t.string :ip_address
         | 
| 32 | 
            +
                t.integer :post_id
         | 
| 33 | 
            +
              end
         | 
| 34 | 
            +
              add_index :post_views, :rid # NOT unique, for performance, it'll store UUIDs so we don't need to check
         | 
| 21 35 | 
             
            end
         | 
| 22 36 |  | 
| 23 37 | 
             
            class Blog < ActiveRecord::Base
         | 
| @@ -25,6 +39,28 @@ class Blog < ActiveRecord::Base | |
| 25 39 | 
             
              has_random_unique_id
         | 
| 26 40 | 
             
            end
         | 
| 27 41 |  | 
| 42 | 
            +
            class BlogWithInvalidGenerationMethod < ActiveRecord::Base
         | 
| 43 | 
            +
              self.table_name = "blogs"
         | 
| 44 | 
            +
              has_random_unique_id(random_generation_method: :invalid) # Used to test the exception when you specify the wrong method
         | 
| 45 | 
            +
            end
         | 
| 46 | 
            +
             | 
| 47 | 
            +
            original_config = RandomUniqueId.config
         | 
| 48 | 
            +
            RandomUniqueId.config(random_generation_method: :uuid)
         | 
| 49 | 
            +
             | 
| 50 | 
            +
            class BlogWithUuid < ActiveRecord::Base
         | 
| 51 | 
            +
              self.table_name = "blogs"
         | 
| 52 | 
            +
              has_random_unique_id
         | 
| 53 | 
            +
            end
         | 
| 54 | 
            +
             | 
| 55 | 
            +
            RandomUniqueId.config(random_generation_method: :short, min_rid_length: 12)
         | 
| 56 | 
            +
             | 
| 57 | 
            +
            class BlogWithLongRid < ActiveRecord::Base
         | 
| 58 | 
            +
              self.table_name = "blogs"
         | 
| 59 | 
            +
              has_random_unique_id
         | 
| 60 | 
            +
            end
         | 
| 61 | 
            +
             | 
| 62 | 
            +
            RandomUniqueId.config(original_config)
         | 
| 63 | 
            +
             | 
| 28 64 | 
             
            class Post < ActiveRecord::Base
         | 
| 29 65 | 
             
              belongs_to :blog
         | 
| 30 66 | 
             
              has_random_unique_id
         | 
| @@ -36,6 +72,15 @@ end | |
| 36 72 | 
             
            class ImagePost < Post
         | 
| 37 73 | 
             
            end
         | 
| 38 74 |  | 
| 75 | 
            +
            class Comment < ActiveRecord::Base
         | 
| 76 | 
            +
              belongs_to :post
         | 
| 77 | 
            +
              has_random_unique_id(field: :random_id, min_rid_length: 10) # Comments have longer RIDs, since it's a big table and we were getting lots of collissions
         | 
| 78 | 
            +
            end
         | 
| 79 | 
            +
             | 
| 80 | 
            +
            class PostView < ActiveRecord::Base
         | 
| 81 | 
            +
              belongs_to :post
         | 
| 82 | 
            +
              has_random_unique_id(random_generation_method: :uuid) # Post Views have UUIDs instead of RIDs, since the table is ginormous, so it can't check for existence every time.
         | 
| 83 | 
            +
            end
         | 
| 39 84 |  | 
| 40 85 | 
             
            class RandomUniqueIdTest < MiniTest::Unit::TestCase
         | 
| 41 86 | 
             
              context "With a record with random id" do
         | 
| @@ -51,9 +96,9 @@ class RandomUniqueIdTest < MiniTest::Unit::TestCase | |
| 51 96 |  | 
| 52 97 | 
             
                should "resolve random id collision" do
         | 
| 53 98 | 
             
                  # Mock RandomUniqueId to return a collision on the first call, and hopefully a non collision on the second, expecting n to grow by one.
         | 
| 54 | 
            -
                  RandomUniqueId.expects(: | 
| 99 | 
            +
                  RandomUniqueId.expects(:generate_short_random_id).with(5).returns(@text_post.rid)
         | 
| 55 100 | 
             
                  new_rid = @text_post.rid + "i"
         | 
| 56 | 
            -
                  RandomUniqueId.expects(: | 
| 101 | 
            +
                  RandomUniqueId.expects(:generate_short_random_id).with(6).returns(new_rid)
         | 
| 57 102 |  | 
| 58 103 | 
             
                  new_record = TextPost.create! # No exception should be raised.
         | 
| 59 104 | 
             
                  assert_equal new_rid, new_record.rid
         | 
| @@ -61,9 +106,9 @@ class RandomUniqueIdTest < MiniTest::Unit::TestCase | |
| 61 106 |  | 
| 62 107 | 
             
                should "resolve random id collision in different classes of the same table (due to STI)" do
         | 
| 63 108 | 
             
                  # Mock RandomUniqueId to return a collision on the first call, and hopefully a non collision on the second, expecting n to grow by one.
         | 
| 64 | 
            -
                  RandomUniqueId.expects(: | 
| 109 | 
            +
                  RandomUniqueId.expects(:generate_short_random_id).with(5).returns(@text_post.rid)
         | 
| 65 110 | 
             
                  new_rid = @text_post.rid + "i"
         | 
| 66 | 
            -
                  RandomUniqueId.expects(: | 
| 111 | 
            +
                  RandomUniqueId.expects(:generate_short_random_id).with(6).returns(new_rid)
         | 
| 67 112 |  | 
| 68 113 | 
             
                  new_record = ImagePost.create! # No exception should be raised.
         | 
| 69 114 | 
             
                  assert_equal new_rid, new_record.rid
         | 
| @@ -80,18 +125,76 @@ class RandomUniqueIdTest < MiniTest::Unit::TestCase | |
| 80 125 | 
             
                end
         | 
| 81 126 |  | 
| 82 127 | 
             
                should "populate a table with rids" do
         | 
| 83 | 
            -
                  # Create a bunch of blogs without rid by manually inserting them into the  | 
| 128 | 
            +
                  # Create a bunch of blogs without rid by manually inserting them into the table.
         | 
| 84 129 | 
             
                  rid_less_records = 10
         | 
| 85 130 | 
             
                  5.times { Blog.create! }
         | 
| 86 131 | 
             
                  existing_rids = Blog.all.map(&:rid).compact
         | 
| 87 132 | 
             
                  rid_less_records.times { Blog.connection.execute("INSERT INTO blogs (name) VALUES ('Blag')") }
         | 
| 88 | 
            -
                  assert_equal rid_less_records, Blog.where(: | 
| 133 | 
            +
                  assert_equal rid_less_records, Blog.where(rid: nil).count # Just to be sure this test is being effective.
         | 
| 89 134 |  | 
| 90 135 | 
             
                  rids_populated = 0
         | 
| 91 136 | 
             
                  Blog.populate_random_unique_ids { |_, rid_just_populated| rids_populated += 1 if rid_just_populated }
         | 
| 92 137 | 
             
                  assert_equal rid_less_records, rids_populated
         | 
| 93 | 
            -
                  assert_equal 0, Blog.where(: | 
| 94 | 
            -
                  assert_equal existing_rids.count, Blog.where(: | 
| 138 | 
            +
                  assert_equal 0, Blog.where(rid: nil).count
         | 
| 139 | 
            +
                  assert_equal existing_rids.count, Blog.where(rid: existing_rids).count # Make sure the existing rids where not touched.
         | 
| 140 | 
            +
                end
         | 
| 141 | 
            +
             | 
| 142 | 
            +
                should "populate a table with rids with custom field name" do
         | 
| 143 | 
            +
                  # Create a bunch of comments without rid by manually inserting them into the table
         | 
| 144 | 
            +
                  rid_less_records = 10
         | 
| 145 | 
            +
                  blog = Blog.create!
         | 
| 146 | 
            +
                  post = Post.create!(blog: blog)
         | 
| 147 | 
            +
                  5.times { Comment.create!(post: post) }
         | 
| 148 | 
            +
                  existing_rids = Comment.all.map(&:random_id).compact
         | 
| 149 | 
            +
                  rid_less_records.times { Comment.connection.execute("INSERT INTO comments (post_id) VALUES (#{post.id})") }
         | 
| 150 | 
            +
                  assert_equal rid_less_records, Comment.where(random_id: nil).count # Just to be sure this test is being effective.
         | 
| 151 | 
            +
             | 
| 152 | 
            +
                  rids_populated = 0
         | 
| 153 | 
            +
                  Comment.populate_random_unique_ids { |_, rid_just_populated| rids_populated += 1 if rid_just_populated }
         | 
| 154 | 
            +
                  assert_equal rid_less_records, rids_populated
         | 
| 155 | 
            +
                  assert_equal 0, Comment.where(random_id: nil).count
         | 
| 156 | 
            +
                  assert_equal existing_rids.count, Comment.where(random_id: existing_rids).count # Make sure the existing rids where not touched.
         | 
| 157 | 
            +
                end
         | 
| 158 | 
            +
              end
         | 
| 159 | 
            +
             | 
| 160 | 
            +
              context "With an invalid generation method" do
         | 
| 161 | 
            +
                should "Raise exception on RID geneartion" do
         | 
| 162 | 
            +
                  assert_raises RuntimeError do
         | 
| 163 | 
            +
                    BlogWithInvalidGenerationMethod.create!
         | 
| 164 | 
            +
                  end
         | 
| 165 | 
            +
                end
         | 
| 166 | 
            +
              end
         | 
| 167 | 
            +
             | 
| 168 | 
            +
              # Tests for configuration options, both global and model overrides
         | 
| 169 | 
            +
              context "With a global configuration for UUIDs" do
         | 
| 170 | 
            +
                should "generate UUID" do
         | 
| 171 | 
            +
                  blog = BlogWithUuid.create!
         | 
| 172 | 
            +
                  assert_match /(\w{8}(-\w{4}){3}-\w{12}?)/, blog.rid
         | 
| 173 | 
            +
                end
         | 
| 174 | 
            +
              end
         | 
| 175 | 
            +
             | 
| 176 | 
            +
              context "With a global configuration for long RIDs" do
         | 
| 177 | 
            +
                should "generate long RID" do
         | 
| 178 | 
            +
                  blog = BlogWithLongRid.create!
         | 
| 179 | 
            +
                  assert blog.rid.length >= 12, "RID must be at least 12 chars long"
         | 
| 180 | 
            +
                  assert !(blog.rid =~ /(\w{8}(-\w{4}){3}-\w{12}?)/), "RID must not be a UUID"
         | 
| 181 | 
            +
                end
         | 
| 182 | 
            +
              end
         | 
| 183 | 
            +
             | 
| 184 | 
            +
              context "With models that have overrides for RID configuration" do
         | 
| 185 | 
            +
                should "Generate short RID for normal model" do
         | 
| 186 | 
            +
                  blog = Blog.create!
         | 
| 187 | 
            +
                  assert_equal 5, blog.rid.length
         | 
| 188 | 
            +
                end
         | 
| 189 | 
            +
             | 
| 190 | 
            +
                should "Generate long RID for model that requested min_rid_length" do
         | 
| 191 | 
            +
                  comment = Comment.create!
         | 
| 192 | 
            +
                  assert_equal 10, comment.random_id.length
         | 
| 193 | 
            +
                end
         | 
| 194 | 
            +
             | 
| 195 | 
            +
                should "Generate UUID for model that requested UUID random_generation_method" do
         | 
| 196 | 
            +
                  postview = PostView.create!
         | 
| 197 | 
            +
                  assert_match /(\w{8}(-\w{4}){3}-\w{12}?)/, postview.rid
         | 
| 95 198 | 
             
                end
         | 
| 96 199 | 
             
              end
         | 
| 97 200 | 
             
            end
         | 
    
        data/test/test_helper.rb
    CHANGED
    
    
    
        metadata
    CHANGED
    
    | @@ -1,14 +1,15 @@ | |
| 1 1 | 
             
            --- !ruby/object:Gem::Specification
         | 
| 2 2 | 
             
            name: random_unique_id
         | 
| 3 3 | 
             
            version: !ruby/object:Gem::Version
         | 
| 4 | 
            -
              version: 1.0 | 
| 4 | 
            +
              version: 1.1.0
         | 
| 5 5 | 
             
            platform: ruby
         | 
| 6 6 | 
             
            authors:
         | 
| 7 7 | 
             
            - J. Pablo Fernández
         | 
| 8 | 
            +
            - Daniel Magliola
         | 
| 8 9 | 
             
            autorequire: 
         | 
| 9 10 | 
             
            bindir: bin
         | 
| 10 11 | 
             
            cert_chain: []
         | 
| 11 | 
            -
            date:  | 
| 12 | 
            +
            date: 2015-01-07 00:00:00.000000000 Z
         | 
| 12 13 | 
             
            dependencies:
         | 
| 13 14 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 14 15 | 
             
              name: activesupport
         |