drjekyll 0.0.1
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 +7 -0
- data/.gemtest +0 -0
- data/HISTORY.md +3 -0
- data/Manifest.txt +15 -0
- data/README.md +2 -0
- data/Rakefile +31 -0
- data/bin/drj +7 -0
- data/bin/drjekyll +7 -0
- data/lib/drjekyll.rb +53 -0
- data/lib/drjekyll/catalog.rb +99 -0
- data/lib/drjekyll/cli/download.rb +33 -0
- data/lib/drjekyll/cli/list.rb +24 -0
- data/lib/drjekyll/cli/main.rb +177 -0
- data/lib/drjekyll/cli/opts.rb +33 -0
- data/lib/drjekyll/cli/unzip.rb +33 -0
- data/lib/drjekyll/version.rb +23 -0
- data/test/data/themes.yml +877 -0
- metadata +108 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 1abacc0051e57841738784b05c84d1adb06051ad
|
4
|
+
data.tar.gz: d756a8cd82ef92f2310f8dd40445583c8abf3c7c
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 0c127f82e87a8eaf5e5dc2be3440c11863d61c0282917e5fd03925531cb7e8281407a7273ad2feb6f4d51bb620a45dea1b759a170993fd8ae528457af5cf805b
|
7
|
+
data.tar.gz: 09f07a808b355bbcb8cb06ea2a5c466af3d22ab84829dfe813128ae5fa4212cc5053827c9862848bcd49c228504632ecdec6bfca9e703bec839dcbb8993ad52a
|
data/.gemtest
ADDED
File without changes
|
data/HISTORY.md
ADDED
data/Manifest.txt
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
HISTORY.md
|
2
|
+
Manifest.txt
|
3
|
+
README.md
|
4
|
+
Rakefile
|
5
|
+
bin/drj
|
6
|
+
bin/drjekyll
|
7
|
+
lib/drjekyll.rb
|
8
|
+
lib/drjekyll/catalog.rb
|
9
|
+
lib/drjekyll/cli/download.rb
|
10
|
+
lib/drjekyll/cli/list.rb
|
11
|
+
lib/drjekyll/cli/main.rb
|
12
|
+
lib/drjekyll/cli/opts.rb
|
13
|
+
lib/drjekyll/cli/unzip.rb
|
14
|
+
lib/drjekyll/version.rb
|
15
|
+
test/data/themes.yml
|
data/README.md
ADDED
data/Rakefile
ADDED
@@ -0,0 +1,31 @@
|
|
1
|
+
require 'hoe'
|
2
|
+
require './lib/drjekyll/version.rb'
|
3
|
+
|
4
|
+
Hoe.spec 'drjekyll' do
|
5
|
+
|
6
|
+
self.version = DrJekyll::VERSION
|
7
|
+
|
8
|
+
self.summary = "drjekyll - the missing static site theme package manager"
|
9
|
+
self.description = summary
|
10
|
+
|
11
|
+
self.urls = ['https://github.com/drjekyllthemes/drjekyll']
|
12
|
+
|
13
|
+
self.author = 'Gerald Bauer'
|
14
|
+
self.email = 'wwwmake@googlegroups.com'
|
15
|
+
|
16
|
+
# switch extension to .markdown for gihub formatting
|
17
|
+
self.readme_file = 'README.md'
|
18
|
+
self.history_file = 'HISTORY.md'
|
19
|
+
|
20
|
+
self.extra_deps = [
|
21
|
+
## 3rd party
|
22
|
+
['fetcher', '>= 0.4.5'],
|
23
|
+
]
|
24
|
+
|
25
|
+
self.licenses = ['Public Domain']
|
26
|
+
|
27
|
+
self.spec_extras = {
|
28
|
+
required_ruby_version: '>= 1.9.2'
|
29
|
+
}
|
30
|
+
|
31
|
+
end
|
data/bin/drj
ADDED
data/bin/drjekyll
ADDED
data/lib/drjekyll.rb
ADDED
@@ -0,0 +1,53 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
##
|
4
|
+
# use to test:
|
5
|
+
# $ ruby -I ./lib ./lib/drjekyll.rb
|
6
|
+
|
7
|
+
|
8
|
+
## stdlibs
|
9
|
+
require 'pp'
|
10
|
+
require 'yaml'
|
11
|
+
|
12
|
+
|
13
|
+
## 3rd party gems
|
14
|
+
require 'props' ## Use Env.home
|
15
|
+
require 'logutils'
|
16
|
+
|
17
|
+
|
18
|
+
## require 'fetcher'
|
19
|
+
|
20
|
+
## more 3rd party gems
|
21
|
+
require 'gli'
|
22
|
+
|
23
|
+
|
24
|
+
|
25
|
+
# our own code
|
26
|
+
|
27
|
+
require 'drjekyll/version' # note: version always goes first
|
28
|
+
require 'drjekyll/catalog'
|
29
|
+
|
30
|
+
require 'drjekyll/cli/opts'
|
31
|
+
require 'drjekyll/cli/main'
|
32
|
+
require 'drjekyll/cli/list'
|
33
|
+
require 'drjekyll/cli/download'
|
34
|
+
require 'drjekyll/cli/unzip'
|
35
|
+
|
36
|
+
|
37
|
+
|
38
|
+
module DrJekyll
|
39
|
+
|
40
|
+
def self.main
|
41
|
+
exit Tool.new.run( ARGV )
|
42
|
+
end
|
43
|
+
|
44
|
+
end # module DrJekyll
|
45
|
+
|
46
|
+
|
47
|
+
## DrJekyll.banner ## say hello
|
48
|
+
|
49
|
+
## for debugging
|
50
|
+
pp Env.home
|
51
|
+
pp DrJekyll.root
|
52
|
+
|
53
|
+
DrJekyll.main if __FILE__ == $0
|
@@ -0,0 +1,99 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
module DrJekyll
|
4
|
+
|
5
|
+
class Catalog
|
6
|
+
|
7
|
+
def initialize( path )
|
8
|
+
## read in themes catalog
|
9
|
+
text = File.read( path )
|
10
|
+
@themes = YAML.load( text )
|
11
|
+
|
12
|
+
## auto-add keys for now (for quick testing)
|
13
|
+
@themes.each do |k,h|
|
14
|
+
name = k
|
15
|
+
keys = h['keys'] || []
|
16
|
+
if keys.empty?
|
17
|
+
## auto-add key from title/name
|
18
|
+
## downcase and remove all non alphanumeric (non-ascii)
|
19
|
+
slug = name.downcase.gsub( /[^a-z0-9]/, '' )
|
20
|
+
|
21
|
+
## for quick testing add some shortcuts
|
22
|
+
if slug == 'planetjekyllsstarterminimal'
|
23
|
+
keys << 'starter'
|
24
|
+
elsif slug == 'drjekyllsminimal'
|
25
|
+
keys << 'minimial'
|
26
|
+
elsif slug == 'drjekyllsbootstrap'
|
27
|
+
keys << 'bootstrap'
|
28
|
+
elsif slug == 'drjekyllsclassicsbook'
|
29
|
+
keys << 'classics'
|
30
|
+
else
|
31
|
+
end
|
32
|
+
keys << slug
|
33
|
+
h['keys'] = keys
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
def list( filter=nil )
|
39
|
+
## pp filter
|
40
|
+
|
41
|
+
@themes.each_with_index do |(k,h),i|
|
42
|
+
name = k
|
43
|
+
author = h['author']
|
44
|
+
tags = h['tags'] || [] ## allow nil for tags array for now
|
45
|
+
keys = h['keys']
|
46
|
+
|
47
|
+
line = ''
|
48
|
+
line << " %3d" % (i+1)
|
49
|
+
line << "..#{name}"
|
50
|
+
line << " (#{keys.join(' | ')})"
|
51
|
+
line << " by #{author}"
|
52
|
+
if tags.nil? == false && tags.empty? == false
|
53
|
+
line << " - "
|
54
|
+
tags.each do |tag|
|
55
|
+
line << "##{tag} "
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
if filter
|
60
|
+
## note: ignore case (upper/lower/downcase) for now
|
61
|
+
## filter on name/title and
|
62
|
+
## tags for now
|
63
|
+
if name.downcase.index(filter.downcase) != nil || ## note: 0 is match found on index 0; only nil is not found
|
64
|
+
tags.join('|').downcase.index( filter.downcase ) != nil
|
65
|
+
puts line
|
66
|
+
end
|
67
|
+
else
|
68
|
+
puts line
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end # method filter
|
72
|
+
|
73
|
+
def get( key ) ## use fetch or different name - why? why not??
|
74
|
+
## find theme by key
|
75
|
+
## fix/todo: use linear search for now; use hash lookup later
|
76
|
+
|
77
|
+
theme = nil ## note: return nil if nothing found
|
78
|
+
|
79
|
+
@themes.each do |k,h|
|
80
|
+
name = k
|
81
|
+
keys = h['keys']
|
82
|
+
|
83
|
+
if keys.include?( key )
|
84
|
+
## bingo found
|
85
|
+
## todo: merge k (name/title) into (returned) hash - why? why not??
|
86
|
+
puts " ** bingo; found theme >#{k}<:"
|
87
|
+
pp h
|
88
|
+
theme = h
|
89
|
+
break
|
90
|
+
end
|
91
|
+
end
|
92
|
+
|
93
|
+
theme
|
94
|
+
end
|
95
|
+
|
96
|
+
end # class Catalog
|
97
|
+
|
98
|
+
end # module DrJekyll
|
99
|
+
|
@@ -0,0 +1,33 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
|
4
|
+
module DrJekyll
|
5
|
+
|
6
|
+
class DownloadCommand ## find a better name - why, why not ??
|
7
|
+
|
8
|
+
def initialize( catalog, opts )
|
9
|
+
@catalog = catalog
|
10
|
+
@opts = opts
|
11
|
+
end
|
12
|
+
|
13
|
+
def run( args )
|
14
|
+
## note: required template name (defaults to starter for now)
|
15
|
+
key = args[0] || 'starter'
|
16
|
+
|
17
|
+
theme = @catalog.get( key )
|
18
|
+
|
19
|
+
if theme
|
20
|
+
download( theme )
|
21
|
+
else
|
22
|
+
## todo: issue warning - why, why not??
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
def download( theme )
|
27
|
+
## to be done
|
28
|
+
pp theme
|
29
|
+
end
|
30
|
+
|
31
|
+
end ## class DownloadCommand
|
32
|
+
|
33
|
+
end # module DrJekyll
|
@@ -0,0 +1,24 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
|
4
|
+
module DrJekyll
|
5
|
+
|
6
|
+
class ListCommand ## find a better name ??
|
7
|
+
|
8
|
+
def initialize( catalog, opts )
|
9
|
+
@catalog = catalog
|
10
|
+
@opts = opts
|
11
|
+
end
|
12
|
+
|
13
|
+
def run( args )
|
14
|
+
filter = args[0] ## optional filter (search query)
|
15
|
+
list( filter )
|
16
|
+
end
|
17
|
+
|
18
|
+
def list( filter=nil )
|
19
|
+
@catalog.list( filter )
|
20
|
+
end
|
21
|
+
|
22
|
+
end ## class ListCommand
|
23
|
+
|
24
|
+
end # module DrJekyll
|
@@ -0,0 +1,177 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
### NOTE: wrap gli config into a class
|
4
|
+
## see github.com/davetron5000/gli/issues/153
|
5
|
+
|
6
|
+
module DrJekyll
|
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 DrJekyll.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 'drjekyll command line tool'
|
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 'Only show warnings, errors and fatal messages'
|
47
|
+
switch [:q, :quiet], negatable: false
|
48
|
+
|
49
|
+
|
50
|
+
|
51
|
+
desc "List themes"
|
52
|
+
arg_name 'QUERY' # optional search query/filter
|
53
|
+
command [:list,:ls,:l] do |c|
|
54
|
+
|
55
|
+
c.action do |g,o,args|
|
56
|
+
## read in themes diretory
|
57
|
+
themes_dir = "#{DrJekyll.root}/test/data"
|
58
|
+
catalog = Catalog.new( "#{themes_dir}/themes.yml" )
|
59
|
+
|
60
|
+
cmd = ListCommand.new( catalog, opts )
|
61
|
+
cmd.run( args )
|
62
|
+
puts 'Done.'
|
63
|
+
end # action
|
64
|
+
end # command list
|
65
|
+
|
66
|
+
|
67
|
+
## use get or fetch - why, why not??
|
68
|
+
desc "Download theme; saved in ~/.drjekyll/cache"
|
69
|
+
arg_name 'NAME' # required theme name
|
70
|
+
command [:download,:dl,:d,:get,:g] do |c|
|
71
|
+
|
72
|
+
c.action do |g,o,args|
|
73
|
+
## read in themes diretory
|
74
|
+
themes_dir = "#{DrJekyll.root}/test/data"
|
75
|
+
catalog = Catalog.new( "#{themes_dir}/themes.yml" )
|
76
|
+
|
77
|
+
cmd = DownloadCommand.new( catalog, opts )
|
78
|
+
cmd.run( args )
|
79
|
+
puts 'Done.'
|
80
|
+
end # action
|
81
|
+
end # command download
|
82
|
+
|
83
|
+
|
84
|
+
## use install or unzip/unpack - why, why not??
|
85
|
+
desc "Setup (unzip/unpack) theme; use archive in ~/.drjekyll/cache"
|
86
|
+
arg_name 'NAME' # required theme name
|
87
|
+
command [:unpack,:pk,:p,:setup,:s] do |c|
|
88
|
+
|
89
|
+
c.action do |g,o,args|
|
90
|
+
## read in themes diretory
|
91
|
+
themes_dir = "#{DrJekyll.root}/test/data"
|
92
|
+
catalog = Catalog.new( "#{themes_dir}/themes.yml" )
|
93
|
+
|
94
|
+
cmd = UnzipCommand.new( catalog, opts )
|
95
|
+
cmd.run( args )
|
96
|
+
puts 'Done.'
|
97
|
+
end # action
|
98
|
+
end # command setup
|
99
|
+
|
100
|
+
|
101
|
+
desc "Download 'n' setup (unzip/unpack) theme"
|
102
|
+
arg_name 'NAME' # required theme name
|
103
|
+
command [:new,:n] do |c|
|
104
|
+
|
105
|
+
c.action do |g,o,args|
|
106
|
+
|
107
|
+
## todo: required template name (defaults to starter for now)
|
108
|
+
name = args[0] || 'starter'
|
109
|
+
|
110
|
+
puts " download theme here"
|
111
|
+
puts " unzip/unpack (setup) here"
|
112
|
+
puts 'Done.'
|
113
|
+
end # action
|
114
|
+
end # command setup
|
115
|
+
|
116
|
+
|
117
|
+
|
118
|
+
|
119
|
+
desc '(Debug) Test command suite'
|
120
|
+
command :test do |c|
|
121
|
+
c.action do |g,o,args|
|
122
|
+
|
123
|
+
puts "hello from test command"
|
124
|
+
puts "args (#{args.class.name}):"
|
125
|
+
pp args
|
126
|
+
puts "o (#{o.class.name}):"
|
127
|
+
pp o
|
128
|
+
puts "g (#{g.class.name}):"
|
129
|
+
pp g
|
130
|
+
|
131
|
+
LogUtils::Logger.root.debug 'test debug msg'
|
132
|
+
LogUtils::Logger.root.info 'test info msg'
|
133
|
+
LogUtils::Logger.root.warn 'test warn msg'
|
134
|
+
|
135
|
+
puts 'Done.'
|
136
|
+
end
|
137
|
+
end
|
138
|
+
|
139
|
+
|
140
|
+
|
141
|
+
pre do |g,c,o,args|
|
142
|
+
opts.merge_gli_options!( g )
|
143
|
+
opts.merge_gli_options!( o )
|
144
|
+
|
145
|
+
puts DrJekyll.banner
|
146
|
+
|
147
|
+
if opts.verbose?
|
148
|
+
LogUtils::Logger.root.level = :debug
|
149
|
+
end
|
150
|
+
|
151
|
+
logger.debug "Executing #{c.name}"
|
152
|
+
true
|
153
|
+
end
|
154
|
+
|
155
|
+
post do |global,c,o,args|
|
156
|
+
logger.debug "Executed #{c.name}"
|
157
|
+
true
|
158
|
+
end
|
159
|
+
|
160
|
+
|
161
|
+
on_error do |e|
|
162
|
+
puts
|
163
|
+
puts "*** error: #{e.message}"
|
164
|
+
|
165
|
+
if opts.verbose?
|
166
|
+
puts e.backtrace
|
167
|
+
end
|
168
|
+
|
169
|
+
false # skip default error handling
|
170
|
+
end
|
171
|
+
|
172
|
+
|
173
|
+
### exit run(ARGV) ## note: use Toolii.run( ARGV ) outside of class
|
174
|
+
|
175
|
+
end # class Toolii
|
176
|
+
|
177
|
+
end # module DrJekyll
|