runeblog 0.2.2 → 0.2.8

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.
@@ -9,6 +9,7 @@ class RuneBlog::Publishing
9
9
  BadRemotePerms = Exception.new("Bad remote permissions")
10
10
 
11
11
  def initialize(*params)
12
+ log!(enter: __method__, args: [*params])
12
13
  @blog = RuneBlog.blog
13
14
  # Clunky...
14
15
  if params.size == 1 && params[0].is_a?(OpenStruct)
@@ -22,21 +23,25 @@ class RuneBlog::Publishing
22
23
  end
23
24
 
24
25
  def to_h
26
+ log!(enter: __method__)
25
27
  {user: @user, server: @server, docroot: @docroot,
26
28
  path: @path, proto: @proto}
27
29
  end
28
30
 
29
31
  def url
32
+ log!(enter: __method__)
30
33
  vname = @blog.view.name # .gsub(/_/, "\\_")
31
34
  url = "#@proto://#@server/#@path/#{vname}"
32
35
  end
33
36
 
34
37
  def system!(str)
38
+ log!(enter: __method__, args: [str])
35
39
  rc = system(str)
36
40
  rc
37
41
  end
38
42
 
39
43
  def publish(files, assets=[])
44
+ log!(enter: __method__, args: [files, assets])
40
45
  dir = "#@docroot/#@path"
41
46
  view_name = @blog.view.name
42
47
  viewpath = "#{dir}/#{view_name}"
@@ -60,6 +65,7 @@ class RuneBlog::Publishing
60
65
  end
61
66
 
62
67
  def remote_login?
68
+ log!(enter: __method__)
63
69
  cmd = "ssh -o BatchMode=yes #@user@#@server -x date >/dev/null 2>&1"
64
70
  result = system(cmd)
65
71
  return nil unless result
@@ -67,6 +73,7 @@ class RuneBlog::Publishing
67
73
  end
68
74
 
69
75
  def remote_permissions?
76
+ log!(enter: __method__)
70
77
  dir = "#@docroot/#@path"
71
78
  temp = "#@path/__only_testing"
72
79
  try1 = system("ssh -o BatchMode=yes -o ConnectTimeout=1 #@user@#@server -x mkdir -p #{temp} >/dev/null 2>&1")
@@ -1,5 +1,7 @@
1
1
  require 'date'
2
2
 
3
+ require 'logging'
4
+
3
5
  require 'runeblog_version'
4
6
  require 'global'
5
7
  require 'helpers-blog'
@@ -26,7 +28,6 @@ class RuneBlog
26
28
  make_exception(:NoSuchView, "No such view: $1")
27
29
  make_exception(:NoBlogAccessor, "Runeblog.blog is not set")
28
30
 
29
-
30
31
  class << self
31
32
  attr_accessor :blog
32
33
  include Helpers
@@ -40,6 +41,7 @@ class RuneBlog
40
41
  include Helpers
41
42
 
42
43
  def self.create_new_blog_repo(dir = ".blogs")
44
+ log!(enter: __method__, args: [dir])
43
45
  raise ArgumentError unless dir.is_a?(String) && ! dir.empty?
44
46
  root_dir = Dir.pwd + "/" + dir
45
47
  self.create(dir)
@@ -49,6 +51,7 @@ class RuneBlog
49
51
  end
50
52
 
51
53
  def self.create(root = ".blogs")
54
+ log!(enter: __method__, args: [root])
52
55
  # Crude - FIXME later - # What views are there? Publishing, etc.
53
56
  self.blog = self # Weird. Like a singleton - dumbass circular dependency?
54
57
  $_blog = self # Dumber still?
@@ -56,6 +59,7 @@ class RuneBlog
56
59
  raise BlogRepoAlreadyExists if Dir.exist?(root)
57
60
  create_dirs(root)
58
61
  Dir.chdir(root) do
62
+ system("cp #{RuneBlog::Path}/../empty_view.tgz .")
59
63
  create_dirs(:drafts, :views)
60
64
  new_sequence
61
65
  end
@@ -66,6 +70,7 @@ class RuneBlog
66
70
  end
67
71
 
68
72
  def self.open(root = ".blogs")
73
+ log!(enter: __method__, args: [root])
69
74
  # Crude - FIXME later - # What views are there? Publishing, etc.
70
75
  self.blog = self # Weird. Like a singleton - dumbass circular dependency?
71
76
  $_blog = self # Dumber still?
@@ -74,6 +79,7 @@ class RuneBlog
74
79
  end
75
80
 
76
81
  def initialize(root_dir = ".blogs") # always assumes existing blog
82
+ log!(enter: "initialize", args: [root_dir])
77
83
  # Crude - FIXME later - # What views are there? Publishing, etc.
78
84
  self.class.blog = self # Weird. Like a singleton - dumbass circular dependency?
79
85
  $_blog = self # Dumber still?
@@ -94,32 +100,36 @@ class RuneBlog
94
100
  end
95
101
 
96
102
  def inspect
97
- str = "[["
103
+ log!(enter: __method__)
104
+ str = "blog: "
98
105
  ivars = ["@root", "@sequence"] # self.instance_variables
99
106
  ivars.each do |iv|
100
107
  val = self.instance_variable_get(iv)
101
- str << "#{iv} = #{val} "
108
+ str << "#{iv}: #{val} "
102
109
  end
103
- str << "]]"
104
110
  str
105
111
  end
106
112
 
107
113
  def view?(name)
114
+ log!(enter: __method__, args: [name])
108
115
  raise ArgumentError unless name.is_a?(String) && ! name.empty?
109
116
  views.any? {|x| x.name == name }
110
117
  end
111
118
 
112
119
  def view(name = nil)
120
+ log!(enter: __method__, args: [name])
113
121
  raise ArgumentError unless name.nil? || (name.is_a?(String) && ! name.empty?)
114
122
  name.nil? ? @view : str2view(name)
115
123
  end
116
124
 
117
125
  def str2view(str)
126
+ log!(enter: __method__, args: [str])
118
127
  raise ArgumentError unless str.is_a?(String) && ! str.empty?
119
128
  @views.find {|x| x.name == str }
120
129
  end
121
130
 
122
131
  def _set_publisher
132
+ log!(enter: __method__)
123
133
  file = @view.dir + "/publish"
124
134
  @view.publisher = nil
125
135
  return unless File.exist?(file)
@@ -127,6 +137,7 @@ class RuneBlog
127
137
  end
128
138
 
129
139
  def view=(arg)
140
+ log!(enter: __method__, args: [arg])
130
141
  case arg
131
142
  when RuneBlog::View
132
143
  @view = arg
@@ -142,16 +153,19 @@ class RuneBlog
142
153
  end
143
154
 
144
155
  def get_sequence
156
+ log!(enter: __method__)
145
157
  File.read(root + "/sequence").to_i
146
158
  end
147
159
 
148
160
  def next_sequence
161
+ log!(enter: __method__)
149
162
  @sequence += 1
150
163
  dump(@sequence, "#@root/sequence")
151
164
  @sequence
152
165
  end
153
166
 
154
167
  def viewdir(v = nil) # delete?
168
+ log!(enter: __method__, args: [v])
155
169
  v = str2view(v) if v.is_a?(String)
156
170
  raise ArgumentError unless v.nil? || v.is_a?(RuneBlog::View)
157
171
  v ||= @view
@@ -159,38 +173,45 @@ class RuneBlog
159
173
  end
160
174
 
161
175
  def self.exist?
176
+ log!(enter: __method__)
162
177
  Dir.exist?(DotDir) && File.exist?(DotDir + "/" + ConfigFile)
163
178
  end
164
179
 
180
+ def _copy_to_staging
181
+ copy!("themes/standard/", "staging/")
182
+ copy!("themes/standard/widgets/", "staging/")
183
+ end
184
+
185
+ def _copy_to_remote
186
+ copy!("themes/standard/etc", "remote/")
187
+ copy!("themes/standard/assets", "remote/")
188
+ copy!("themes/standard/widgets", "remote/")
189
+ end
190
+
165
191
  def create_view(arg)
192
+ log!(enter: __method__, args: [arg])
166
193
  raise ArgumentError unless arg.is_a?(String) && ! arg.empty?
167
194
 
168
195
  names = self.views.map(&:to_s)
169
196
  raise ViewAlreadyExists(arg) if names.include?(arg)
170
197
 
171
- vdir = "#@root/views/#{arg}/"
198
+ vdir = arg.dup
172
199
  raise DirAlreadyExists(vdir) if Dir.exist?(vdir)
173
- create_dirs(vdir)
174
- up = Dir.pwd
175
-
176
- Dir.chdir(vdir) do
177
- x = RuneBlog::Default
178
- copy!("#{Themes}", "themes")
179
- create_dirs(:assets, :posts)
180
- create_dirs(:staging, "remote/permalink", "remote/navbar")
181
- livetext "themes/standard/etc/blog.css.lt3" # strip ext
182
- copy!("themes/standard/*", "staging/")
183
200
 
184
- copy!("themes/standard/etc", "remote/")
185
- copy!("themes/standard/assets", "remote/")
186
- copy!("themes/standard/widgets", "remote/")
201
+ Dir.chdir(@root) do
202
+ cmd1 = "tar zxvf empty_view.tgz >/dev/null 2>&1"
203
+ cmd2 = "cp -r empty_view views/#{arg}"
204
+ system(cmd1)
205
+ system(cmd2)
206
+ end
187
207
 
208
+ Dir.chdir("#@root/views/#{vdir}") do
209
+ livetext "themes/standard/blog/generate", "remote/index"
188
210
  pub = "user: xxx\nserver: xxx\ndocroot: xxx\npath: xxx\nproto: xxx\n"
189
211
  dump(pub, "publish")
190
212
 
191
213
  view = RuneBlog::View.new(arg)
192
214
  self.view = view
193
- vdir = self.view.dir
194
215
  dump("Initial creation", "last_published")
195
216
  end
196
217
  @views << view
@@ -198,6 +219,7 @@ class RuneBlog
198
219
  end
199
220
 
200
221
  def delete_view(name, force = false)
222
+ log!(enter: __method__, args: [name, force])
201
223
  raise ArgumentError unless name.is_a?(String) && ! name.empty?
202
224
  if force
203
225
  system("rm -rf #@root/views/#{name}")
@@ -206,6 +228,7 @@ class RuneBlog
206
228
  end
207
229
 
208
230
  def view_files
231
+ log!(enter: __method__)
209
232
  vdir = self.view.dir
210
233
  files = ["#{vdir}/index.html"]
211
234
  files += posts.map {|x| "#{vdir}/#{x}" }
@@ -214,7 +237,7 @@ class RuneBlog
214
237
  end
215
238
 
216
239
  def post_lookup(postid) # side-effect?
217
- # .. = templates, ../.. = views/thisview
240
+ log!(enter: __method__, args: [postid])
218
241
  slug = title = date = teaser_text = nil
219
242
 
220
243
  dir_posts = @vdir + "/posts"
@@ -229,6 +252,7 @@ class RuneBlog
229
252
  end
230
253
 
231
254
  def teaser(slug)
255
+ log!(enter: __method__, args: [slug])
232
256
  id = slug.to_i
233
257
  text = nil
234
258
  post_entry_name = @theme + "/blog/post_entry.lt3"
@@ -237,7 +261,6 @@ class RuneBlog
237
261
  nslug, aslug, title, date, teaser_text =
238
262
  vp.nslug, vp.aslug, vp.title, vp.date, vp.teaser_text
239
263
  path = vp.path
240
- # url = "#{path}/#{aslug}.html" # Should be relative to .blogs!! FIXME
241
264
  url = "#{aslug}.html" # Should be relative to .blogs!! FIXME
242
265
  date = ::Date.parse(date)
243
266
  date = date.strftime("%B %e<br>%Y")
@@ -246,7 +269,7 @@ class RuneBlog
246
269
  end
247
270
 
248
271
  def collect_recent_posts(file)
249
- @vdir = ".."
272
+ log!(enter: __method__, args: [file])
250
273
  posts = nil
251
274
  dir_posts = @vdir + "/posts"
252
275
  entries = Dir.entries(dir_posts)
@@ -269,15 +292,17 @@ class RuneBlog
269
292
  text << teaser(postid) # side effect! calls _out
270
293
  end
271
294
  text << "</body></html>"
272
- File.write(file, text) # FIXME ???
295
+ File.write("#@vdir/remote/"+file, text) # FIXME ???
273
296
  iframe_text = <<-HTML
274
297
  <iframe name="main" style="width: 100vw;height: 100vh;position: relative;"
275
298
  src='recent.html' width=100% frameborder="0" allowfullscreen>
276
299
  </iframe>
277
300
  HTML
301
+ # FIXME ^ serves no purpose??
278
302
  end
279
303
 
280
304
  def create_new_post(title, testing = false, teaser: nil, body: nil, other_views: [])
305
+ log!(enter: __method__, args: [title, testing, teaser, body, other_views])
281
306
  meta = nil
282
307
  Dir.chdir(self.view.dir) do
283
308
  post = Post.create(title: title, teaser: teaser, body: body, other_views: other_views)
@@ -292,6 +317,7 @@ class RuneBlog
292
317
  end
293
318
 
294
319
  def edit_initial_post(file, testing = false)
320
+ log!(enter: __method__, args: [file, testing])
295
321
  debug "=== edit_initial_post #{file.inspect} => #{sourcefile}"
296
322
  sourcefile = "#@root/drafts/#{file}"
297
323
  result = system("#@editor #{sourcefile} +8") unless testing
@@ -302,17 +328,20 @@ class RuneBlog
302
328
  end
303
329
 
304
330
  def posts
331
+ log!(enter: __method__)
305
332
  dir = self.view.dir + "/posts"
306
333
  posts = Dir.entries(dir).grep(/^\d{4}/)
307
334
  posts
308
335
  end
309
336
 
310
337
  def drafts
338
+ log!(enter: __method__)
311
339
  dir = "#@root/drafts"
312
340
  drafts = Dir.entries(dir).grep(/^\d{4}.*/)
313
341
  end
314
342
 
315
343
  def change_view(view)
344
+ log!(enter: __method__, args: [view])
316
345
  raise ArgumentError unless view.is_a?(String) || view.is_a?(RuneBlog::View)
317
346
  x = OpenStruct.new
318
347
  x.root, x.current_view, x.editor = @root, view.to_s, @editor # dumb - FIXME later
@@ -321,20 +350,22 @@ class RuneBlog
321
350
  end
322
351
 
323
352
  def generate_index(view) # FIXME delete?
324
- debug "=== generate_index view = #{view.to_s}"
353
+ log!(enter: __method__, args: [view], pwd: true, dir: true)
325
354
  raise ArgumentError unless view.is_a?(String) || view.is_a?(RuneBlog::View)
326
-
327
- vdir = self.view.dir
328
- dir0 = "#{vdir}/themes/standard/blog"
329
- rescue => err
330
- error(err)
331
- exit
355
+ @vdir = @root + "/views/#{view}"
356
+ collect_recent_posts("recent.html")
332
357
  end
333
358
 
334
359
  def generate_view(view) # huh?
360
+ log!(enter: __method__, args: [view])
361
+ generate_index(view) # recent posts (recent.html)
362
+ Dir.chdir(@root + "/views/#{view}/themes/standard") do
363
+ livetext "blog/generate.lt3", "../../remote/index.html"
364
+ end
335
365
  end
336
366
 
337
367
  def _get_views(draft)
368
+ log!(enter: __method__, args: [draft])
338
369
  # FIXME dumb code
339
370
  view_line = File.readlines(draft).grep(/^.views /)
340
371
  raise "More than one .views call!" if view_line.size > 1
@@ -344,23 +375,8 @@ class RuneBlog
344
375
  views
345
376
  end
346
377
 
347
- # Remember: A post in multiple views will trigger multiple
348
- # views needing to be rebuilt (and published)
349
-
350
- # generate a post:
351
- # given draft 9999-title.lt3
352
- # create VIEW/posts/9999-title/index.lt3
353
- # LATER: metadata!! or is it in head?
354
- # Generate VIEW/posts/9999-title/head.lt3?
355
- # livetext draft_wrapper_plain.lt3 >generated/posts/plain-title.html # unframed
356
- # livetext draft_generate.lt3 >generated/posts/real-title.html # framed
357
- # livetext draft_wrapper_perma.lt3 >generated/posts/perma-title.html # permaframed
358
- #
359
- # Generate associated views:
360
- # livetext ??/recent.lt3 >VIEW/working/recent.html
361
- # livetext VIEW/blog/generate.lt3 ??
362
-
363
378
  def _copy_get_dirs(draft, view)
379
+ log!(enter: __method__, args: [draft, view])
364
380
  fname = File.basename(draft)
365
381
  noext = fname.sub(/.lt3$/, "")
366
382
  vdir = "#@root/views/#{view}"
@@ -373,45 +389,45 @@ class RuneBlog
373
389
  end
374
390
 
375
391
  def generate_post(draft)
392
+ log!(enter: __method__, args: [draft])
376
393
  views = _get_views(draft)
377
394
  views.each do |view|
378
395
  noext, viewdir, slugdir, aslug, @theme = _copy_get_dirs(draft, view)
379
- staging = viewdir + "/staging"
396
+ remote = viewdir + "/remote"
380
397
  Dir.chdir(slugdir) do
381
398
  copy(draft, ".")
382
399
  lt3 = draft.split("/")[-1]
383
400
  # Remember: Some posts may be in more than one view -- careful with links back
384
- # system("livetext #{draft} >staging/#{name}/index.html") # permalink?
385
- copy!("#{@theme}/*", "#{staging}")
386
- copy(lt3, staging)
401
+ copy(lt3, remote)
387
402
  html = noext[5..-1]
388
- livetext draft, html
389
- copy(draft, "../../staging/post/index.html")
403
+ livetext draft, html # livetext "foobar.lt3", "foobar.html"
404
+ copy(html, "../../remote/post/index.html")
390
405
  title_line = File.readlines(draft).grep(/^.title /).first
391
406
  title = title_line.split(" ", 2)[1]
392
407
  excerpt = File.read("teaser.txt")
393
408
  vars = %[.set title="#{title.chomp}"\n] +
394
409
  %[.set teaser="#{excerpt.chomp}"]
395
- Dir.chdir(staging) do
396
- File.open("vars.lt3", "w") {|f| f.puts vars }
397
- livetext "post/generate.lt3", html
398
- copy html, "../remote"
399
- livetext "post/permalink.lt3", "../remote/permalink/#{html}"
400
- collect_recent_posts("recent.html")
401
- copy("recent.html", "../remote")
402
- copy!("navbar/*html", "../remote/navbar/")
403
- copy!("widgets", "../remote/") # really copies too much...
404
- livetext "blog/generate", "../remote/index"
410
+ theme = "../../theme/standard"
411
+ File.open("vars.lt3", "w") {|f| f.puts vars }
412
+ livetext "#{theme}/post/generate.lt3", "#{remote}/#{html}"
413
+ livetext "#{theme}/post/permalink.lt3", "#{remote}/permalink/#{html}"
414
+ log!(str: "About to enter remote/", pwd: true, dir: true)
415
+ Dir.chdir(remote) do
416
+ log!(str: "Now in remote/", pwd: true, dir: true)
417
+ system("cp -r ../themes/standard/widgets .")
418
+ log!(str: "finished with remote/", pwd: true, dir: true)
405
419
  end
406
420
  end
407
421
  end
408
422
  end
409
423
 
410
424
  def relink
425
+ log!(enter: __method__)
411
426
  self.views.each {|view| generate_index(view) }
412
427
  end
413
428
 
414
429
  def index_entry(view, meta)
430
+ log!(enter: __method__, args: [view, meta])
415
431
  debug "=== index_entry #{view.to_s.inspect} #{meta.num} #{meta.title.inspect}"
416
432
  check_meta(meta, "index_entry1")
417
433
  raise ArgumentError unless view.is_a?(String) || view.is_a?(RuneBlog::View)
@@ -432,6 +448,7 @@ class RuneBlog
432
448
  end
433
449
 
434
450
  def rebuild_post(file)
451
+ log!(enter: __method__, args: [file])
435
452
  raise "Doesn't currently work"
436
453
  debug "Called rebuild_post(#{file.inspect})"
437
454
  raise ArgumentError unless file.is_a?(String)
@@ -446,6 +463,7 @@ class RuneBlog
446
463
  end
447
464
 
448
465
  def remove_post(num)
466
+ log!(enter: __method__, args: [num])
449
467
  raise ArgumentError unless num.is_a?(Integer)
450
468
  tag = prefix(num)
451
469
  files = Find.find(self.view.dir).to_a
@@ -461,6 +479,7 @@ class RuneBlog
461
479
  end
462
480
 
463
481
  def undelete_post(num)
482
+ log!(enter: __method__, args: [num])
464
483
  raise ArgumentError unless num.is_a?(Integer)
465
484
  files = Find.find("#@root/views/").to_a
466
485
  tag = prefix(num)
@@ -476,12 +495,14 @@ class RuneBlog
476
495
  end
477
496
 
478
497
  def delete_draft(num)
498
+ log!(enter: __method__, args: [num])
479
499
  raise ArgumentError unless num.is_a?(Integer)
480
500
  tag = prefix(num)
481
501
  system("rm -rf #@root/drafts/#{tag}-*")
482
502
  end
483
503
 
484
504
  def make_slug(meta)
505
+ log!(enter: __method__, args: [meta])
485
506
  raise ArgumentError unless meta.title.is_a?(String)
486
507
  label = '%04d' % meta.num # FIXME can do better
487
508
  slug0 = meta.title.downcase.strip.gsub(' ', '-').gsub(/[^\w-]/, '')