Class: Pluto::Model::Site

Inherits:
ActiveRecord::Base
  • Object
show all
Defined in:
lib/pluto/models/site.rb

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.deep_create_or_update_from_hash!(name, config, opts = {}) ⇒ Object



29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
# File 'lib/pluto/models/site.rb', line 29

def self.deep_create_or_update_from_hash!( name, config, opts={} )

  ## note: allow (optional) config of site key too
  site_key = config['key'] || config['slug']
  if site_key.nil?
    ## if no key configured; use (file)name; remove -_ chars
    ##   e.g. jekyll-meta becomes jekyllmeta etc.
    site_key = name.downcase.gsub( /[\-_]/, '' )
  end

  site_rec = Site.find_by_key( site_key )
  if site_rec.nil?
    site_rec        = Site.new
    site_rec.key    = site_key
  end

  site_rec.deep_update_from_hash!( config, opts )
  site_rec
end

Instance Method Details

#author_emailObject

alias(2) for email



25
# File 'lib/pluto/models/site.rb', line 25

def author_email() email;  end

#author_nameObject

alias(3) for author



22
# File 'lib/pluto/models/site.rb', line 22

def author_name() author;  end

#deep_update_from_hash!(config, opts = {}) ⇒ Object



50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
# File 'lib/pluto/models/site.rb', line 50

def deep_update_from_hash!( config, opts={} )

  logger = LogUtils::Logger.root

  site_attribs = {
    title:   config['title']  || config['name'],   # support either title or name
    url:     config['source'] || config['url'],    # support source or url   for source url for auto-update (optional)
    author:  config['author'] || config['owner'],
    email:   config['email'],
    updated: Time.now,   ## track last_update via pluto (w/ update_subscription_for fn)
  }

  ## note: allow (optional) config of site key too
  site_key = config['key'] || config['slug']
  site_attribs[:key] = site_key   if site_key


  logger.debug "site_attribs: #{site_attribs.inspect}"

  if new_record?
    ## use object_id: site.id and object_type: Site
    ## change - model/table/schema!!!
    Activity.create!( text: "new site >#{key}< - #{title}" )
  end

  update_attributes!( site_attribs )


  # -- log update activity
  ##  Activity.create!( text: "update subscriptions for site >#{key}<" )

  #### todo/fix:
  ##  double check - how to handle delete
  ##    feeds might get referenced by other sites
  ##   cannot just delete feeds; only save to delete join table (subscriptions)
  ##   check if feed "lingers" on with no reference (to site)???

  # clean out subscriptions and add again
  logger.debug "before site.subscriptions.delete_all - count: #{subscriptions.count}"
  # note: use destroy_all NOT delete_all (delete_all tries by default only nullify)
  subscriptions.destroy_all
  logger.debug "after site.subscriptions.delete_all - count: #{subscriptions.count}"


  config.each do |k, v|

    ## todo: downcase key - why ??? why not???

    # skip "top-level" feed keys e.g. title, etc. or planet planet sections (e.g. planet,defaults)
    next if ['key','slug',
             'title','name','name2','title2','subtitle',
             'source', 'url',
             'include','includes','exclude','excludes',
             'feeds',
             'author', 'owner', 'email',
             'planet','defaults'].include?( k )

    ### todo/check:
    ##   check value - must be hash
    #     check if url or feed_url present
    #      that is, check for required props/key-value pairs

    feed_key   = k.to_s.dup
    feed_hash  = v

    # todo/fix: use title from feed?
    #  e.g. fill up auto_title, auto_url, etc.

    feed_attribs = {
      feed_url: feed_hash[ 'feed' ]  || feed_hash[ 'feed_url' ] || feed_hash[ 'xml_url' ],
      url:      feed_hash[ 'link' ]  || feed_hash[ 'url' ] || feed_hash[ 'html_url' ],
      title:    feed_hash[ 'title' ] || feed_hash[ 'name' ],
## note: title2 no longer supported; use summary or subtitle?
###     title2:   feed_hash[ 'title2' ] || feed_hash[ 'name2' ] || feed_hash[ 'subtitle'],
      includes: feed_hash[ 'includes' ] || feed_hash[ 'include' ],
      excludes: feed_hash[ 'excludes' ] || feed_hash[ 'exclude' ],
      author:   feed_hash[ 'author' ] || feed_hash[ 'owner' ],
      email:    feed_hash[ 'email' ],
      avatar:   feed_hash[ 'avatar'   ] || feed_hash[ 'face'],
      location: feed_hash[ 'location' ],
      github:   feed_hash[ 'github'  ],
      twitter:  feed_hash[ 'twitter' ],
      rubygems: feed_hash[ 'rubygems' ],
      meetup:   feed_hash[ 'meetup' ],   ### -- remove from schema - virtual attrib ?? - why? why not??
    }

    feed_attribs[:encoding] = feed_hash['encoding']||feed_hash['charset']    if feed_hash['encoding']||feed_hash['charset']

#####
##
# auto-fill; convenience helpers

    if feed_hash['meetup']
##  link/url      = http://www.meetup.com/vienna-rb
##  feed/feed_url = http://www.meetup.com/vienna-rb/events/rss/vienna.rb/

      feed_attribs[:url]      = "http://www.meetup.com/#{feed_hash['meetup']}"    if feed_attribs[:url].nil?
      feed_attribs[:feed_url] = "http://www.meetup.com/#{feed_hash['meetup']}/events/rss/#{feed_hash['meetup']}/"    if feed_attribs[:feed_url].nil?
    end

    if feed_hash['googlegroups']
##  link/url      = https://groups.google.com/group/beerdb or
##                  https://groups.google.com/forum/#!forum/beerdb
##  feed/feed_url = https://groups.google.com/forum/feed/beerdb/topics/atom.xml?num=15

      feed_attribs[:url]      = "https://groups.google.com/group/#{feed_hash['googlegroups']}"    if feed_attribs[:url].nil?
      feed_attribs[:feed_url] = "https://groups.google.com/forum/feed//#{feed_hash['googlegroups']}/topics/atom.xml?num=15"    if feed_attribs[:feed_url].nil?
    end

    if feed_hash['github'] && feed_hash['github'].index('/')  ## e.g. jekyll/jekyll
## link/url      = https://github.com/jekyll/jekyll
## feed/feed_url = https://github.com/jekyll/jekyll/commits/master.atom

      feed_attribs[:url]      = "https://github.com/#{feed_hash['github']}"    if feed_attribs[:url].nil?
      feed_attribs[:feed_url] = "https://github.com/#{feed_hash['github']}/commits/master.atom"    if feed_attribs[:feed_url].nil?
    end

    if feed_hash['rubygems'] && feed_attribs[:url].nil? && feed_attribs[:feed_url].nil?
## link/url      = http://rubygems.org/gems/jekyll
## feed/feed_url = http://rubygems.org/gems/jekyll/versions.atom

      feed_attribs[:url]      = "http://rubygems.org/gems/#{feed_hash['rubygems']}"    if feed_attribs[:url].nil?
      feed_attribs[:feed_url] = "http://rubygems.org/gems/#{feed_hash['rubygems']}/versions.atom"    if feed_attribs[:feed_url].nil?
    end


    logger.info "Updating feed subscription >#{feed_key}< - >#{feed_attribs[:feed_url]}<..."

    feed_rec = Feed.find_by_key( feed_key )
    if feed_rec.nil?
      feed_rec           = Feed.new
      feed_attribs[:key] = feed_key

      ## use object_id: feed.id and object_type: Feed
      ## change - model/table/schema!!!
      ## todo: add parent_action_id - why? why not?
      Activity.create!( text: "new feed >#{feed_key}< - #{feed_attribs[:title]}" )
    end

    feed_rec.update_attributes!( feed_attribs )

    #  add subscription record
    #   note: subscriptions get cleaned out on update first (see above)
    subscriptions.create!( feed_id: feed_rec.id )
  end

end

#nameObject

attribute reader aliases



18
# File 'lib/pluto/models/site.rb', line 18

def name()        title;   end

#ownerObject

alias(2) for author



21
# File 'lib/pluto/models/site.rb', line 21

def owner()       author;  end

#owner_emailObject

alias for email



24
# File 'lib/pluto/models/site.rb', line 24

def owner_email()  email;  end

#owner_nameObject

alias for author



20
# File 'lib/pluto/models/site.rb', line 20

def owner_name()  author;  end