mrhyde-tools 0.0.1 → 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gemtest +0 -0
- data/Manifest.txt +15 -0
- data/README.md +100 -5
- data/Rakefile +3 -1
- data/bin/mrh +5 -0
- data/bin/mrhyde +5 -0
- data/lib/mrhyde.rb +20 -2
- data/lib/mrhyde/builder.rb +123 -0
- data/lib/mrhyde/cli/main.rb +149 -0
- data/lib/mrhyde/cli/opts.rb +33 -0
- data/lib/mrhyde/config.rb +60 -0
- data/lib/mrhyde/version.rb +2 -2
- data/lib/mrhyde/wizard.rb +88 -0
- data/test/helper.rb +22 -0
- data/test/scripts/starter.rb +36 -0
- data/test/scripts/starterii.rb +39 -0
- data/test/test_builder.rb +40 -0
- data/test/test_config.rb +31 -0
- data/test/test_install_theme.rb +25 -0
- data/test/test_url.rb +40 -0
- data/test/test_wizard.rb +50 -0
- metadata +58 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: aae57c42c231ddd4cbf85848a18d5f43c98ece4f
|
4
|
+
data.tar.gz: b90daa336b9b14f682fbbaed03b5199d14ac8ade
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 80d28406f03ea41d492fb025a98eb1490a8fe665f4d0c3e88f2adbf99880b55074f1e2eb6770b308b798153d9d89cdf260594eb1424440581944963de05363b6
|
7
|
+
data.tar.gz: b170832289088da0ad4af8176ce6c589a645fbefc27e40e536536b7c2cb09ea245e40c73039f1d9d62b03d9b6dfd02cdcd610215df373f09b9a7e2f502d5b130
|
data/.gemtest
ADDED
File without changes
|
data/Manifest.txt
CHANGED
@@ -2,6 +2,21 @@ HISTORY.md
|
|
2
2
|
Manifest.txt
|
3
3
|
README.md
|
4
4
|
Rakefile
|
5
|
+
bin/mrh
|
6
|
+
bin/mrhyde
|
5
7
|
lib/mrhyde.rb
|
8
|
+
lib/mrhyde/builder.rb
|
9
|
+
lib/mrhyde/cli/main.rb
|
10
|
+
lib/mrhyde/cli/opts.rb
|
11
|
+
lib/mrhyde/config.rb
|
6
12
|
lib/mrhyde/tools.rb
|
7
13
|
lib/mrhyde/version.rb
|
14
|
+
lib/mrhyde/wizard.rb
|
15
|
+
test/helper.rb
|
16
|
+
test/scripts/starter.rb
|
17
|
+
test/scripts/starterii.rb
|
18
|
+
test/test_builder.rb
|
19
|
+
test/test_config.rb
|
20
|
+
test/test_install_theme.rb
|
21
|
+
test/test_url.rb
|
22
|
+
test/test_wizard.rb
|
data/README.md
CHANGED
@@ -1,18 +1,113 @@
|
|
1
|
-
# mrhyde
|
1
|
+
# mrh/mrhyde - static site quick starter script wizard
|
2
2
|
|
3
|
-
|
3
|
+
jekyll command line tool
|
4
4
|
|
5
5
|
* home :: [github.com/mrhydescripts/mrhyde](https://github.com/mrhydescripts/mrhyde)
|
6
6
|
* bugs :: [github.com/mrhydescripts/mrhyde/issues](https://github.com/mrhydescripts/mrhyde/issues)
|
7
|
-
* gem :: [rubygems.org/gems/mrhyde](https://rubygems.org/gems/mrhyde)
|
8
|
-
* rdoc :: [rubydoc.info/gems/mrhyde](http://rubydoc.info/gems/mrhyde)
|
7
|
+
* gem :: [rubygems.org/gems/mrhyde-tools](https://rubygems.org/gems/mrhyde-tools)
|
8
|
+
* rdoc :: [rubydoc.info/gems/mrhyde-tools](http://rubydoc.info/gems/mrhyde-tools)
|
9
9
|
* forum :: [wwwmake](http://groups.google.com/group/wwwmake)
|
10
10
|
|
11
11
|
|
12
12
|
## Usage
|
13
13
|
|
14
|
-
|
14
|
+
The mrhyde-tools gem includes a command line tool that lets you
|
15
|
+
run static site quick starter scripts. Try:
|
15
16
|
|
17
|
+
```
|
18
|
+
$ mrhyde --help # or
|
19
|
+
$ mrh -h
|
20
|
+
```
|
21
|
+
|
22
|
+
Resulting in:
|
23
|
+
|
24
|
+
```
|
25
|
+
NAME
|
26
|
+
mrh/mrhyde - jekyll command line tool .:. the static site quick starter script wizard
|
27
|
+
|
28
|
+
SYNOPSIS
|
29
|
+
mrhyde [global options] command [command options] [arguments...]
|
30
|
+
|
31
|
+
VERSION
|
32
|
+
0.1.0
|
33
|
+
|
34
|
+
GLOBAL OPTIONS
|
35
|
+
--help - Show this message
|
36
|
+
--test, --dry_run - (Debug) Dry run; run script in simulation for testing
|
37
|
+
--verbose - (Debug) Show debug messages
|
38
|
+
--version - Display the program version
|
39
|
+
|
40
|
+
COMMANDS
|
41
|
+
new, n - Run static site quick starter script
|
42
|
+
|
43
|
+
help - Shows a list of commands or help for one command
|
44
|
+
test - (Debug) Test command suite
|
45
|
+
```
|
46
|
+
|
47
|
+
|
48
|
+
### Commands
|
49
|
+
|
50
|
+
[New Wizard](#new-wizard-command---new-n)
|
51
|
+
|
52
|
+
#### New Wizard Command - `new`, `n`
|
53
|
+
|
54
|
+
To run a static site quick starter wizard script
|
55
|
+
to download and install (unzip/unpack) a theme archive and configure
|
56
|
+
a static site ready-to-use. Try:
|
57
|
+
|
58
|
+
|
59
|
+
```
|
60
|
+
$ mrhyde new starter # or
|
61
|
+
$ mrhyde n starter # or
|
62
|
+
$ mrh n starter
|
63
|
+
```
|
64
|
+
|
65
|
+
This will download the `starter.rb` wizard script
|
66
|
+
from the [Mr. Hyde's Scripts](https://github.com/mrhydescripts/scripts) repo
|
67
|
+
and run through all steps e.g.:
|
68
|
+
|
69
|
+
```
|
70
|
+
Welcome, before setting up your site Mr. Hyde will ask you some questions.
|
71
|
+
|
72
|
+
Q: What's your site's title? [Your Site Title]: Another Beautiful Static Site
|
73
|
+
Q: What's your name? [Henry Jekyll]: Edward Hyde
|
74
|
+
Q: Select your theme:
|
75
|
+
1 - Starter
|
76
|
+
2 - Bootstrap
|
77
|
+
3 - Minimal
|
78
|
+
Your choice (1-3)? [1]: 2
|
79
|
+
|
80
|
+
Thanks! Ready-to-go. Stand back.
|
81
|
+
|
82
|
+
Downloading Dr. Jekyll's Bootstrap Theme...
|
83
|
+
Setting up Dr. Jeykll's Bootstrap Theme..
|
84
|
+
...
|
85
|
+
Updating settings in _config.yml...
|
86
|
+
title: "Another Beautiful Static Site"
|
87
|
+
author.name: "Edward Hyde"
|
88
|
+
...
|
89
|
+
Done.
|
90
|
+
```
|
91
|
+
|
92
|
+
That's it. Now use:
|
93
|
+
|
94
|
+
```
|
95
|
+
$ cd starter
|
96
|
+
$ jekyll serve
|
97
|
+
```
|
98
|
+
|
99
|
+
And open up your new static site in your browser.
|
100
|
+
|
101
|
+
|
102
|
+
|
103
|
+
**More Quick Starter Wizard Scripts**
|
104
|
+
|
105
|
+
See the [Mr. Hyde's Scripts](https://github.com/mrhydescripts/scripts) library.
|
106
|
+
|
107
|
+
|
108
|
+
**More Themes**
|
109
|
+
|
110
|
+
See the [Dr. Jekyll's Themes](https://drjekyllthemes.github.io) directory.
|
16
111
|
|
17
112
|
|
18
113
|
|
data/Rakefile
CHANGED
@@ -5,7 +5,7 @@ Hoe.spec 'mrhyde-tools' do
|
|
5
5
|
|
6
6
|
self.version = MrHyde::VERSION
|
7
7
|
|
8
|
-
self.summary = "mrhyde - static site quick starter
|
8
|
+
self.summary = "mrhyde - jekyll command line tool .:. static site quick starter script wizard"
|
9
9
|
self.description = summary
|
10
10
|
|
11
11
|
self.urls = ['https://github.com/mrhydescripts/mrhyde']
|
@@ -18,6 +18,8 @@ Hoe.spec 'mrhyde-tools' do
|
|
18
18
|
self.history_file = 'HISTORY.md'
|
19
19
|
|
20
20
|
self.extra_deps = [
|
21
|
+
['logutils'],
|
22
|
+
['textutils'],
|
21
23
|
['drjekyll'],
|
22
24
|
]
|
23
25
|
|
data/bin/mrh
ADDED
data/bin/mrhyde
ADDED
data/lib/mrhyde.rb
CHANGED
@@ -1,12 +1,30 @@
|
|
1
1
|
# encoding: utf-8
|
2
2
|
|
3
|
+
## stdlibs
|
3
4
|
require 'pp'
|
5
|
+
require 'yaml'
|
6
|
+
require 'uri'
|
4
7
|
|
5
8
|
|
9
|
+
## 3rd party libs
|
10
|
+
require 'textutils' ## used for File.read_utf8
|
11
|
+
require 'drjekyll'
|
12
|
+
|
6
13
|
## our own code
|
7
14
|
require 'mrhyde/version' # note: let version always go first
|
15
|
+
require 'mrhyde/wizard'
|
16
|
+
require 'mrhyde/builder'
|
17
|
+
require 'mrhyde/config'
|
18
|
+
|
19
|
+
require 'mrhyde/cli/opts'
|
20
|
+
require 'mrhyde/cli/main'
|
21
|
+
|
8
22
|
|
23
|
+
module MrHyde
|
24
|
+
def self.main
|
25
|
+
exit Tool.new.run( ARGV )
|
26
|
+
end
|
27
|
+
end # module MrHyde
|
9
28
|
|
10
|
-
pp MrHyde.banner
|
11
|
-
pp MrHyde.root
|
12
29
|
|
30
|
+
MrHyde.main if __FILE__ == $0
|
@@ -0,0 +1,123 @@
|
|
1
|
+
#encoding: utf-8
|
2
|
+
|
3
|
+
module MrHyde
|
4
|
+
|
5
|
+
class Builder
|
6
|
+
|
7
|
+
def self.load_file( path, opts={} )
|
8
|
+
code = File.read_utf8( path )
|
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 MrHyde script (sitefile) #{opts.inspect}; lets go"
|
23
|
+
|
24
|
+
@test = opts[:dry_run] || opts[:test] || false
|
25
|
+
@output_dir = opts[:o] || '.'
|
26
|
+
end
|
27
|
+
|
28
|
+
## "global" builder options
|
29
|
+
def test?() @test; end ## dry_run option (defaults to false)
|
30
|
+
def output_dir() @output_dir; end ## ouptput (root) dir (defaults to . e.g. working folder)
|
31
|
+
|
32
|
+
|
33
|
+
def install_theme( name, opts= {} )
|
34
|
+
puts " handle install_theme #{name}, #{opts.inspect}"
|
35
|
+
|
36
|
+
## note for now assume name is key
|
37
|
+
## e.g. always downcase (e.g. Starter => starter)
|
38
|
+
@theme_key = key = name.downcase
|
39
|
+
|
40
|
+
## themes_dir = "#{DrJekyll.root}/test/data"
|
41
|
+
## catalog = Catalog.new( "#{themes_dir}/themes.yml" )
|
42
|
+
url = "https://github.com/drjekyllthemes/themes/raw/master/o/themes.yml"
|
43
|
+
|
44
|
+
if test?
|
45
|
+
# do nothing; dry run
|
46
|
+
else
|
47
|
+
catalog = DrJekyll::Catalog.from_url( url )
|
48
|
+
theme = catalog.find( key )
|
49
|
+
if theme
|
50
|
+
pak = DrJekyll::Package.new( key, theme )
|
51
|
+
pak.download
|
52
|
+
pak.unzip( "#{@output_dir}/#{key}" )
|
53
|
+
else
|
54
|
+
## todo: issue warning - why, why not??
|
55
|
+
fail "*** theme '#{key}' not found; sorry"
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
|
61
|
+
def config( opts={} )
|
62
|
+
puts " handle config block"
|
63
|
+
c = OpenConfig.new
|
64
|
+
yield( c )
|
65
|
+
## pp c
|
66
|
+
h = c.to_h
|
67
|
+
|
68
|
+
##
|
69
|
+
# check for site.url if present also
|
70
|
+
# add site.baseurl|path
|
71
|
+
|
72
|
+
site_url = h['url']
|
73
|
+
|
74
|
+
if site_url.nil? || site_url.empty? ## special case site_url is empty string ""
|
75
|
+
## note: always add site url for now
|
76
|
+
## todo/fix: warn if we overwrite "empty" site.url - why? why not?
|
77
|
+
h['url'] = 'http://example.com' # note: no trailing slash (/) e.g. example.com/
|
78
|
+
h['baseurl'] = '' # note: no trailing slash (/) e.g. /
|
79
|
+
h['path'] = '' # (better) alias for baseurl
|
80
|
+
else
|
81
|
+
## site_baseurl = h['baseurl']
|
82
|
+
## site_path = h['path']
|
83
|
+
|
84
|
+
### calculate path/baseurl
|
85
|
+
url = URI.parse( site_url )
|
86
|
+
path = url.path.sub(/\/$/, '' ) ## note: cut off trailing slash if present e.g. '/' becomes ''
|
87
|
+
|
88
|
+
h['baseurl'] = path
|
89
|
+
h['path'] = path
|
90
|
+
## todo/fix: warn if we overwrite baseurl/path we new values - why? why not?
|
91
|
+
end
|
92
|
+
|
93
|
+
pp h
|
94
|
+
|
95
|
+
|
96
|
+
if test?
|
97
|
+
## do nothing; dry run
|
98
|
+
else
|
99
|
+
org = YAML.load_file( "#{@output_dir}/#{@theme_key}/_config.yml" )
|
100
|
+
pp org
|
101
|
+
|
102
|
+
## for now always add props at the end
|
103
|
+
## improve later (patch using regex etc. - why? why not?)
|
104
|
+
|
105
|
+
new_settings = YAML.dump( h )
|
106
|
+
## note: cut off leading --- if present
|
107
|
+
new_settings = new_settings.sub( /^-{3}\s*/, '')
|
108
|
+
|
109
|
+
File.open( "#{@output_dir}/#{@theme_key}/_config.yml", "a" ) do |f|
|
110
|
+
f.puts
|
111
|
+
f.puts "######################################"
|
112
|
+
f.puts "### Mr Hyde's Settings"
|
113
|
+
f.puts
|
114
|
+
f.puts new_settings
|
115
|
+
end
|
116
|
+
end
|
117
|
+
|
118
|
+
end # method config
|
119
|
+
|
120
|
+
end # class Builder
|
121
|
+
|
122
|
+
end # module MrHyde
|
123
|
+
|
@@ -0,0 +1,149 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
### NOTE: wrap gli config into a class
|
4
|
+
## see github.com/davetron5000/gli/issues/153
|
5
|
+
|
6
|
+
module MrHyde
|
7
|
+
|
8
|
+
class Tool
|
9
|
+
def initialize
|
10
|
+
LogUtils::Logger.root.level = :info # set logging level to info
|
11
|
+
end
|
12
|
+
|
13
|
+
def run( args )
|
14
|
+
puts MrHyde.banner
|
15
|
+
Toolii.run( args )
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
## NOTE: gli added function are class methods (thus, wrap class Toolii in Tool for now)
|
20
|
+
|
21
|
+
class Toolii
|
22
|
+
extend GLI::App
|
23
|
+
|
24
|
+
def self.logger=(value) @@logger=value; end
|
25
|
+
def self.logger() @@logger; end
|
26
|
+
|
27
|
+
## todo: find a better name e.g. change to settings? config? safe_opts? why? why not?
|
28
|
+
def self.opts=(value) @@opts = value; end
|
29
|
+
def self.opts() @@opts; end
|
30
|
+
|
31
|
+
|
32
|
+
logger = LogUtils::Logger.root
|
33
|
+
opts = Opts.new
|
34
|
+
|
35
|
+
|
36
|
+
program_desc 'jekyll command line tool .:. the static site quick starter script wizard'
|
37
|
+
version VERSION
|
38
|
+
|
39
|
+
|
40
|
+
## desc 'Use only local (offline) cached data; no (online) remote network access'
|
41
|
+
## switch [:l, :local], negatable: false
|
42
|
+
|
43
|
+
desc '(Debug) Show debug messages'
|
44
|
+
switch [:verbose], negatable: false ## todo: use -w for short form? check ruby interpreter if in use too?
|
45
|
+
|
46
|
+
desc '(Debug) Dry run; run script in simulation for testing'
|
47
|
+
switch [:test, :dry_run], negatable: false
|
48
|
+
|
49
|
+
|
50
|
+
def self.fetch_script( name )
|
51
|
+
|
52
|
+
## first try local version in working folder
|
53
|
+
|
54
|
+
text = ''
|
55
|
+
local_script = "./#{name}.rb"
|
56
|
+
if File.exist?( local_script )
|
57
|
+
text = File.read_utf8( local_script )
|
58
|
+
else ## fetch remote script
|
59
|
+
url = "https://github.com/mrhydescripts/scripts/raw/master/#{name}.rb"
|
60
|
+
## assume utf8 text encoding for now
|
61
|
+
worker = Fetcher::Worker.new
|
62
|
+
text = worker.read_utf8!( url )
|
63
|
+
end
|
64
|
+
|
65
|
+
text
|
66
|
+
end
|
67
|
+
|
68
|
+
|
69
|
+
desc "Run static site quick starter script"
|
70
|
+
arg_name 'NAME' # required theme name
|
71
|
+
command [:new,:n] do |c|
|
72
|
+
|
73
|
+
c.action do |g,o,args|
|
74
|
+
|
75
|
+
name = args[0] || 'starter'
|
76
|
+
|
77
|
+
script = fetch_script( name )
|
78
|
+
if opts.test?
|
79
|
+
puts "dry (test) run:"
|
80
|
+
Builder.load( script, test: true )
|
81
|
+
else
|
82
|
+
Builder.load( script )
|
83
|
+
end
|
84
|
+
|
85
|
+
puts 'Done.'
|
86
|
+
end # action
|
87
|
+
end # command setup
|
88
|
+
|
89
|
+
|
90
|
+
|
91
|
+
desc '(Debug) Test command suite'
|
92
|
+
command :test do |c|
|
93
|
+
c.action do |g,o,args|
|
94
|
+
|
95
|
+
puts "hello from test command"
|
96
|
+
puts "args (#{args.class.name}):"
|
97
|
+
pp args
|
98
|
+
puts "o (#{o.class.name}):"
|
99
|
+
pp o
|
100
|
+
puts "g (#{g.class.name}):"
|
101
|
+
pp g
|
102
|
+
|
103
|
+
LogUtils::Logger.root.debug 'test debug msg'
|
104
|
+
LogUtils::Logger.root.info 'test info msg'
|
105
|
+
LogUtils::Logger.root.warn 'test warn msg'
|
106
|
+
|
107
|
+
puts 'Done.'
|
108
|
+
end
|
109
|
+
end
|
110
|
+
|
111
|
+
|
112
|
+
|
113
|
+
pre do |g,c,o,args|
|
114
|
+
opts.merge_gli_options!( g )
|
115
|
+
opts.merge_gli_options!( o )
|
116
|
+
|
117
|
+
puts MrHyde.banner
|
118
|
+
|
119
|
+
if opts.verbose?
|
120
|
+
LogUtils::Logger.root.level = :debug
|
121
|
+
end
|
122
|
+
|
123
|
+
logger.debug "Executing #{c.name}"
|
124
|
+
true
|
125
|
+
end
|
126
|
+
|
127
|
+
post do |global,c,o,args|
|
128
|
+
logger.debug "Executed #{c.name}"
|
129
|
+
true
|
130
|
+
end
|
131
|
+
|
132
|
+
|
133
|
+
on_error do |e|
|
134
|
+
puts
|
135
|
+
puts "*** error: #{e.message}"
|
136
|
+
|
137
|
+
if opts.verbose?
|
138
|
+
puts e.backtrace
|
139
|
+
end
|
140
|
+
|
141
|
+
false # skip default error handling
|
142
|
+
end
|
143
|
+
|
144
|
+
|
145
|
+
### exit run(ARGV) ## note: use Toolii.run( ARGV ) outside of class
|
146
|
+
|
147
|
+
end # class Toolii
|
148
|
+
|
149
|
+
end # module MrHyde
|
@@ -0,0 +1,33 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
module MrHyde
|
4
|
+
|
5
|
+
class Opts
|
6
|
+
|
7
|
+
def merge_gli_options!( options = {} )
|
8
|
+
@test = true if options[:test] == true
|
9
|
+
@verbose = true if options[:verbose] == true
|
10
|
+
end
|
11
|
+
|
12
|
+
|
13
|
+
def verbose=(boolean) # add: alias for debug ??
|
14
|
+
@verbose = boolean
|
15
|
+
end
|
16
|
+
|
17
|
+
def verbose?
|
18
|
+
return false if @verbose.nil? # default verbose/debug flag is false
|
19
|
+
@verbose == true
|
20
|
+
end
|
21
|
+
|
22
|
+
def test=(boolean)
|
23
|
+
@test = boolean
|
24
|
+
end
|
25
|
+
|
26
|
+
def test?
|
27
|
+
return false if @test.nil? # default test/dry-run flag is false
|
28
|
+
@test == true
|
29
|
+
end
|
30
|
+
|
31
|
+
end # class Opts
|
32
|
+
|
33
|
+
end # module MrHyde
|
@@ -0,0 +1,60 @@
|
|
1
|
+
#encoding: utf-8
|
2
|
+
|
3
|
+
module MrHyde
|
4
|
+
|
5
|
+
##
|
6
|
+
# used for config block
|
7
|
+
# lets you access props (even nested) that don't yet exist
|
8
|
+
# and all props get stored in a hash
|
9
|
+
#
|
10
|
+
# e.g
|
11
|
+
# c = OpenConfig.new
|
12
|
+
# c.title = 'title'
|
13
|
+
# c.author.name = 'name'
|
14
|
+
|
15
|
+
# c.mrhyde.last_updated = Time.now
|
16
|
+
# c.mrhyde.title = 'title'
|
17
|
+
# c.mrhyde.name = 'name'
|
18
|
+
# c.mrhyde.theme = 'theme'
|
19
|
+
|
20
|
+
class OpenConfig
|
21
|
+
|
22
|
+
def initialize
|
23
|
+
@h = {}
|
24
|
+
end
|
25
|
+
|
26
|
+
def to_h
|
27
|
+
h = {}
|
28
|
+
@h.each do |k,v|
|
29
|
+
if v.is_a? OpenConfig
|
30
|
+
h[ k ] = v.to_h
|
31
|
+
else
|
32
|
+
h[ k ] = v ## just pass along as is
|
33
|
+
end
|
34
|
+
end
|
35
|
+
h
|
36
|
+
end
|
37
|
+
|
38
|
+
def method_missing( m, *args, &block)
|
39
|
+
if m.to_s =~ /^(.*)=$/ ## setter
|
40
|
+
puts "config lookup (setter) >#{m}< #{m.class.name}, #{args.inspect}"
|
41
|
+
key = m[0..-2].to_s ## cut off trailing =
|
42
|
+
@h[ key ] = args[0].to_s # note: assume first arg is value for setter
|
43
|
+
# note: for now all values are strings (always use to_s)
|
44
|
+
else ## assume getter
|
45
|
+
## fix: add check for args?? must be 0 for getters??
|
46
|
+
## use else super to delegate non-getters??
|
47
|
+
puts "config lookup (getter) >#{m}< #{m.class.name}"
|
48
|
+
key = m.to_s
|
49
|
+
value = @h[ key ]
|
50
|
+
if value.nil?
|
51
|
+
puts " config add (nested) hash"
|
52
|
+
value = @h[ key ] = OpenConfig.new
|
53
|
+
end
|
54
|
+
value
|
55
|
+
end
|
56
|
+
end # method_missing
|
57
|
+
|
58
|
+
end # class OpenConfig
|
59
|
+
|
60
|
+
end # module MrHyde
|
data/lib/mrhyde/version.rb
CHANGED
@@ -0,0 +1,88 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
|
4
|
+
## note:
|
5
|
+
## use global $MRHYDE_WIZARD_STDIN
|
6
|
+
## lets you redirect stdin for testing e.g $MRHYDE_WIZARD_STDIN = StringIO.new( 'test/n' )
|
7
|
+
$MRHYDE_WIZARD_IN = $stdin
|
8
|
+
|
9
|
+
|
10
|
+
module MrHyde
|
11
|
+
|
12
|
+
module Wizard ## use a different name e.g. WizardHelpers, FormHelpers, InputHelper, etc - why, why not??
|
13
|
+
|
14
|
+
def getstr ## use getstr to avoid conflict w/ gets (use better name? read_string, readline (already exists too), etc.?)
|
15
|
+
## note: gets will include trailing newline (user hits return to enter data)
|
16
|
+
## - use strip for now (remove leading and traling whitspaces) - might later just use chomp ? (jsut removes newlines)
|
17
|
+
$MRHYDE_WIZARD_IN.gets.strip
|
18
|
+
end
|
19
|
+
|
20
|
+
def say( text )
|
21
|
+
puts text
|
22
|
+
end
|
23
|
+
|
24
|
+
|
25
|
+
YES_REGEX = /y|yes|on|t|true/i ## support YAML true values - double check (YAML does NOT support t/f)
|
26
|
+
NO_REGEX = /n|no|off|f|false/i
|
27
|
+
|
28
|
+
def yes?( question ) ## defaults to yes - why, why not??
|
29
|
+
## todo: strip trailing question mark (?) if present (gets auto-included)
|
30
|
+
print( "Q: #{question} (y/n)? [y]: " )
|
31
|
+
str = getstr
|
32
|
+
if str.empty? || str =~ YES_REGEX
|
33
|
+
true
|
34
|
+
elsif str =~ NO_REGEX
|
35
|
+
false
|
36
|
+
else ## warn: unknown value??
|
37
|
+
true
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
def no?( question ) ## defaults to yes - why, why not??
|
42
|
+
## todo: strip trailing question mark (?) if present (gets auto-included)
|
43
|
+
print( "Q: #{question} (y/n)? [n]: " )
|
44
|
+
str = getstr
|
45
|
+
if str.empty? || str =~ NO_REGEX
|
46
|
+
true
|
47
|
+
elsif str =~ YES_REGEX
|
48
|
+
false
|
49
|
+
else ## warn: unknown value??
|
50
|
+
true
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
|
55
|
+
def ask( question, default=nil )
|
56
|
+
## todo: strip trailing question mark (?) if present (gets auto-included)
|
57
|
+
if default
|
58
|
+
print( "Q: #{question}? [#{default}]: " )
|
59
|
+
else
|
60
|
+
print( "Q: #{question}?: " )
|
61
|
+
end
|
62
|
+
|
63
|
+
str = getstr
|
64
|
+
if default && str.empty? ## todo: best way to check for empty string?
|
65
|
+
str = default
|
66
|
+
end
|
67
|
+
str
|
68
|
+
end
|
69
|
+
|
70
|
+
|
71
|
+
def select( title, options )
|
72
|
+
puts( "Q: #{title}: " )
|
73
|
+
options.each_with_index do |opt,i|
|
74
|
+
puts " #{i+1} - #{opt}"
|
75
|
+
end
|
76
|
+
print( " Your choice (1-#{options.size})? [1]: " )
|
77
|
+
str = getstr
|
78
|
+
if str.empty? ## todo: best way to check for empty string?
|
79
|
+
num = 0 ## default to first option for now
|
80
|
+
else
|
81
|
+
num = str.to_i ## note: defaults to 0 if cannot convert?
|
82
|
+
num -= 1 if num > 0 ## note: "convert" from 1-based to 0-based for ary; if invalid entry; default to 0
|
83
|
+
end
|
84
|
+
options[ num ]
|
85
|
+
end
|
86
|
+
|
87
|
+
end # module Wizard
|
88
|
+
end # module MrHyde
|
data/test/helper.rb
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
## minitest setup
|
4
|
+
|
5
|
+
require 'minitest/autorun'
|
6
|
+
|
7
|
+
|
8
|
+
class EchoIO
|
9
|
+
def initialize( buf )
|
10
|
+
@io = StringIO.new( buf )
|
11
|
+
end
|
12
|
+
|
13
|
+
def gets
|
14
|
+
str = @io.gets
|
15
|
+
puts "|>#{str.chomp}<|" ## remove newline (w/ chomp) in debug/echo output
|
16
|
+
str
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
|
21
|
+
## our own code
|
22
|
+
require 'mrhyde'
|
@@ -0,0 +1,36 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
|
4
|
+
puts "[debug] self.class.name #{self.class.name}"
|
5
|
+
|
6
|
+
name = "check setting local variable name"
|
7
|
+
puts "[debug] #{name}"
|
8
|
+
|
9
|
+
puts "pp self:"
|
10
|
+
pp self
|
11
|
+
|
12
|
+
|
13
|
+
###############################################
|
14
|
+
# Mr. Hyde's Quick Start Static Site Script
|
15
|
+
|
16
|
+
say "Welcome, before setting up your site Mr. Hyde will ask you some questions."
|
17
|
+
|
18
|
+
title = ask "What's your site's title", "Your Site Title"
|
19
|
+
|
20
|
+
name = ask "What's your name", "Henry Jekyll"
|
21
|
+
|
22
|
+
say "Thanks! Ready-to-go. Stand back."
|
23
|
+
|
24
|
+
install_theme "Starter"
|
25
|
+
|
26
|
+
config do |c|
|
27
|
+
c.title = title
|
28
|
+
c.author.name = name
|
29
|
+
|
30
|
+
c.mrhyde.last_updated = Time.now
|
31
|
+
c.mrhyde.title = title
|
32
|
+
c.mrhyde.name = name
|
33
|
+
end
|
34
|
+
|
35
|
+
say "Done."
|
36
|
+
|
@@ -0,0 +1,39 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
|
4
|
+
puts "[debug] self.class.name #{self.class.name}"
|
5
|
+
|
6
|
+
puts "pp self:"
|
7
|
+
pp self
|
8
|
+
|
9
|
+
|
10
|
+
###############################################
|
11
|
+
# Mr. Hyde's Quick Start Static Site Script
|
12
|
+
|
13
|
+
say "Welcome, before setting up your site Mr. Hyde will ask you some questions."
|
14
|
+
|
15
|
+
title = ask "What's your site's title", "Your Site Title"
|
16
|
+
|
17
|
+
url = ask "What's your site's address (url)", "http://yoursite.com"
|
18
|
+
|
19
|
+
name = ask "What's your name", "Henry Jekyll"
|
20
|
+
|
21
|
+
theme = select "Select your theme", ["Starter", "Bootstrap", "Minimal"]
|
22
|
+
|
23
|
+
say "Thanks! Ready-to-go. Stand back."
|
24
|
+
|
25
|
+
install_theme theme
|
26
|
+
|
27
|
+
config do |c|
|
28
|
+
c.title = title
|
29
|
+
c.url = url
|
30
|
+
c.author.name = name
|
31
|
+
|
32
|
+
c.mrhyde.last_updated = Time.now
|
33
|
+
c.mrhyde.title = title
|
34
|
+
c.mrhyde.name = name
|
35
|
+
c.mrhyde.theme = theme
|
36
|
+
c.mrhyde.url = url
|
37
|
+
end
|
38
|
+
|
39
|
+
say "Done."
|
@@ -0,0 +1,40 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
###
|
4
|
+
# to run use
|
5
|
+
# ruby -I ./lib -I ./test test/test_builder.rb
|
6
|
+
|
7
|
+
|
8
|
+
require 'helper'
|
9
|
+
|
10
|
+
|
11
|
+
class TestBuilder < MiniTest::Test
|
12
|
+
|
13
|
+
def test_starter
|
14
|
+
|
15
|
+
$MRHYDE_WIZARD_IN = EchoIO.new( <<EOS )
|
16
|
+
Another Beautiful Static Site
|
17
|
+
H. J.
|
18
|
+
EOS
|
19
|
+
|
20
|
+
_ = MrHyde::Builder.load_file( "#{MrHyde.root}/test/scripts/starter.rb", test: true )
|
21
|
+
|
22
|
+
assert true ## if we get here; everything is ok
|
23
|
+
end
|
24
|
+
|
25
|
+
def test_starterii
|
26
|
+
|
27
|
+
$MRHYDE_WIZARD_IN = EchoIO.new( <<EOS )
|
28
|
+
Another Beautiful Static Site
|
29
|
+
http://example.github.io/repo
|
30
|
+
H. J.
|
31
|
+
1
|
32
|
+
EOS
|
33
|
+
|
34
|
+
_ = MrHyde::Builder.load_file( "#{MrHyde.root}/test/scripts/starterii.rb", test: true )
|
35
|
+
|
36
|
+
assert true ## if we get here; everything is ok
|
37
|
+
end
|
38
|
+
|
39
|
+
|
40
|
+
end # class TestBuilder
|
data/test/test_config.rb
ADDED
@@ -0,0 +1,31 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
###
|
4
|
+
# to run use
|
5
|
+
# ruby -I ./lib -I ./test test/test_config.rb
|
6
|
+
|
7
|
+
|
8
|
+
require 'helper'
|
9
|
+
|
10
|
+
|
11
|
+
class TestConfig < MiniTest::Test
|
12
|
+
|
13
|
+
def test_config
|
14
|
+
|
15
|
+
c = MrHyde::OpenConfig.new
|
16
|
+
c.title = 'title'
|
17
|
+
c.author.name = 'name'
|
18
|
+
|
19
|
+
c.mrhyde.last_updated = Time.now
|
20
|
+
c.mrhyde.title = 'title'
|
21
|
+
c.mrhyde.name = 'name'
|
22
|
+
c.mrhyde.theme = 'theme'
|
23
|
+
c.mrhyde.meta.info = 'test nested nested value'
|
24
|
+
|
25
|
+
pp c.to_h
|
26
|
+
|
27
|
+
assert true ## if we get here; everything is ok
|
28
|
+
end
|
29
|
+
|
30
|
+
|
31
|
+
end # class TestConfig
|
@@ -0,0 +1,25 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
###
|
4
|
+
# to run use
|
5
|
+
# ruby -I ./lib -I ./test test/test_install_theme.rb
|
6
|
+
|
7
|
+
|
8
|
+
require 'helper'
|
9
|
+
|
10
|
+
|
11
|
+
class TestInstallTheme < MiniTest::Test
|
12
|
+
|
13
|
+
def test_starter
|
14
|
+
|
15
|
+
$MRHYDE_WIZARD_IN = EchoIO.new( <<EOS )
|
16
|
+
Another Beautiful Static Site
|
17
|
+
H. J.
|
18
|
+
EOS
|
19
|
+
|
20
|
+
_ = MrHyde::Builder.load_file( "#{MrHyde.root}/test/scripts/starter.rb", o: './o')
|
21
|
+
|
22
|
+
assert true ## if we get here; everything is ok
|
23
|
+
end
|
24
|
+
|
25
|
+
end # class TestInstallTheme
|
data/test/test_url.rb
ADDED
@@ -0,0 +1,40 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
###
|
4
|
+
# to run use
|
5
|
+
# ruby -I ./lib -I ./test test/test_url.rb
|
6
|
+
|
7
|
+
|
8
|
+
require 'helper'
|
9
|
+
|
10
|
+
|
11
|
+
class TestUrl < MiniTest::Test
|
12
|
+
|
13
|
+
def test_clean_path
|
14
|
+
path = '/'
|
15
|
+
path = path.sub( /\/$/, '' )
|
16
|
+
assert_equal '', path
|
17
|
+
|
18
|
+
path = ''
|
19
|
+
path = path.sub( /\/$/, '' )
|
20
|
+
assert_equal '', path
|
21
|
+
|
22
|
+
path = '/test/'
|
23
|
+
path = path.sub( /\/$/, '' )
|
24
|
+
assert_equal '/test', path
|
25
|
+
end
|
26
|
+
|
27
|
+
|
28
|
+
def test_site_url
|
29
|
+
|
30
|
+
str = 'http://example.com'
|
31
|
+
|
32
|
+
url = URI.parse( str )
|
33
|
+
|
34
|
+
pp url
|
35
|
+
|
36
|
+
assert_equal 'example.com', url.host
|
37
|
+
assert_equal '', url.path
|
38
|
+
end
|
39
|
+
|
40
|
+
end # class TestUrl
|
data/test/test_wizard.rb
ADDED
@@ -0,0 +1,50 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
###
|
4
|
+
# to run use
|
5
|
+
# ruby -I ./lib -I ./test test/test_wizard.rb
|
6
|
+
|
7
|
+
|
8
|
+
require 'helper'
|
9
|
+
|
10
|
+
|
11
|
+
class TestWizard < MiniTest::Test
|
12
|
+
|
13
|
+
include MrHyde::Wizard ## lets you use ask etc.
|
14
|
+
|
15
|
+
def test_ask
|
16
|
+
|
17
|
+
$MRHYDE_WIZARD_IN = EchoIO.new( <<EOS )
|
18
|
+
Another Beautiful Static Site
|
19
|
+
|
20
|
+
H. J.
|
21
|
+
|
22
|
+
2
|
23
|
+
n
|
24
|
+
y
|
25
|
+
EOS
|
26
|
+
|
27
|
+
say "Hello, Wizard!"
|
28
|
+
|
29
|
+
title = ask "What's your site's title", "Your Site Title"
|
30
|
+
assert_equal 'Another Beautiful Static Site', title
|
31
|
+
|
32
|
+
title = ask "What's your site's title", "Your Site Title"
|
33
|
+
assert_equal 'Your Site Title', title
|
34
|
+
|
35
|
+
name = ask "Your Name"
|
36
|
+
assert_equal 'H. J.', name
|
37
|
+
|
38
|
+
theme = select "Select your theme", ["Starter", "Bootstrap", "Minimal"]
|
39
|
+
assert_equal 'Starter', theme
|
40
|
+
|
41
|
+
theme = select "Select your theme", ["Starter", "Bootstrap", "Minimal"]
|
42
|
+
assert_equal 'Bootstrap', theme
|
43
|
+
|
44
|
+
assert_equal false, yes?( "Add to GitHub" )
|
45
|
+
assert_equal false, no?( "Add to GitHub" )
|
46
|
+
|
47
|
+
assert true ## if we get here; everything is ok
|
48
|
+
end
|
49
|
+
|
50
|
+
end # class TestWizard
|
metadata
CHANGED
@@ -1,15 +1,43 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: mrhyde-tools
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0
|
4
|
+
version: 0.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Gerald Bauer
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-08-
|
11
|
+
date: 2015-08-16 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: logutils
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ">="
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '0'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ">="
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: textutils
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ">="
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0'
|
13
41
|
- !ruby/object:Gem::Dependency
|
14
42
|
name: drjekyll
|
15
43
|
requirement: !ruby/object:Gem::Requirement
|
@@ -52,22 +80,41 @@ dependencies:
|
|
52
80
|
- - "~>"
|
53
81
|
- !ruby/object:Gem::Version
|
54
82
|
version: '3.13'
|
55
|
-
description: mrhyde - static site quick starter
|
83
|
+
description: mrhyde - jekyll command line tool .:. static site quick starter script
|
84
|
+
wizard
|
56
85
|
email: wwwmake@googlegroups.com
|
57
|
-
executables:
|
86
|
+
executables:
|
87
|
+
- mrh
|
88
|
+
- mrhyde
|
58
89
|
extensions: []
|
59
90
|
extra_rdoc_files:
|
60
91
|
- HISTORY.md
|
61
92
|
- Manifest.txt
|
62
93
|
- README.md
|
63
94
|
files:
|
95
|
+
- ".gemtest"
|
64
96
|
- HISTORY.md
|
65
97
|
- Manifest.txt
|
66
98
|
- README.md
|
67
99
|
- Rakefile
|
100
|
+
- bin/mrh
|
101
|
+
- bin/mrhyde
|
68
102
|
- lib/mrhyde.rb
|
103
|
+
- lib/mrhyde/builder.rb
|
104
|
+
- lib/mrhyde/cli/main.rb
|
105
|
+
- lib/mrhyde/cli/opts.rb
|
106
|
+
- lib/mrhyde/config.rb
|
69
107
|
- lib/mrhyde/tools.rb
|
70
108
|
- lib/mrhyde/version.rb
|
109
|
+
- lib/mrhyde/wizard.rb
|
110
|
+
- test/helper.rb
|
111
|
+
- test/scripts/starter.rb
|
112
|
+
- test/scripts/starterii.rb
|
113
|
+
- test/test_builder.rb
|
114
|
+
- test/test_config.rb
|
115
|
+
- test/test_install_theme.rb
|
116
|
+
- test/test_url.rb
|
117
|
+
- test/test_wizard.rb
|
71
118
|
homepage: https://github.com/mrhydescripts/mrhyde
|
72
119
|
licenses:
|
73
120
|
- Public Domain
|
@@ -93,5 +140,10 @@ rubyforge_project:
|
|
93
140
|
rubygems_version: 2.4.2
|
94
141
|
signing_key:
|
95
142
|
specification_version: 4
|
96
|
-
summary: mrhyde - static site quick starter
|
97
|
-
test_files:
|
143
|
+
summary: mrhyde - jekyll command line tool .:. static site quick starter script wizard
|
144
|
+
test_files:
|
145
|
+
- test/test_wizard.rb
|
146
|
+
- test/test_install_theme.rb
|
147
|
+
- test/test_builder.rb
|
148
|
+
- test/test_config.rb
|
149
|
+
- test/test_url.rb
|