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.
- data/lib/spandex/finder.rb +29 -24
- data/lib/spandex/page.rb +15 -16
- data/lib/spandex/version.rb +1 -1
- data/spec/finder_spec.rb +52 -24
- data/spec/page_spec.rb +21 -1
- metadata +52 -59
data/lib/spandex/finder.rb
CHANGED
@@ -17,7 +17,9 @@ module Spandex
|
|
17
17
|
|
18
18
|
def get(path)
|
19
19
|
path = Page.pathify path
|
20
|
-
|
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
|
-
|
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
|
44
|
-
|
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
|
48
|
-
|
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(
|
40
|
+
metadata(:title) || "(Unknown Title)"
|
39
41
|
end
|
40
42
|
|
41
43
|
def date
|
42
|
-
@date ||= metadata(
|
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(
|
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
|
data/lib/spandex/version.rb
CHANGED
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
|
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
|
241
|
-
create_file
|
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
|
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
|
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
|
-
|
14
|
-
|
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
|
-
|
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:
|
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
|
-
|
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:
|
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
|
-
|
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:
|
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
|
-
|
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
|
-
|
59
|
-
|
60
|
-
|
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:
|
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:
|
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
|
-
|