spandex 0.0.5 → 0.0.6

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.
@@ -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
-