forgery 0.5.0 → 0.6.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (41) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +6 -0
  3. data/.travis.yml +13 -0
  4. data/Gemfile +9 -0
  5. data/Gemfile.lock +27 -0
  6. data/LICENSE +1 -1
  7. data/README.markdown +9 -5
  8. data/Rakefile +9 -1
  9. data/forgery.gemspec +23 -0
  10. data/lib/forgery/dictionaries/company_names +0 -1
  11. data/lib/forgery/dictionaries/currency_descriptions +2 -2
  12. data/lib/forgery/file_reader.rb +1 -0
  13. data/lib/forgery/forgery/geo.rb +54 -0
  14. data/lib/forgery/forgery/internet.rb +7 -0
  15. data/lib/forgery/forgery/russian_tax.rb +57 -0
  16. data/lib/forgery/version.rb +1 -1
  17. data/spec/data/dictionaries/code_names +6 -0
  18. data/spec/data/dictionaries/female_first_names +1 -0
  19. data/spec/data/documents/mock_web_page.html +17 -0
  20. data/spec/data/documents/mock_xml_doc.xml +5 -0
  21. data/spec/dictionaries_spec.rb +35 -0
  22. data/spec/extensions/array_spec.rb +25 -0
  23. data/spec/extensions/range_spec.rb +31 -0
  24. data/spec/extensions/string_spec.rb +29 -0
  25. data/spec/file_reader_spec.rb +32 -0
  26. data/spec/forgery/address_spec.rb +84 -0
  27. data/spec/forgery/basic_spec.rb +179 -0
  28. data/spec/forgery/credit_card_spec.rb +68 -0
  29. data/spec/forgery/currency_spec.rb +15 -0
  30. data/spec/forgery/date_spec.rb +134 -0
  31. data/spec/forgery/internet_spec.rb +62 -0
  32. data/spec/forgery/lorem_ipsum_spec.rb +132 -0
  33. data/spec/forgery/monetary_spec.rb +14 -0
  34. data/spec/forgery/name_spec.rb +11 -0
  35. data/spec/forgery/personal_spec.rb +15 -0
  36. data/spec/forgery/russian_tax_spec.rb +81 -0
  37. data/spec/forgery/time_spec.rb +7 -0
  38. data/spec/forgery_spec.rb +63 -0
  39. data/spec/formats_spec.rb +35 -0
  40. data/spec/spec_helper.rb +39 -0
  41. metadata +101 -64
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 9756be4e19ec2f587a22381db7f90398dc1d203a
4
+ data.tar.gz: 024a6316301e71afafd6eb948aac37992ba168f0
5
+ SHA512:
6
+ metadata.gz: 9a0114bc3393c3a8790ce074e65c4afb66a60406f4fd60df64c55d0151c3fbbf452e52db20d27263e2386b7d9410c67f29c8977b53ee76154b28343681c26185
7
+ data.tar.gz: 7c882a4f0d9f699ddf7d23244fecaef25860379a605bc8d0be30ad70eb4d1e1fe84b9d0f0ddeea55c6dec7be0c6e31272abbe131ec47163c0ee8b9410126a8de
@@ -0,0 +1,6 @@
1
+ /doc
2
+ /pkg
3
+ .DS_Store
4
+ .rakeTasks
5
+ .rbc
6
+ .iml
@@ -0,0 +1,13 @@
1
+ language: ruby
2
+ rvm:
3
+ - 1.8.7
4
+ - 1.9.2
5
+ - 1.9.3
6
+ - 2.0.0
7
+ - 2.1.0
8
+ - ruby-head
9
+
10
+ matrix:
11
+ allow_failures:
12
+ - rvm: ruby-head
13
+ fast_finish: true
data/Gemfile ADDED
@@ -0,0 +1,9 @@
1
+ source "https://rubygems.org"
2
+
3
+ gem 'rake'
4
+
5
+ group :test do
6
+ gem 'rspec'
7
+ end
8
+
9
+ gemspec
@@ -0,0 +1,27 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ forgery (0.6.0)
5
+
6
+ GEM
7
+ remote: https://rubygems.org/
8
+ specs:
9
+ diff-lcs (1.1.3)
10
+ rake (10.1.0)
11
+ rspec (2.6.0)
12
+ rspec-core (~> 2.6.0)
13
+ rspec-expectations (~> 2.6.0)
14
+ rspec-mocks (~> 2.6.0)
15
+ rspec-core (2.6.4)
16
+ rspec-expectations (2.6.0)
17
+ diff-lcs (~> 1.1.2)
18
+ rspec-mocks (2.6.0)
19
+
20
+ PLATFORMS
21
+ ruby
22
+
23
+ DEPENDENCIES
24
+ bundler (~> 1.3)
25
+ forgery!
26
+ rake
27
+ rspec
data/LICENSE CHANGED
@@ -1,4 +1,4 @@
1
- Copyright (c) 2007 Sevenwire LLC
1
+ Copyright (c) 2007-2014 Sevenwire LLC
2
2
 
3
3
  Permission is hereby granted, free of charge, to any person obtaining
4
4
  a copy of this software and associated documentation files (the
@@ -1,6 +1,10 @@
1
1
  Forgery
2
2
  =======
3
3
 
4
+ [![Build Status](https://travis-ci.org/sevenwire/forgery.png)](https://travis-ci.org/sevenwire/forgery)
5
+ [![Code Climate](https://codeclimate.com/github/sevenwire/forgery.png)](https://codeclimate.com/github/sevenwire/forgery)
6
+
7
+
4
8
  **A Problem**:
5
9
  It's harder than *absolutely easy* to make meaningful, simple, data for testing and development.
6
10
 
@@ -32,7 +36,7 @@ Forgery(:monetary).formatted_money :min => 100, :max => 1000
32
36
  #=> "$923.36"
33
37
  ```
34
38
 
35
- And many many [more]()!
39
+ And many many more!
36
40
 
37
41
  Alternatively you can write it like this:
38
42
 
@@ -43,7 +47,7 @@ Forgery::Personal.shirt_size
43
47
  ```
44
48
 
45
49
  In addition, you can always write your own dictionaries and formats, overriding the ones in the gem.
46
- Fully explained [here]().
50
+ Fully explained here.
47
51
 
48
52
 
49
53
  Installing
@@ -59,7 +63,7 @@ $ gem install forgery
59
63
 
60
64
  This will add it to your gem library, just like any normal gem.
61
65
  You can then use it like any normal gem library.
62
- See [examples]() for more.
66
+ See examples for more.
63
67
 
64
68
 
65
69
  **Rails 3.x**
@@ -68,7 +72,7 @@ If you're using Rails 3.x you need to do a few extra things (that are probably r
68
72
  First step is to add it to your `Rails.root/Gemfile`, we also suggest specifying the latest version (found on rubygems):
69
73
 
70
74
  ```ruby
71
- gem 'forgery', '0.3.12'
75
+ gem 'forgery', '0.6.0'
72
76
  ```
73
77
 
74
78
  Then you'll need to run `bundle install` to install and lock in your new gem.
@@ -159,4 +163,4 @@ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
159
163
  OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
160
164
  WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
161
165
 
162
- On that note, have fun!
166
+ On that note, have fun!
data/Rakefile CHANGED
@@ -1,7 +1,15 @@
1
1
  require 'bundler'
2
2
  require 'rspec/core/rake_task'
3
3
 
4
+ task :default => :spec
5
+
4
6
  Bundler::GemHelper.install_tasks
5
7
  RSpec::Core::RakeTask.new
6
8
 
7
- task :default => :spec
9
+ task :console do
10
+ require 'irb'
11
+ require 'irb/completion'
12
+ require 'forgery'
13
+ ARGV.clear
14
+ IRB.start
15
+ end
@@ -0,0 +1,23 @@
1
+ # -*- encoding: utf-8 -*-
2
+ $:.push File.expand_path("../lib", __FILE__)
3
+ require "forgery/version"
4
+
5
+ Gem::Specification.new do |spec|
6
+ spec.name = "forgery"
7
+ spec.version = Forgery::VERSION
8
+ spec.authors = ["Nathan Sutton", "Brandon Arbini", "Kamil Kieliszczyk"]
9
+ spec.email = ["nate@zencoder.com", "brandon@zencoder.com", "kamil@kieliszczyk.net"]
10
+ spec.homepage = "http://github.com/sevenwire/forgery"
11
+ spec.summary = "Easy and customizable generation of forged data."
12
+ spec.description = "Easy and customizable generation of forged data. Can be used as a gem or a rails plugin. Includes rails generators for creating your own forgeries."
13
+
14
+ spec.platform = Gem::Platform::RUBY
15
+ spec.required_rubygems_version = ">= 1.3.6"
16
+ spec.rubyforge_project = "forgery"
17
+
18
+ spec.files = `git ls-files`.split($/)
19
+ spec.test_files = `git ls-files spec`.split($/)
20
+ spec.require_paths = %w(lib)
21
+
22
+ spec.add_development_dependency "bundler", "~> 1.3"
23
+ end
@@ -204,7 +204,6 @@ Quire
204
204
  Camimbo
205
205
  Aibox
206
206
  Meevee
207
- Brainfire
208
207
  Gabcube
209
208
  Browsetype
210
209
  Shuffletag
@@ -73,7 +73,7 @@ Palladium Ounces
73
73
  Peru Nuevos Soles
74
74
  Philippines Pesos
75
75
  Platinum Ounces
76
- Poland Zlotych
76
+ Polish Zloty
77
77
  Portugal Escudos
78
78
  Qatar Riyals
79
79
  Romania New Lei
@@ -103,4 +103,4 @@ United States Dollars
103
103
  Venezuela Bolivares
104
104
  Venezuela Bolivares Fuertes
105
105
  Vietnam Dong
106
- Zambia Kwacha
106
+ Zambia Kwacha
@@ -31,6 +31,7 @@ class Forgery
31
31
  file = "#{path}/#{folder}/#{name}"
32
32
  return file if File.exists?(file)
33
33
  end
34
+ raise ArgumentError.new("File '#{name}' wasn't found in '#{folder}' folder. Searched paths: \n#{Forgery.load_paths.join('\n')}")
34
35
  end
35
36
  end
36
37
  end
@@ -0,0 +1,54 @@
1
+ # Generates random geographic information.
2
+ class Forgery::Geo < Forgery
3
+
4
+ # Return a latitude in the range -90.0 to +90.0 as a float.
5
+ def self.latitude
6
+ rand * 180.0 - 90.0
7
+ end
8
+
9
+ # Return a latitude's degrees component in the range -180 to +180 as an integer.
10
+ def self.latitude_degrees
11
+ rand(360)-180
12
+ end
13
+
14
+ # Return a latitude's minutes component in the range 0 to 60 as an integer.
15
+ def self.latitude_minutes
16
+ rand(60)
17
+ end
18
+
19
+ # Return a latitude's seconds component in the range 0 to 60 as an integer.
20
+ def self.latitude_seconds
21
+ rand(60)
22
+ end
23
+
24
+ # Return a latitude's direction component, either "N" (north) or "S" (south)
25
+ def self.latitude_direction
26
+ ['N','S'].sample
27
+ end
28
+
29
+ # Return a longitude in the range -180.0 to +180.0 as a float.
30
+ def self.longitude
31
+ rand * 360.0 - 180.0
32
+ end
33
+
34
+ # Return a longitude's degrees component in the range -180 to +180 as an integer.
35
+ def self.longitude_degrees
36
+ rand(360)-180
37
+ end
38
+
39
+ # Return a longitude's minutes component in the range 0 to 60 as an integer.
40
+ def self.longitude_minutes
41
+ rand(60)
42
+ end
43
+
44
+ # Return a longitude's seconds component in the range 0 to 60 as an integer.
45
+ def self.longitude_seconds
46
+ rand(60)
47
+ end
48
+
49
+ # Return a longitude's direction component, either "E" (east) or "W" (west)
50
+ def self.longitude_direction
51
+ ["E","W"].sample
52
+ end
53
+
54
+ end
@@ -1,3 +1,5 @@
1
+ require 'ipaddr'
2
+
1
3
  class Forgery::Internet < Forgery
2
4
 
3
5
  def self.user_name
@@ -28,4 +30,9 @@ class Forgery::Internet < Forgery
28
30
  (1..4).map{rand(256)}.join('.')
29
31
  end
30
32
 
33
+ # credit for this method from http://stackoverflow.com/a/2811349/793330
34
+ def self.ip_v6
35
+ IPAddr.new(rand(2**128),Socket::AF_INET6).to_s
36
+ end
37
+
31
38
  end
@@ -0,0 +1,57 @@
1
+ # Generates various special numbers for Russian taxation system
2
+ # They have numbers for identification, for banks, for companies and entrepreneurs
3
+ class Forgery::RussianTax < Forgery
4
+
5
+ TYPES = Forgery::Extend([:person, :legal])
6
+
7
+ #bank identification
8
+ def self.bik
9
+ "04#{5.times.map { rand(9) + 1 }.join}#{rand(50) + 50}"
10
+ end
11
+
12
+ #bank account format pretty simple
13
+ def self.account_number
14
+ 20.times.map { rand(9) + 1 }.join
15
+ end
16
+
17
+ #taxation id
18
+ def self.inn(options = {})
19
+ type = TYPES.include?(options[:type]) ? options[:type] : TYPES.random
20
+ send [type, :inn].join('_')
21
+ end
22
+
23
+ #government registration id
24
+ def self.ogrn(options = {})
25
+ type = TYPES.include?(options[:type]) ? options[:type] : TYPES.random
26
+ send [type, :ogrn].join('_')
27
+ end
28
+
29
+ private
30
+ def self.person_inn
31
+ mask = [[7, 2, 4, 10, 3, 5, 9, 4, 6, 8], [3, 7, 2, 4, 10, 3, 5, 9, 4, 6, 8]]
32
+ inn = 12.times.map { rand(9) + 1 }.join
33
+ inn[10] = ((0..(inn.length-3)).inject(0) {|crc, i| crc + inn[i].to_i*mask[0][i].to_i} % 11 % 10).to_s
34
+ inn[11] = ((0..(inn.length-2)).inject(0) {|crc, i| crc + inn[i].to_i*mask[1][i].to_i} % 11 % 10).to_s
35
+ inn
36
+ end
37
+
38
+ def self.legal_inn
39
+ mask = [2, 4, 10, 3, 5, 9, 4, 6, 8]
40
+ inn = 10.times.map { rand(9) + 1 }.join
41
+ inn[9] = ((0..(inn.length-2)).inject(0) {|crc, i| crc + inn[i].to_i*mask[i].to_i} % 11 % 10).to_s
42
+ inn
43
+ end
44
+
45
+ def self.person_ogrn
46
+ ogrn = 14.times.map { rand(9) + 1 }.join
47
+ ogrn += (ogrn.to_i%13%10).to_s
48
+ ogrn
49
+ end
50
+
51
+ def self.legal_ogrn
52
+ ogrn = 12.times.map { rand(9) + 1 }.join
53
+ ogrn += (ogrn.to_i%11%10).to_s
54
+ ogrn
55
+ end
56
+
57
+ end
@@ -1,3 +1,3 @@
1
1
  class Forgery
2
- VERSION = "0.5.0"
2
+ VERSION = "0.6.0"
3
3
  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
+ dictionaries.should 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
+ dictionaries.should_not be_loaded(:colors)
18
+
19
+ dictionaries[:colors]
20
+
21
+ dictionaries.should 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
+ dictionaries.should be_loaded(:colors)
30
+
31
+ dictionaries.reset!
32
+
33
+ dictionaries.should_not 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 { @array.should include(@array.random) }
10
+ end
11
+
12
+ it "should return nil if the array is empty" do
13
+ Forgery::Extend([]).random.should 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
+ @array.should include(i)
19
+ end
20
+ end
21
+
22
+ it "should return a random subset of the array that is 3 long" do
23
+ @array.random_subset(3).size.should == 3
24
+ end
25
+ end
@@ -0,0 +1,31 @@
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 { range.should include(range.random) }
8
+ end
9
+
10
+ it "should not take a long time when the range is huge" do
11
+ Timeout.timeout(1){Forgery::Extend(1234567890..12345678901234567890).random}.should_not raise_error(Timeout::Error)
12
+ end
13
+
14
+ it "should return nil for a random number from a reverse range" do
15
+ 10.times { Forgery::Extend(9..0).random.should be_nil }
16
+ end
17
+
18
+ it "should get a random string our of the range" do
19
+ range = Forgery::Extend("a".."z")
20
+ 10.times { range.should include(range.random) }
21
+ end
22
+
23
+ it "should return nil if the maximum is less than the minimum" do
24
+ Forgery::Extend("z".."a").random.should be_nil
25
+ end
26
+
27
+ it "should not return the maximum at excluded range" do
28
+ Kernel.should_receive(:rand).with(9).and_return(8)
29
+ Forgery::Extend(0...9).random.should_not be_equal 9
30
+ end
31
+ end