factory_bro 0.0.0
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.
- 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: []
|