populate 0.0.2

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.
@@ -0,0 +1,4 @@
1
+ *.gem
2
+ .bundle
3
+ Gemfile.lock
4
+ pkg/*
data/.rvmrc ADDED
@@ -0,0 +1 @@
1
+ rvm use 1.9.3@populate --create --install
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source "http://rubygems.org"
2
+
3
+ # Specify your gem's dependencies in populate.gemspec
4
+ gemspec
@@ -0,0 +1 @@
1
+ require "bundler/gem_tasks"
@@ -0,0 +1,14 @@
1
+ require 'ffaker'
2
+ require 'rainbow'
3
+
4
+ require 'populate/base'
5
+ require 'populate/version'
6
+
7
+ module Populate
8
+ end
9
+
10
+ module Kernel
11
+ def populate(klass, amount = 100)
12
+ Populate::Base.new(klass, amount).populate!
13
+ end
14
+ end
@@ -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
@@ -0,0 +1,3 @@
1
+ module Populate
2
+ VERSION = '0.0.2'
3
+ end
@@ -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
@@ -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: []