logi 0.1.0 → 0.1.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 3475cb97948ff33502fbd216c8724b9b3de00ae5
4
- data.tar.gz: 732a3c178a6ce76c9e53732046f0c2ee5282aa4c
3
+ metadata.gz: 5de594ac9c881a4153b5e2bc19dde37a01adb8dd
4
+ data.tar.gz: 8ec9ecf75ce2d0c4aff2e04d451519cd57788648
5
5
  SHA512:
6
- metadata.gz: 518489b42423a530f1c129c1bb0f59f61ebd6d90485b7b1459fb527503b630f37f7a8078530e41c78846fb71c08b601aa3ce685a23b9353fea10144921458e64
7
- data.tar.gz: 49ac258973c40a12737c0e47d4cf123aae429cc84ae3191988a0e3cebf43612dbd2fea9c5e4246a6bbfbe9b78a31289ab32dae11239f0925ce98556a0f12e54a
6
+ metadata.gz: 084251b20f1df902bc977d9e567989bc0d0831bb587942065f1ceca3a833971cfc56ec695ac48750b3ca38e4f9d665e537c2482f2edbc7110b7de850dcbf8e64
7
+ data.tar.gz: b063fdba5b23b23caeca987377980adb5b709ff9515156a891cc29101fb38011bb981b6b5558bcc06a2215df688182cffe704fba08d64cf9f420c72fa38c9b07
data/.gitignore CHANGED
@@ -1,2 +1,2 @@
1
- pkg
1
+ /pkg/
2
2
  *.rbc
@@ -0,0 +1,11 @@
1
+ before_install: 'git submodule update --init'
2
+ script: 'ruby -r bundler/setup -S rake test'
3
+
4
+ env:
5
+ - 'RBXOPT=-X19'
6
+
7
+ rvm:
8
+ - 1.9.3
9
+ - 2.0.0
10
+ - rbx-head
11
+ - jruby-head
@@ -0,0 +1,16 @@
1
+ # CHANGES
2
+
3
+ ## logi 0.1.1 -- 2013-09-30
4
+
5
+ * It would no longer give errors if layout is absent.
6
+ Instead, it would emit a warning and use an empty layout.
7
+ * It would now expand the root you're passing.
8
+ * All commands would now follow --quiet or --nocolor options.
9
+ * JRuby support is fixed. (IO.copy_stream cannot work on non-files
10
+ on JRuby)
11
+ * `logi -h` would now print the example site path.
12
+ * [logi-list] It would now sort the posts with links.
13
+
14
+ ## logi 0.1.0 -- 2013-09-20
15
+
16
+ * Birthday!
data/README.md CHANGED
@@ -24,13 +24,42 @@ Highly customizable static blog/wiki generator.
24
24
 
25
25
  ## REQUIREMENTS:
26
26
 
27
- * Tested with MRI (official CRuby) 2.0.0, Rubinius and JRuby.
27
+ * Ruby 1.9+ (Also tested with JRuby and Rubinius)
28
28
  * Tilt for built-in post/list generator: `gem install tilt`
29
+ * Kramdown for markdown generator: `gem install kramdown`
29
30
 
30
31
  ## INSTALLATION:
31
32
 
33
+ If you have Ruby installed, you could simply run:
34
+
32
35
  gem install logi
33
- gem install tilt # if you want to use built-in generators
36
+ gem install tilt # If you want to use built-in generators
37
+ gem install kramdown # If you want to use Markdown with tilt
38
+
39
+ If you need to install Ruby, first you should try the one provided
40
+ by your package manager.
41
+
42
+ For Arch Linux, run:
43
+
44
+ sudo pacman -Syu # Update packages list first
45
+ sudo pacman -S ruby
46
+
47
+ For Mac OS X, if you have Homebrew installed, run:
48
+
49
+ brew update # Update packages list first
50
+ brew install ruby --with-doc
51
+
52
+ For Windows, you might want to try [RubyInstaller][].
53
+
54
+ If your package manager does not yet provide Ruby 2.0,
55
+ you could try [ruby-install][] which could compile and
56
+ handle Ruby's own dependencies for you.
57
+
58
+ Or just [grab the source tarball][ruby-download] and install it manually.
59
+
60
+ [RubyInstaller]: http://rubyinstaller.org/
61
+ [ruby-install]: https://github.com/postmodern/ruby-install
62
+ [ruby-download]: https://www.ruby-lang.org/en/downloads/
34
63
 
35
64
  ## SYNOPSIS:
36
65
 
data/Rakefile CHANGED
@@ -1,24 +1,16 @@
1
- # encoding: utf-8
2
1
 
3
2
  begin
4
3
  require "#{dir = File.dirname(__FILE__)}/task/gemgem"
5
4
  rescue LoadError
6
- sh "git submodule update --init"
7
- exec Gem.ruby, "-S", "rake", *ARGV
5
+ sh 'git submodule update --init'
6
+ exec Gem.ruby, '-S', $PROGRAM_NAME, *ARGV
8
7
  end
9
8
 
10
- Gemgem.dir = dir
11
- ($LOAD_PATH << File.expand_path("#{Gemgem.dir}/lib")).uniq!
12
-
13
- desc 'Generate gemspec'
14
- task 'gem:spec' do
15
- Gemgem.spec = Gemgem.create do |s|
16
- require 'logi/version'
17
- s.name = 'logi'
18
- s.version = Logi::VERSION
19
- %w[].each{ |g| s.add_dependency(g) }
20
- %w[bacon muack tilt].each{ |g| s.add_development_dependency(g) }
21
- end
22
-
23
- Gemgem.write
9
+ Gemgem.init(dir) do |s|
10
+ require 'logi/version'
11
+ s.name = 'logi'
12
+ s.version = Logi::VERSION
13
+ %w[].each{ |g| s.add_dependency(g) }
14
+ %w[bacon muack
15
+ tilt kramdown].each{ |g| s.add_development_dependency(g) }
24
16
  end
data/TODO.md ADDED
@@ -0,0 +1,7 @@
1
+ # TODO
2
+
3
+ * blogger importer
4
+
5
+ xml.css('entry').select{ |n| n.css('id').text.include?('post') }
6
+
7
+ * md5 checksum
@@ -8,9 +8,9 @@
8
8
  <body>
9
9
  <h1>Posts listing</h1>
10
10
  <ul>
11
- <% @posts.each do |post| %>
11
+ <% @posts.each do |post| %>
12
12
  <li><a href="<%= post.link %>"><%= post.title %></a></li>
13
- <% end %>
13
+ <% end %>
14
14
  </ul>
15
15
  </body>
16
16
  </html>
@@ -11,7 +11,7 @@ class Logi
11
11
  end
12
12
 
13
13
  def make
14
- config.posts.each_value do |post|
14
+ config.posts.values.sort.each do |post|
15
15
  io = compiler.compile(post.command,
16
16
  config.post_path_for(post),
17
17
  config.layout_path_for(post))
@@ -0,0 +1,47 @@
1
+
2
+ class Logi; end
3
+ module Logi::Command
4
+ module_function
5
+ def check_argv path, layout
6
+ [check_path(path), check_path(layout)]
7
+ end
8
+
9
+ def check_path path
10
+ if File.exist?(path)
11
+ path
12
+ else
13
+ require 'logi/logger'
14
+ extend Logi::Logger
15
+ log red("ERROR: Post does not exist: #{cyan(strip_path(path))}")
16
+ exit(1)
17
+ end
18
+ end
19
+
20
+ def check_layout layout
21
+ if File.exist?(layout)
22
+ layout
23
+ else
24
+ require 'logi/default'
25
+ require 'logi/logger'
26
+ extend Logi::Logger
27
+ log red("WARN: Layout does not exist: #{cyan(strip_path(layout))}")
28
+ Logi::Default.empty_layout
29
+ end
30
+ end
31
+
32
+ def options
33
+ @options ||= {:quiet => tribool(ENV['LOGI_QUIET' ]),
34
+ :nocolor => tribool(ENV['LOGI_NOCOLOR'])}
35
+ end
36
+
37
+ def tribool value
38
+ case value
39
+ when 'true'
40
+ true
41
+ when 'false'
42
+ false
43
+ else
44
+ nil
45
+ end
46
+ end
47
+ end
@@ -1,10 +1,18 @@
1
1
 
2
+ require 'logi/command'
3
+
2
4
  require 'tilt'
3
5
 
4
6
  class Logi ; end
5
7
  module Logi::Command; end
6
8
  module Logi::Command::List
7
- Post = Struct.new(:link, :title)
9
+ extend Logi::Command
10
+
11
+ class Post < Struct.new(:link, :title)
12
+ def <=> that
13
+ link <=> that.link
14
+ end
15
+ end
8
16
 
9
17
  module_function
10
18
  def run argv
@@ -13,7 +21,7 @@ module Logi::Command::List
13
21
  @posts = Dir["#{dir}/**/*.*"].map{ |post|
14
22
  name = post.sub("#{dir}/", '')
15
23
  Post.new(name.sub(/\..+$/, '.html'), name.sub(/\..+$/, ''))
16
- }
17
- puts Tilt.new(layout).render(self)
24
+ }.sort
25
+ puts Tilt.new(check_layout(layout)).render(self)
18
26
  end
19
27
  end
@@ -1,12 +1,16 @@
1
1
 
2
+ require 'logi/command'
3
+
2
4
  require 'tilt'
3
5
 
4
6
  class Logi ; end
5
7
  module Logi::Command; end
6
8
  module Logi::Command::Post
9
+ extend Logi::Command
10
+
7
11
  module_function
8
12
  def run argv
9
- path, layout = argv
13
+ path, layout = check_argv(*argv)
10
14
  puts Tilt.new(layout).render{Tilt[path].new{$stdin.read}.render}
11
15
  end
12
16
  end
@@ -13,22 +13,31 @@ class Logi::Compiler
13
13
  end
14
14
 
15
15
  def compile command, path, layout
16
- log_compile(command, path, layout)
17
16
  wiki = IO.popen("logi-wiki #{path}", 'r')
18
17
  out = IO.popen("logi-#{command} #{path} #{layout}", 'r+')
19
- IO.copy_stream(wiki, out)
18
+ copy_stream(wiki, out)
20
19
  out.close_write
20
+ log_compile(command, path, layout) unless out.eof?
21
21
  out
22
22
  end
23
23
 
24
24
  def write output, out
25
+ return if out.eof?
25
26
  log_write(output)
26
27
  FileUtils.mkdir_p(File.dirname(output))
27
- IO.copy_stream(out, output)
28
+ copy_stream(out, output)
28
29
  ensure
29
30
  out.close
30
31
  end
31
32
 
33
+ def copy_stream from, to
34
+ IO.copy_stream(from, to)
35
+ rescue TypeError # JRuby can only copy from file to file
36
+ to.write(from.read(8192)) until from.eof?
37
+ ensure
38
+ from.close
39
+ end
40
+
32
41
  private
33
42
  def log_compile command, path, layout
34
43
  w = red('logi-wiki')
@@ -1,18 +1,10 @@
1
1
 
2
+ require 'logi/default'
2
3
  require 'logi/loader'
3
4
 
4
5
  class Logi; end
5
6
  class Logi::Config < Struct.new(:post_path, :layout_path,
6
7
  :output_path, :default_layout)
7
- def self.default_root_path ; '.' ; end
8
- def self.default_post_path ; 'post' ; end
9
- def self.default_layout_path; 'layout'; end
10
- def self.default_output_path; 'public'; end
11
- def self.default_command ; 'post' ; end
12
- def self.default_layout
13
- File.expand_path("#{__dir__}/layout/default.html.erb")
14
- end
15
-
16
8
  attr_reader :options
17
9
  attr_accessor
18
10
  def initialize options={}
@@ -25,7 +17,7 @@ class Logi::Config < Struct.new(:post_path, :layout_path,
25
17
  end
26
18
 
27
19
  def root
28
- options[:root] || self.class.default_root_path
20
+ File.expand_path(options[:root] || Logi::Default.default_root_path)
29
21
  end
30
22
 
31
23
  def path
@@ -40,7 +32,7 @@ class Logi::Config < Struct.new(:post_path, :layout_path,
40
32
  if layout = post.options[:layout] || default_layout
41
33
  "#{root}/#{layout_path}/#{layout}"
42
34
  else
43
- self.class.default_layout
35
+ Logi::Default.default_layout
44
36
  end
45
37
  end
46
38
 
@@ -49,14 +41,14 @@ class Logi::Config < Struct.new(:post_path, :layout_path,
49
41
  end
50
42
 
51
43
  def post_path
52
- super || self.class.default_post_path
44
+ super || Logi::Default.default_post_path
53
45
  end
54
46
 
55
47
  def layout_path
56
- super || self.class.default_layout_path
48
+ super || Logi::Default.default_layout_path
57
49
  end
58
50
 
59
51
  def output_path
60
- super || self.class.default_output_path
52
+ super || Logi::Default.default_output_path
61
53
  end
62
54
  end
@@ -0,0 +1,24 @@
1
+
2
+ class Logi; end
3
+ module Logi::Default
4
+ module_function
5
+ def default_root_path ; '.' ; end
6
+ def default_post_path ; 'post' ; end
7
+ def default_layout_path; 'layout'; end
8
+ def default_output_path; 'public'; end
9
+ def default_command ; 'post' ; end
10
+ def default_layout
11
+ File.expand_path("#{__dir__}/layout/default.html.erb")
12
+ end
13
+ def empty_layout
14
+ File.expand_path("#{__dir__}/layout/empty.html.erb")
15
+ end
16
+ def example_directory
17
+ File.expand_path("#{__dir__}/../../example")
18
+ end
19
+
20
+ # For Ruby 1.9-
21
+ def __dir__
22
+ File.dirname(__FILE__)
23
+ end unless respond_to?(:__dir__, true)
24
+ end
@@ -0,0 +1 @@
1
+ <%= yield %>
@@ -1,4 +1,5 @@
1
1
 
2
+ require 'logi/default'
2
3
  require 'logi/post'
3
4
 
4
5
  class Logi; end
@@ -14,7 +15,7 @@ class Logi::Loader
14
15
  Dir["#{prefix}/**/*.*"].each do |fullpath|
15
16
  path = fullpath.sub("#{prefix}/", '')
16
17
  config.posts[path] ||=
17
- Logi::Post.new(config.class.default_command, path, {}, nil)
18
+ Logi::Post.new(Logi::Default.default_command, path, {}, nil)
18
19
  end
19
20
  end
20
21
 
@@ -4,7 +4,7 @@ module Logi::Logger
4
4
  module_function
5
5
  def log msg
6
6
  return if options[:quiet]
7
- puts msg
7
+ $stderr.puts msg
8
8
  end
9
9
 
10
10
  def black text; color(30, text); end
@@ -18,7 +18,7 @@ module Logi::Logger
18
18
  def color rgb, text
19
19
  if nocolor = options[:nocolor]
20
20
  text
21
- elsif nocolor.nil? && !$stdout.tty? # auto-detect
21
+ elsif nocolor.nil? && !$stderr.tty? # auto-detect
22
22
  text
23
23
  else
24
24
  "\e[#{rgb}m#{text}\e[0m"
@@ -1,3 +1,7 @@
1
1
 
2
2
  class Logi; end
3
- Logi::Post = Struct.new(:command, :path, :options, :block)
3
+ class Logi::Post < Struct.new(:command, :path, :options, :block)
4
+ def <=> that
5
+ path <=> that.path
6
+ end
7
+ end
@@ -12,13 +12,15 @@ module Logi::Runner
12
12
  ['-h, --help' , 'Print this message' ],
13
13
  ['-v, --version' , 'Print the version' ],
14
14
  ['defaults:' , '' ],
15
- [' root directory' , Logi::Config. default_root_path],
16
- [' post directory' , Logi::Config. default_post_path],
17
- ['layout directory' , Logi::Config.default_layout_path],
18
- ['output directory' , Logi::Config.default_output_path],
19
- [' post command' , Logi::Config.default_command ],
15
+ [' root directory' , Logi::Default. default_root_path],
16
+ [' post directory' , Logi::Default. default_post_path],
17
+ ['layout directory' , Logi::Default.default_layout_path],
18
+ ['output directory' , Logi::Default.default_output_path],
19
+ [' post command' , Logi::Default.default_command ],
20
20
  [' layout file' , Logi::Logger.strip_path(
21
- Logi::Config.default_layout) ]]
21
+ Logi::Default.default_layout) ],
22
+ [' example site' , Logi::Logger.strip_path(
23
+ Logi::Default.example_directory)]]
22
24
  end
23
25
 
24
26
  def run argv=ARGV
@@ -32,19 +34,19 @@ module Logi::Runner
32
34
  until argv.empty?
33
35
  case arg = argv.shift
34
36
  when /^-c/, '--color'
35
- options[:nocolor] = false
37
+ ENV['LOGI_NOCOLOR'] = (options[:nocolor] = false).to_s
36
38
  parse_next(argv, arg)
37
39
 
38
40
  when /^-n/, '--no-color'
39
- options[:nocolor] = true
41
+ ENV['LOGI_NOCOLOR'] = (options[:nocolor] = true).to_s
40
42
  parse_next(argv, arg)
41
43
 
42
44
  when /^-V/, '--verbose'
43
- options[:quiet] = false
45
+ ENV['LOGI_QUIET'] = (options[:quiet] = false).to_s
44
46
  parse_next(argv, arg)
45
47
 
46
48
  when /^-q/, '--quiet'
47
- options[:quiet] = true
49
+ ENV['LOGI_QUIET'] = (options[:quiet] = true).to_s
48
50
  parse_next(argv, arg)
49
51
 
50
52
  when /^-h/, '--help'
@@ -52,8 +54,8 @@ module Logi::Runner
52
54
  exit
53
55
 
54
56
  when /^-v/, '--version'
55
- require 'rib/version'
56
- puts(Rib::VERSION)
57
+ require 'logi/version'
58
+ puts(Logi::VERSION)
57
59
  exit
58
60
 
59
61
  else
@@ -68,10 +70,10 @@ module Logi::Runner
68
70
  end
69
71
 
70
72
  def help
71
- require 'logi/config'
73
+ require 'logi/default'
72
74
  require 'logi/logger'
73
75
  optt = options.transpose
74
- maxn = optt.first.map(&:size).max
76
+ maxn = optt.first.map(&:size).max
75
77
  maxd = [optt.last .map(&:size).max, `tput cols`.to_i - maxn - 4].min
76
78
  "Usage: logi [OPTIONS] [PATH to logi root]\n" +
77
79
  options.map{ |(name, desc)|
@@ -0,0 +1,13 @@
1
+
2
+ require 'bacon'
3
+ require 'muack'
4
+ require 'logi'
5
+
6
+ Bacon.summary_on_exit
7
+ include Muack::API
8
+
9
+ module Kernel
10
+ def eq? rhs
11
+ self == rhs
12
+ end
13
+ end
@@ -1,4 +1,4 @@
1
1
 
2
2
  class Logi
3
- VERSION = '0.1.0'
3
+ VERSION = '0.1.1'
4
4
  end
@@ -1,13 +1,13 @@
1
1
  # -*- encoding: utf-8 -*-
2
- # stub: logi 0.1.0 ruby lib
2
+ # stub: logi 0.1.1 ruby lib
3
3
 
4
4
  Gem::Specification.new do |s|
5
5
  s.name = "logi"
6
- s.version = "0.1.0"
6
+ s.version = "0.1.1"
7
7
 
8
8
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
9
9
  s.authors = ["Lin Jen-Shin (godfat)"]
10
- s.date = "2013-09-20"
10
+ s.date = "2013-09-30"
11
11
  s.description = "Highly customizable static blog/wiki generator."
12
12
  s.email = ["godfat (XD) godfat.org"]
13
13
  s.executables = [
@@ -18,10 +18,13 @@ Gem::Specification.new do |s|
18
18
  s.files = [
19
19
  ".gitignore",
20
20
  ".gitmodules",
21
+ ".travis.yml",
22
+ "CHANGES.md",
21
23
  "Gemfile",
22
24
  "LICENSE",
23
25
  "README.md",
24
26
  "Rakefile",
27
+ "TODO.md",
25
28
  "bin/logi",
26
29
  "bin/logi-list",
27
30
  "bin/logi-post",
@@ -39,25 +42,31 @@ Gem::Specification.new do |s|
39
42
  "example/public/list.html",
40
43
  "example/public/misc/about.html",
41
44
  "lib/logi.rb",
45
+ "lib/logi/command.rb",
42
46
  "lib/logi/command/list.rb",
43
47
  "lib/logi/command/post.rb",
44
48
  "lib/logi/command/wiki.rb",
45
49
  "lib/logi/compiler.rb",
46
50
  "lib/logi/config.rb",
51
+ "lib/logi/default.rb",
47
52
  "lib/logi/layout/default.html.erb",
53
+ "lib/logi/layout/empty.html.erb",
48
54
  "lib/logi/loader.rb",
49
55
  "lib/logi/logger.rb",
50
56
  "lib/logi/post.rb",
51
57
  "lib/logi/runner.rb",
58
+ "lib/logi/test.rb",
52
59
  "lib/logi/version.rb",
53
60
  "logi.gemspec",
54
61
  "task/.gitignore",
55
- "task/gemgem.rb"]
62
+ "task/gemgem.rb",
63
+ "test/test_example.rb"]
56
64
  s.homepage = "https://github.com/godfat/logi"
57
65
  s.licenses = ["Apache License 2.0"]
58
66
  s.require_paths = ["lib"]
59
- s.rubygems_version = "2.1.4"
67
+ s.rubygems_version = "2.1.5"
60
68
  s.summary = "Highly customizable static blog/wiki generator."
69
+ s.test_files = ["test/test_example.rb"]
61
70
 
62
71
  if s.respond_to? :specification_version then
63
72
  s.specification_version = 4
@@ -66,14 +75,17 @@ Gem::Specification.new do |s|
66
75
  s.add_development_dependency(%q<bacon>, [">= 0"])
67
76
  s.add_development_dependency(%q<muack>, [">= 0"])
68
77
  s.add_development_dependency(%q<tilt>, [">= 0"])
78
+ s.add_development_dependency(%q<kramdown>, [">= 0"])
69
79
  else
70
80
  s.add_dependency(%q<bacon>, [">= 0"])
71
81
  s.add_dependency(%q<muack>, [">= 0"])
72
82
  s.add_dependency(%q<tilt>, [">= 0"])
83
+ s.add_dependency(%q<kramdown>, [">= 0"])
73
84
  end
74
85
  else
75
86
  s.add_dependency(%q<bacon>, [">= 0"])
76
87
  s.add_dependency(%q<muack>, [">= 0"])
77
88
  s.add_dependency(%q<tilt>, [">= 0"])
89
+ s.add_dependency(%q<kramdown>, [">= 0"])
78
90
  end
79
91
  end
@@ -1,14 +1,26 @@
1
1
 
2
- require 'pathname'
3
-
4
2
  module Gemgem
5
3
  class << self
6
- attr_accessor :dir, :spec
4
+ attr_accessor :dir, :spec, :spec_create
7
5
  end
8
6
 
9
7
  module_function
8
+ def gem_tag ; "#{spec.name}-#{spec.version}" ; end
9
+ def gem_path ; "#{pkg_dir}/#{gem_tag}.gem" ; end
10
+ def spec_path ; "#{dir}/#{spec.name}.gemspec" ; end
11
+ def pkg_dir ; "#{dir}/pkg" ; end
12
+ def escaped_dir; @escaped_dir ||= Regexp.escape(dir); end
13
+
14
+ def init dir, &block
15
+ self.dir = dir
16
+ $LOAD_PATH.unshift("#{dir}/lib")
17
+ ENV['RUBYLIB'] = "#{dir}/lib:#{ENV['RUBYLIB']}"
18
+ ENV['PATH'] = "#{dir}/bin:#{ENV['PATH']}"
19
+ self.spec_create = block
20
+ end
21
+
10
22
  def create
11
- yield(spec = Gem::Specification.new{ |s|
23
+ spec = Gem::Specification.new do |s|
12
24
  s.authors = ['Lin Jen-Shin (godfat)']
13
25
  s.email = ['godfat (XD) godfat.org']
14
26
 
@@ -16,163 +28,146 @@ module Gemgem
16
28
  s.summary = description.first
17
29
  s.license = readme['LICENSE'].sub(/.+\n\n/, '').lines.first.strip
18
30
 
19
- s.rubygems_version = Gem::VERSION
20
- s.date = Time.now.strftime('%Y-%m-%d')
21
- s.files = gem_files
22
- s.test_files = gem_files.grep(%r{^test/(.+?/)*test_.+?\.rb$})
23
- s.executables = Dir['bin/*'].map{ |f| File.basename(f) }
24
- s.require_paths = %w[lib]
25
- })
26
- spec.homepage ||= "https://github.com/godfat/#{spec.name}"
27
- spec
31
+ s.date = Time.now.strftime('%Y-%m-%d')
32
+ s.files = gem_files
33
+ s.test_files = test_files
34
+ s.executables = bin_files
35
+ end
36
+ spec_create.call(spec)
37
+ spec.homepage = "https://github.com/godfat/#{spec.name}"
38
+ self.spec = spec
28
39
  end
29
40
 
30
- def readme
31
- path = %w[README.md README].find{ |name|
32
- File.exist?("#{Gemgem.dir}/#{name}")
33
- }
34
- @readme ||=
35
- if path
36
- ps = "##{File.read(path)}".
37
- scan(/((#+)[^\n]+\n\n.+?(?=(\n\n\2[^#\n]+\n)|\Z))/m).map(&:first)
38
- ps.inject('HEADER' => ps.first){ |r, s, i|
39
- r[s[/\w+/]] = s
40
- r
41
- }
41
+ def write
42
+ File.open(spec_path, 'w'){ |f| f << split_lines(spec.to_ruby) }
43
+ end
44
+
45
+ def split_lines ruby
46
+ ruby.gsub(/(.+?)\s*=\s*\[(.+?)\]/){ |s|
47
+ if $2.index(',')
48
+ "#{$1} = [\n #{$2.split(',').map(&:strip).join(",\n ")}]"
42
49
  else
43
- {}
50
+ s
44
51
  end
52
+ }
45
53
  end
46
54
 
47
- def description
48
- @description ||= (readme['DESCRIPTION']||'').sub(/.+\n\n/, '').lines
55
+ def strip_path path
56
+ strip_home_path(strip_cwd_path(path))
49
57
  end
50
58
 
51
- def changes
52
- path = %w[CHANGES.md CHANGES].find{ |name|
53
- File.exist?("#{Gemgem.dir}/#{name}")
54
- }
55
- @changes ||=
56
- if path
57
- date = '\d+{4}\-\d+{2}\-\d{2}'
58
- File.read(path).match(
59
- /([^\n]+#{date}\n\n(.+?))(?=\n\n[^\n]+#{date}\n|\Z)/m)[1]
60
- else
61
- ''
62
- end
59
+ def strip_home_path path
60
+ path.sub(ENV['HOME'], '~')
63
61
  end
64
62
 
65
- def ann_md
66
- "#{readme['HEADER'].sub(/([\w\-]+)/, "[\\1](#{spec.homepage})")}\n\n" \
67
- "##{readme['DESCRIPTION'][/[^\n]+\n\n[^\n]+/]}\n\n" \
68
- "### CHANGES:\n\n" \
69
- "###{changes}\n\n" \
70
- "##{readme['INSTALLATION']}\n\n" +
71
- if readme['SYNOPSIS'] then "##{readme['SYNOPSIS'][/[^\n]+\n\n[^\n]+/]}"
72
- else '' end
63
+ def strip_cwd_path path
64
+ path.sub(Dir.pwd, '.')
73
65
  end
74
66
 
75
- def ann_html
76
- gem 'nokogiri'
77
- gem 'kramdown'
78
-
79
- IO.popen('kramdown', 'r+') do |md|
80
- md.puts Gemgem.ann_md
81
- md.close_write
82
- require 'nokogiri'
83
- html = Nokogiri::XML.parse("<gemgem>#{md.read}</gemgem>")
84
- html.css('*').each{ |n| n.delete('id') }
85
- html.root.children.to_html
86
- end
67
+ def git *args
68
+ `git --git-dir=#{dir}/.git #{args.join(' ')}`
87
69
  end
88
70
 
89
- def ann_email
90
- "#{readme['HEADER'].sub(/([\w\-]+)/, "\\1 <#{spec.homepage}>")}\n\n" \
91
- "#{readme['DESCRIPTION']}\n\n" \
92
- "#{readme['INSTALLATION']}\n\n" +
93
- if readme['SYNOPSIS'] then "##{readme['SYNOPSIS']}\n\n" else '' end +
94
- "## CHANGES:\n\n" \
95
- "##{changes}\n\n"
71
+ def sh_git *args
72
+ Rake.sh('git', "--git-dir=#{dir}/.git", *args)
96
73
  end
97
74
 
98
- def gem_tag
99
- "#{spec.name}-#{spec.version}"
75
+ def sh_gem *args
76
+ Rake.sh(Gem.ruby, '-S', 'gem', *args)
100
77
  end
101
78
 
102
- def write
103
- File.open("#{dir}/#{spec.name}.gemspec", 'w'){ |f|
104
- f << split_lines(spec.to_ruby) }
79
+ def glob path=dir
80
+ Dir.glob("#{path}/**/*", File::FNM_DOTMATCH)
105
81
  end
106
82
 
107
- def split_lines ruby
108
- ruby.gsub(/(.+?)\s*=\s*\[(.+?)\]/){ |s|
109
- if $2.index(',')
110
- "#{$1} = [\n #{$2.split(',').map(&:strip).join(",\n ")}]"
83
+ def readme
84
+ @readme ||=
85
+ if (path = "#{Gemgem.dir}/README.md") && File.exist?(path)
86
+ ps = "##{File.read(path)}".
87
+ scan(/((#+)[^\n]+\n\n.+?(?=(\n\n\2[^#\n]+\n)|\Z))/m).map(&:first)
88
+ ps.inject('HEADER' => ps.first){ |r, s, i|
89
+ r[s[/\w+/]] = s
90
+ r
91
+ }
111
92
  else
112
- s
93
+ {}
113
94
  end
114
- }
95
+ end
96
+
97
+ def description
98
+ # JRuby String#lines is returning an enumerator
99
+ @description ||= (readme['DESCRIPTION']||'').sub(/.+\n\n/, '').lines.to_a
115
100
  end
116
101
 
117
102
  def all_files
118
- @all_files ||= find_files(Pathname.new(dir)).map{ |file|
119
- if file.to_s =~ %r{\.git/|\.git$}
120
- nil
103
+ @all_files ||= fold_files(glob).sort
104
+ end
105
+
106
+ def fold_files files
107
+ files.inject([]){ |r, path|
108
+ if File.file?(path) && path !~ %r{/\.git(/|$)} &&
109
+ (rpath = path[%r{^#{escaped_dir}/(.*$)}, 1])
110
+ r << rpath
111
+ elsif File.symlink?(path) # walk into symlinks...
112
+ r.concat(fold_files(glob(File.expand_path(path,
113
+ File.readlink(path)))))
121
114
  else
122
- file.to_s
115
+ r
123
116
  end
124
- }.compact.sort
117
+ }
125
118
  end
126
119
 
127
120
  def gem_files
128
- @gem_files ||= all_files - ignored_files
121
+ @gem_files ||= all_files.reject{ |f|
122
+ f =~ ignored_pattern && !git_files.include?(f)
123
+ }
129
124
  end
130
125
 
131
- def ignored_files
132
- @ignored_file ||= all_files.select{ |path| ignore_patterns.find{ |ignore|
133
- path =~ ignore && !git_files.include?(path)}}
126
+ def test_files
127
+ @test_files ||= gem_files.grep(%r{^test/(.+?/)*test_.+?\.rb$})
128
+ end
129
+
130
+ def bin_files
131
+ @bin_files ||= gem_files.grep(%r{^bin/}).map{ |f| File.basename(f) }
134
132
  end
135
133
 
136
134
  def git_files
137
135
  @git_files ||= if File.exist?("#{dir}/.git")
138
- `git ls-files`.split("\n")
136
+ git('ls-files').split("\n")
139
137
  else
140
138
  []
141
139
  end
142
140
  end
143
141
 
144
- # protected
145
- def find_files path
146
- path.children.select(&:file?).map{|file| file.to_s[(dir.size+1)..-1]} +
147
- path.children.select(&:directory?).map{|dir| find_files(dir)}.flatten
142
+ def ignored_files
143
+ @ignored_files ||= all_files.grep(ignored_pattern)
148
144
  end
149
145
 
150
- def ignore_patterns
151
- @ignore_files ||= expand_patterns(
152
- gitignore.split("\n").reject{ |pattern|
153
- pattern.strip == ''
154
- }).map{ |pattern| %r{^([^/]+/)*?#{Regexp.escape(pattern)}(/[^/]+)*?$} }
146
+ def ignored_pattern
147
+ @ignored_pattern ||= Regexp.new(expand_patterns(gitignore).join('|'))
155
148
  end
156
149
 
157
150
  def expand_patterns pathes
158
- pathes.map{ |path|
159
- if path !~ /\*/
160
- path
161
- else
162
- expand_patterns(
163
- Dir[path] +
164
- Pathname.new(File.dirname(path)).children.select(&:directory?).
165
- map{ |prefix| "#{prefix}/#{File.basename(path)}" })
151
+ # http://git-scm.com/docs/gitignore
152
+ pathes.flat_map{ |path|
153
+ case path
154
+ when %r{\*}
155
+ Regexp.escape(path).gsub(/\\\*/, '[^/]*')
156
+ when %r{^/}
157
+ "^#{Regexp.escape(path[1..-1])}"
158
+ else # we didn't implement negative pattern for now
159
+ Regexp.escape(path)
166
160
  end
167
- }.flatten
161
+ }
168
162
  end
169
163
 
170
164
  def gitignore
171
- if File.exist?(path = "#{dir}/.gitignore")
172
- File.read(path)
173
- else
174
- ''
175
- end
165
+ @gitignore ||= if File.exist?(path = "#{dir}/.gitignore")
166
+ File.read(path).lines.
167
+ reject{ |l| l == /^\s*(#|\s+$)/ }.map(&:strip)
168
+ else
169
+ []
170
+ end
176
171
  end
177
172
  end
178
173
 
@@ -180,22 +175,37 @@ namespace :gem do
180
175
 
181
176
  desc 'Install gem'
182
177
  task :install => [:build] do
183
- sh("#{Gem.ruby} -S gem install pkg/#{Gemgem.gem_tag}.gem")
178
+ Gemgem.sh_gem('install', Gemgem.gem_path)
184
179
  end
185
180
 
186
181
  desc 'Build gem'
187
182
  task :build => [:spec] do
188
- sh("#{Gem.ruby} -S gem build #{Gemgem.spec.name}.gemspec")
189
- sh("mkdir -p pkg")
190
- sh("mv #{Gemgem.gem_tag}.gem pkg/")
183
+ require 'fileutils'
184
+ require 'rubygems/package'
185
+ gem = nil
186
+ Dir.chdir(Gemgem.dir) do
187
+ gem = Gem::Package.build(Gem::Specification.load(Gemgem.spec_path))
188
+ FileUtils.mkdir_p(Gemgem.pkg_dir)
189
+ FileUtils.mv(gem, Gemgem.pkg_dir) # gem is relative path, but might be ok
190
+ end
191
+ puts "\e[35mGem built: \e[33m" \
192
+ "#{Gemgem.strip_path("#{Gemgem.pkg_dir}/#{gem}")}\e[0m"
193
+ end
194
+
195
+ desc 'Generate gemspec'
196
+ task :spec do
197
+ Gemgem.create
198
+ Gemgem.write
191
199
  end
192
200
 
193
201
  desc 'Release gem'
194
202
  task :release => [:spec, :check, :build] do
195
- sh("git tag #{Gemgem.gem_tag}")
196
- sh("git push")
197
- sh("git push --tags")
198
- sh("#{Gem.ruby} -S gem push pkg/#{Gemgem.gem_tag}.gem")
203
+ Gemgem.module_eval do
204
+ sh_git('tag', Gemgem.gem_tag)
205
+ sh_git('push')
206
+ sh_git('push', '--tags')
207
+ sh_gem('push', Gemgem.gem_path)
208
+ end
199
209
  end
200
210
 
201
211
  task :check do
@@ -218,51 +228,37 @@ end # of gem namespace
218
228
 
219
229
  desc 'Run tests in memory'
220
230
  task :test do
231
+ next if Gemgem.test_files.empty?
232
+
221
233
  require 'bacon'
222
234
  Bacon.extend(Bacon::TestUnitOutput)
223
235
  Bacon.summary_on_exit
224
- $LOAD_PATH.unshift('lib')
225
- Dir['./test/**/test_*.rb'].each{ |file| require file[0..-4] }
226
- end
227
-
228
- desc 'Run tests with shell'
229
- task 'test:shell', :RUBY_OPTS do |t, args|
230
- files = Dir['test/**/test_*.rb'].join(' ')
231
-
232
- cmd = [Gem.ruby, args[:RUBY_OPTS],
233
- '-I', 'lib', '-S', 'bacon', '--quiet', files]
234
-
235
- sh(cmd.compact.join(' '))
236
+ Gemgem.test_files.each{ |file| require "#{Gemgem.dir}/#{file[0..-4]}" }
236
237
  end
237
238
 
238
- desc 'Generate ann markdown'
239
- task 'ann:md' => ['gem:spec'] do
240
- puts Gemgem.ann_md
241
- end
239
+ desc 'Remove ignored files'
240
+ task :clean => ['gem:spec'] do
241
+ next if Gemgem.ignored_files.empty?
242
242
 
243
- desc 'Generate ann html'
244
- task 'ann:html' => ['gem:spec'] do
245
- puts Gemgem.ann_html
246
- end
243
+ require 'fileutils'
244
+ trash = File.expand_path("~/.Trash/#{Gemgem.spec.name}")
245
+ puts "Move the following files into:" \
246
+ " \e[35m#{Gemgem.strip_path(trash)}\e[33m"
247
247
 
248
- desc 'Generate ann email'
249
- task 'ann:email' => ['gem:spec'] do
250
- puts Gemgem.ann_email
251
- end
248
+ Gemgem.ignored_files.each do |file|
249
+ from = "#{Gemgem.dir}/#{file}"
250
+ to = "#{trash}/#{File.dirname(file)}"
251
+ puts Gemgem.strip_path(from)
252
252
 
253
- desc 'Generate rdoc'
254
- task :doc => ['gem:spec'] do
255
- sh("yardoc -o rdoc --main README.md" \
256
- " --files #{Gemgem.spec.extra_rdoc_files.join(',')}")
257
- end
253
+ FileUtils.mkdir_p(to)
254
+ FileUtils.mv(from, to)
255
+ end
258
256
 
259
- desc 'Remove ignored files'
260
- task :clean => ['gem:spec'] do
261
- trash = "~/.Trash/#{Gemgem.spec.name}/"
262
- sh "mkdir -p #{trash}" unless File.exist?(File.expand_path(trash))
263
- Gemgem.ignored_files.each{ |file| sh "mv #{file} #{trash}" }
257
+ print "\e[0m"
264
258
  end
265
259
 
266
260
  task :default do
267
- puts `#{Gem.ruby} -S #{$PROGRAM_NAME} -T`
261
+ # Is there a reliable way to do this in the current process?
262
+ # It failed miserably before between Rake versions...
263
+ exec "#{Gem.ruby} -S #{$PROGRAM_NAME} -f #{Rake.application.rakefile} -T"
268
264
  end
@@ -0,0 +1,34 @@
1
+
2
+ require 'logi/test'
3
+
4
+ describe Logi do
5
+ logi = Logi.new(:root => "#{File.dirname(__FILE__)}/../example")
6
+ conf = logi.config
7
+ comp = logi.compiler
8
+
9
+ after do
10
+ Muack.verify
11
+ end
12
+
13
+ should 'make' do
14
+ logs = []
15
+ stub(comp).log(is_a(String)){ |msg| logs << "#{msg}\n" }
16
+
17
+ mock(comp).write(is_a(String), is_a(IO)){ |path, io|
18
+ File.read(path).should.eq(io.read)
19
+ }.times(conf.posts.size)
20
+
21
+ logi.make
22
+
23
+ logs.join.gsub(/\e\[\d+m/, '').should.eq <<-MESSAGE
24
+ logi-wiki ./example/post/hello.md |
25
+ logi-post ./example/post/hello.md ./example/layout/another.html.erb
26
+ logi-wiki ./example/post/index.md |
27
+ logi-post ./example/post/index.md ./example/layout/default.html.erb
28
+ logi-wiki ./example/post/list |
29
+ logi-list ./example/post/list ./example/layout/list.html.erb
30
+ logi-wiki ./example/post/misc/about.md |
31
+ logi-post ./example/post/misc/about.md ./example/layout/default.html.erb
32
+ MESSAGE
33
+ end
34
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: logi
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.1.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Lin Jen-Shin (godfat)
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2013-09-20 00:00:00.000000000 Z
11
+ date: 2013-09-30 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bacon
@@ -52,6 +52,20 @@ dependencies:
52
52
  - - '>='
53
53
  - !ruby/object:Gem::Version
54
54
  version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: kramdown
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - '>='
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - '>='
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
55
69
  description: Highly customizable static blog/wiki generator.
56
70
  email:
57
71
  - godfat (XD) godfat.org
@@ -65,10 +79,13 @@ extra_rdoc_files: []
65
79
  files:
66
80
  - .gitignore
67
81
  - .gitmodules
82
+ - .travis.yml
83
+ - CHANGES.md
68
84
  - Gemfile
69
85
  - LICENSE
70
86
  - README.md
71
87
  - Rakefile
88
+ - TODO.md
72
89
  - bin/logi
73
90
  - bin/logi-list
74
91
  - bin/logi-post
@@ -86,20 +103,25 @@ files:
86
103
  - example/public/list.html
87
104
  - example/public/misc/about.html
88
105
  - lib/logi.rb
106
+ - lib/logi/command.rb
89
107
  - lib/logi/command/list.rb
90
108
  - lib/logi/command/post.rb
91
109
  - lib/logi/command/wiki.rb
92
110
  - lib/logi/compiler.rb
93
111
  - lib/logi/config.rb
112
+ - lib/logi/default.rb
94
113
  - lib/logi/layout/default.html.erb
114
+ - lib/logi/layout/empty.html.erb
95
115
  - lib/logi/loader.rb
96
116
  - lib/logi/logger.rb
97
117
  - lib/logi/post.rb
98
118
  - lib/logi/runner.rb
119
+ - lib/logi/test.rb
99
120
  - lib/logi/version.rb
100
121
  - logi.gemspec
101
122
  - task/.gitignore
102
123
  - task/gemgem.rb
124
+ - test/test_example.rb
103
125
  homepage: https://github.com/godfat/logi
104
126
  licenses:
105
127
  - Apache License 2.0
@@ -120,8 +142,9 @@ required_rubygems_version: !ruby/object:Gem::Requirement
120
142
  version: '0'
121
143
  requirements: []
122
144
  rubyforge_project:
123
- rubygems_version: 2.1.4
145
+ rubygems_version: 2.1.5
124
146
  signing_key:
125
147
  specification_version: 4
126
148
  summary: Highly customizable static blog/wiki generator.
127
- test_files: []
149
+ test_files:
150
+ - test/test_example.rb