forgery 0.4.3 → 0.8.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 (56) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +6 -0
  3. data/.travis.yml +12 -0
  4. data/Gemfile +9 -0
  5. data/Gemfile.lock +35 -0
  6. data/LICENSE +1 -1
  7. data/README.markdown +196 -60
  8. data/Rakefile +10 -54
  9. data/forgery.gemspec +23 -0
  10. data/lib/forgery.rb +0 -1
  11. data/lib/forgery/dictionaries/bics +7 -0
  12. data/lib/forgery/dictionaries/company_names +0 -1
  13. data/lib/forgery/dictionaries/currency_descriptions +2 -2
  14. data/lib/forgery/dictionaries/ibans +61 -0
  15. data/lib/forgery/dictionaries/job_titles +1 -1
  16. data/lib/forgery/dictionaries/zones +1 -2
  17. data/lib/forgery/extend.rb +0 -2
  18. data/lib/forgery/extensions/range.rb +1 -1
  19. data/lib/forgery/file_reader.rb +2 -1
  20. data/lib/forgery/forgery/bank_account.rb +25 -0
  21. data/lib/forgery/forgery/basic.rb +1 -1
  22. data/lib/forgery/forgery/credit_card.rb +71 -0
  23. data/lib/forgery/forgery/geo.rb +54 -0
  24. data/lib/forgery/forgery/internet.rb +7 -0
  25. data/lib/forgery/forgery/lorem_ipsum.rb +4 -4
  26. data/lib/forgery/forgery/russian_tax.rb +57 -0
  27. data/lib/forgery/forgery_railtie.rb +0 -29
  28. data/lib/forgery/formats/phone +1 -1
  29. data/lib/forgery/version.rb +3 -1
  30. data/spec/data/dictionaries/code_names +6 -0
  31. data/spec/data/dictionaries/female_first_names +1 -0
  32. data/spec/data/documents/mock_web_page.html +17 -0
  33. data/spec/data/documents/mock_xml_doc.xml +5 -0
  34. data/spec/dictionaries_spec.rb +35 -0
  35. data/spec/extensions/array_spec.rb +25 -0
  36. data/spec/extensions/range_spec.rb +33 -0
  37. data/spec/extensions/string_spec.rb +29 -0
  38. data/spec/file_reader_spec.rb +32 -0
  39. data/spec/forgery/address_spec.rb +84 -0
  40. data/spec/forgery/bank_account_spec.rb +16 -0
  41. data/spec/forgery/basic_spec.rb +179 -0
  42. data/spec/forgery/credit_card_spec.rb +68 -0
  43. data/spec/forgery/currency_spec.rb +15 -0
  44. data/spec/forgery/date_spec.rb +134 -0
  45. data/spec/forgery/internet_spec.rb +62 -0
  46. data/spec/forgery/lorem_ipsum_spec.rb +132 -0
  47. data/spec/forgery/monetary_spec.rb +14 -0
  48. data/spec/forgery/name_spec.rb +11 -0
  49. data/spec/forgery/personal_spec.rb +15 -0
  50. data/spec/forgery/russian_tax_spec.rb +81 -0
  51. data/spec/forgery/time_spec.rb +7 -0
  52. data/spec/forgery_spec.rb +63 -0
  53. data/spec/formats_spec.rb +35 -0
  54. data/spec/spec_helper.rb +39 -0
  55. metadata +89 -38
  56. data/lib/forgery/file_writer.rb +0 -54
@@ -3,36 +3,7 @@ require 'rails'
3
3
  require 'rake'
4
4
 
5
5
  class ForgeryRailtie < Rails::Railtie
6
- extend Rake::DSL
7
-
8
6
  config.to_prepare do
9
7
  Forgery.load_from! "#{Rails.root}/lib/forgery"
10
8
  end
11
-
12
- rake_tasks do
13
- namespace :forgery do
14
- desc %q{
15
- Create a dictionary file from web content (xml or html).
16
- Writes to the directory specified by Forgery::FileWriter#write_to!
17
- '${GEM_HOME}/lib/forgery/dictionaries' by default (standalone)
18
- '${Rails.root}/lib/forgery/dictionaries' by default (as a Rails 3 plugin)
19
-
20
- Parameters:
21
- :dictionary_name -- the name of your new dictionary file
22
- :source_url -- web page containing the data for your dictionary file
23
- :css_or_xpath -- css or xpath selector(s) to element(s) containing the desired data
24
-
25
- Usage:
26
- rake forgery:create_dictionary[name_of_file,'http://www.html_or_xml_page.com','li']
27
- }
28
- task :create_dictionary, :dictionary_name, :source_url, :css_or_xpath do |t, args|
29
- dictionary_name = args[:dictionary_name].to_s || raise("parameter :dictionary_name is required")
30
- source_url = args[:source_url].to_s || raise("parameter :source_url is required")
31
- css_or_xpath = args[:css_or_xpath].to_s || raise("parameter :css_or_xpath is required")
32
-
33
- Forgery::FileWriter.write_to! "#{Rails.root}/lib/forgery/dictionaries"
34
- Forgery::FileWriter.create_dictionary dictionary_name, source_url, css_or_xpath
35
- end
36
- end
37
- end
38
9
  end
@@ -1 +1 @@
1
- #-(###)###-####
1
+ #-###-###-####
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  class Forgery
2
- VERSION = "0.4.3"
4
+ VERSION = '0.8.1'
3
5
  end
@@ -0,0 +1,6 @@
1
+ Phoenix
2
+ Deer Park
3
+ Bon Echo
4
+ Gran Paradiso
5
+ Shiretoko
6
+ Namoroka
@@ -0,0 +1,17 @@
1
+ <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
2
+ "http://www.w3.org/TR/html4/loose.dtd">
3
+ <html>
4
+ <head>
5
+ <title>Mock Web Page</title>
6
+ </head>
7
+ <body>
8
+ <h1>Title</h1>
9
+ <h2>Subtitle</h2>
10
+ <p>Paragraph.</p>
11
+ <ul id="list">
12
+ <li>uno</li>
13
+ <li>dos</li>
14
+ <li>tres</li>
15
+ </ul>
16
+ </body>
17
+ </html>
@@ -0,0 +1,5 @@
1
+ <dogs>
2
+ <dog>Labrador Retriever</dog>
3
+ <dog>Beagle</dog>
4
+ <dog>Border Collie</dog>
5
+ </dogs>
@@ -0,0 +1,35 @@
1
+ require 'spec_helper'
2
+
3
+ describe Forgery::Dictionaries do
4
+ it "should check if the dictionary is loaded" do
5
+ dictionaries = Forgery::Dictionaries.new
6
+
7
+ dictionaries[:colors]
8
+
9
+ expect(dictionaries).to be_loaded(:colors)
10
+ end
11
+
12
+ it "should load a dictionary when called by the key" do
13
+ dictionaries = Forgery::Dictionaries.new
14
+
15
+ dictionaries.reset!
16
+
17
+ expect(dictionaries).not_to be_loaded(:colors)
18
+
19
+ dictionaries[:colors]
20
+
21
+ expect(dictionaries).to be_loaded(:colors)
22
+ end
23
+
24
+ it "should clear the loaded dictionaries when calling reset!" do
25
+ dictionaries = Forgery::Dictionaries.new
26
+
27
+ dictionaries[:colors]
28
+
29
+ expect(dictionaries).to be_loaded(:colors)
30
+
31
+ dictionaries.reset!
32
+
33
+ expect(dictionaries).not_to be_loaded(:colors)
34
+ end
35
+ end
@@ -0,0 +1,25 @@
1
+ require 'spec_helper'
2
+
3
+ describe Array do
4
+ before do
5
+ @array = Forgery::Extend([0,1,2,3,4,5,6,7,8,9])
6
+ end
7
+
8
+ it "should get a random item out of the array" do
9
+ 10.times { expect(@array).to include(@array.random) }
10
+ end
11
+
12
+ it "should return nil if the array is empty" do
13
+ expect(Forgery::Extend([]).random).to be_nil
14
+ end
15
+
16
+ it "should return a random subset of the array" do
17
+ @array.random_subset(5).each do |i|
18
+ expect(@array).to include(i)
19
+ end
20
+ end
21
+
22
+ it "should return a random subset of the array that is 3 long" do
23
+ expect(@array.random_subset(3).size).to eq(3)
24
+ end
25
+ end
@@ -0,0 +1,33 @@
1
+ require 'spec_helper'
2
+ require 'timeout'
3
+
4
+ describe Range do
5
+ it 'should get a random number out of the range' do
6
+ range = Forgery::Extend(0..9)
7
+ 10.times { expect(range).to include(range.random) }
8
+ end
9
+
10
+ it 'should not take a long time when the range is huge' do
11
+ expect do
12
+ Timeout.timeout(1) { Forgery::Extend(1_234_567_890..12_345_678_901_234_567_890).random }
13
+ end.not_to raise_error
14
+ end
15
+
16
+ it 'should return nil for a random number from a reverse range' do
17
+ 10.times { expect(Forgery::Extend(9..0).random).to be_nil }
18
+ end
19
+
20
+ it 'should get a random string our of the range' do
21
+ range = Forgery::Extend('a'..'z')
22
+ 10.times { expect(range).to include(range.random) }
23
+ end
24
+
25
+ it 'should return nil if the maximum is less than the minimum' do
26
+ expect(Forgery::Extend('z'..'a').random).to be_nil
27
+ end
28
+
29
+ it 'should not return the maximum at excluded range' do
30
+ expect(Random).to receive(:rand).with(0...9).and_return(8)
31
+ expect(Forgery::Extend(0...9).random).to_not eq(9)
32
+ end
33
+ end
@@ -0,0 +1,29 @@
1
+ require 'spec_helper'
2
+
3
+ describe String do
4
+ it "should change a single # to a number 0-9" do
5
+ expect(0..9).to include(Integer(Forgery::Extend("#").to_numbers))
6
+ end
7
+
8
+ it "should change two #'s to two numbers 0-9" do
9
+ Forgery::Extend("##").to_numbers.split("").each do |s|
10
+ expect(0..9).to include(Integer(s))
11
+ end
12
+ end
13
+
14
+ it "should only replace #'s in the string with numbers 0-9" do
15
+ s = Forgery::Extend('###-###-####')
16
+ n = s.to_numbers
17
+ 0.upto(s.size - 1) do |i|
18
+ if s[i, 1] == "#"
19
+ expect('0'..'9').to include(n[i, 1])
20
+ else
21
+ expect('0'..'9').not_to include(n[i, 1])
22
+ end
23
+ end
24
+ end
25
+
26
+ it "should allow the replacing of a different character" do
27
+ expect(0..9).to include(Integer(Forgery::Extend("-").to_numbers("-")))
28
+ end
29
+ end
@@ -0,0 +1,32 @@
1
+ require 'spec_helper'
2
+
3
+ describe Forgery::FileReader do
4
+ it "should return an array when calling read_dictionary" do
5
+ expect(Forgery::FileReader.read_dictionary(:colors)).to be_is_a(Array)
6
+ end
7
+
8
+ it "should return an array when calling read_format" do
9
+ expect(Forgery::FileReader.read_format(:phone)).to be_is_a(Array)
10
+ end
11
+
12
+ it "should override default dictionaries if Forgery#load_from! was called" do
13
+ Forgery.load_from! "spec/data"
14
+ expect(Forgery::FileReader.read_dictionary(:female_first_names)).to eq(%w(Amber))
15
+ end
16
+
17
+ it "should read dictionaries from custom places if Forgery#load_from! was called" do
18
+ Forgery.load_from! "spec/data"
19
+ expect(Forgery::FileReader.read_dictionary(:code_names)).to include('Shiretoko')
20
+ end
21
+
22
+ it "should raise an exception if file wasn't found in load paths" do
23
+ expect {
24
+ Forgery::FileReader.read_dictionary(:non_existing_dictionary)
25
+ }.to raise_error(ArgumentError)
26
+ end
27
+ after do
28
+ # reset load_paths
29
+ Forgery.load_paths.clear
30
+ Forgery.load_paths << File.expand_path("lib/forgery")
31
+ end
32
+ end
@@ -0,0 +1,84 @@
1
+ require 'spec_helper'
2
+
3
+ describe Forgery::Address do
4
+ it "should return a random street" do
5
+ expect(Forgery.dictionaries[:streets]).to include(Forgery::Address.street_name)
6
+ end
7
+
8
+ it "should return a random street number" do
9
+ original_format = Forgery::Address.street_number.gsub(/\d/, '#')
10
+ expect(Forgery.formats[:street_number]).to include(original_format)
11
+ end
12
+
13
+ it "should return a random street suffix" do
14
+ expect(Forgery.dictionaries[:street_suffixes]).to include(Forgery::Address.street_suffix)
15
+ end
16
+
17
+ describe ".street_address" do
18
+ before do
19
+ @split_address = Forgery::Address.street_address.split
20
+ end
21
+
22
+ it "should return a random street suffix" do
23
+ street_suffix = @split_address.pop
24
+ expect(Forgery.dictionaries[:street_suffixes]).to include(street_suffix)
25
+ end
26
+
27
+ it "should return a random street number" do
28
+ street_number_format = @split_address.shift.gsub(/\d/, '#')
29
+ expect(Forgery.formats[:street_number]).to include(street_number_format)
30
+ end
31
+
32
+ it "should return a random street" do
33
+ @split_address.pop
34
+ @split_address.shift
35
+ street = @split_address.join(" ")
36
+ expect(Forgery.dictionaries[:streets]).to include(street)
37
+ end
38
+ end
39
+
40
+ it "should return a random city" do
41
+ city = Forgery::Address.city
42
+ expect(Forgery.dictionaries[:cities]).to include(city)
43
+ end
44
+
45
+ it "should return a random state" do
46
+ state = Forgery::Address.state
47
+ expect(Forgery.dictionaries[:states]).to include(state)
48
+ end
49
+
50
+ it "should return a random state abbreviation" do
51
+ state_abbrev = Forgery::Address.state_abbrev
52
+ expect(Forgery.dictionaries[:state_abbrevs]).to include(state_abbrev)
53
+ end
54
+
55
+ it "should return a random Canadian province or territory" do
56
+ province = Forgery::Address.province
57
+ expect(Forgery.dictionaries[:provinces]).to include(province)
58
+ end
59
+
60
+ it "should return a random Canadian province or territory abbreviation" do
61
+ province_abbrev = Forgery::Address.province_abbrev
62
+ expect(Forgery.dictionaries[:province_abbrevs]).to include(province_abbrev)
63
+ end
64
+
65
+ it "should return a random country" do
66
+ country = Forgery::Address.country
67
+ expect(Forgery.dictionaries[:countries]).to include(country)
68
+ end
69
+
70
+ it "should return a random continent" do
71
+ continent = Forgery::Address.continent
72
+ expect(Forgery.dictionaries[:continents]).to include(continent)
73
+ end
74
+
75
+ it "should return a random zip code" do
76
+ zip_format = Forgery::Address.zip.gsub(/\d/, '#')
77
+ expect(Forgery.formats[:zip]).to include(zip_format)
78
+ end
79
+
80
+ it "should return a random phone number" do
81
+ phone_format = Forgery::Address.phone.gsub(/\d/, '#')
82
+ expect(Forgery.formats[:phone]).to include(phone_format)
83
+ end
84
+ end
@@ -0,0 +1,16 @@
1
+ require 'spec_helper'
2
+
3
+ describe Forgery::BankAccount do
4
+
5
+ describe 'ibans' do
6
+ it 'returns a random iban' do
7
+ expect(Forgery.dictionaries[:ibans]).to include(Forgery::BankAccount.iban)
8
+ end
9
+ end
10
+
11
+ describe 'bics' do
12
+ it 'returns a random bic' do
13
+ expect(Forgery.dictionaries[:bics]).to include(Forgery::BankAccount.bic)
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,179 @@
1
+ require 'spec_helper'
2
+
3
+ describe Forgery::Basic do
4
+ describe ".password" do
5
+ it "should only uppercase characters" do
6
+ expect(Forgery::Basic.password(:allow_lower => false,
7
+ :allow_upper => true,
8
+ :allow_numeric => false,
9
+ :allow_special => false)).to only_contain(Forgery::Basic::UPPER_ALPHA)
10
+ end
11
+
12
+ it "should only contain lowercase characters" do
13
+ expect(Forgery::Basic.password(:allow_lower => true,
14
+ :allow_upper => false,
15
+ :allow_numeric => false,
16
+ :allow_special => false)).to only_contain(Forgery::Basic::LOWER_ALPHA)
17
+ end
18
+
19
+ it "should only contain numeric characters" do
20
+ expect(Forgery::Basic.password(:allow_lower => false,
21
+ :allow_upper => false,
22
+ :allow_numeric => true,
23
+ :allow_special => false)).to only_contain(Forgery::Basic::NUMERIC)
24
+ end
25
+
26
+ it "should only contain special characters" do
27
+ expect(Forgery::Basic.password(:allow_lower => false,
28
+ :allow_upper => false,
29
+ :allow_numeric => false,
30
+ :allow_special => true)).to only_contain(Forgery::Basic::SPECIAL_CHARACTERS)
31
+ end
32
+
33
+ it "should only contain lower and uppercase characters" do
34
+ expect(Forgery::Basic.password(:allow_lower => true,
35
+ :allow_upper => true,
36
+ :allow_numeric => false,
37
+ :allow_special => false)).to only_contain(Forgery::Basic::LOWER_ALPHA,
38
+ Forgery::Basic::UPPER_ALPHA)
39
+ end
40
+
41
+ it "should only contain numeric and special characters" do
42
+ expect(Forgery::Basic.password(:allow_lower => false,
43
+ :allow_upper => false,
44
+ :allow_numeric => true,
45
+ :allow_special => true)).to only_contain(Forgery::Basic::NUMERIC,
46
+ Forgery::Basic::SPECIAL_CHARACTERS)
47
+ end
48
+
49
+ it "should contain any of the defined characters" do
50
+ expect(Forgery::Basic.password(:allow_lower => true,
51
+ :allow_upper => true,
52
+ :allow_numeric => true,
53
+ :allow_special => true)).to only_contain(Forgery::Basic::NUMERIC,
54
+ Forgery::Basic::SPECIAL_CHARACTERS,
55
+ Forgery::Basic::LOWER_ALPHA,
56
+ Forgery::Basic::UPPER_ALPHA)
57
+ end
58
+ end
59
+
60
+ describe ".encrypt" do
61
+ it "should encrypt to hex digits" do
62
+ expect(Forgery::Basic.encrypt("something")).to only_contain(Forgery::Basic::HEX_DIGITS)
63
+ end
64
+
65
+ it "should encrypt different words to different output" do
66
+ expect(Forgery::Basic.encrypt("foo")).not_to eq(Forgery::Basic.encrypt("bar"))
67
+ end
68
+
69
+ it "should allow a salt that changes the output" do
70
+ expect(Forgery::Basic.encrypt("foo", "baz")).not_to eq(Forgery::Basic.encrypt("foo", "bar"))
71
+ end
72
+
73
+ it "should have the same output when encrypting twice" do
74
+ expect(Forgery::Basic.encrypt("foo", "bar")).to eq(Forgery::Basic.encrypt("foo", "bar"))
75
+ end
76
+ end
77
+
78
+ describe ".boolean" do
79
+ it "should return true or false" do
80
+ expect([true, false]).to include(Forgery::Basic.boolean)
81
+ end
82
+ end
83
+
84
+ describe ".color" do
85
+ it "should return a random color" do
86
+ expect(Forgery.dictionaries[:colors]).to include(Forgery::Basic.color)
87
+ end
88
+ end
89
+
90
+ describe ".hex_color" do
91
+ it "should return a 6-character hex color" do
92
+ expect(Forgery::Basic.hex_color).to match(/#(#{Forgery::Basic::HEX_DIGITS.join('|')}){6}/)
93
+ end
94
+ end
95
+
96
+ describe ".short_hex_color" do
97
+ it "should return a 3-character hex color" do
98
+ expect(Forgery::Basic.short_hex_color).to match(/#(#{Forgery::Basic::HEX_DIGITS.join('|')}){3}/)
99
+ end
100
+ end
101
+
102
+ describe ".number" do
103
+ it "should return a number >= the at_least option" do
104
+ expect(Forgery::Basic.number(:at_least => 2)).to be >= 2
105
+ end
106
+
107
+ it "should return a number <= the at_most option" do
108
+ expect(Forgery::Basic.number(:at_most => 12)).to be <= 12
109
+ end
110
+ end
111
+
112
+ describe ".text" do
113
+ it "should return text whose length is >= the at_least option" do
114
+ expect(Forgery::Basic.text(:at_least => 5).size).to be >= 5
115
+ end
116
+
117
+ it "should return text whose length is <= the at_most option" do
118
+ expect(Forgery::Basic.text(:at_most => 15).size).to be <= 15
119
+ end
120
+
121
+ it "should return text whose length is == the exactly option" do
122
+ expect(Forgery::Basic.text(:exactly => 20).size).to eq(20)
123
+ end
124
+
125
+ it "should only uppercase characters" do
126
+ expect(Forgery::Basic.text(:allow_lower => false,
127
+ :allow_upper => true,
128
+ :allow_numeric => false,
129
+ :allow_special => false)).to only_contain(Forgery::Basic::UPPER_ALPHA)
130
+ end
131
+
132
+ it "should only contain lowercase characters" do
133
+ expect(Forgery::Basic.text(:allow_lower => true,
134
+ :allow_upper => false,
135
+ :allow_numeric => false,
136
+ :allow_special => false)).to only_contain(Forgery::Basic::LOWER_ALPHA)
137
+ end
138
+
139
+ it "should only contain numeric characters" do
140
+ expect(Forgery::Basic.text(:allow_lower => false,
141
+ :allow_upper => false,
142
+ :allow_numeric => true,
143
+ :allow_special => false)).to only_contain(Forgery::Basic::NUMERIC)
144
+ end
145
+
146
+ it "should only contain special characters" do
147
+ expect(Forgery::Basic.text(:allow_lower => false,
148
+ :allow_upper => false,
149
+ :allow_numeric => false,
150
+ :allow_special => true)).to only_contain(Forgery::Basic::SPECIAL_CHARACTERS)
151
+ end
152
+
153
+ it "should only contain lower and uppercase characters" do
154
+ expect(Forgery::Basic.text(:allow_lower => true,
155
+ :allow_upper => true,
156
+ :allow_numeric => false,
157
+ :allow_special => false)).to only_contain(Forgery::Basic::LOWER_ALPHA,
158
+ Forgery::Basic::UPPER_ALPHA)
159
+ end
160
+
161
+ it "should only contain numeric and special characters" do
162
+ expect(Forgery::Basic.text(:allow_lower => false,
163
+ :allow_upper => false,
164
+ :allow_numeric => true,
165
+ :allow_special => true)).to only_contain(Forgery::Basic::NUMERIC,
166
+ Forgery::Basic::SPECIAL_CHARACTERS)
167
+ end
168
+
169
+ it "should contain any of the defined characters" do
170
+ expect(Forgery::Basic.text(:allow_lower => true,
171
+ :allow_upper => true,
172
+ :allow_numeric => true,
173
+ :allow_special => true)).to only_contain(Forgery::Basic::NUMERIC,
174
+ Forgery::Basic::SPECIAL_CHARACTERS,
175
+ Forgery::Basic::LOWER_ALPHA,
176
+ Forgery::Basic::UPPER_ALPHA)
177
+ end
178
+ end
179
+ end