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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 39f736ea24b0f039f8726314e93c0af29e24ad65
4
- data.tar.gz: c57e952433bf79815c0664a5744c9916ad87c892
3
+ metadata.gz: 3bf321296642bfb7f1adf152f6efdac163daff44
4
+ data.tar.gz: ee9cb3885c934a99f586235a4d5a393f68b1cc53
5
5
  SHA512:
6
- metadata.gz: 4e7edf14eec9f001245d3bb655b9b73eeefa5df8c2556f1ac93ff5b35fc3fc64388b88e1133104c4ed3666194df077ae4bae1a213dbb58e0e6b2c2cf1ab1f6bb
7
- data.tar.gz: c3af697d5c7c78e39fc5089aaa88180fa36abf978dabe2b7955475b50c78e8b260ec4ef712b0fcc275191ebf5460179314570d4cd10ef0fdd1862a42e206bb4e
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
@@ -1,6 +1,6 @@
1
1
  # Scaffolding
2
2
 
3
- Generate a rails scaffold from a CSV, Dat or Txt file and import the data into your rails application.
3
+ Generate a rails scaffold from a CSV, Dat or Txt file and imports the data into your rails application.
4
4
 
5
5
  ## Installation
6
6
 
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 @source == "" || @source.nil?
19
+ if source == "" || source.nil?
22
20
  Dir[Rails.root.join('tmp/scaffolding/*')].each do |source|
23
- Scaffolding.generate(source, @name, @auto, @migrate, @import)
21
+ Scaffolding::Build.new(source, name, @auto, @migrate, @import).stack
24
22
  end
25
23
  else
26
- Scaffolding.generate(@source, @name, @auto, @migrate, @import)
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
- require 'uri'
5
+ class Build
6
+ require 'uri'
6
7
 
7
- def self.generate(source, name, auto, migrate, import)
8
- @source = source
9
- @name = name
10
- @auto = auto
11
- @migrate = migrate
12
- @import = import
13
- @uri = Scaffolding.uri?
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
- results = Scaffolding.parser
16
- return if Scaffolding.errors(results)
17
+ def uri?
18
+ @source =~ URI::regexp
19
+ end
17
20
 
18
- Rails::Generators::Base.new.generate "scaffold", results
19
- Scaffolding.import_data if Scaffolding.migrate_database
20
- end
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
- def self.uri?
23
- @source =~ URI::regexp
24
- end
29
+ def parser
30
+ "Scaffolding::Parser::#{class_ref}".constantize.new(@source, @name, @auto, @uri)
31
+ end
25
32
 
26
- def self.parser(namespace="")
27
- "Scaffolding::Parser#{namespace + "::" + Scaffolding.class_ref}".constantize.process(@source, @name, @auto, @uri)
28
- end
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
- def self.class_ref
31
- case File.extname(@source)
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
- def self.errors(results)
40
- if results.kind_of?(Array)
41
- results.each do |error|
42
- puts "\e[31m#{error}\e[0m"
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
- def self.migrate_database
49
- unless @migrate
50
- puts "\n\n\e[32mMigrate the database?(y/n)\e[0m\n"
51
- answer = STDIN.gets.chomp.downcase
52
- end
53
- if @migrate || answer == "y"
54
- Rake::Task["db:migrate"].reenable
55
- Rake::Task["db:migrate"].invoke
56
- else
57
- false
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
- def self.import_data
62
- unless @import
63
- puts "\n\n\e[32mImport the data from #{@source}?(y/n)\e[0m\n"
64
- answer = STDIN.gets.chomp.downcase
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, @scaffold_builder = 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
- if @name == ""
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 ? web : file
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 process_row(row)
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
- @scaffold_builder << " #{k}:#{v}" unless k.to_s.downcase == "id"
99
+ scaffold << " #{k}:#{v}" unless k.to_s.downcase == "id"
105
100
  end
106
- @scaffold_builder
101
+ scaffold
107
102
  end
108
103
 
109
104
  def results
110
105
  groom_data
111
- process_data
112
- return @errors unless @errors.count == 0
106
+ process_data "predict_row"
107
+ errors
113
108
  scaffold_rank
114
109
  build_string
115
110
  end
116
111
 
117
- def self.process(source, name, auto, uri)
118
- importer = self.new(source, name, auto, uri)
119
- return importer.errors unless importer.errors.count == 0
120
- importer.results
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(row.inject({}){|row,(k,v)| row[k.downcase.to_sym] = v; 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 find_headers
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
- fields = row.split(@col_seperator)
38
- hash = {}
39
- @headers.each_with_index do |header, index|
40
- hash[header] = fields[index].to_s.strip
41
- end
42
- hash
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(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
File without changes
@@ -1,3 +1,3 @@
1
1
  module Scaffolding
2
- VERSION = "0.3.3"
2
+ VERSION = "0.3.4"
3
3
  end
@@ -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.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.7
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