factory_bro 0.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/lib/factory_bro.rb +125 -0
- metadata +85 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: e69622ef3890178079a03e5a05f48f18031761d5
|
4
|
+
data.tar.gz: c2fe5d90948dd134d3bc7fa478301bee227ea217
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 7bf9db34521a8ab5748c1f0f50c339abcd66965a29be392464d0b80371e3642e79dc25db8b305552668c2317813d6dad9837341e95c889e130680cfcda35942e
|
7
|
+
data.tar.gz: 6c97639c5948726a394e9a50fafec5ce2a169009ed71fd4601d9eb16be0d8d850c98ab744ec9a28dd8085a892c7548b63ed9880c8d06053fe375366d3cfa523c
|
data/lib/factory_bro.rb
ADDED
@@ -0,0 +1,125 @@
|
|
1
|
+
require 'pg'
|
2
|
+
require 'faker'
|
3
|
+
require 'json'
|
4
|
+
|
5
|
+
class FactoryBro
|
6
|
+
def self.connect(db)
|
7
|
+
if db.include? 'postgres://'
|
8
|
+
dbData = parse_url(db)
|
9
|
+
conn = PG.connect( user: dbData[:user],
|
10
|
+
password: dbData[:pw],
|
11
|
+
host: dbData[:host],
|
12
|
+
port: dbData[:port],
|
13
|
+
dbname: dbData[:dbname]
|
14
|
+
)
|
15
|
+
else
|
16
|
+
# take arguments of user and pw
|
17
|
+
$conn = PG.connect( dbname: db)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
def self.create_bases
|
22
|
+
tables = parse_tables
|
23
|
+
system 'mkdir', '-p', 'factories' unless File.directory?(Dir.pwd+"/factories")
|
24
|
+
tables.each do |table|
|
25
|
+
path = File.join(Dir.pwd, 'factories', "#{table}.rb")
|
26
|
+
unless File.exists?(path)
|
27
|
+
|
28
|
+
File.open(path, 'w') {|file| file.write(base_factory_content(table)) }
|
29
|
+
# puts "#{table} factory created at: #{path}"
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
def self.generate_data(table, data)
|
35
|
+
helperData = generate_helper(data[:factoryData])
|
36
|
+
res = $conn.exec("INSERT INTO #{table} (#{helperData[:columns]})
|
37
|
+
VALUES (#{helperData[:values]});")
|
38
|
+
data[:meta]
|
39
|
+
end
|
40
|
+
|
41
|
+
private
|
42
|
+
|
43
|
+
def self.parse_url(url)
|
44
|
+
{ :user => url.scan(/postgres:..[A-Za-z0-9]+/).first.split('//')[-1],
|
45
|
+
:pw => url.scan(/:[A-Za-z0-9]+@/).first.gsub(/[^a-zA-Z0-9\-]/,""),
|
46
|
+
:host => url.scan(/(?<=@)(.*)(?=:)/).first.first,
|
47
|
+
:port => url.scan(/:[0-9]+./).first.split('/').first.gsub(/[^a-zA-Z0-9\-]/,""),
|
48
|
+
:dbname => url.scan(/.[A-Za-z0-9]+$/).first.gsub(/[^a-zA-Z0-9\-]/,"")
|
49
|
+
}
|
50
|
+
end
|
51
|
+
|
52
|
+
def self.parse_tables
|
53
|
+
res = $conn.exec("SELECT TABLE_NAME
|
54
|
+
FROM INFORMATION_SCHEMA.TABLES
|
55
|
+
WHERE TABLE_TYPE = 'BASE TABLE' AND TABLE_SCHEMA='public'
|
56
|
+
ORDER BY TABLE_NAME;")
|
57
|
+
res.values.flatten # as array of column names
|
58
|
+
end
|
59
|
+
|
60
|
+
def self.parse_columns(table)
|
61
|
+
# hash this
|
62
|
+
res = $conn.exec(" SELECT COLUMN_NAME, DATA_TYPE, CHARACTER_MAXIMUM_LENGTH
|
63
|
+
FROM INFORMATION_SCHEMA.COLUMNS
|
64
|
+
WHERE TABLE_NAME = '#{table}';")
|
65
|
+
res.values # as tuple
|
66
|
+
end
|
67
|
+
|
68
|
+
def self.base_factory_content(table)
|
69
|
+
"module Factory
|
70
|
+
class #{table.capitalize}
|
71
|
+
def self.base
|
72
|
+
# remember:
|
73
|
+
# to return any needed metadata (i.e. ID)
|
74
|
+
# run other required bases before running method below
|
75
|
+
FactoryBro.generate_data('#{table}' , #{base_method_helper(table)})
|
76
|
+
end
|
77
|
+
end
|
78
|
+
end
|
79
|
+
"
|
80
|
+
end
|
81
|
+
|
82
|
+
def self.base_method_helper(table)
|
83
|
+
data = {}
|
84
|
+
parse_columns(table).each do |column|
|
85
|
+
data.merge!(column.first => auto_faker_assignment(column)) # idk if auto faker assignment is helping or a burden?
|
86
|
+
end
|
87
|
+
JSON.pretty_generate({ "factoryData" => data, "meta"=> {}})
|
88
|
+
end
|
89
|
+
|
90
|
+
def self.auto_faker_assignment(column)
|
91
|
+
type = column[1] # hash this
|
92
|
+
name = column.first
|
93
|
+
if type == "character varying"
|
94
|
+
if name.include? 'sign_in_ip'
|
95
|
+
return "Faker::Internet.ip_v4_address"
|
96
|
+
elsif name == 'email'
|
97
|
+
return "Faker::Internet.safe_email"
|
98
|
+
else
|
99
|
+
return "Faker::Lorem.characters(32)"
|
100
|
+
end
|
101
|
+
elsif type == "text"
|
102
|
+
return "# password and password salt? don't know what to return"
|
103
|
+
elsif type == "integer"
|
104
|
+
return "rand(0...1000)"
|
105
|
+
elsif type == "boolean"
|
106
|
+
return "Faker::Boolean.boolean"
|
107
|
+
elsif type == "timestamp with time zone"
|
108
|
+
return "Faker::Time.between(DateTime.now - 1, DateTime.now)"
|
109
|
+
else
|
110
|
+
"# could not determine type: #{type}"
|
111
|
+
end
|
112
|
+
end
|
113
|
+
|
114
|
+
def self.generate_helper(data)
|
115
|
+
formatted = data.to_a
|
116
|
+
columns = "#{formatted.first.first.to_s}"
|
117
|
+
values = "'#{formatted.first.last}'"
|
118
|
+
formatted.shift
|
119
|
+
formatted.each do |column|
|
120
|
+
columns += ", #{column.first.to_s}"
|
121
|
+
values += ", '#{column.last}'"
|
122
|
+
end
|
123
|
+
{ columns: columns, values: values}
|
124
|
+
end
|
125
|
+
end
|
metadata
ADDED
@@ -0,0 +1,85 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: factory_bro
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Nate Reynolds
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2016-09-12 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: pg
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: 0.18.4
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: 0.18.4
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: faker
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: 1.6.6
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: 1.6.6
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: pry
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - "~>"
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: 0.10.4
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - "~>"
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: 0.10.4
|
55
|
+
description: PSQL Parser and Data Generation similar to factory_girl
|
56
|
+
email: nate@n8r.us
|
57
|
+
executables: []
|
58
|
+
extensions: []
|
59
|
+
extra_rdoc_files: []
|
60
|
+
files:
|
61
|
+
- lib/factory_bro.rb
|
62
|
+
homepage: https://github.com/nvreynolds/factory_bro
|
63
|
+
licenses: []
|
64
|
+
metadata: {}
|
65
|
+
post_install_message:
|
66
|
+
rdoc_options: []
|
67
|
+
require_paths:
|
68
|
+
- lib
|
69
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
70
|
+
requirements:
|
71
|
+
- - ">="
|
72
|
+
- !ruby/object:Gem::Version
|
73
|
+
version: '0'
|
74
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
75
|
+
requirements:
|
76
|
+
- - ">="
|
77
|
+
- !ruby/object:Gem::Version
|
78
|
+
version: '0'
|
79
|
+
requirements: []
|
80
|
+
rubyforge_project:
|
81
|
+
rubygems_version: 2.5.1
|
82
|
+
signing_key:
|
83
|
+
specification_version: 4
|
84
|
+
summary: Factory Bro
|
85
|
+
test_files: []
|