quik 0.3.0 → 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/{HISTORY.md → CHANGELOG.md} +3 -3
- data/LICENSE.md +116 -0
- data/Manifest.txt +30 -29
- data/README.md +133 -131
- data/Rakefile +33 -34
- data/bin/qk +5 -5
- data/bin/quik +5 -5
- data/lib/quik.rb +55 -44
- data/lib/quik/builder.rb +96 -96
- data/lib/quik/catalog.rb +73 -56
- data/lib/quik/cli/main.rb +213 -179
- data/lib/quik/cli/opts.rb +33 -33
- data/lib/quik/colors.rb +148 -147
- data/lib/quik/config.rb +60 -60
- data/lib/quik/merger.rb +207 -208
- data/lib/quik/package.rb +116 -115
- data/lib/quik/version.rb +24 -24
- data/lib/quik/wizard.rb +88 -88
- data/test/data/gem-starter-template/Manifest.txt +9 -9
- data/test/data/gem-starter-template/README.md +22 -22
- data/test/data/gem-starter-template/lib/__filename__/version.rb +12 -12
- data/test/helper.rb +18 -22
- data/test/test_colors.rb +39 -39
- data/test/test_config.rb +35 -35
- data/test/test_merger.rb +35 -35
- data/test/test_package.rb +22 -22
- data/test/test_wizard.rb +50 -50
- metadata +26 -38
- data/.gemtest +0 -0
data/Rakefile
CHANGED
@@ -1,34 +1,33 @@
|
|
1
|
-
require 'hoe'
|
2
|
-
require './lib/quik/version.rb'
|
3
|
-
|
4
|
-
Hoe.spec 'quik' do
|
5
|
-
|
6
|
-
self.version = Quik::VERSION
|
7
|
-
|
8
|
-
self.summary = 'quik - ruby quick starter template script wizard .:. the missing code generator'
|
9
|
-
self.description = summary
|
10
|
-
|
11
|
-
self.urls =
|
12
|
-
|
13
|
-
self.author = 'Gerald Bauer'
|
14
|
-
self.email = 'ruby-talk@ruby-lang.org'
|
15
|
-
|
16
|
-
# switch extension to .markdown for gihub formatting
|
17
|
-
self.readme_file = 'README.md'
|
18
|
-
self.history_file = '
|
19
|
-
|
20
|
-
self.extra_deps = [
|
21
|
-
['logutils'],
|
22
|
-
['
|
23
|
-
['
|
24
|
-
['
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
end
|
1
|
+
require 'hoe'
|
2
|
+
require './lib/quik/version.rb'
|
3
|
+
|
4
|
+
Hoe.spec 'quik' do
|
5
|
+
|
6
|
+
self.version = Quik::VERSION
|
7
|
+
|
8
|
+
self.summary = 'qk/quik - ruby quick starter template script wizard .:. the missing code generator'
|
9
|
+
self.description = summary
|
10
|
+
|
11
|
+
self.urls = { home: 'https://github.com/quikstart/quik' }
|
12
|
+
|
13
|
+
self.author = 'Gerald Bauer'
|
14
|
+
self.email = 'ruby-talk@ruby-lang.org'
|
15
|
+
|
16
|
+
# switch extension to .markdown for gihub formatting
|
17
|
+
self.readme_file = 'README.md'
|
18
|
+
self.history_file = 'CHANGELOG.md'
|
19
|
+
|
20
|
+
self.extra_deps = [
|
21
|
+
['logutils'],
|
22
|
+
['fetcher'],
|
23
|
+
['rubyzip'],
|
24
|
+
['gli'],
|
25
|
+
]
|
26
|
+
|
27
|
+
self.licenses = ['Public Domain']
|
28
|
+
|
29
|
+
self.spec_extras = {
|
30
|
+
required_ruby_version: '>= 2.2.2'
|
31
|
+
}
|
32
|
+
|
33
|
+
end
|
data/bin/qk
CHANGED
@@ -1,5 +1,5 @@
|
|
1
|
-
#!/usr/bin/env ruby
|
2
|
-
|
3
|
-
require 'quik'
|
4
|
-
|
5
|
-
Quik.main
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require 'quik'
|
4
|
+
|
5
|
+
Quik.main
|
data/bin/quik
CHANGED
@@ -1,5 +1,5 @@
|
|
1
|
-
#!/usr/bin/env ruby
|
2
|
-
|
3
|
-
require 'quik'
|
4
|
-
|
5
|
-
Quik.main
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require 'quik'
|
4
|
+
|
5
|
+
Quik.main
|
data/lib/quik.rb
CHANGED
@@ -1,44 +1,55 @@
|
|
1
|
-
# encoding: utf-8
|
2
|
-
|
3
|
-
# stdlibs
|
4
|
-
require 'pp'
|
5
|
-
require 'fileutils'
|
6
|
-
require 'yaml'
|
7
|
-
require '
|
8
|
-
|
9
|
-
|
10
|
-
require '
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
require '
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
require 'quik/
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
# stdlibs
|
4
|
+
require 'pp'
|
5
|
+
require 'fileutils'
|
6
|
+
require 'yaml'
|
7
|
+
require 'json'
|
8
|
+
require 'uri'
|
9
|
+
require 'time'
|
10
|
+
require 'date'
|
11
|
+
|
12
|
+
|
13
|
+
# 3rd party libs/gems
|
14
|
+
require 'fetcher'
|
15
|
+
|
16
|
+
## more 3rd party gems
|
17
|
+
require 'zip' # use $ gem install rubyzip
|
18
|
+
require 'gli'
|
19
|
+
|
20
|
+
|
21
|
+
# our own code
|
22
|
+
require 'quik/version' # let version always go first
|
23
|
+
|
24
|
+
|
25
|
+
module Quik
|
26
|
+
### builtin default urls
|
27
|
+
QUIK_SCRIPTS_URL = "https://github.com/quikstart/scripts/raw/master/scripts.yml"
|
28
|
+
end
|
29
|
+
|
30
|
+
|
31
|
+
|
32
|
+
require 'quik/catalog'
|
33
|
+
require 'quik/package'
|
34
|
+
require 'quik/merger'
|
35
|
+
require 'quik/config'
|
36
|
+
require 'quik/wizard'
|
37
|
+
require 'quik/builder'
|
38
|
+
require 'quik/colors'
|
39
|
+
|
40
|
+
|
41
|
+
require 'quik/cli/opts'
|
42
|
+
require 'quik/cli/main'
|
43
|
+
|
44
|
+
|
45
|
+
module Quik
|
46
|
+
def self.main( args=ARGV )
|
47
|
+
exit Tool.new.run( args )
|
48
|
+
end
|
49
|
+
end # module Quik
|
50
|
+
|
51
|
+
|
52
|
+
|
53
|
+
|
54
|
+
## say hello
|
55
|
+
puts Quik.banner if defined?($RUBYLIBS_DEBUG) && $RUBYLIBS_DEBUG
|
data/lib/quik/builder.rb
CHANGED
@@ -1,96 +1,96 @@
|
|
1
|
-
#encoding: utf-8
|
2
|
-
|
3
|
-
module Quik
|
4
|
-
|
5
|
-
class Builder
|
6
|
-
|
7
|
-
def self.load_file( path, opts={} )
|
8
|
-
code = File.
|
9
|
-
self.load( code, opts )
|
10
|
-
end
|
11
|
-
|
12
|
-
def self.load( code, opts={} )
|
13
|
-
builder = Builder.new( opts )
|
14
|
-
builder.instance_eval( code )
|
15
|
-
builder
|
16
|
-
end
|
17
|
-
|
18
|
-
|
19
|
-
include Wizard ## mixin helpers for say, ask, yes?, no?, select, etc.
|
20
|
-
|
21
|
-
def initialize( opts={} )
|
22
|
-
puts "starting new Quik script #{opts.inspect}; lets go"
|
23
|
-
|
24
|
-
@test = opts[:dry_run] || opts[:test] || false
|
25
|
-
@output_dir = opts[:o] || '.'
|
26
|
-
@pak = nil ## for now reference last template pack (in future support many - why?? why not??)
|
27
|
-
end
|
28
|
-
|
29
|
-
## "global" builder options
|
30
|
-
def test?() @test; end ## dry_run option (defaults to false)
|
31
|
-
def output_dir() @output_dir; end ## ouptput (root) dir (defaults to . e.g. working folder)
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
def use( name, opts={} ) ## short alias for install_template
|
36
|
-
install_template( name, opts )
|
37
|
-
end
|
38
|
-
|
39
|
-
def install_template( name, opts= {} )
|
40
|
-
puts "
|
41
|
-
|
42
|
-
## note for now assume name is key
|
43
|
-
## e.g. always downcase (e.g. Gem => gem)
|
44
|
-
key = name.downcase
|
45
|
-
|
46
|
-
if test?
|
47
|
-
# do nothing; dry run
|
48
|
-
else
|
49
|
-
@pak = Package.new( key )
|
50
|
-
|
51
|
-
puts "GET #{@pak.remote_zip_url}".bold.green ## output network access in green bold
|
52
|
-
@pak.download
|
53
|
-
## pak.unzip( "#{@output_dir}/#{key}" )
|
54
|
-
end
|
55
|
-
end
|
56
|
-
|
57
|
-
|
58
|
-
def config( opts={} )
|
59
|
-
puts "
|
60
|
-
c = OpenConfig.new
|
61
|
-
yield( c )
|
62
|
-
## pp c
|
63
|
-
h = c.to_h
|
64
|
-
|
65
|
-
pp h
|
66
|
-
|
67
|
-
##
|
68
|
-
# check for name
|
69
|
-
## required for output
|
70
|
-
## if no name
|
71
|
-
## use ./ working folder for output!!!
|
72
|
-
|
73
|
-
name = h['name']
|
74
|
-
|
75
|
-
if name.nil? || name.empty?
|
76
|
-
fail 'sorry; for now name is required for output folder'
|
77
|
-
end
|
78
|
-
|
79
|
-
if test?
|
80
|
-
## do nothing; dry run
|
81
|
-
else
|
82
|
-
if @pak
|
83
|
-
unzip_dir = "./#{name}"
|
84
|
-
## step 1: unzip templates
|
85
|
-
@pak.unzip( unzip_dir )
|
86
|
-
## step 2: merge templates (using hash/config settings)
|
87
|
-
m = Quik::Merger.new
|
88
|
-
m.merge( unzip_dir, h )
|
89
|
-
end
|
90
|
-
end
|
91
|
-
end # method config
|
92
|
-
|
93
|
-
|
94
|
-
end # class Builder
|
95
|
-
|
96
|
-
end # module Quik
|
1
|
+
#encoding: utf-8
|
2
|
+
|
3
|
+
module Quik
|
4
|
+
|
5
|
+
class Builder
|
6
|
+
|
7
|
+
def self.load_file( path, opts={} )
|
8
|
+
code = File.open( path, 'r:utf-8' ) { |f| f.read }
|
9
|
+
self.load( code, opts )
|
10
|
+
end
|
11
|
+
|
12
|
+
def self.load( code, opts={} )
|
13
|
+
builder = Builder.new( opts )
|
14
|
+
builder.instance_eval( code )
|
15
|
+
builder
|
16
|
+
end
|
17
|
+
|
18
|
+
|
19
|
+
include Wizard ## mixin helpers for say, ask, yes?, no?, select, etc.
|
20
|
+
|
21
|
+
def initialize( opts={} )
|
22
|
+
puts "==> starting new Quik script with options #{opts.inspect}; lets go"
|
23
|
+
|
24
|
+
@test = opts[:dry_run] || opts[:test] || false
|
25
|
+
@output_dir = opts[:o] || '.'
|
26
|
+
@pak = nil ## for now reference last template pack (in future support many - why?? why not??)
|
27
|
+
end
|
28
|
+
|
29
|
+
## "global" builder options
|
30
|
+
def test?() @test; end ## dry_run option (defaults to false)
|
31
|
+
def output_dir() @output_dir; end ## ouptput (root) dir (defaults to . e.g. working folder)
|
32
|
+
|
33
|
+
|
34
|
+
|
35
|
+
def use( name, opts={} ) ## short alias for install_template
|
36
|
+
install_template( name, opts )
|
37
|
+
end
|
38
|
+
|
39
|
+
def install_template( name, opts= {} )
|
40
|
+
puts "==> handle install_template >#{name}< with options #{opts.inspect}"
|
41
|
+
|
42
|
+
## note for now assume name is key
|
43
|
+
## e.g. always downcase (e.g. Gem => gem)
|
44
|
+
key = name.downcase
|
45
|
+
|
46
|
+
if test?
|
47
|
+
# do nothing; dry run
|
48
|
+
else
|
49
|
+
@pak = Package.new( key )
|
50
|
+
|
51
|
+
puts "GET #{@pak.remote_zip_url}".bold.green ## output network access in green bold
|
52
|
+
@pak.download
|
53
|
+
## pak.unzip( "#{@output_dir}/#{key}" )
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
|
58
|
+
def config( opts={} )
|
59
|
+
puts "==> handle config block"
|
60
|
+
c = OpenConfig.new
|
61
|
+
yield( c )
|
62
|
+
## pp c
|
63
|
+
h = c.to_h
|
64
|
+
|
65
|
+
pp h
|
66
|
+
|
67
|
+
##
|
68
|
+
# check for name
|
69
|
+
## required for output
|
70
|
+
## if no name
|
71
|
+
## use ./ working folder for output!!!
|
72
|
+
|
73
|
+
name = h['name']
|
74
|
+
|
75
|
+
if name.nil? || name.empty?
|
76
|
+
fail 'sorry; for now name is required for output folder'
|
77
|
+
end
|
78
|
+
|
79
|
+
if test?
|
80
|
+
## do nothing; dry run
|
81
|
+
else
|
82
|
+
if @pak
|
83
|
+
unzip_dir = "./#{name}"
|
84
|
+
## step 1: unzip templates
|
85
|
+
@pak.unzip( unzip_dir )
|
86
|
+
## step 2: merge templates (using hash/config settings)
|
87
|
+
m = Quik::Merger.new
|
88
|
+
m.merge( unzip_dir, h )
|
89
|
+
end
|
90
|
+
end
|
91
|
+
end # method config
|
92
|
+
|
93
|
+
|
94
|
+
end # class Builder
|
95
|
+
|
96
|
+
end # module Quik
|
data/lib/quik/catalog.rb
CHANGED
@@ -1,56 +1,73 @@
|
|
1
|
-
# encoding: utf-8
|
2
|
-
|
3
|
-
module Quik
|
4
|
-
|
5
|
-
class Catalog
|
6
|
-
|
7
|
-
def self.from_url( src )
|
8
|
-
worker = Fetcher::Worker.new
|
9
|
-
text = worker.read_utf8!( src )
|
10
|
-
|
11
|
-
end
|
12
|
-
|
13
|
-
def self.from_file( path )
|
14
|
-
## read in themes catalog
|
15
|
-
text
|
16
|
-
|
17
|
-
end
|
18
|
-
|
19
|
-
def self.from_string( text )
|
20
|
-
self.new( text )
|
21
|
-
end
|
22
|
-
|
23
|
-
|
24
|
-
def initialize( text )
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
module Quik
|
4
|
+
|
5
|
+
class Catalog
|
6
|
+
|
7
|
+
def self.from_url( src )
|
8
|
+
worker = Fetcher::Worker.new
|
9
|
+
text = worker.read_utf8!( src )
|
10
|
+
new( text )
|
11
|
+
end
|
12
|
+
|
13
|
+
def self.from_file( path )
|
14
|
+
## read in themes catalog
|
15
|
+
text = File.open( path, 'r:utf-8' ) { |f| f.read }
|
16
|
+
new( text )
|
17
|
+
end
|
18
|
+
|
19
|
+
# def self.from_string( text )
|
20
|
+
# self.new( text )
|
21
|
+
# end
|
22
|
+
|
23
|
+
|
24
|
+
def initialize( text )
|
25
|
+
recs = YAML.load( text )
|
26
|
+
## note: convert array to hash (lookup by name)
|
27
|
+
## todo: check for missing name property? - why? why not?
|
28
|
+
@scripts = recs.reduce( {} ) { |h,rec| h[rec['name']] = rec; h }
|
29
|
+
end
|
30
|
+
|
31
|
+
|
32
|
+
def find( name )
|
33
|
+
@scripts[ name ]
|
34
|
+
end
|
35
|
+
|
36
|
+
def list( filter=nil )
|
37
|
+
## pp filter
|
38
|
+
|
39
|
+
@scripts.each_with_index do |(_,rec),i|
|
40
|
+
name = rec['name']
|
41
|
+
summary = rec['summary']
|
42
|
+
script = rec['script']
|
43
|
+
|
44
|
+
if script && script.index( '//github.com/')
|
45
|
+
## "beautify" / shorten github links - remove raw/master/
|
46
|
+
script = script.gsub('raw/master/', '' )
|
47
|
+
end
|
48
|
+
|
49
|
+
## pp h
|
50
|
+
|
51
|
+
line = ''
|
52
|
+
line << " %3d" % (i+1)
|
53
|
+
line << "..%-10s" % name
|
54
|
+
line << " .:. #{summary}"
|
55
|
+
line << " @ (#{script})"
|
56
|
+
|
57
|
+
if filter
|
58
|
+
## note: ignore case (upper/lower/downcase) for now
|
59
|
+
## filter on name/title and
|
60
|
+
## tags for now
|
61
|
+
if name.downcase.index(filter.downcase) != nil || ## note: 0 is match found on index 0; only nil is not found
|
62
|
+
summary.downcase.index(filter.downcase) != nil
|
63
|
+
puts line
|
64
|
+
end
|
65
|
+
else
|
66
|
+
puts line
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end # method filter
|
70
|
+
|
71
|
+
end # class Catalog
|
72
|
+
|
73
|
+
end # module Quik
|