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.
Files changed (3) hide show
  1. checksums.yaml +7 -0
  2. data/lib/factory_bro.rb +125 -0
  3. 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
@@ -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: []