pluto-models 1.4.1 → 1.5.0

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: fd11efa85f9dedf8eace5016aee8f33e8c1d7eec
4
- data.tar.gz: 2d4c4f5e9a919c65c7bc68883b4bc069a88d8393
3
+ metadata.gz: ad263401c798a7b1d893eb500232872a8afc0ca8
4
+ data.tar.gz: 1a49217497e1b15de32024bdc53fcef480bf0195
5
5
  SHA512:
6
- metadata.gz: dadef8f729fb4991b346a5320b973fe2f76b7a00f128228907f7e59c2a55ca55ede3b49cf5411c9a1c3e1e2b04be136fc0957c2327c978c034efacd84136749d
7
- data.tar.gz: ecd1033a25050c3c124179b9c4bb798e5d0886588aa9e4e35c5389d9950658b7df5994d8c5103904688b8245172514c41f0e4d261a90b252c0d34669b817f262
6
+ metadata.gz: 11ff9b19fbe322bd20748edc5f6ce993b0235565c9501a2db45ce67d74f2655596d09a937162d1a98060d4129114cea3b03f6a685bd46d79da0270f1e5eaf889
7
+ data.tar.gz: b88a9638733715423053eeae0e81dde8d622d34c087e767ee6480c8108da1bd6b102dae3dd70c60db709abc1c94625c49f9f074bd8dbc98d5e7a6fd62c7123c2
@@ -1,83 +1,85 @@
1
- # encoding: utf-8
2
-
3
- module Pluto
4
-
5
-
6
- # DB Connecter / Connection Manager
7
- # lets you establish connection
8
-
9
- class Connecter
10
-
11
- include LogUtils::Logging
12
-
13
- def initialize
14
- # do nothing for now
15
- end
16
-
17
-
18
- def debug=(value) @debug = value; end
19
- def debug?() @debug || false; end
20
-
21
-
22
- def connect( config={} )
23
-
24
- if config.empty? # use/try DATABASE_URL from environment
25
-
26
- logger.debug "ENV['DATBASE_URL'] - >#{ENV['DATABASE_URL']}<"
27
-
28
- db = URI.parse( ENV['DATABASE_URL'] || 'sqlite3:///pluto.db' )
29
-
30
- if db.scheme == 'postgres'
31
- config = {
32
- adapter: 'postgresql',
33
- host: db.host,
34
- port: db.port,
35
- username: db.user,
36
- password: db.password,
37
- database: db.path[1..-1],
38
- encoding: 'utf8'
39
- }
40
- else # assume sqlite3
41
- config = {
42
- adapter: db.scheme, # sqlite3
43
- database: db.path[1..-1] # pluto.db (NB: cut off leading /, thus 1..-1)
44
- }
45
- end
46
- end # if config.nil?
47
-
48
- puts 'db settings:'
49
- pp config
50
-
51
- ### for dbbrowser and other tools add to ActiveRecord
52
-
53
- if ActiveRecord::Base.configurations.nil? # todo/check: can this ever happen? remove?
54
- puts "ActiveRecord configurations nil - set to empty hash"
55
- ActiveRecord::Base.configurations = {} # make it an empty hash
56
- end
57
-
58
- if debug?
59
- puts 'ar configurations (before):'
60
- pp ActiveRecord::Base.configurations
61
- end
62
-
63
- # note: for now always use pluto key for config storage
64
- ActiveRecord::Base.configurations['pluto'] = config
65
-
66
- if debug?
67
- puts 'ar configurations (after):'
68
- pp ActiveRecord::Base.configurations
69
- end
70
-
71
-
72
- # for debugging - disable for production use
73
- if debug?
74
- ActiveRecord::Base.logger = Logger.new( STDOUT )
75
- end
76
-
77
- ActiveRecord::Base.establish_connection( config )
78
- end # method connect
79
-
80
-
81
- end # class Connecter
82
-
83
- end # module Pluto
1
+ # encoding: utf-8
2
+
3
+ module Pluto
4
+
5
+
6
+ # DB Connecter / Connection Manager
7
+ # lets you establish connection
8
+
9
+ class Connecter
10
+
11
+ include LogUtils::Logging
12
+
13
+ def initialize
14
+ # do nothing for now
15
+ end
16
+
17
+
18
+ def debug=(value) @debug = value; end
19
+ def debug?() @debug || false; end
20
+
21
+
22
+ def connect( config={} )
23
+
24
+ if config.empty? # use/try DATABASE_URL from environment
25
+
26
+ logger.debug "ENV['DATBASE_URL'] - >#{ENV['DATABASE_URL']}<"
27
+
28
+ db = URI.parse( ENV['DATABASE_URL'] || 'sqlite3:///pluto.db' )
29
+
30
+ if db.scheme == 'postgres'
31
+ config = {
32
+ adapter: 'postgresql',
33
+ host: db.host,
34
+ port: db.port,
35
+ username: db.user,
36
+ password: db.password,
37
+ database: db.path[1..-1],
38
+ encoding: 'utf8'
39
+ }
40
+ else # assume sqlite3
41
+ config = {
42
+ adapter: db.scheme, # sqlite3
43
+ database: db.path[1..-1] # pluto.db (NB: cut off leading /, thus 1..-1)
44
+ }
45
+ end
46
+ end # if config.nil?
47
+
48
+ logger.info 'db settings:'
49
+ logger.info config.pretty_inspect
50
+
51
+ ### for dbbrowser and other tools add to ActiveRecord
52
+
53
+ if ActiveRecord::Base.configurations.nil? # todo/check: can this ever happen? remove?
54
+ logger.debug "ActiveRecord configurations nil - set to empty hash"
55
+ ActiveRecord::Base.configurations = {} # make it an empty hash
56
+ end
57
+
58
+ ## todo/fix: remove debug? option - why? why not?
59
+ ## (just) use logger level eg. logger.debug
60
+ if debug?
61
+ logger.debug 'ar configurations (before):'
62
+ logger.debug ActiveRecord::Base.configurations.pretty_inspect
63
+ end
64
+
65
+ # note: for now always use pluto key for config storage
66
+ ActiveRecord::Base.configurations['pluto'] = config
67
+
68
+ if debug?
69
+ logger.debug 'ar configurations (after):'
70
+ logger.debug ActiveRecord::Base.configurations.pretty_inspect
71
+ end
72
+
73
+
74
+ # for debugging - disable for production use
75
+ if debug?
76
+ ActiveRecord::Base.logger = Logger.new( STDOUT )
77
+ end
78
+
79
+ ActiveRecord::Base.establish_connection( config )
80
+ end # method connect
81
+
82
+
83
+ end # class Connecter
84
+
85
+ end # module Pluto
@@ -78,7 +78,7 @@ module Pluto
78
78
 
79
79
  unless Model::Feed.table_exists?
80
80
  Pluto.create
81
- end
81
+ end
82
82
  end # method auto_migrate!
83
83
 
84
84
 
@@ -111,4 +111,4 @@ end # module Pluto
111
111
 
112
112
 
113
113
  # say hello
114
- puts Pluto.banner if $DEBUG || (defined?($RUBYLIBS_DEBUG) && $RUBYLIBS_DEBUG)
114
+ puts Pluto.banner if $DEBUG || (defined?($RUBYLIBS_DEBUG) && $RUBYLIBS_DEBUG)
@@ -4,7 +4,19 @@
4
4
  module Pluto
5
5
  module Model
6
6
 
7
+
7
8
  class Feed < ActiveRecord::Base
9
+
10
+ ## logging w/ ActiveRecord
11
+ ## todo/check: check if logger instance method is present by default?
12
+ ## only class method present?
13
+ ## what's the best way to add logging to activerecord (use "builtin" machinery??)
14
+
15
+ def debug=(value) @debug = value; end
16
+ def debug?() @debug || false; end
17
+
18
+
19
+
8
20
  self.table_name = 'feeds'
9
21
 
10
22
  has_many :items
@@ -72,12 +84,11 @@ class Feed < ActiveRecord::Base
72
84
  end
73
85
 
74
86
 
75
- def debug=(value) @debug = value; end
76
- def debug?() @debug || false; end
77
-
78
87
 
79
88
  def deep_update_from_struct!( data )
80
89
 
90
+ logger = LogUtils::Logger.root
91
+
81
92
  ######
82
93
  ## check for filters (includes/excludes) if present
83
94
  ## for now just check for includes
@@ -90,18 +101,18 @@ class Feed < ActiveRecord::Base
90
101
 
91
102
  data.items.each do |item|
92
103
  if includesFilter && includesFilter.match_item?( item ) == false
93
- puts "** SKIPPING | #{item.title}"
94
- puts " no include terms match: #{includes}"
104
+ logger.info "** SKIPPING | #{item.title}"
105
+ logger.info " no include terms match: #{includes}"
95
106
  next ## skip to next item
96
107
  end
97
108
 
98
109
  item_rec = Item.find_by_guid( item.guid )
99
110
  if item_rec.nil?
100
111
  item_rec = Item.new
101
- puts "** NEW | #{item.title}"
112
+ logger.info "** NEW | #{item.title}"
102
113
  else
103
114
  ## todo: check if any attribs changed
104
- puts "UPDATE | #{item.title}"
115
+ logger.info "UPDATE | #{item.title}"
105
116
  end
106
117
 
107
118
  item_rec.debug = debug? ? true : false # pass along debug flag
@@ -133,6 +144,8 @@ class Feed < ActiveRecord::Base
133
144
 
134
145
  def update_from_struct!( data )
135
146
 
147
+ logger = LogUtils::Logger.root
148
+
136
149
  ##
137
150
  # todo:
138
151
  ## strip all tags from summary (subtitle)
@@ -158,9 +171,9 @@ class Feed < ActiveRecord::Base
158
171
  if debug?
159
172
  ## puts "*** dump feed_attribs:"
160
173
  ## pp feed_attribs
161
- puts "*** dump feed_attribs w/ class types:"
174
+ logger.debug "*** dump feed_attribs w/ class types:"
162
175
  feed_attribs.each do |key,value|
163
- puts " #{key}: >#{value}< : #{value.class.name}"
176
+ logger.debug " #{key}: >#{value}< : #{value.class.name}"
164
177
  end
165
178
  end
166
179
 
@@ -17,4 +17,3 @@ Activity = ActivityDb::Models::Activity
17
17
  Models = Model
18
18
 
19
19
  end # module Pluto
20
-
@@ -4,12 +4,22 @@ module Pluto
4
4
  module Model
5
5
 
6
6
  class Item < ActiveRecord::Base
7
+
8
+ ## logging w/ ActiveRecord
9
+ ## todo/check: check if logger instance method is present by default?
10
+ ## only class method present?
11
+ ## what's the best way to add logging to activerecord (use "builtin" machinery??)
12
+
13
+ def debug=(value) @debug = value; end
14
+ def debug?() @debug || false; end
15
+
16
+
7
17
  self.table_name = 'items'
8
18
 
9
19
  belongs_to :feed
10
20
 
11
21
  ## todo/fix:
12
- ## use a module ref or something; do NOT include all methods - why? why not?
22
+ ## use a module ref or something; do NOT include all methods - why? why not?
13
23
  include TextUtils::HypertextHelper ## e.g. lets us use strip_tags( ht )
14
24
  include FeedFilter::AdsFilter ## e.g. lets us use strip_ads( ht )
15
25
 
@@ -46,11 +56,11 @@ class Item < ActiveRecord::Base
46
56
  end
47
57
 
48
58
 
49
- def debug=(value) @debug = value; end
50
- def debug?() @debug || false; end
51
-
52
59
 
53
60
  def update_from_struct!( data )
61
+
62
+ logger = LogUtils::Logger.root
63
+
54
64
  ## check: new item/record? not saved? add guid
55
65
  # otherwise do not add guid - why? why not?
56
66
 
@@ -68,10 +78,10 @@ class Item < ActiveRecord::Base
68
78
  }
69
79
 
70
80
  if debug?
71
- puts "*** dump item_attribs w/ class types:"
81
+ logger.debug "*** dump item_attribs w/ class types:"
72
82
  item_attribs.each do |key,value|
73
83
  next if [:summary,:content].include?( key ) # skip summary n content
74
- puts " #{key}: >#{value}< : #{value.class.name}"
84
+ logger.debug " #{key}: >#{value}< : #{value.class.name}"
75
85
  end
76
86
  end
77
87
 
@@ -4,15 +4,18 @@ module Pluto
4
4
  module Model
5
5
 
6
6
  class Site < ActiveRecord::Base
7
+
8
+
9
+
7
10
  self.table_name = 'sites'
8
-
11
+
9
12
  has_many :subscriptions
10
13
  has_many :feeds, :through => :subscriptions
11
14
  has_many :items, :through => :feeds
12
15
 
13
16
  ##################################
14
17
  # attribute reader aliases
15
- def name() title; end # alias for title
18
+ def name() title; end # alias for title
16
19
 
17
20
  def owner_name() author; end # alias for author
18
21
  def owner() author; end # alias(2) for author
@@ -46,6 +49,8 @@ class Site < ActiveRecord::Base
46
49
 
47
50
  def deep_update_from_hash!( config, opts={} )
48
51
 
52
+ logger = LogUtils::Logger.root
53
+
49
54
  site_attribs = {
50
55
  title: config['title'] || config['name'], # support either title or name
51
56
  url: config['source'] || config['url'], # support source or url for source url for auto-update (optional)
@@ -59,7 +64,6 @@ class Site < ActiveRecord::Base
59
64
  site_attribs[:key] = site_key if site_key
60
65
 
61
66
 
62
- logger = LogUtils::Logger.root
63
67
  logger.debug "site_attribs: #{site_attribs.inspect}"
64
68
 
65
69
  if new_record?
@@ -67,7 +71,7 @@ class Site < ActiveRecord::Base
67
71
  ## change - model/table/schema!!!
68
72
  Activity.create!( text: "new site >#{key}< - #{title}" )
69
73
  end
70
-
74
+
71
75
  update_attributes!( site_attribs )
72
76
 
73
77
 
@@ -135,41 +139,41 @@ class Site < ActiveRecord::Base
135
139
  ##
136
140
  # auto-fill; convenience helpers
137
141
 
138
- if feed_hash['meetup']
142
+ if feed_hash['meetup']
139
143
  ## link/url = http://www.meetup.com/vienna-rb
140
144
  ## feed/feed_url = http://www.meetup.com/vienna-rb/events/rss/vienna.rb/
141
145
 
142
- feed_attribs[:url] = "http://www.meetup.com/#{feed_hash['meetup']}" if feed_attribs[:url].nil?
143
- feed_attribs[:feed_url] = "http://www.meetup.com/#{feed_hash['meetup']}/events/rss/#{feed_hash['meetup']}/" if feed_attribs[:feed_url].nil?
144
- end
146
+ feed_attribs[:url] = "http://www.meetup.com/#{feed_hash['meetup']}" if feed_attribs[:url].nil?
147
+ feed_attribs[:feed_url] = "http://www.meetup.com/#{feed_hash['meetup']}/events/rss/#{feed_hash['meetup']}/" if feed_attribs[:feed_url].nil?
148
+ end
145
149
 
146
- if feed_hash['googlegroups']
150
+ if feed_hash['googlegroups']
147
151
  ## link/url = https://groups.google.com/group/beerdb or
148
152
  ## https://groups.google.com/forum/#!forum/beerdb
149
153
  ## feed/feed_url = https://groups.google.com/forum/feed/beerdb/topics/atom.xml?num=15
150
154
 
151
- feed_attribs[:url] = "https://groups.google.com/group/#{feed_hash['googlegroups']}" if feed_attribs[:url].nil?
152
- feed_attribs[:feed_url] = "https://groups.google.com/forum/feed//#{feed_hash['googlegroups']}/topics/atom.xml?num=15" if feed_attribs[:feed_url].nil?
153
- end
155
+ feed_attribs[:url] = "https://groups.google.com/group/#{feed_hash['googlegroups']}" if feed_attribs[:url].nil?
156
+ feed_attribs[:feed_url] = "https://groups.google.com/forum/feed//#{feed_hash['googlegroups']}/topics/atom.xml?num=15" if feed_attribs[:feed_url].nil?
157
+ end
154
158
 
155
- if feed_hash['github'] && feed_hash['github'].index('/') ## e.g. jekyll/jekyll
159
+ if feed_hash['github'] && feed_hash['github'].index('/') ## e.g. jekyll/jekyll
156
160
  ## link/url = https://github.com/jekyll/jekyll
157
161
  ## feed/feed_url = https://github.com/jekyll/jekyll/commits/master.atom
158
162
 
159
- feed_attribs[:url] = "https://github.com/#{feed_hash['github']}" if feed_attribs[:url].nil?
160
- feed_attribs[:feed_url] = "https://github.com/#{feed_hash['github']}/commits/master.atom" if feed_attribs[:feed_url].nil?
161
- end
163
+ feed_attribs[:url] = "https://github.com/#{feed_hash['github']}" if feed_attribs[:url].nil?
164
+ feed_attribs[:feed_url] = "https://github.com/#{feed_hash['github']}/commits/master.atom" if feed_attribs[:feed_url].nil?
165
+ end
162
166
 
163
- if feed_hash['rubygems'] && feed_attribs[:url].nil? && feed_attribs[:feed_url].nil?
167
+ if feed_hash['rubygems'] && feed_attribs[:url].nil? && feed_attribs[:feed_url].nil?
164
168
  ## link/url = http://rubygems.org/gems/jekyll
165
169
  ## feed/feed_url = http://rubygems.org/gems/jekyll/versions.atom
166
170
 
167
- feed_attribs[:url] = "http://rubygems.org/gems/#{feed_hash['rubygems']}" if feed_attribs[:url].nil?
168
- feed_attribs[:feed_url] = "http://rubygems.org/gems/#{feed_hash['rubygems']}/versions.atom" if feed_attribs[:feed_url].nil?
169
- end
171
+ feed_attribs[:url] = "http://rubygems.org/gems/#{feed_hash['rubygems']}" if feed_attribs[:url].nil?
172
+ feed_attribs[:feed_url] = "http://rubygems.org/gems/#{feed_hash['rubygems']}/versions.atom" if feed_attribs[:feed_url].nil?
173
+ end
170
174
 
171
175
 
172
- puts "Updating feed subscription >#{feed_key}< - >#{feed_attribs[:feed_url]}<..."
176
+ logger.info "Updating feed subscription >#{feed_key}< - >#{feed_attribs[:feed_url]}<..."
173
177
 
174
178
  feed_rec = Feed.find_by_key( feed_key )
175
179
  if feed_rec.nil?
@@ -186,7 +190,7 @@ class Site < ActiveRecord::Base
186
190
 
187
191
  # add subscription record
188
192
  # note: subscriptions get cleaned out on update first (see above)
189
- subscriptions.create!( feed_id: feed_rec.id )
193
+ subscriptions.create!( feed_id: feed_rec.id )
190
194
  end
191
195
 
192
196
  end # method deep_update_from_hash!
@@ -196,4 +200,3 @@ end # class Site
196
200
 
197
201
  end # module Model
198
202
  end # module Pluto
199
-
@@ -6,7 +6,7 @@ module Pluto
6
6
 
7
7
  class Subscription < ActiveRecord::Base
8
8
  self.table_name = 'subscriptions'
9
-
9
+
10
10
  belongs_to :site
11
11
  belongs_to :feed
12
12
  end
@@ -29,7 +29,7 @@ class ItemCursor
29
29
  # new date also **always** starts new feed
30
30
  # - e.g. used for grouping within day (follows planet planet convention)
31
31
 
32
- if new_date || last_feed_id != item.feed.id
32
+ if new_date || last_feed_id != item.feed.id
33
33
  new_feed = true
34
34
  else
35
35
  new_feed = false
@@ -41,7 +41,7 @@ class ItemCursor
41
41
  last_feed_id = item.feed.id
42
42
  end
43
43
  end # method each
44
-
44
+
45
45
  end # class ItemCursor
46
46
 
47
47
 
@@ -1,153 +1,153 @@
1
- # encoding: utf-8
2
-
3
- module Pluto
4
-
5
- class CreateDb
6
-
7
- def up
8
-
9
- ActiveRecord::Schema.define do
10
- create_table :sites do |t|
11
- t.string :key, null: false # e.g. ruby, js, etc.
12
- t.string :title, null: false # e.g Planet Ruby, Planet JavaScript, etc.
13
-
14
- t.string :author # owner_name, author_name
15
- t.string :email # owner_email, author_email
16
- t.datetime :updated # date for subscription list last updated via pluto
17
-
18
- ############
19
- # filters (site-wide)
20
- t.string :includes # regex
21
- t.string :excludes # regex
22
-
23
-
24
- ######################
25
- # for auto-update of feed list/site config
26
-
27
- t.string :url # source url for auto-update (optional)
28
-
29
- ## note: make sure to use same fields for update check as feed
30
-
31
- t.datetime :fetched # date for last fetched/checked for feeds via pluto -- make not null ??
32
- t.integer :http_code # last http status code e.g. 200,404,etc.
33
- t.string :http_etag # last http header etag
34
- ## note: save last-modified header as text (not datetime) - pass through as is
35
- t.string :http_last_modified # last http header last-modified - note: save header as plain text!!! pass along in next request as-is
36
- t.string :http_server # last http server header if present
37
-
38
- # note: do NOT store body content (that is, text) and md5 digest
39
- # use git! and github! commit will be http_etag!!
40
- t.string :md5 # md5 hash of body
41
-
42
-
43
- #############
44
- # more fields
45
-
46
- t.timestamps # created_at, updated_at
47
- end
48
-
49
-
50
- create_table :subscriptions do |t| # has_many join table (sites/feeds)
51
- t.references :site, null: false
52
- t.references :feed, null: false
53
- t.timestamps
54
- end
55
-
56
- create_table :feeds do |t|
57
- t.string :key, null: false
58
- t.string :encoding, null: false, default: 'utf8' # charset encoding; default to utf8
59
- t.string :format # e.g. atom (1.0), rss 2.0, etc.
60
-
61
- t.string :title # user supplied title
62
- t.string :url # user supplied site url
63
- t.string :feed_url # user supplied feed url
64
-
65
- t.string :auto_title # "fallback" - auto(fill) title from feed
66
- t.string :auto_url # "fallback" - auto(fill) url from feed
67
- t.string :auto_feed_url # "fallback" - auto discovery feed url from (site) url
68
-
69
- t.text :summary # e.g. description (rss), subtitle (atom)
70
- ## todo: add auto_summary - why? why not?
71
-
72
- t.string :generator # feed generator (e.g. wordpress, etc.) from feed
73
-
74
- t.datetime :updated # from feed updated(atom) + lastBuildDate(rss)
75
- t.datetime :published # from feed published(atom) + pubDate(rss) - note: published basically an alias for created
76
-
77
-
78
- ### extras (move to array for custom fields or similar??)
79
- t.string :author # author_name, owner_name
80
- t.string :email # author_email, owner_email
81
- t.string :avatar # gravator or hackergotchi handle (optional)
82
- t.string :location # e.g. Vienna > Austria, Bamberg > Germany etc. (optional)
83
-
84
- t.string :github # github handle (optional)
85
- t.string :rubygems # rubygems handle (optional)
86
- t.string :twitter # twitter handle (optional)
87
- t.string :meetup # meetup handle (optional)
88
-
89
-
90
- ### add class/kind field e.g.
91
- # - personal feed/blog/site, that is, individual author
92
- # - team blog/site
93
- # - org (anization) or com(pany blog/site)
94
- # - newsfeed (composite)
95
- # - other (link blog?, podcast?) - why? why not??
96
-
97
- ############
98
- # filters (feed-wide)
99
- t.string :includes # regex
100
- t.string :excludes # regex
101
- # todo: add generic filter list e.g. t.string :filters (comma,pipe or space separated method names?)
102
-
103
- # -- our own (meta) fields
104
- t.datetime :items_last_updated # cache last (latest) updated for items - e.g. latest date from updated item
105
- t.datetime :fetched # last fetched date via pluto
106
-
107
- t.integer :http_code # last http status code e.g. 200,404,etc.
108
- t.string :http_etag # last http header etag
109
- ## note: save last-modified header as text (not datetime) - pass through as is
110
- t.string :http_last_modified # last http header last-modified - note: save header as plain text!!! pass along in next request as-is
111
- t.string :http_server # last http server header if present
112
-
113
- t.string :md5 # md5 hash of body
114
- t.text :body # last http response body (complete feed!)
115
-
116
-
117
- t.timestamps # created_at, updated_at
118
- end
119
-
120
-
121
- create_table :items do |t|
122
- t.string :guid
123
- t.string :url
124
-
125
- ## note: title may contain more than 255 chars!!
126
- ## e.g. Rails Girls blog has massive titles in feed
127
- ## cut-off/limit to 255 - why?? why not??
128
- ## also strip tags in titles - why? why not?? - see feed.title2/auto_title2
129
-
130
- t.text :title # todo: add some :null => false ??
131
- t.text :summary # e.g. description (rss), summary (atom)
132
- t.text :content
133
-
134
- t.datetime :updated # from feed updated (atom) + pubDate(rss)
135
- t.datetime :published # from feed published (atom) -- note: published is basically an alias for created
136
-
137
- ## todo: add :last_updated_at ?? (NOTE: updated_at already take by auto-timestamps)
138
- t.references :feed, null: false
139
-
140
- t.datetime :fetched # last fetched/check date via pluto
141
- t.timestamps # created_at, updated_at
142
-
143
- ## t.string :author
144
- ## todo: add author/authors, category/categories
145
- end
146
-
147
- end # block Schema.define
148
-
149
- end # method up
150
-
151
- end # class CreateDb
152
-
153
- end # module Pluto
1
+ # encoding: utf-8
2
+
3
+ module Pluto
4
+
5
+ class CreateDb
6
+
7
+ def up
8
+
9
+ ActiveRecord::Schema.define do
10
+ create_table :sites do |t|
11
+ t.string :key, null: false # e.g. ruby, js, etc.
12
+ t.string :title, null: false # e.g Planet Ruby, Planet JavaScript, etc.
13
+
14
+ t.string :author # owner_name, author_name
15
+ t.string :email # owner_email, author_email
16
+ t.datetime :updated # date for subscription list last updated via pluto
17
+
18
+ ############
19
+ # filters (site-wide)
20
+ t.string :includes # regex
21
+ t.string :excludes # regex
22
+
23
+
24
+ ######################
25
+ # for auto-update of feed list/site config
26
+
27
+ t.string :url # source url for auto-update (optional)
28
+
29
+ ## note: make sure to use same fields for update check as feed
30
+
31
+ t.datetime :fetched # date for last fetched/checked for feeds via pluto -- make not null ??
32
+ t.integer :http_code # last http status code e.g. 200,404,etc.
33
+ t.string :http_etag # last http header etag
34
+ ## note: save last-modified header as text (not datetime) - pass through as is
35
+ t.string :http_last_modified # last http header last-modified - note: save header as plain text!!! pass along in next request as-is
36
+ t.string :http_server # last http server header if present
37
+
38
+ # note: do NOT store body content (that is, text) and md5 digest
39
+ # use git! and github! commit will be http_etag!!
40
+ t.string :md5 # md5 hash of body
41
+
42
+
43
+ #############
44
+ # more fields
45
+
46
+ t.timestamps # created_at, updated_at
47
+ end
48
+
49
+
50
+ create_table :subscriptions do |t| # has_many join table (sites/feeds)
51
+ t.references :site, null: false
52
+ t.references :feed, null: false
53
+ t.timestamps
54
+ end
55
+
56
+ create_table :feeds do |t|
57
+ t.string :key, null: false
58
+ t.string :encoding, null: false, default: 'utf8' # charset encoding; default to utf8
59
+ t.string :format # e.g. atom (1.0), rss 2.0, etc.
60
+
61
+ t.string :title # user supplied title
62
+ t.string :url # user supplied site url
63
+ t.string :feed_url # user supplied feed url
64
+
65
+ t.string :auto_title # "fallback" - auto(fill) title from feed
66
+ t.string :auto_url # "fallback" - auto(fill) url from feed
67
+ t.string :auto_feed_url # "fallback" - auto discovery feed url from (site) url
68
+
69
+ t.text :summary # e.g. description (rss), subtitle (atom)
70
+ ## todo: add auto_summary - why? why not?
71
+
72
+ t.string :generator # feed generator (e.g. wordpress, etc.) from feed
73
+
74
+ t.datetime :updated # from feed updated(atom) + lastBuildDate(rss)
75
+ t.datetime :published # from feed published(atom) + pubDate(rss) - note: published basically an alias for created
76
+
77
+
78
+ ### extras (move to array for custom fields or similar??)
79
+ t.string :author # author_name, owner_name
80
+ t.string :email # author_email, owner_email
81
+ t.string :avatar # gravator or hackergotchi handle (optional)
82
+ t.string :location # e.g. Vienna > Austria, Bamberg > Germany etc. (optional)
83
+
84
+ t.string :github # github handle (optional)
85
+ t.string :rubygems # rubygems handle (optional)
86
+ t.string :twitter # twitter handle (optional)
87
+ t.string :meetup # meetup handle (optional)
88
+
89
+
90
+ ### add class/kind field e.g.
91
+ # - personal feed/blog/site, that is, individual author
92
+ # - team blog/site
93
+ # - org (anization) or com(pany blog/site)
94
+ # - newsfeed (composite)
95
+ # - other (link blog?, podcast?) - why? why not??
96
+
97
+ ############
98
+ # filters (feed-wide)
99
+ t.string :includes # regex
100
+ t.string :excludes # regex
101
+ # todo: add generic filter list e.g. t.string :filters (comma,pipe or space separated method names?)
102
+
103
+ # -- our own (meta) fields
104
+ t.datetime :items_last_updated # cache last (latest) updated for items - e.g. latest date from updated item
105
+ t.datetime :fetched # last fetched date via pluto
106
+
107
+ t.integer :http_code # last http status code e.g. 200,404,etc.
108
+ t.string :http_etag # last http header etag
109
+ ## note: save last-modified header as text (not datetime) - pass through as is
110
+ t.string :http_last_modified # last http header last-modified - note: save header as plain text!!! pass along in next request as-is
111
+ t.string :http_server # last http server header if present
112
+
113
+ t.string :md5 # md5 hash of body
114
+ t.text :body # last http response body (complete feed!)
115
+
116
+
117
+ t.timestamps # created_at, updated_at
118
+ end
119
+
120
+
121
+ create_table :items do |t|
122
+ t.string :guid
123
+ t.string :url
124
+
125
+ ## note: title may contain more than 255 chars!!
126
+ ## e.g. Rails Girls blog has massive titles in feed
127
+ ## cut-off/limit to 255 - why?? why not??
128
+ ## also strip tags in titles - why? why not?? - see feed.title2/auto_title2
129
+
130
+ t.text :title # todo: add some :null => false ??
131
+ t.text :summary # e.g. description (rss), summary (atom)
132
+ t.text :content
133
+
134
+ t.datetime :updated # from feed updated (atom) + pubDate(rss)
135
+ t.datetime :published # from feed published (atom) -- note: published is basically an alias for created
136
+
137
+ ## todo: add :last_updated_at ?? (NOTE: updated_at already take by auto-timestamps)
138
+ t.references :feed, null: false
139
+
140
+ t.datetime :fetched # last fetched/check date via pluto
141
+ t.timestamps # created_at, updated_at
142
+
143
+ ## t.string :author
144
+ ## todo: add author/authors, category/categories
145
+ end
146
+
147
+ end # block Schema.define
148
+
149
+ end # method up
150
+
151
+ end # class CreateDb
152
+
153
+ end # module Pluto
@@ -3,8 +3,8 @@
3
3
  module Pluto
4
4
 
5
5
  MAJOR = 1
6
- MINOR = 4
7
- PATCH = 1
6
+ MINOR = 5
7
+ PATCH = 0
8
8
  VERSION = [MAJOR,MINOR,PATCH].join('.')
9
9
 
10
10
  def self.version
@@ -23,4 +23,3 @@ Subscription = Pluto::Model::Subscription
23
23
 
24
24
 
25
25
  Pluto.setup_in_memory_db
26
-
@@ -11,7 +11,7 @@ require 'helper'
11
11
  class TestFilter < MiniTest::Test
12
12
 
13
13
  def test_includes
14
-
14
+
15
15
  feed1 = Feed.create!(
16
16
  key: 'test',
17
17
  title: 'Test',
@@ -26,7 +26,7 @@ class TestFilter < MiniTest::Test
26
26
  feed_data = FeedParser::Feed.new
27
27
  feed_data.title = 'Test'
28
28
  feed_data.items = []
29
-
29
+
30
30
  item_data = FeedParser::Item.new
31
31
  item_data.title = 'Test #1'
32
32
  item_data.summary = 'Test'
@@ -36,7 +36,7 @@ class TestHelper < MiniTest::Test
36
36
 
37
37
  def test_auto_migrate
38
38
  Pluto.auto_migrate!
39
-
39
+
40
40
  assert true ## if we get here it should workd
41
41
  end
42
42
 
@@ -71,4 +71,3 @@ class TestSite < MiniTest::Test
71
71
 
72
72
 
73
73
  end # class TestSite
74
-
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: pluto-models
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.4.1
4
+ version: 1.5.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Gerald Bauer
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-10-23 00:00:00.000000000 Z
11
+ date: 2017-11-27 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: props