dummy 0.5
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.
- data/CHANGELOG.md +33 -0
- data/LICENSE +20 -0
- data/README.md +79 -0
- data/lib/dummy.rb +161 -0
- data/lib/dummy/address.rb +144 -0
- data/lib/dummy/company.rb +139 -0
- data/lib/dummy/geolocation.rb +13 -0
- data/lib/dummy/internet.rb +50 -0
- data/lib/dummy/lorem.rb +58 -0
- data/lib/dummy/name.rb +375 -0
- data/lib/dummy/phone_number.rb +30 -0
- data/lib/generators/dummy_generator.rb +185 -0
- data/lib/generators/templates/dummy.rake +13 -0
- metadata +93 -0
@@ -0,0 +1,30 @@
|
|
1
|
+
module Dummy
|
2
|
+
module PhoneNumber
|
3
|
+
extend self
|
4
|
+
|
5
|
+
def phone_number
|
6
|
+
Dummy.numerify case rand(20)
|
7
|
+
when 0 then "###-###-#### x#####"
|
8
|
+
when 1 then "###-###-#### x####"
|
9
|
+
when 2 then "###-###-#### x###"
|
10
|
+
when 3..4 then "###-###-####"
|
11
|
+
when 5 then "###.###.#### x#####"
|
12
|
+
when 6 then "###.###.#### x####"
|
13
|
+
when 7 then "###.###.#### x###"
|
14
|
+
when 8..9 then "###.###.####"
|
15
|
+
when 10 then "(###)###-#### x#####"
|
16
|
+
when 11 then "(###)###-#### x####"
|
17
|
+
when 12 then "(###)###-#### x###"
|
18
|
+
when 13..14 then "(###)###-####"
|
19
|
+
when 15 then "1-###-###-#### x#####"
|
20
|
+
when 16 then "1-###-###-#### x####"
|
21
|
+
when 17 then "1-###-###-#### x###"
|
22
|
+
when 18..19 then "1-###-###-####"
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
def phone_number_short
|
27
|
+
Dummy.numerify("###-###-####")
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1,185 @@
|
|
1
|
+
require "yaml"
|
2
|
+
require "active_support"
|
3
|
+
require "active_record"
|
4
|
+
require "rails/generators"
|
5
|
+
|
6
|
+
module Dummy
|
7
|
+
class DataGenerator < Rails::Generators::Base
|
8
|
+
def self.source_root
|
9
|
+
@source_root ||= File.expand_path("../templates", __FILE__)
|
10
|
+
end
|
11
|
+
|
12
|
+
class_option :base_amount, :type => :numeric, :default => 10,
|
13
|
+
:desc => "The base amount of records to generate for each model."
|
14
|
+
class_option :growth_ratio, :type => :numeric, :default => 2.0,
|
15
|
+
:desc => "The growth ratio of each model, according to its associations."
|
16
|
+
|
17
|
+
def install_dummy
|
18
|
+
initialize_application
|
19
|
+
generate_dummy_data
|
20
|
+
copy_rake_file
|
21
|
+
end
|
22
|
+
|
23
|
+
private
|
24
|
+
|
25
|
+
def initialize_application
|
26
|
+
require File.expand_path("#{Rails.root}/config/environment.rb")
|
27
|
+
say_status :successful, "initialize Rails application"
|
28
|
+
end
|
29
|
+
|
30
|
+
def generate_dummy_data
|
31
|
+
get_table_names
|
32
|
+
gather_associations
|
33
|
+
predict_record_amounts
|
34
|
+
generate_and_write_data
|
35
|
+
end
|
36
|
+
|
37
|
+
def get_table_names
|
38
|
+
@models = Hash.new
|
39
|
+
Dir["app/models/*.rb"].each do |full_path|
|
40
|
+
model = File.basename(full_path).chomp(File.extname(full_path)).camelcase.constantize
|
41
|
+
@models.merge!({model => {
|
42
|
+
:record_amount => 0, :associations => []
|
43
|
+
}}) if model.respond_to?(:columns)
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
def gather_associations
|
48
|
+
@models.each_key do |model|
|
49
|
+
model_symbol = model.to_s.underscore.pluralize.to_sym
|
50
|
+
associations = model.reflect_on_all_associations(:belongs_to)
|
51
|
+
|
52
|
+
associations.each do |assoc|
|
53
|
+
assoc_name = assoc.name.to_s.camelcase
|
54
|
+
assoc_options = assoc.options
|
55
|
+
|
56
|
+
if assoc_options.empty?
|
57
|
+
@models[model][:associations].push({
|
58
|
+
:model => assoc_name.constantize,
|
59
|
+
:foreign_key => "#{assoc_name.underscore}_id"
|
60
|
+
})
|
61
|
+
elsif assoc_options.has_key?(:class_name) and assoc_options.has_key?(:foreign_key)
|
62
|
+
@models[model][:associations].push({
|
63
|
+
:model => assoc_options[:class_name].constantize, # TODO: handle class_name
|
64
|
+
:foreign_key => assoc_options[:foreign_key]
|
65
|
+
})
|
66
|
+
else
|
67
|
+
next
|
68
|
+
end
|
69
|
+
|
70
|
+
assoc_model = @models[model][:associations].last[:model]
|
71
|
+
assoc_reflections = assoc_model.reflect_on_all_associations(:has_one)
|
72
|
+
@models[model][:associations].pop if assoc_reflections.map(&:name).include?(model_symbol)
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
77
|
+
def predict_record_amounts
|
78
|
+
models = @models.dup
|
79
|
+
models.each do |model, info|
|
80
|
+
predict_record_amount(model, info, models, [])
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
84
|
+
def predict_record_amount(model, info, models, stacked_models)
|
85
|
+
info[:associations].each do |assoc|
|
86
|
+
next if stacked_models.include?(assoc[:model])
|
87
|
+
|
88
|
+
if model != assoc[:model]
|
89
|
+
stacked_models << assoc[:model]
|
90
|
+
predict_record_amount(assoc[:model], @models[assoc[:model]], models, stacked_models)
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
94
|
+
amount = options.base_amount
|
95
|
+
if not info[:associations].empty?
|
96
|
+
amount = info[:associations].map do |assoc|
|
97
|
+
@models[assoc[:model]][:record_amount]
|
98
|
+
end.max*options.growth_ratio # **info[:associations].size
|
99
|
+
end
|
100
|
+
|
101
|
+
@models[model][:record_amount] = amount.to_i
|
102
|
+
stacked_models.delete(model)
|
103
|
+
models.delete(model)
|
104
|
+
end
|
105
|
+
|
106
|
+
def generate_and_write_data
|
107
|
+
empty_directory "test/dummy"
|
108
|
+
data = Hash.new
|
109
|
+
|
110
|
+
@models.each do |model, info|
|
111
|
+
name = model.to_s.underscore
|
112
|
+
|
113
|
+
(0..info[:record_amount]-1).each do |num|
|
114
|
+
key_value = Hash.new
|
115
|
+
fixture_data = Hash.new
|
116
|
+
|
117
|
+
model.columns.each do |column|
|
118
|
+
key_value = generate_record_data(name, info, column)
|
119
|
+
fixture_data.merge!(key_value) unless key_value.nil?
|
120
|
+
end
|
121
|
+
|
122
|
+
data[model.table_name] = Hash.new if data[model.table_name].nil?
|
123
|
+
data[model.table_name].merge!({ "#{name}_#{num}" => fixture_data })
|
124
|
+
end
|
125
|
+
|
126
|
+
say_status :successful, "generate #{info[:record_amount]} records for '#{name}'"
|
127
|
+
end
|
128
|
+
|
129
|
+
data.each do |name, fixtures|
|
130
|
+
content = "# '#{name}' data generated automatically by dummy at #{Time.now.strftime("%H:%M %m/%d/%Y")} (#{fixtures.size} records).\n"
|
131
|
+
|
132
|
+
content << YAML.dump(fixtures)
|
133
|
+
|
134
|
+
create_file "test/dummy/#{name}.yml", content
|
135
|
+
end
|
136
|
+
say_status :successful, "store fixtures"
|
137
|
+
end
|
138
|
+
|
139
|
+
def generate_record_data(name, info, column)
|
140
|
+
column_name = column.name
|
141
|
+
if(column_name =~ /_at$/ and column.type == :datetime) or column_name == "id"
|
142
|
+
return
|
143
|
+
end
|
144
|
+
|
145
|
+
associated_model = associated_class_name(info, column_name)
|
146
|
+
|
147
|
+
if associated_model
|
148
|
+
val = generate_association_data(associated_model)
|
149
|
+
column_name.gsub!(/_id$/, "")
|
150
|
+
else
|
151
|
+
val = generate_regular_data(column)
|
152
|
+
end
|
153
|
+
|
154
|
+
{column_name => val}
|
155
|
+
end
|
156
|
+
|
157
|
+
def associated_class_name(info, name)
|
158
|
+
info[:associations].each do |assoc|
|
159
|
+
return assoc[:model] if assoc[:foreign_key] == name
|
160
|
+
end
|
161
|
+
false
|
162
|
+
end
|
163
|
+
|
164
|
+
def generate_association_data(associated_model)
|
165
|
+
random_record_num = rand(@models[associated_model][:record_amount])
|
166
|
+
"#{associated_model.to_s.underscore}_#{random_record_num}"
|
167
|
+
end
|
168
|
+
|
169
|
+
def generate_regular_data(column)
|
170
|
+
val = Dummy.magic_data(column.name, column.type)
|
171
|
+
|
172
|
+
if val
|
173
|
+
val
|
174
|
+
else
|
175
|
+
say_status :failed, "data generation for '#{column.name}' with type '#{column.type.to_s.downcase}'", :red
|
176
|
+
""
|
177
|
+
end
|
178
|
+
end
|
179
|
+
|
180
|
+
def copy_rake_file
|
181
|
+
copy_file "dummy.rake", "lib/tasks/dummy.rake"
|
182
|
+
end
|
183
|
+
end
|
184
|
+
end
|
185
|
+
|
@@ -0,0 +1,13 @@
|
|
1
|
+
require 'active_record/fixtures'
|
2
|
+
|
3
|
+
namespace :dummy do
|
4
|
+
namespace :data do
|
5
|
+
desc "Load the generated dummy data into the current environment's database."
|
6
|
+
task :import => :environment do
|
7
|
+
Fixtures.reset_cache
|
8
|
+
fixtures_folder = File.join(Rails.root, 'test', 'dummy')
|
9
|
+
fixtures = Dir[File.join(fixtures_folder, '*.yml')].map {|f| File.basename(f, '.yml') }
|
10
|
+
Fixtures.create_fixtures(fixtures_folder, fixtures)
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
metadata
ADDED
@@ -0,0 +1,93 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: dummy
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
prerelease: false
|
5
|
+
segments:
|
6
|
+
- 0
|
7
|
+
- 5
|
8
|
+
version: "0.5"
|
9
|
+
platform: ruby
|
10
|
+
authors:
|
11
|
+
- "Gon\xC3\xA7alo Silva"
|
12
|
+
autorequire:
|
13
|
+
bindir: bin
|
14
|
+
cert_chain: []
|
15
|
+
|
16
|
+
date: 2010-07-29 00:00:00 +01:00
|
17
|
+
default_executable:
|
18
|
+
dependencies:
|
19
|
+
- !ruby/object:Gem::Dependency
|
20
|
+
name: rails
|
21
|
+
prerelease: false
|
22
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
23
|
+
none: false
|
24
|
+
requirements:
|
25
|
+
- - ">="
|
26
|
+
- !ruby/object:Gem::Version
|
27
|
+
segments:
|
28
|
+
- 3
|
29
|
+
- 0
|
30
|
+
- 0
|
31
|
+
- rc
|
32
|
+
version: 3.0.0.rc
|
33
|
+
type: :runtime
|
34
|
+
version_requirements: *id001
|
35
|
+
description: Generates test routes and consistent fake data, inserts it to the database and runs performance tests with them
|
36
|
+
email:
|
37
|
+
- goncalossilva@gmail.com
|
38
|
+
executables: []
|
39
|
+
|
40
|
+
extensions: []
|
41
|
+
|
42
|
+
extra_rdoc_files: []
|
43
|
+
|
44
|
+
files:
|
45
|
+
- lib/dummy/lorem.rb
|
46
|
+
- lib/dummy/address.rb
|
47
|
+
- lib/dummy/company.rb
|
48
|
+
- lib/dummy/name.rb
|
49
|
+
- lib/dummy/internet.rb
|
50
|
+
- lib/dummy/geolocation.rb
|
51
|
+
- lib/dummy/phone_number.rb
|
52
|
+
- lib/generators/dummy_generator.rb
|
53
|
+
- lib/dummy.rb
|
54
|
+
- lib/generators/templates/dummy.rake
|
55
|
+
- LICENSE
|
56
|
+
- README.md
|
57
|
+
- CHANGELOG.md
|
58
|
+
has_rdoc: true
|
59
|
+
homepage: http://github.com/goncalossilva/dummy
|
60
|
+
licenses: []
|
61
|
+
|
62
|
+
post_install_message:
|
63
|
+
rdoc_options: []
|
64
|
+
|
65
|
+
require_paths:
|
66
|
+
- lib
|
67
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
68
|
+
none: false
|
69
|
+
requirements:
|
70
|
+
- - ">="
|
71
|
+
- !ruby/object:Gem::Version
|
72
|
+
segments:
|
73
|
+
- 0
|
74
|
+
version: "0"
|
75
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
76
|
+
none: false
|
77
|
+
requirements:
|
78
|
+
- - ">="
|
79
|
+
- !ruby/object:Gem::Version
|
80
|
+
segments:
|
81
|
+
- 1
|
82
|
+
- 3
|
83
|
+
- 7
|
84
|
+
version: 1.3.7
|
85
|
+
requirements: []
|
86
|
+
|
87
|
+
rubyforge_project: dummy
|
88
|
+
rubygems_version: 1.3.7
|
89
|
+
signing_key:
|
90
|
+
specification_version: 3
|
91
|
+
summary: Generates fake data and test routes and runs performance tests with it
|
92
|
+
test_files: []
|
93
|
+
|