faker 2.0.0 → 2.2.1

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.
Files changed (53) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +72 -1
  3. data/README.md +3 -3
  4. data/lib/faker.rb +22 -1
  5. data/lib/faker/books/dune.rb +12 -2
  6. data/lib/faker/books/lovecraft.rb +54 -7
  7. data/lib/faker/default/address.rb +30 -5
  8. data/lib/faker/default/alphanumeric.rb +45 -7
  9. data/lib/faker/default/app.rb +16 -1
  10. data/lib/faker/default/avatar.rb +24 -1
  11. data/lib/faker/default/bank.rb +12 -2
  12. data/lib/faker/default/boolean.rb +6 -1
  13. data/lib/faker/default/chile_rut.rb +20 -2
  14. data/lib/faker/default/code.rb +22 -3
  15. data/lib/faker/default/commerce.rb +26 -3
  16. data/lib/faker/default/company.rb +12 -2
  17. data/lib/faker/default/crypto_coin.rb +18 -3
  18. data/lib/faker/default/date.rb +48 -5
  19. data/lib/faker/default/demographic.rb +6 -1
  20. data/lib/faker/default/driving_licence.rb +20 -4
  21. data/lib/faker/default/file.rb +36 -2
  22. data/lib/faker/default/fillmurray.rb +16 -1
  23. data/lib/faker/default/finance.rb +6 -1
  24. data/lib/faker/default/hipster.rb +78 -6
  25. data/lib/faker/default/id_number.rb +50 -3
  26. data/lib/faker/default/internet.rb +124 -13
  27. data/lib/faker/default/invoice.rb +22 -3
  28. data/lib/faker/default/json.rb +26 -2
  29. data/lib/faker/default/lorem.rb +120 -10
  30. data/lib/faker/default/lorem_flickr.rb +69 -5
  31. data/lib/faker/default/lorem_pixel.rb +26 -1
  32. data/lib/faker/default/markdown.rb +10 -1
  33. data/lib/faker/default/measurement.rb +48 -8
  34. data/lib/faker/default/name.rb +6 -1
  35. data/lib/faker/default/nhs.rb +6 -1
  36. data/lib/faker/default/number.rb +81 -11
  37. data/lib/faker/default/omniauth.rb +84 -5
  38. data/lib/faker/default/phone_number.rb +6 -1
  39. data/lib/faker/default/placeholdit.rb +24 -1
  40. data/lib/faker/default/relationship.rb +6 -1
  41. data/lib/faker/default/source.rb +22 -3
  42. data/lib/faker/default/string.rb +6 -1
  43. data/lib/faker/default/stripe.rb +24 -4
  44. data/lib/faker/default/time.rb +68 -4
  45. data/lib/faker/default/twitter.rb +26 -3
  46. data/lib/faker/default/types.rb +38 -5
  47. data/lib/faker/default/vehicle.rb +22 -3
  48. data/lib/faker/default/world_cup.rb +16 -2
  49. data/lib/faker/games/dota.rb +6 -1
  50. data/lib/faker/movies/star_wars.rb +6 -1
  51. data/lib/faker/version.rb +1 -1
  52. data/lib/locales/en.yml +0 -47
  53. metadata +11 -11
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 47e80b0db2c95dc07b57900ec22d899657ee065a31d5ffa4231d9479751432e6
4
- data.tar.gz: 32da6133cc0f73f2f2b56e6ab92ac8e32ec4d4242f081c430b27db4875de5cfb
3
+ metadata.gz: b5587b3da998c6565466a5886c285dc46218d0c6be32bbc9d1578b2493ccca0a
4
+ data.tar.gz: da07c93a781ccaf2f57b79a220f05905913b11261d6c324ab54e63f7c4f757d3
5
5
  SHA512:
6
- metadata.gz: 4871c05928f0c9d4fc712cb16a0955d60b4981adca2bbb68618d613f2b667fbff8529a87ffe8c699224bf7e071db7daf772b572ed7186a38fbb2e5e851eac808
7
- data.tar.gz: '09425b5b42045fb7b8fe900ddc700b4a6489568bba018b9bfd2c8ef31798eaea6e332a217cfa03fca0df935bb8f0445fc87afc3a1fe8f87fa3ea75e40046b983'
6
+ metadata.gz: e5e2770457c5eabde0476cbb1a6cd320c633ceb0dbb734636569dbd84471df2d85f47f1664f597a65ccfedda1af67340904b2cf64e3798edfa83481d11015a39
7
+ data.tar.gz: 16721c3cd11278e59c6df91b5a99f507c938e705d1eb9e20bd2fb26811819b5c781abf639d7ac8ab79b11ee3d7fea56c7d7ef876054c177e597116a967c41375
data/CHANGELOG.md CHANGED
@@ -1,6 +1,77 @@
1
1
  # Change Log
2
2
 
3
- ## [v2.0](https://github.com/stympy/faker/tree/2.0) (2019-31-07)
3
+ ## [v2.2.1](https://github.com/faker-ruby/faker/tree/v2.2.1) (2019-30-08)
4
+
5
+ ## Bug/Fixes
6
+
7
+ - [PR #1712](https://github.com/faker-ruby/faker/pull/1712) Fix number(digits: 1) always returns 0 [@ianlet](https://github.com/ianlet)
8
+
9
+ `Faker::Number.number(digits: 1)` was always returning `0`.
10
+
11
+ Fixing number with one digit caused the test_insignificant_zero to fail. As it seemed that the behavior tested by test_insignificant_zero was already covered by test_number and test_decimal, we removed it to prevent duplication.
12
+
13
+ ## [v2.2.0](https://github.com/faker-ruby/faker/tree/v2.2.0) (2019-25-08)
14
+
15
+ ## Deprecate
16
+
17
+ - [PR #1698](https://github.com/faker-ruby/faker/pull/1698) Add warn for positional arguments when using Faker 2.0 [@koic](https://github.com/koic)
18
+
19
+ Add deprecation warning for positional arguments to notify users that are coming from Faker version < 2.0. Its main goal is to make upgrades easier.
20
+
21
+ ## Documentation
22
+
23
+ - [PR #1688](https://github.com/faker-ruby/faker/pull/1688) Update README install instructions [@EduardoGHdez](https://github.com/EduardoGHdez)
24
+ - [PR #1689](https://github.com/faker-ruby/faker/pull/1689) Update README.md [@Zeragamba](https://github.com/Zeragamba)
25
+ - [PR #1690](https://github.com/faker-ruby/faker/pull/1690) Update issue url in PULL_REQUEST_TEMPLATE [@bugtender](https://github.com/bugtender)
26
+ - [PR #1703](https://github.com/faker-ruby/faker/pull/1703) Return HTTPS URLs from Lorem Flickr [@connorshea](https://github.com/connorshea)
27
+
28
+ ## Feature Request
29
+ - [PR #1686](https://github.com/faker-ruby/faker/pull/1686) Update test-unit gem to 3.3.3 [@connorshea](https://github.com/connorshea)
30
+
31
+ ## Bug/Fixes
32
+ - [PR #1702](https://github.com/faker-ruby/faker/pull/1702) Fix an argument for test_faker_stripe.rb [@koic](https://github.com/koic)
33
+ - [PR #1694](https://github.com/faker-ruby/faker/pull/1694) Ensure mix_case returns at least one lower and one upper case letter [@bpleslie](https://github.com/bpleslie)
34
+
35
+ ------------------------------------------------------------------------------
36
+
37
+ ## [v2.1.2](https://github.com/faker-ruby/faker/tree/v2.1.2) (2019-10-08)
38
+
39
+ ## Enhancements
40
+
41
+ - [PR #1495](https://github.com/faker-ruby/faker/pull/1495) Add Brazilian documents generation and documentation [@lucasqueiroz](https://github.com/lucasqueiroz)
42
+
43
+ ## Issues
44
+
45
+ We had to use `bundled with 1.7.3` to avoid some issues.
46
+
47
+ ## [v2.1.1](https://github.com/faker-ruby/faker/tree/2.1.1) (2019-10-08)
48
+
49
+ ## Bug/Fixes
50
+
51
+ - [PR #1685](https://github.com/stympy/faker/pull/1685) Upgrade i18n [@EduardoGHdez](https://github.com/EduardoGHdez)
52
+
53
+ `bundler-audit` has identified that i18 has fix a security vulnerability, that has been fixed in the 0.8 version.
54
+
55
+ - [PR #1683](https://github.com/stympy/faker/pull/1683) Rollback Faker::Time changes [@vbrazo](https://github.com/vbrazo)
56
+
57
+ Rollback Faker::Time changes because we should expect the date format from activesupport's en.yml.
58
+
59
+ ## Documentation
60
+
61
+ - [PR #1677](https://github.com/faker-ruby/faker/pull/1677) Fix docs for Internet#password generator [@ur5us](https://github.com/ur5us)
62
+
63
+ ------------------------------------------------------------------------------
64
+
65
+ ## [v2.1.0](https://github.com/faker-ruby/faker/tree/v2.1.0) (2019-31-07)
66
+
67
+ ## Bug/Fixes
68
+ - [PR #1675](https://github.com/faker-ruby/faker/pull/1675) Fix off-by-one error when formatting month names [@jutonz](https://github.com/jutonz)
69
+
70
+ This change required a quick release because it's a breaking issue. Every place where I18n.l() was used began to display the wrong date, causing test suite to fail.
71
+
72
+ ------------------------------------------------------------------------------
73
+
74
+ ## [v2.0](https://github.com/faker-ruby/faker/tree/v2.0) (2019-31-07)
4
75
 
5
76
  ## Important Note:
6
77
 
data/README.md CHANGED
@@ -2,7 +2,7 @@
2
2
  ![logotype a happy-07](https://user-images.githubusercontent.com/36028424/40263395-4318481e-5b44-11e8-92e5-3dcc1ce169b3.png)
3
3
 
4
4
  # Faker
5
- [![Build Status](https://travis-ci.org/stympy/faker.svg?branch=master)](https://travis-ci.org/stympy/faker)
5
+ [![Build Status](https://travis-ci.org/faker-ruby/faker.svg?branch=master)](https://travis-ci.org/faker-ruby/faker)
6
6
  [![Gem Version](https://badge.fury.io/rb/faker.svg)](https://badge.fury.io/rb/faker)
7
7
  [![Inline docs](http://inch-ci.org/github/stympy/faker.svg?branch=master)](http://inch-ci.org/github/stympy/faker)
8
8
  [![Test Coverage](https://api.codeclimate.com/v1/badges/ef54c7f9df86e965d64b/test_coverage)](https://codeclimate.com/github/stympy/faker/test_coverage)
@@ -55,7 +55,7 @@ gem install faker
55
55
  Note: if you are getting a `uninitialized constant Faker::[some_class]` error, your version of the gem is behind the one documented here. To make sure that your gem is the one documented here, change the line in your Gemfile to:
56
56
 
57
57
  ```ruby
58
- gem 'faker', :git => 'https://github.com/stympy/faker.git', :branch => 'master'
58
+ gem 'faker', :git => 'https://github.com/faker-ruby/faker.git', :branch => 'master'
59
59
  ```
60
60
 
61
61
  ## Usage
@@ -117,7 +117,7 @@ Faker::Company.bs #=> "cultivate viral synergies"
117
117
  **NOTE: Some of the generators below aren't released yet. If you want to use them, change the line in your gemfile to:**
118
118
 
119
119
  ```ruby
120
- gem 'faker', :git => 'https://github.com/stympy/faker.git', :branch => 'master'
120
+ gem 'faker', :git => 'https://github.com/faker-ruby/faker.git', :branch => 'master'
121
121
  ```
122
122
 
123
123
  ### Default
data/lib/faker.rb CHANGED
@@ -40,9 +40,12 @@ module Faker
40
40
  class Base
41
41
  Numbers = Array(0..9)
42
42
  ULetters = Array('A'..'Z')
43
- Letters = ULetters + Array('a'..'z')
43
+ LLetters = Array('a'..'z')
44
+ Letters = ULetters + LLetters
44
45
 
45
46
  class << self
47
+ NOT_GIVEN = Object.new
48
+
46
49
  ## by default numerify results do not start with a zero
47
50
  def numerify(number_string, leading_zero: false)
48
51
  return number_string.gsub(/#/) { rand(10).to_s } if leading_zero
@@ -245,6 +248,24 @@ module Faker
245
248
  ensure
246
249
  I18n.enforce_available_locales = old_enforce_available_locales
247
250
  end
251
+
252
+ private
253
+
254
+ # Workaround for emulating `warn '...', uplevel: 1` in Ruby 2.4 or lower.
255
+ def warn_with_uplevel(message, uplevel: 1)
256
+ at = parse_caller(caller[uplevel]).join(':')
257
+ warn "#{at}: #{message}"
258
+ end
259
+
260
+ def parse_caller(at)
261
+ # rubocop:disable Style/GuardClause
262
+ if /^(.+?):(\d+)(?::in `.*')?/ =~ at
263
+ file = Regexp.last_match(1)
264
+ line = Regexp.last_match(2).to_i
265
+ [file, line]
266
+ end
267
+ # rubocop:enable Style/GuardClause
268
+ end
248
269
  end
249
270
  end
250
271
  end
@@ -19,7 +19,12 @@ module Faker
19
19
  fetch('dune.planets')
20
20
  end
21
21
 
22
- def quote(character: nil)
22
+ def quote(legacy_character = NOT_GIVEN, character: nil)
23
+ if legacy_character != NOT_GIVEN
24
+ warn_with_uplevel 'Passing `character` with the 1st argument of `Dune.quote` is deprecated. Use keyword argument like `Dune.quote(character: ...)` instead.', uplevel: 1
25
+ character = legacy_character
26
+ end
27
+
23
28
  quoted_characters = translate('faker.dune.quotes').keys
24
29
 
25
30
  if character.nil?
@@ -36,7 +41,12 @@ module Faker
36
41
  fetch('dune.quotes.' + character)
37
42
  end
38
43
 
39
- def saying(source: nil)
44
+ def saying(legacy_source = NOT_GIVEN, source: nil)
45
+ if legacy_source != NOT_GIVEN
46
+ warn_with_uplevel 'Passing `source` with the 1st argument of `Dune.saying` is deprecated. Use keyword argument like `Dune.saying(source: ...)` instead.', uplevel: 1
47
+ source = legacy_source
48
+ end
49
+
40
50
  sourced_sayings = translate('faker.dune.sayings').keys
41
51
 
42
52
  if source.nil?
@@ -8,7 +8,12 @@ module Faker
8
8
  fetch('lovecraft.location')
9
9
  end
10
10
 
11
- def fhtagn(number: 1)
11
+ def fhtagn(legacy_number = NOT_GIVEN, number: 1)
12
+ if legacy_number != NOT_GIVEN
13
+ warn_with_uplevel 'Passing `number` with the 1st argument of `Lovecraft.fhtagn` is deprecated. Use keyword argument like `Lovecraft.fhtagn(number: ...)` instead.', uplevel: 1
14
+ number = legacy_number
15
+ end
16
+
12
17
  Array.new(number) { fetch('lovecraft.fhtagn') }.join('. ')
13
18
  end
14
19
 
@@ -20,7 +25,16 @@ module Faker
20
25
  fetch('lovecraft.tome')
21
26
  end
22
27
 
23
- def sentence(word_count: 4, random_words_to_add: 6)
28
+ def sentence(legacy_word_count = NOT_GIVEN, legacy_random_words_to_add = NOT_GIVEN, word_count: 4, random_words_to_add: 6)
29
+ if legacy_word_count != NOT_GIVEN
30
+ warn_with_uplevel 'Passing `word_count` with the 1st argument of `Lovecraft.sentence` is deprecated. Use keyword argument like `Lovecraft.sentence(word_count: ...)` instead.', uplevel: 1
31
+ word_count = legacy_word_count
32
+ end
33
+ if legacy_random_words_to_add != NOT_GIVEN
34
+ warn_with_uplevel 'Passing `random_words_to_add` with the 2nd argument of `Lovecraft.sentence` is deprecated. Use keyword argument like `Lovecraft.sentence(random_words_to_add: ...)` instead.', uplevel: 1
35
+ random_words_to_add = legacy_random_words_to_add
36
+ end
37
+
24
38
  words(number: word_count + rand(random_words_to_add.to_i).to_i, spaces_allowed: true).join(' ').capitalize + '.'
25
39
  end
26
40
 
@@ -29,7 +43,16 @@ module Faker
29
43
  random_word =~ /\s/ ? word : random_word
30
44
  end
31
45
 
32
- def words(number: 3, spaces_allowed: false)
46
+ def words(legacy_number = NOT_GIVEN, legacy_spaces_allowed = NOT_GIVEN, number: 3, spaces_allowed: false)
47
+ if legacy_number != NOT_GIVEN
48
+ warn_with_uplevel 'Passing `number` with the 1st argument of `Lovecraft.words` is deprecated. Use keyword argument like `Lovecraft.words(number: ...)` instead.', uplevel: 1
49
+ number = legacy_number
50
+ end
51
+ if legacy_spaces_allowed != NOT_GIVEN
52
+ warn_with_uplevel 'Passing `spaces_allowed` with the 2nd argument of `Lovecraft.words` is deprecated. Use keyword argument like `Lovecraft.words(spaces_allowed: ...)` instead.', uplevel: 1
53
+ spaces_allowed = legacy_spaces_allowed
54
+ end
55
+
33
56
  resolved_num = resolve(number)
34
57
  word_list = translate('faker.lovecraft.words')
35
58
  word_list *= ((resolved_num / word_list.length) + 1)
@@ -40,7 +63,12 @@ module Faker
40
63
  words.each_with_index { |w, i| words[i] = word if w =~ /\s/ }
41
64
  end
42
65
 
43
- def sentences(number: 3)
66
+ def sentences(legacy_number = NOT_GIVEN, number: 3)
67
+ if legacy_number != NOT_GIVEN
68
+ warn_with_uplevel 'Passing `number` with the 1st argument of `Lovecraft.sentences` is deprecated. Use keyword argument like `Lovecraft.sentences(number: ...)` instead.', uplevel: 1
69
+ number = legacy_number
70
+ end
71
+
44
72
  [].tap do |sentences|
45
73
  1.upto(resolve(number)) do
46
74
  sentences << sentence(word_count: 3)
@@ -48,11 +76,25 @@ module Faker
48
76
  end
49
77
  end
50
78
 
51
- def paragraph(sentence_count: 3, random_sentences_to_add: 3)
79
+ def paragraph(legacy_sentence_count = NOT_GIVEN, legacy_random_sentences_to_add = NOT_GIVEN, sentence_count: 3, random_sentences_to_add: 3)
80
+ if legacy_sentence_count != NOT_GIVEN
81
+ warn_with_uplevel 'Passing `sentence_count` with the 1st argument of `Lovecraft.paragraph` is deprecated. Use keyword argument like `Lovecraft.paragraph(sentence_count: ...)` instead.', uplevel: 1
82
+ sentence_count = legacy_sentence_count
83
+ end
84
+ if legacy_random_sentences_to_add != NOT_GIVEN
85
+ warn_with_uplevel 'Passing `random_sentences_to_add` with the 2nd argument of `Lovecraft.paragraph` is deprecated. Use keyword argument like `Lovecraft.paragraph(random_sentences_to_add: ...)` instead.', uplevel: 1
86
+ random_sentences_to_add = legacy_random_sentences_to_add
87
+ end
88
+
52
89
  sentences(number: resolve(sentence_count) + rand(random_sentences_to_add.to_i).to_i).join(' ')
53
90
  end
54
91
 
55
- def paragraphs(number: 3)
92
+ def paragraphs(legacy_number = NOT_GIVEN, number: 3)
93
+ if legacy_number != NOT_GIVEN
94
+ warn_with_uplevel 'Passing `number` with the 1st argument of `Lovecraft.paragraphs` is deprecated. Use keyword argument like `Lovecraft.paragraphs(number: ...)` instead.', uplevel: 1
95
+ number = legacy_number
96
+ end
97
+
56
98
  [].tap do |paragraphs|
57
99
  1.upto(resolve(number)) do
58
100
  paragraphs << paragraph(sentence_count: 3)
@@ -60,7 +102,12 @@ module Faker
60
102
  end
61
103
  end
62
104
 
63
- def paragraph_by_chars(characters: 256)
105
+ def paragraph_by_chars(legacy_characters = NOT_GIVEN, characters: 256)
106
+ if legacy_characters != NOT_GIVEN
107
+ warn_with_uplevel 'Passing `characters` with the 1st argument of `Lovecraft.paragraph_by_chars` is deprecated. Use keyword argument like `Lovecraft.paragraph_by_chars(characters: ...)` instead.', uplevel: 1
108
+ characters = legacy_characters
109
+ end
110
+
64
111
  paragraph = paragraph(sentence_count: 3)
65
112
 
66
113
  paragraph += ' ' + paragraph(sentence_count: 3) while paragraph.length < characters
@@ -5,7 +5,12 @@ module Faker
5
5
  flexible :address
6
6
 
7
7
  class << self
8
- def city(options: {})
8
+ def city(legacy_options = NOT_GIVEN, options: {})
9
+ if legacy_options != NOT_GIVEN
10
+ warn_with_uplevel 'Passing `options` with the 1st argument of `Address.city` is deprecated. Use keyword argument like `Address.city(options: ...)` instead.', uplevel: 1
11
+ options = legacy_options
12
+ end
13
+
9
14
  parse(options[:with_state] ? 'address.city_with_state' : 'address.city')
10
15
  end
11
16
 
@@ -13,7 +18,12 @@ module Faker
13
18
  parse('address.street_name')
14
19
  end
15
20
 
16
- def street_address(include_secondary: false)
21
+ def street_address(legacy_include_secondary = NOT_GIVEN, include_secondary: false)
22
+ if legacy_include_secondary != NOT_GIVEN
23
+ warn_with_uplevel 'Passing `include_secondary` with the 1st argument of `Address.street_address` is deprecated. Use keyword argument like `Address.street_address(include_secondary: ...)` instead.', uplevel: 1
24
+ include_secondary = legacy_include_secondary
25
+ end
26
+
17
27
  numerify(parse('address.street_address') + (include_secondary ? ' ' + secondary_address : ''))
18
28
  end
19
29
 
@@ -29,7 +39,12 @@ module Faker
29
39
  parse('address.community')
30
40
  end
31
41
 
32
- def zip_code(state_abbreviation: '')
42
+ def zip_code(legacy_state_abbreviation = NOT_GIVEN, state_abbreviation: '')
43
+ if legacy_state_abbreviation != NOT_GIVEN
44
+ warn_with_uplevel 'Passing `state_abbreviation` with the 1st argument of `Address.zip_code` is deprecated. Use keyword argument like `Address.zip_code(state_abbreviation: ...)` instead.', uplevel: 1
45
+ state_abbreviation = legacy_state_abbreviation
46
+ end
47
+
33
48
  if state_abbreviation.empty?
34
49
  letterified_string = letterify(fetch('address.postcode'))
35
50
  return numerify(letterified_string, leading_zero: true)
@@ -71,11 +86,21 @@ module Faker
71
86
  fetch('address.country')
72
87
  end
73
88
 
74
- def country_by_code(code: 'US')
89
+ def country_by_code(legacy_code = NOT_GIVEN, code: 'US')
90
+ if legacy_code != NOT_GIVEN
91
+ warn_with_uplevel 'Passing `code` with the 1st argument of `Address.country_by_code` is deprecated. Use keyword argument like `Address.country_by_code(code: ...)` instead.', uplevel: 1
92
+ code = legacy_code
93
+ end
94
+
75
95
  fetch('address.country_by_code.' + code)
76
96
  end
77
97
 
78
- def country_name_to_code(name: 'united_states')
98
+ def country_name_to_code(legacy_name = NOT_GIVEN, name: 'united_states')
99
+ if legacy_name != NOT_GIVEN
100
+ warn_with_uplevel 'Passing `name` with the 1st argument of `Address.country_name_to_code` is deprecated. Use keyword argument like `Address.country_name_to_code(name: ...)` instead.', uplevel: 1
101
+ name = legacy_name
102
+ end
103
+
79
104
  fetch('address.country_by_name.' + name)
80
105
  end
81
106
 
@@ -2,22 +2,60 @@
2
2
 
3
3
  module Faker
4
4
  class Alphanumeric < Base
5
- class << self
6
- ALPHABET = ('a'..'z').to_a
7
- ALPHANUMS = ALPHABET + (0..9).to_a
5
+ ALPHANUMS = LLetters + Numbers
8
6
 
9
- def alpha(number: 32)
7
+ class << self
8
+ def alpha(legacy_number = NOT_GIVEN, number: 32)
9
+ if legacy_number != NOT_GIVEN
10
+ warn_with_uplevel 'Passing `number` with the 1st argument of `Alphanumeric.alpha` is deprecated. Use keyword argument like `Alphanumeric.alpha(number: ...)` instead.', uplevel: 1
11
+ number = legacy_number
12
+ end
10
13
  char_count = resolve(number)
11
14
  return '' if char_count.to_i < 1
12
15
 
13
- Array.new(char_count) { sample(ALPHABET) }.join
16
+ Array.new(char_count) { sample(self::LLetters) }.join
14
17
  end
15
18
 
16
- def alphanumeric(number: 32)
19
+ ##
20
+ # Produces a random string of alphanumeric characters
21
+ #
22
+ # @param [Integer] number
23
+ # @param [Integer] min_alpha
24
+ # @param [Integer] min_numeric
25
+ #
26
+ # @return [String]
27
+ #
28
+ # @example Faker::Alphanumeric.alphanumeric(number: 10) #=> "3yfq2phxtb"
29
+ # @example Faker::Alphanumeric.alphanumeric(number: 10, min_alpha: 3) #=> "3yfq2phxtb"
30
+ # @example Faker::Alphanumeric.alphanumeric(number: 10, min_alpha: 3, min_numeric: 3) #=> "3yfq2phx8b"
31
+ #
32
+ # @faker.version 2.1.3
33
+ def alphanumeric(legacy_number = NOT_GIVEN, number: 32, min_alpha: 0, min_numeric: 0)
34
+ if legacy_number != NOT_GIVEN
35
+ warn_with_uplevel 'Passing `number` with the 1st argument of `Alphanumeric.alphanumeric` is deprecated. Use keyword argument like `Alphanumeric.alphanumeric(number: ...)` instead.', uplevel: 1
36
+ number = legacy_number
37
+ end
17
38
  char_count = resolve(number)
18
39
  return '' if char_count.to_i < 1
40
+ raise ArgumentError, 'min_alpha must be greater than or equal to 0' if min_alpha&.negative?
41
+ raise ArgumentError, 'min_numeric must be greater than or equal to 0' if min_numeric&.negative?
42
+
43
+ if min_alpha.zero? && min_numeric.zero?
44
+ return Array.new(char_count) { sample(ALPHANUMS) }.join
45
+ end
46
+
47
+ if min_alpha + min_numeric > char_count
48
+ raise ArgumentError, 'min_alpha + min_numeric must be <= number'
49
+ end
50
+
51
+ random_count = char_count - min_alpha - min_numeric
52
+
53
+ alphas = Array.new(min_alpha) { sample(self::LLetters) }
54
+ numbers = Array.new(min_numeric) { sample(self::Numbers) }
55
+ randoms = Array.new(random_count) { sample(ALPHANUMS) }
19
56
 
20
- Array.new(char_count) { sample(ALPHANUMS) }.join
57
+ combined = alphas + numbers + randoms
58
+ combined.shuffle.join
21
59
  end
22
60
  end
23
61
  end
@@ -15,7 +15,22 @@ module Faker
15
15
  parse('app.author')
16
16
  end
17
17
 
18
- def semantic_version(major: 0..9, minor: 0..9, patch: 1..9)
18
+ # rubocop:disable Metrics/ParameterLists
19
+ def semantic_version(legacy_major = NOT_GIVEN, legacy_minor = NOT_GIVEN, legacy_patch = NOT_GIVEN, major: 0..9, minor: 0..9, patch: 1..9)
20
+ # rubocop:enable Metrics/ParameterLists
21
+ if legacy_major != NOT_GIVEN
22
+ warn_with_uplevel 'Passing `major` with the 1st argument of `App.semantic_version` is deprecated. Use keyword argument like `App.semantic_version(major: ...)` instead.', uplevel: 1
23
+ major = legacy_major
24
+ end
25
+ if legacy_minor != NOT_GIVEN
26
+ warn_with_uplevel 'Passing `minor` with the 2nd argument of `App.semantic_version` is deprecated. Use keyword argument like `App.semantic_version(minor: ...)` instead.', uplevel: 1
27
+ minor = legacy_minor
28
+ end
29
+ if legacy_patch != NOT_GIVEN
30
+ warn_with_uplevel 'Passing `patch` with the 3rd argument of `App.semantic_version` is deprecated. Use keyword argument like `App.semantic_version(patch: ...)` instead.', uplevel: 1
31
+ patch = legacy_patch
32
+ end
33
+
19
34
  [major, minor, patch].map { |chunk| sample(Array(chunk)) }.join('.')
20
35
  end
21
36
  end