schema_to_scaffold 0.7.2 → 0.8.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.
- checksums.yaml +4 -4
- data/.gitignore +2 -1
- data/.rspec +2 -0
- data/.ruby-gemset +1 -0
- data/.ruby-version +1 -1
- data/Rakefile +5 -0
- data/bin/scaffold +8 -73
- data/lib/schema_to_scaffold.rb +3 -78
- data/lib/schema_to_scaffold/attribute.rb +3 -4
- data/lib/schema_to_scaffold/cli.rb +103 -0
- data/lib/schema_to_scaffold/clipboard.rb +36 -0
- data/lib/schema_to_scaffold/help.rb +46 -0
- data/lib/schema_to_scaffold/path.rb +28 -28
- data/lib/schema_to_scaffold/schema.rb +20 -1
- data/lib/schema_to_scaffold/table.rb +14 -8
- data/lib/schema_to_scaffold/version.rb +2 -2
- data/schema_to_scaffold.gemspec +2 -1
- data/spec/attribute_spec.rb +70 -0
- data/spec/cli_spec.rb +116 -0
- data/spec/clipboard_spec.rb +52 -0
- data/spec/help_spec.rb +25 -0
- data/spec/path_spec.rb +41 -0
- data/spec/schema_spec.rb +45 -0
- data/spec/schema_to_scaffold_spec.rb +5 -0
- data/spec/spec_helper.rb +110 -0
- data/spec/support/empty_schema.rb +7 -0
- data/spec/support/schema.rb +24 -0
- data/spec/support/table.rb +17 -0
- data/spec/table_spec.rb +33 -0
- metadata +51 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 2687f54c3d084dbb6678d431c66db92a31ba691c
|
4
|
+
data.tar.gz: f731ebdb43c91ba5f8e98f0c3a26507aeaf8da61
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 733cce3b7f62c783a43a095e1c339411416c0a3a81664d06d77120b1945d502960dc8213d3e6df61fa9670bba5c8d823ed9918e349fa6c48c50ef42125cff27c
|
7
|
+
data.tar.gz: c16a1b76fc4841df4025e71ab8d781acb7c29687f1b59008c3113f1743cd55be9f02e4fa58ec24c55114c2e87b38b75c65efbf2b9a4ae2d67ef374c4c258f755
|
data/.gitignore
CHANGED
data/.rspec
ADDED
data/.ruby-gemset
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
schema-to-scaffold
|
data/.ruby-version
CHANGED
@@ -1 +1 @@
|
|
1
|
-
2.
|
1
|
+
2.3.1
|
data/Rakefile
CHANGED
data/bin/scaffold
CHANGED
@@ -1,77 +1,12 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
|
-
|
3
|
-
require 'schema_to_scaffold'
|
4
|
-
## Argument conditions
|
2
|
+
# encoding: UTF-8
|
5
3
|
|
6
|
-
|
7
|
-
|
4
|
+
# resolve bin path, ignoring symlinks
|
5
|
+
require "pathname"
|
6
|
+
bin_file = Pathname.new(__FILE__).realpath
|
7
|
+
# add self to libpath
|
8
|
+
$:.unshift File.expand_path("../../lib", bin_file)
|
8
9
|
|
9
|
-
|
10
|
-
puts SchemaToScaffold.help_msg
|
11
|
-
exit 0
|
12
|
-
end
|
10
|
+
require 'schema_to_scaffold/cli'
|
13
11
|
|
14
|
-
|
15
|
-
paths = SchemaToScaffold::Path.new(opts[:path])
|
16
|
-
path = paths.choose unless opts[:path].to_s.match(/\.rb$/)
|
17
|
-
|
18
|
-
## Opening file
|
19
|
-
path||=opts[:path]
|
20
|
-
begin
|
21
|
-
data = File.open(path, 'r') {|f| f.read }
|
22
|
-
rescue
|
23
|
-
puts "\nUnable to open file '#{path}'"
|
24
|
-
exit 1
|
25
|
-
end
|
26
|
-
|
27
|
-
## Generate scripts from schema
|
28
|
-
|
29
|
-
schema = SchemaToScaffold::Schema.new(data)
|
30
|
-
|
31
|
-
begin
|
32
|
-
raise if schema.table_names.empty?
|
33
|
-
puts "\nLoaded tables:"
|
34
|
-
schema.table_names.each_with_index {|name,i| puts "#{i}. #{name}" }
|
35
|
-
|
36
|
-
puts "\nOptions are:\n4 for table 4; (4..6) for table 4 to 6; [4,6] for tables 4 and 6; * for all Tables"
|
37
|
-
|
38
|
-
print "\nSelect a table: "
|
39
|
-
|
40
|
-
rescue
|
41
|
-
puts "Could not find tables in '#{path}'"
|
42
|
-
exit 1
|
43
|
-
end
|
44
|
-
|
45
|
-
result = gets.strip
|
46
|
-
begin
|
47
|
-
case result
|
48
|
-
when "*"
|
49
|
-
tables = (0..schema.table_names.count-1).map{|i|i}
|
50
|
-
when /^\d/
|
51
|
-
tables = [result.to_i]
|
52
|
-
else
|
53
|
-
tables = eval(result).to_a.map{|i|i}
|
54
|
-
end
|
55
|
-
raise if tables.empty?
|
56
|
-
rescue Exception => e
|
57
|
-
puts "Not a valid input, \nOptions are:\n4 for table 4; (4..6) for table 4 to 6; [4,6] for tables 4 and 6; * for all Tables"
|
58
|
-
exit 1
|
59
|
-
end
|
60
|
-
|
61
|
-
script = []
|
62
|
-
target = opts[:factory_girl] ? "factory_girl:model" : "scaffold"
|
63
|
-
migragion_flag = opts[:migration] || opts[:factory_girl]
|
64
|
-
tables.each { |table_id| script << SchemaToScaffold.generate_script(schema, table_id, target, migragion_flag) }
|
65
|
-
output = script.join("")
|
66
|
-
puts "\nScript for #{target}:\n\n"
|
67
|
-
puts output
|
68
|
-
|
69
|
-
if opts[:clipboard]
|
70
|
-
puts("\n(copied to your clipboard)")
|
71
|
-
case RUBY_PLATFORM
|
72
|
-
when /darwin/i then exec("echo '#{output}' | tr -d '\n' | pbcopy")
|
73
|
-
when /linux/i then exec("echo '#{output}' | tr -d '\n' | xclip -selection c")
|
74
|
-
when /mingw/i then exec("echo '#{output}' | clip")
|
75
|
-
when /win/i then exec("echo '#{output}' | clip")
|
76
|
-
end
|
77
|
-
end
|
12
|
+
SchemaToScaffold::CLI.start(*ARGV)
|
data/lib/schema_to_scaffold.rb
CHANGED
@@ -3,84 +3,9 @@ require 'schema_to_scaffold/schema'
|
|
3
3
|
require 'schema_to_scaffold/table'
|
4
4
|
require 'schema_to_scaffold/attribute'
|
5
5
|
require 'schema_to_scaffold/path'
|
6
|
+
require 'schema_to_scaffold/cli'
|
7
|
+
require 'schema_to_scaffold/help'
|
8
|
+
require 'schema_to_scaffold/clipboard'
|
6
9
|
|
7
10
|
module SchemaToScaffold
|
8
|
-
extend self
|
9
|
-
|
10
|
-
## Usage help text to print in all platforms
|
11
|
-
|
12
|
-
GENERIC_HELP = <<-END_OF_HELP
|
13
|
-
|
14
|
-
Usage: scaffold [options]
|
15
|
-
Generate a rails scaffold script for a given schema.rb
|
16
|
-
-h Displays help.
|
17
|
-
-p <path> It specifies a path to a folder or to a file.
|
18
|
-
-c Will copy the script to your clipboard. Requires xclip be installed on Linux.
|
19
|
-
-f Generates a factory_girl:model rather than a full scaffold.
|
20
|
-
-m Add migration (use if your schema comes from a different database)
|
21
|
-
|
22
|
-
END_OF_HELP
|
23
|
-
|
24
|
-
|
25
|
-
## Windows specific usage help text
|
26
|
-
|
27
|
-
WINDOWS_HELP = <<-WINDOWS_SAMPLE
|
28
|
-
Examples:
|
29
|
-
scaffold
|
30
|
-
scaffold -p C:\\Users\\JohnDoe
|
31
|
-
scaffold -c -p C:\\Users\\JohnDoe\\Documents\\schema.rb
|
32
|
-
WINDOWS_SAMPLE
|
33
|
-
|
34
|
-
## Linux specific usage help text
|
35
|
-
|
36
|
-
LINUX_HELP = <<-LINUX_SAMPLE
|
37
|
-
Examples:
|
38
|
-
scaffold
|
39
|
-
scaffold -c -p ~/work/rails/my_app
|
40
|
-
scaffold -c -p ~/work/rails/my_app/db/schema.rb
|
41
|
-
LINUX_SAMPLE
|
42
|
-
|
43
|
-
def help_msg
|
44
|
-
return GENERIC_HELP +
|
45
|
-
case RUBY_PLATFORM
|
46
|
-
when /darwin/i then LINUX_HELP
|
47
|
-
when /linux/i then LINUX_HELP
|
48
|
-
when /mingw/i then WINDOWS_HELP
|
49
|
-
when /win/i then WINDOWS_HELP
|
50
|
-
end
|
51
|
-
end
|
52
|
-
|
53
|
-
##
|
54
|
-
# Parses ARGV and returns a hash of options.
|
55
|
-
|
56
|
-
def parse_arguments(argv)
|
57
|
-
if argv_index = argv.index("-p")
|
58
|
-
path = argv.delete_at(argv_index+1)
|
59
|
-
argv.delete('-p')
|
60
|
-
end
|
61
|
-
args = {
|
62
|
-
:clipboard => argv.delete('-c'), # check for clipboard flag
|
63
|
-
:factory_girl => argv.delete('-f'), # factory_girl instead of scaffold
|
64
|
-
:migration => argv.delete('-m'), # generate migrations
|
65
|
-
:help => argv.delete('-h'), # check for help flag
|
66
|
-
:path => path # get path to file(s)
|
67
|
-
}
|
68
|
-
unless argv.empty?
|
69
|
-
puts "\n------\nWrong set of arguments.\n------\n"
|
70
|
-
puts help_msg
|
71
|
-
exit
|
72
|
-
else
|
73
|
-
args
|
74
|
-
end
|
75
|
-
|
76
|
-
end
|
77
|
-
|
78
|
-
##
|
79
|
-
# Generates the rails scaffold script
|
80
|
-
|
81
|
-
def self.generate_script(schema, table=nil,target,migragion_flag)
|
82
|
-
schema = Schema.new(schema) unless schema.is_a? Schema
|
83
|
-
return schema.to_script if table.nil?
|
84
|
-
schema.table(table).to_script target, migragion_flag
|
85
|
-
end
|
86
11
|
end
|
@@ -8,18 +8,17 @@ module SchemaToScaffold
|
|
8
8
|
end
|
9
9
|
|
10
10
|
def to_script
|
11
|
-
"#{name}:#{type}" unless ["created_at","updated_at"].include?
|
11
|
+
"#{name}:#{type}" unless ["created_at","updated_at"].include?(name)
|
12
12
|
end
|
13
13
|
|
14
14
|
def self.parse(attribute)
|
15
15
|
match = attribute.match(/t\.(\w+)\s+"(\w+)"/)
|
16
16
|
if match
|
17
|
-
name = match.captures[1].sub(/_id$/,
|
17
|
+
name = match.captures[1].sub(/_id$/, "")
|
18
18
|
type = $&.nil? ? match.captures[0] : "references"
|
19
|
-
Attribute.new(name,type)
|
19
|
+
Attribute.new(name, type)
|
20
20
|
end
|
21
21
|
end
|
22
22
|
|
23
|
-
|
24
23
|
end
|
25
24
|
end
|
@@ -0,0 +1,103 @@
|
|
1
|
+
require "schema_to_scaffold"
|
2
|
+
module SchemaToScaffold
|
3
|
+
class CLI
|
4
|
+
|
5
|
+
TABLE_OPTIONS = "\nOptions are:\n4 for table 4; (4..6) for table 4 to 6; [4,6] for tables 4 and 6; * for all Tables"
|
6
|
+
|
7
|
+
def self.start(*args)
|
8
|
+
## Argument conditions
|
9
|
+
opts = parse_arguments(args)
|
10
|
+
|
11
|
+
if opts[:help]
|
12
|
+
puts Help.message
|
13
|
+
exit 0
|
14
|
+
end
|
15
|
+
|
16
|
+
## looking for /schema\S*.rb$/ in user directory
|
17
|
+
paths = Path.new(opts[:path])
|
18
|
+
path = paths.choose unless opts[:path].to_s.match(/\.rb$/)
|
19
|
+
|
20
|
+
## Opening file
|
21
|
+
path ||= opts[:path]
|
22
|
+
begin
|
23
|
+
data = File.open(path, 'r') { |f| f.read }
|
24
|
+
rescue
|
25
|
+
puts "\nUnable to open file '#{path}'"
|
26
|
+
exit 1
|
27
|
+
end
|
28
|
+
|
29
|
+
## Generate scripts from schema
|
30
|
+
schema = Schema.new(data)
|
31
|
+
|
32
|
+
begin
|
33
|
+
raise if schema.table_names.empty?
|
34
|
+
puts "\nLoaded tables:"
|
35
|
+
schema.print_table_names
|
36
|
+
puts TABLE_OPTIONS
|
37
|
+
print "\nSelect a table: "
|
38
|
+
rescue
|
39
|
+
puts "Could not find tables in '#{path}'"
|
40
|
+
exit 1
|
41
|
+
end
|
42
|
+
|
43
|
+
input = STDIN.gets.strip
|
44
|
+
begin
|
45
|
+
tables = schema.select_tables(input)
|
46
|
+
raise if tables.empty?
|
47
|
+
rescue
|
48
|
+
puts "Not a valid input. #{TABLE_OPTIONS}"
|
49
|
+
exit 1
|
50
|
+
end
|
51
|
+
|
52
|
+
script = []
|
53
|
+
target = opts[:factory_girl] ? "factory_girl:model" : "scaffold"
|
54
|
+
migration_flag = opts[:migration] ? true : false
|
55
|
+
|
56
|
+
tables.each do |table_id|
|
57
|
+
script << generate_script(schema, table_id, target, migration_flag)
|
58
|
+
end
|
59
|
+
output = script.join("")
|
60
|
+
puts "\nScript for #{target}:\n\n"
|
61
|
+
puts output
|
62
|
+
|
63
|
+
if opts[:clipboard]
|
64
|
+
puts("\n(copied to your clipboard)")
|
65
|
+
Clipboard.new(output).command
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
##
|
70
|
+
# Parses ARGV and returns a hash of options.
|
71
|
+
def self.parse_arguments(argv)
|
72
|
+
if argv_index = argv.index("-p")
|
73
|
+
path = argv.delete_at(argv_index + 1)
|
74
|
+
argv.delete('-p')
|
75
|
+
end
|
76
|
+
|
77
|
+
args = {
|
78
|
+
clipboard: argv.delete('-c'), # check for clipboard flag
|
79
|
+
factory_girl: argv.delete('-f'), # factory_girl instead of scaffold
|
80
|
+
migration: argv.delete('-m'), # generate migrations
|
81
|
+
help: argv.delete('-h'), # check for help flag
|
82
|
+
path: path # get path to file(s)
|
83
|
+
}
|
84
|
+
|
85
|
+
if argv.empty?
|
86
|
+
args
|
87
|
+
else
|
88
|
+
puts "\n------\nWrong set of arguments.\n------\n"
|
89
|
+
puts Help.message
|
90
|
+
exit
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
94
|
+
##
|
95
|
+
# Generates the rails scaffold script
|
96
|
+
def self.generate_script(schema, table=nil, target, migration_flag)
|
97
|
+
schema = Schema.new(schema) unless schema.is_a?(Schema)
|
98
|
+
return schema.to_script if table.nil?
|
99
|
+
schema.table(table).to_script(target, migration_flag)
|
100
|
+
end
|
101
|
+
|
102
|
+
end
|
103
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
module SchemaToScaffold
|
2
|
+
class Clipboard
|
3
|
+
attr_reader :output
|
4
|
+
|
5
|
+
def initialize(output)
|
6
|
+
@output = output
|
7
|
+
end
|
8
|
+
|
9
|
+
def command
|
10
|
+
case platform
|
11
|
+
when /darwin/i then darwin_command
|
12
|
+
when /linux/i then linux_command
|
13
|
+
when /mingw/i then win_command
|
14
|
+
when /win/i then win_command
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
private
|
19
|
+
|
20
|
+
def darwin_command
|
21
|
+
exec("echo '#{output}' | tr -d '\n' | pbcopy")
|
22
|
+
end
|
23
|
+
|
24
|
+
def linux_command
|
25
|
+
exec("echo '#{output}' | tr -d '\n' | xclip -selection c")
|
26
|
+
end
|
27
|
+
|
28
|
+
def win_command
|
29
|
+
exec("echo '#{output}' | clip")
|
30
|
+
end
|
31
|
+
|
32
|
+
def platform
|
33
|
+
RUBY_PLATFORM
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
@@ -0,0 +1,46 @@
|
|
1
|
+
module SchemaToScaffold
|
2
|
+
class Help
|
3
|
+
## Usage help text to print in all platforms
|
4
|
+
GENERIC_HELP = <<-END_OF_HELP
|
5
|
+
|
6
|
+
Usage: scaffold [options]
|
7
|
+
Generate a rails scaffold script for a given schema.rb
|
8
|
+
-h Displays help.
|
9
|
+
-p <path> It specifies a path to a folder or to a file.
|
10
|
+
-c Will copy the script to your clipboard. Requires xclip be installed on Linux.
|
11
|
+
-f Generates a factory_girl:model rather than a full scaffold.
|
12
|
+
-m Add migration (use if your schema comes from a different database)
|
13
|
+
|
14
|
+
END_OF_HELP
|
15
|
+
|
16
|
+
## Windows specific usage help text
|
17
|
+
WINDOWS_HELP = <<-WINDOWS_SAMPLE
|
18
|
+
Examples:
|
19
|
+
scaffold
|
20
|
+
scaffold -p C:\\Users\\JohnDoe
|
21
|
+
scaffold -c -p C:\\Users\\JohnDoe\\Documents\\schema.rb
|
22
|
+
WINDOWS_SAMPLE
|
23
|
+
|
24
|
+
## Linux specific usage help text
|
25
|
+
LINUX_HELP = <<-LINUX_SAMPLE
|
26
|
+
Examples:
|
27
|
+
scaffold
|
28
|
+
scaffold -c -p ~/work/rails/my_app
|
29
|
+
scaffold -c -p ~/work/rails/my_app/db/schema.rb
|
30
|
+
LINUX_SAMPLE
|
31
|
+
|
32
|
+
def self.message
|
33
|
+
return GENERIC_HELP +
|
34
|
+
case platform
|
35
|
+
when /darwin/i then LINUX_HELP
|
36
|
+
when /linux/i then LINUX_HELP
|
37
|
+
when /mingw/i then WINDOWS_HELP
|
38
|
+
when /win/i then WINDOWS_HELP
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
def self.platform
|
43
|
+
RUBY_PLATFORM
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
@@ -1,54 +1,54 @@
|
|
1
1
|
require 'find'
|
2
2
|
module SchemaToScaffold
|
3
|
-
|
4
3
|
##
|
5
4
|
# Deal with the path argument
|
6
5
|
|
7
6
|
class Path
|
8
|
-
|
7
|
+
|
9
8
|
def initialize(path)
|
10
|
-
@
|
11
|
-
@path = path
|
9
|
+
@path = path || Dir.pwd
|
12
10
|
end
|
13
11
|
|
14
12
|
##
|
15
|
-
#
|
16
|
-
def
|
17
|
-
|
18
|
-
|
13
|
+
# Return the chosen path
|
14
|
+
def choose
|
15
|
+
validate_path
|
16
|
+
search_paths_list = search_paths
|
17
|
+
if search_paths_list.empty?
|
18
|
+
puts "\nThere is no /schema[^\/]*.rb$/ in the directory #{@path}"
|
19
19
|
exit
|
20
20
|
end
|
21
|
-
|
21
|
+
|
22
|
+
search_paths_list.each_with_index {|path,indx| puts "#{indx}. #{path}" }
|
23
|
+
|
24
|
+
begin
|
25
|
+
print "\nSelect a path to the target schema: "
|
26
|
+
end while search_paths_list[(id = STDIN.gets.to_i)].nil?
|
27
|
+
|
28
|
+
search_paths_list[id]
|
22
29
|
end
|
23
|
-
|
24
30
|
|
31
|
+
private
|
25
32
|
##
|
26
|
-
#
|
27
|
-
def
|
28
|
-
|
29
|
-
|
30
|
-
|
33
|
+
# Validate if a given path leads to a directory
|
34
|
+
def validate_path
|
35
|
+
if File.directory?(@path.to_s)
|
36
|
+
puts "\nLooking for schema.rb in #{@path}"
|
37
|
+
else
|
38
|
+
puts "\nSorry #{@path} is not a valid directory!\nHere is an example:\nscaffold -p /home/foo/bar"
|
31
39
|
exit
|
32
40
|
end
|
33
|
-
@schema_paths.each_with_index {|path,indx| puts "#{indx}. #{path}" }
|
34
|
-
begin
|
35
|
-
print "\nSelect a path to the target schema: "
|
36
|
-
end while @schema_paths[(id = gets.to_i)].nil?
|
37
|
-
@schema_paths[id]
|
38
41
|
end
|
39
42
|
|
40
|
-
private
|
41
43
|
##
|
42
44
|
# Will search for /schema[^\/]*.rb$/ in the current directory
|
43
|
-
def
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
Find.find(@search_path) do |s_p|
|
48
|
-
@schema_paths<<s_p if s_p[/schema[^\/]*.rb$/]
|
45
|
+
def search_paths
|
46
|
+
result = []
|
47
|
+
Find.find(@path) do |s_p|
|
48
|
+
result << s_p if s_p[/schema[^\/]*.rb$/]
|
49
49
|
end
|
50
|
+
result
|
50
51
|
end
|
51
52
|
|
52
53
|
end
|
53
|
-
|
54
54
|
end
|
@@ -11,6 +11,19 @@ module SchemaToScaffold
|
|
11
11
|
tables.map(&:name)
|
12
12
|
end
|
13
13
|
|
14
|
+
def print_table_names
|
15
|
+
table_names.each_with_index { |name, i| puts "#{i}. #{name}" }
|
16
|
+
end
|
17
|
+
|
18
|
+
def select_tables(input)
|
19
|
+
case input
|
20
|
+
when "*"
|
21
|
+
table_range.to_a
|
22
|
+
when /^\d/
|
23
|
+
table_range.include?(input.to_i) ? [input.to_i] : []
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
14
27
|
def table(id)
|
15
28
|
case id
|
16
29
|
when Symbol then table(id.to_s)
|
@@ -25,7 +38,13 @@ module SchemaToScaffold
|
|
25
38
|
end
|
26
39
|
|
27
40
|
def self.parse(data)
|
28
|
-
data.split(/^\s*create_/)[1..-1].map {|table_data| Table.parse
|
41
|
+
data.split(/^\s*create_/)[1..-1].map {|table_data| Table.parse(table_data) }.reject{ |e| e.nil? }
|
42
|
+
end
|
43
|
+
|
44
|
+
private
|
45
|
+
|
46
|
+
def table_range
|
47
|
+
0...table_names.count
|
29
48
|
end
|
30
49
|
end
|
31
50
|
end
|
@@ -11,31 +11,37 @@ module SchemaToScaffold
|
|
11
11
|
@name, @attributes = name, attributes
|
12
12
|
end
|
13
13
|
|
14
|
-
def to_script(target,
|
14
|
+
def to_script(target, migration_flag)
|
15
15
|
begin
|
16
16
|
attributes_list = attributes.map(&:to_script).reject { |x| x.nil? || x.empty? }.join(' ')
|
17
|
-
rescue
|
17
|
+
rescue => e
|
18
18
|
puts "\n ---------------------------------------------"
|
19
19
|
puts e.message
|
20
20
|
puts "Table \n\n\n #{self.inspect} \n\n\n"
|
21
21
|
puts "\n ---------------------------------------------"
|
22
22
|
end
|
23
23
|
script = []
|
24
|
-
script << "rails generate #{target} #{modelize
|
25
|
-
script << " --no-migration" unless
|
24
|
+
script << "rails generate #{target} #{modelize(name)} #{attributes_list}"
|
25
|
+
script << " --no-migration" unless migration_flag
|
26
26
|
script << "\n\n"
|
27
|
-
|
27
|
+
script
|
28
28
|
end
|
29
29
|
|
30
30
|
def self.parse(table_data)
|
31
31
|
return unless name = table_data[/table "([^"]+?)"/]
|
32
32
|
name = $1
|
33
|
-
|
34
|
-
Table.new(name,
|
33
|
+
table_fields = table_fields_of(table_data)
|
34
|
+
Table.new(name, table_fields)
|
35
35
|
end
|
36
36
|
|
37
37
|
private
|
38
|
-
def
|
38
|
+
def self.table_fields_of(table_data)
|
39
|
+
table_data.lines.to_a.select { |line| line =~ /t\.(?!index)\w+/ }.map { |att| Attribute.parse(att) }
|
40
|
+
end
|
41
|
+
|
42
|
+
private
|
43
|
+
|
44
|
+
def modelize(string)
|
39
45
|
string.camelize.singularize
|
40
46
|
end
|
41
47
|
|
data/schema_to_scaffold.gemspec
CHANGED
@@ -17,10 +17,11 @@ EOD
|
|
17
17
|
gem.files = `git ls-files`.split($/)
|
18
18
|
gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
|
19
19
|
gem.require_paths = ["lib"]
|
20
|
-
gem.post_install_message = "Thanks for installing!"
|
21
20
|
gem.licenses = ['MIT']
|
22
21
|
gem.required_ruby_version = '>= 1.9.3'
|
23
22
|
|
24
23
|
gem.add_runtime_dependency('activesupport', '>= 3.2.1')
|
25
24
|
gem.add_development_dependency('pry', '~> 0.10', '>= 0.10.0')
|
25
|
+
gem.add_development_dependency('rspec')
|
26
|
+
gem.add_development_dependency('simplecov')
|
26
27
|
end
|
@@ -0,0 +1,70 @@
|
|
1
|
+
module SchemaToScaffold
|
2
|
+
RSpec.describe Attribute do
|
3
|
+
|
4
|
+
describe ".parse" do
|
5
|
+
it "parses _id attribute to references" do
|
6
|
+
attribute = Attribute.parse('t.integer "user_id"')
|
7
|
+
expect(attribute.type).to eq("references")
|
8
|
+
expect(attribute.name).to eq("user")
|
9
|
+
end
|
10
|
+
|
11
|
+
it "parses string attributes" do
|
12
|
+
attribute = Attribute.parse('t.string "filename"')
|
13
|
+
expect(attribute.type).to eq("string")
|
14
|
+
expect(attribute.name).to eq("filename")
|
15
|
+
end
|
16
|
+
|
17
|
+
it "parses datetime attributes" do
|
18
|
+
attribute = Attribute.parse('t.datetime "created_at", null: false')
|
19
|
+
expect(attribute.type).to eq("datetime")
|
20
|
+
expect(attribute.name).to eq("created_at")
|
21
|
+
end
|
22
|
+
|
23
|
+
it "parses limit value" do
|
24
|
+
pending
|
25
|
+
attribute = Attribute.parse('t.integer "quota", limit: 8')
|
26
|
+
expect(attribute.type).to eq("integer")
|
27
|
+
expect(attribute.name).to eq("quota")
|
28
|
+
expect(attribute.limit).to eq("8")
|
29
|
+
end
|
30
|
+
|
31
|
+
it "parses decimals precision and scale values" do
|
32
|
+
pending
|
33
|
+
attribute = Attribute.parse('t.decimal "price", precision: 20, scale: 2, default: 0.0')
|
34
|
+
expect(attribute.type).to eq("decimal")
|
35
|
+
expect(attribute.name).to eq("price")
|
36
|
+
expect(attribute.precision).to eq("20")
|
37
|
+
expect(attribute.scale).to eq("2")
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
describe "#to_script" do
|
42
|
+
it "returns name and type" do
|
43
|
+
attribute = Attribute.parse('t.string "filename"')
|
44
|
+
expect(attribute.to_script).to eq("filename:string")
|
45
|
+
end
|
46
|
+
|
47
|
+
it "ignores updated_at" do
|
48
|
+
attribute = Attribute.parse('t.datetime "updated_at", null: false')
|
49
|
+
expect(attribute.to_script).to be_nil
|
50
|
+
end
|
51
|
+
|
52
|
+
it "ignores created_at" do
|
53
|
+
attribute = Attribute.parse('t.datetime "created_at", null: false')
|
54
|
+
expect(attribute.to_script).to be_nil
|
55
|
+
end
|
56
|
+
|
57
|
+
it "adds limit value to integer" do
|
58
|
+
pending
|
59
|
+
attribute = Attribute.parse('t.integer "quota", limit: 8')
|
60
|
+
expect(attribute.to_script).to eq("quota:integer{8}")
|
61
|
+
end
|
62
|
+
|
63
|
+
it "adds precision and scale value to decimal" do
|
64
|
+
pending
|
65
|
+
attribute = Attribute.parse('t.decimal "price", precision: 20, scale: 2, default: 0.0')
|
66
|
+
expect(attribute.to_script).to eq("price:decimal{20,2}")
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
data/spec/cli_spec.rb
ADDED
@@ -0,0 +1,116 @@
|
|
1
|
+
module SchemaToScaffold
|
2
|
+
RSpec.describe CLI do
|
3
|
+
|
4
|
+
let(:empty_schema_file) { File.expand_path(File.dirname(__FILE__)) + '/support/empty_schema.rb' }
|
5
|
+
let(:schema_file) { File.expand_path(File.dirname(__FILE__)) + '/support/schema.rb' }
|
6
|
+
|
7
|
+
describe ".start" do
|
8
|
+
it "prints help message" do
|
9
|
+
expect {
|
10
|
+
begin
|
11
|
+
SchemaToScaffold::CLI.start("-h")
|
12
|
+
rescue SystemExit
|
13
|
+
end
|
14
|
+
}.to output(/Usage:/).to_stdout
|
15
|
+
end
|
16
|
+
|
17
|
+
it "prints file not found message" do
|
18
|
+
expect {
|
19
|
+
begin
|
20
|
+
SchemaToScaffold::CLI.start("-p", "/support/schema.rb")
|
21
|
+
rescue SystemExit
|
22
|
+
end
|
23
|
+
}.to output(/Unable to open file /).to_stdout
|
24
|
+
end
|
25
|
+
|
26
|
+
it "prints could not find tables message" do
|
27
|
+
expect {
|
28
|
+
begin
|
29
|
+
SchemaToScaffold::CLI.start("-p", empty_schema_file)
|
30
|
+
rescue SystemExit
|
31
|
+
end
|
32
|
+
}.to output(/Could not find tables /).to_stdout
|
33
|
+
end
|
34
|
+
|
35
|
+
context "choose table" do
|
36
|
+
before do
|
37
|
+
allow(STDIN).to receive(:gets) { "" }
|
38
|
+
end
|
39
|
+
|
40
|
+
it "prints Not a valid input message" do
|
41
|
+
expect {
|
42
|
+
begin
|
43
|
+
SchemaToScaffold::CLI.start("-p", schema_file)
|
44
|
+
rescue SystemExit
|
45
|
+
end
|
46
|
+
}.to output(/Not a valid input/).to_stdout
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
context "choose all tables" do
|
51
|
+
before do
|
52
|
+
allow(STDIN).to receive(:gets).once { "*" }
|
53
|
+
end
|
54
|
+
|
55
|
+
it "prints scaffold lines message" do
|
56
|
+
expect {
|
57
|
+
begin
|
58
|
+
SchemaToScaffold::CLI.start("-p", schema_file)
|
59
|
+
rescue SystemExit
|
60
|
+
end
|
61
|
+
}.to output(/Script for/).to_stdout
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
context "copies first table to clipboard" do
|
66
|
+
before do
|
67
|
+
allow(STDIN).to receive(:gets).once { "0" }
|
68
|
+
expect_any_instance_of(Kernel).to receive(:exec).with("echo 'rails generate scaffold User email:string encrypted_password:string reset_password_token:string reset_password_sent_at:datetime remember_created_at:datetime sign_in_count:integer current_sign_in_at:datetime last_sign_in_at:datetime current_sign_in_ip:string last_sign_in_ip:string name:string role:integer --no-migration\n\n' | tr -d '\n' | pbcopy")
|
69
|
+
expect_any_instance_of(Clipboard).to receive(:platform).and_return("/darwin/i")
|
70
|
+
end
|
71
|
+
|
72
|
+
it "prints copied to your clipboard message" do
|
73
|
+
expect {
|
74
|
+
begin
|
75
|
+
SchemaToScaffold::CLI.start("-c", "-p", schema_file)
|
76
|
+
rescue SystemExit
|
77
|
+
end
|
78
|
+
}.to output(/copied to your clipboard/).to_stdout
|
79
|
+
end
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
83
|
+
describe ".parse_arguments" do
|
84
|
+
it "handles wrong arguments" do
|
85
|
+
expect {
|
86
|
+
begin
|
87
|
+
SchemaToScaffold::CLI.parse_arguments(["--help"])
|
88
|
+
rescue SystemExit
|
89
|
+
end
|
90
|
+
}.to output(/Wrong set of arguments/).to_stdout
|
91
|
+
end
|
92
|
+
|
93
|
+
context "handles arguments" do
|
94
|
+
it "help argument" do
|
95
|
+
expect(CLI.parse_arguments(["-h"])).to eq({clipboard: nil, factory_girl: nil, migration: nil, help: "-h", path: nil})
|
96
|
+
end
|
97
|
+
|
98
|
+
it "path argument" do
|
99
|
+
expect(CLI.parse_arguments(["-p", "/some/path"])).to eq({clipboard: nil, factory_girl: nil, migration: nil, help: nil, path: "/some/path"})
|
100
|
+
end
|
101
|
+
|
102
|
+
it "clipboard argument" do
|
103
|
+
expect(CLI.parse_arguments(["-c"])).to eq({clipboard: "-c", factory_girl: nil, migration: nil, help: nil, path: nil})
|
104
|
+
end
|
105
|
+
|
106
|
+
it "factory girl argument" do
|
107
|
+
expect(CLI.parse_arguments(["-f"])).to eq({clipboard: nil, factory_girl: "-f", migration: nil, help: nil, path: nil})
|
108
|
+
end
|
109
|
+
|
110
|
+
it "migration argument" do
|
111
|
+
expect(CLI.parse_arguments(["-m"])).to eq({clipboard: nil, factory_girl: nil, migration: "-m", help: nil, path: nil})
|
112
|
+
end
|
113
|
+
end
|
114
|
+
end
|
115
|
+
end
|
116
|
+
end
|
@@ -0,0 +1,52 @@
|
|
1
|
+
module SchemaToScaffold
|
2
|
+
RSpec.describe Clipboard do
|
3
|
+
let(:output) { "rails g model ....." }
|
4
|
+
let(:clipboard) { Clipboard.new(output) }
|
5
|
+
|
6
|
+
describe "#command" do
|
7
|
+
context "darwin" do
|
8
|
+
before do
|
9
|
+
allow(clipboard).to receive(:platform).and_return("darwin")
|
10
|
+
expect_any_instance_of(Kernel).to receive(:exec).with("echo 'rails g model .....' | tr -d '\n' | pbcopy")
|
11
|
+
end
|
12
|
+
|
13
|
+
it "executes darwin command" do
|
14
|
+
clipboard.command
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
context "linux" do
|
19
|
+
before do
|
20
|
+
allow(clipboard).to receive(:platform).and_return("linux")
|
21
|
+
expect_any_instance_of(Kernel).to receive(:exec).with("echo 'rails g model .....' | tr -d '\n' | xclip -selection c")
|
22
|
+
end
|
23
|
+
|
24
|
+
it "executes linux command" do
|
25
|
+
clipboard.command
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
context "windows (win)" do
|
30
|
+
before do
|
31
|
+
allow(clipboard).to receive(:platform).and_return("win")
|
32
|
+
expect_any_instance_of(Kernel).to receive(:exec).with("echo 'rails g model .....' | clip")
|
33
|
+
end
|
34
|
+
|
35
|
+
it "executes windows command" do
|
36
|
+
clipboard.command
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
context "windows (mingw)" do
|
41
|
+
before do
|
42
|
+
allow(clipboard).to receive(:platform).and_return("mingw")
|
43
|
+
expect_any_instance_of(Kernel).to receive(:exec).with("echo 'rails g model .....' | clip")
|
44
|
+
end
|
45
|
+
|
46
|
+
it "executes windows command" do
|
47
|
+
clipboard.command
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
data/spec/help_spec.rb
ADDED
@@ -0,0 +1,25 @@
|
|
1
|
+
module SchemaToScaffold
|
2
|
+
RSpec.describe Help do
|
3
|
+
describe ".message" do
|
4
|
+
it "returns message for darwin platform" do
|
5
|
+
allow(Help).to receive(:platform).and_return("darwin")
|
6
|
+
expect(Help.message).to include("work/rails/my_app/")
|
7
|
+
end
|
8
|
+
|
9
|
+
it "returns message for linux platform" do
|
10
|
+
allow(Help).to receive(:platform).and_return("linux")
|
11
|
+
expect(Help.message).to include("work/rails/my_app/")
|
12
|
+
end
|
13
|
+
|
14
|
+
it "returns message for windows(win) platform" do
|
15
|
+
allow(Help).to receive(:platform).and_return("win")
|
16
|
+
expect(Help.message).to include("JohnDoe\\Documents")
|
17
|
+
end
|
18
|
+
|
19
|
+
it "returns message for windows (mingw) platform" do
|
20
|
+
allow(Help).to receive(:platform).and_return("mingw")
|
21
|
+
expect(Help.message).to include("JohnDoe\\Documents")
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
data/spec/path_spec.rb
ADDED
@@ -0,0 +1,41 @@
|
|
1
|
+
module SchemaToScaffold
|
2
|
+
RSpec.describe Path do
|
3
|
+
|
4
|
+
describe "#choose" do
|
5
|
+
it "prints error when given path is not an directory" do
|
6
|
+
path = Path.new("path_spec.rb")
|
7
|
+
expect {
|
8
|
+
begin
|
9
|
+
path.choose
|
10
|
+
rescue SystemExit
|
11
|
+
end
|
12
|
+
}.to output(/Sorry path_spec\.rb is not a valid directory!/).to_stdout
|
13
|
+
end
|
14
|
+
|
15
|
+
it "prints message when given path is a directory but no schema is found" do
|
16
|
+
path = Path.new(File.expand_path(File.dirname(__FILE__)) + '/support/no_schema')
|
17
|
+
expect {
|
18
|
+
begin
|
19
|
+
path.choose
|
20
|
+
rescue SystemExit
|
21
|
+
end
|
22
|
+
}.to output(/There is no/).to_stdout
|
23
|
+
end
|
24
|
+
|
25
|
+
context "needs user input" do
|
26
|
+
let(:path) { Path.new(File.expand_path(File.dirname(__FILE__)) + '/support') }
|
27
|
+
before do
|
28
|
+
allow(STDIN).to receive(:gets) { "0" }
|
29
|
+
end
|
30
|
+
|
31
|
+
it "prints message when given path is a directory" do
|
32
|
+
expect {
|
33
|
+
path.choose
|
34
|
+
}.to output(/Select a path to the target schema/).to_stdout
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
data/spec/schema_spec.rb
ADDED
@@ -0,0 +1,45 @@
|
|
1
|
+
module SchemaToScaffold
|
2
|
+
RSpec.describe Schema do
|
3
|
+
|
4
|
+
let(:schema_data) { File.read(File.expand_path(File.dirname(__FILE__)) + '/support/schema.rb') }
|
5
|
+
let(:schema) { Schema.new(schema_data) }
|
6
|
+
|
7
|
+
describe ".parse" do
|
8
|
+
it "parses given schema file" do
|
9
|
+
expect(Schema.parse(schema_data)).to be_kind_of(Array)
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
describe "#table_names" do
|
14
|
+
it "returns table names" do
|
15
|
+
expect(schema.table_names).to eq(["users"])
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
describe "#to_script" do
|
20
|
+
it "is broken" do
|
21
|
+
pending
|
22
|
+
expect(schema.to_script).to eq("users")
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
describe "#table" do
|
27
|
+
it "returns parsed table by given table name as symbol" do
|
28
|
+
expect(schema.table(:users)).to be_kind_of(SchemaToScaffold::Table)
|
29
|
+
end
|
30
|
+
|
31
|
+
it "returns parsed table by given table index" do
|
32
|
+
expect(schema.table(0)).to be_kind_of(SchemaToScaffold::Table)
|
33
|
+
end
|
34
|
+
|
35
|
+
it "returns nil" do
|
36
|
+
expect(schema.table([])).to be_nil
|
37
|
+
end
|
38
|
+
|
39
|
+
it "returns nil" do
|
40
|
+
pending
|
41
|
+
expect(schema.table("")).to be_nil
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,110 @@
|
|
1
|
+
# This file was generated by the `rspec --init` command. Conventionally, all
|
2
|
+
# specs live under a `spec` directory, which RSpec adds to the `$LOAD_PATH`.
|
3
|
+
# The generated `.rspec` file contains `--require spec_helper` which will cause
|
4
|
+
# this file to always be loaded, without a need to explicitly require it in any
|
5
|
+
# files.
|
6
|
+
|
7
|
+
$LOAD_PATH.unshift File.expand_path("../../lib", __FILE__)
|
8
|
+
|
9
|
+
require "simplecov"
|
10
|
+
SimpleCov.start 'test_frameworks'
|
11
|
+
|
12
|
+
require "schema_to_scaffold"
|
13
|
+
|
14
|
+
# Given that it is always loaded, you are encouraged to keep this file as
|
15
|
+
# light-weight as possible. Requiring heavyweight dependencies from this file
|
16
|
+
# will add to the boot time of your test suite on EVERY test run, even for an
|
17
|
+
# individual file that may not need all of that loaded. Instead, consider making
|
18
|
+
# a separate helper file that requires the additional dependencies and performs
|
19
|
+
# the additional setup, and require it from the spec files that actually need
|
20
|
+
# it.
|
21
|
+
#
|
22
|
+
# The `.rspec` file also contains a few flags that are not defaults but that
|
23
|
+
# users commonly want.
|
24
|
+
#
|
25
|
+
# See http://rubydoc.info/gems/rspec-core/RSpec/Core/Configuration
|
26
|
+
RSpec.configure do |config|
|
27
|
+
# rspec-expectations config goes here. You can use an alternate
|
28
|
+
# assertion/expectation library such as wrong or the stdlib/minitest
|
29
|
+
# assertions if you prefer.
|
30
|
+
config.expect_with :rspec do |expectations|
|
31
|
+
# This option will default to `true` in RSpec 4. It makes the `description`
|
32
|
+
# and `failure_message` of custom matchers include text for helper methods
|
33
|
+
# defined using `chain`, e.g.:
|
34
|
+
# be_bigger_than(2).and_smaller_than(4).description
|
35
|
+
# # => "be bigger than 2 and smaller than 4"
|
36
|
+
# ...rather than:
|
37
|
+
# # => "be bigger than 2"
|
38
|
+
expectations.include_chain_clauses_in_custom_matcher_descriptions = true
|
39
|
+
end
|
40
|
+
|
41
|
+
# rspec-mocks config goes here. You can use an alternate test double
|
42
|
+
# library (such as bogus or mocha) by changing the `mock_with` option here.
|
43
|
+
config.mock_with :rspec do |mocks|
|
44
|
+
# Prevents you from mocking or stubbing a method that does not exist on
|
45
|
+
# a real object. This is generally recommended, and will default to
|
46
|
+
# `true` in RSpec 4.
|
47
|
+
mocks.verify_partial_doubles = true
|
48
|
+
end
|
49
|
+
|
50
|
+
# This option will default to `:apply_to_host_groups` in RSpec 4 (and will
|
51
|
+
# have no way to turn it off -- the option exists only for backwards
|
52
|
+
# compatibility in RSpec 3). It causes shared context metadata to be
|
53
|
+
# inherited by the metadata hash of host groups and examples, rather than
|
54
|
+
# triggering implicit auto-inclusion in groups with matching metadata.
|
55
|
+
config.shared_context_metadata_behavior = :apply_to_host_groups
|
56
|
+
|
57
|
+
# The settings below are suggested to provide a good initial experience
|
58
|
+
# with RSpec, but feel free to customize to your heart's content.
|
59
|
+
|
60
|
+
# This allows you to limit a spec run to individual examples or groups
|
61
|
+
# you care about by tagging them with `:focus` metadata. When nothing
|
62
|
+
# is tagged with `:focus`, all examples get run. RSpec also provides
|
63
|
+
# aliases for `it`, `describe`, and `context` that include `:focus`
|
64
|
+
# metadata: `fit`, `fdescribe` and `fcontext`, respectively.
|
65
|
+
config.filter_run_when_matching :focus
|
66
|
+
|
67
|
+
# Allows RSpec to persist some state between runs in order to support
|
68
|
+
# the `--only-failures` and `--next-failure` CLI options. We recommend
|
69
|
+
# you configure your source control system to ignore this file.
|
70
|
+
config.example_status_persistence_file_path = "spec/examples.txt"
|
71
|
+
|
72
|
+
# Limits the available syntax to the non-monkey patched syntax that is
|
73
|
+
# recommended. For more details, see:
|
74
|
+
# - http://rspec.info/blog/2012/06/rspecs-new-expectation-syntax/
|
75
|
+
# - http://www.teaisaweso.me/blog/2013/05/27/rspecs-new-message-expectation-syntax/
|
76
|
+
# - http://rspec.info/blog/2014/05/notable-changes-in-rspec-3/#zero-monkey-patching-mode
|
77
|
+
config.disable_monkey_patching!
|
78
|
+
|
79
|
+
# This setting enables warnings. It's recommended, but in some cases may
|
80
|
+
# be too noisy due to issues in dependencies.
|
81
|
+
config.warnings = true
|
82
|
+
|
83
|
+
# Many RSpec users commonly either run the entire suite or an individual
|
84
|
+
# file, and it's useful to allow more verbose output when running an
|
85
|
+
# individual spec file.
|
86
|
+
if config.files_to_run.one?
|
87
|
+
# Use the documentation formatter for detailed output,
|
88
|
+
# unless a formatter has already been configured
|
89
|
+
# (e.g. via a command-line flag).
|
90
|
+
config.default_formatter = 'doc'
|
91
|
+
end
|
92
|
+
|
93
|
+
# Print the 10 slowest examples and example groups at the
|
94
|
+
# end of the spec run, to help surface which specs are running
|
95
|
+
# particularly slow.
|
96
|
+
config.profile_examples = 10
|
97
|
+
|
98
|
+
# Run specs in random order to surface order dependencies. If you find an
|
99
|
+
# order dependency and want to debug it, you can fix the order by providing
|
100
|
+
# the seed, which is printed after each run.
|
101
|
+
# --seed 1234
|
102
|
+
config.order = :random
|
103
|
+
|
104
|
+
# Seed global randomization in this process using the `--seed` CLI option.
|
105
|
+
# Setting this allows you to use `--seed` to deterministically reproduce
|
106
|
+
# test failures related to randomization by passing the same `--seed` value
|
107
|
+
# as the one that triggered the failure.
|
108
|
+
Kernel.srand config.seed
|
109
|
+
|
110
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
# random schema https://github.com/RailsApps/rails-devise-roles/blob/master/db/schema.rb
|
2
|
+
ActiveRecord::Schema.define(version: 20140828012915) do
|
3
|
+
|
4
|
+
create_table "users", force: :cascade do |t|
|
5
|
+
t.string "email", default: "", null: false
|
6
|
+
t.string "encrypted_password", default: "", null: false
|
7
|
+
t.string "reset_password_token"
|
8
|
+
t.datetime "reset_password_sent_at"
|
9
|
+
t.datetime "remember_created_at"
|
10
|
+
t.integer "sign_in_count", default: 0, null: false
|
11
|
+
t.datetime "current_sign_in_at"
|
12
|
+
t.datetime "last_sign_in_at"
|
13
|
+
t.string "current_sign_in_ip"
|
14
|
+
t.string "last_sign_in_ip"
|
15
|
+
t.datetime "created_at"
|
16
|
+
t.datetime "updated_at"
|
17
|
+
t.string "name"
|
18
|
+
t.integer "role"
|
19
|
+
end
|
20
|
+
|
21
|
+
add_index "users", ["email"], name: "index_users_on_email", unique: true
|
22
|
+
add_index "users", ["reset_password_token"], name: "index_users_on_reset_password_token", unique: true
|
23
|
+
|
24
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
create_table "users", force: :cascade do |t|
|
2
|
+
t.string "email", default: "", null: false
|
3
|
+
t.string "encrypted_password", default: "", null: false
|
4
|
+
t.string "reset_password_token"
|
5
|
+
t.datetime "reset_password_sent_at"
|
6
|
+
t.datetime "remember_created_at"
|
7
|
+
t.integer "sign_in_count", default: 0, null: false
|
8
|
+
t.datetime "current_sign_in_at"
|
9
|
+
t.datetime "last_sign_in_at"
|
10
|
+
t.string "current_sign_in_ip"
|
11
|
+
t.string "last_sign_in_ip"
|
12
|
+
t.datetime "created_at"
|
13
|
+
t.datetime "updated_at"
|
14
|
+
t.string "name"
|
15
|
+
t.integer "role"
|
16
|
+
t.index ["basket_id"], name: "index_orders_on_basket_id", using: :btree
|
17
|
+
end
|
data/spec/table_spec.rb
ADDED
@@ -0,0 +1,33 @@
|
|
1
|
+
module SchemaToScaffold
|
2
|
+
RSpec.describe Table do
|
3
|
+
|
4
|
+
let(:table_data) { File.read(File.expand_path(File.dirname(__FILE__)) + '/support/table.rb') }
|
5
|
+
let(:email_attribute) { Attribute.new("email", "string") }
|
6
|
+
let(:password_attribute) { Attribute.new("password", "string") }
|
7
|
+
|
8
|
+
describe "#to_script" do
|
9
|
+
let(:table) { Table.new("users", [email_attribute, password_attribute]) }
|
10
|
+
|
11
|
+
it "returns rails generate line" do
|
12
|
+
expect(table.to_script("model", true)).to eq(["rails generate model User email:string password:string", "\n\n"])
|
13
|
+
end
|
14
|
+
|
15
|
+
it "returns rails generate line without migrations" do
|
16
|
+
expect(table.to_script("model", false)).to eq(["rails generate model User email:string password:string", " --no-migration", "\n\n"])
|
17
|
+
end
|
18
|
+
|
19
|
+
it "raises an exception" do
|
20
|
+
allow(email_attribute).to receive(:to_script).and_raise(StandardError, "something went wrong")
|
21
|
+
expect { table.to_script("model", true) }.to output(/something went wrong/).to_stdout
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
describe ".parse" do
|
26
|
+
let(:table) { Table.parse(table_data) }
|
27
|
+
it "parses given table data" do
|
28
|
+
expect(table).to be_kind_of(SchemaToScaffold::Table)
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
end
|
33
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: schema_to_scaffold
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.8.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- João Soares
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date:
|
12
|
+
date: 2016-12-27 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: activesupport
|
@@ -45,8 +45,36 @@ dependencies:
|
|
45
45
|
- - ">="
|
46
46
|
- !ruby/object:Gem::Version
|
47
47
|
version: 0.10.0
|
48
|
-
|
49
|
-
|
48
|
+
- !ruby/object:Gem::Dependency
|
49
|
+
name: rspec
|
50
|
+
requirement: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ">="
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
55
|
+
type: :development
|
56
|
+
prerelease: false
|
57
|
+
version_requirements: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - ">="
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
- !ruby/object:Gem::Dependency
|
63
|
+
name: simplecov
|
64
|
+
requirement: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - ">="
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0'
|
69
|
+
type: :development
|
70
|
+
prerelease: false
|
71
|
+
version_requirements: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - ">="
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '0'
|
76
|
+
description: " Command line app which parses a schema.rb file obtained from your
|
77
|
+
rails repo or by running rake:schema:dump\n"
|
50
78
|
email:
|
51
79
|
- jsoaresgeral@gmail.com
|
52
80
|
- hlsp999@gmail.com
|
@@ -56,6 +84,8 @@ extensions: []
|
|
56
84
|
extra_rdoc_files: []
|
57
85
|
files:
|
58
86
|
- ".gitignore"
|
87
|
+
- ".rspec"
|
88
|
+
- ".ruby-gemset"
|
59
89
|
- ".ruby-version"
|
60
90
|
- CHANGELOG.md
|
61
91
|
- Gemfile
|
@@ -65,16 +95,31 @@ files:
|
|
65
95
|
- bin/scaffold
|
66
96
|
- lib/schema_to_scaffold.rb
|
67
97
|
- lib/schema_to_scaffold/attribute.rb
|
98
|
+
- lib/schema_to_scaffold/cli.rb
|
99
|
+
- lib/schema_to_scaffold/clipboard.rb
|
100
|
+
- lib/schema_to_scaffold/help.rb
|
68
101
|
- lib/schema_to_scaffold/path.rb
|
69
102
|
- lib/schema_to_scaffold/schema.rb
|
70
103
|
- lib/schema_to_scaffold/table.rb
|
71
104
|
- lib/schema_to_scaffold/version.rb
|
72
105
|
- schema_to_scaffold.gemspec
|
106
|
+
- spec/attribute_spec.rb
|
107
|
+
- spec/cli_spec.rb
|
108
|
+
- spec/clipboard_spec.rb
|
109
|
+
- spec/help_spec.rb
|
110
|
+
- spec/path_spec.rb
|
111
|
+
- spec/schema_spec.rb
|
112
|
+
- spec/schema_to_scaffold_spec.rb
|
113
|
+
- spec/spec_helper.rb
|
114
|
+
- spec/support/empty_schema.rb
|
115
|
+
- spec/support/schema.rb
|
116
|
+
- spec/support/table.rb
|
117
|
+
- spec/table_spec.rb
|
73
118
|
homepage: http://github.com/frenesim/schema_to_scaffold
|
74
119
|
licenses:
|
75
120
|
- MIT
|
76
121
|
metadata: {}
|
77
|
-
post_install_message:
|
122
|
+
post_install_message:
|
78
123
|
rdoc_options: []
|
79
124
|
require_paths:
|
80
125
|
- lib
|
@@ -90,7 +135,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
90
135
|
version: '0'
|
91
136
|
requirements: []
|
92
137
|
rubyforge_project:
|
93
|
-
rubygems_version: 2.
|
138
|
+
rubygems_version: 2.5.1
|
94
139
|
signing_key:
|
95
140
|
specification_version: 4
|
96
141
|
summary: Generate rails scaffold script from a schema.rb file.
|