planet 0.0.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/bin/planet +78 -0
- data/lib/planet.rb +106 -0
- data/lib/planet_version.rb +3 -0
- metadata +82 -0
data/bin/planet
ADDED
@@ -0,0 +1,78 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# 1.9 adds realpath to resolve symlinks; 1.8 doesn't
|
3
|
+
# have this method, so we add it so we get resolved symlinks
|
4
|
+
# and compatibility
|
5
|
+
|
6
|
+
unless File.respond_to? :realpath
|
7
|
+
class File #:nodoc:
|
8
|
+
def self.realpath path
|
9
|
+
return realpath(File.readlink(path)) if symlink?(path)
|
10
|
+
path
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
$: << File.expand_path(File.dirname(File.realpath(__FILE__)) + '/../lib')
|
15
|
+
require 'rubygems'
|
16
|
+
require 'gli'
|
17
|
+
require 'planet'
|
18
|
+
require 'ruby-debug'
|
19
|
+
|
20
|
+
include GLI
|
21
|
+
|
22
|
+
program_desc 'Describe your application here'
|
23
|
+
|
24
|
+
desc 'Parses planet.yml file for blogs and generates their posts in Jekyll compliant format under the _posts directory'
|
25
|
+
command :generate do |c|
|
26
|
+
|
27
|
+
c.action do |global_options,options,args|
|
28
|
+
conf = YAML.load File.open('planet.yml', 'r').read
|
29
|
+
|
30
|
+
@planet = Planet.new
|
31
|
+
|
32
|
+
conf['blogs'].each do |blog|
|
33
|
+
@planet.blogs << Blog.new(
|
34
|
+
blog['feed'],
|
35
|
+
blog['author'],
|
36
|
+
blog['image'],
|
37
|
+
[]
|
38
|
+
)
|
39
|
+
end
|
40
|
+
|
41
|
+
@planet.aggregate
|
42
|
+
|
43
|
+
@planet.write_posts
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
desc 'Creates basic planet.yml file'
|
48
|
+
command :init do |c|
|
49
|
+
c.action do |global_options,options,args|
|
50
|
+
raise Exception.new('There is already a planet.yml file present') if File.exist? 'planet.yml'
|
51
|
+
|
52
|
+
default = 'blogs:
|
53
|
+
- author: "Pablo Astigarraga"
|
54
|
+
feed: "http://blog.poteland.com/atom.xml"
|
55
|
+
image: "http://poteland.com/images/avatars/red_mage.png"
|
56
|
+
|
57
|
+
- author: "Cubox"
|
58
|
+
feed: "http://blog.cuboxlabs.com/atom.xml"
|
59
|
+
image: "http://cuboxlabs.com/img/cubox-humans/could-be-you.png"'
|
60
|
+
|
61
|
+
File.open('planet.yml', 'w') { |f| f.write(default) }
|
62
|
+
puts '=> created default planet.yml'
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
pre do |global,command,options,args|
|
67
|
+
true
|
68
|
+
end
|
69
|
+
|
70
|
+
post do |global,command,options,args|
|
71
|
+
true
|
72
|
+
end
|
73
|
+
|
74
|
+
on_error do |exception|
|
75
|
+
true
|
76
|
+
end
|
77
|
+
|
78
|
+
exit GLI.run(ARGV)
|
data/lib/planet.rb
ADDED
@@ -0,0 +1,106 @@
|
|
1
|
+
require 'simple-rss'
|
2
|
+
require 'open-uri'
|
3
|
+
|
4
|
+
class Blog < Struct.new(:feed, :author, :image, :posts)
|
5
|
+
end
|
6
|
+
|
7
|
+
class Post < Struct.new(:title, :content, :date, :link, :blog)
|
8
|
+
|
9
|
+
def to_hash
|
10
|
+
{
|
11
|
+
title: title,
|
12
|
+
date: date.strftime('%Y-%m-%d %H:%M'),
|
13
|
+
link: link,
|
14
|
+
content: content,
|
15
|
+
author: blog.author
|
16
|
+
}
|
17
|
+
end
|
18
|
+
|
19
|
+
def header
|
20
|
+
## TODO: We need categories/tags
|
21
|
+
"---
|
22
|
+
title: \"%{title}\"
|
23
|
+
kind: article
|
24
|
+
author: %{author}
|
25
|
+
created_at: %{date}
|
26
|
+
---
|
27
|
+
" % self.to_hash
|
28
|
+
end
|
29
|
+
|
30
|
+
def file_name
|
31
|
+
name_date = date ? date.strftime('%Y-%m-%d') : nil
|
32
|
+
name_title = title.downcase.scan(/\w+/).join('-')
|
33
|
+
|
34
|
+
[name_date, name_title].join('-')
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
class Planet
|
39
|
+
|
40
|
+
def initialize
|
41
|
+
@@_posts = []
|
42
|
+
@@_blogs = []
|
43
|
+
end
|
44
|
+
|
45
|
+
def posts(options = {})
|
46
|
+
return @@_posts unless options[:filter]
|
47
|
+
|
48
|
+
filtered_posts = @@_posts
|
49
|
+
|
50
|
+
filtered_posts = case options[:filter][:date]
|
51
|
+
when true
|
52
|
+
filtered_posts.reject { |p| p.date.nil? }
|
53
|
+
when false || nil
|
54
|
+
filtered_posts.reject { |p| !p.date.nil? }
|
55
|
+
else
|
56
|
+
filtered_posts
|
57
|
+
end
|
58
|
+
|
59
|
+
filtered_posts = case options[:filter][:order]
|
60
|
+
when :date
|
61
|
+
with_date = filtered_posts.reject { |p| p.date.nil? }
|
62
|
+
without_date = filtered_posts.reject { |p| !p.date.nil? }
|
63
|
+
|
64
|
+
with_date.sort_by { |po| po.date }.reverse + without_date
|
65
|
+
else
|
66
|
+
filtered_posts
|
67
|
+
end
|
68
|
+
|
69
|
+
filtered_posts
|
70
|
+
end
|
71
|
+
|
72
|
+
def blogs
|
73
|
+
@@_blogs
|
74
|
+
end
|
75
|
+
|
76
|
+
def aggregate
|
77
|
+
@@_blogs.each do |blog|
|
78
|
+
rss = SimpleRSS.parse open(blog.feed)
|
79
|
+
rss.entries.each do |entry|
|
80
|
+
@@_posts << @post = Post.new(
|
81
|
+
entry.fetch(:title),
|
82
|
+
entry.fetch(:content).strip,
|
83
|
+
entry.fetch(:updated, nil), # Yeah, I know, Im following the default octopress value for the date parameter.
|
84
|
+
entry.fetch(:id, nil), # Er, this is the full link to the article
|
85
|
+
blog
|
86
|
+
)
|
87
|
+
|
88
|
+
blog.posts << @post
|
89
|
+
end
|
90
|
+
end
|
91
|
+
end
|
92
|
+
|
93
|
+
def write_posts
|
94
|
+
Dir.mkdir("_posts") unless File.directory?("_posts")
|
95
|
+
|
96
|
+
posts(filter: {date: true, order: :date}).each do |post|
|
97
|
+
file_name = '_posts/'.concat post.file_name
|
98
|
+
|
99
|
+
File.open(file_name + '.markdown', "w+") { |f|
|
100
|
+
f.write(post.header)
|
101
|
+
f.write(post.content)
|
102
|
+
f.close
|
103
|
+
}
|
104
|
+
end
|
105
|
+
end
|
106
|
+
end
|
metadata
ADDED
@@ -0,0 +1,82 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: planet
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Pablo Astigarraga
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2012-04-14 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: rake
|
16
|
+
requirement: &2152640020 !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
18
|
+
requirements:
|
19
|
+
- - ! '>='
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: '0'
|
22
|
+
type: :development
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: *2152640020
|
25
|
+
- !ruby/object:Gem::Dependency
|
26
|
+
name: gli
|
27
|
+
requirement: &2152639180 !ruby/object:Gem::Requirement
|
28
|
+
none: false
|
29
|
+
requirements:
|
30
|
+
- - ! '>='
|
31
|
+
- !ruby/object:Gem::Version
|
32
|
+
version: '0'
|
33
|
+
type: :runtime
|
34
|
+
prerelease: false
|
35
|
+
version_requirements: *2152639180
|
36
|
+
- !ruby/object:Gem::Dependency
|
37
|
+
name: simple-rss
|
38
|
+
requirement: &2152637640 !ruby/object:Gem::Requirement
|
39
|
+
none: false
|
40
|
+
requirements:
|
41
|
+
- - ! '>='
|
42
|
+
- !ruby/object:Gem::Version
|
43
|
+
version: '0'
|
44
|
+
type: :runtime
|
45
|
+
prerelease: false
|
46
|
+
version_requirements: *2152637640
|
47
|
+
description:
|
48
|
+
email: pote@tardis.com.uy
|
49
|
+
executables:
|
50
|
+
- planet
|
51
|
+
extensions: []
|
52
|
+
extra_rdoc_files: []
|
53
|
+
files:
|
54
|
+
- bin/planet
|
55
|
+
- lib/planet_version.rb
|
56
|
+
- lib/planet.rb
|
57
|
+
homepage: http://poteland.com
|
58
|
+
licenses: []
|
59
|
+
post_install_message:
|
60
|
+
rdoc_options: []
|
61
|
+
require_paths:
|
62
|
+
- lib
|
63
|
+
- lib
|
64
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
65
|
+
none: false
|
66
|
+
requirements:
|
67
|
+
- - ! '>='
|
68
|
+
- !ruby/object:Gem::Version
|
69
|
+
version: '0'
|
70
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
71
|
+
none: false
|
72
|
+
requirements:
|
73
|
+
- - ! '>='
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '0'
|
76
|
+
requirements: []
|
77
|
+
rubyforge_project:
|
78
|
+
rubygems_version: 1.8.10
|
79
|
+
signing_key:
|
80
|
+
specification_version: 3
|
81
|
+
summary: An awesome rss/atom feed aggregator designed to work with Octopress/Jekyll
|
82
|
+
test_files: []
|