factory_bro 0.0.0

Sign up to get free protection for your applications and to get access to all the features.
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: []