pluto 0.8.6 → 0.8.7

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.
@@ -285,9 +285,9 @@ command [:update, :up, :u] do |c|
285
285
 
286
286
  config = load_config( arg )
287
287
 
288
- Pluto::Updater.new( opts, config ).run
288
+ Pluto::Updater.new( opts, config ).run( name )
289
289
  end
290
-
290
+
291
291
  puts 'Done.'
292
292
  end
293
293
  end # command fetch
@@ -326,7 +326,7 @@ command [:build, :b] do |c|
326
326
 
327
327
  config = load_config( arg )
328
328
 
329
- Pluto::Updater.new( opts, config ).run
329
+ Pluto::Updater.new( opts, config ).run( name )
330
330
  Pluto::Formatter.new( opts, config ).run( name )
331
331
  end
332
332
 
@@ -16,12 +16,12 @@ class Fetcher
16
16
  def fetch_feed( url )
17
17
  response = @worker.get( url )
18
18
 
19
- if debug?
19
+ ## if debug?
20
20
  puts "http status #{response.code} #{response.message}"
21
21
 
22
22
  puts "http header - etag: #{response.header['etag']} - #{response.header['etag'].class.name}"
23
23
  puts "http header - last-modified: #{response.header['last-modified']} - #{response.header['last-modified'].class.name}"
24
- end
24
+ ## end
25
25
 
26
26
  xml = response.body
27
27
 
@@ -130,10 +130,10 @@ class Fetcher
130
130
  fetched: feed_fetched
131
131
  }
132
132
 
133
- if debug?
133
+ ## if debug?
134
134
  puts "http header - etag: #{response.header['etag']} - #{response.header['etag'].class.name}"
135
135
  puts "http header - last-modified: #{response.header['last-modified']} - #{response.header['last-modified'].class.name}"
136
- end
136
+ ## end
137
137
 
138
138
  feed_rec.update_attributes!( feed_attribs )
139
139
 
@@ -16,13 +16,29 @@ class Formatter
16
16
 
17
17
  attr_reader :opts, :config, :site
18
18
 
19
+
19
20
  def run( arg )
21
+ ### remove - always use make( site_key )
20
22
  ## fix: change arg to planet_key or just key or similar
21
23
  # todo: rename run to some less generic - merge/build/etc. ??
22
24
 
25
+ site_key = arg
26
+ site_key = site_key.downcase.gsub('.ini','').gsub('.yml','') # remove .ini|.yml extension if present
27
+
23
28
  manifest_name = opts.manifest
29
+ output_path = opts.output_path
30
+
31
+ make_for(site_key, manifest_name, output_path )
32
+ end
33
+
34
+
35
+ def make_for( site_key, manifest_name, output_path )
36
+
37
+ ## fix: remove reference to opts
38
+ ## - e.g. now still used for auto-installer
39
+
24
40
  manifest_name = manifest_name.downcase.gsub('.txt', '' ) # remove .txt if present
25
-
41
+
26
42
  logger.debug "manifest=#{manifest_name}"
27
43
 
28
44
  # check for matching manifests
@@ -47,14 +63,8 @@ class Formatter
47
63
  end
48
64
 
49
65
  manifestsrc = manifests[0][1]
50
- pakpath = opts.output_path
51
-
52
- name = arg
53
-
54
- ## for now - use single site w/ key planet
55
- ##-- fix!! allow multiple sites (planets)
66
+ pakpath = output_path
56
67
 
57
- site_key = 'planet'
58
68
  @site = Site.find_by_key( site_key )
59
69
  if @site.nil?
60
70
  puts "*** warn: no site with key '#{site_key}' found; using untitled site record"
@@ -62,7 +72,7 @@ class Formatter
62
72
  @site.title = 'Planet Untitled'
63
73
  end
64
74
 
65
- Pakman::Templater.new.merge_pak( manifestsrc, pakpath, binding, name )
75
+ Pakman::Templater.new.merge_pak( manifestsrc, pakpath, binding, site_key )
66
76
  end
67
77
 
68
78
  end # class Formatter
@@ -17,7 +17,7 @@ class Feed < ActiveRecord::Base
17
17
 
18
18
  # note: if not published, touched or built use hardcoded 1971-01-01 for now
19
19
  ## order( "coalesce(published,touched,built,'1971-01-01') desc" )
20
- order( "coalesce(last_published,'1971-01-01') desc" )
20
+ order( "coalesce(feeds.last_published,'1971-01-01') desc" )
21
21
  end
22
22
 
23
23
  ##################################
@@ -24,7 +24,7 @@ class Item < ActiveRecord::Base
24
24
  # coalesce - supported by sqlite (yes), postgres (yes)
25
25
 
26
26
  # note: if not published,touched or built_at use hardcoded 1971-01-01 for now
27
- order( "coalesce(published,touched,'1971-01-01') desc" )
27
+ order( "coalesce(items.published,items.touched,'1971-01-01') desc" )
28
28
  end
29
29
 
30
30
  def published?() read_attribute(:published).present?; end
@@ -23,14 +23,18 @@ class ItemCursor
23
23
  new_date = true
24
24
  end
25
25
 
26
- if last_feed_id == item.feed.id
27
- new_feed = false
28
- else
26
+ ## note:
27
+ # new date also **always** starts new feed
28
+ # - e.g. used for grouping within day (follows planet planet convention)
29
+
30
+ if new_date || last_feed_id != item.feed.id
29
31
  new_feed = true
32
+ else
33
+ new_feed = false
30
34
  end
31
35
 
32
36
  yield( item, new_date, new_feed )
33
-
37
+
34
38
  last_published = item.published
35
39
  last_feed_id = item.feed.id
36
40
  end
@@ -13,8 +13,8 @@ class Refresher
13
13
  def debug=(value) @debug = value; end
14
14
  def debug?() @debug || false; end
15
15
 
16
- def update_feeds( opts={} )
17
16
 
17
+ def update_feeds( opts={} ) # update all feeds
18
18
  if debug?
19
19
  ## turn on logging for sql too
20
20
  ActiveRecord::Base.logger = Logger.new( STDOUT )
@@ -23,61 +23,83 @@ class Refresher
23
23
 
24
24
  # -- log update action
25
25
  Action.create!( title: 'update feeds' )
26
+
27
+ feeds_fetched = Time.now
28
+ Site.all.each do |site|
29
+ site.update_attributes!( fetched: feeds_fetched )
30
+ end
31
+
32
+ Feed.all.each do |feed|
33
+ update_feed_worker( feed )
34
+ end
35
+ end
36
+
37
+
38
+ def update_feeds_for( site_key, opts={} )
39
+ if debug?
40
+ ## turn on logging for sql too
41
+ ActiveRecord::Base.logger = Logger.new( STDOUT )
42
+ @worker.debug = true # also pass along worker debug flag if set
43
+ end
44
+
45
+ # -- log update action
46
+ Action.create!( title: "update feeds >#{site_key}<" )
26
47
 
27
48
  #####
28
49
  # -- update fetched timestamps for all sites
29
50
  feeds_fetched = Time.now
30
- Site.all.each do |site|
31
- site.fetched = feeds_fetched
32
- site.save!
51
+
52
+ site = Site.find_by_key!( site_key )
53
+ site.update_attributes!( fetched: feeds_fetched )
54
+
55
+ site.feeds.each do |feed|
56
+ update_feed_worker( feed )
33
57
  end
34
58
 
35
- Feed.all.each do |feed_rec|
59
+ end # method update_feeds
36
60
 
37
- feed = @worker.feed_by_rec_if_modified( feed_rec )
61
+ private
62
+ def update_feed_worker( feed_rec )
63
+ feed = @worker.feed_by_rec_if_modified( feed_rec )
38
64
 
39
- # on error or if http-not modified etc. skip update/processing
40
- next if feed.nil?
65
+ # on error or if http-not modified etc. skip update/processing
66
+ return if feed.nil?
41
67
 
42
- ## fix/todo: reload feed_red - fetched date updated etc.
43
- ## check if needed for access to fetched date
68
+ ## fix/todo: reload feed_red - fetched date updated etc.
69
+ ## check if needed for access to fetched date
44
70
 
45
71
 
46
- ## todo/check: move feed_rec update to the end (after item updates??)
72
+ ## todo/check: move feed_rec update to the end (after item updates??)
47
73
 
48
- # update feed attribs e.g.
49
- # generator
50
- # published_at,built_at,touched_at,fetched_at
51
- # summary,title2
74
+ # update feed attribs e.g.
75
+ # generator
76
+ # published_at,built_at,touched_at,fetched_at
77
+ # summary,title2
52
78
 
53
- ## fix:
54
- ## weird rss exception error on windows w/ dates
55
- # e.g. /lib/ruby/1.9.1/rss/rss.rb:37:in `w3cdtf': wrong number of arguments (1 for 0) (ArgumentError)
56
- #
57
- # move to_datetime to feedutils!! if it works
58
- ## todo: move this comments to feedutils??
59
-
60
-
61
- feed_rec.debug = debug? ? true : false # pass along debug flag
62
- ## fix/todo: pass debug flag as opts - debug: true|false !!!!!!
63
- feed_rec.save_from_struct!( feed ) # todo: find a better name - why? why not??
64
-
65
-
66
- # update cached value last published for item
67
- last_item_rec = feed_rec.items.latest.limit(1).first # note limit(1) will return relation/arrar - use first to get first element or nil from ary
68
- if last_item_rec.present?
69
- if last_item_rec.published?
70
- feed_rec.update_attributes!( last_published: last_item_rec.published )
71
- else # try touched
72
- feed_rec.update_attributes!( last_published: last_item_rec.touched )
73
- end
79
+ ## fix:
80
+ ## weird rss exception error on windows w/ dates
81
+ # e.g. /lib/ruby/1.9.1/rss/rss.rb:37:in `w3cdtf': wrong number of arguments (1 for 0) (ArgumentError)
82
+ #
83
+ # move to_datetime to feedutils!! if it works
84
+ ## todo: move this comments to feedutils??
85
+
86
+
87
+ feed_rec.debug = debug? ? true : false # pass along debug flag
88
+ ## fix/todo: pass debug flag as opts - debug: true|false !!!!!!
89
+ feed_rec.save_from_struct!( feed ) # todo: find a better name - why? why not??
90
+
91
+
92
+ # update cached value last published for item
93
+ last_item_rec = feed_rec.items.latest.limit(1).first # note limit(1) will return relation/arrar - use first to get first element or nil from ary
94
+ if last_item_rec.present?
95
+ if last_item_rec.published?
96
+ feed_rec.update_attributes!( last_published: last_item_rec.published )
97
+ else # try touched
98
+ feed_rec.update_attributes!( last_published: last_item_rec.touched )
74
99
  end
100
+ end
101
+ end # method update_feed_worker
75
102
 
76
- end # each feed
77
-
78
- end # method update_feeds
79
-
80
-
81
103
  end # class Refresher
82
104
 
83
105
  end # module Pluto
@@ -9,6 +9,12 @@ class CreateDb < ActiveRecord::Migration
9
9
  t.string :key, :null => false # e.g. ruby, js, etc.
10
10
  t.datetime :fetched # last fetched/checked date -- make not null ??
11
11
 
12
+ ############
13
+ # filters (site-wide)
14
+ t.string :includes # regex
15
+ t.string :excludes # regex
16
+
17
+
12
18
  t.timestamps # created_at, updated_at
13
19
  end
14
20
 
@@ -11,15 +11,17 @@ class Subscriber
11
11
 
12
12
 
13
13
  def update_subscriptions( config, opts={} )
14
+ # !!!! -- depreciated API - remove - do NOT use anymore
15
+ puts "warn - [Pluto::Subscriber] depreciated API -- use update_subscriptions_for( site_key)"
16
+ update_subscriptions_for( 'planet', config, opts ) # default to planet site_key
17
+ end
14
18
 
19
+
20
+ def update_subscriptions_for( site_key, config, opts={} )
15
21
  site_attribs = {
16
- title: config[ 'title' ] || config[ 'name' ] # support either title or name
22
+ title: config['title'] || config['name'] # support either title or name
17
23
  }
18
-
19
- ## for now - use single site w/ key planet
20
- ## -- fix!! allow multiple sites (planets)
21
-
22
- site_key = 'planet'
24
+
23
25
  site_rec = Site.find_by_key( site_key )
24
26
  if site_rec.nil?
25
27
  site_rec = Site.new
@@ -27,12 +29,12 @@ class Subscriber
27
29
 
28
30
  ## use object_id: site.id and object_type: Site
29
31
  ## change - model/table/schema!!!
30
- Action.create!( title: 'new site', object: site_attribs[ :title ] )
32
+ Action.create!( title: "new site >#{site_key}<", object: site_attribs[ :title ] )
31
33
  end
32
34
  site_rec.update_attributes!( site_attribs )
33
35
 
34
36
  # -- log update action
35
- Action.create!( title: 'update subscriptions' )
37
+ Action.create!( title: "update subscriptions >#{site_key}<" )
36
38
 
37
39
  # clean out subscriptions and add again
38
40
  logger.debug "before site.subscriptions.delete_all - count: #{site_rec.subscriptions.count}"
@@ -44,7 +46,10 @@ class Subscriber
44
46
  ## todo: downcase key - why ??? why not???
45
47
 
46
48
  # skip "top-level" feed keys e.g. title, etc. or planet planet sections (e.g. planet,defaults)
47
- next if ['title','title2','name','feeds','planet','defaults'].include?( key )
49
+ next if ['title','title2','name',
50
+ 'include','includes','exclude','excludes',
51
+ 'feeds',
52
+ 'planet','defaults'].include?( key )
48
53
 
49
54
  ### todo/check:
50
55
  ## check value - must be hash
@@ -76,9 +81,9 @@ class Subscriber
76
81
  ## use object_id: feed.id and object_type: Feed
77
82
  ## change - model/table/schema!!!
78
83
  ## todo: add parent_action_id - why? why not?
79
- Action.create!( title: 'new feed', object: feed_attribs[ :title ] )
84
+ Action.create!( title: "new feed >#{feed_key}<", object: feed_attribs[ :title ] )
80
85
  end
81
-
86
+
82
87
  feed_rec.update_attributes!( feed_attribs )
83
88
 
84
89
  # add subscription record
@@ -11,14 +11,20 @@ class Updater
11
11
 
12
12
  attr_reader :opts, :config
13
13
 
14
- def run
14
+ def run( arg )
15
+ arg = arg.downcase.gsub('.ini','').gsub('.yml','') # remove file extension if present
16
+
17
+ update_for( arg )
18
+ end
19
+
20
+ def update_for( site_key )
15
21
  ###################
16
22
  # step 1) update subscriptions
17
23
  subscriber = Subscriber.new
18
24
 
19
25
  # pass along debug/verbose setting/switch
20
26
  subscriber.debug = true if opts.verbose?
21
- subscriber.update_subscriptions( config )
27
+ subscriber.update_subscriptions_for( site_key, config )
22
28
 
23
29
  ##############################
24
30
  # step 2) update feeds
@@ -26,7 +32,7 @@ class Updater
26
32
 
27
33
  # pass along debug/verbose setting/switch
28
34
  refresher.debug = true if opts.verbose?
29
- refresher.update_feeds
35
+ refresher.update_feeds_for( site_key )
30
36
  end # method run
31
37
 
32
38
  end # class Updater
@@ -1,4 +1,4 @@
1
1
 
2
2
  module Pluto
3
- VERSION = '0.8.6'
3
+ VERSION = '0.8.7'
4
4
  end
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.6
4
+ version: 0.8.7
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -13,7 +13,7 @@ date: 2013-10-04 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: pakman
16
- requirement: &75090920 !ruby/object:Gem::Requirement
16
+ requirement: &79324440 !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: *75090920
24
+ version_requirements: *79324440
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: fetcher
27
- requirement: &75090620 !ruby/object:Gem::Requirement
27
+ requirement: &79324160 !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: *75090620
35
+ version_requirements: *79324160
36
36
  - !ruby/object:Gem::Dependency
37
37
  name: logutils
38
- requirement: &75090350 !ruby/object:Gem::Requirement
38
+ requirement: &79323870 !ruby/object:Gem::Requirement
39
39
  none: false
40
40
  requirements:
41
41
  - - ! '>='
@@ -43,10 +43,10 @@ dependencies:
43
43
  version: '0.6'
44
44
  type: :runtime
45
45
  prerelease: false
46
- version_requirements: *75090350
46
+ version_requirements: *79323870
47
47
  - !ruby/object:Gem::Dependency
48
48
  name: feedutils
49
- requirement: &75090050 !ruby/object:Gem::Requirement
49
+ requirement: &79323600 !ruby/object:Gem::Requirement
50
50
  none: false
51
51
  requirements:
52
52
  - - ! '>='
@@ -54,10 +54,10 @@ dependencies:
54
54
  version: 0.3.2
55
55
  type: :runtime
56
56
  prerelease: false
57
- version_requirements: *75090050
57
+ version_requirements: *79323600
58
58
  - !ruby/object:Gem::Dependency
59
59
  name: props
60
- requirement: &75089760 !ruby/object:Gem::Requirement
60
+ requirement: &79323280 !ruby/object:Gem::Requirement
61
61
  none: false
62
62
  requirements:
63
63
  - - ! '>='
@@ -65,10 +65,10 @@ dependencies:
65
65
  version: 1.0.2
66
66
  type: :runtime
67
67
  prerelease: false
68
- version_requirements: *75089760
68
+ version_requirements: *79323280
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: textutils
71
- requirement: &75089460 !ruby/object:Gem::Requirement
71
+ requirement: &79323050 !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: *75089460
79
+ version_requirements: *79323050
80
80
  - !ruby/object:Gem::Dependency
81
81
  name: gli
82
- requirement: &75089160 !ruby/object:Gem::Requirement
82
+ requirement: &79322720 !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: *75089160
90
+ version_requirements: *79322720
91
91
  - !ruby/object:Gem::Dependency
92
92
  name: rdoc
93
- requirement: &75088910 !ruby/object:Gem::Requirement
93
+ requirement: &79322460 !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: *75088910
101
+ version_requirements: *79322460
102
102
  - !ruby/object:Gem::Dependency
103
103
  name: hoe
104
- requirement: &75088620 !ruby/object:Gem::Requirement
104
+ requirement: &79322170 !ruby/object:Gem::Requirement
105
105
  none: false
106
106
  requirements:
107
107
  - - ~>
@@ -109,7 +109,7 @@ dependencies:
109
109
  version: '3.3'
110
110
  type: :development
111
111
  prerelease: false
112
- version_requirements: *75088620
112
+ version_requirements: *79322170
113
113
  description: pluto - Another Planet Generator (Lets You Build Web Pages from Published
114
114
  Web Feeds)
115
115
  email: feedreader@googlegroups.com