retter 0.2.0 → 0.2.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,13 +1,15 @@
1
1
  # coding: utf-8
2
2
 
3
- class Retter::Pages::Profile
4
- include Retter::Page
3
+ module Retter
4
+ class Pages::Profile
5
+ include Page
5
6
 
6
- def pathname
7
- config.profile_file
8
- end
7
+ def pathname
8
+ config.retter_home.join('profile.html')
9
+ end
9
10
 
10
- def part_layout_pathname
11
- config.profile_layout_file
11
+ def part_layout_pathname
12
+ Pages.find_layout_path('profile')
13
+ end
12
14
  end
13
15
  end
data/lib/retter/pages.rb CHANGED
@@ -1,30 +1,49 @@
1
1
  # coding: utf-8
2
2
 
3
3
  module Retter
4
- class Pages
5
- require 'retter/pages/index'
6
- require 'retter/pages/profile'
7
- require 'retter/pages/archive'
8
- require 'retter/pages/feed'
9
- require 'retter/pages/entry'
10
- require 'retter/pages/article'
4
+ class Pages # XXX 名前が気に食わない
5
+ autoload :Index, 'retter/pages/index'
6
+ autoload :Profile, 'retter/pages/profile'
7
+ autoload :Entries, 'retter/pages/entries'
8
+ autoload :Feed, 'retter/pages/feed'
9
+ autoload :Entry, 'retter/pages/entry'
10
+ autoload :Article, 'retter/pages/article'
11
11
 
12
- include Retter::Stationery
12
+ include Stationery
13
+ extend Configurable
13
14
 
14
- attr_reader :index, :profile, :archive, :feed, :singleton_pages
15
+ configurable :layouts_dir, :entries_dir, :allow_binding
16
+
17
+ class << self
18
+ def find_layout_path(name)
19
+ detected = Dir.glob(layouts_dir.join("#{name}.*.*")).first
20
+
21
+ Pathname.new(detected)
22
+ end
23
+
24
+ def layout_file
25
+ @layout_file ||= find_layout_path('retter')
26
+ end
27
+
28
+ def entry_file(date)
29
+ entries_dir.join date.strftime('%Y%m%d.html')
30
+ end
31
+
32
+ def entry_dir(date)
33
+ entries_dir.join date.strftime('%Y%m%d')
34
+ end
35
+ end
15
36
 
16
37
  def initialize
17
- @singleton_pages = [Index, Profile, Archive, Feed].map(&:new)
18
- @index, @profile, @archive, @feed = *singleton_pages
38
+ load_singleton_pages
19
39
  end
20
40
 
21
41
  def bind!
22
42
  print_entries
23
43
 
24
- singleton_pages.each(&:print)
44
+ @singleton_pages.each(&:print)
25
45
  end
26
46
 
27
-
28
47
  def print_entries
29
48
  entries.each do |entry|
30
49
  entry_page = Entry.new(entry)
@@ -36,5 +55,23 @@ module Retter
36
55
  end
37
56
  end
38
57
  end
58
+
59
+ private
60
+
61
+ def load_singleton_pages
62
+ @singleton_pages = available_singleton_page_names.map {|name|
63
+ Pages.const_get(name.capitalize).new
64
+ }
65
+ end
66
+
67
+ def available_singleton_page_names
68
+ availables = [:index]
69
+
70
+ unless allow_binding == :none
71
+ availables += allow_binding || [:profile, :entries, :feed]
72
+ end
73
+
74
+ availables.map(&:downcase).uniq
75
+ end
39
76
  end
40
77
  end
@@ -2,21 +2,21 @@
2
2
 
3
3
  module Retter
4
4
  class Preprint
5
- include Retter::Page
5
+ include Page
6
6
 
7
7
  def pathname
8
8
  config.retter_home.join '.preview.html'
9
9
  end
10
10
 
11
11
  def part_layout_pathname
12
- config.entry_layout_file
12
+ Pages.find_layout_path('entry')
13
13
  end
14
14
 
15
15
  def print(entry)
16
- part = Haml::Engine.new(
17
- part_layout_pathname.read,
16
+ part = Tilt.new(
17
+ part_layout_pathname.to_path,
18
18
  ugly: true,
19
- filename: part_layout_pathname.to_s
19
+ filename: part_layout_pathname.to_path
20
20
  ).render(view_scope, entry: entry)
21
21
 
22
22
  print_with_layout part
@@ -3,7 +3,6 @@
3
3
  require 'redcarpet'
4
4
  require 'pygments'
5
5
  require 'coderay'
6
- require 'digest/sha1'
7
6
  require 'set'
8
7
 
9
8
  module Retter
@@ -4,11 +4,12 @@ require 'grit'
4
4
 
5
5
  module Retter
6
6
  class Repository
7
- include Retter::Stationery
7
+ def self.open(working_dir, &block)
8
+ new(working_dir).open(&block)
9
+ end
8
10
 
9
- def initialize
10
- working_dir = config.retter_home.to_s
11
- @repo = Grit::Repo.new(working_dir)
11
+ def initialize(working_dir)
12
+ @repo = Grit::Repo.new(working_dir.to_s)
12
13
  end
13
14
 
14
15
  def open
@@ -1,3 +1,3 @@
1
1
  module Retter
2
- VERSION = '0.2.0'
2
+ VERSION = '0.2.1'
3
3
  end
data/lib/retter.rb CHANGED
@@ -7,7 +7,7 @@ module Retter
7
7
  class RetterError < RuntimeError; end
8
8
 
9
9
  module Stationery
10
- [:config, :entries, :preprint, :pages, :repository].each do |meth|
10
+ [:config, :entries].each do |meth|
11
11
  define_method meth do
12
12
  Retter.send meth
13
13
  end
@@ -15,38 +15,34 @@ module Retter
15
15
  end
16
16
 
17
17
  class << self
18
- def load_config(env)
19
- @config = Config.new(env)
20
- end
18
+ attr_reader :config
21
19
 
22
- def config
23
- @config
20
+ def load(env)
21
+ @config = Config.new(env)
24
22
  end
25
23
 
26
- def reset_entries!
24
+ def reset!
27
25
  @entries = nil
28
26
  end
29
27
 
30
- singletons = [:entries, :preprint, :pages, :repository]
31
- singletons.each do |sym|
32
- define_method sym do
33
- eval "@#{sym} ||= #{sym.capitalize}.new"
34
- end
28
+ def entries
29
+ @entries ||= Entries.new
35
30
  end
36
31
  end
37
32
 
38
- autoload :Generator, 'retter/generator'
39
-
40
- autoload :VERSION, 'retter/version'
41
- autoload :Config, 'retter/config'
42
- autoload :Renderers, 'retter/renderers'
43
- autoload :Entry, 'retter/entry'
44
- autoload :Entries, 'retter/entries'
45
- autoload :Page, 'retter/page'
46
- autoload :Pages, 'retter/pages'
47
- autoload :Preprint, 'retter/preprint'
48
- autoload :Repository, 'retter/repository'
49
- autoload :Command, 'retter/command'
33
+ autoload :Generator, 'retter/generator'
34
+
35
+ autoload :VERSION, 'retter/version'
36
+ autoload :Configurable, 'retter/configurable'
37
+ autoload :Config, 'retter/config'
38
+ autoload :Renderers, 'retter/renderers'
39
+ autoload :Entry, 'retter/entry'
40
+ autoload :Entries, 'retter/entries'
41
+ autoload :Page, 'retter/page'
42
+ autoload :Pages, 'retter/pages'
43
+ autoload :Preprint, 'retter/preprint'
44
+ autoload :Repository, 'retter/repository'
45
+ autoload :Command, 'retter/command'
50
46
  end
51
47
 
52
48
  require 'date'
data/retter.gemspec CHANGED
@@ -17,7 +17,7 @@ Gem::Specification.new do |s|
17
17
 
18
18
  Pygments syntax highlight is now available.
19
19
  To use, add a following line to Retterfile.
20
-
20
+
21
21
  ```ruby
22
22
  renderer Retter::Renderers::PygmentsRenderer
23
23
  ```
@@ -36,8 +36,10 @@ Gem::Specification.new do |s|
36
36
  s.add_runtime_dependency 'nokogiri', ['>= 1.5.0']
37
37
  s.add_runtime_dependency 'launchy', ['>= 2.0.5']
38
38
  s.add_runtime_dependency 'haml', ['>= 3.1.3']
39
+ s.add_runtime_dependency 'tilt', ['>= 1.1.3']
39
40
  s.add_runtime_dependency 'bundler', ['>= 1.0']
40
41
  s.add_runtime_dependency 'grit', ['>= 2.4.1']
42
+ s.add_runtime_dependency 'chronic', ['>= 0.6.7']
41
43
  s.add_runtime_dependency 'activesupport', ['>= 3.1.0']
42
44
 
43
45
  # XXX for ActiveSupport dependency
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ File.open(ARGV.first, 'w') {|f| f.puts 'written' }
@@ -4,7 +4,7 @@ require 'spec_helper'
4
4
 
5
5
  describe 'Retter::Command#callback', clean: :all do
6
6
  before do
7
- retter_config.after(:edit) { commit }
7
+ Retter.config.after(:edit) { commit }
8
8
 
9
9
  command.stub!(:options) { {after: :edit} }
10
10
  end
@@ -4,7 +4,7 @@ require 'spec_helper'
4
4
  require 'grit'
5
5
 
6
6
  describe 'Retter::Command#commit', clean: :all do
7
- let(:repo) { Grit::Repo.new(retter_config.retter_home.to_s) }
7
+ let(:repo) { Grit::Repo.new(Retter.config.retter_home) }
8
8
  let(:article) { '今日の記事' }
9
9
 
10
10
  before do
@@ -12,7 +12,7 @@ describe 'Retter::Command#commit', clean: :all do
12
12
  wip_file.open('w') {|f| f.puts article }
13
13
  command.rebind
14
14
 
15
- Grit::Repo.init retter_config.retter_home.to_s
15
+ Grit::Repo.init Retter.config.retter_home.to_path
16
16
  end
17
17
 
18
18
  context 'with no options' do
@@ -40,7 +40,7 @@ describe 'Retter::Command#edit', clean: :all do
40
40
  it { wip_file.should_not written }
41
41
 
42
42
  describe 'date file' do
43
- subject { retter_config.retter_file(date) }
43
+ subject { Retter.entries.retter_file(date) }
44
44
 
45
45
  it { should written }
46
46
  end
@@ -56,7 +56,7 @@ describe 'Retter::Command#edit', clean: :all do
56
56
  describe 'target date file' do
57
57
  let(:one_day_ago) { Date.parse('2011/04/01') }
58
58
 
59
- subject { retter_config.retter_file(one_day_ago) }
59
+ subject { Retter.entries.retter_file(one_day_ago) }
60
60
 
61
61
  it { should written }
62
62
  end
@@ -72,7 +72,7 @@ describe 'Retter::Command#edit', clean: :all do
72
72
  describe 'target date file' do
73
73
  let(:yesterday) { Date.parse('2011/04/01') }
74
74
 
75
- subject { retter_config.retter_file(yesterday) }
75
+ subject { Retter.entries.retter_file(yesterday) }
76
76
 
77
77
  it { should written }
78
78
  end
@@ -82,13 +82,15 @@ describe 'Retter::Command#edit', clean: :all do
82
82
  let(:a_day) { Date.parse('20110401') }
83
83
 
84
84
  before do
85
- FileUtils.touch retter_config.retter_file(a_day)
85
+ FileUtils.touch Retter.entries.retter_file(a_day)
86
+
87
+ Retter.reset! # XXX
86
88
 
87
89
  command.edit '20110401.md'
88
90
  end
89
91
 
90
92
  describe 'target date file' do
91
- subject { retter_config.retter_file(a_day) }
93
+ subject { Retter.entries.retter_file(a_day) }
92
94
 
93
95
  it { should written }
94
96
  end
@@ -102,13 +104,13 @@ describe 'Retter::Command#edit', clean: :all do
102
104
 
103
105
  context 'with filename (today.md) option' do
104
106
  before do
105
- FileUtils.touch retter_config.wip_file.to_s
107
+ FileUtils.touch Retter.config.wip_file.to_path
106
108
 
107
109
  command.edit 'today.md'
108
110
  end
109
111
 
110
112
  describe 'target file' do
111
- subject { retter_config.wip_file }
113
+ subject { Retter.config.wip_file }
112
114
 
113
115
  it { should written }
114
116
  end
@@ -5,7 +5,7 @@ require 'spec_helper'
5
5
  describe 'Retter::Command#invoke_after', clean: :all do
6
6
  context 'invoke with proc' do
7
7
  before do
8
- retter_config.after(:edit) { commit }
8
+ Retter.config.after(:edit) { commit }
9
9
  end
10
10
 
11
11
  specify 'callback should called' do
@@ -17,7 +17,7 @@ describe 'Retter::Command#invoke_after', clean: :all do
17
17
 
18
18
  context 'invoke with symbol' do
19
19
  before do
20
- retter_config.after(:edit, :commit)
20
+ Retter.config.after(:edit, :commit)
21
21
  end
22
22
 
23
23
  specify 'callback should called' do
@@ -5,7 +5,7 @@ require 'spec_helper'
5
5
  describe 'Retter::Command#list', clean: :all do
6
6
  context 'happy case' do
7
7
  before do
8
- retter_config.retter_file(Date.parse('20110101')).open('w') do |f|
8
+ Retter.entries.retter_file(Date.parse('20110101')).open('w') do |f|
9
9
  f.puts <<-EOM
10
10
  # 朝11時
11
11
 
@@ -17,7 +17,7 @@ describe 'Retter::Command#list', clean: :all do
17
17
  EOM
18
18
  end
19
19
 
20
- retter_config.retter_file(Date.parse('20110222')).open('w') do |f|
20
+ Retter.entries.retter_file(Date.parse('20110222')).open('w') do |f|
21
21
  f.puts <<-EOM
22
22
  # 朝11時30分
23
23
 
@@ -28,6 +28,8 @@ describe 'Retter::Command#list', clean: :all do
28
28
  おやすみなさい
29
29
  EOM
30
30
  end
31
+
32
+ Retter.reset! # XXX
31
33
  end
32
34
 
33
35
  subject { capture(:stdout) { command.list }.split(/\n+/) }
@@ -5,7 +5,7 @@ require 'launchy'
5
5
 
6
6
  describe 'Retter::Command#open', clean: :all do
7
7
  specify 'should be open application' do
8
- Launchy.should_receive(:open).with(retter_config.index_file.to_s)
8
+ Launchy.should_receive(:open).with(Retter.config.retter_home.join('index.html').to_path)
9
9
 
10
10
  command.open
11
11
  end
@@ -5,7 +5,7 @@ require 'launchy'
5
5
 
6
6
  describe 'Retter::Command#preview', clean: :all do
7
7
  def preview_html
8
- retter_config.retter_home.join('.preview.html').read
8
+ Retter.config.retter_home.join('.preview.html').read
9
9
  end
10
10
 
11
11
  before do
@@ -26,7 +26,7 @@ describe 'Retter::Command#preview', clean: :all do
26
26
 
27
27
  context 'with date option' do
28
28
  let(:date_str) { '20110101' }
29
- let(:date_file) { retter_config.retter_file(Date.parse(date_str)) }
29
+ let(:date_file) { Retter.entries.retter_file(Date.parse(date_str)) }
30
30
 
31
31
  before do
32
32
  wip_file.open('w') {|f| f.puts 'w00t!' }
@@ -6,8 +6,8 @@ describe 'Retter::Command#rebind', clean: :all do
6
6
  context 'first post' do
7
7
  let(:date_str) { '20110101' }
8
8
  let(:date) { Date.parse(date_str) }
9
- let(:date_file) { retter_config.retter_file(date) }
10
- let(:date_html) { retter_config.entry_file(date) }
9
+ let(:date_file) { Retter.entries.retter_file(date) }
10
+ let(:date_html) { Retter::Pages.entry_file(date) }
11
11
  let(:article) { <<-EOM }
12
12
  # 朝11時
13
13
 
@@ -35,7 +35,7 @@ describe 'Retter::Command#rebind', clean: :all do
35
35
  end
36
36
 
37
37
  describe 'index.html' do
38
- let(:index_html) { retter_config.index_file.read }
38
+ let(:index_html) { Retter.config.retter_home.join('index.html').read }
39
39
 
40
40
  it { texts_of(index_html, 'article p').should include('おはようございます') }
41
41
  it { texts_of(index_html, 'article h1.date').should == %w(2011-01-01) }
@@ -43,14 +43,14 @@ describe 'Retter::Command#rebind', clean: :all do
43
43
  end
44
44
 
45
45
  describe 'entries.html' do
46
- let(:entries_html) { retter_config.entries_file.read }
46
+ let(:entries_html) { Retter.config.retter_home.join('entries.html').read }
47
47
 
48
48
  it { texts_of(entries_html, 'a.entry').first.should == '2011-01-01' }
49
49
  it { texts_of(entries_html, 'a.title').should == %w(朝11時 夜1時) }
50
50
  end
51
51
 
52
52
  describe 'entry.html' do
53
- let(:entry_html) { retter_config.entry_file(date).read }
53
+ let(:entry_html) { Retter::Pages.entry_file(date).read }
54
54
 
55
55
  it { texts_of(entry_html, 'article p').should == %w(おはようございます おやすみなさい) }
56
56
  it { texts_of(entry_html, 'article h1.date').should == %w(2011-01-01) }
@@ -58,7 +58,7 @@ describe 'Retter::Command#rebind', clean: :all do
58
58
  end
59
59
 
60
60
  describe 'entry part(first)' do
61
- let(:part_html) { retter_config.entry_dir(date).join('a0.html').read }
61
+ let(:part_html) { Retter::Pages.entry_dir(date).join('a0.html').read }
62
62
 
63
63
  describe 'body' do
64
64
  subject { texts_of(part_html, 'article p') }
@@ -82,7 +82,7 @@ describe 'Retter::Command#rebind', clean: :all do
82
82
  end
83
83
 
84
84
  describe 'entry part(last)' do
85
- let(:part_html) { retter_config.entry_dir(date).join('a1.html').read }
85
+ let(:part_html) { Retter::Pages.entry_dir(date).join('a1.html').read }
86
86
 
87
87
  describe 'body' do
88
88
  subject { texts_of(part_html, 'article p') }
@@ -107,7 +107,7 @@ describe 'Retter::Command#rebind', clean: :all do
107
107
  end
108
108
 
109
109
  context 'includes code block' do
110
- let(:index_html) { retter_config.index_file.read }
110
+ let(:index_html) { Retter.config.retter_home.join('index.html').read }
111
111
  let(:article) { <<-EOM }
112
112
  # コードを書きました
113
113
 
@@ -122,7 +122,7 @@ sleep 1000
122
122
 
123
123
  context 'use Pygments' do
124
124
  before do
125
- retter_config.stub!(:renderer).and_return(Retter::Renderers::PygmentsRenderer)
125
+ Retter.config.renderer Retter::Renderers::PygmentsRenderer
126
126
  command.rebind
127
127
  end
128
128
 
@@ -133,7 +133,7 @@ sleep 1000
133
133
 
134
134
  context 'use CodeRay' do
135
135
  before do
136
- retter_config.stub!(:renderer).and_return(Retter::Renderers::CodeRayRenderer)
136
+ Retter.config.renderer Retter::Renderers::CodeRayRenderer
137
137
  command.rebind
138
138
  end
139
139
 
@@ -156,4 +156,44 @@ sleep 1000
156
156
  command.rebind
157
157
  end
158
158
  end
159
+
160
+ context 'skipping some singleton pages binding' do
161
+ let(:retter_home) { Retter.config.retter_home }
162
+ let(:index_html) { retter_home.join('index.html') }
163
+ let(:profile_html) { retter_home.join('profile.html') }
164
+ let(:entries_html) { retter_home.join('entries.html') }
165
+ let(:feed_file) { retter_home.join('feed.rss') }
166
+
167
+ before do
168
+ index_html.unlink
169
+
170
+ command.edit
171
+ end
172
+
173
+ context 'skipping all' do
174
+ before do
175
+ Retter::Pages.allow_binding :none
176
+
177
+ command.rebind
178
+ end
179
+
180
+ it { profile_html.should_not be_exist }
181
+ it { entries_html.should_not be_exist }
182
+ it { feed_file.should_not be_exist }
183
+ it { index_html.should be_exist }
184
+ end
185
+
186
+ context 'skipping only :feed' do
187
+ before do
188
+ Retter::Pages.allow_binding [:profile, :entries]
189
+
190
+ command.rebind
191
+ end
192
+
193
+ it { profile_html.should be_exist }
194
+ it { entries_html.should be_exist }
195
+ it { feed_file.should_not be_exist }
196
+ it { index_html.should be_exist }
197
+ end
198
+ end
159
199
  end
data/spec/spec_helper.rb CHANGED
@@ -1,9 +1,11 @@
1
1
  # coding: utf-8
2
2
 
3
3
  require 'tapp'
4
- require 'simplecov'
5
4
 
6
- SimpleCov.start
5
+ if ENV['COVERAGE']
6
+ require 'simplecov'
7
+ SimpleCov.start
8
+ end
7
9
 
8
10
  RETTER_ROOT = Pathname.new(File.dirname(__FILE__) + '/../').realpath
9
11
  require RETTER_ROOT.join('lib', 'retter')
@@ -14,8 +16,9 @@ RSpec.configure do |config|
14
16
  config.filter_run focus: true
15
17
  config.run_all_when_everything_filtered = true
16
18
 
17
- retter_home = RETTER_ROOT.join('tmp', 'test')
18
- skel = RETTER_ROOT.join('lib', 'retter', 'generator', 'skel')
19
+ retter_home = RETTER_ROOT.join('tmp/test')
20
+ skel = RETTER_ROOT.join('lib/retter/generator/skel')
21
+ fake_editor = RETTER_ROOT.join('spec/bin/fake_editor')
19
22
 
20
23
  config.before :each, clean: :all do
21
24
  FileUtils.cp_r skel, retter_home.dirname.join('test')
@@ -23,11 +26,13 @@ RSpec.configure do |config|
23
26
 
24
27
  config.after :each, clean: :all do
25
28
  FileUtils.rm_rf retter_home
26
- Retter.reset_entries!
29
+ Retter.reset!
27
30
  end
28
31
 
29
32
  config.before do
30
- Retter.stub!(:config) { retter_config }
33
+ env = {'EDITOR' => fake_editor.to_path, 'RETTER_HOME' => RETTER_ROOT.join('tmp', 'test').to_s}
34
+
35
+ Retter.load env
31
36
  end
32
37
 
33
38
  config.include ExampleGroupHelper
@@ -9,16 +9,8 @@ module ExampleGroupHelper
9
9
  @command ||= Retter::Command.new
10
10
  end
11
11
 
12
- def retter_config
13
- return @config if @config
14
-
15
- env = {'EDITOR' => 'echo written >', 'RETTER_HOME' => RETTER_ROOT.join('tmp', 'test').to_s}
16
-
17
- @config = Retter::Config.new(env)
18
- end
19
-
20
12
  def wip_file
21
- retter_config.wip_file
13
+ Retter.entries.wip_file
22
14
  end
23
15
  end
24
16