populate 0.0.2
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +4 -0
- data/.rvmrc +1 -0
- data/Gemfile +4 -0
- data/Rakefile +1 -0
- data/lib/populate.rb +14 -0
- data/lib/populate/base.rb +124 -0
- data/lib/populate/version.rb +3 -0
- data/populate.gemspec +24 -0
- data/readme.md +22 -0
- metadata +87 -0
data/.gitignore
ADDED
data/.rvmrc
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
rvm use 1.9.3@populate --create --install
|
data/Gemfile
ADDED
data/Rakefile
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
require "bundler/gem_tasks"
|
data/lib/populate.rb
ADDED
@@ -0,0 +1,124 @@
|
|
1
|
+
module Populate
|
2
|
+
class Base
|
3
|
+
def initialize(klass, amount = 100)
|
4
|
+
@klass = klass
|
5
|
+
@amount = amount
|
6
|
+
end
|
7
|
+
|
8
|
+
def populate!
|
9
|
+
truncate!
|
10
|
+
header "Populating #{quantity} #{@klass.to_s.pluralize}"
|
11
|
+
|
12
|
+
quantity.times do
|
13
|
+
models << model = @klass.create{|m| populate_attributes(m)}
|
14
|
+
status(model)
|
15
|
+
end
|
16
|
+
|
17
|
+
puts
|
18
|
+
models
|
19
|
+
end
|
20
|
+
|
21
|
+
protected
|
22
|
+
|
23
|
+
def populate_attributes(model)
|
24
|
+
columns.each do |column|
|
25
|
+
model.send("#{column.name}=", data_for_attribute(column))
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
def data_for_attribute(column)
|
30
|
+
case column.type
|
31
|
+
when :boolean
|
32
|
+
[true, false].sample
|
33
|
+
when :datetime
|
34
|
+
case column.name
|
35
|
+
when /_at$/
|
36
|
+
rand(3.years.ago..Time.now)
|
37
|
+
else
|
38
|
+
rand(3.years.ago..3.years.from_now)
|
39
|
+
end
|
40
|
+
when :date
|
41
|
+
case column.name
|
42
|
+
when /dob|date_of_birth/
|
43
|
+
rand(90.years.ago.to_date..13.years.ago.to_date)
|
44
|
+
else
|
45
|
+
rand(3.years.ago.to_date..3.years.from_now.to_date)
|
46
|
+
end
|
47
|
+
when :string
|
48
|
+
word_count = [*1..10].sample
|
49
|
+
str = Faker::Lorem.words(word_count).join(' ')
|
50
|
+
|
51
|
+
case column.name
|
52
|
+
when /title|subject/
|
53
|
+
str.titleize
|
54
|
+
when /first_name/
|
55
|
+
Faker::Name.first_name
|
56
|
+
when /last_name|surname/
|
57
|
+
Faker::Name.last_name
|
58
|
+
when /email/
|
59
|
+
Faker::Internet.email
|
60
|
+
when /url|website/
|
61
|
+
Faker::Internet.http_url
|
62
|
+
when /user_?name|login|screen_?name/
|
63
|
+
Faker::Internet.user_name
|
64
|
+
when /phone|mobile/
|
65
|
+
Faker::PhoneNumber.phone_number
|
66
|
+
when /gender/
|
67
|
+
['male', 'female'].sample
|
68
|
+
else
|
69
|
+
str
|
70
|
+
end
|
71
|
+
when :text
|
72
|
+
paragraph_count = [*1..4].sample
|
73
|
+
Faker::Lorem.paragraphs(paragraph_count).join("\n\n")
|
74
|
+
when :integer
|
75
|
+
case column.name
|
76
|
+
when /_id$/
|
77
|
+
reflection_name = column.name[/(.*)_id/, 1].to_sym
|
78
|
+
reflection = @klass.reflections[reflection_name]
|
79
|
+
active_record = (reflection.options[:class_name] || reflection.name.to_s.classify).constantize
|
80
|
+
(cached_ids[reflection_name] ||= active_record.pluck(:id)).sample
|
81
|
+
else
|
82
|
+
rand(1..999)
|
83
|
+
end
|
84
|
+
when :float
|
85
|
+
case column.name
|
86
|
+
when /price|cost/
|
87
|
+
("%.2f" % rand(0.0..500.0)).to_f
|
88
|
+
else
|
89
|
+
rand(0.0..10.0)
|
90
|
+
end
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
94
|
+
def cached_ids
|
95
|
+
@cached_ids ||= {}
|
96
|
+
end
|
97
|
+
|
98
|
+
def columns
|
99
|
+
@klass.columns.select do |column|
|
100
|
+
!column.name[/^id|updated_at$/]
|
101
|
+
end
|
102
|
+
end
|
103
|
+
|
104
|
+
def status(model)
|
105
|
+
print model.valid? ? '.' : 'F'.color(:red)
|
106
|
+
end
|
107
|
+
|
108
|
+
def models
|
109
|
+
@models ||= []
|
110
|
+
end
|
111
|
+
|
112
|
+
def truncate!
|
113
|
+
@klass.delete_all
|
114
|
+
end
|
115
|
+
|
116
|
+
def quantity
|
117
|
+
@quantity ||= [*@amount].sample
|
118
|
+
end
|
119
|
+
|
120
|
+
def header(str)
|
121
|
+
puts str.bright.color(:green)
|
122
|
+
end
|
123
|
+
end
|
124
|
+
end
|
data/populate.gemspec
ADDED
@@ -0,0 +1,24 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
$:.push File.expand_path("../lib", __FILE__)
|
3
|
+
require "populate/version"
|
4
|
+
|
5
|
+
Gem::Specification.new do |s|
|
6
|
+
s.name = "populate"
|
7
|
+
s.version = Populate::VERSION
|
8
|
+
s.authors = ["Jim Neath"]
|
9
|
+
s.email = ["jimneath@gmail.com"]
|
10
|
+
s.homepage = ""
|
11
|
+
s.summary = %q{Populates your development database with fake data}
|
12
|
+
s.description = %q{Populates your development database with fake data}
|
13
|
+
|
14
|
+
s.rubyforge_project = "populate"
|
15
|
+
|
16
|
+
s.files = `git ls-files`.split("\n")
|
17
|
+
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
18
|
+
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
19
|
+
s.require_paths = ["lib"]
|
20
|
+
|
21
|
+
s.add_dependency 'ffaker', '>= 1.13.0'
|
22
|
+
s.add_dependency 'rainbow', '>= 1.1.3'
|
23
|
+
s.add_dependency 'activerecord', '>= 3.1.0'
|
24
|
+
end
|
data/readme.md
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
# Populate
|
2
|
+
|
3
|
+
Populates your database with lovely fake data automatically.
|
4
|
+
|
5
|
+
## Prequisites
|
6
|
+
|
7
|
+
Populate has only been tested with Ruby 1.9.3 and Rails 3.1+. As such, it probably won't work with anything else.
|
8
|
+
|
9
|
+
## Installation
|
10
|
+
|
11
|
+
gem 'populate'
|
12
|
+
|
13
|
+
## Useage
|
14
|
+
|
15
|
+
task :populate => :environment do
|
16
|
+
populate User, 10..50
|
17
|
+
populate Article, 100..500
|
18
|
+
end
|
19
|
+
|
20
|
+
## Credits
|
21
|
+
|
22
|
+
Jim Neath
|
metadata
ADDED
@@ -0,0 +1,87 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: populate
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.2
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Jim Neath
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2012-03-21 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: ffaker
|
16
|
+
requirement: &70291254508000 !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
18
|
+
requirements:
|
19
|
+
- - ! '>='
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: 1.13.0
|
22
|
+
type: :runtime
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: *70291254508000
|
25
|
+
- !ruby/object:Gem::Dependency
|
26
|
+
name: rainbow
|
27
|
+
requirement: &70291254506800 !ruby/object:Gem::Requirement
|
28
|
+
none: false
|
29
|
+
requirements:
|
30
|
+
- - ! '>='
|
31
|
+
- !ruby/object:Gem::Version
|
32
|
+
version: 1.1.3
|
33
|
+
type: :runtime
|
34
|
+
prerelease: false
|
35
|
+
version_requirements: *70291254506800
|
36
|
+
- !ruby/object:Gem::Dependency
|
37
|
+
name: activerecord
|
38
|
+
requirement: &70291254505360 !ruby/object:Gem::Requirement
|
39
|
+
none: false
|
40
|
+
requirements:
|
41
|
+
- - ! '>='
|
42
|
+
- !ruby/object:Gem::Version
|
43
|
+
version: 3.1.0
|
44
|
+
type: :runtime
|
45
|
+
prerelease: false
|
46
|
+
version_requirements: *70291254505360
|
47
|
+
description: Populates your development database with fake data
|
48
|
+
email:
|
49
|
+
- jimneath@gmail.com
|
50
|
+
executables: []
|
51
|
+
extensions: []
|
52
|
+
extra_rdoc_files: []
|
53
|
+
files:
|
54
|
+
- .gitignore
|
55
|
+
- .rvmrc
|
56
|
+
- Gemfile
|
57
|
+
- Rakefile
|
58
|
+
- lib/populate.rb
|
59
|
+
- lib/populate/base.rb
|
60
|
+
- lib/populate/version.rb
|
61
|
+
- populate.gemspec
|
62
|
+
- readme.md
|
63
|
+
homepage: ''
|
64
|
+
licenses: []
|
65
|
+
post_install_message:
|
66
|
+
rdoc_options: []
|
67
|
+
require_paths:
|
68
|
+
- lib
|
69
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
70
|
+
none: false
|
71
|
+
requirements:
|
72
|
+
- - ! '>='
|
73
|
+
- !ruby/object:Gem::Version
|
74
|
+
version: '0'
|
75
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
76
|
+
none: false
|
77
|
+
requirements:
|
78
|
+
- - ! '>='
|
79
|
+
- !ruby/object:Gem::Version
|
80
|
+
version: '0'
|
81
|
+
requirements: []
|
82
|
+
rubyforge_project: populate
|
83
|
+
rubygems_version: 1.8.16
|
84
|
+
signing_key:
|
85
|
+
specification_version: 3
|
86
|
+
summary: Populates your development database with fake data
|
87
|
+
test_files: []
|