scaffolding 0.3.1 → 0.3.2

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: a3f515c0d5ff226567d6fb2bc8f9c3c3fe162049
4
- data.tar.gz: 5daf3967066221b99c8de505b9c7bf40a5c9482c
3
+ metadata.gz: 8671e3427494760d1568c7846a1728f05bd7eec5
4
+ data.tar.gz: cfb03213051ffb7ccf930f4380ffa10be042985a
5
5
  SHA512:
6
- metadata.gz: d60112225f41d16ac48fc9fd0de1d2df58924c2d1a322ee50a24ccd9b6763950a9d7b9e5bb2aba984395c5db2f4eb65d97e005414cf1374155a9049629026659
7
- data.tar.gz: 34253e8fc6472899720662470e2843b6e9c8668703e39b0144f6f902a1a7ab6f5afb474fbc6d8032d646db5b8a27d9066359077b7219c55164d0b2d70a4c8278
6
+ metadata.gz: 8cf10c9d7692cb5554ed704119f68e5f6475e80563c8154cbca6f98d1da1e3053c1db8dae485e9b76119e6efaeede7ecda16a407c0d4cb39e2e75f4aa679ed11
7
+ data.tar.gz: b44127223ecc9063cb35d05135626cdb20330ebf7da09eee9998919c4555ded9c1b450456f8de467ef90701b57be224ac44a6365a7b9021052432e7def349304
data/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # Scaffolding
2
2
 
3
- Generate a rails scaffold from a CSV file and import the data into your rails application.
3
+ Generate a rails scaffold from a CSV, Dat or Txt file and import the data into your rails application.
4
4
 
5
5
  ## Installation
6
6
 
@@ -28,12 +28,12 @@ Or
28
28
 
29
29
  $ rake scaffolding:folder
30
30
 
31
- then add CSV files to the 'tmp/scaffolding' directory and process them all with:
31
+ then add files to the 'tmp/scaffolding' directory and process them all with:
32
32
 
33
33
  $ rails g/generate scaffolding
34
34
 
35
35
  ### Options:
36
- (You will be asked these at the terminal if not specify)
36
+ (You will be asked these at the terminal if not specified)
37
37
 
38
38
  Automatically determine the data types of each column:
39
39
 
data/Rakefile CHANGED
@@ -1,5 +1,6 @@
1
1
  require "bundler/gem_tasks"
2
2
 
3
- #C:\\Users\\jdejong\\Desktop\\Windows.csv
4
- #C:\Users\jdejong\Desktop\data.xlsx
3
+ # C:\Users\jdejong\Desktop\Windows.csv
4
+ # C:\Users\jdejong\Desktop\data.xlsx
5
5
  # /Users/Jordandejong/Desktop/ht.csv
6
+ # ftp://ftp2.bom.gov.au/anon/gen/fwo/IDY02128.dat
@@ -4,19 +4,23 @@ Rails.application.load_tasks
4
4
  require 'scaffolding'
5
5
 
6
6
  class ScaffoldingGenerator < Rails::Generators::Base
7
- desc "This generator generates a scaffold based on a CSV file and imports the data"
7
+ desc "This generator generates a scaffold based on a CSV, Dat or Txt file and imports the data"
8
8
  argument :source, :type => :string, :default => ""
9
9
  class_option :auto, :type => :boolean, :default => false, :description => "Automatically choose data types"
10
10
  class_option :migrate, :type => :boolean, :default => false, :description => "Migrate the database"
11
11
  class_option :import, :type => :boolean, :default => false, :description => "Import data from source"
12
12
 
13
13
  def analyize_sources
14
+ @auto = options[:auto]
15
+ @migrate = options[:migrate]
16
+ @import = options[:import]
17
+
14
18
  if source == "" || source.nil?
15
19
  Dir[Rails.root.join('tmp/scaffolding/*')].each do |source|
16
- Scaffolding.generate(source, options[:auto], options[:migrate], options[:import])
20
+ Scaffolding.generate(source, @auto, @migrate, @import)
17
21
  end
18
22
  else
19
- Scaffolding.generate(source, options[:auto], options[:migrate], options[:import])
23
+ Scaffolding.generate(source, @auto, @migrate, @import)
20
24
  end
21
25
  end
22
26
 
data/lib/scaffolding.rb CHANGED
@@ -2,17 +2,39 @@ require "scaffolding/version"
2
2
 
3
3
  module Scaffolding
4
4
  require 'scaffolding/railtie'
5
+ require 'uri'
5
6
 
6
7
  def self.generate(source, auto, migrate, import)
7
8
  @source = source
9
+ @auto = auto
8
10
  @migrate = migrate
9
11
  @import = import
10
- results = Scaffolding::Parser::Csv.process(@source, auto)
12
+ @uri = Scaffolding.uri?
13
+
14
+ results = Scaffolding.parser
11
15
  return if Scaffolding.errors(results)
16
+
12
17
  Rails::Generators::Base.new.generate "scaffold", results
13
18
  Scaffolding.import_data if Scaffolding.migrate_database
14
19
  end
15
20
 
21
+ def self.uri?
22
+ @source =~ URI::regexp
23
+ end
24
+
25
+ def self.parser(namespace="")
26
+ "Scaffolding::Parser#{namespace + "::" + Scaffolding.class_ref}".constantize.process(@source, @auto, @uri)
27
+ end
28
+
29
+ def self.class_ref
30
+ case File.extname(@source)
31
+ when ".csv" && @uri == false
32
+ "Csv"
33
+ else
34
+ "Raw"
35
+ end
36
+ end
37
+
16
38
  def self.errors(results)
17
39
  if results.kind_of?(Array)
18
40
  results.each do |error|
@@ -28,6 +50,7 @@ module Scaffolding
28
50
  answer = STDIN.gets.chomp.downcase
29
51
  end
30
52
  if @migrate || answer == "y"
53
+ Rake::Task["db:migrate"].reenable
31
54
  Rake::Task["db:migrate"].invoke
32
55
  else
33
56
  false
@@ -39,15 +62,12 @@ module Scaffolding
39
62
  puts "\n\n\e[32mImport the data from #{@source}?(y/n)\e[0m\n"
40
63
  answer = STDIN.gets.chomp.downcase
41
64
  end
42
- if @import || answer == "y"
43
- Scaffolding::Parser::Importer::CsvData.process(@source, false).each do |k,v|
44
- puts "#{v} records #{k}"
45
- end
46
- end
65
+ Scaffolding.parser("::Importer").each{ |k,v| puts "#{v} records #{k}" } if @import || answer == "y"
47
66
  end
48
67
 
49
68
  end
50
69
 
51
70
  require 'scaffolding/parser/base'
71
+ require 'scaffolding/parser/raw'
52
72
  require 'scaffolding/parser/csv'
53
- require 'scaffolding/parser/importer/csvdata'
73
+ require 'scaffolding/parser/importer/base'
@@ -4,30 +4,45 @@ module Scaffolding
4
4
  require 'rails'
5
5
  require 'csv'
6
6
 
7
- def initialize(file="", auto)
8
- @errors = []
9
- @data = valid_data?(file)
10
- @file_name = File.basename(file, ".*" ).to_s.split.join.camelize.strip.singularize
11
- @scaffold_builder = @file_name
7
+ def initialize(source="", auto, uri)
8
+ @source = source
12
9
  @auto = auto
10
+ @uri = uri
11
+ @errors = []
13
12
  @scaffolding = {}
13
+ @row_number = 0
14
+ setup
15
+ end
16
+
17
+ def setup
18
+ return unless @data = valid_data?
19
+ @col_seperator = col_seperator
20
+ @source_name = File.basename(@source, ".*" ).to_s.split.join.camelize.strip.singularize
21
+ @scaffold_builder = @source_name
14
22
  end
15
23
 
16
24
  def errors
17
25
  @errors
18
26
  end
19
27
 
20
- def valid_data?(file)
21
- unless file == "" || file.nil?
22
- # if [".csv", ".xls", ".xlsx"].include? File.extname(file)
23
- if File.extname(file) == ".csv"
24
- File.read(utf8_encode(file))
25
- else
26
- @errors << "Unknown file type #{File.extname(file)} for #{file}"
27
- false
28
- end
28
+ def valid_data?
29
+ if @source == "" || @source.nil?
30
+ @errors << "No source selected"
31
+ return false
32
+ end
33
+ @uri ? web : file
34
+ end
35
+
36
+ def web
37
+ `curl "#{@source}"`
38
+ end
39
+
40
+ def file
41
+ ext = File.extname(@source)
42
+ if [".csv", ".dat", ".txt"].include? ext
43
+ File.read(utf8_encode(@source))
29
44
  else
30
- @errors << "No file selected"
45
+ @errors << "Unknown source type #{ext} for #{@source}"
31
46
  false
32
47
  end
33
48
  end
@@ -54,13 +69,44 @@ module Scaffolding
54
69
  data_type = :time if Time.parse(Time.strptime(data, '%H:%M:%S')) rescue data_type
55
70
  data_type = :datetime if DateTime.parse(DateTime.strptime(data, '%m/%d/%Y %H:%M:%S')) || DateTime.parse(DateTime.strptime(data, '%d/%m/%Y %H:%M:%S')) rescue data_type
56
71
  data_type = :integer if Integer(data) rescue data_type
57
- data_type = :decimal if ((data.to_f - data.to_i).abs > 0.0) rescue data_type
72
+ data_type = :decimal if (data =~ (/[-]?\d*[,]?\d*[.]\d*[%]?$/)) == 0 rescue data_type
58
73
  @scaffolding[column.to_sym][data_type] += 1 unless data == ""
59
74
  end
60
75
  end
61
76
 
62
- def self.process(file, auto)
63
- importer = self.new(file, auto)
77
+ def scaffold_rank
78
+ unless @auto
79
+ puts "\n\e[33mManually choose data types?(y/n) for #{@source_name}\e[0m"
80
+ manual = STDIN.gets.chomp
81
+ end
82
+ @scaffolding.each do |scaffold, data_types|
83
+ data_type = data_types.max_by{|k,v| v}[0]
84
+ unless @auto || manual != "y"
85
+ puts "\n\e[32m#{scaffold}\e[0m is a \e[33m#{data_type}\e[0m? ([Enter]/string/integer/date ect)"
86
+ answer = STDIN.gets.chomp.downcase
87
+ data_type = answer if data_types.keys.include?(answer.to_sym)
88
+ end
89
+ @scaffolding[scaffold] = data_type
90
+ end
91
+ end
92
+
93
+ def build_string
94
+ @scaffolding.each do |k, v|
95
+ @scaffold_builder << " #{k}:#{v}" unless k.to_s.downcase == "id"
96
+ end
97
+ @scaffold_builder
98
+ end
99
+
100
+ def results
101
+ groom_data
102
+ process_data
103
+ return @errors unless @errors.count == 0
104
+ scaffold_rank
105
+ build_string
106
+ end
107
+
108
+ def self.process(source, auto, uri)
109
+ importer = self.new(source, auto, uri)
64
110
  return importer.errors unless importer.errors.count == 0
65
111
  importer.results
66
112
  end
@@ -2,20 +2,19 @@ module Scaffolding
2
2
  module Parser
3
3
  class Csv < Scaffolding::Parser::Base
4
4
 
5
- def initialize(file = "", auto)
6
- super
5
+ def groom_data
7
6
  @headers = true
8
- @row_number = 0
7
+ setup_columns
9
8
  end
10
9
 
11
10
  def setup_columns
12
- CSV.parse(@data, headers: @headers, col_sep: col_seperator, skip_blanks: true).first.each do |column|
11
+ CSV.parse(@data, headers: @headers, col_sep: @col_seperator, skip_blanks: true).first.each do |column|
13
12
  @scaffolding[column[0].downcase.to_sym] = data_types
14
13
  end
15
14
  end
16
15
 
17
16
  def process_data
18
- CSV.parse(@data, headers: @headers, col_sep: col_seperator, skip_blanks: true) do |row|
17
+ CSV.parse(@data, headers: @headers, col_sep: @col_seperator, skip_blanks: true) do |row|
19
18
  @row_number += 1
20
19
  begin
21
20
  process_row(row.inject({}){|row,(k,v)| row[k.downcase.to_sym] = v; row})
@@ -25,33 +24,6 @@ module Scaffolding
25
24
  end
26
25
  end
27
26
 
28
- def scaffold_rank
29
- unless @auto
30
- puts "\n\e[33mManually choose data types?(y/n)\e[0m"
31
- manual = STDIN.gets.chomp
32
- end
33
- @scaffolding.each do |scaffold, data_types|
34
- data_type = data_types.max_by{|k,v| v}[0]
35
- unless @auto || manual != "y"
36
- puts "\n\e[32m#{scaffold}\e[0m is a \e[33m#{data_type}\e[0m? (y/string/integer/date ect)"
37
- answer = STDIN.gets.chomp.downcase
38
- data_type = answer unless answer == "y" || answer == ""
39
- end
40
- @scaffolding[scaffold] = data_type
41
- end
42
- end
43
-
44
- def results
45
- setup_columns
46
- process_data
47
- return @errors unless @errors.count == 0
48
- scaffold_rank
49
- @scaffolding.each do |k, v|
50
- @scaffold_builder << " #{k}:#{v}" unless k.to_s.downcase == "id"
51
- end
52
- @scaffold_builder
53
- end
54
-
55
27
  end
56
28
  end
57
29
  end
@@ -0,0 +1,30 @@
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(file="", 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
@@ -0,0 +1,60 @@
1
+ module Scaffolding
2
+ module Parser
3
+ class Raw < Scaffolding::Parser::Base
4
+
5
+ def groom_data
6
+ @data = @data.split("\n")
7
+ find_headers
8
+ setup_columns
9
+ hashed_data
10
+ end
11
+
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
26
+ row_counts = []
27
+ @data.map{ |row| row_counts << row.split(@col_seperator).count }
28
+ row_counts.uniq.max_by{ |i| row_counts.count(i) }
29
+ end
30
+
31
+ def setup_columns
32
+ @headers.each{ |column| @scaffolding[column.to_sym] = data_types }
33
+ end
34
+
35
+ def hashed_data
36
+ @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
43
+ end
44
+ end
45
+
46
+ def process_data
47
+ @data.each do |row|
48
+ @row_number += 1
49
+ begin
50
+ process_row(row)
51
+ rescue => e
52
+ @errors << "Unable to process row #{@row_number} Error: #{e}\n"
53
+ end
54
+ end
55
+ end
56
+
57
+ end
58
+
59
+ end
60
+ end
@@ -5,7 +5,7 @@ module Scaffolding
5
5
  class Generators < Rails::Railtie
6
6
  rake_tasks do
7
7
  load "tasks/generators.rake"
8
- end
8
+ end
9
9
  generators do
10
10
  require "generators/scaffolding_generator.rb"
11
11
  end
@@ -1,3 +1,3 @@
1
1
  module Scaffolding
2
- VERSION = "0.3.1"
2
+ VERSION = "0.3.2"
3
3
  end
@@ -5,45 +5,3 @@ namespace :scaffolding do
5
5
  Dir.mkdir(File.join(Rails.root, 'tmp/scaffolding'))
6
6
  end
7
7
  end
8
-
9
- # namespace :g do
10
- # desc 'generate a scaffold from a csv file'
11
- # task :scaffold, [:file] do |t, args|
12
- # require 'rails/generators'
13
- # require 'scaffolding'
14
- #
15
- # system "clear" or system "cls"
16
- # puts "\n***** Scaffolding Gem *****\n\n\n"
17
- #
18
- # if args[:file]
19
- # file = args[:file]
20
- # else
21
- # puts "\e[32mEnter a relative file name to build the scaffold\e[0m\n"
22
- # puts "You are currently here: #{Dir.pwd}\n\n"
23
- # file = STDIN.gets.chomp
24
- # end
25
- #
26
- # results = Scaffolding.generate(file)
27
- # if results.kind_of?(Array)
28
- # results.each do |error|
29
- # puts "\e[31m#{error}\e[0m"
30
- # end
31
- # puts ""
32
- # next
33
- # end
34
- #
35
- # Rails::Generators::Base.new.generate "scaffold", results
36
- #
37
- # puts "\n\n\e[32mMigrate the database?(y/n)\e[0m\n"
38
- # if STDIN.gets.chomp == "y"
39
- # Rake::Task["db:migrate"].invoke
40
- #
41
- # puts "\n\n\e[32mImport the data from #{file}?(y/n)\e[0m\n"
42
- # if STDIN.gets.chomp == "y"
43
- # Scaffolding.import_data(file).each do |k,v|
44
- # puts "#{v} records #{k}"
45
- # end
46
- # end
47
- # end
48
- # end
49
- # end
data/usage.rb ADDED
@@ -0,0 +1,24 @@
1
+ require 'net/http'
2
+ require 'json'
3
+
4
+ gem_name = "scaffolding"
5
+
6
+ def rubygems_get(gem_name: "", endpoint: "")
7
+ path = File.join("/api/v1/gems/", gem_name, endpoint).chomp("/") + ".json"
8
+ JSON.parse(Net::HTTP.get("rubygems.org", path))
9
+ end
10
+
11
+ results = rubygems_get(gem_name: gem_name, endpoint: "reverse_dependencies")
12
+
13
+ weighted_results = {}
14
+ results.each do |name|
15
+ begin
16
+ weighted_results[name] = rubygems_get(gem_name: name)["downloads"]
17
+ rescue => e
18
+ puts "#{name} #{e.message}"
19
+ end
20
+ end
21
+
22
+ weighted_results.sort {|(k1, v1), (k2, v2)| v2 <=> v1 }.first(50).each_with_index do |(k, v), i|
23
+ puts "#{i}) #{k}: #{v}"
24
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: scaffolding
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.1
4
+ version: 0.3.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jordan-deJong
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2015-10-05 00:00:00.000000000 Z
11
+ date: 2015-10-07 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -57,11 +57,13 @@ 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/csvdata.rb
60
+ - lib/scaffolding/parser/importer/base.rb
61
+ - lib/scaffolding/parser/raw.rb
61
62
  - lib/scaffolding/railtie.rb
62
63
  - lib/scaffolding/version.rb
63
64
  - lib/tasks/generators.rake
64
65
  - scaffolding.gemspec
66
+ - usage.rb
65
67
  homepage: https://github.com/Jordan-deJong/scaffolding
66
68
  licenses:
67
69
  - MIT
@@ -1,26 +0,0 @@
1
- module Scaffolding
2
- module Parser
3
- module Importer
4
- class CsvData < Scaffolding::Parser::Csv
5
-
6
- def initialize(file="", auto)
7
- super
8
- @saved = 0
9
- @failed = 0
10
- end
11
-
12
- def process_row(row)
13
- model = @file_name.classify.constantize.new(row.except!(:id))
14
- model.save ? @saved += 1 : @failed += 1
15
- end
16
-
17
- def results
18
- process_data
19
- return @errors unless @errors.count == 0
20
- {saved: @saved, failed: @failed}
21
- end
22
-
23
- end
24
- end
25
- end
26
- end