rollin 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: eec28f29a0e5d44ec5f898ec1cc57a5e2ceb7309
4
- data.tar.gz: 747351059a59ee276bb140861d2b742fc4c976b2
3
+ metadata.gz: a2c32191bfacf8a3806320873f8616bcd527ac8c
4
+ data.tar.gz: f00eddf1f6e960db06dbb6c854a46fbb9be0e3f7
5
5
  SHA512:
6
- metadata.gz: cb937284f72d047aba71e4cda7a0e1ba18ef88b66a842c784ff7a97c916f3233da72ae190169752981e5fdf9a1ffdb63aee7ee6a9f3080a328e02bea71c4ad9d
7
- data.tar.gz: 1cc3d83c410c5febc1df9cc58257c614db44748d97e71e1bf4942ff65c0b8cb15dd03e24b656c2c0d43dc577c9b9edac463f6461bd8f92828af8128b7a4b7a5c
6
+ metadata.gz: 6585b788143321aa37e98ad8d80530fc3733464439c0f0134fdab205d05798c1dc17dc11b5b0f7eb4e2536cf96ea48951931df1792a97d2c3632f75f4983ea51
7
+ data.tar.gz: 17803515ff2bf385fb0740b1bdbce0531c62df2a412a585f5f2e487ca56b5b7b5e114c0cf56ca686b56b0c2b59c5f5839611b11ed7d9be13c4d5abd91fe241b2
data/README.md CHANGED
@@ -25,18 +25,72 @@ First you will need to have the following structure in your filesystem.
25
25
 
26
26
  blog = Rollin::Blog.new({articles_folder: "posts"}) # Defaults to "articles"
27
27
 
28
- first_post = blog.articles.first
28
+ article = blog.articles.first
29
29
 
30
- first_post.id # => "2013_05_01_My_first_post"
31
- first_post.title # => "My first post"
32
- first_post.body # => "<h3>My first post!</h3>\n<p>blah blah blah</p>"
30
+ article.id # => "2013_05_01_My_first_post"
31
+ article.title # => "My first post"
32
+ article.body # => "<h3>My first post!</h3>\n<p>blah blah blah</p>"
33
33
 
34
- first_post.date # => #<Date: 2013-05-01 ((2456414j,0s,0n),+0s,2299161j)>
35
- first_post.year # => 2013
36
- first_post.month # => 05
37
- first_post.day # => 01
34
+ article.date # => #<Date: 2013-05-01 ((2456414j,0s,0n),+0s,2299161j)>
35
+ article.year # => 2013
36
+ article.month # => 05
37
+ article.day # => 01
38
38
 
39
- ### Monthly archive
39
+ ### Metatags
40
+
41
+ You may define articles metatags at the begging of your article with the format:
42
+
43
+ ---
44
+ author: Zé
45
+ title: My new awesome blog!
46
+ tags: development, fun
47
+ ---
48
+
49
+ This is how you access the tag information.
50
+
51
+ article.metatags # => { 'title' => 'My new awesome blog!',
52
+ 'author' => 'Zé',
53
+ 'tags' => [ 'development', 'fun' ] }
54
+
55
+
56
+ It is YAML snippet and follows a similar format to Jekyll's [yaml front matter](https://github.com/mojombo/jekyll/wiki/yaml-front-matter). Except that our special variables are different:
57
+
58
+ | Metatag | Description |
59
+ |:------- |:----------- |
60
+ | title | The article title. It overrides the on extracted from the file name. |
61
+
62
+ ### Inquiring metatags
63
+
64
+ blog.metatags # => A list of metatag objects
65
+
66
+ author_metatag = blog.metatags.first
67
+
68
+ author_metatag.label # => "tags"
69
+ author_metatag.values # => A list of metatag value objects
70
+
71
+ author_metatag_value = metatag.values.fist
72
+ author_metatag_value.content # => "Zé"
73
+ author_metatag_value.articles # => A list of articles containing that metatag value
74
+
75
+ ### Finding a articles
76
+
77
+ #### By article id
78
+
79
+ blog.article('2013_05_01_My_first_post') # => #Rollin::Article(:title => "My first post" ...)
80
+
81
+ #### By tag
82
+
83
+ blog.articles(:tags => "development") # => A list of articles tagged with development
84
+
85
+ #### By date
86
+
87
+ blog.articles(:year => 2013) # => A list of articles for that year
88
+ blog.articles(:year => 2013, :month => 5) # => A list of articles for that month
89
+ blog.articles(:year => 2013, :month => 5, :day => 1) # => A list of articles for that day
90
+
91
+ ### Archive
92
+
93
+ #### Monthly
40
94
 
41
95
  may_archive = blog.monthly_archive.first
42
96
 
@@ -44,7 +98,7 @@ First you will need to have the following structure in your filesystem.
44
98
  may_archive.month # => 5
45
99
  may_archive.articles # => [ Rollin::Article(:title => "My first post" ...) ]
46
100
 
47
- ### Annual archive
101
+ #### Annual
48
102
 
49
103
  twenty_thirteen_archive = blog.annual_archive.first
50
104
 
@@ -52,9 +106,9 @@ First you will need to have the following structure in your filesystem.
52
106
  twenty_thirteen_archive.articles # => [ Rollin::Article(:title => "My first post" ...) ]
53
107
  twenty_thirteen_archive.monthly_archive # => [ Rollin::MonthArchive(:year => 2013, :month => 5 ...) ]
54
108
 
55
- ### Finding an article
109
+ ### More datailed documentation
56
110
 
57
- blog.find_article_by_id('2013_05_01_My_first_post') # => #Rollin::Article(:title => "My first post" ...)
111
+ You can find a more detailed documentation at the [rollin_spec.rb](https://github.com/marano/rollin/blob/master/spec/rollin_spec.rb) file.
58
112
 
59
113
  ## Build status
60
114
 
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.1.0
1
+ 0.1.1
@@ -12,13 +12,14 @@ class Rollin::Article
12
12
  end
13
13
 
14
14
  def title
15
- metatags[:title] || @title_from_filename
15
+ metatags['title'] || @title_from_filename
16
16
  end
17
17
 
18
18
  def matches?(search)
19
- search = search.clone
20
-
21
19
  return true if @id == search
20
+ return false if @searh.is_a? String
21
+
22
+ search = search.clone
22
23
 
23
24
  if search.has_key?(:year)
24
25
  return false if search.delete(:year) != @year
@@ -30,6 +31,8 @@ class Rollin::Article
30
31
  end
31
32
  end
32
33
 
34
+ search = search.inject({}) { |memo, (k,v)| memo[k.to_s] = v; memo }
35
+
33
36
  if search.keys.empty?
34
37
  return true
35
38
  else
@@ -41,20 +44,15 @@ class Rollin::Article
41
44
  end
42
45
 
43
46
  def metatags
44
- # Stolen from Jekyll
47
+ file = read_from_file
48
+ return {} unless file.has_front_matter?
45
49
  begin
46
- content = File.read(@source_file)
47
-
48
- if content =~ /\A(---\s*\n.*?\n?)^(---\s*$\n?)/m
49
- content = $POSTMATCH
50
- return YAML.safe_load($1).inject({}){|memo,(k,v)| memo[k.to_sym] = v; memo}
51
- end
50
+ return YAML.safe_load(file.yaml_front_matter)
52
51
  rescue SyntaxError => e
53
52
  puts "YAML Exception reading #{File.join(@source_file)}: #{e.message}"
54
53
  rescue Exception => e
55
54
  puts "Error reading file #{File.join(@source_file)}: #{e.message}"
56
55
  end
57
-
58
56
  return {}
59
57
  end
60
58
 
@@ -67,6 +65,35 @@ class Rollin::Article
67
65
  autolink: true,
68
66
  space_after_headers: true,
69
67
  hard_wrap: true)
70
- redcarpet.render(File.read(@source_file))
68
+ redcarpet.render(read_from_file.content)
69
+ end
70
+
71
+ private
72
+
73
+ def read_from_file
74
+ raw = File.read(@source_file)
75
+
76
+ # Stolen from Jekyll
77
+ if raw =~ /\A(---\s*\n.*?\n?)^(---\s*$\n?)/m
78
+ content = $POSTMATCH
79
+ yaml_front_matter = $1
80
+ content = raw[yaml_front_matter.size + 3, raw.size - 1]
81
+ FileContent.new(yaml_front_matter, content)
82
+ else
83
+ FileContent.new(nil, raw)
84
+ end
85
+ end
86
+ end
87
+
88
+ class FileContent
89
+ attr_reader :yaml_front_matter, :content
90
+
91
+ def initialize(yaml_front_matter, content)
92
+ @yaml_front_matter = yaml_front_matter
93
+ @content = content
94
+ end
95
+
96
+ def has_front_matter?
97
+ !yaml_front_matter.nil?
71
98
  end
72
99
  end
data/lib/rollin/blog.rb CHANGED
@@ -15,6 +15,21 @@ class Rollin::Blog
15
15
  end
16
16
  end
17
17
 
18
+ def metatags
19
+ metatag_labels = articles.map do |article|
20
+ article.metatags.keys
21
+ end.flatten.uniq
22
+
23
+ metatag_labels.map do |metatag_label|
24
+ values = articles.select { |article| article.metatags.has_key?(metatag_label) }.map do |article|
25
+ article.metatags[metatag_label]
26
+ end.flatten.uniq.map do |metatag_content|
27
+ Rollin::MetatagValue.new(metatag_content, articles(metatag_label => metatag_content))
28
+ end
29
+ Rollin::MetatagKey.new(metatag_label, values)
30
+ end
31
+ end
32
+
18
33
  def annual_archive
19
34
  monthly_archive.map { |month_archive| month_archive.year }.uniq.map do |year|
20
35
  Rollin::YearArchive.new(year, monthly_archive.select { |aMonth| aMonth.year == year })
@@ -0,0 +1,7 @@
1
+ class Rollin::MetatagKey
2
+ attr_reader :label, :values
3
+
4
+ def initialize(label, values)
5
+ @label, @values = label, values
6
+ end
7
+ end
@@ -0,0 +1,7 @@
1
+ class Rollin::MetatagValue
2
+ attr_reader :content, :articles
3
+
4
+ def initialize(content, articles)
5
+ @content, @articles = content, articles
6
+ end
7
+ end
data/lib/rollin.rb CHANGED
@@ -7,6 +7,8 @@ require "rollin/blog"
7
7
  require "rollin/article"
8
8
  require "rollin/month_archive"
9
9
  require "rollin/year_archive"
10
+ require "rollin/metatag_key"
11
+ require "rollin/metatag_value"
10
12
 
11
13
  module Rollin
12
14
  end
@@ -1,3 +1,8 @@
1
+ ---
2
+ tags:
3
+ - manero
4
+ ---
5
+
1
6
  ## This is my first post
2
7
 
3
8
  And here we go!
@@ -3,7 +3,6 @@ tags:
3
3
  - manero
4
4
  - massa
5
5
  - bacana
6
- published: false
7
6
  ---
8
7
 
9
8
  ## This is my second post
@@ -1 +1,7 @@
1
-
1
+ ---
2
+ published: false
3
+ ---
4
+
5
+ ## This is my fourth post
6
+
7
+ Really awesome!!
data/spec/rollin_spec.rb CHANGED
@@ -11,10 +11,18 @@ describe 'how rollin works' do
11
11
 
12
12
  subject (:blog) { Rollin::Blog.new(articles_folder: 'spec/fixtures') }
13
13
 
14
+ let (:first_article) { blog.articles.first }
15
+ let (:second_article) { blog.articles[1] }
16
+ let (:third_article) { blog.articles[2] }
17
+ let (:fourth_article) { blog.articles[3] }
18
+
19
+ let (:article_with_single_tag_metatag) { blog.articles[0] }
20
+ let (:article_with_title_metatag) { blog.articles[1] }
21
+ let (:article_with_multiple_tag_metatag) { blog.articles[2] }
22
+ let (:article_with_published_metatag) { blog.articles[3] }
23
+
14
24
  context 'article content' do
15
25
  let (:article) { blog.articles.first }
16
- let (:article_with_title_metatag) { blog.articles[1] }
17
- let (:article_with_custom_metatags) { blog.articles[2] }
18
26
 
19
27
  it 'exposes article information and content' do
20
28
  article.id.should == '2013_05_01_My_first_post'
@@ -24,7 +32,7 @@ describe 'how rollin works' do
24
32
  article.day.should == 1
25
33
  article.date.should == Date.new(2013, 5, 1)
26
34
  article.body.should == "<h2>This is my first post</h2>\n\n<p>And here we go!</p>\n"
27
- article.metatags.should be_empty
35
+ article.metatags.should == { 'tags' => [ 'manero' ] }
28
36
  end
29
37
 
30
38
  it 'allows article title definition with metatag' do
@@ -32,32 +40,34 @@ describe 'how rollin works' do
32
40
  end
33
41
 
34
42
  it 'exposes the list of defined metatags' do
35
- article_with_custom_metatags.metatags.should == { tags: ['manero', 'massa', 'bacana'], published: false }
43
+ article_with_multiple_tag_metatag.metatags.should == { 'tags' => ['manero', 'massa', 'bacana'] }
44
+ article_with_published_metatag.metatags.should == { 'published' => false }
36
45
  end
37
46
  end
38
47
 
39
48
  context 'searching for articles' do
40
- let (:first_article) { blog.articles.first }
41
- let (:second_article) { blog.articles[1] }
42
- let (:third_article) { blog.articles[2] }
43
- let (:article_with_custom_metatags) { blog.articles[2] }
44
-
45
49
  it 'searches by article id' do
46
50
  blog.article('2013_05_01_My_first_post').should == first_article
47
51
  end
48
52
 
49
53
  it 'searches by metatags' do
50
- blog.article(tags: 'manero').should == article_with_custom_metatags
51
- blog.articles(tags: 'manero').should == [ article_with_custom_metatags ]
54
+ blog.article(:tags => 'manero').should == article_with_single_tag_metatag
55
+ blog.article('tags' => 'manero').should == article_with_single_tag_metatag
56
+
57
+ blog.articles(:tags => 'manero').should == [ article_with_single_tag_metatag, article_with_multiple_tag_metatag ]
58
+ blog.articles('tags' => 'manero').should == [ article_with_single_tag_metatag, article_with_multiple_tag_metatag ]
59
+
60
+ blog.article(:published => false).should == article_with_published_metatag
61
+ blog.article('published' => false).should == article_with_published_metatag
52
62
 
53
- blog.article(published: false).should == article_with_custom_metatags
54
- blog.articles(published: false).should == [ article_with_custom_metatags ]
63
+ blog.articles(:published => false).should == [ article_with_published_metatag ]
64
+ blog.articles('published' => false).should == [ article_with_published_metatag ]
55
65
  end
56
66
 
57
67
  it 'searches by date' do
58
- blog.articles(year: 2013).should include(first_article, second_article, third_article)
59
- blog.articles(year: 2013, month: 5).should include(first_article, second_article)
60
- blog.articles(year: 2013, month: 5, day: 1).should include(first_article)
68
+ blog.articles(year: 2013).should == [ first_article, second_article, third_article ]
69
+ blog.articles(year: 2013, month: 5).should == [first_article, second_article ]
70
+ blog.articles(year: 2013, month: 5, day: 1).should == [ first_article ]
61
71
  end
62
72
 
63
73
  it 'narrows search by date when searching for metatags' do
@@ -66,6 +76,31 @@ describe 'how rollin works' do
66
76
  end
67
77
  end
68
78
 
79
+ context 'inquiring metatags' do
80
+ it 'shows a list of existent metatags' do
81
+ blog.should have(3).metatags
82
+
83
+ blog.metatags[0].label.should == 'tags'
84
+ blog.metatags[0].should have(3).values
85
+ blog.metatags[0].values[0].content.should == 'manero'
86
+ blog.metatags[0].values[0].articles.should == [ article_with_single_tag_metatag, article_with_multiple_tag_metatag ]
87
+ blog.metatags[0].values[1].content.should == 'massa'
88
+ blog.metatags[0].values[1].articles.should == [ article_with_multiple_tag_metatag ]
89
+ blog.metatags[0].values[2].content.should == 'bacana'
90
+ blog.metatags[0].values[2].articles.should == [ article_with_multiple_tag_metatag ]
91
+
92
+ blog.metatags[1].label.should == 'title'
93
+ blog.metatags[1].should have(1).values
94
+ blog.metatags[1].values[0].content.should == 'This is a super post!'
95
+ blog.metatags[1].values[0].articles.should == [ article_with_title_metatag ]
96
+
97
+ blog.metatags[2].label.should == 'published'
98
+ blog.metatags[2].should have(1).values
99
+ blog.metatags[2].values[0].content.should == false
100
+ blog.metatags[2].values[0].articles.should == [ article_with_published_metatag ]
101
+ end
102
+ end
103
+
69
104
  context 'listing articles' do
70
105
  let (:first_article) { TestArticle.new(id: '2013_05_01_My_first_post', title: 'My first post', date: Date.new(2013, 5, 1)) }
71
106
  let (:second_article) { TestArticle.new(id: '2013_05_02_My_second_post', title: 'This is a super post!', date: Date.new(2013, 5, 2)) }
@@ -80,50 +115,44 @@ describe 'how rollin works' do
80
115
  blog.articles[2].should == third_article
81
116
  blog.articles[3].should == fourth_article
82
117
  end
118
+ end
83
119
 
120
+ context 'archive' do
84
121
  it 'provides monthly archive' do
85
122
  blog.monthly_archive.should have(3).articles
86
123
 
87
124
  blog.monthly_archive[0].year.should == 2013
88
125
  blog.monthly_archive[0].month.should == 5
89
- blog.monthly_archive[0].should have(2).articles
90
- blog.monthly_archive[0].articles.should include(first_article, second_article)
126
+ blog.monthly_archive[0].articles.should == [ first_article, second_article ]
91
127
 
92
128
  blog.monthly_archive[1].year.should == 2013
93
129
  blog.monthly_archive[1].month.should == 6
94
- blog.monthly_archive[1].should have(1).articles
95
- blog.monthly_archive[1].articles.should include(third_article)
130
+ blog.monthly_archive[1].articles.should == [ third_article ]
96
131
 
97
132
  blog.monthly_archive[2].year.should == 2014
98
133
  blog.monthly_archive[2].month.should == 1
99
- blog.monthly_archive[2].should have(1).articles
100
- blog.monthly_archive[2].articles.should include(fourth_article)
134
+ blog.monthly_archive[2].articles.should == [ fourth_article ]
101
135
  end
102
136
 
103
137
  it 'provides annual archive' do
104
138
  blog.should have(2).annual_archive
105
139
 
106
140
  blog.annual_archive[0].year.should == 2013
141
+ blog.annual_archive[0].articles.should == [ first_article, second_article, third_article ]
107
142
  blog.annual_archive[0].should have(2).monthly_archive
108
143
  blog.annual_archive[0].monthly_archive[0].year.should == 2013
109
144
  blog.annual_archive[0].monthly_archive[0].month.should == 5
110
- blog.annual_archive[0].monthly_archive[0].should have(2).articles
111
- blog.annual_archive[0].monthly_archive[0].articles.should include(first_article, second_article)
145
+ blog.annual_archive[0].monthly_archive[0].articles.should == [ first_article, second_article ]
112
146
  blog.annual_archive[0].monthly_archive[1].year.should == 2013
113
147
  blog.annual_archive[0].monthly_archive[1].month.should == 6
114
- blog.annual_archive[0].monthly_archive[1].should have(1).articles
115
- blog.annual_archive[0].monthly_archive[1].articles.should include(third_article)
116
- blog.annual_archive[0].should have(3).articles
117
- blog.annual_archive[0].articles.should include(first_article, second_article, third_article)
148
+ blog.annual_archive[0].monthly_archive[1].articles.should == [ third_article ]
118
149
 
119
150
  blog.annual_archive[1].year.should == 2014
151
+ blog.annual_archive[1].articles.should == [ fourth_article ]
120
152
  blog.annual_archive[1].should have(1).monthly_archive
121
153
  blog.annual_archive[1].monthly_archive[0].year.should == 2014
122
154
  blog.annual_archive[1].monthly_archive[0].month.should == 1
123
- blog.annual_archive[1].monthly_archive[0].should have(1).articles
124
- blog.annual_archive[1].monthly_archive[0].articles.should include(fourth_article)
125
- blog.annual_archive[1].should have(1).articles
126
- blog.annual_archive[1].articles.should include(fourth_article)
155
+ blog.annual_archive[1].monthly_archive[0].articles.should == [ fourth_article ]
127
156
  end
128
157
  end
129
158
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rollin
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
  - marano
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2013-05-03 00:00:00.000000000 Z
11
+ date: 2013-05-04 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -126,6 +126,8 @@ files:
126
126
  - lib/rollin.rb
127
127
  - lib/rollin/article.rb
128
128
  - lib/rollin/blog.rb
129
+ - lib/rollin/metatag_key.rb
130
+ - lib/rollin/metatag_value.rb
129
131
  - lib/rollin/month_archive.rb
130
132
  - lib/rollin/version.rb
131
133
  - lib/rollin/year_archive.rb