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



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

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



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

def author_email() email;  end

#author_nameObject

alias(3) for author



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

def author_name() author;  end

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



47
48
49
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
# File 'lib/pluto/models/site.rb', line 47

def deep_update_from_hash!( config, opts={} )

  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 = LogUtils::Logger.root
  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


    puts "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



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

def name()        title;    end

#ownerObject

alias(2) for author



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

def owner()       author;  end

#owner_emailObject

alias for email



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

def owner_email()  email;  end

#owner_nameObject

alias for author



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

def owner_name()  author;  end