runeblog 0.1.12 → 0.1.13

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 948afa31335a283c1ff1cdc27a5f8ef6793efa6f901e074d8ec18152acd013d3
4
- data.tar.gz: ad5f2733c771e431db6a949c087826f7fb90610b6185bafd13ff9f5e7d3b254f
3
+ metadata.gz: 36cbc21ab4f6f91bd7a64ce69394afee995e95450702aaedb39b0fc6ce2987f3
4
+ data.tar.gz: 9973a1a4cba61e6578ef2255993ddf104023f56b3281a789098daf85f7ed7c10
5
5
  SHA512:
6
- metadata.gz: 703583991e0b5b11f3b0287cc4a547777e86f7a60d9ed391e1e4817ed890e837173a6b79bf400b1dd5a935f6c4897f9e33d59057be26046a62902e0af6304992
7
- data.tar.gz: c34abd037caaf49f0d0482093e27d0f87eea10d0e292876d6523cbaff2374d144dd5479caf0a31492d6592e2df3c5c3d6ac646a839ccc694ffee9e7d1bb51f0a
6
+ metadata.gz: 222962f37116d5517ac776b6010d314a5d69e61f32858859b67b0f498d479e1dac339ac83289d0017613b1e8acdac541bd136922db163092a9dec5d03a0205dd
7
+ data.tar.gz: ffa549c4d4227724ccefda65d969b3a526b24d9882c3d6b4f5a123b0b847b3ad03e3929741823ff9f50260cec94d461b8c81f9512a5d18975a5ac27a44bca435
data/bin/blog CHANGED
@@ -7,17 +7,8 @@ require 'rubytext'
7
7
 
8
8
  require 'repl'
9
9
 
10
- # trap("INT") { }
11
-
12
10
  include RuneBlog::REPL
13
11
 
14
- def get_argv
15
- return nil if ARGV.size == 0
16
- cmd = ARGV[0..1].join(" ")
17
- arg = ARGV[2]
18
- [cmd, arg]
19
- end
20
-
21
12
  def mainloop
22
13
  print fx("blog> ", Red)
23
14
  cmd = STDSCR.gets(history: @cmdhist)
@@ -31,15 +22,10 @@ rescue => err
31
22
  puts err
32
23
  end
33
24
 
34
-
35
- ###########
25
+ ###
36
26
 
37
27
  RubyText.start(:_echo, :keypad, scroll: true, log: "blogcmd.txt", fg: Blue, bg: White)
38
28
 
39
- # STDOUT.sync = true
40
-
41
- cmd, arg = get_argv
42
-
43
29
  if ! RuneBlog.exist?
44
30
  print "No blog found. Create new one? (y/n) "
45
31
  resp = gets.chomp
@@ -52,22 +38,10 @@ end
52
38
 
53
39
  @blog = RuneBlog.new
54
40
 
55
- # STDSCR.clear if curses?
56
-
57
- if cmd.nil? # REPL
58
- puts fx("\n RuneBlog", :bold), fx(" v #{RuneBlog::VERSION}\n", Red)
59
- @cmdhist = []
60
- loop { mainloop }
61
- sleep 0.2
62
- system("tput clear")
63
- puts
64
- else # one command
65
- file = File.open("/dev/tty")
66
- STDIN.reopen(file) # avoid ARGF dumbness
67
- cmd = ARGV.join(" ")
68
- meth, params = RuneBlog::REPL.choose_method(cmd)
69
- str = send(meth, params)
70
- puts str unless str.nil?
71
- puts
72
- end
41
+ puts fx("\n RuneBlog", :bold), fx(" v #{RuneBlog::VERSION}\n", Red)
42
+ @cmdhist = []
43
+ loop { mainloop }
44
+ sleep 0.2
45
+ system("tput clear")
46
+ puts
73
47
 
data/lib/default.rb CHANGED
@@ -33,12 +33,98 @@ BlogTrailer = <<-TEXT
33
33
  <!-- no blog trailer -->
34
34
  TEXT
35
35
 
36
+ def RuneBlog.post_template(title: "No title", date: nil, view: "test_view",
37
+ teaser: "No teaser", body: "No body")
38
+ <<-TEXT
39
+ .mixin liveblog
40
+
41
+ .title #{title}
42
+ .pubdate #{date}
43
+ .views #{view}
44
+ .tags
45
+
46
+ .teaser
47
+ #{teaser}
48
+ .end
49
+ #{body}
50
+ TEXT
51
+ end
52
+
53
+ def RuneBlog.teaser_template(title: "No title", date: nil, view: "test_view",
54
+ teaser: "No teaser", body: "No body", slug: nil)
55
+ <<-TEXT
56
+ <html>
57
+
58
+ <body>
59
+
60
+ <script>
61
+ window.fbAsyncInit = function() {
62
+ FB.init({
63
+ appId : '1176481582378716',
64
+ xfbml : true,
65
+ version : 'v2.4'
66
+ });
67
+ };
68
+
69
+ (function(d, s, id){
70
+ var js, fjs = d.getElementsByTagName(s)[0];
71
+ if (d.getElementById(id)) {return;}
72
+ js = d.createElement(s); js.id = id;
73
+ js.src = '//connect.facebook.net/en_US/sdk.js';
74
+ fjs.parentNode.insertBefore(js, fjs);
75
+ }(document, 'script', 'facebook-jssdk'));
76
+ </script>
77
+ <!-- meta property='fb:admins' content='767352779' /> -->
78
+ <meta property='og:url' content='http://rubyhacker.com/blog2/#{slug}.html'/>
79
+ <meta property='og:type' content='article'/>
80
+ <meta property='og:title' content='#{title}'/>
81
+ <meta property='og:image' content='http://rubyhacker.com/blog2/blog3b.gif'/>
82
+ <meta property='og:description' content='#{teaser}'/>
83
+
84
+ <table bgcolor=#eeeeee cellspacing=5>
85
+ <tr>
86
+ <td valign=top>
87
+ <br> <font size=+2 color=red>#{title}</font> <br> #{date}
88
+ </td>
89
+ <td width=2% bgcolor=red></td>
90
+ <td valign=top>
91
+ <a href='https://twitter.com/share'
92
+ class='twitter-share-button'
93
+ data-text='#{title}'
94
+ data-url='#{'url'}'
95
+ data-via='hal_fulton'
96
+ data-related='hal_fulton'>Tweet</a>
97
+ <script>!function(d,s,id){var js,fjs=d.getElementsByTagName(s)[0],p=/^http:/.test(d.location)?'http':'https';if(!d.getElementById(id)){js=d.createElement(s);js.id=id;js.src=p+'://platform.twitter.com/widgets.js';fjs.parentNode.insertBefore(js,fjs);}}(document, 'script', 'twitter-wjs');</script>
98
+ <br>
99
+ <a href='https://twitter.com/hal_fulton' class='twitter-follow-button' data-show-count='false'>Follow @hal_fulton</a>
100
+ <script>!function(d,s,id){var js,fjs=d.getElementsByTagName(s)[0],p=/^http:/.test(d.location)?'http':'https';if(!d.getElementById(id)){js=d.createElement(s);js.id=id;js.src=p+'://platform.twitter.com/widgets.js';fjs.parentNode.insertBefore(js,fjs);}}(document, 'script', 'twitter-wjs');</script>
101
+
102
+ <br>
103
+ <div
104
+ class='fb-like'
105
+ data-share='true'
106
+ data-width='450'
107
+ data-show-faces='true'>
108
+ </div>
109
+ </td>
110
+ </tr>
111
+ </table>
112
+ <hr>
113
+
114
+ #{body}
115
+
116
+ <hr>
117
+ <a href="http://rubyhacker.com/blog2" style="text-decoration: none">Back</a>
118
+ <a href="http://rubyhacker.com" style="text-decoration: none">Home</a>
119
+ TEXT
120
+ end
121
+
36
122
  PostTemplate = <<-'TEXT' # interpolate later
37
123
  .mixin liveblog
38
124
 
39
- .title #@title
40
- .pubdate #@date
41
- .views #@view
125
+ .title #{@meta.title}
126
+ .pubdate #{@meta.date}
127
+ .views #{@meta.view}
42
128
  .tags
43
129
 
44
130
  .teaser
data/lib/global.rb CHANGED
@@ -31,3 +31,16 @@ def prefix(num)
31
31
  "#{'%04d' % num.to_i}"
32
32
  end
33
33
 
34
+ def check_meta(meta, where = "")
35
+ str = "--- #{where}\n"
36
+ str << "\ncheck_meta: \n" + caller.join("\n") + "\n meta = #{meta.inspect}\n"
37
+ str << " title missing!\n" unless meta.title
38
+ str << " title missing! (empty)" if meta.title && meta.title.empty?
39
+ str << " num missing!\n" unless meta.num
40
+ if str =~ /missing!/
41
+ debug str
42
+ exit
43
+ raise str
44
+ end
45
+ end
46
+
data/lib/helpers-blog.rb CHANGED
@@ -18,8 +18,8 @@ module RuneBlog::Helpers
18
18
  end
19
19
  return vals
20
20
  rescue => err
21
- puts "Something hit the fan: #{err}" # CHANGE_FOR_CURSES?
22
- puts err.backtrace.join("\n") # CHANGE_FOR_CURSES?
21
+ puts "Something hit the fan: #{err}"
22
+ puts err.backtrace.join("\n")
23
23
  puts "dir = #{Dir.pwd}"
24
24
  exit
25
25
  end
@@ -57,7 +57,7 @@ module RuneBlog::Helpers
57
57
  dirs.reject! {|x| ! File.directory?("#@root/views/#{x}") }
58
58
  dirs
59
59
  rescue
60
- STDERR.puts "Can't find dir '#{dir}'" # CHANGE_FOR_CURSES?
60
+ STDERR.puts "Can't find dir '#{dir}'"
61
61
  exit
62
62
  end
63
63
 
@@ -82,8 +82,8 @@ module RuneBlog::Helpers
82
82
 
83
83
  def error(err) # Hmm, this is duplicated
84
84
  str = "\n Error: #{err}"
85
- puts str # CHANGE_FOR_CURSES?
86
- puts err.backtrace.join("\n") # CHANGE_FOR_CURSES?
85
+ puts str
86
+ puts err.backtrace.join("\n")
87
87
  end
88
88
 
89
89
  def dump(obj, name)
data/lib/helpers-repl.rb CHANGED
@@ -149,7 +149,9 @@ module RuneBlog::REPL
149
149
 
150
150
  def ask(prompt, meth = :to_s)
151
151
  print prompt
152
- gets.chomp.send(meth)
152
+ str = gets
153
+ str.chomp!
154
+ str.send(meth)
153
155
  end
154
156
 
155
157
  def yesno(prompt, meth = :to_s)
@@ -224,7 +226,7 @@ module RuneBlog::REPL
224
226
  name = arg
225
227
  grep = `grep ^.title #{name}`
226
228
  @title = grep.sub(/^.title /, "")
227
- @slug = @blog.make_slug(@title)
229
+ @slug = @blog.make_slug(@title) # import (not impl)
228
230
  @fname = @slug + ".lt3"
229
231
  result = system("cp #{name} #@root/src/#@fname")
230
232
  raise CantCopy(name, "#@root/src/#@fname") unless result
@@ -278,7 +280,8 @@ module RuneBlog::REPL
278
280
  search_path = proc do |path|
279
281
  full_path = path + asset_name
280
282
  return full_path if File.exist?(full_path)
281
- end
283
+ end
284
+ check_meta(@meta, "find_asset")
282
285
  views = @meta.views
283
286
  views.each do |view| search_path.call("#{view.dir}/#{@meta.slug}/assets/") end
284
287
  views.each do |view| search_path.call(view.dir + "/assets/") end
data/lib/post.rb CHANGED
@@ -5,7 +5,7 @@ make_exception(:NoBlogAccessor, "Runeblog.blog is not set")
5
5
 
6
6
  class RuneBlog::Post
7
7
 
8
- attr_reader :id, :title, :date, :views, :num, :slug
8
+ attr_reader :num, :title, :date, :views, :num, :slug
9
9
 
10
10
  include RuneBlog::Helpers
11
11
 
@@ -27,75 +27,93 @@ class RuneBlog::Post
27
27
  meta.tags = meta.tags.split
28
28
  meta.teaser = File.read("teaser.txt")
29
29
  meta.body = File.read("body.txt")
30
+ check_meta(meta, "Post.load")
30
31
  end
31
32
  meta
32
33
  end
33
34
 
34
35
  def initialize(meta, view_name)
35
36
  # FIXME weird logic here
36
- raise NoBlogAccessor if RuneBlog.blog.nil?
37
- @blog = RuneBlog.blog
38
- @title = meta.title
39
- @view = @blog.str2view(view_name)
40
- @num, @slug = make_slug
41
- @date = Time.now.strftime("%Y-%m-%d")
42
- template = RuneBlog::Default::PostTemplate
37
+ @blog = RuneBlog.blog || raise(NoBlogAccessor)
38
+ @blog.make_slug(meta) # Post#initialize
39
+ meta.pubdate = Time.now.strftime("%Y-%m-%d")
40
+ meta.date = meta.pubdate # fix later
41
+ meta.views = [view_name]
42
+ check_meta(meta, "Post#initialize")
43
+ html = RuneBlog.post_template(title: meta.title, date: meta.pubdate,
44
+ view: meta.view, teaser: meta.teaser,
45
+ body: meta.body)
46
+ slug = meta.slug
43
47
  @meta = meta
44
- html = interpolate(template)
45
- @draft = "#{@blog.root}/src/#@slug.lt3"
48
+ @draft = "#{@blog.root}/src/#{slug}.lt3"
46
49
  dump(html, @draft)
50
+ rescue => err
51
+ puts err
52
+ puts err.backtrace
47
53
  end
48
54
 
49
55
  def edit
50
- result = system("vi #@draft +8")
56
+ result = system("vi #@draft +8") # TODO improve this
51
57
  raise EditorProblem(draft) unless result
52
58
  nil
53
59
  rescue => err
54
60
  error(err)
55
61
  end
56
62
 
57
- def build
63
+ def build(meta=nil)
64
+ meta = @meta # FIXME
65
+ check_meta(meta, "Post.build")
58
66
  livetext = Livetext.new(STDOUT)
59
- @meta = livetext.process_file(@draft, binding)
60
- raise LivetextError(@draft) if @meta.nil?
67
+ puts "build: meta = #{meta.inspect}"
68
+ views = meta.views
69
+ @meta2 = livetext.process_file(@draft, binding)
70
+ @meta2.num = meta.num # dumb?
71
+ @meta2.views = views # extra dumb
72
+ check_meta(@meta2, "build2")
73
+ raise LivetextError(@draft) if @meta2.nil?
74
+
75
+ puts "build: cp 2 - meta2 = #{@meta2.inspect}"
76
+
77
+ # Hmm. @meta2 differs from meta -- views, etc.
61
78
 
62
79
  # FIXME what if title changes?
63
80
 
64
- @meta.views.each do |view_name| # Create dir using slug (index.html, metadata?)
81
+ @meta2.views.each do |view_name| # Create dir using slug (index.html, metadata?)
82
+ puts "build: cp 3 - view = #{view_name}"
65
83
  view = @blog.str2view(view_name)
66
84
  vdir = view.dir
67
- dir = vdir + @slug + "/"
85
+ dir = vdir + meta.slug + "/"
68
86
  Dir.mkdir(dir)
69
87
  Dir.chdir(dir) do
88
+ puts "build: cp 4 - view = #{view_name}"
70
89
  create_post_subtree(vdir)
90
+ puts "build: cp 5 - view = #{view_name}"
71
91
  @blog.generate_index(view)
92
+ puts "build: cp 6 - view = #{view_name}"
72
93
  end
73
94
  end
74
95
  rescue => err
75
- p err # CHANGE_FOR_CURSES?
76
- puts err.backtrace.join("\n") # CHANGE_FOR_CURSES?
96
+ p err
97
+ puts err.backtrace.join("\n")
77
98
  end
78
99
 
79
100
  private
80
101
 
81
102
  def create_post_subtree(vdir)
82
103
  create_dir("assets")
83
- write_metadata(@meta)
84
- template = RuneBlog::Default::TeaserTemplate # FIXME template into custom dir?
85
- text = interpolate(template)
104
+ check_meta(@meta2, "create_post_subtree")
105
+ write_metadata(@meta2)
106
+ meta = @meta2
107
+ text = RuneBlog.teaser_template(title: meta.title, date: meta.date,
108
+ view: meta.view, teaser: meta.teaser,
109
+ body: meta.body)
86
110
  dump(text, "index.html") # FIXME write_index ?
87
111
  end
88
112
 
89
- def make_slug(postnum = nil)
90
- postnum ||= @blog.next_sequence
91
- num = prefix(postnum) # FIXME can do better
92
- slug = @title.downcase.strip.gsub(' ', '-').gsub(/[^\w-]/, '')
93
- [postnum, "#{num}-#{slug}"]
94
- end
95
-
96
113
  def write_metadata(meta)
97
114
  fname2 = "metadata.txt"
98
115
  hash = meta.to_h
116
+ debug "write_meta: #{hash.inspect}"
99
117
 
100
118
  File.write("teaser.txt", hash[:teaser])
101
119
  File.write("body.txt", hash[:body])
@@ -105,7 +123,7 @@ class RuneBlog::Post
105
123
  hash[:views] = hash[:views].join(" ")
106
124
  hash[:tags] = hash[:tags].join(" ")
107
125
 
108
- fields = [:title, :date, :pubdate, :views, :tags]
126
+ fields = [:num, :title, :date, :pubdate, :views, :tags]
109
127
 
110
128
  f2 = File.new(fname2, "w")
111
129
  fields.each do |fld|
data/lib/publish.rb CHANGED
@@ -30,8 +30,13 @@ class RuneBlog::Publishing
30
30
  end
31
31
 
32
32
  def publish(files)
33
- debug "files = #{files.inspect}"
34
33
  reset_output
34
+ if files.empty?
35
+ puts "\n No files to publish"
36
+ output! "\n No files to publish"
37
+ return @out
38
+ end
39
+ debug "files = #{files.inspect}"
35
40
  dir = "#@docroot/#@path"
36
41
  result = system("ssh #@user@#@server -x mkdir -p #{dir}")
37
42
  list = files.join(' ')
@@ -39,7 +44,10 @@ class RuneBlog::Publishing
39
44
  output! "Publishing #{files.size} files...\n"
40
45
  debug "cmd = #{cmd.inspect} - see /tmp/wtf"
41
46
  result = system(cmd)
42
- raise PublishError unless result
47
+ if not result
48
+ debug "error = #{File.read("/tmp/wtf")}"
49
+ raise PublishError
50
+ end
43
51
 
44
52
  dump(files, "#{@blog.view.dir}/last_published")
45
53
  output! "...finished.\n"
data/lib/repl.rb CHANGED
@@ -14,7 +14,7 @@ module RuneBlog::REPL
14
14
  STDSCR.clear
15
15
  end
16
16
 
17
- def cmd_quit(arg)
17
+ def cmd_quit(arg, testing = false)
18
18
  check_empty(arg)
19
19
  # system("tput rmcup")
20
20
  RubyText.stop
@@ -22,20 +22,20 @@ module RuneBlog::REPL
22
22
  exit
23
23
  end
24
24
 
25
- def cmd_clear(arg)
25
+ def cmd_clear(arg, testing = false)
26
26
  check_empty(arg)
27
27
  STDSCR.cwin.clear
28
28
  STDSCR.cwin.refresh
29
29
  end
30
30
 
31
- def cmd_version(arg)
31
+ def cmd_version(arg, testing = false)
32
32
  reset_output
33
33
  check_empty(arg)
34
34
  output RuneBlog::VERSION
35
35
  [true, @out]
36
36
  end
37
37
 
38
- def cmd_config(arg)
38
+ def cmd_config(arg, testing = false)
39
39
  check_empty(arg)
40
40
  dir = @blog.view.dir
41
41
  items = ["publish",
@@ -46,7 +46,7 @@ module RuneBlog::REPL
46
46
  edit_file("#{dir}/#{fname}")
47
47
  end
48
48
 
49
- def cmd_browse(arg)
49
+ def cmd_browse(arg, testing = false)
50
50
  reset_output
51
51
  check_empty(arg)
52
52
  url = @blog.view.publisher.url
@@ -60,7 +60,7 @@ module RuneBlog::REPL
60
60
  nil
61
61
  end
62
62
 
63
- def cmd_preview(arg)
63
+ def cmd_preview(arg, testing = false)
64
64
  reset_output
65
65
  check_empty(arg)
66
66
  local = @blog.view.index
@@ -68,51 +68,36 @@ module RuneBlog::REPL
68
68
  raise CantOpen(local) unless result
69
69
  end
70
70
 
71
- def cmd_publish(arg) # FIXME non-string return expected in caller?
72
- puts
71
+ def cmd_publish(arg, testing = false) # FIXME non-string return expected in caller?
72
+ puts unless testing
73
73
  reset_output
74
74
  check_empty(arg)
75
75
  unless @blog.view.can_publish?
76
- puts "Can't publish without entries in #{@blog.view.name}/publish"
76
+ puts "Can't publish without entries in #{@blog.view.name}/publish" unless testing
77
77
  output! "Can't publish without entries in #{@blog.view.name}/publish"
78
78
  return [false, @out]
79
79
  end
80
80
  RubyText.spinner { @blog.view.publish }
81
- # user, server, sroot, spath = *@publish[@blog.view]
82
- # if files.empty? # FIXME baloney
83
- # output! "No files to publish"
84
- # return [true, @out]
85
- # end
86
-
87
- # output "Files:"
88
- # files.each {|f| output " #{f}\n" }
89
- # output_newline
90
- # dir = "#{sroot}/#{spath}"
91
- # # FIXME - may or may not already exist
92
- # result = system("ssh root@#{server} mkdir -p #{dir}")
93
- #
94
- # cmd = "scp -r #{files.join(' ')} root@#{server}:#{dir} >/dev/null 2>&1"
95
- # output! "Publishing #{files.size} files...\n"
96
- # result = system(cmd)
97
- # raise PublishError unless result
98
-
99
- dump(files, "#{vdir}/last_published")
100
- puts " ...finished"
81
+ dump("fix this later", "#{vdir}/last_published")
82
+ puts " ...finished" unless testing
101
83
  output! "...finished.\n"
102
84
  return [false, @out]
103
85
  end
104
86
 
105
- def cmd_rebuild(arg)
87
+ def cmd_rebuild(arg, testing = false)
106
88
  debug "Starting cmd_rebuild..."
107
89
  reset_output
108
90
  check_empty(arg)
109
- puts # CHANGE_FOR_CURSES?
91
+ puts unless testing
92
+ debug "cp1"
110
93
  files = @blog.find_src_slugs
94
+ debug "cp2"
111
95
  files.each {|file| @blog.rebuild_post(file) }
96
+ debug "cp3"
112
97
  nil
113
98
  end
114
99
 
115
- def cmd_relink(arg)
100
+ def cmd_relink(arg, testing = false)
116
101
  reset_output
117
102
  check_empty(arg)
118
103
  @blog.relink
@@ -129,7 +114,7 @@ module RuneBlog::REPL
129
114
  k, name = STDSCR.menu(title: "Views", items: viewnames, curr: n) unless testing
130
115
  @blog.view = name
131
116
  output name + "\n"
132
- puts "\n ", fx(name, :bold), "\n"
117
+ puts "\n ", fx(name, :bold), "\n" unless testing
133
118
  return [false, @out]
134
119
  else
135
120
  if @blog.view?(arg)
@@ -140,7 +125,7 @@ module RuneBlog::REPL
140
125
  return [false, @out]
141
126
  end
142
127
 
143
- def cmd_new_view(arg)
128
+ def cmd_new_view(arg, testing = false)
144
129
  reset_output
145
130
  @blog.create_view(arg)
146
131
  resp = yesno("Add publishing info now? ")
@@ -149,18 +134,19 @@ module RuneBlog::REPL
149
134
  nil
150
135
  end
151
136
 
152
- def cmd_new_post(arg)
137
+ def cmd_new_post(arg, testing = false)
153
138
  reset_output
154
139
  check_empty(arg)
155
140
  title = ask("\nTitle: ")
156
- meta = OpenStruct.new
157
- meta.title = title
158
- @blog.create_new_post(meta)
141
+ @blog.create_new_post(title)
159
142
  STDSCR.clear
160
143
  nil
144
+ rescue => err
145
+ puts err
146
+ puts err.backtrace.join("\n")
161
147
  end
162
148
 
163
- def cmd_kill(arg)
149
+ def cmd_kill(arg, testing = false)
164
150
  reset_output
165
151
  args = arg.split
166
152
  args.each do |x|
@@ -173,7 +159,7 @@ module RuneBlog::REPL
173
159
 
174
160
  #-- FIXME affects linking, building, publishing...
175
161
 
176
- def cmd_remove_post(arg, safe=true)
162
+ def cmd_remove_post(arg, testing = false, safe=true)
177
163
  # FIXME - 'safe' is no longer a thing
178
164
  reset_output
179
165
  id = get_integer(arg)
@@ -184,7 +170,7 @@ module RuneBlog::REPL
184
170
 
185
171
  #-- FIXME affects linking, building, publishing...
186
172
 
187
- def cmd_edit_post(arg)
173
+ def cmd_edit_post(arg, testing = false)
188
174
  reset_output
189
175
  id = get_integer(arg)
190
176
  # Simplify this
@@ -201,74 +187,74 @@ module RuneBlog::REPL
201
187
  nil
202
188
  end
203
189
 
204
- def cmd_list_views(arg)
190
+ def cmd_list_views(arg, testing = false)
205
191
  reset_output("\n")
206
192
  check_empty(arg)
207
- puts
193
+ puts unless testing
208
194
  @blog.views.each do |v|
209
195
  v = v.to_s
210
196
  v = fx(v, :bold) if v == @blog.view.name
211
197
  print " "
212
198
  output v + "\n"
213
- puts v
199
+ puts v unless testing
214
200
  end
215
- puts
201
+ puts unless testing
216
202
  return [false, @out]
217
203
  end
218
204
 
219
- def cmd_list_posts(arg)
205
+ def cmd_list_posts(arg, testing = false)
220
206
  reset_output
221
207
  check_empty(arg)
222
208
  posts = @blog.posts # current view
223
209
  str = @blog.view.name + ":\n"
224
210
  output str
225
- puts
211
+ puts unless testing
226
212
  print " "
227
- puts fx(str, :bold)
213
+ puts fx(str, :bold) unless testing
228
214
  if posts.empty?
229
215
  output! bold("No posts")
230
- puts fx(" No posts", :bold)
216
+ puts fx(" No posts", :bold) unless testing
231
217
  else
232
218
  posts.each do |post|
233
219
  outstr " #{colored_slug(post)}\n"
234
220
  base = post.sub(/.lt3$/, "")
235
221
  num, rest = base[0..3], base[4..-1]
236
222
  print " "
237
- puts fx(num, Red), fx(rest, Blue)
223
+ puts fx(num, Red), fx(rest, Blue) unless testing
238
224
  end
239
225
  end
240
- puts
226
+ puts unless testing
241
227
  return [false, @out]
242
228
  end
243
229
 
244
- def cmd_list_drafts(arg)
230
+ def cmd_list_drafts(arg, testing = false)
245
231
  reset_output
246
232
  check_empty(arg)
247
233
  drafts = @blog.drafts # current view
248
234
  if drafts.empty?
249
235
  output! "No drafts"
250
- puts " No drafts"
236
+ puts " No drafts" unless testing
251
237
  return [true, @out]
252
238
  else
253
- puts
239
+ puts unless testing
254
240
  drafts.each do |draft|
255
241
  outstr " #{colored_slug(draft.sub(/.lt3$/, ""))}\n"
256
242
  base = draft.sub(/.lt3$/, "")
257
243
  num, rest = base[0..3], base[4..-1]
258
244
  print " "
259
- puts fx(num, Red), fx(rest, Blue)
245
+ puts fx(num, Red), fx(rest, Blue) unless testing
260
246
  end
261
247
  end
262
- puts
248
+ puts unless testing
263
249
  return [false, @out]
264
250
  end
265
251
 
266
- def cmd_INVALID(arg)
252
+ def cmd_INVALID(arg, testing = false)
267
253
  reset_output "\n Command '#{red(arg)}' was not understood."
268
254
  return [true, @out]
269
255
  end
270
256
 
271
- def cmd_help(arg)
257
+ def cmd_help(arg, testing = false)
272
258
  reset_output
273
259
  check_empty(arg)
274
260
  output(<<-EOS)
data/lib/runeblog.rb CHANGED
@@ -53,6 +53,7 @@ class RuneBlog
53
53
  rescue => err
54
54
  puts "Can't create blog: '#{dir}' - #{err}" # CHANGE_FOR_CURSES?
55
55
  puts err.backtrace.join("\n") # CHANGE_FOR_CURSES?
56
+ sleep 5
56
57
  end
57
58
 
58
59
  def initialize # assumes existing blog
@@ -101,7 +102,9 @@ class RuneBlog
101
102
  end
102
103
 
103
104
  def next_sequence
104
- dump(@sequence += 1, "#@root/sequence")
105
+ @sequence += 1
106
+ debug "seq = #@sequence caller = #{caller.join("\n")}"
107
+ dump(@sequence, "#@root/sequence")
105
108
  @sequence
106
109
  end
107
110
 
@@ -164,17 +167,25 @@ class RuneBlog
164
167
  result
165
168
  end
166
169
 
167
- # def create_new_post(title, testing = false, teaser = nil, body = nil)
168
- def create_new_post(meta, testing = false)
169
- meta.teaser ||= "Teaser goes here."
170
- meta.body ||= "Remainder of post goes here."
171
- post = RuneBlog::Post.new(meta, @view.to_s)
170
+ def create_new_post(title, testing = false)
171
+ # FIXME maybe not distinguish between a post and its metadata??
172
+ debug "cnp title = #{title.inspect}"
173
+ meta = OpenStruct.new
174
+ meta.title = title
175
+ meta.teaser = "Teaser goes here."
176
+ meta.body = "Remainder of post goes here."
177
+ meta.num = self.next_sequence
178
+ check_meta(meta, "cnp1")
179
+ post = RuneBlog::Post.new(meta, @view.name) #???
172
180
  post.edit unless testing
173
- post.build
174
- post.num
181
+ check_meta(meta, "cnp2")
182
+ post.build(meta)
183
+ check_meta(meta, "cnp3")
184
+ meta.num
175
185
  rescue => err
176
- puts err # error(err) # CHANGE_FOR_CURSES?
177
- puts err.backtrace.join("\n") # CHANGE_FOR_CURSES?
186
+ puts err
187
+ puts err.backtrace.join("\n")
188
+ sleep 5
178
189
  end
179
190
 
180
191
  def edit_initial_post(file, testing = false)
@@ -184,6 +195,7 @@ class RuneBlog
184
195
  nil
185
196
  rescue => err
186
197
  error(err)
198
+ sleep 5
187
199
  end
188
200
 
189
201
  def posts
@@ -206,24 +218,29 @@ class RuneBlog
206
218
  end
207
219
 
208
220
  def process_post(file)
221
+ debug "procpost 1: file = #{file.inspect}"
209
222
  raise ArgumentError unless file.is_a?(String)
210
223
  path = @root + "/src/#{file}"
211
224
  raise FileNotFound(path) unless File.exist?(path)
212
225
  livetext = Livetext.new(STDOUT) # (nil)
213
- @meta = livetext.process_file(path, binding)
214
- raise LivetextError(path) if @meta.nil?
215
-
216
- num, slug = self.make_slug(@meta.title, self.sequence)
217
- slug = file.sub(/.lt3$/, "")
218
- @meta.slug = slug
219
- @meta
226
+ @meta2 = livetext.process_file(path, binding)
227
+ @meta2.num = file.to_i # dumb af
228
+ check_meta(@meta2, "procpost1")
229
+ raise LivetextError(path) if @meta2.nil?
230
+
231
+ self.make_slug(@meta2) # RuneBlog#process_post
232
+ # slug = file.sub(/.lt3$/, "")
233
+ # @meta.slug = slug
234
+ @meta2
220
235
  rescue => err
221
236
  error(err)
237
+ sleep 5
222
238
  end
223
239
 
224
240
  def build_post_view(view)
225
241
  # Create dir using slug (index.html, metadata?)
226
242
  vdir = self.viewdir(view) # FIXME
243
+ check_meta(@meta, "build_post_view")
227
244
  dir = vdir + @meta.slug + "/"
228
245
  create_dir(dir + "assets")
229
246
  Dir.chdir(dir) do
@@ -237,6 +254,7 @@ class RuneBlog
237
254
  generate_index(view)
238
255
  rescue => err
239
256
  error(err)
257
+ sleep 5
240
258
  end
241
259
 
242
260
  def generate_index(view)
@@ -261,6 +279,8 @@ class RuneBlog
261
279
  pdir = vdir + "/" + post
262
280
  Dir.chdir(pdir) do
263
281
  meta = read_config("metadata.txt")
282
+ meta.num = post.to_i # first 4 digits
283
+ check_meta(meta, "gen_index")
264
284
  meta.teaser = File.read("teaser.txt")
265
285
  meta.body = File.read("body.txt")
266
286
  end
@@ -273,6 +293,7 @@ class RuneBlog
273
293
  end
274
294
  rescue => err
275
295
  error(err)
296
+ sleep 5
276
297
  exit
277
298
  end
278
299
 
@@ -281,8 +302,12 @@ class RuneBlog
281
302
  end
282
303
 
283
304
  def index_entry(view, meta)
305
+ check_meta(meta, "index_entry1")
306
+ debug "\nindex_entry: meta = #{meta.inspect}"
284
307
  raise ArgumentError unless view.is_a?(String) || view.is_a?(RuneBlog::View)
285
- meta.slug ||= make_slug(meta.title)
308
+ check_meta(meta, "index_entry2")
309
+ self.make_slug(meta) # RuneBlog#index_entry
310
+ check_meta(meta, "index_entry3")
286
311
  # FIXME clean up and generalize
287
312
  ref = "#{view}/#{meta.slug}/index.html"
288
313
  <<-HTML
@@ -300,12 +325,13 @@ class RuneBlog
300
325
  def rebuild_post(file)
301
326
  debug "Called rebuild_post(#{file.inspect})"
302
327
  raise ArgumentError unless file.is_a?(String)
303
- @meta = process_post(file)
304
- @meta.views.each do |view|
305
- build_post_view(view)
306
- end
328
+ @meta2 = process_post(file)
329
+ check_meta(@meta2, "rebuild_post")
330
+ debug "rebuild_post: @meta2 = #{@meta2.inspect}"
331
+ @meta2.views.each {|view| build_post_view(view) }
307
332
  rescue => err
308
333
  error(err)
334
+ sleep 5
309
335
  end
310
336
 
311
337
  def remove_post(num)
@@ -350,13 +376,17 @@ class RuneBlog
350
376
  list.empty? ? nil : list
351
377
  end
352
378
 
353
- def make_slug(title, postnum = nil)
354
- debug "title = #{title.inspect} (#{title.class})"
355
- raise ArgumentError unless title.is_a?(String)
356
- postnum ||= self.next_sequence
357
- num = '%04d' % postnum # FIXME can do better
358
- slug = title.downcase.strip.gsub(' ', '-').gsub(/[^\w-]/, '')
359
- [postnum, "#{num}-#{slug}"]
379
+ def make_slug(meta)
380
+ check_meta(meta, "makeslug")
381
+ debug "mkslug 1: meta = #{meta.inspect}"
382
+ raise ArgumentError unless meta.title.is_a?(String)
383
+ label = '%04d' % meta.num # FIXME can do better
384
+ debug "mkslug 2: label = #{label.inspect}"
385
+ slug0 = meta.title.downcase.strip.gsub(' ', '-').gsub(/[^\w-]/, '')
386
+ debug "mkslug 2: slug0 = #{slug0.inspect}"
387
+ str = "#{label}-#{slug0}"
388
+ meta.slug = str
389
+ str
360
390
  end
361
391
 
362
392
  end
data/lib/version.rb CHANGED
@@ -1,6 +1,6 @@
1
1
 
2
2
  class RuneBlog
3
- VERSION = "0.1.12"
3
+ VERSION = "0.1.13"
4
4
 
5
5
  Path = File.expand_path(File.join(File.dirname(__FILE__)))
6
6
  end
data/test/general.rb CHANGED
@@ -27,14 +27,16 @@ class TestREPL < Minitest::Test
27
27
  # Note: "Bang" methods depend on the data_test subtree
28
28
 
29
29
  def test_001_cmd_help
30
- flag, out = cmd_help(nil)
30
+ # puts __method__
31
+ flag, out = cmd_help(nil, true)
31
32
  assert out.is_a?(String), "Expected a string returned"
32
33
  lines = out.split("\n").length
33
34
  assert lines > 25, "Expecting lengthy help message"
34
35
  end
35
36
 
36
37
  def test_002_cmd_version
37
- flag, out = cmd_version(nil)
38
+ # puts __method__
39
+ flag, out = cmd_version(nil, true)
38
40
  assert out.is_a?(String), "Expected a string returned"
39
41
  lines = out
40
42
  assert lines =~ /\d+\.\d+\.\d+/m,
@@ -42,34 +44,38 @@ class TestREPL < Minitest::Test
42
44
  end
43
45
 
44
46
  def test_003_list_views!
45
- flag, out = cmd_list_views(nil)
47
+ # puts __method__
48
+ flag, out = cmd_list_views(nil, true)
46
49
  assert out.is_a?(String), "Expected a string returned"
47
50
  lines = out.split("\n").length
48
- p out
49
51
  assert lines >= 2, "Expecting at least 2 lines"
50
52
  end
51
53
 
52
54
  def test_004_change_view!
55
+ # puts __method__
53
56
  flag, out = cmd_change_view(nil, true) # no param, but testing
54
57
  assert out.is_a?(String), "Expected a string; got: #{out.inspect}"
55
58
  assert out =~ /alpha_view/m, "Expecting 'alpha_view' as default; got: #{out.inspect}"
56
59
  end
57
60
 
58
61
  def test_005_lsd!
59
- flag, out = cmd_list_drafts(nil)
62
+ # puts __method__
63
+ flag, out = cmd_list_drafts(nil, true)
60
64
  assert out.is_a?(String), "Expected a string returned"
61
65
  lines = out.split("\n").length
62
66
  assert lines == 10, "Expecting 10 lines; got #{show_lines(out)}"
63
67
  end
64
68
 
65
- def test_006_lsp!
66
- flag, out = cmd_list_posts(nil)
69
+ def xtest_006_lsp!
70
+ puts __method__
71
+ flag, out = cmd_list_posts(nil, true)
67
72
  assert out.is_a?(String), "Expected a string returned; got: #{out.inspect}"
68
73
  lines = out.split("\n").length
69
74
  assert lines == 6, "Expecting 6 lines; got #{show_lines(out)}"
70
75
  end
71
76
 
72
77
  def test_007_parser
78
+ # puts __method__
73
79
  parse_tests = {
74
80
  # Loading/trailing blanks as well
75
81
  "kill 81 82 83" => [:cmd_kill, "81 82 83"],
@@ -116,10 +122,12 @@ p out
116
122
  end
117
123
 
118
124
  def test_008_current_view!
125
+ # puts __method__
119
126
  assert @blog.view.to_s == "alpha_view", "Current view wrong (#{@blog.view}, not alpha_view)"
120
127
  end
121
128
 
122
129
  def test_009_change_view!
130
+ # puts __method__
123
131
  assert @blog.change_view("beta_view")
124
132
  assert @blog.view.to_s == "beta_view", "Current view wrong (#{@blog.view}, not beta_view)"
125
133
  assert @blog.change_view("alpha_view")
@@ -127,12 +135,14 @@ p out
127
135
  end
128
136
 
129
137
  def test_010_accessors!
138
+ # puts __method__
130
139
  sorted_views = @blog.views.map(&:to_s).sort
131
140
  assert sorted_views == ["alpha_view", "beta_view", "gamma_view", "test_view"],
132
141
  "Got: #{sorted_views.inspect}"
133
142
  end
134
143
 
135
144
  def test_011_create_delete_view!
145
+ # puts __method__
136
146
  @blog.create_view("anotherview")
137
147
  sorted_views = @blog.views.map(&:to_s).sort
138
148
  assert sorted_views == ["alpha_view", "anotherview", "beta_view", "gamma_view", "test_view"],
@@ -143,7 +153,8 @@ p out
143
153
  "After delete: #{sorted_views.inspect}"
144
154
  end
145
155
 
146
- def test_012_create_remove_post!
156
+ def xtest_012_create_remove_post!
157
+ # puts __method__
147
158
  @blog.change_view("beta_view")
148
159
  assert @blog.view.to_s == "beta_view", "Expected beta_view"
149
160
  nposts = @blog.posts.size
@@ -163,6 +174,7 @@ p out
163
174
  end
164
175
 
165
176
  def test_013_slug_tests
177
+ puts __method__
166
178
  hash = { "abcxyz" => "abcxyz", # 0-based
167
179
  "abc'xyz" => "abcxyz",
168
180
  'abc"xyz' => "abcxyz",
@@ -173,25 +185,30 @@ p out
173
185
  }
174
186
  hash.each_pair.with_index do |keys, i|
175
187
  real, fixed = *keys
176
- result = @blog.make_slug(real)[1][5..-1] # weird? returns [99, "0099-whatever"]
188
+ meta = OpenStruct.new
189
+ meta.title = real
190
+ meta.num = 99
191
+ result = @blog.make_slug(meta)[5..-1] # Skip num (test_013...)
177
192
  assert result == fixed, "Case #{i}: expected: #{fixed.inspect}, got #{result.inspect}"
178
193
  end
179
194
  end
180
195
 
181
196
  def test_014_remove_nonexistent_post!
197
+ # puts __method__
182
198
  @blog.change_view("alpha_view")
183
- flag, out = cmd_remove_post(99)
199
+ flag, out = cmd_remove_post(99, true)
184
200
  assert out =~ /Post 99 not found/, "Expected error about nonexistent post, got: #{out}"
185
201
  end
186
202
 
187
203
  def test_015_kill_multiple_posts!
204
+ # puts __method__
188
205
  @blog.change_view("alpha_view")
189
- flag, out = cmd_list_posts(nil)
206
+ flag, out = cmd_list_posts(nil, true)
190
207
  before = out.split("\n").length
191
- flag, out = cmd_kill("1 2 7")
192
- flag, out = cmd_list_posts(nil)
208
+ flag, out = cmd_kill("1 2 7", true)
209
+ flag, out = cmd_list_posts(nil, true)
193
210
  after = out.split("\n").length
194
- expecting = before - 2
211
+ expecting = before - 3
195
212
  assert after == expecting, "list_posts saw #{before} posts, now #{after} (not #{expecting})"
196
213
  @blog.undelete_post(1)
197
214
  @blog.undelete_post(2)
@@ -201,6 +218,7 @@ p out
201
218
  if File.exist?("testing.publish")
202
219
 
203
220
  def test_016_can_publish
221
+ # puts __method__
204
222
  x = OpenStruct.new
205
223
  x.user, x.server, x.docroot, x.docroot, x.path, x.proto =
206
224
  "root", "rubyhacker.com", "/var/www", "whatever", "http"
@@ -212,6 +230,7 @@ if File.exist?("testing.publish")
212
230
  end
213
231
 
214
232
  def test_017_cannot_publish_wrong_user
233
+ # puts __method__
215
234
  x = OpenStruct.new
216
235
  x.user, x.server, x.docroot, x.docroot, x.path, x.proto =
217
236
  "bad_user", "rubyhacker.com", "/var/www", "whatever", "http"
@@ -221,6 +240,7 @@ if File.exist?("testing.publish")
221
240
  end
222
241
 
223
242
  def test_018_cannot_publish_bad_server
243
+ # puts __method__
224
244
  x = OpenStruct.new
225
245
  x.user, x.server, x.docroot, x.docroot, x.path, x.proto =
226
246
  "root", "nonexistent123.com", "/var/www", "whatever", "http"
@@ -232,10 +252,12 @@ if File.exist?("testing.publish")
232
252
  end # conditional tests
233
253
 
234
254
  def test_019_exception_existing_blog
255
+ # puts __method__
235
256
  assert_raises(BlogAlreadyExists) { RuneBlog.create_new_blog }
236
257
  end
237
258
 
238
259
  def test_020_exception_missing_blog_accessor
260
+ # puts __method__
239
261
  save = RuneBlog.blog
240
262
  RuneBlog.blog = nil
241
263
  assert_raises(NoBlogAccessor) { RuneBlog::Post.load(1) }
@@ -243,24 +265,31 @@ end # conditional tests
243
265
  end
244
266
 
245
267
  def test_021_exception_cant_assign_view
268
+ # puts __method__
246
269
  assert_raises(CantAssignView) { @blog.view = 99 }
247
270
  end
248
271
 
249
272
  def test_022_exception_no_such_view
273
+ # puts __method__
250
274
  assert_raises(NoSuchView) { @blog.view = 'not_a_view_name' }
251
275
  end
252
276
 
253
277
  def test_023_exception_view_already_exists
278
+ # puts __method__
254
279
  assert_raises(ViewAlreadyExists) { @blog.create_view('alpha_view') }
255
280
  end
256
281
 
257
282
  def xtest_024_exception_livetext_error # FIXME Doesn't work! Change Livetext
283
+ # puts __method__
258
284
  testfile = "testfile.lt3"
259
285
  path = @blog.root + "/src/" + testfile
260
286
  cmd = "echo .no_such_command > #{path}"
261
287
  system(cmd)
262
- system("ls -l #{path}")
288
+ # system("ls -l #{path}")
289
+ save = STDERR
290
+ STDERR.reopen("/dev/null")
263
291
  assert_raises(LivetextError) { @blog.process_post(testfile) }
292
+ STDERR.reopen(save)
264
293
  File.rm(path)
265
294
  end
266
295
 
data/test/make_blog.rb CHANGED
@@ -1,13 +1,16 @@
1
1
  $LOAD_PATH << "."
2
2
 
3
3
  require 'global'
4
- require 'rubytext'
4
+ # require 'rubytext'
5
5
  require 'repl'
6
6
 
7
+ def debug(str)
8
+ STDERR.puts str
9
+ end
10
+
7
11
  def make_post(x, title)
8
12
  meta = OpenStruct.new
9
- meta.title = title
10
- num = x.create_new_post(meta, true)
13
+ num = x.create_new_post(title, true)
11
14
  num
12
15
  end
13
16
 
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.1.12
4
+ version: 0.1.13
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-12-22 00:00:00.000000000 Z
11
+ date: 2018-12-24 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: livetext