postage 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.
- data/AUTHORS +7 -0
- data/CHANGES +10 -0
- data/INFO +16 -0
- data/LICENSE +23 -0
- data/MANIFEST +21 -0
- data/README +50 -0
- data/Rakefile +10 -0
- data/lib/extensions.rb +47 -0
- data/lib/postage/finder.rb +61 -0
- data/lib/postage/post.rb +176 -0
- data/lib/postage.rb +40 -0
- data/tasks/package.rake +70 -0
- data/tasks/postage.rake +0 -0
- data/templates/post.erb +5 -0
- data/test/fixtures/20080501-postage_test_post.ruby.postage.mkd +12 -0
- data/test/fixtures/20080601-postage_test_post.ruby.postage.mkd +12 -0
- data/test/fixtures/20090604-postage_test_post.ruby.postage.mkd +12 -0
- data/test/fixtures/20090604143805-postage_test_post.ruby.postage.mkd +10 -0
- data/test/fixtures/20090608-creating_new_entry_from_test_unit.ruby.postage.test.mkd +192 -0
- data/test/test_finder.rb +27 -0
- data/test/test_post.rb +62 -0
- metadata +100 -0
data/AUTHORS
ADDED
data/CHANGES
ADDED
data/INFO
ADDED
@@ -0,0 +1,16 @@
|
|
1
|
+
:name: postage
|
2
|
+
:version: 0.1.1
|
3
|
+
:date: 2009-07-11
|
4
|
+
:cycle: Development release - Pre-alpha
|
5
|
+
:summary:
|
6
|
+
Postage API implemented for helper handle text files for posts.
|
7
|
+
:description:
|
8
|
+
Postage is an API developed for handle text files for posts for blogs
|
9
|
+
or anything else.
|
10
|
+
:authors:
|
11
|
+
- Hallison Batista
|
12
|
+
:email: email@hallisonbatista.com
|
13
|
+
:homepage: http://postage.rubyforge.org/
|
14
|
+
:dependencies:
|
15
|
+
maruku: >= 0.6.0
|
16
|
+
|
data/LICENSE
ADDED
@@ -0,0 +1,23 @@
|
|
1
|
+
= The MIT License
|
2
|
+
|
3
|
+
Copyright (c) 2009 Hallison Batista
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a
|
6
|
+
copy of this software and associated documentation files (the
|
7
|
+
"Software"), to deal in the Software without restriction, including
|
8
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
9
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
10
|
+
permit persons to whom the Software is furnished to do so, subject to
|
11
|
+
the following conditions:
|
12
|
+
|
13
|
+
The above copyright notice and this permission notice shall be included
|
14
|
+
in all copies or substantial portions of the Software.
|
15
|
+
|
16
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
17
|
+
OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
18
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
19
|
+
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
20
|
+
CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
21
|
+
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
22
|
+
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
23
|
+
|
data/MANIFEST
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
AUTHORS
|
2
|
+
CHANGES
|
3
|
+
INFO
|
4
|
+
LICENSE
|
5
|
+
MANIFEST
|
6
|
+
README
|
7
|
+
Rakefile
|
8
|
+
lib/extensions.rb
|
9
|
+
lib/postage.rb
|
10
|
+
lib/postage/finder.rb
|
11
|
+
lib/postage/post.rb
|
12
|
+
tasks/package.rake
|
13
|
+
tasks/postage.rake
|
14
|
+
templates/post.erb
|
15
|
+
test/fixtures/20080501-postage_test_post.ruby.postage.mkd
|
16
|
+
test/fixtures/20080601-postage_test_post.ruby.postage.mkd
|
17
|
+
test/fixtures/20090604-postage_test_post.ruby.postage.mkd
|
18
|
+
test/fixtures/20090604143805-postage_test_post.ruby.postage.mkd
|
19
|
+
test/fixtures/20090608-creating_new_entry_from_test_unit.ruby.postage.test.mkd
|
20
|
+
test/test_finder.rb
|
21
|
+
test/test_post.rb
|
data/README
ADDED
@@ -0,0 +1,50 @@
|
|
1
|
+
= Postage - API for write posts in simple text files
|
2
|
+
|
3
|
+
* {Repository}[http://github.com/hallison/postage]
|
4
|
+
* {Project}[http://rubyforge.org/projects/postage]
|
5
|
+
* {Documentation}[:link:Postage.html]
|
6
|
+
* {Issues}[http://github.com/hallison/postage/issues]
|
7
|
+
|
8
|
+
|
9
|
+
Postage is a simple API which load your text files and handle the
|
10
|
+
contents in Markdown syntax.
|
11
|
+
|
12
|
+
It's useful for _blogwares_, or anything else, that uses flat files
|
13
|
+
organized in directories instead databases.
|
14
|
+
|
15
|
+
Use your post text file in following hierarchy and format:
|
16
|
+
|
17
|
+
/posts/path/yyyymmdd-name_of_post.tags.filter
|
18
|
+
|
19
|
+
Real example of use:
|
20
|
+
|
21
|
+
home
|
22
|
+
`-- hallison
|
23
|
+
`-- blog
|
24
|
+
`-- posts
|
25
|
+
|-- 20090604-posting_blog_articles_using_postage.ruby.postage.mkd
|
26
|
+
|-- 20090529-postview_blogging_posts_with_sinatra_and_postage.ruby.sinatra.postage.mkd
|
27
|
+
|-- archive
|
28
|
+
|-- 20080930-bash_condicional_variables.shell.script.mkd
|
29
|
+
`-- 20081008-bash_arguments_validation.bash.shell.script.test.mkd
|
30
|
+
`-- drafts
|
31
|
+
|
32
|
+
It's possible uses Markdown Extra syntax because Postage use Maruku for
|
33
|
+
converting files.
|
34
|
+
|
35
|
+
About Markdown lightweight markup language, please, visit
|
36
|
+
<http://daringfireball.net/projects/markdown> and Markdown Extra, visit
|
37
|
+
<http://michelf.com/projects/php-markdown/extra/>.
|
38
|
+
|
39
|
+
== Requirements
|
40
|
+
|
41
|
+
Please, Postage has dependencies and most be installed.
|
42
|
+
|
43
|
+
* {Maruku}[http://maruku.rubyforge.org/], for convert Maruku in HTML.
|
44
|
+
|
45
|
+
== More information
|
46
|
+
|
47
|
+
* {Authors}[:link:AUTHORS.html]
|
48
|
+
* {Changes}[:link:CHANGES.html]
|
49
|
+
* {License}[:link:LICENSE.html]
|
50
|
+
|
data/Rakefile
ADDED
data/lib/extensions.rb
ADDED
@@ -0,0 +1,47 @@
|
|
1
|
+
class Hash
|
2
|
+
|
3
|
+
# Only symbolize all keys, including all key in sub-hashes.
|
4
|
+
def symbolize_keys
|
5
|
+
self.inject({}) do |hash, (key, value)|
|
6
|
+
hash[key.to_sym] = if value.kind_of? Hash
|
7
|
+
value.symbolize_keys
|
8
|
+
else
|
9
|
+
value
|
10
|
+
end
|
11
|
+
hash
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
# Set instance variables by key and value only if object respond
|
16
|
+
# to access method for variable.
|
17
|
+
def instance_variables_set_to(object)
|
18
|
+
collect do |variable, value|
|
19
|
+
object.instance_variable_set("@#{variable}", value) if object.respond_to? variable
|
20
|
+
end
|
21
|
+
object
|
22
|
+
end
|
23
|
+
|
24
|
+
end
|
25
|
+
|
26
|
+
class Date
|
27
|
+
|
28
|
+
# Stringify date and split by '-'.
|
29
|
+
#
|
30
|
+
# date = Date.new(2009,6,9)
|
31
|
+
# date.to_s # => 2009-06-09
|
32
|
+
# date.to_args # => [ "2009", "06", "09" ]
|
33
|
+
def to_args
|
34
|
+
to_s.split('-')
|
35
|
+
end
|
36
|
+
|
37
|
+
end
|
38
|
+
|
39
|
+
class Array
|
40
|
+
|
41
|
+
# Returns elements between first and the specific limit.
|
42
|
+
def limit(size)
|
43
|
+
self[0..size]
|
44
|
+
end
|
45
|
+
|
46
|
+
end
|
47
|
+
|
@@ -0,0 +1,61 @@
|
|
1
|
+
module Postage
|
2
|
+
|
3
|
+
# This class is a utility for find all posts in specific directory.
|
4
|
+
class Finder
|
5
|
+
|
6
|
+
attr_reader :posts, :tags
|
7
|
+
|
8
|
+
# Finder most be initialized with the directory that contains post files.
|
9
|
+
def initialize(directory)
|
10
|
+
@files = Dir[File.join(directory, "**.*")]
|
11
|
+
end
|
12
|
+
|
13
|
+
def load_all_post_files
|
14
|
+
@files.sort.collect do |file_name|
|
15
|
+
Post.load(file_name)
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
def all_posts
|
20
|
+
@posts ||= load_all_post_files
|
21
|
+
end
|
22
|
+
|
23
|
+
def all_posts_by_tag(tag)
|
24
|
+
all_posts
|
25
|
+
@posts.find_all{ |post| post.tags.include?(tag) }
|
26
|
+
end
|
27
|
+
|
28
|
+
def post(year, month, day, name)
|
29
|
+
all_posts
|
30
|
+
@posts.find{ |post| post.file.match(%r{#{year}#{month}#{day}-#{name}*.*}i) }
|
31
|
+
end
|
32
|
+
|
33
|
+
def posts(keywords)
|
34
|
+
all_posts
|
35
|
+
@posts.find_all{ |post| post.matched? search_expresion(keywords) }
|
36
|
+
end
|
37
|
+
|
38
|
+
def all_post_tags
|
39
|
+
all_posts
|
40
|
+
@tags ||= @posts.collect{ |post| post.tags }.flatten.uniq.sort
|
41
|
+
end
|
42
|
+
|
43
|
+
def all_tags
|
44
|
+
all_post_tags
|
45
|
+
end
|
46
|
+
|
47
|
+
def tag(name)
|
48
|
+
all_tags
|
49
|
+
@tags.find{ |tag| tag == name }
|
50
|
+
end
|
51
|
+
|
52
|
+
private
|
53
|
+
|
54
|
+
def search_expresion(keywords)
|
55
|
+
%r{#{keywords.to_s.split(/[ ,\*]/).join('|')}}i
|
56
|
+
end
|
57
|
+
|
58
|
+
end # class Finder
|
59
|
+
|
60
|
+
end # module Postage
|
61
|
+
|
data/lib/postage/post.rb
ADDED
@@ -0,0 +1,176 @@
|
|
1
|
+
module Postage
|
2
|
+
# Main class for handle text files. The Post class load file and extract all
|
3
|
+
# attributes from name. Examples:
|
4
|
+
#
|
5
|
+
# If you want load a file, use:
|
6
|
+
#
|
7
|
+
# post = Postage::Post.load("posts/20090710-my_post_file.ruby.postage.mkd")
|
8
|
+
# # => post.title : My post file
|
9
|
+
# # => post.publish_date : 2009-07-10
|
10
|
+
# # => post.tags : ruby, postage
|
11
|
+
# # => post.filter : markdown
|
12
|
+
#
|
13
|
+
# Or, if you want initialize a new post, use:
|
14
|
+
#
|
15
|
+
# post = Postage::Post.new :title => "Creating new `entry` from test unit",
|
16
|
+
# :publish_date => Date.new(2009,7,10),
|
17
|
+
# :tags => %w(ruby postage),
|
18
|
+
# :filter => :markdown,
|
19
|
+
# :content => <<-end_content.gsub(/[ ]{2}/,'')
|
20
|
+
# Ok. This is a test for create new `entry` from test unit and this paragraph will be
|
21
|
+
# the post summary.
|
22
|
+
#
|
23
|
+
# In this file, I'll write any content ... only for test.
|
24
|
+
# Postage is a lightweight API for load posts from flat file that contains
|
25
|
+
# text filtered by [Markdown][] syntax.
|
26
|
+
#
|
27
|
+
# [markdown]: http://daringfireball.net/projects/markdown/
|
28
|
+
# end_content
|
29
|
+
class Post
|
30
|
+
|
31
|
+
# Post publish date, of course.
|
32
|
+
attr_reader :publish_date
|
33
|
+
# The title accepts Markdown syntax.
|
34
|
+
attr_reader :title
|
35
|
+
# Tags accepts only one word per tag.
|
36
|
+
attr_reader :tags
|
37
|
+
# Summary is a first paragraph of content.
|
38
|
+
attr_reader :summary
|
39
|
+
attr_reader :content
|
40
|
+
# Filter for render post file.
|
41
|
+
attr_reader :filter
|
42
|
+
attr_reader :file
|
43
|
+
|
44
|
+
# Initialize new post using options.
|
45
|
+
def initialize(options = {})
|
46
|
+
options.instance_variables_set_to(self)
|
47
|
+
end
|
48
|
+
|
49
|
+
# Load all attributes from file name and read content.
|
50
|
+
def self.load(file_name)
|
51
|
+
new.extract_attributes(file_name)
|
52
|
+
end
|
53
|
+
|
54
|
+
# Check and extract all attributes from file name.
|
55
|
+
def extract_attributes(file_name)
|
56
|
+
extract_publish_date(file_name)
|
57
|
+
extract_tags(file_name)
|
58
|
+
extract_filter(file_name)
|
59
|
+
extract_title_and_content(file_name)
|
60
|
+
@file = File.basename(file_name)
|
61
|
+
@title = @file.gsub('_', ' ').capitalize if @title.to_s.empty?
|
62
|
+
@summary = @content.match(%r{<p>.*</p>}).to_s
|
63
|
+
self
|
64
|
+
end
|
65
|
+
|
66
|
+
# Return post name formatted ("year/month/day/name").
|
67
|
+
def to_s
|
68
|
+
@file.scan(%r{(\d{4})(\d{2})(\d{2})(.*?)-(.*?)\..*}) do |year,month,day,time,name|
|
69
|
+
return "#{year}/#{month}/#{day}/#{name}"
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
# Build post file name and return following format: yyyymmdd-post_name.tags.separated.by.points.filter
|
74
|
+
def build_file
|
75
|
+
@file = "#{build_publish_date}-#{build_file_name}.#{build_tags}.#{build_filter}"
|
76
|
+
end
|
77
|
+
|
78
|
+
# Get post file name and creates content and save into directory.
|
79
|
+
def create_into(directory)
|
80
|
+
File.open(File.join(directory, @file), 'a') do |file|
|
81
|
+
post = self
|
82
|
+
file << ERB.new(load_template).result(binding)
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
86
|
+
def matched?(regexp)
|
87
|
+
@title.match(regexp) || @file.match(regexp)
|
88
|
+
end
|
89
|
+
|
90
|
+
private
|
91
|
+
|
92
|
+
def extract_publish_date(file_name)
|
93
|
+
file_name.scan(%r{/(\d{4})(\d{2})(\d{2})(.*?)-.*}) do |year,month,day,time|
|
94
|
+
return extract_publish_datetime(file_name) unless time.empty?
|
95
|
+
@publish_date = Date.new(year.to_i, month.to_i, day.to_i)
|
96
|
+
end
|
97
|
+
end
|
98
|
+
|
99
|
+
def extract_publish_datetime(file_name)
|
100
|
+
file_name.scan(%r{/(\d{4})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})-.*}) do |year,month,day,hour,min,sec|
|
101
|
+
@publish_date = DateTime.new(year.to_i, month.to_i, day.to_i, hour.to_i, min.to_i, sec.to_i)
|
102
|
+
end
|
103
|
+
end
|
104
|
+
def extract_title(file_name)
|
105
|
+
Maruku.new(title).to_html.gsub(/<[hp]\d{0,1}.*?>(.*)<\/[hp]\d{0,1}>/){$1}
|
106
|
+
end
|
107
|
+
|
108
|
+
def extract_tags(file_name)
|
109
|
+
@tags = file_name.scan(%r{.*?-.*?\.(.*)\..*}).to_s.split('.')
|
110
|
+
end
|
111
|
+
|
112
|
+
def extract_filter(file_name)
|
113
|
+
file_name.scan(%r{.*\.(.*)}) do |filter|
|
114
|
+
@filter = case filter.to_s
|
115
|
+
when /md|mkd|mark.*/
|
116
|
+
:markdown
|
117
|
+
when /tx|txt|text.*/
|
118
|
+
:textile
|
119
|
+
else
|
120
|
+
:text
|
121
|
+
end
|
122
|
+
end
|
123
|
+
end
|
124
|
+
|
125
|
+
def find_file(year, month, day, name)
|
126
|
+
# TODO: check posts directory
|
127
|
+
Dir["#{year}#{month}#{day}-#{name}**.*"].first
|
128
|
+
end
|
129
|
+
|
130
|
+
def load_file(file)
|
131
|
+
File.read(file)
|
132
|
+
end
|
133
|
+
|
134
|
+
def extract_title_and_content(file_name)
|
135
|
+
_content = File.readlines(file_name)
|
136
|
+
_title = _content.shift
|
137
|
+
_title += _content.shift if (_content.first =~ /==/)
|
138
|
+
@title = Maruku.new(_title).to_html.gsub(/<h1.*?>(.*)<\/h1>/){$1}
|
139
|
+
@content = Maruku.new(_content.to_s).to_html
|
140
|
+
end
|
141
|
+
|
142
|
+
def build_file_name
|
143
|
+
@title.downcase.gsub(/ /, '_').gsub(/[^a-z0-9_]/, '').squeeze('_')
|
144
|
+
end
|
145
|
+
|
146
|
+
def build_tags
|
147
|
+
@tags.join('.')
|
148
|
+
end
|
149
|
+
|
150
|
+
def build_publish_date
|
151
|
+
@publish_date.strftime('%Y%m%d')
|
152
|
+
end
|
153
|
+
|
154
|
+
def build_filter
|
155
|
+
case @filter
|
156
|
+
when :markdown
|
157
|
+
"mkd"
|
158
|
+
when :textile
|
159
|
+
"txl"
|
160
|
+
else :none
|
161
|
+
""
|
162
|
+
end
|
163
|
+
end
|
164
|
+
|
165
|
+
def load_template
|
166
|
+
File.read(template)
|
167
|
+
end
|
168
|
+
|
169
|
+
def template
|
170
|
+
File.join(ROOT,'templates','post.erb')
|
171
|
+
end
|
172
|
+
|
173
|
+
end # class Post
|
174
|
+
|
175
|
+
end # module Postage
|
176
|
+
|
data/lib/postage.rb
ADDED
@@ -0,0 +1,40 @@
|
|
1
|
+
# Copyright (c) 2009, Hallison Vasconcelos Batista
|
2
|
+
#
|
3
|
+
# Author:: Hallison Batista <email@hallisonbatista.com>
|
4
|
+
#
|
5
|
+
$LOAD_PATH << File.expand_path(File.dirname(__FILE__))
|
6
|
+
|
7
|
+
# Main module for API.
|
8
|
+
module Postage
|
9
|
+
|
10
|
+
%w(rubygems maruku erb).map do |dependency|
|
11
|
+
require dependency
|
12
|
+
end
|
13
|
+
|
14
|
+
%w(ruby-debug).map do |optional|
|
15
|
+
require optional
|
16
|
+
end
|
17
|
+
|
18
|
+
# Root directory for references library.
|
19
|
+
ROOT = File.expand_path(File.join(File.dirname(__FILE__), '..'))
|
20
|
+
INFO = YAML.load_file(File.join(ROOT, "INFO"))
|
21
|
+
|
22
|
+
# Postage core extensions.
|
23
|
+
require 'extensions'
|
24
|
+
|
25
|
+
# Auto-load all libraries
|
26
|
+
autoload :Post, 'postage/post'
|
27
|
+
autoload :Finder, 'postage/finder'
|
28
|
+
|
29
|
+
class << self
|
30
|
+
|
31
|
+
# Returns the module formatted name.
|
32
|
+
def to_s
|
33
|
+
"#{INFO[:name]} v#{INFO[:version]} (#{INFO[:cycle]})"
|
34
|
+
end
|
35
|
+
alias :info :to_s
|
36
|
+
|
37
|
+
end
|
38
|
+
|
39
|
+
end # module Postage
|
40
|
+
|
data/tasks/package.rake
ADDED
@@ -0,0 +1,70 @@
|
|
1
|
+
require 'rake/packagetask'
|
2
|
+
require 'rake/gempackagetask'
|
3
|
+
|
4
|
+
def manifest_file
|
5
|
+
File.readlines(File.join(Postage::ROOT, "MANIFEST"))
|
6
|
+
end
|
7
|
+
|
8
|
+
def manifest
|
9
|
+
manifest_file.map do |file|
|
10
|
+
file.strip
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
def spec
|
15
|
+
Gem::Specification.new do |spec|
|
16
|
+
spec.platform = Gem::Platform::RUBY
|
17
|
+
Postage::INFO.each do |info, value|
|
18
|
+
spec.send("#{info}=", value) if spec.respond_to? "#{info}="
|
19
|
+
end
|
20
|
+
|
21
|
+
Postage::INFO[:dependencies].each do |name, version|
|
22
|
+
spec.add_dependency name, version
|
23
|
+
end
|
24
|
+
|
25
|
+
spec.require_paths = %w[lib]
|
26
|
+
spec.files = manifest
|
27
|
+
spec.test_files = spec.files.select{ |path| path =~ /^test\/.*_test.rb/ }
|
28
|
+
|
29
|
+
spec.has_rdoc = true
|
30
|
+
spec.extra_rdoc_files = %w[README LICENSE]
|
31
|
+
spec.add_development_dependency 'ruby-debug', '>= 0.10.3'
|
32
|
+
|
33
|
+
spec.rdoc_options = ["--line-numbers", "--inline-source", "--title", "Postage", "--main", "README"]
|
34
|
+
spec.rubyforge_project = spec.name
|
35
|
+
spec.rubygems_version = '1.1.1'
|
36
|
+
end # Gem::Specification
|
37
|
+
end
|
38
|
+
|
39
|
+
def package(ext)
|
40
|
+
"pkg/#{spec.name}-#{spec.version}.#{ext}"
|
41
|
+
end
|
42
|
+
|
43
|
+
Rake::GemPackageTask.new(spec) do |pkg|
|
44
|
+
pkg.need_tar_bz2 = true
|
45
|
+
end
|
46
|
+
|
47
|
+
desc "Generate MANIFEST file."
|
48
|
+
task :manifest do |file|
|
49
|
+
File.open(File.join(Postage::ROOT, file.name.upcase), "w+") do |manifest|
|
50
|
+
manifest.write(
|
51
|
+
`git ls-files`.split("\n").sort.reject do |ignored|
|
52
|
+
ignored =~ /^\./ || ignored =~ /rdoc/
|
53
|
+
end.join("\n")
|
54
|
+
)
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
desc "Install gem file."
|
59
|
+
task :install => [ :manifest, :gem ] do
|
60
|
+
`gem install pkg/#{spec.name}-#{spec.version}.gem --local`
|
61
|
+
end
|
62
|
+
|
63
|
+
desc 'Publish gem and tarball to rubyforge.org.'
|
64
|
+
task :release => [ :gem, :package] do |t|
|
65
|
+
sh <<-end_sh.gsub(/^[ ]{4}/,'')
|
66
|
+
rubyforge add_release #{spec.name} #{spec.name} #{spec.version} #{package "gem"} &&
|
67
|
+
rubyforge add_file #{spec.name} #{spec.name} #{spec.version} #{package("tar.bz2")}
|
68
|
+
end_sh
|
69
|
+
end
|
70
|
+
|
data/tasks/postage.rake
ADDED
File without changes
|
data/templates/post.erb
ADDED
@@ -0,0 +1,192 @@
|
|
1
|
+
Creating new `entry` from test unit
|
2
|
+
===================================
|
3
|
+
|
4
|
+
Ok. This is a test for create new `entry` from test unit and this paragraph will summary.
|
5
|
+
|
6
|
+
In this file, I'll write any content ... only for test.
|
7
|
+
Postage is a lightweight API for load posts from flat file that contains
|
8
|
+
text filtered by [Markdown][] syntax.
|
9
|
+
|
10
|
+
[Markdown]: http://daringfireball.net/projects/markdown/
|
11
|
+
|
12
|
+
|
13
|
+
Creating new `entry` from test unit
|
14
|
+
===================================
|
15
|
+
|
16
|
+
Ok. This is a test for create new `entry` from test unit and this paragraph will summary.
|
17
|
+
|
18
|
+
In this file, I'll write any content ... only for test.
|
19
|
+
Postage is a lightweight API for load posts from flat file that contains
|
20
|
+
text filtered by [Markdown][] syntax.
|
21
|
+
|
22
|
+
[Markdown]: http://daringfireball.net/projects/markdown/
|
23
|
+
|
24
|
+
|
25
|
+
Creating new `entry` from test unit
|
26
|
+
===================================
|
27
|
+
|
28
|
+
Ok. This is a test for create new `entry` from test unit and this paragraph will summary.
|
29
|
+
|
30
|
+
In this file, I'll write any content ... only for test.
|
31
|
+
Postage is a lightweight API for load posts from flat file that contains
|
32
|
+
text filtered by [Markdown][] syntax.
|
33
|
+
|
34
|
+
[Markdown]: http://daringfireball.net/projects/markdown/
|
35
|
+
|
36
|
+
|
37
|
+
Creating new `entry` from test unit
|
38
|
+
===================================
|
39
|
+
|
40
|
+
Ok. This is a test for create new `entry` from test unit and this paragraph will summary.
|
41
|
+
|
42
|
+
In this file, I'll write any content ... only for test.
|
43
|
+
Postage is a lightweight API for load posts from flat file that contains
|
44
|
+
text filtered by [Markdown][] syntax.
|
45
|
+
|
46
|
+
[Markdown]: http://daringfireball.net/projects/markdown/
|
47
|
+
|
48
|
+
|
49
|
+
Creating new `entry` from test unit
|
50
|
+
===================================
|
51
|
+
|
52
|
+
Ok. This is a test for create new `entry` from test unit and this paragraph will summary.
|
53
|
+
|
54
|
+
In this file, I'll write any content ... only for test.
|
55
|
+
Postage is a lightweight API for load posts from flat file that contains
|
56
|
+
text filtered by [Markdown][] syntax.
|
57
|
+
|
58
|
+
[Markdown]: http://daringfireball.net/projects/markdown/
|
59
|
+
|
60
|
+
|
61
|
+
Creating new `entry` from test unit
|
62
|
+
===================================
|
63
|
+
|
64
|
+
Ok. This is a test for create new `entry` from test unit and this paragraph will summary.
|
65
|
+
|
66
|
+
In this file, I'll write any content ... only for test.
|
67
|
+
Postage is a lightweight API for load posts from flat file that contains
|
68
|
+
text filtered by [Markdown][] syntax.
|
69
|
+
|
70
|
+
[Markdown]: http://daringfireball.net/projects/markdown/
|
71
|
+
|
72
|
+
|
73
|
+
Creating new `entry` from test unit
|
74
|
+
===================================
|
75
|
+
|
76
|
+
Ok. This is a test for create new `entry` from test unit and this paragraph will summary.
|
77
|
+
|
78
|
+
In this file, I'll write any content ... only for test.
|
79
|
+
Postage is a lightweight API for load posts from flat file that contains
|
80
|
+
text filtered by [Markdown][] syntax.
|
81
|
+
|
82
|
+
[Markdown]: http://daringfireball.net/projects/markdown/
|
83
|
+
|
84
|
+
|
85
|
+
Creating new `entry` from test unit
|
86
|
+
===================================
|
87
|
+
|
88
|
+
Ok. This is a test for create new `entry` from test unit and this paragraph will summary.
|
89
|
+
|
90
|
+
In this file, I'll write any content ... only for test.
|
91
|
+
Postage is a lightweight API for load posts from flat file that contains
|
92
|
+
text filtered by [Markdown][] syntax.
|
93
|
+
|
94
|
+
[Markdown]: http://daringfireball.net/projects/markdown/
|
95
|
+
|
96
|
+
|
97
|
+
Creating new `entry` from test unit
|
98
|
+
===================================
|
99
|
+
|
100
|
+
Ok. This is a test for create new `entry` from test unit and this paragraph will summary.
|
101
|
+
|
102
|
+
In this file, I'll write any content ... only for test.
|
103
|
+
Postage is a lightweight API for load posts from flat file that contains
|
104
|
+
text filtered by [Markdown][] syntax.
|
105
|
+
|
106
|
+
[Markdown]: http://daringfireball.net/projects/markdown/
|
107
|
+
|
108
|
+
|
109
|
+
Creating new `entry` from test unit
|
110
|
+
===================================
|
111
|
+
|
112
|
+
Ok. This is a test for create new `entry` from test unit and this paragraph will summary.
|
113
|
+
|
114
|
+
In this file, I'll write any content ... only for test.
|
115
|
+
Postage is a lightweight API for load posts from flat file that contains
|
116
|
+
text filtered by [Markdown][] syntax.
|
117
|
+
|
118
|
+
[Markdown]: http://daringfireball.net/projects/markdown/
|
119
|
+
|
120
|
+
|
121
|
+
Creating new `entry` from test unit
|
122
|
+
===================================
|
123
|
+
|
124
|
+
Ok. This is a test for create new `entry` from test unit and this paragraph will summary.
|
125
|
+
|
126
|
+
In this file, I'll write any content ... only for test.
|
127
|
+
Postage is a lightweight API for load posts from flat file that contains
|
128
|
+
text filtered by [Markdown][] syntax.
|
129
|
+
|
130
|
+
[Markdown]: http://daringfireball.net/projects/markdown/
|
131
|
+
|
132
|
+
|
133
|
+
Creating new `entry` from test unit
|
134
|
+
===================================
|
135
|
+
|
136
|
+
Ok. This is a test for create new `entry` from test unit and this paragraph will summary.
|
137
|
+
|
138
|
+
In this file, I'll write any content ... only for test.
|
139
|
+
Postage is a lightweight API for load posts from flat file that contains
|
140
|
+
text filtered by [Markdown][] syntax.
|
141
|
+
|
142
|
+
[Markdown]: http://daringfireball.net/projects/markdown/
|
143
|
+
|
144
|
+
|
145
|
+
Creating new `entry` from test unit
|
146
|
+
===================================
|
147
|
+
|
148
|
+
Ok. This is a test for create new `entry` from test unit and this paragraph will summary.
|
149
|
+
|
150
|
+
In this file, I'll write any content ... only for test.
|
151
|
+
Postage is a lightweight API for load posts from flat file that contains
|
152
|
+
text filtered by [Markdown][] syntax.
|
153
|
+
|
154
|
+
[Markdown]: http://daringfireball.net/projects/markdown/
|
155
|
+
|
156
|
+
|
157
|
+
Creating new `entry` from test unit
|
158
|
+
===================================
|
159
|
+
|
160
|
+
Ok. This is a test for create new `entry` from test unit and this paragraph will summary.
|
161
|
+
|
162
|
+
In this file, I'll write any content ... only for test.
|
163
|
+
Postage is a lightweight API for load posts from flat file that contains
|
164
|
+
text filtered by [Markdown][] syntax.
|
165
|
+
|
166
|
+
[Markdown]: http://daringfireball.net/projects/markdown/
|
167
|
+
|
168
|
+
|
169
|
+
Creating new `entry` from test unit
|
170
|
+
===================================
|
171
|
+
|
172
|
+
Ok. This is a test for create new `entry` from test unit and this paragraph will summary.
|
173
|
+
|
174
|
+
In this file, I'll write any content ... only for test.
|
175
|
+
Postage is a lightweight API for load posts from flat file that contains
|
176
|
+
text filtered by [Markdown][] syntax.
|
177
|
+
|
178
|
+
[Markdown]: http://daringfireball.net/projects/markdown/
|
179
|
+
|
180
|
+
|
181
|
+
Creating new `entry` from test unit
|
182
|
+
===================================
|
183
|
+
|
184
|
+
Ok. This is a test for create new `entry` from test unit and this paragraph will summary.
|
185
|
+
|
186
|
+
In this file, I'll write any content ... only for test.
|
187
|
+
Postage is a lightweight API for load posts from flat file that contains
|
188
|
+
text filtered by [Markdown][] syntax.
|
189
|
+
|
190
|
+
[Markdown]: http://daringfireball.net/projects/markdown/
|
191
|
+
|
192
|
+
|
data/test/test_finder.rb
ADDED
@@ -0,0 +1,27 @@
|
|
1
|
+
$LOAD_PATH.unshift("#{File.dirname(__FILE__)}/..")
|
2
|
+
|
3
|
+
require 'test/unit'
|
4
|
+
require 'lib/postage'
|
5
|
+
|
6
|
+
class TestFinder < Test::Unit::TestCase
|
7
|
+
|
8
|
+
def setup
|
9
|
+
@find = Postage::Finder.new("#{File.dirname(__FILE__)}/fixtures")
|
10
|
+
end
|
11
|
+
|
12
|
+
def test_should_find_post
|
13
|
+
date = Date.new(2009,6,4)
|
14
|
+
assert_equal date, @find.post(*date.to_args << 'postage').publish_date
|
15
|
+
assert_equal date, @find.post(*%w[2009 06 04 postage]).publish_date
|
16
|
+
end
|
17
|
+
|
18
|
+
def test_should_load_all_posts
|
19
|
+
assert_equal 5, @find.all_posts.size
|
20
|
+
end
|
21
|
+
|
22
|
+
def test_should_load_all_tags
|
23
|
+
assert_equal 3, @find.all_post_tags.size
|
24
|
+
end
|
25
|
+
|
26
|
+
end
|
27
|
+
|
data/test/test_post.rb
ADDED
@@ -0,0 +1,62 @@
|
|
1
|
+
$LOAD_PATH.unshift("#{File.dirname(__FILE__)}/..")
|
2
|
+
|
3
|
+
require 'test/unit'
|
4
|
+
require 'lib/postage'
|
5
|
+
|
6
|
+
class TestPost < Test::Unit::TestCase
|
7
|
+
|
8
|
+
def setup
|
9
|
+
@attributes = {
|
10
|
+
:publish_date => Date.new(2009, 06, 04),
|
11
|
+
:title => "Postage test <em>post</em>",
|
12
|
+
:tags => %w(ruby postage),
|
13
|
+
:filter => :markdown,
|
14
|
+
:file => "20090604-postage_test_post.ruby.postage.mkd"
|
15
|
+
}
|
16
|
+
@post = Postage::Post.load("#{File.dirname(__FILE__)}/fixtures/20090604-postage_test_post.ruby.postage.mkd")
|
17
|
+
end
|
18
|
+
|
19
|
+
def test_should_load_attributes_from_file_name_with_simple_date
|
20
|
+
@attributes.each do |attribute, value|
|
21
|
+
assert_equal value, @post.send(attribute)
|
22
|
+
end
|
23
|
+
assert_equal "2009/06/04/postage_test_post", "#{@post}"
|
24
|
+
end
|
25
|
+
|
26
|
+
def test_should_load_attributes_from_file_name_with_datetime
|
27
|
+
@attributes.update(
|
28
|
+
:publish_date => DateTime.new(2009,6,4,14,38,5),
|
29
|
+
:file => "20090604143805-postage_test_post.ruby.postage.mkd"
|
30
|
+
)
|
31
|
+
@post = Postage::Post.load("#{File.dirname(__FILE__)}/fixtures/20090604143805-postage_test_post.ruby.postage.mkd")
|
32
|
+
@attributes.each do |attribute, value|
|
33
|
+
assert_equal value, @post.send(attribute)
|
34
|
+
end
|
35
|
+
assert_equal "2009/06/04/postage_test_post", "#{@post}"
|
36
|
+
end
|
37
|
+
|
38
|
+
def test_should_check_html_in_content
|
39
|
+
assert_match %r{<p>.*?</p>}, @post.content
|
40
|
+
end
|
41
|
+
|
42
|
+
def test_should_create_new_post_file
|
43
|
+
@post = Postage::Post.new :title => "Creating new `entry` from test unit",
|
44
|
+
:publish_date => Date.new(2009,6,8),
|
45
|
+
:tags => %w(ruby postage test),
|
46
|
+
:filter => :markdown,
|
47
|
+
:content => <<-end_content.gsub(/[ ]{6}/,'')
|
48
|
+
Ok. This is a test for create new `entry` from test unit and this paragraph will summary.
|
49
|
+
|
50
|
+
In this file, I'll write any content ... only for test.
|
51
|
+
Postage is a lightweight API for load posts from flat file that contains
|
52
|
+
text filtered by [Markdown][] syntax.
|
53
|
+
|
54
|
+
[Markdown]: http://daringfireball.net/projects/markdown/
|
55
|
+
end_content
|
56
|
+
|
57
|
+
assert_equal "20090608-creating_new_entry_from_test_unit.ruby.postage.test.mkd", @post.build_file
|
58
|
+
@post.create_into "#{File.dirname(__FILE__)}/fixtures"
|
59
|
+
assert File.exist?("#{File.dirname(__FILE__)}/fixtures/#{@post.file}")
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
metadata
ADDED
@@ -0,0 +1,100 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: postage
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Hallison Batista
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
|
12
|
+
date: 2009-07-11 00:00:00 -04:00
|
13
|
+
default_executable:
|
14
|
+
dependencies:
|
15
|
+
- !ruby/object:Gem::Dependency
|
16
|
+
name: maruku
|
17
|
+
type: :runtime
|
18
|
+
version_requirement:
|
19
|
+
version_requirements: !ruby/object:Gem::Requirement
|
20
|
+
requirements:
|
21
|
+
- - ">="
|
22
|
+
- !ruby/object:Gem::Version
|
23
|
+
version: 0.6.0
|
24
|
+
version:
|
25
|
+
- !ruby/object:Gem::Dependency
|
26
|
+
name: ruby-debug
|
27
|
+
type: :development
|
28
|
+
version_requirement:
|
29
|
+
version_requirements: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: 0.10.3
|
34
|
+
version:
|
35
|
+
description: Postage is an API developed for handle text files for posts for blogs or anything else.
|
36
|
+
email: email@hallisonbatista.com
|
37
|
+
executables: []
|
38
|
+
|
39
|
+
extensions: []
|
40
|
+
|
41
|
+
extra_rdoc_files:
|
42
|
+
- README
|
43
|
+
- LICENSE
|
44
|
+
files:
|
45
|
+
- AUTHORS
|
46
|
+
- CHANGES
|
47
|
+
- INFO
|
48
|
+
- LICENSE
|
49
|
+
- MANIFEST
|
50
|
+
- README
|
51
|
+
- Rakefile
|
52
|
+
- lib/extensions.rb
|
53
|
+
- lib/postage.rb
|
54
|
+
- lib/postage/finder.rb
|
55
|
+
- lib/postage/post.rb
|
56
|
+
- tasks/package.rake
|
57
|
+
- tasks/postage.rake
|
58
|
+
- templates/post.erb
|
59
|
+
- test/fixtures/20080501-postage_test_post.ruby.postage.mkd
|
60
|
+
- test/fixtures/20080601-postage_test_post.ruby.postage.mkd
|
61
|
+
- test/fixtures/20090604-postage_test_post.ruby.postage.mkd
|
62
|
+
- test/fixtures/20090604143805-postage_test_post.ruby.postage.mkd
|
63
|
+
- test/fixtures/20090608-creating_new_entry_from_test_unit.ruby.postage.test.mkd
|
64
|
+
- test/test_finder.rb
|
65
|
+
- test/test_post.rb
|
66
|
+
has_rdoc: true
|
67
|
+
homepage: http://postage.rubyforge.org/
|
68
|
+
licenses: []
|
69
|
+
|
70
|
+
post_install_message:
|
71
|
+
rdoc_options:
|
72
|
+
- --line-numbers
|
73
|
+
- --inline-source
|
74
|
+
- --title
|
75
|
+
- Postage
|
76
|
+
- --main
|
77
|
+
- README
|
78
|
+
require_paths:
|
79
|
+
- lib
|
80
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
81
|
+
requirements:
|
82
|
+
- - ">="
|
83
|
+
- !ruby/object:Gem::Version
|
84
|
+
version: "0"
|
85
|
+
version:
|
86
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
87
|
+
requirements:
|
88
|
+
- - ">="
|
89
|
+
- !ruby/object:Gem::Version
|
90
|
+
version: "0"
|
91
|
+
version:
|
92
|
+
requirements: []
|
93
|
+
|
94
|
+
rubyforge_project: postage
|
95
|
+
rubygems_version: 1.3.3
|
96
|
+
signing_key:
|
97
|
+
specification_version: 3
|
98
|
+
summary: Postage API implemented for helper handle text files for posts.
|
99
|
+
test_files: []
|
100
|
+
|