pluto 0.8.2 → 0.8.3
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/.gemtest +0 -0
- data/Manifest.txt +4 -0
- data/README.md +87 -17
- data/Rakefile +3 -3
- data/lib/pluto.rb +5 -3
- data/lib/pluto/cli/main.rb +94 -58
- data/lib/pluto/fetcher.rb +2 -20
- data/lib/pluto/formatter.rb +17 -9
- data/lib/pluto/refresher.rb +186 -0
- data/lib/pluto/subscriber.rb +85 -0
- data/lib/pluto/template_helpers.rb +104 -11
- data/lib/pluto/updater.rb +18 -233
- data/lib/pluto/version.rb +1 -1
- data/test/helper.rb +18 -0
- data/test/test_helpers.rb +75 -0
- metadata +30 -24
data/lib/pluto/updater.rb
CHANGED
@@ -4,246 +4,31 @@ class Updater
|
|
4
4
|
|
5
5
|
include LogUtils::Logging
|
6
6
|
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
@worker = ::Fetcher::Worker.new
|
11
|
-
end
|
12
|
-
|
13
|
-
attr_reader :worker
|
14
|
-
|
15
|
-
def debug=(value)
|
16
|
-
@debug = value
|
17
|
-
### logger.debug "[Updater] setting debug flag - debug? #{debug?}"
|
18
|
-
end
|
19
|
-
|
20
|
-
def debug?
|
21
|
-
@debug || false
|
7
|
+
def initialize( opts, config )
|
8
|
+
@opts = opts
|
9
|
+
@config = config
|
22
10
|
end
|
23
11
|
|
24
|
-
|
25
|
-
|
26
|
-
### fix: use worker.get( url ) # check http response code etc.
|
27
|
-
|
28
|
-
xml = worker.read( url )
|
29
|
-
|
30
|
-
###
|
31
|
-
# NB: Net::HTTP will NOT set encoding UTF-8 etc.
|
32
|
-
# will mostly be ASCII
|
33
|
-
# - try to change encoding to UTF-8 ourselves
|
34
|
-
logger.debug "xml.encoding.name (before): #{xml.encoding.name}"
|
35
|
-
|
36
|
-
#####
|
37
|
-
# NB: ASCII-8BIT == BINARY == Encoding Unknown; Raw Bytes Here
|
38
|
-
|
39
|
-
## NB:
|
40
|
-
# for now "hardcoded" to utf8 - what else can we do?
|
41
|
-
# - note: force_encoding will NOT change the chars only change the assumed encoding w/o translation
|
42
|
-
xml = xml.force_encoding( Encoding::UTF_8 )
|
43
|
-
logger.debug "xml.encoding.name (after): #{xml.encoding.name}"
|
44
|
-
xml
|
45
|
-
end
|
46
|
-
|
47
|
-
|
48
|
-
def update_subscriptions( config, opts={} )
|
49
|
-
|
50
|
-
## for now - use single site w/ key planet -- fix!! allow multiple sites (planets)
|
51
|
-
|
52
|
-
site_attribs = {
|
53
|
-
title: config[ 'title' ]
|
54
|
-
}
|
55
|
-
|
56
|
-
site_key = 'planet'
|
57
|
-
site_rec = Site.find_by_key( site_key )
|
58
|
-
if site_rec.nil?
|
59
|
-
site_rec = Site.new
|
60
|
-
site_attribs[ :key ] = site_key
|
61
|
-
|
62
|
-
## use object_id: site.id and object_type: Site
|
63
|
-
## change - model/table/schema!!!
|
64
|
-
Action.create!( title: 'new site', object: site_attribs[ :title ] )
|
65
|
-
end
|
66
|
-
site_rec.update_attributes!( site_attribs )
|
67
|
-
|
68
|
-
# -- log update action
|
69
|
-
Action.create!( title: 'update subscriptions' )
|
70
|
-
|
71
|
-
|
72
|
-
config.each do |key, value|
|
73
|
-
|
74
|
-
next if ['title','feeds'].include?( key ) # skip "top-level" feed keys e.g. title, etc.
|
75
|
-
|
76
|
-
### todo/check:
|
77
|
-
## check value - must be hash
|
78
|
-
# check if url or feed_url present
|
79
|
-
# that is, check for required props/key-value pairs
|
80
|
-
|
81
|
-
feed_key = key.to_s.dup
|
82
|
-
feed_hash = value
|
83
|
-
|
84
|
-
feed_attribs = {
|
85
|
-
feed_url: feed_hash[ 'feed_url' ],
|
86
|
-
url: feed_hash[ 'url' ],
|
87
|
-
title: feed_hash[ 'title' ] # todo: use title from feed?
|
88
|
-
}
|
89
|
-
|
90
|
-
puts "Updating feed subscription >#{feed_key}< - >#{feed_attribs[:feed_url]}<..."
|
91
|
-
|
92
|
-
feed_rec = Feed.find_by_key( feed_key )
|
93
|
-
if feed_rec.nil?
|
94
|
-
feed_rec = Feed.new
|
95
|
-
feed_attribs[ :key ] = feed_key
|
96
|
-
|
97
|
-
## use object_id: feed.id and object_type: Feed
|
98
|
-
## change - model/table/schema!!!
|
99
|
-
## todo: add parent_action_id - why? why not?
|
100
|
-
Action.create!( title: 'new feed', object: feed_attribs[ :title ] )
|
101
|
-
end
|
102
|
-
|
103
|
-
feed_rec.update_attributes!( feed_attribs )
|
104
|
-
|
105
|
-
## todo:
|
106
|
-
# add subscription records (feed,site) - how?
|
107
|
-
end
|
108
|
-
|
109
|
-
end # method update_subscriptions
|
110
|
-
|
111
|
-
|
112
|
-
def update_feeds( opts={} )
|
113
|
-
|
114
|
-
if debug?
|
115
|
-
## turn on logging for sql too
|
116
|
-
ActiveRecord::Base.logger = Logger.new( STDOUT )
|
117
|
-
end
|
118
|
-
|
119
|
-
### move to feedutils
|
120
|
-
### logger.debug "using stdlib RSS::VERSION #{RSS::VERSION}"
|
121
|
-
|
122
|
-
# -- log update action
|
123
|
-
Action.create!( title: 'update feeds' )
|
124
|
-
|
125
|
-
#####
|
126
|
-
# -- update fetched_at timestamps for all sites
|
127
|
-
feeds_fetched_at = Time.now
|
128
|
-
Site.all.each do |site|
|
129
|
-
site.fetched_at = feeds_fetched_at
|
130
|
-
site.save!
|
131
|
-
end
|
132
|
-
|
133
|
-
Feed.all.each do |feed_rec|
|
134
|
-
|
135
|
-
feed_key = feed_rec.key
|
136
|
-
feed_url = feed_rec.feed_url
|
137
|
-
|
138
|
-
feed_xml = fetch_feed( feed_url )
|
139
|
-
|
140
|
-
logger.debug "feed_xml:"
|
141
|
-
logger.debug feed_xml[ 0..300 ] # get first 300 chars
|
142
|
-
|
143
|
-
# if opts.verbose? # also write a copy to disk
|
144
|
-
if debug?
|
145
|
-
logger.debug "saving feed to >./#{feed_key}.xml<..."
|
146
|
-
File.open( "./#{feed_key}.xml", 'w' ) do |f|
|
147
|
-
f.write( feed_xml )
|
148
|
-
end
|
149
|
-
end
|
150
|
-
|
151
|
-
puts "Before parsing feed >#{feed_key}<..."
|
152
|
-
|
153
|
-
## fix/todo: check for feed.nil? -> error parsing!!!
|
154
|
-
# or throw exception
|
155
|
-
feed = FeedUtils::Parser.parse( feed_xml )
|
156
|
-
|
157
|
-
feed_fetched_at = Time.now
|
158
|
-
|
159
|
-
## todo/check: move feed_rec update to the end (after item updates??)
|
160
|
-
|
161
|
-
# update feed attribs e.g.
|
162
|
-
# generator
|
163
|
-
# published_at,built_at,touched_at,fetched_at
|
164
|
-
# summary,title2
|
165
|
-
|
166
|
-
## fix:
|
167
|
-
## weird rss exception error on windows w/ dates
|
168
|
-
# e.g. /lib/ruby/1.9.1/rss/rss.rb:37:in `w3cdtf': wrong number of arguments (1 for 0) (ArgumentError)
|
169
|
-
#
|
170
|
-
# move to_datetime to feedutils!! if it works
|
171
|
-
|
172
|
-
|
173
|
-
feed_attribs = {
|
174
|
-
fetched_at: feed_fetched_at,
|
175
|
-
format: feed.format,
|
176
|
-
published_at: feed.published? ? feed.published.to_datetime : nil,
|
177
|
-
touched_at: feed.updated? ? feed.updated.to_datetime : nil,
|
178
|
-
built_at: feed.built? ? feed.built.to_datetime : nil,
|
179
|
-
summary: feed.summary? ? feed.summary : nil,
|
180
|
-
title2: feed.title2? ? feed.title2 : nil,
|
181
|
-
generator: feed.generator
|
182
|
-
}
|
183
|
-
|
184
|
-
if debug?
|
185
|
-
## puts "*** dump feed_attribs:"
|
186
|
-
## pp feed_attribs
|
187
|
-
puts "*** dump feed_attribs w/ class types:"
|
188
|
-
feed_attribs.each do |key,value|
|
189
|
-
puts " #{key}: >#{value}< : #{value.class.name}"
|
190
|
-
end
|
191
|
-
end
|
192
|
-
|
193
|
-
feed_rec.update_attributes!( feed_attribs )
|
194
|
-
|
195
|
-
|
196
|
-
feed.items.each do |item|
|
197
|
-
|
198
|
-
item_attribs = {
|
199
|
-
fetched_at: feed_fetched_at,
|
200
|
-
title: item.title,
|
201
|
-
url: item.url,
|
202
|
-
summary: item.summary? ? item.summary : nil,
|
203
|
-
content: item.content? ? item.content : nil,
|
204
|
-
published_at: item.published? ? item.published.to_datetime : nil,
|
205
|
-
touched_at: item.updated? ? item.updated.to_datetime : nil,
|
206
|
-
feed_id: feed_rec.id # add feed_id fk_ref
|
207
|
-
}
|
208
|
-
|
209
|
-
if debug?
|
210
|
-
puts "*** dump item_attribs w/ class types:"
|
211
|
-
item_attribs.each do |key,value|
|
212
|
-
next if [:summary,:content].include?( key ) # skip summary n content
|
213
|
-
puts " #{key}: >#{value}< : #{value.class.name}"
|
214
|
-
end
|
215
|
-
end
|
216
|
-
|
217
|
-
|
218
|
-
rec = Item.find_by_guid( item.guid )
|
219
|
-
if rec.nil?
|
220
|
-
rec = Item.new
|
221
|
-
item_attribs[ :guid ] = item.guid
|
222
|
-
puts "** NEW | #{item.title}"
|
223
|
-
else
|
224
|
-
## todo: check if any attribs changed
|
225
|
-
puts "UPDATE | #{item.title}"
|
226
|
-
end
|
12
|
+
attr_reader :opts, :config
|
227
13
|
|
228
|
-
|
229
|
-
|
14
|
+
def run
|
15
|
+
###################
|
16
|
+
# step 1) update subscriptions
|
17
|
+
subscriber = Subscriber.new
|
230
18
|
|
231
|
-
|
232
|
-
|
233
|
-
|
234
|
-
if item_recs[0].published_at?
|
235
|
-
feed_rec.latest_published_at = item_recs[0].published_at
|
236
|
-
else # try touched_at
|
237
|
-
feed_rec.latest_published_at = item_recs[0].touched_at
|
238
|
-
end
|
239
|
-
feed_rec.save!
|
240
|
-
end
|
19
|
+
# pass along debug/verbose setting/switch
|
20
|
+
subscriber.debug = true if opts.verbose?
|
21
|
+
subscriber.update_subscriptions( config )
|
241
22
|
|
242
|
-
|
23
|
+
##############################
|
24
|
+
# step 2) update feeds
|
25
|
+
refresher = Refresher.new
|
243
26
|
|
27
|
+
# pass along debug/verbose setting/switch
|
28
|
+
refresher.debug = true if opts.verbose?
|
29
|
+
refresher.update_feeds
|
244
30
|
end # method run
|
245
31
|
|
246
|
-
|
247
|
-
end # class Fetcher
|
32
|
+
end # class Updater
|
248
33
|
|
249
34
|
end # module Pluto
|
data/lib/pluto/version.rb
CHANGED
data/test/helper.rb
ADDED
@@ -0,0 +1,18 @@
|
|
1
|
+
## $:.unshift(File.dirname(__FILE__))
|
2
|
+
|
3
|
+
|
4
|
+
## minitest setup
|
5
|
+
|
6
|
+
# require 'minitest/unit'
|
7
|
+
require 'minitest/autorun'
|
8
|
+
|
9
|
+
# include MiniTest::Unit # lets us use TestCase instead of MiniTest::Unit::TestCase
|
10
|
+
|
11
|
+
|
12
|
+
## our own code
|
13
|
+
|
14
|
+
require 'pluto'
|
15
|
+
|
16
|
+
|
17
|
+
LogUtils::Logger.root.level = :debug
|
18
|
+
|
@@ -0,0 +1,75 @@
|
|
1
|
+
# encoding: UTF-8
|
2
|
+
|
3
|
+
###
|
4
|
+
# to run use
|
5
|
+
# ruby -I ./lib -I ./test test/test_rss.rb
|
6
|
+
# or better
|
7
|
+
# rake test
|
8
|
+
|
9
|
+
require 'helper'
|
10
|
+
|
11
|
+
class TestHelper < MiniTest::Unit::TestCase
|
12
|
+
|
13
|
+
include Pluto::TemplateHelper # lets us use textify, etc.
|
14
|
+
|
15
|
+
def test_textify
|
16
|
+
hyin =<<EOS
|
17
|
+
<p><img style="float:left; margin-right:4px" src="http://photos1.meetupstatic.com/photos/event/7/c/b/2/event_244651922.jpeg" alt="photo" class="photo" />vienna.rb</p>
|
18
|
+
<p>
|
19
|
+
<p>The cool guys from <a href="http://platogo.com/">Platogo</a> will sponsor (y)our drinks. Which is awesome.</p>
|
20
|
+
<p><strong>Talks</strong>*</p>
|
21
|
+
<p>Jakob Sommerhuber - sponsor talk</p>
|
22
|
+
<p>Martin Schürrer - Erlang/OTP in production for highly-available, scalable systems</p>
|
23
|
+
<p>Markus Prinz - How to improve your code</p>
|
24
|
+
<p>Gerald Bauer - working with Sinatra</p>
|
25
|
+
<p>Kathrin Folkendt - 'Chapter one' (lightning talk on getting started with Rails, and building her first web app)</p>
|
26
|
+
<p><em>*preliminary program</em></p>
|
27
|
+
</p>
|
28
|
+
<p>Vienna - Austria</p>
|
29
|
+
<p>Friday, October 11 at 6:00 PM</p>
|
30
|
+
<p>Attending: 21</p>
|
31
|
+
<p>Details: http://www.meetup.com/vienna-rb/events/130346182/</p>
|
32
|
+
EOS
|
33
|
+
|
34
|
+
hystep1 = <<EOS
|
35
|
+
‹p›♦vienna.rb‹/p›
|
36
|
+
‹p›
|
37
|
+
‹p›The cool guys from Platogo will sponsor (y)our drinks. Which is awesome.‹/p›
|
38
|
+
‹p›Talks*‹/p›
|
39
|
+
‹p›Jakob Sommerhuber - sponsor talk‹/p›
|
40
|
+
‹p›Martin Schürrer - Erlang/OTP in production for highly-available, scalable systems‹/p›
|
41
|
+
‹p›Markus Prinz - How to improve your code‹/p›
|
42
|
+
‹p›Gerald Bauer - working with Sinatra‹/p›
|
43
|
+
‹p›Kathrin Folkendt - 'Chapter one' (lightning talk on getting started with Rails, and building her first web app)‹/p›
|
44
|
+
‹p›*preliminary program‹/p›
|
45
|
+
‹/p›
|
46
|
+
‹p›Vienna - Austria‹/p›
|
47
|
+
‹p›Friday, October 11 at 6:00 PM‹/p›
|
48
|
+
‹p›Attending: 21‹/p›
|
49
|
+
‹p›Details: www.meetup.com/vienna-rb/events/130346182/‹/p›
|
50
|
+
EOS
|
51
|
+
|
52
|
+
hyout = <<EOS
|
53
|
+
<p>♦vienna.rb</p>
|
54
|
+
<p>
|
55
|
+
<p>The cool guys from Platogo will sponsor (y)our drinks. Which is awesome.</p>
|
56
|
+
<p>Talks*</p>
|
57
|
+
<p>Jakob Sommerhuber - sponsor talk</p>
|
58
|
+
<p>Martin Schürrer - Erlang/OTP in production for highly-available, scalable systems</p>
|
59
|
+
<p>Markus Prinz - How to improve your code</p>
|
60
|
+
<p>Gerald Bauer - working with Sinatra</p>
|
61
|
+
<p>Kathrin Folkendt - 'Chapter one' (lightning talk on getting started with Rails, and building her first web app)</p>
|
62
|
+
<p>*preliminary program</p>
|
63
|
+
</p>
|
64
|
+
<p>Vienna - Austria</p>
|
65
|
+
<p>Friday, October 11 at 6:00 PM</p>
|
66
|
+
<p>Attending: 21</p>
|
67
|
+
<p>Details: www.meetup.com/vienna-rb/events/130346182/</p>
|
68
|
+
EOS
|
69
|
+
|
70
|
+
assert_equal( hyout, textify( hyin ) )
|
71
|
+
|
72
|
+
assert_equal( hystep1, textify( hyin, skip_restore: true ) )
|
73
|
+
end
|
74
|
+
|
75
|
+
end # class TestHelper
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: pluto
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.8.
|
4
|
+
version: 0.8.3
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,11 +9,11 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2013-09-
|
12
|
+
date: 2013-09-28 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: pakman
|
16
|
-
requirement: &
|
16
|
+
requirement: &75684250 !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ! '>='
|
@@ -21,10 +21,10 @@ dependencies:
|
|
21
21
|
version: '0.5'
|
22
22
|
type: :runtime
|
23
23
|
prerelease: false
|
24
|
-
version_requirements: *
|
24
|
+
version_requirements: *75684250
|
25
25
|
- !ruby/object:Gem::Dependency
|
26
26
|
name: fetcher
|
27
|
-
requirement: &
|
27
|
+
requirement: &75684020 !ruby/object:Gem::Requirement
|
28
28
|
none: false
|
29
29
|
requirements:
|
30
30
|
- - ! '>='
|
@@ -32,10 +32,10 @@ dependencies:
|
|
32
32
|
version: '0.3'
|
33
33
|
type: :runtime
|
34
34
|
prerelease: false
|
35
|
-
version_requirements: *
|
35
|
+
version_requirements: *75684020
|
36
36
|
- !ruby/object:Gem::Dependency
|
37
37
|
name: logutils
|
38
|
-
requirement: &
|
38
|
+
requirement: &75683730 !ruby/object:Gem::Requirement
|
39
39
|
none: false
|
40
40
|
requirements:
|
41
41
|
- - ! '>='
|
@@ -43,32 +43,32 @@ dependencies:
|
|
43
43
|
version: '0.6'
|
44
44
|
type: :runtime
|
45
45
|
prerelease: false
|
46
|
-
version_requirements: *
|
46
|
+
version_requirements: *75683730
|
47
47
|
- !ruby/object:Gem::Dependency
|
48
48
|
name: feedutils
|
49
|
-
requirement: &
|
49
|
+
requirement: &75683490 !ruby/object:Gem::Requirement
|
50
50
|
none: false
|
51
51
|
requirements:
|
52
52
|
- - ! '>='
|
53
53
|
- !ruby/object:Gem::Version
|
54
|
-
version:
|
54
|
+
version: 0.3.2
|
55
55
|
type: :runtime
|
56
56
|
prerelease: false
|
57
|
-
version_requirements: *
|
57
|
+
version_requirements: *75683490
|
58
58
|
- !ruby/object:Gem::Dependency
|
59
59
|
name: props
|
60
|
-
requirement: &
|
60
|
+
requirement: &75683190 !ruby/object:Gem::Requirement
|
61
61
|
none: false
|
62
62
|
requirements:
|
63
63
|
- - ! '>='
|
64
64
|
- !ruby/object:Gem::Version
|
65
|
-
version: 1.0.
|
65
|
+
version: 1.0.2
|
66
66
|
type: :runtime
|
67
67
|
prerelease: false
|
68
|
-
version_requirements: *
|
68
|
+
version_requirements: *75683190
|
69
69
|
- !ruby/object:Gem::Dependency
|
70
70
|
name: textutils
|
71
|
-
requirement: &
|
71
|
+
requirement: &75682950 !ruby/object:Gem::Requirement
|
72
72
|
none: false
|
73
73
|
requirements:
|
74
74
|
- - ! '>='
|
@@ -76,10 +76,10 @@ dependencies:
|
|
76
76
|
version: 0.6.8
|
77
77
|
type: :runtime
|
78
78
|
prerelease: false
|
79
|
-
version_requirements: *
|
79
|
+
version_requirements: *75682950
|
80
80
|
- !ruby/object:Gem::Dependency
|
81
81
|
name: gli
|
82
|
-
requirement: &
|
82
|
+
requirement: &75682640 !ruby/object:Gem::Requirement
|
83
83
|
none: false
|
84
84
|
requirements:
|
85
85
|
- - ! '>='
|
@@ -87,10 +87,10 @@ dependencies:
|
|
87
87
|
version: 2.5.6
|
88
88
|
type: :runtime
|
89
89
|
prerelease: false
|
90
|
-
version_requirements: *
|
90
|
+
version_requirements: *75682640
|
91
91
|
- !ruby/object:Gem::Dependency
|
92
92
|
name: rdoc
|
93
|
-
requirement: &
|
93
|
+
requirement: &75698770 !ruby/object:Gem::Requirement
|
94
94
|
none: false
|
95
95
|
requirements:
|
96
96
|
- - ~>
|
@@ -98,10 +98,10 @@ dependencies:
|
|
98
98
|
version: '3.10'
|
99
99
|
type: :development
|
100
100
|
prerelease: false
|
101
|
-
version_requirements: *
|
101
|
+
version_requirements: *75698770
|
102
102
|
- !ruby/object:Gem::Dependency
|
103
103
|
name: hoe
|
104
|
-
requirement: &
|
104
|
+
requirement: &75698470 !ruby/object:Gem::Requirement
|
105
105
|
none: false
|
106
106
|
requirements:
|
107
107
|
- - ~>
|
@@ -109,10 +109,10 @@ dependencies:
|
|
109
109
|
version: '3.3'
|
110
110
|
type: :development
|
111
111
|
prerelease: false
|
112
|
-
version_requirements: *
|
112
|
+
version_requirements: *75698470
|
113
113
|
description: pluto - Another Planet Generator (Lets You Build Web Pages from Published
|
114
114
|
Web Feeds)
|
115
|
-
email:
|
115
|
+
email: feedreader@googlegroups.com
|
116
116
|
executables:
|
117
117
|
- pluto
|
118
118
|
extensions: []
|
@@ -135,10 +135,15 @@ files:
|
|
135
135
|
- lib/pluto/lister.rb
|
136
136
|
- lib/pluto/manifest_helpers.rb
|
137
137
|
- lib/pluto/models.rb
|
138
|
+
- lib/pluto/refresher.rb
|
138
139
|
- lib/pluto/schema.rb
|
140
|
+
- lib/pluto/subscriber.rb
|
139
141
|
- lib/pluto/template_helpers.rb
|
140
142
|
- lib/pluto/updater.rb
|
141
143
|
- lib/pluto/version.rb
|
144
|
+
- test/helper.rb
|
145
|
+
- test/test_helpers.rb
|
146
|
+
- .gemtest
|
142
147
|
homepage: https://github.com/feedreader/pluto
|
143
148
|
licenses:
|
144
149
|
- Public Domain
|
@@ -166,4 +171,5 @@ rubygems_version: 1.8.17
|
|
166
171
|
signing_key:
|
167
172
|
specification_version: 3
|
168
173
|
summary: pluto - Another Planet Generator
|
169
|
-
test_files:
|
174
|
+
test_files:
|
175
|
+
- test/test_helpers.rb
|