spandex 0.0.5 → 0.0.6

Sign up to get free protection for your applications and to get access to all the features.
@@ -17,7 +17,9 @@ module Spandex
17
17
 
18
18
  def get(path)
19
19
  path = Page.pathify path
20
- load(Page.file_from_path(path, @base_dir), path)
20
+ paths = Pathname.glob(File.join(@base_dir, "#{path}.*"))
21
+ file = paths.select{|path| Page.registered?(path)}.first
22
+ load(file, path)
21
23
  end
22
24
 
23
25
  def get_by_filename(filename)
@@ -34,18 +36,36 @@ module Spandex
34
36
  @pages.values
35
37
  end
36
38
 
37
- def all_articles
38
- all_pages
39
- .select{|page| page.date}
40
- .sort {|x, y| y.date <=> x.date }
39
+ def all_articles(include_drafts = false)
40
+ find_articles(:include_drafts => include_drafts)
41
41
  end
42
42
 
43
- def find_pages(conditions)
44
- find_inside(all_pages, conditions)
43
+ def find_articles(conditions)
44
+ #require dates - definition of articles
45
+ real_conds = {:has_date => true}
46
+
47
+ #by default, don't include drafts
48
+ real_conds[:draft] = false unless conditions[:include_drafts]
49
+ real_conds.merge!(conditions.reject{|k| k == :include_drafts})
50
+
51
+ #articles should be sorted by date descending
52
+ find_pages(real_conds).sort {|x, y| y.date <=> x.date }
45
53
  end
46
54
 
47
- def find_articles(conditions)
48
- find_inside(all_articles, conditions)
55
+ def find_pages(conditions)
56
+ output = all_pages
57
+ conditions.each do |k, v|
58
+ next if v.nil?
59
+ cond = case k
60
+ when :has_date then lambda {|p| p.date}
61
+ when :draft then lambda {|p| p.draft? == v}
62
+ when :tag then lambda {|p| p.tags.include?(v) }
63
+ when :title then lambda {|p| p.title.match(v)}
64
+ else lambda{|p| true}
65
+ end
66
+ output = output.select(&cond)
67
+ end
68
+ output
49
69
  end
50
70
 
51
71
  def tags
@@ -81,20 +101,5 @@ module Spandex
81
101
  page
82
102
  end
83
103
  end
84
-
85
- def find_inside(xs, conditions = {})
86
- output = xs
87
- conditions.each do |k, v|
88
- next unless v
89
- cond = case k
90
- when :tag then lambda {|p| p.tags.include?(v) }
91
- when :title then lambda {|p| p.title.match(v)}
92
- else lambda{|p| true}
93
- end
94
- output = output.select(&cond)
95
- end
96
- output
97
- end
98
-
99
104
  end
100
105
  end
data/lib/spandex/page.rb CHANGED
@@ -1,4 +1,5 @@
1
1
  require 'time'
2
+ require 'date'
2
3
  require 'pathname'
3
4
  require 'tilt'
4
5
  require 'atom'
@@ -17,12 +18,6 @@ module Spandex
17
18
  Page.new(path, content, pathname.extname, metadata, render_options)
18
19
  end
19
20
 
20
- def self.file_from_path(path, base_path)
21
- path = fix_path path
22
- paths = Pathname.glob(File.join(base_path, "#{path}.*"))
23
- pathname = paths.select{|path| registered?(path)}.first
24
- end
25
-
26
21
  def self.path_from_file(pathname, base_path)
27
22
  pathname = pathify pathname
28
23
  pathify pathname.relative_path_from(pathify(base_path)).sub_ext('')
@@ -33,13 +28,20 @@ module Spandex
33
28
  Tilt.registered?(pathname.extname.sub(/^./, ''))
34
29
  end
35
30
 
31
+ def metadata(*keys)
32
+ keys.each do |key|
33
+ key = key.to_s
34
+ return @metadata[key] if @metadata.has_key? key
35
+ end
36
+ nil
37
+ end
36
38
 
37
39
  def title
38
- metadata("title") || "(Unknown Title)"
40
+ metadata(:title) || "(Unknown Title)"
39
41
  end
40
42
 
41
43
  def date
42
- @date ||= metadata("date") ? DateTime.parse(metadata("date")) : nil
44
+ @date ||= metadata(:date) ? DateTime.parse(metadata(:date)) : nil
43
45
  end
44
46
 
45
47
  def body
@@ -47,7 +49,11 @@ module Spandex
47
49
  end
48
50
 
49
51
  def tags
50
- @tags ||= metadata("tags", "categories") ? metadata("tags", "categories").split(",").map{|tag| tag.strip} : []
52
+ @tags ||= metadata(:tags, :categories) ? metadata(:tags, :categories).split(",").map{|tag| tag.strip} : []
53
+ end
54
+
55
+ def draft?
56
+ metadata(:draft) ? true : false
51
57
  end
52
58
 
53
59
  def to_atom_entry(root)
@@ -74,13 +80,6 @@ module Spandex
74
80
  @mtime = Time.now
75
81
  @render_options = render_options
76
82
  end
77
-
78
- def metadata(*keys)
79
- keys.each do |key|
80
- return @metadata[key] if @metadata.has_key? key
81
- end
82
- nil
83
- end
84
83
 
85
84
  def self.pathify(path_or_string)
86
85
  fix_path path_or_string.is_a?(String) ? Pathname.new(path_or_string) : path_or_string
@@ -1,3 +1,3 @@
1
1
  module Spandex
2
- VERSION = "0.0.5"
2
+ VERSION = "0.0.6"
3
3
  end
data/spec/finder_spec.rb CHANGED
@@ -27,7 +27,16 @@ describe Spandex::Finder do
27
27
 
28
28
  make_finder.all_pages.map{|p| p.title}.should =~ ["The", "Sounds"]
29
29
  end
30
-
30
+
31
+ it "includes drafts" do
32
+ create_file("stuff.md", :draft => "true")
33
+ make_finder.all_pages.size.should == 1
34
+ end
35
+
36
+ it "ignores stray files" do
37
+ create_file("stuff.md~", :date => "1986/5/25")
38
+ make_finder.all_articles.should be_empty
39
+ end
31
40
  end
32
41
 
33
42
  context "when getting all articles" do
@@ -45,6 +54,17 @@ describe Spandex::Finder do
45
54
  results[0].date.should == Date.civil(2011, 5, 25)
46
55
  end
47
56
 
57
+ it "excludes drafts by default" do
58
+ create_file("stuff.md", :date => "2011/5/25", :draft => "true")
59
+ make_finder.all_articles.size.should == 0
60
+ end
61
+
62
+ it "can include drafts" do
63
+ create_file("stuff.md", :date => "2011/5/25", :draft => "true")
64
+ create_file("more_stuff.md", :date => "2011/5/25", :draft => "false")
65
+ make_finder.all_articles(true).size.should == 2
66
+ end
67
+
48
68
  it "sorts by date descending" do
49
69
  create_file("stuff.md", :date => "1986/5/25")
50
70
  create_file("more_stuff.md", :date => "1982/5/25")
@@ -56,13 +76,7 @@ describe Spandex::Finder do
56
76
  [Date.civil(2011,5,25), Date.civil(1986,5,25), Date.civil(1982,5,25)].each_with_index do |date, i|
57
77
  results[i].date.should == date
58
78
  end
59
- end
60
-
61
- it "ignores stray files" do
62
- create_file("stuff.md~", :date => "1986/5/25")
63
- make_finder.all_articles.should be_empty
64
- end
65
-
79
+ end
66
80
  end
67
81
 
68
82
  context "when generating an atom feed" do
@@ -154,16 +168,6 @@ describe Spandex::Finder do
154
168
  page.should be_nil
155
169
  end
156
170
 
157
- it "caches individual files" do
158
- finder = make_finder
159
-
160
- create_file("stuff.md", :tags => "yeah")
161
- finder.get("stuff").tags.should == ["yeah"]
162
-
163
- create_file("stuff.md", :tags => "nah")
164
- finder.get("stuff").tags.should == ["yeah"]
165
- end
166
-
167
171
  it "doesn't muck up the cache" do
168
172
  create_file("stuff.md")
169
173
  finder = make_finder
@@ -192,8 +196,6 @@ describe Spandex::Finder do
192
196
  finder.get("/stuff")
193
197
  finder.all_pages.size.should == 1
194
198
  end
195
-
196
-
197
199
  end
198
200
 
199
201
  context "when loading by filename" do
@@ -210,7 +212,7 @@ describe Spandex::Finder do
210
212
 
211
213
  end
212
214
 
213
- context "when find pages" do
215
+ context "when finding pages" do
214
216
  it "can find them by tag" do
215
217
  create_file("no.md", :tags => "nono")
216
218
  create_file("yeah.md", :tags => "yeahyeah")
@@ -224,6 +226,18 @@ describe Spandex::Finder do
224
226
  it "can find them by titles" do
225
227
  create_file("no.md", :title => "This has the wrong title")
226
228
  create_file("yeah.md", :title => "This has the correct title")
229
+
230
+ results = make_finder.find_pages :title => "correct"
231
+ results.size.should == 1
232
+ results.first.title.should == "This has the correct title"
233
+ end
234
+
235
+ it "can find them by draft status" do
236
+ create_file "no.md"
237
+ create_file "yeah.md", :draft => "true"
238
+ results = make_finder.find_pages :draft => true
239
+ results.size.should == 1
240
+ results.first.draft?.should == true
227
241
  end
228
242
 
229
243
  it "can find them by multiple metrics" do
@@ -237,14 +251,28 @@ describe Spandex::Finder do
237
251
 
238
252
  context "when finding articles" do
239
253
  it "only finds articles" do
240
- create_file("no.md", :tags => "yeahyeah")
241
- create_file("yeah.md", :tags => "yeahyeah", :date => "2011/5/26", :title => "Yeah Yeah Yeah")
254
+ create_file "no.md", :tags => "yeahyeah"
255
+ create_file "yeah.md", :tags => "yeahyeah", :date => "2011/5/26", :title => "Yeah Yeah Yeah"
242
256
 
243
- results = make_finder.find_articles(:tag => "yeahyeah")
257
+ results = make_finder.find_articles :tag => "yeahyeah"
244
258
  results.size.should == 1
245
259
  results.first.title == "Yeah Yeah Yeah"
246
260
  end
247
261
 
262
+ it "excludes drafts by default" do
263
+ create_file "no.md", :tags => "yeahyeah", :date => "2010/5/25", :draft => "true"
264
+ create_file "yeah.md", :tags => "yeahyeah", :date => "2011/5/26", :title => "Yeah Yeah Yeah"
265
+ results = make_finder.find_articles :tag => "yeahyeah"
266
+ results.size.should == 1
267
+ end
268
+
269
+ it "can include drats" do
270
+ create_file "no.md", :tags => "yeahyeah", :date => "2010/5/25", :draft => "true"
271
+ create_file "yeah.md", :tags => "yeahyeah", :date => "2011/5/26", :title => "Yeah Yeah Yeah"
272
+ results = make_finder.find_articles :include_drafts => true, :tag => "yeahyeah"
273
+ results.size.should == 2
274
+ end
275
+
248
276
  end
249
277
 
250
278
  before(:each) do
data/spec/page_spec.rb CHANGED
@@ -39,6 +39,16 @@ describe Spandex::Page do
39
39
  page.tags.should have(2).tags
40
40
  end
41
41
 
42
+ it "can be in draft mode" do
43
+ page = create_page("test.md", :draft => true)
44
+ page.draft?.should == true
45
+ end
46
+
47
+ it "isn't in draft mode by default" do
48
+ page = create_page("test.md")
49
+ page.draft?.should == false
50
+ end
51
+
42
52
  it "can parse the body" do
43
53
  page = create_page("test.md", :content => "But it's not that easy")
44
54
  page.body.should == Redcarpet::Markdown.new(Redcarpet::Render::HTML).render("But it's not that easy")
@@ -58,11 +68,21 @@ describe Spandex::Page do
58
68
  page.date.should == Date.civil(2011, 5, 25)
59
69
  end
60
70
 
61
- it "can omit the date" do
71
+ it "can ommit the date" do
62
72
  page = create_page("test.md")
63
73
  page.date.should be_nil
64
74
  end
65
75
 
76
+ it "exposes metadata directly" do
77
+ page = create_page("test.md", :somethin => "yo")
78
+ page.metadata("somethin").should == "yo"
79
+ end
80
+
81
+ it "allows you to use symbols in getting metadata" do
82
+ page = create_page("test.md", :somethin => "yo")
83
+ page.metadata(:somethin).should == "yo"
84
+ end
85
+
66
86
  it "produces good atom output" do
67
87
  page = create_page("test.md", :title => "hello!", :date => "2011/5/25")
68
88
  entry = page.to_atom_entry("http://test.org")
metadata CHANGED
@@ -1,71 +1,68 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: spandex
3
- version: !ruby/object:Gem::Version
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.6
4
5
  prerelease:
5
- version: 0.0.5
6
6
  platform: ruby
7
- authors:
7
+ authors:
8
8
  - Isaac Cambron
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
-
13
- date: 2011-09-30 00:00:00 Z
14
- dependencies:
15
- - !ruby/object:Gem::Dependency
12
+ date: 2011-11-02 00:00:00.000000000Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
16
15
  name: tilt
17
- prerelease: false
18
- requirement: &id001 !ruby/object:Gem::Requirement
16
+ requirement: &11869220 !ruby/object:Gem::Requirement
19
17
  none: false
20
- requirements:
21
- - - ">="
22
- - !ruby/object:Gem::Version
23
- version: "0"
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: '0'
24
22
  type: :runtime
25
- version_requirements: *id001
26
- - !ruby/object:Gem::Dependency
27
- name: ratom
28
23
  prerelease: false
29
- requirement: &id002 !ruby/object:Gem::Requirement
24
+ version_requirements: *11869220
25
+ - !ruby/object:Gem::Dependency
26
+ name: ratom
27
+ requirement: &11868700 !ruby/object:Gem::Requirement
30
28
  none: false
31
- requirements:
32
- - - ">="
33
- - !ruby/object:Gem::Version
34
- version: "0"
29
+ requirements:
30
+ - - ! '>='
31
+ - !ruby/object:Gem::Version
32
+ version: '0'
35
33
  type: :runtime
36
- version_requirements: *id002
37
- - !ruby/object:Gem::Dependency
38
- name: rspec
39
34
  prerelease: false
40
- requirement: &id003 !ruby/object:Gem::Requirement
35
+ version_requirements: *11868700
36
+ - !ruby/object:Gem::Dependency
37
+ name: rspec
38
+ requirement: &11868240 !ruby/object:Gem::Requirement
41
39
  none: false
42
- requirements:
43
- - - ">="
44
- - !ruby/object:Gem::Version
45
- version: "0"
40
+ requirements:
41
+ - - ! '>='
42
+ - !ruby/object:Gem::Version
43
+ version: '0'
46
44
  type: :development
47
- version_requirements: *id003
48
- - !ruby/object:Gem::Dependency
49
- name: redcarpet
50
45
  prerelease: false
51
- requirement: &id004 !ruby/object:Gem::Requirement
46
+ version_requirements: *11868240
47
+ - !ruby/object:Gem::Dependency
48
+ name: redcarpet
49
+ requirement: &11867620 !ruby/object:Gem::Requirement
52
50
  none: false
53
- requirements:
54
- - - "="
55
- - !ruby/object:Gem::Version
51
+ requirements:
52
+ - - =
53
+ - !ruby/object:Gem::Version
56
54
  version: 2.0.0b5
57
55
  type: :development
58
- version_requirements: *id004
59
- description: Spandex manages a store of markup files and their metadata, useful in building blogs or blog engines
60
- email:
56
+ prerelease: false
57
+ version_requirements: *11867620
58
+ description: Spandex manages a store of markup files and their metadata, useful in
59
+ building blogs or blog engines
60
+ email:
61
61
  - icambron@alum.mit.edu
62
62
  executables: []
63
-
64
63
  extensions: []
65
-
66
64
  extra_rdoc_files: []
67
-
68
- files:
65
+ files:
69
66
  - .gitignore
70
67
  - Gemfile
71
68
  - README.md
@@ -81,30 +78,26 @@ files:
81
78
  - spec/wrapper_spec.rb
82
79
  homepage: https://github.com/icambron/spandex
83
80
  licenses: []
84
-
85
81
  post_install_message:
86
82
  rdoc_options: []
87
-
88
- require_paths:
83
+ require_paths:
89
84
  - lib
90
- required_ruby_version: !ruby/object:Gem::Requirement
85
+ required_ruby_version: !ruby/object:Gem::Requirement
91
86
  none: false
92
- requirements:
93
- - - ">="
94
- - !ruby/object:Gem::Version
95
- version: "0"
96
- required_rubygems_version: !ruby/object:Gem::Requirement
87
+ requirements:
88
+ - - ! '>='
89
+ - !ruby/object:Gem::Version
90
+ version: '0'
91
+ required_rubygems_version: !ruby/object:Gem::Requirement
97
92
  none: false
98
- requirements:
99
- - - ">="
100
- - !ruby/object:Gem::Version
101
- version: "0"
93
+ requirements:
94
+ - - ! '>='
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
102
97
  requirements: []
103
-
104
98
  rubyforge_project:
105
99
  rubygems_version: 1.8.10
106
100
  signing_key:
107
101
  specification_version: 3
108
102
  summary: A simple content engine
109
103
  test_files: []
110
-