rollin 0.1.0 → 0.1.1

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