forgery 0.3.12 → 0.4.0
Sign up to get free protection for your applications and to get access to all the features.
- data/README.markdown +101 -93
- data/lib/forgery.rb +3 -2
- data/lib/forgery/dictionaries.rb +1 -1
- data/lib/forgery/extend.rb +16 -0
- data/lib/forgery/extensions/array.rb +19 -8
- data/lib/forgery/extensions/range.rb +17 -7
- data/lib/forgery/extensions/string.rb +37 -37
- data/lib/forgery/forgery/address.rb +9 -9
- data/lib/forgery/forgery/basic.rb +13 -13
- data/lib/forgery/forgery/currency.rb +2 -2
- data/lib/forgery/forgery/date.rb +12 -12
- data/lib/forgery/forgery/internet.rb +2 -2
- data/lib/forgery/forgery/lorem_ipsum.rb +3 -2
- data/lib/forgery/forgery/name.rb +11 -11
- data/lib/forgery/forgery/personal.rb +4 -4
- data/lib/forgery/forgery/time.rb +1 -1
- data/lib/forgery/forgery_api.rb +1 -1
- data/lib/forgery/formats.rb +1 -1
- data/lib/forgery/version.rb +1 -1
- metadata +7 -9
- data/lib/forgery/extensions/hash.rb +0 -12
data/README.markdown
CHANGED
@@ -1,132 +1,122 @@
|
|
1
|
-
|
1
|
+
Forgery
|
2
|
+
=======
|
2
3
|
|
3
|
-
|
4
|
-
|
4
|
+
**A Problem**:
|
5
|
+
It's harder than *absolutely easy* to make meaningful, simple, data for testing and development.
|
5
6
|
|
6
|
-
|
7
|
-
A fake data generator that
|
8
|
-
(well, it does those too, but also does much more).
|
7
|
+
**A Solution**:
|
8
|
+
A fake data generator that provides not only a host of basics and a rememberable syntax, but a customizable library to boot.
|
9
9
|
|
10
|
-
Forgery
|
11
|
-
plugin includes a generator providing directories to make your own forgeries.
|
10
|
+
Welcome to Forgery, an excellent solution to a problem so hard you didn't know it was there.
|
12
11
|
|
13
12
|
|
14
|
-
|
13
|
+
Using
|
14
|
+
-----
|
15
15
|
|
16
|
-
|
16
|
+
You'll want to read individual Forgery categories for more information, but these are the basics:
|
17
17
|
|
18
|
-
|
18
|
+
~~~ Ruby
|
19
|
+
Forgery(:basic).password
|
20
|
+
#=> "b6qZTQEH"
|
19
21
|
|
20
|
-
|
22
|
+
Forgery(:internet).email_address
|
23
|
+
#=> "krainboltgreene@crt.net"
|
21
24
|
|
22
|
-
|
23
|
-
|
25
|
+
Forgery(:monetary).money
|
26
|
+
#=> "1.58"
|
24
27
|
|
25
|
-
|
28
|
+
Forgery(:lorem_ipsum).words(10)
|
29
|
+
#=> "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aliquam egestas."
|
26
30
|
|
27
|
-
|
28
|
-
|
31
|
+
Forgery(:monetary).formatted_money :min => 100, :max => 1000
|
32
|
+
#=> "$923.36"
|
33
|
+
~~~
|
29
34
|
|
30
|
-
|
35
|
+
And many many [more]()!
|
31
36
|
|
32
|
-
|
37
|
+
Alternatively you can write it like this:
|
33
38
|
|
34
|
-
|
39
|
+
~~~ Ruby
|
40
|
+
Forgery::Basic.hex_color
|
41
|
+
Forgery::Name.full_name
|
42
|
+
Forgery::Personal.shirt_size
|
43
|
+
~~~
|
35
44
|
|
36
|
-
|
45
|
+
In addition, you can always write your own dictionaries and formats, overriding the ones in the gem.
|
46
|
+
Fully explained [here]().
|
37
47
|
|
38
|
-
In a rails project this generator creates:
|
39
48
|
|
40
|
-
|
41
|
-
|
42
|
-
* Rails.root/lib/forgery/extensions
|
43
|
-
* Rails.root/lib/forgery/forgeries
|
44
|
-
* Rails.root/lib/forgery/formats
|
49
|
+
Installing
|
50
|
+
----------
|
45
51
|
|
46
|
-
|
47
|
-
extensions, forgeries, and formats.
|
52
|
+
Like any gem, you can install Forgery two ways depending on it's use.
|
48
53
|
|
54
|
+
For normal Ruby development, you need simply use:
|
49
55
|
|
50
|
-
|
51
|
-
|
56
|
+
~~~
|
57
|
+
$ gem install forgery
|
58
|
+
~~~
|
52
59
|
|
53
|
-
|
60
|
+
This will add it to your gem library, just like any normal gem.
|
61
|
+
You can then use it like any normal gem library.
|
62
|
+
See [examples]() for more.
|
54
63
|
|
55
|
-
See which dictionaries each forgery uses to override them with your own.
|
56
64
|
|
65
|
+
**Rails 3.x**
|
57
66
|
|
58
|
-
|
59
|
-
|
67
|
+
If you're using Rails 3.x you need to do a few extra things (that are probably rote).
|
68
|
+
First step is to add it to your `Rails.root/Gemfile`, we also suggest specifying the latest version (found on rubygems):
|
60
69
|
|
61
|
-
|
62
|
-
|
70
|
+
~~~ ruby
|
71
|
+
gem 'forgery', '0.3.12'
|
72
|
+
~~~
|
63
73
|
|
64
|
-
|
65
|
-
|
66
|
-
:source_url -- web page containing the data for your dictionary file
|
67
|
-
:css_or_xpath -- css or xpath selector(s) to element(s) containing the desired data
|
74
|
+
Then you'll need to run `bundle install` to install and lock in your new gem.
|
75
|
+
Next you'll want to run the special Rails 3 generator:
|
68
76
|
|
69
|
-
|
70
|
-
|
71
|
-
|
77
|
+
~~~
|
78
|
+
$ [bundle exec] rails generate forgery
|
79
|
+
~~~
|
72
80
|
|
73
|
-
|
74
|
-
for individual examples.
|
81
|
+
**Rails 2.x**
|
75
82
|
|
76
|
-
|
77
|
-
Forgery::Basic.password # => "wYMYvq"
|
78
|
-
Forgery::Basic.password :allow_special => true # => ";Qo^N[T"
|
79
|
-
Forgery::Basic.hex_color # => "#f4d841"
|
80
|
-
|
81
|
-
Forgery::Monetary.money # => "8.21"
|
82
|
-
Forgery::Monetary.formatted_money # => "$3.25"
|
83
|
-
Forgery::Monetary.money :min => 100, :max => 1000 # => "848.97"
|
84
|
-
|
85
|
-
# Alternate syntax
|
86
|
-
Forgery(:basic).password # => "b6qZTQEH"
|
87
|
-
Forgery(:basic).password :allow_special => true # => "XlrhV%An"
|
88
|
-
Forgery(:basic).hex_color # => "#46b73f"
|
89
|
-
|
90
|
-
Forgery(:monetary).money # => "1.58"
|
91
|
-
Forgery(:monetary).formatted_money # => "$3.48"
|
92
|
-
Forgery(:monetary).money :min => 100, :max => 1000 # => "923.36"
|
83
|
+
For **Rails 2.x** you'll need to do something a little different, by first editing your `Rails.root/config/environment.rb` and adding this to the configuration block:
|
93
84
|
|
94
|
-
|
85
|
+
~~~ ruby
|
86
|
+
config.gem 'forgery'
|
87
|
+
~~~
|
95
88
|
|
96
|
-
|
89
|
+
Then you'll need to run this in your command line:
|
97
90
|
|
98
|
-
|
91
|
+
~~~
|
92
|
+
$ script/generate forgery
|
93
|
+
~~~
|
99
94
|
|
100
|
-
|
95
|
+
**Generators**
|
101
96
|
|
102
|
-
|
97
|
+
This Rails generators will make these directories in your Rails.root directory:
|
103
98
|
|
104
|
-
|
99
|
+
~~~ YAML
|
100
|
+
- Rails.root/lib/forgery
|
101
|
+
- Rails.root/lib/forgery/dictionaries
|
102
|
+
- Rails.root/lib/forgery/extensions
|
103
|
+
- Rails.root/lib/forgery/forgeries
|
104
|
+
- Rails.root/lib/forgery/formats
|
105
|
+
~~~
|
105
106
|
|
106
|
-
|
107
|
+
You can then use these directories to write your own dictionaries, class extensions, forgeries, and formats.
|
107
108
|
|
108
|
-
class NewForgery < Forgery
|
109
|
-
end
|
110
109
|
|
111
|
-
|
110
|
+
Contributing
|
111
|
+
------------
|
112
112
|
|
113
|
-
|
113
|
+
This is a work in progress and an open source project, so feel free to contribute.
|
114
|
+
We'll take pull requests via git or suggestions via the issues tab.
|
115
|
+
Any work done on Forgery will get you into the credits list and in our hearts.
|
114
116
|
|
115
|
-
### Formats
|
116
117
|
|
117
|
-
|
118
|
-
|
119
|
-
## DOCUMENTATION
|
120
|
-
|
121
|
-
Documentation can be found at [http://sevenwire.github.com/forgery/](http://sevenwire.github.com/forgery/)
|
122
|
-
|
123
|
-
## TODO
|
124
|
-
|
125
|
-
* Add instanced forgeries for more relative information generation.
|
126
|
-
* Add markov chains.
|
127
|
-
* Add a way to use probability in forgeries.
|
128
|
-
|
129
|
-
## Thanks
|
118
|
+
Credits
|
119
|
+
-------
|
130
120
|
|
131
121
|
Thanks to the authors and contributors:
|
132
122
|
|
@@ -143,11 +133,29 @@ Thanks to the authors and contributors:
|
|
143
133
|
* SixArm (SixArm)
|
144
134
|
* Akira Matsuda (amatsuda)
|
145
135
|
|
146
|
-
## Notes
|
147
136
|
|
148
|
-
|
149
|
-
|
137
|
+
Licensing
|
138
|
+
---------
|
139
|
+
|
140
|
+
Copyright (c) 2007 Sevenwire LLC
|
141
|
+
|
142
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
143
|
+
a copy of this software and associated documentation files (the
|
144
|
+
"Software"), to deal in the Software without restriction, including
|
145
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
146
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
147
|
+
permit persons to whom the Software is furnished to do so, subject to
|
148
|
+
the following conditions:
|
149
|
+
|
150
|
+
The above copyright notice and this permission notice shall be
|
151
|
+
included in all copies or substantial portions of the Software.
|
150
152
|
|
151
|
-
|
153
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
154
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
155
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
156
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
157
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
158
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
159
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
152
160
|
|
153
|
-
|
161
|
+
On that note, have fun!
|
data/lib/forgery.rb
CHANGED
@@ -9,12 +9,13 @@ require 'forgery/file_writer'
|
|
9
9
|
require 'forgery/dictionaries'
|
10
10
|
require 'forgery/formats'
|
11
11
|
|
12
|
-
# Loading
|
12
|
+
# Loading extensions
|
13
|
+
require 'forgery/extend'
|
13
14
|
Dir[current_path + 'forgery/extensions/**/*.rb'].uniq.each do |file|
|
14
15
|
require file
|
15
16
|
end
|
16
17
|
|
17
|
-
# Load the forgery base
|
18
|
+
# Load the forgery base classes
|
18
19
|
require 'forgery/forgery'
|
19
20
|
|
20
21
|
# Load the forgery version
|
data/lib/forgery/dictionaries.rb
CHANGED
@@ -8,7 +8,7 @@ class Forgery
|
|
8
8
|
|
9
9
|
def [](key)
|
10
10
|
symbolized_key = key.to_sym
|
11
|
-
@dictionaries[symbolized_key] ||= FileReader.read_dictionary(symbolized_key)
|
11
|
+
@dictionaries[symbolized_key] ||= Forgery::Extend(FileReader.read_dictionary(symbolized_key))
|
12
12
|
end
|
13
13
|
|
14
14
|
def loaded?(key)
|
@@ -0,0 +1,16 @@
|
|
1
|
+
class Forgery
|
2
|
+
def self.Extend(object)
|
3
|
+
case object
|
4
|
+
when Array
|
5
|
+
Forgery::Extensions::Array.new(object)
|
6
|
+
when Hash
|
7
|
+
Forgery::Extensions::Hash.new(object)
|
8
|
+
when Range
|
9
|
+
Forgery::Extensions::Range.new(object.first, object.last, object.exclude_end?)
|
10
|
+
when String
|
11
|
+
Forgery::Extensions::String.new(object)
|
12
|
+
else
|
13
|
+
object
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -1,11 +1,22 @@
|
|
1
|
-
class
|
2
|
-
|
3
|
-
|
4
|
-
|
1
|
+
class Forgery
|
2
|
+
module Extensions
|
3
|
+
class Array < ::Array
|
4
|
+
|
5
|
+
def unextend
|
6
|
+
to_a
|
7
|
+
end
|
8
|
+
|
9
|
+
# The only forgery extension that returns an extended object
|
10
|
+
def random
|
11
|
+
Forgery::Extend(self[Kernel.rand(size)])
|
12
|
+
end
|
13
|
+
|
14
|
+
def random_subset(len=2)
|
15
|
+
rs = []
|
16
|
+
len.times { rs << random }
|
17
|
+
rs
|
18
|
+
end
|
5
19
|
|
6
|
-
|
7
|
-
rs = []
|
8
|
-
len.times { rs << random }
|
9
|
-
rs
|
20
|
+
end
|
10
21
|
end
|
11
22
|
end
|
@@ -1,9 +1,19 @@
|
|
1
|
-
class
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
1
|
+
class Forgery
|
2
|
+
module Extensions
|
3
|
+
class Range < ::Range
|
4
|
+
|
5
|
+
def unextend
|
6
|
+
::Range.new(first, last, exclude_end?)
|
7
|
+
end
|
8
|
+
|
9
|
+
def random
|
10
|
+
Integer(first) && Integer(last)
|
11
|
+
raise ArgumentError if first > last
|
12
|
+
Kernel.rand(last - first + (exclude_end? ? 0 : 1)) + first
|
13
|
+
rescue ArgumentError
|
14
|
+
Forgery::Extend(to_a).random
|
15
|
+
end
|
16
|
+
|
17
|
+
end
|
8
18
|
end
|
9
19
|
end
|
@@ -1,49 +1,49 @@
|
|
1
|
-
class
|
2
|
-
|
3
|
-
|
4
|
-
end
|
1
|
+
class Forgery
|
2
|
+
module Extensions
|
3
|
+
class String < ::String
|
5
4
|
|
6
|
-
|
7
|
-
|
8
|
-
def camelize(first_letter = :upper)
|
9
|
-
case first_letter
|
10
|
-
when :upper
|
11
|
-
to_s.gsub(/\/(.?)/) { "::#{$1.upcase}" }.gsub(/(?:^|_)(.)/) { $1.upcase }
|
12
|
-
when :lower
|
13
|
-
first.downcase + camelize(self)[1..-1]
|
5
|
+
def unextend
|
6
|
+
to_s
|
14
7
|
end
|
15
|
-
end
|
16
8
|
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
gsub(/([a-z\d])([A-Z])/,'\1_\2').
|
21
|
-
tr("-", "_").
|
22
|
-
downcase
|
23
|
-
end
|
24
|
-
|
25
|
-
if Module.method(:const_get).arity == 1
|
26
|
-
def constantize
|
27
|
-
names = self.split('::')
|
28
|
-
names.shift if names.empty? || names.first.empty?
|
9
|
+
def to_numbers(replace='#')
|
10
|
+
gsub(/#{replace}/){ Kernel.rand(10) }
|
11
|
+
end
|
29
12
|
|
30
|
-
|
31
|
-
|
32
|
-
|
13
|
+
# Ripped right out of rails
|
14
|
+
def camelize(first_letter = :upper)
|
15
|
+
case first_letter
|
16
|
+
when :upper
|
17
|
+
to_s.gsub(/\/(.?)/) { "::#{$1.upcase}" }.gsub(/(?:^|_)(.)/) { $1.upcase }
|
18
|
+
when :lower
|
19
|
+
first.downcase + camelize(self)[1..-1]
|
33
20
|
end
|
34
|
-
constant
|
35
21
|
end
|
36
|
-
else
|
37
|
-
def constantize
|
38
|
-
names = self.split('::')
|
39
|
-
names.shift if names.empty? || names.first.empty?
|
40
22
|
|
41
|
-
|
42
|
-
|
43
|
-
|
23
|
+
if Module.method(:const_get).arity == 1
|
24
|
+
def constantize
|
25
|
+
names = self.split('::')
|
26
|
+
names.shift if names.empty? || names.first.empty?
|
27
|
+
|
28
|
+
constant = Object
|
29
|
+
names.each do |name|
|
30
|
+
constant = constant.const_defined?(name) ? constant.const_get(name) : constant.const_missing(name)
|
31
|
+
end
|
32
|
+
constant
|
33
|
+
end
|
34
|
+
else
|
35
|
+
def constantize
|
36
|
+
names = self.split('::')
|
37
|
+
names.shift if names.empty? || names.first.empty?
|
38
|
+
|
39
|
+
constant = Object
|
40
|
+
names.each do |name|
|
41
|
+
constant = constant.const_get(name, false) || constant.const_missing(name)
|
42
|
+
end
|
43
|
+
constant
|
44
44
|
end
|
45
|
-
constant
|
46
45
|
end
|
46
|
+
|
47
47
|
end
|
48
48
|
end
|
49
49
|
end
|
@@ -9,7 +9,7 @@ class Forgery::Address < Forgery
|
|
9
9
|
# Forgery(:address).street_name
|
10
10
|
# # => "Fordem"
|
11
11
|
def self.street_name
|
12
|
-
dictionaries[:streets].random
|
12
|
+
dictionaries[:streets].random.unextend
|
13
13
|
end
|
14
14
|
|
15
15
|
# Gets one of the formats from 'street_number_formats' and converts it to
|
@@ -32,7 +32,7 @@ class Forgery::Address < Forgery
|
|
32
32
|
# Forgery(:address).street_suffix
|
33
33
|
# # => "Parkway"
|
34
34
|
def self.street_suffix
|
35
|
-
dictionaries[:street_suffixes].random
|
35
|
+
dictionaries[:street_suffixes].random.unextend
|
36
36
|
end
|
37
37
|
|
38
38
|
# Gets a full street address, including street number, street name, and
|
@@ -55,7 +55,7 @@ class Forgery::Address < Forgery
|
|
55
55
|
# Forgery(:address).city
|
56
56
|
# # => "Sacramento"
|
57
57
|
def self.city
|
58
|
-
dictionaries[:cities].random
|
58
|
+
dictionaries[:cities].random.unextend
|
59
59
|
end
|
60
60
|
|
61
61
|
# Gets a random state out of the 'states' dictionary.
|
@@ -66,7 +66,7 @@ class Forgery::Address < Forgery
|
|
66
66
|
# Forgery(:address).state
|
67
67
|
# # => "Minnesota"
|
68
68
|
def self.state
|
69
|
-
dictionaries[:states].random
|
69
|
+
dictionaries[:states].random.unextend
|
70
70
|
end
|
71
71
|
|
72
72
|
# Gets a random state abbreviation out of the 'state_abbrev' dictionary.
|
@@ -77,7 +77,7 @@ class Forgery::Address < Forgery
|
|
77
77
|
# Forgery(:address).state_abbrev
|
78
78
|
# # => "TX"
|
79
79
|
def self.state_abbrev
|
80
|
-
dictionaries[:state_abbrevs].random
|
80
|
+
dictionaries[:state_abbrevs].random.unextend
|
81
81
|
end
|
82
82
|
|
83
83
|
# Gets a random Canadian province or territory out of the 'provinces' dictionary.
|
@@ -88,7 +88,7 @@ class Forgery::Address < Forgery
|
|
88
88
|
# Forgery(:address).province
|
89
89
|
# # => "Northwest Territories"
|
90
90
|
def self.province
|
91
|
-
dictionaries[:provinces].random
|
91
|
+
dictionaries[:provinces].random.unextend
|
92
92
|
end
|
93
93
|
|
94
94
|
# Gets a random Canadian province or territory abbreviation out of the 'province_abbrev' dictionary.
|
@@ -99,7 +99,7 @@ class Forgery::Address < Forgery
|
|
99
99
|
# Forgery(:address).province_abbrev
|
100
100
|
# # => "NT"
|
101
101
|
def self.province_abbrev
|
102
|
-
dictionaries[:province_abbrevs].random
|
102
|
+
dictionaries[:province_abbrevs].random.unextend
|
103
103
|
end
|
104
104
|
|
105
105
|
# Gets one of the formats from 'zip_formats' and converts it to numbers.
|
@@ -132,7 +132,7 @@ class Forgery::Address < Forgery
|
|
132
132
|
# Forgery(:address).country
|
133
133
|
# # => "Romania"
|
134
134
|
def self.country
|
135
|
-
dictionaries[:countries].random
|
135
|
+
dictionaries[:countries].random.unextend
|
136
136
|
end
|
137
137
|
|
138
138
|
|
@@ -144,7 +144,7 @@ class Forgery::Address < Forgery
|
|
144
144
|
# Forgery(:address).continent
|
145
145
|
# # => "Europe"
|
146
146
|
def self.continent
|
147
|
-
dictionaries[:continents].random
|
147
|
+
dictionaries[:continents].random.unextend
|
148
148
|
end
|
149
149
|
|
150
150
|
end
|
@@ -2,12 +2,12 @@ require 'digest/sha1'
|
|
2
2
|
|
3
3
|
class Forgery::Basic < Forgery
|
4
4
|
|
5
|
-
HEX_DIGITS = %w{0 1 2 3 4 5 6 7 8 9 a b c d e f}
|
6
|
-
UPPER_ALPHA = ('A'..'Z').to_a
|
7
|
-
LOWER_ALPHA = ('a'..'z').to_a
|
8
|
-
NUMERIC = ('0'..'9').to_a
|
9
|
-
SPECIAL_CHARACTERS = %w{! ' @ # $ % ^ & * ( ) _ + - = [ ] { } ; : " , . / ?}
|
10
|
-
BOOLEAN = [true, false]
|
5
|
+
HEX_DIGITS = Forgery::Extend(%w{0 1 2 3 4 5 6 7 8 9 a b c d e f})
|
6
|
+
UPPER_ALPHA = Forgery::Extend(('A'..'Z').to_a)
|
7
|
+
LOWER_ALPHA = Forgery::Extend(('a'..'z').to_a)
|
8
|
+
NUMERIC = Forgery::Extend(('0'..'9').to_a)
|
9
|
+
SPECIAL_CHARACTERS = Forgery::Extend(%w{! ' @ # $ % ^ & * ( ) _ + - = [ ] { } ; : " , . / ?})
|
10
|
+
BOOLEAN = Forgery::Extend([true, false])
|
11
11
|
|
12
12
|
# Gets a random string for use as a password
|
13
13
|
#
|
@@ -66,11 +66,11 @@ class Forgery::Basic < Forgery
|
|
66
66
|
end
|
67
67
|
|
68
68
|
def self.color
|
69
|
-
dictionaries[:colors].random
|
69
|
+
dictionaries[:colors].random.unextend
|
70
70
|
end
|
71
71
|
|
72
72
|
def self.hex_color
|
73
|
-
hex_digits = (1..6).collect { HEX_DIGITS.random}
|
73
|
+
hex_digits = (1..6).collect { HEX_DIGITS.random.unextend}
|
74
74
|
"##{hex_digits.join}"
|
75
75
|
end
|
76
76
|
|
@@ -82,7 +82,7 @@ class Forgery::Basic < Forgery
|
|
82
82
|
options = {:at_least => 1,
|
83
83
|
:at_most => 10}.merge(options)
|
84
84
|
|
85
|
-
(options[:at_least]..options[:at_most]).random
|
85
|
+
Forgery::Extend((options[:at_least]..options[:at_most])).random
|
86
86
|
end
|
87
87
|
|
88
88
|
def self.text(options={})
|
@@ -99,14 +99,14 @@ class Forgery::Basic < Forgery
|
|
99
99
|
allowed_characters += UPPER_ALPHA if options[:allow_upper]
|
100
100
|
allowed_characters += NUMERIC if options[:allow_numeric]
|
101
101
|
allowed_characters += SPECIAL_CHARACTERS if options[:allow_special]
|
102
|
-
|
103
|
-
length = options[:exactly] || (options[:at_least]..options[:at_most]).random
|
104
102
|
|
105
|
-
|
103
|
+
length = options[:exactly] || Forgery::Extend((options[:at_least]..options[:at_most])).random
|
104
|
+
|
105
|
+
Forgery::Extend(allowed_characters).random_subset(length).join
|
106
106
|
end
|
107
107
|
|
108
108
|
def self.frequency
|
109
|
-
dictionaries[:frequencies].random
|
109
|
+
dictionaries[:frequencies].random.unextend
|
110
110
|
end
|
111
111
|
|
112
112
|
end
|
@@ -5,7 +5,7 @@ class Forgery::Currency < Forgery
|
|
5
5
|
# Forgery(:currency).description
|
6
6
|
# # => "Australian Dollars"
|
7
7
|
def self.description
|
8
|
-
dictionaries[:currency_descriptions].random
|
8
|
+
dictionaries[:currency_descriptions].random.unextend
|
9
9
|
end
|
10
10
|
|
11
11
|
# Generates a random currency code for a country
|
@@ -13,7 +13,7 @@ class Forgery::Currency < Forgery
|
|
13
13
|
# Forgery(:currency).code
|
14
14
|
# # => "AUD"
|
15
15
|
def self.code
|
16
|
-
dictionaries[:currency_codes].random
|
16
|
+
dictionaries[:currency_codes].random.unextend
|
17
17
|
end
|
18
18
|
|
19
19
|
end
|
data/lib/forgery/forgery/date.rb
CHANGED
@@ -1,38 +1,38 @@
|
|
1
1
|
require 'date'
|
2
2
|
|
3
3
|
class Forgery::Date < Forgery
|
4
|
-
DAYS = %w{Sunday Monday Tuesday Wednesday Thursday Friday Saturday}
|
5
|
-
DAYS_ABBR = %w{Sun Mon Tue Wed Thu Fri Sat}
|
6
|
-
MONTHS = %w{January February March April May June July August September October November December}
|
7
|
-
MONTHS_ABBR = %w(Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec)
|
4
|
+
DAYS = Forgery::Extend(%w{Sunday Monday Tuesday Wednesday Thursday Friday Saturday})
|
5
|
+
DAYS_ABBR = Forgery::Extend(%w{Sun Mon Tue Wed Thu Fri Sat})
|
6
|
+
MONTHS = Forgery::Extend(%w{January February March April May June July August September October November December})
|
7
|
+
MONTHS_ABBR = Forgery::Extend(%w(Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec))
|
8
8
|
|
9
9
|
def self.day_of_week(options={})
|
10
|
-
options
|
10
|
+
options = {:abbr => false}.merge(options)
|
11
11
|
|
12
12
|
if (options[:abbr])
|
13
|
-
DAYS_ABBR.random
|
13
|
+
DAYS_ABBR.random.unextend
|
14
14
|
else
|
15
|
-
DAYS.random
|
15
|
+
DAYS.random.unextend
|
16
16
|
end
|
17
17
|
end
|
18
18
|
|
19
19
|
def self.month(options={})
|
20
|
-
options
|
20
|
+
options = {:abbr => false, :numerical => false}.merge(options)
|
21
21
|
|
22
22
|
if (options[:numerical])
|
23
23
|
1 + rand(12)
|
24
24
|
else
|
25
25
|
if (options[:abbr])
|
26
|
-
MONTHS_ABBR.random
|
26
|
+
MONTHS_ABBR.random.unextend
|
27
27
|
else
|
28
|
-
MONTHS.random
|
28
|
+
MONTHS.random.unextend
|
29
29
|
end
|
30
30
|
end
|
31
31
|
|
32
32
|
end
|
33
33
|
|
34
34
|
def self.year(options={})
|
35
|
-
options
|
35
|
+
options = {:future => false, :past => false, :min_delta => 0, :max_delta => 20}.merge(options)
|
36
36
|
|
37
37
|
#Apply our delta to this year
|
38
38
|
DateTime.now.year + delta(options)
|
@@ -43,7 +43,7 @@ class Forgery::Date < Forgery
|
|
43
43
|
end
|
44
44
|
|
45
45
|
def self.date(options={})
|
46
|
-
options
|
46
|
+
options = {:future => false, :past => false, :min_delta => 0, :max_delta => 7300}.merge(options)
|
47
47
|
|
48
48
|
#Apply our delta to today
|
49
49
|
::Date.today + delta(options)
|
@@ -5,7 +5,7 @@ class Forgery::Internet < Forgery
|
|
5
5
|
end
|
6
6
|
|
7
7
|
def self.top_level_domain
|
8
|
-
dictionaries[:top_level_domains].random
|
8
|
+
dictionaries[:top_level_domains].random.unextend
|
9
9
|
end
|
10
10
|
|
11
11
|
def self.domain_name
|
@@ -21,7 +21,7 @@ class Forgery::Internet < Forgery
|
|
21
21
|
end
|
22
22
|
|
23
23
|
def self.cctld
|
24
|
-
dictionaries[:country_code_top_level_domains].random
|
24
|
+
dictionaries[:country_code_top_level_domains].random.unextend
|
25
25
|
end
|
26
26
|
|
27
27
|
def self.ip_v4
|
@@ -58,12 +58,13 @@ class Forgery::LoremIpsum < Forgery
|
|
58
58
|
end
|
59
59
|
|
60
60
|
def self.paragraphs(quantity=2, options={})
|
61
|
-
|
61
|
+
default_options = {:separator => "\n\n",
|
62
62
|
:wrap => {
|
63
63
|
:start => "",
|
64
64
|
:end => "" },
|
65
65
|
:html => false,
|
66
|
-
:sentences => 3
|
66
|
+
:sentences => 3}
|
67
|
+
options = default_options.merge(options)
|
67
68
|
options.merge!(:random_limit => (dictionaries[:lorem_ipsum].length/options[:sentences])-quantity) if quantity.is_a?(Fixnum)
|
68
69
|
|
69
70
|
if options[:html]
|
data/lib/forgery/forgery/name.rb
CHANGED
@@ -1,11 +1,11 @@
|
|
1
1
|
class Forgery::Name < Forgery
|
2
2
|
|
3
3
|
def self.last_name
|
4
|
-
dictionaries[:last_names].random
|
4
|
+
dictionaries[:last_names].random.unextend
|
5
5
|
end
|
6
6
|
|
7
7
|
def self.first_name
|
8
|
-
[dictionaries[:male_first_names], dictionaries[:female_first_names]].random.random
|
8
|
+
[dictionaries[:male_first_names], dictionaries[:female_first_names]].random.random.unextend
|
9
9
|
end
|
10
10
|
|
11
11
|
def self.full_name
|
@@ -13,38 +13,38 @@ class Forgery::Name < Forgery
|
|
13
13
|
end
|
14
14
|
|
15
15
|
def self.male_first_name
|
16
|
-
dictionaries[:male_first_names].random
|
16
|
+
dictionaries[:male_first_names].random.unextend
|
17
17
|
end
|
18
18
|
|
19
19
|
def self.female_first_name
|
20
|
-
dictionaries[:female_first_names].random
|
20
|
+
dictionaries[:female_first_names].random.unextend
|
21
21
|
end
|
22
22
|
|
23
23
|
def self.company_name
|
24
|
-
dictionaries[:company_names].random
|
24
|
+
dictionaries[:company_names].random.unextend
|
25
25
|
end
|
26
26
|
|
27
27
|
def self.job_title
|
28
|
-
dictionaries[:job_titles].random.sub('#{N}', self.job_title_suffix)
|
28
|
+
dictionaries[:job_titles].random.sub('#{N}', self.job_title_suffix).unextend
|
29
29
|
end
|
30
30
|
|
31
31
|
def self.job_title_suffix
|
32
|
-
dictionaries[:job_title_suffixes].random
|
32
|
+
dictionaries[:job_title_suffixes].random.unextend
|
33
33
|
end
|
34
34
|
|
35
35
|
def self.title
|
36
|
-
dictionaries[:name_titles].random
|
36
|
+
dictionaries[:name_titles].random.unextend
|
37
37
|
end
|
38
38
|
|
39
39
|
def self.suffix
|
40
|
-
dictionaries[:name_suffixes].random
|
40
|
+
dictionaries[:name_suffixes].random.unextend
|
41
41
|
end
|
42
42
|
|
43
43
|
def self.location
|
44
|
-
dictionaries[:locations].random
|
44
|
+
dictionaries[:locations].random.unextend
|
45
45
|
end
|
46
46
|
|
47
47
|
def self.industry
|
48
|
-
dictionaries[:industries].random
|
48
|
+
dictionaries[:industries].random.unextend
|
49
49
|
end
|
50
50
|
end
|
@@ -1,7 +1,7 @@
|
|
1
1
|
class Forgery::Personal < Forgery
|
2
2
|
|
3
3
|
def self.gender
|
4
|
-
dictionaries[:genders].random
|
4
|
+
dictionaries[:genders].random.unextend
|
5
5
|
end
|
6
6
|
|
7
7
|
def self.abbreviated_gender
|
@@ -9,15 +9,15 @@ class Forgery::Personal < Forgery
|
|
9
9
|
end
|
10
10
|
|
11
11
|
def self.shirt_size
|
12
|
-
dictionaries[:shirt_sizes].random
|
12
|
+
dictionaries[:shirt_sizes].random.unextend
|
13
13
|
end
|
14
14
|
|
15
15
|
def self.race
|
16
|
-
dictionaries[:races].random
|
16
|
+
dictionaries[:races].random.unextend
|
17
17
|
end
|
18
18
|
|
19
19
|
def self.language
|
20
|
-
dictionaries[:languages].random
|
20
|
+
dictionaries[:languages].random.unextend
|
21
21
|
end
|
22
22
|
|
23
23
|
end
|
data/lib/forgery/forgery/time.rb
CHANGED
data/lib/forgery/forgery_api.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
# Alternate Forgery api, see spec/forgery_spec.rb for examples.
|
2
2
|
def Forgery(forgery, method=nil, *args)
|
3
|
-
klass = "Forgery::#{forgery.to_s.camelize}".constantize
|
3
|
+
klass = Forgery::Extend("Forgery::#{Forgery::Extend(forgery.to_s).camelize}").constantize
|
4
4
|
if method
|
5
5
|
klass.send(method, *args)
|
6
6
|
else
|
data/lib/forgery/formats.rb
CHANGED
data/lib/forgery/version.rb
CHANGED
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: forgery
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 15
|
5
5
|
prerelease:
|
6
6
|
segments:
|
7
7
|
- 0
|
8
|
-
-
|
9
|
-
-
|
10
|
-
version: 0.
|
8
|
+
- 4
|
9
|
+
- 0
|
10
|
+
version: 0.4.0
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Nathan Sutton
|
@@ -16,8 +16,7 @@ autorequire:
|
|
16
16
|
bindir: bin
|
17
17
|
cert_chain: []
|
18
18
|
|
19
|
-
date: 2011-
|
20
|
-
default_executable:
|
19
|
+
date: 2011-09-04 00:00:00 Z
|
21
20
|
dependencies:
|
22
21
|
- !ruby/object:Gem::Dependency
|
23
22
|
name: nokogiri
|
@@ -93,8 +92,8 @@ files:
|
|
93
92
|
- lib/forgery/dictionaries/top_level_domains
|
94
93
|
- lib/forgery/dictionaries/zones
|
95
94
|
- lib/forgery/dictionaries.rb
|
95
|
+
- lib/forgery/extend.rb
|
96
96
|
- lib/forgery/extensions/array.rb
|
97
|
-
- lib/forgery/extensions/hash.rb
|
98
97
|
- lib/forgery/extensions/range.rb
|
99
98
|
- lib/forgery/extensions/string.rb
|
100
99
|
- lib/forgery/file_reader.rb
|
@@ -123,7 +122,6 @@ files:
|
|
123
122
|
- LICENSE
|
124
123
|
- README.markdown
|
125
124
|
- Rakefile
|
126
|
-
has_rdoc: true
|
127
125
|
homepage: http://github.com/sevenwire/forgery
|
128
126
|
licenses: []
|
129
127
|
|
@@ -153,7 +151,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
153
151
|
requirements: []
|
154
152
|
|
155
153
|
rubyforge_project: forgery
|
156
|
-
rubygems_version: 1.
|
154
|
+
rubygems_version: 1.8.7
|
157
155
|
signing_key:
|
158
156
|
specification_version: 3
|
159
157
|
summary: Easy and customizable generation of forged data.
|
@@ -1,12 +0,0 @@
|
|
1
|
-
class Hash
|
2
|
-
# Performs the opposite of merge, with the keys and values from the first hash taking precedence over the second.
|
3
|
-
def reverse_merge(other_hash)
|
4
|
-
other_hash.merge(self)
|
5
|
-
end
|
6
|
-
|
7
|
-
# Performs the opposite of merge, with the keys and values from the first hash taking precedence over the second.
|
8
|
-
# Modifies the receiver in place.
|
9
|
-
def reverse_merge!(other_hash)
|
10
|
-
replace(reverse_merge(other_hash))
|
11
|
-
end
|
12
|
-
end
|