runeblog 0.0.65 → 0.0.66
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/data/VERSION +1 -1
- data/lib/repl.rb +35 -9
- data/lib/runeblog.rb +146 -34
- data/test/repl.rb +9 -7
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: adf4312a5e7a32552ee91aa3915429723f9ffbd6
|
4
|
+
data.tar.gz: 157c726b6db5384507a8813df016f25f729d4574
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 3eaf87eec7fd56c1efc5fd586f0fd154667c353b63890e9807500bd992cd138c9a55b3d1d5ae8b5659fc2de018a48adf0cbaef3371476881afbb4fbfe6f7c453
|
7
|
+
data.tar.gz: 58d33fe4ad47f8b0aaaa3e657b8a6a01755b6612dd8c65679cddf6cf61e58650d59ff0d2bb1a2ec321858fb0d12347d117632a2a5fb4b2d985dd11d3438685df
|
data/data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
RuneBlog v 0.0.
|
1
|
+
RuneBlog v 0.0.66 2018-09-28
|
data/lib/repl.rb
CHANGED
@@ -34,7 +34,7 @@ module RuneBlog::REPL
|
|
34
34
|
def cmd_preview(arg)
|
35
35
|
reset_output
|
36
36
|
check_empty(arg)
|
37
|
-
local = @blog.
|
37
|
+
local = @blog.view.index
|
38
38
|
result = system("open #{local}")
|
39
39
|
raise CantOpen, local unless result
|
40
40
|
rescue => err
|
@@ -42,6 +42,36 @@ module RuneBlog::REPL
|
|
42
42
|
end
|
43
43
|
|
44
44
|
def cmd_deploy(arg) # FIXME non-string return expected in caller?
|
45
|
+
reset_output
|
46
|
+
check_empty(arg)
|
47
|
+
@blog.view.deploy
|
48
|
+
user, server, sroot, spath = *@deploy[@blog.view]
|
49
|
+
if files.empty? # FIXME baloney
|
50
|
+
output! "No files to deploy"
|
51
|
+
return @out
|
52
|
+
end
|
53
|
+
|
54
|
+
output "Files:"
|
55
|
+
files.each {|f| output " #{f}\n" }
|
56
|
+
output_newline
|
57
|
+
dir = "#{sroot}/#{spath}"
|
58
|
+
# FIXME - may or may not already exist
|
59
|
+
result = system("ssh root@#{server} mkdir #{dir}")
|
60
|
+
# ^ needs -c??
|
61
|
+
|
62
|
+
cmd = "scp -r #{files.join(' ')} root@#{server}:#{dir} >/dev/null 2>&1"
|
63
|
+
output! "Deploying #{files.size} files...\n"
|
64
|
+
result = system(cmd)
|
65
|
+
raise "Problem occurred in deployment" unless result
|
66
|
+
|
67
|
+
File.write("#{vdir}/last_deployed", files)
|
68
|
+
output! "...finished.\n"
|
69
|
+
@out
|
70
|
+
rescue => err
|
71
|
+
error(err)
|
72
|
+
end
|
73
|
+
|
74
|
+
def old_cmd_deploy(arg) # FIXME non-string return expected in caller?
|
45
75
|
# TBD clunky FIXME
|
46
76
|
reset_output
|
47
77
|
check_empty(arg)
|
@@ -110,19 +140,15 @@ module RuneBlog::REPL
|
|
110
140
|
output "#{@blog.view}"
|
111
141
|
return @out
|
112
142
|
else
|
113
|
-
|
114
|
-
|
115
|
-
@blog.view
|
116
|
-
output! "View: #{@blog.view}\n" if arg != @blog.view
|
117
|
-
else
|
118
|
-
output! "view #{arg.inspect} does not exist\n"
|
143
|
+
if @blog.view?(arg)
|
144
|
+
@blog.view = arg
|
145
|
+
output! "View: #{@blog.view}\n"
|
119
146
|
end
|
120
147
|
end
|
121
148
|
@out
|
122
149
|
rescue => err
|
123
150
|
error(err)
|
124
151
|
end
|
125
|
-
|
126
152
|
def cmd_new_view(arg)
|
127
153
|
reset_output
|
128
154
|
@blog.create_view(arg)
|
@@ -219,7 +245,7 @@ module RuneBlog::REPL
|
|
219
245
|
check_empty(arg)
|
220
246
|
reset_output
|
221
247
|
posts = @blog.posts # current view
|
222
|
-
output @blog.view + ":\n"
|
248
|
+
output @blog.view.name + ":\n"
|
223
249
|
if posts.empty?
|
224
250
|
output! "No posts\n"
|
225
251
|
else
|
data/lib/runeblog.rb
CHANGED
@@ -20,7 +20,11 @@ def error(err) # FIXME - this is duplicated
|
|
20
20
|
end
|
21
21
|
|
22
22
|
class RuneBlog
|
23
|
-
VERSION = "0.0.
|
23
|
+
VERSION = "0.0.66"
|
24
|
+
|
25
|
+
class << self
|
26
|
+
attr_accessor :blog
|
27
|
+
end
|
24
28
|
|
25
29
|
Path = File.expand_path(File.join(File.dirname(__FILE__)))
|
26
30
|
DefaultData = Path + "/../data/views/_default"
|
@@ -34,7 +38,7 @@ class RuneBlog
|
|
34
38
|
PostTemplate = File.read(PostTemplatePath) rescue "not found"
|
35
39
|
|
36
40
|
attr_reader :root, :views, :sequence
|
37
|
-
attr_accessor :view #
|
41
|
+
attr_accessor :view # overridden
|
38
42
|
|
39
43
|
def self.create_new_blog
|
40
44
|
#-- what if data already exists?
|
@@ -48,22 +52,51 @@ class RuneBlog
|
|
48
52
|
File.open("data/VERSION", "a") {|f| f.puts "\nBlog created: " + Time.now.to_s }
|
49
53
|
end
|
50
54
|
|
55
|
+
def get_config(file)
|
56
|
+
lines = File.readlines(file).map(&:chomp)
|
57
|
+
root, view_name = *lines
|
58
|
+
end
|
59
|
+
|
51
60
|
def initialize(cfg_file = ".blog") # assumes existing blog
|
52
|
-
# What views are there? Deployment, etc.
|
53
|
-
#
|
61
|
+
# Crude - FIXME later - What views are there? Deployment, etc.
|
62
|
+
self.class.blog = self # Weird. Like a singleton - dumbass circular dependency?
|
63
|
+
@root, view_name = get_config(cfg_file)
|
64
|
+
@views = subdirs("#@root/views/").sort.map {|name| RuneBlog::View.new(name) }
|
65
|
+
@view = str2view(view_name)
|
66
|
+
@sequence = get_sequence
|
67
|
+
end
|
54
68
|
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
@
|
61
|
-
|
69
|
+
def view?(name)
|
70
|
+
views.any? {|x| x.name == name }
|
71
|
+
end
|
72
|
+
|
73
|
+
def view
|
74
|
+
@view
|
75
|
+
end
|
76
|
+
|
77
|
+
def str2view(str)
|
78
|
+
@views.find {|x| x.name == str }
|
79
|
+
end
|
80
|
+
|
81
|
+
def view=(arg)
|
82
|
+
case arg
|
83
|
+
when RuneBlog::View
|
84
|
+
@view = arg
|
85
|
+
when String
|
86
|
+
new_view = str2view(arg)
|
87
|
+
raise "Can't find view #{arg}" if new_view.nil?
|
88
|
+
@view = new_view
|
89
|
+
else
|
90
|
+
raise "#{arg.inspect} was not a View or a String"
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
94
|
+
def get_sequence
|
95
|
+
File.read(root + "/sequence").to_i
|
62
96
|
end
|
63
97
|
|
64
98
|
def next_sequence
|
65
|
-
@sequence += 1
|
66
|
-
File.open("#@root/sequence", "w") {|f| f.puts @sequence }
|
99
|
+
File.write("#@root/sequence", @sequence += 1)
|
67
100
|
@sequence
|
68
101
|
end
|
69
102
|
|
@@ -76,7 +109,8 @@ class RuneBlog
|
|
76
109
|
end
|
77
110
|
|
78
111
|
def create_view(arg)
|
79
|
-
|
112
|
+
names = self.views.map(&:to_s)
|
113
|
+
raise "view #{arg} already exists" if names.include?(arg)
|
80
114
|
|
81
115
|
dir = @root + "/views/" + arg + "/"
|
82
116
|
create_dir(dir + 'custom')
|
@@ -87,13 +121,13 @@ class RuneBlog
|
|
87
121
|
File.write(dir + "custom/blog_trailer.html", RuneBlog::BlogTrailer)
|
88
122
|
File.write(dir + "custom/post_template.html", RuneBlog::PostTemplate)
|
89
123
|
File.write(dir + "last_deployed", "Initial creation")
|
90
|
-
|
124
|
+
@views << RuneBlog::View.new(arg)
|
91
125
|
end
|
92
126
|
|
93
127
|
def delete_view(name, force = false)
|
94
128
|
if force
|
95
129
|
system("rm -rf #@root/views/#{name}")
|
96
|
-
@views -= [name]
|
130
|
+
@views -= [str2view(name)]
|
97
131
|
end
|
98
132
|
end
|
99
133
|
|
@@ -109,6 +143,7 @@ class RuneBlog
|
|
109
143
|
# meh
|
110
144
|
files = ["#{vdir}/index.html"]
|
111
145
|
files += Dir.entries(vdir).grep(/^\d\d\d\d/).map {|x| "#{vdir}/#{x}" }
|
146
|
+
# Huh?
|
112
147
|
files.reject! {|f| File.mtime(f) < File.mtime("#{vdir}/last_deployed") }
|
113
148
|
end
|
114
149
|
|
@@ -120,7 +155,7 @@ class RuneBlog
|
|
120
155
|
end
|
121
156
|
|
122
157
|
def create_new_post(title, testing = false)
|
123
|
-
post = RuneBlog::Post.new(title, @view)
|
158
|
+
post = RuneBlog::Post.new(title, @view.to_s)
|
124
159
|
post.edit unless testing
|
125
160
|
post.publish
|
126
161
|
post.num
|
@@ -137,8 +172,9 @@ class RuneBlog
|
|
137
172
|
end
|
138
173
|
|
139
174
|
def posts
|
140
|
-
dir = self.
|
175
|
+
dir = self.view.dir
|
141
176
|
posts = Dir.entries(dir).grep(/^0.*/)
|
177
|
+
posts
|
142
178
|
end
|
143
179
|
|
144
180
|
def drafts
|
@@ -147,7 +183,7 @@ class RuneBlog
|
|
147
183
|
end
|
148
184
|
|
149
185
|
def change_view(view)
|
150
|
-
|
186
|
+
self.view = view # error checking?
|
151
187
|
end
|
152
188
|
|
153
189
|
def process_post(file)
|
@@ -202,7 +238,7 @@ class RuneBlog
|
|
202
238
|
posts.map! {|post| YAML.load(File.read("#{vdir}/#{post}/metadata.yaml")) }
|
203
239
|
File.open("#{vdir}/index.html", "w") do |f|
|
204
240
|
f.puts @bloghead
|
205
|
-
posts.each {|post| f.puts
|
241
|
+
posts.each {|post| f.puts index_entry(view, post) }
|
206
242
|
f.puts @blogtail
|
207
243
|
end
|
208
244
|
rescue => err
|
@@ -213,7 +249,7 @@ class RuneBlog
|
|
213
249
|
self.views.each {|view| generate_index(view) }
|
214
250
|
end
|
215
251
|
|
216
|
-
def
|
252
|
+
def index_entry(view, meta)
|
217
253
|
# FIXME clean up and generalize
|
218
254
|
ref = "#{view}/#{meta.slug}/index.html"
|
219
255
|
<<-HTML
|
@@ -226,8 +262,6 @@ class RuneBlog
|
|
226
262
|
<br><br>
|
227
263
|
<hr>
|
228
264
|
HTML
|
229
|
-
text = File.read(self.viewdir(view) + "custom/post_template.html")
|
230
|
-
interpolate(text)
|
231
265
|
end
|
232
266
|
|
233
267
|
def rebuild_post(file)
|
@@ -273,12 +307,90 @@ end
|
|
273
307
|
|
274
308
|
#######
|
275
309
|
|
276
|
-
class RuneBlog::
|
310
|
+
class RuneBlog::Deployment
|
311
|
+
attr_reader :user, :server, :root, :path
|
277
312
|
|
278
|
-
|
279
|
-
|
313
|
+
def initialize(user, server, root, path, protocol = "http")
|
314
|
+
@blog = RuneBlog.blog
|
315
|
+
@user, @server, @root, @path =
|
316
|
+
user, server, root, path
|
317
|
+
end
|
318
|
+
|
319
|
+
def url
|
320
|
+
url = "#{protocol}://#{@server}/#{@path}"
|
321
|
+
end
|
322
|
+
|
323
|
+
def deploy(files)
|
324
|
+
reset_output
|
325
|
+
dir = "#@root/#@path"
|
326
|
+
result = system("ssh -c #@user@#@server mkdir #{dir}")
|
327
|
+
list = files.join(' ')
|
328
|
+
cmd = "scp -r #{list} root@#{server}:#{dir} >/dev/null 2>&1"
|
329
|
+
output! "Deploying #{files.size} files...\n"
|
330
|
+
result = system(cmd)
|
331
|
+
raise "Problem occurred in deployment" unless result
|
332
|
+
|
333
|
+
File.write("#{@blog.view.dir}/last_deployed", files)
|
334
|
+
output! "...finished.\n"
|
335
|
+
@out
|
336
|
+
end
|
337
|
+
end
|
338
|
+
|
339
|
+
#######
|
340
|
+
|
341
|
+
class RuneBlog::View
|
342
|
+
attr_reader :name, :state
|
343
|
+
attr_accessor :deploy
|
344
|
+
|
345
|
+
def initialize(name)
|
346
|
+
raise "RuneBlog.blog is not set!" if RuneBlog.blog.nil?
|
347
|
+
@blog = RuneBlog.blog
|
348
|
+
@name = name
|
349
|
+
# How read deployment info??
|
350
|
+
end
|
351
|
+
|
352
|
+
def dir
|
353
|
+
@blog.root + "/views/#@name/"
|
354
|
+
end
|
355
|
+
|
356
|
+
def index
|
357
|
+
dir + "index.html"
|
358
|
+
end
|
359
|
+
|
360
|
+
def to_s
|
361
|
+
@name
|
362
|
+
end
|
363
|
+
|
364
|
+
def files(recent = false)
|
365
|
+
vdir = dir()
|
366
|
+
files = [index()]
|
367
|
+
others = Dir.entries(vdir).grep(/^\d\d\d\d/)
|
368
|
+
files += others.map {|x| "#{vdir}/#{x}" }
|
369
|
+
files.reject! {|f| recent?(f) } if recent
|
370
|
+
files
|
280
371
|
end
|
281
372
|
|
373
|
+
def deploy
|
374
|
+
# ?? @blog.view.deployment.deploy
|
375
|
+
# output "Files:"
|
376
|
+
# files.each {|f| output " #{f}\n" }
|
377
|
+
output_newline
|
378
|
+
list = files(true)
|
379
|
+
@deployer.deploy(list)
|
380
|
+
rescue => err
|
381
|
+
error(err)
|
382
|
+
end
|
383
|
+
|
384
|
+
def recent?(file)
|
385
|
+
File.mtime(file) < File.mtime("#{dir()}/last_deployed")
|
386
|
+
end
|
387
|
+
end
|
388
|
+
|
389
|
+
#######
|
390
|
+
|
391
|
+
|
392
|
+
class RuneBlog::Post
|
393
|
+
|
282
394
|
attr_reader :id, :title, :date, :views, :num, :slug
|
283
395
|
|
284
396
|
def self.files(num, root)
|
@@ -287,20 +399,19 @@ class RuneBlog::Post
|
|
287
399
|
result
|
288
400
|
end
|
289
401
|
|
290
|
-
def initialize(title,
|
291
|
-
raise "
|
292
|
-
@blog = RuneBlog
|
402
|
+
def initialize(title, view_name)
|
403
|
+
raise "RuneBlog.blog is not set!" if RuneBlog.blog.nil?
|
404
|
+
@blog = RuneBlog.blog
|
293
405
|
@title = title
|
294
|
-
@view =
|
406
|
+
@view = @blog.str2view(view_name)
|
295
407
|
@num, @slug = make_slug
|
296
|
-
##
|
297
408
|
date = Time.now.strftime("%Y-%m-%d")
|
298
409
|
template = <<-EOS.gsub(/^ */, "")
|
299
410
|
.mixin liveblog
|
300
411
|
|
301
412
|
.title #{title}
|
302
413
|
.pubdate #{date}
|
303
|
-
.views
|
414
|
+
.views #@view
|
304
415
|
|
305
416
|
.teaser
|
306
417
|
Teaser goes here.
|
@@ -325,8 +436,9 @@ class RuneBlog::Post
|
|
325
436
|
@meta = livetext.process_file(@draft, binding)
|
326
437
|
raise "process_file returned nil" if @meta.nil?
|
327
438
|
|
328
|
-
@meta.views.each do |
|
329
|
-
|
439
|
+
@meta.views.each do |view_name| # Create dir using slug (index.html, metadata?)
|
440
|
+
view = @blog.str2view(view_name)
|
441
|
+
vdir = view.dir
|
330
442
|
dir = vdir + @slug + "/"
|
331
443
|
Dir.mkdir(dir)
|
332
444
|
Dir.chdir(dir) do
|
data/test/repl.rb
CHANGED
@@ -9,7 +9,6 @@ class TestREPL < Minitest::Test
|
|
9
9
|
|
10
10
|
def setup
|
11
11
|
@blog = RuneBlog.new
|
12
|
-
RuneBlog::Post.blog = @blog
|
13
12
|
end
|
14
13
|
|
15
14
|
def test_001_cmd_help
|
@@ -101,28 +100,31 @@ class TestREPL < Minitest::Test
|
|
101
100
|
end
|
102
101
|
|
103
102
|
def test_008_current_view
|
104
|
-
assert @blog.view == "view1", "Current view seems wrong (#{@blog.view}, not view1)"
|
103
|
+
assert @blog.view.to_s == "view1", "Current view seems wrong (#{@blog.view}, not view1)"
|
105
104
|
end
|
106
105
|
|
107
106
|
def test_009_change_view
|
108
107
|
assert @blog.change_view("view2")
|
109
|
-
assert @blog.view == "view2", "Current view seems wrong (#{@blog.view}, not view2)"
|
108
|
+
assert @blog.view.to_s == "view2", "Current view seems wrong (#{@blog.view}, not view2)"
|
110
109
|
end
|
111
110
|
|
112
111
|
def test_010_accessors
|
113
|
-
|
112
|
+
sorted_views = @blog.views.map(&:to_s).sort
|
113
|
+
assert sorted_views == ["view1", "view2"], "Got: #{sorted_views.inspect}"
|
114
114
|
end
|
115
115
|
|
116
116
|
def test_011_create_delete_view
|
117
117
|
@blog.create_view("anotherview")
|
118
|
-
|
118
|
+
sorted_views = @blog.views.map(&:to_s).sort
|
119
|
+
assert sorted_views == ["anotherview", "view1", "view2"], "After create: #{sorted_views.inspect}"
|
119
120
|
@blog.delete_view("anotherview", true)
|
120
|
-
|
121
|
+
sorted_views = @blog.views.map(&:to_s).sort
|
122
|
+
assert sorted_views == ["view1", "view2"], "After delete: #{sorted_views.inspect}"
|
121
123
|
end
|
122
124
|
|
123
125
|
def test_012_create_remove_post # FIXME - several problems here
|
124
126
|
@blog.change_view("view2")
|
125
|
-
assert @blog.view == "view2"
|
127
|
+
assert @blog.view.to_s == "view2", "Expected view2"
|
126
128
|
before = @blog.posts.size
|
127
129
|
num = @blog.create_new_post("Uninteresting title", true)
|
128
130
|
assert @blog.posts.size == before + 1, "Don't see new post"
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: runeblog
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.66
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Hal Fulton
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-09-
|
11
|
+
date: 2018-09-28 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: livetext
|