logi 0.1.0 → 0.1.1

Sign up to get free protection for your applications and to get access to all the features.
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