scaffolding 0.3.3 → 0.3.4
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 +4 -4
- data/.gitignore +0 -0
- data/CODE_OF_CONDUCT.md +0 -0
- data/Gemfile +0 -0
- data/LICENSE.txt +0 -0
- data/README.md +1 -1
- data/Rakefile +0 -0
- data/lib/generators/scaffolding_generator.rb +3 -5
- data/lib/scaffolding.rb +59 -49
- data/lib/scaffolding/parser/base.rb +25 -28
- data/lib/scaffolding/parser/csv.rb +2 -2
- data/lib/scaffolding/parser/raw.rb +21 -23
- data/lib/scaffolding/railtie.rb +0 -0
- data/lib/scaffolding/version.rb +1 -1
- data/lib/tasks/generators.rake +8 -1
- data/scaffolding.gemspec +0 -0
- metadata +3 -3
- data/lib/scaffolding/parser/importer/base.rb +0 -30
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 3bf321296642bfb7f1adf152f6efdac163daff44
|
4
|
+
data.tar.gz: ee9cb3885c934a99f586235a4d5a393f68b1cc53
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 48b68fe255ad2a10c1410041713fb737fc55330f8beb2bd1376cd2c621f8d641d2fbf4aae5a15ff1bea6e76859388c5599515aba72d85ebd51e1eeace7d7f61c
|
7
|
+
data.tar.gz: 84074b00c1634a296ca2a11aac7aa1bfb07d5eb70b66306d2273076bceab24ad805e3467c579fc8a28936904a2ca094c53a10c6f8d567c7e6c4c80224f6aaa4a
|
data/.gitignore
CHANGED
File without changes
|
data/CODE_OF_CONDUCT.md
CHANGED
File without changes
|
data/Gemfile
CHANGED
File without changes
|
data/LICENSE.txt
CHANGED
File without changes
|
data/README.md
CHANGED
data/Rakefile
CHANGED
File without changes
|
@@ -12,18 +12,16 @@ class ScaffoldingGenerator < Rails::Generators::Base
|
|
12
12
|
class_option :import, :type => :boolean, :default => false, :description => "Import data from source"
|
13
13
|
|
14
14
|
def analyize_sources
|
15
|
-
@source = source
|
16
|
-
@name = name
|
17
15
|
@auto = options[:auto]
|
18
16
|
@migrate = options[:migrate]
|
19
17
|
@import = options[:import]
|
20
18
|
|
21
|
-
if
|
19
|
+
if source == "" || source.nil?
|
22
20
|
Dir[Rails.root.join('tmp/scaffolding/*')].each do |source|
|
23
|
-
Scaffolding.
|
21
|
+
Scaffolding::Build.new(source, name, @auto, @migrate, @import).stack
|
24
22
|
end
|
25
23
|
else
|
26
|
-
Scaffolding.
|
24
|
+
Scaffolding::Build.new(source, name, @auto, @migrate, @import).stack
|
27
25
|
end
|
28
26
|
end
|
29
27
|
|
data/lib/scaffolding.rb
CHANGED
@@ -2,68 +2,79 @@ require "scaffolding/version"
|
|
2
2
|
|
3
3
|
module Scaffolding
|
4
4
|
require 'scaffolding/railtie' if defined?(Rails)
|
5
|
-
|
5
|
+
class Build
|
6
|
+
require 'uri'
|
6
7
|
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
8
|
+
def initialize(source, name, auto, migrate, import)
|
9
|
+
@source = source
|
10
|
+
@name = name
|
11
|
+
@auto = auto
|
12
|
+
@migrate = migrate
|
13
|
+
@import = import
|
14
|
+
@uri = uri?
|
15
|
+
end
|
14
16
|
|
15
|
-
|
16
|
-
|
17
|
+
def uri?
|
18
|
+
@source =~ URI::regexp
|
19
|
+
end
|
17
20
|
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
+
def stack
|
22
|
+
@parser = parser
|
23
|
+
@results = @parser.results
|
24
|
+
return if errors
|
25
|
+
generate
|
26
|
+
import_data if migrate_database
|
27
|
+
end
|
21
28
|
|
22
|
-
|
23
|
-
|
24
|
-
|
29
|
+
def parser
|
30
|
+
"Scaffolding::Parser::#{class_ref}".constantize.new(@source, @name, @auto, @uri)
|
31
|
+
end
|
25
32
|
|
26
|
-
|
27
|
-
|
28
|
-
|
33
|
+
def class_ref
|
34
|
+
if File.extname(@source) == ".csv" && @uri == nil
|
35
|
+
"Csv"
|
36
|
+
else
|
37
|
+
"Raw"
|
38
|
+
end
|
39
|
+
end
|
29
40
|
|
30
|
-
|
31
|
-
|
32
|
-
when ".csv" && @uri == false
|
33
|
-
"Csv"
|
34
|
-
else
|
35
|
-
"Raw"
|
41
|
+
def generate
|
42
|
+
Rails::Generators::Base.new.generate "scaffold", @results
|
36
43
|
end
|
37
|
-
end
|
38
44
|
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
45
|
+
def errors
|
46
|
+
if @results.kind_of?(Array)
|
47
|
+
@results.each do |error|
|
48
|
+
puts "\e[31m#{error}\e[0m"
|
49
|
+
end
|
50
|
+
true
|
43
51
|
end
|
44
|
-
true
|
45
52
|
end
|
46
|
-
end
|
47
53
|
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
54
|
+
def migrate_database
|
55
|
+
unless @migrate
|
56
|
+
puts "\n\n\e[32mMigrate the database?(y/n)\e[0m\n"
|
57
|
+
answer = STDIN.gets.chomp.downcase
|
58
|
+
end
|
59
|
+
if @migrate || answer == "y"
|
60
|
+
Rake::Task["db:migrate"].reenable
|
61
|
+
Rake::Task["db:migrate"].invoke
|
62
|
+
else
|
63
|
+
false
|
64
|
+
end
|
58
65
|
end
|
59
|
-
end
|
60
66
|
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
67
|
+
def import_data
|
68
|
+
unless @import
|
69
|
+
puts "\n\n\e[32mImport the data from #{@source}?(y/n)\e[0m\n"
|
70
|
+
answer = STDIN.gets.chomp.downcase
|
71
|
+
end
|
72
|
+
if @import || answer == "y"
|
73
|
+
@results = @parser.import_data
|
74
|
+
return if errors
|
75
|
+
@results.each{ |k,v| puts "#{v} records #{k}" }
|
76
|
+
end
|
65
77
|
end
|
66
|
-
Scaffolding.parser("::Importer").each{ |k,v| puts "#{v} records #{k}" } if @import || answer == "y"
|
67
78
|
end
|
68
79
|
|
69
80
|
end
|
@@ -71,4 +82,3 @@ end
|
|
71
82
|
require 'scaffolding/parser/base'
|
72
83
|
require 'scaffolding/parser/raw'
|
73
84
|
require 'scaffolding/parser/csv'
|
74
|
-
require 'scaffolding/parser/importer/base'
|
@@ -5,32 +5,21 @@ module Scaffolding
|
|
5
5
|
require 'csv'
|
6
6
|
|
7
7
|
def initialize(source, name, auto, uri)
|
8
|
-
@source = source
|
9
|
-
@name = name
|
10
|
-
@auto = auto
|
11
|
-
@uri = uri
|
8
|
+
@source, @name, @auto, @uri = source, name, auto, uri
|
12
9
|
@errors = []
|
13
|
-
@scaffolding = {}
|
14
|
-
@row_number = 0
|
15
|
-
setup
|
16
|
-
end
|
17
|
-
|
18
|
-
def setup
|
19
10
|
return unless @data = valid_data?
|
20
11
|
@col_seperator = col_seperator
|
21
|
-
@source_name
|
12
|
+
@source_name = source_name
|
13
|
+
@scaffolding = {}
|
14
|
+
@row_number = 0
|
22
15
|
end
|
23
16
|
|
24
17
|
def errors
|
25
|
-
@errors
|
18
|
+
@errors unless @errors.count == 0
|
26
19
|
end
|
27
20
|
|
28
21
|
def source_name
|
29
|
-
|
30
|
-
name = File.basename(@source, ".*")
|
31
|
-
else
|
32
|
-
name = @name.dup
|
33
|
-
end
|
22
|
+
name = (@name == "" ? File.basename(@source, ".*") : @name.dup)
|
34
23
|
name.to_s.downcase.split.join.camelize.strip.singularize
|
35
24
|
end
|
36
25
|
|
@@ -39,11 +28,11 @@ module Scaffolding
|
|
39
28
|
@errors << "No source selected"
|
40
29
|
return false
|
41
30
|
end
|
42
|
-
@uri ?
|
31
|
+
@uri.nil? ? file : web
|
43
32
|
end
|
44
33
|
|
45
34
|
def web
|
46
|
-
`curl "#{@source}"`
|
35
|
+
utf8_encode(`curl "#{@source}"`)
|
47
36
|
end
|
48
37
|
|
49
38
|
def file
|
@@ -70,7 +59,7 @@ module Scaffolding
|
|
70
59
|
seperators.max_by{|k,v| v}[0]
|
71
60
|
end
|
72
61
|
|
73
|
-
def
|
62
|
+
def predict_row(row)
|
74
63
|
row.each do |column, data|
|
75
64
|
data_type = :string
|
76
65
|
data_type = :boolean if ["true", "false"].include?(data.to_s.downcase) rescue data_type
|
@@ -83,6 +72,11 @@ module Scaffolding
|
|
83
72
|
end
|
84
73
|
end
|
85
74
|
|
75
|
+
def save_row(row)
|
76
|
+
model = @source_name.classify.constantize.new(row.except!(:id))
|
77
|
+
model.save ? @saved += 1 : @failed += 1
|
78
|
+
end
|
79
|
+
|
86
80
|
def scaffold_rank
|
87
81
|
unless @auto
|
88
82
|
puts "\n\e[33mManually choose data types?(y/n) for #{@source_name}\e[0m"
|
@@ -100,24 +94,27 @@ module Scaffolding
|
|
100
94
|
end
|
101
95
|
|
102
96
|
def build_string
|
97
|
+
scaffold = @source_name.dup
|
103
98
|
@scaffolding.each do |k, v|
|
104
|
-
|
99
|
+
scaffold << " #{k}:#{v}" unless k.to_s.downcase == "id"
|
105
100
|
end
|
106
|
-
|
101
|
+
scaffold
|
107
102
|
end
|
108
103
|
|
109
104
|
def results
|
110
105
|
groom_data
|
111
|
-
process_data
|
112
|
-
|
106
|
+
process_data "predict_row"
|
107
|
+
errors
|
113
108
|
scaffold_rank
|
114
109
|
build_string
|
115
110
|
end
|
116
111
|
|
117
|
-
def
|
118
|
-
|
119
|
-
|
120
|
-
|
112
|
+
def import_data
|
113
|
+
@saved = 0
|
114
|
+
@failed = 0
|
115
|
+
process_data "save_row"
|
116
|
+
errors
|
117
|
+
{saved: @saved, failed: @failed}
|
121
118
|
end
|
122
119
|
|
123
120
|
end
|
@@ -13,11 +13,11 @@ module Scaffolding
|
|
13
13
|
end
|
14
14
|
end
|
15
15
|
|
16
|
-
def process_data
|
16
|
+
def process_data(process_row)
|
17
17
|
CSV.parse(@data, headers: @headers, col_sep: @col_seperator, skip_blanks: true) do |row|
|
18
18
|
@row_number += 1
|
19
19
|
begin
|
20
|
-
process_row
|
20
|
+
self.send(process_row, row.inject({}){|row,(k,v)| row[k.downcase.to_sym] = v; row})
|
21
21
|
rescue => e
|
22
22
|
@errors << "Unable to process row #{@row_number} Error: #{e}\n"
|
23
23
|
end
|
@@ -4,50 +4,49 @@ module Scaffolding
|
|
4
4
|
|
5
5
|
def groom_data
|
6
6
|
@data = @data.split("\n")
|
7
|
+
@column_count = column_count
|
8
|
+
bad_data
|
7
9
|
find_headers
|
8
10
|
setup_columns
|
9
11
|
hashed_data
|
10
12
|
end
|
11
13
|
|
12
|
-
def
|
13
|
-
hc = header_count
|
14
|
-
rows = 0
|
15
|
-
@data.map do |row|
|
16
|
-
rows += 1
|
17
|
-
if row.split(@col_seperator).count == hc
|
18
|
-
@headers = row.split(@col_seperator).map{ |header| header.strip.downcase.gsub(/(\W|\d)/, "") }
|
19
|
-
rows.times{ @data.shift }
|
20
|
-
return
|
21
|
-
end
|
22
|
-
end
|
23
|
-
end
|
24
|
-
|
25
|
-
def header_count
|
14
|
+
def column_count
|
26
15
|
row_counts = []
|
27
16
|
@data.map{ |row| row_counts << row.split(@col_seperator).count }
|
28
17
|
row_counts.uniq.max_by{ |i| row_counts.count(i) }
|
29
18
|
end
|
30
19
|
|
20
|
+
def bad_data
|
21
|
+
@data.delete_if {|row| row.split(@col_seperator).count != @column_count }
|
22
|
+
end
|
23
|
+
|
24
|
+
def find_headers
|
25
|
+
first_row = @data.map.first.split(@col_seperator)
|
26
|
+
@headers = first_row.map{ |header| header.strip.downcase.gsub(/(\W|\d)/, "") }
|
27
|
+
@data.shift
|
28
|
+
end
|
29
|
+
|
31
30
|
def setup_columns
|
32
31
|
@headers.each{ |column| @scaffolding[column.to_sym] = data_types }
|
33
32
|
end
|
34
33
|
|
35
34
|
def hashed_data
|
36
35
|
@data = @data.map do |row|
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
36
|
+
fields = row.split(@col_seperator)
|
37
|
+
hash = {}
|
38
|
+
@headers.each_with_index do |header, index|
|
39
|
+
hash[header] = fields[index].to_s.strip
|
40
|
+
end
|
41
|
+
hash
|
43
42
|
end
|
44
43
|
end
|
45
44
|
|
46
|
-
def process_data
|
45
|
+
def process_data(process_row)
|
47
46
|
@data.each do |row|
|
48
47
|
@row_number += 1
|
49
48
|
begin
|
50
|
-
process_row
|
49
|
+
self.send(process_row, row)
|
51
50
|
rescue => e
|
52
51
|
@errors << "Unable to process row #{@row_number} Error: #{e}\n"
|
53
52
|
end
|
@@ -55,6 +54,5 @@ module Scaffolding
|
|
55
54
|
end
|
56
55
|
|
57
56
|
end
|
58
|
-
|
59
57
|
end
|
60
58
|
end
|
data/lib/scaffolding/railtie.rb
CHANGED
File without changes
|
data/lib/scaffolding/version.rb
CHANGED
data/lib/tasks/generators.rake
CHANGED
@@ -1,7 +1,14 @@
|
|
1
1
|
namespace :scaffolding do
|
2
|
+
require 'rails'
|
3
|
+
|
2
4
|
desc "Create a 'tmp/scaffolding' folder for the scaffolding gem."
|
3
5
|
task :folder do |t|
|
4
|
-
require 'rails'
|
5
6
|
Dir.mkdir(File.join(Rails.root, 'tmp/scaffolding'))
|
6
7
|
end
|
8
|
+
|
9
|
+
# desc "Setup a production enviornemnt to import data from the files."
|
10
|
+
# task :production do |t|
|
11
|
+
# Dir.mkdir(File.join(Rails.root, 'tmp/scaffolding'))
|
12
|
+
# end
|
13
|
+
|
7
14
|
end
|
data/scaffolding.gemspec
CHANGED
File without changes
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: scaffolding
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.3.
|
4
|
+
version: 0.3.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jordan-deJong
|
@@ -57,7 +57,6 @@ files:
|
|
57
57
|
- lib/scaffolding.rb
|
58
58
|
- lib/scaffolding/parser/base.rb
|
59
59
|
- lib/scaffolding/parser/csv.rb
|
60
|
-
- lib/scaffolding/parser/importer/base.rb
|
61
60
|
- lib/scaffolding/parser/raw.rb
|
62
61
|
- lib/scaffolding/railtie.rb
|
63
62
|
- lib/scaffolding/version.rb
|
@@ -84,8 +83,9 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
84
83
|
version: '0'
|
85
84
|
requirements: []
|
86
85
|
rubyforge_project:
|
87
|
-
rubygems_version: 2.4.
|
86
|
+
rubygems_version: 2.4.5
|
88
87
|
signing_key:
|
89
88
|
specification_version: 4
|
90
89
|
summary: Generate a rails scaffold based on a CSV file.
|
91
90
|
test_files: []
|
91
|
+
has_rdoc:
|
@@ -1,30 +0,0 @@
|
|
1
|
-
module Scaffolding
|
2
|
-
module Parser
|
3
|
-
module Importer
|
4
|
-
["Csv", "Raw"].each do |type|
|
5
|
-
importer_class = Class.new("Scaffolding::Parser::#{type}".constantize) do
|
6
|
-
|
7
|
-
def initialize(source, name, auto, uri)
|
8
|
-
super
|
9
|
-
@saved = 0
|
10
|
-
@failed = 0
|
11
|
-
end
|
12
|
-
|
13
|
-
def process_row(row)
|
14
|
-
model = @source_name.classify.constantize.new(row.except!(:id))
|
15
|
-
model.save ? @saved += 1 : @failed += 1
|
16
|
-
end
|
17
|
-
|
18
|
-
def results
|
19
|
-
groom_data
|
20
|
-
process_data
|
21
|
-
return @errors unless @errors.count == 0
|
22
|
-
{saved: @saved, failed: @failed}
|
23
|
-
end
|
24
|
-
|
25
|
-
end
|
26
|
-
Scaffolding::Parser::Importer.const_set(type, importer_class)
|
27
|
-
end
|
28
|
-
end
|
29
|
-
end
|
30
|
-
end
|