mrhyde-tools 0.0.1 → 0.1.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/.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
|