rss_notifier 0.1.5 → 0.2.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 +4 -4
- data/README.md +11 -0
- data/lib/rss_notifier/adapter/email.html.erb +2 -2
- data/lib/rss_notifier/adapter/email.rb +44 -10
- data/lib/rss_notifier/adapter/pushbullet.rb +1 -1
- data/lib/rss_notifier/app.rb +32 -23
- data/lib/rss_notifier/config.rb +4 -4
- data/lib/rss_notifier/db.rb +40 -8
- data/lib/rss_notifier/models.rb +9 -0
- data/lib/rss_notifier/models/feed.rb +65 -0
- data/lib/rss_notifier/models/item.rb +61 -0
- data/lib/rss_notifier/version.rb +1 -1
- data/rss_notifier.gemspec +3 -0
- metadata +47 -3
- data/lib/rss_notifier/item.rb +0 -60
    
        checksums.yaml
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            ---
         | 
| 2 2 | 
             
            SHA1:
         | 
| 3 | 
            -
              metadata.gz:  | 
| 4 | 
            -
              data.tar.gz:  | 
| 3 | 
            +
              metadata.gz: 19880610ce9f65b63fb64bb674fea707c709f720
         | 
| 4 | 
            +
              data.tar.gz: 70e5677949a56fb3baf1fabf7b1245101d883716
         | 
| 5 5 | 
             
            SHA512:
         | 
| 6 | 
            -
              metadata.gz:  | 
| 7 | 
            -
              data.tar.gz:  | 
| 6 | 
            +
              metadata.gz: fcd67b4add33589b3695441d5e5c225680e57848b266f53100f9d9fb47842ac4ae7f9df69978686c204a4d78a500aeb2aca01c176136bd16a44204fe949309cc
         | 
| 7 | 
            +
              data.tar.gz: 32419a690ee70c8cc94be2b5877bf4250e4f806a9ee04b2b4b762de847a798decb74e399922a2248b11596af84d236d790949e6a8dbff94263384ba70d1341cf
         | 
    
        data/README.md
    CHANGED
    
    | @@ -3,6 +3,17 @@ | |
| 3 3 | 
             
            It checks given rss urls every given period and notifies you using [Pushbullet](https://www.pushbullet.com).
         | 
| 4 4 |  | 
| 5 5 |  | 
| 6 | 
            +
            ## Getting notifications
         | 
| 7 | 
            +
             | 
| 8 | 
            +
            ### Email
         | 
| 9 | 
            +
             | 
| 10 | 
            +
            Create an account on https://sendgrid.com and generate API Key.
         | 
| 11 | 
            +
             | 
| 12 | 
            +
            ### Pushbullet
         | 
| 13 | 
            +
             | 
| 14 | 
            +
            Create an account on https://www.pushbullet.com and generate Access Token.
         | 
| 15 | 
            +
             | 
| 16 | 
            +
             | 
| 6 17 | 
             
            ## Usage
         | 
| 7 18 |  | 
| 8 19 | 
             
            Install the gem
         | 
| @@ -42,11 +42,11 @@ | |
| 42 42 | 
             
                </style>
         | 
| 43 43 | 
             
              </head>
         | 
| 44 44 | 
             
              <body>
         | 
| 45 | 
            -
                <h1><a href="<%= item.link %>"><%= item.title %></a></h1>
         | 
| 45 | 
            +
                <h1><a href="<%= item.link %>"><%= item.feed.name %> | <%= item.title %></a></h1>
         | 
| 46 46 | 
             
                <hr>
         | 
| 47 47 | 
             
                <div class="row">
         | 
| 48 48 | 
             
                  <div class="mini-info">
         | 
| 49 | 
            -
                    <b>RSS URL:</b> <span style="word-wrap: break-word;"><%= item. | 
| 49 | 
            +
                    <b>RSS URL:</b> <span style="word-wrap: break-word;"><%= item.feed.url %></span> <br><br>
         | 
| 50 50 | 
             
                    <b>Date:</b> <%= item.date.strftime('%Y-%m-%d %H:%M:%S') %> <br>
         | 
| 51 51 | 
             
                  </div>
         | 
| 52 52 | 
             
                  <div class="clearfix"></div>
         | 
| @@ -1,5 +1,6 @@ | |
| 1 1 | 
             
            require 'http'
         | 
| 2 2 | 
             
            require 'erb'
         | 
| 3 | 
            +
            require 'sendgrid-ruby'
         | 
| 3 4 |  | 
| 4 5 | 
             
            module RssNotifier
         | 
| 5 6 | 
             
              module Adapter
         | 
| @@ -9,30 +10,63 @@ module RssNotifier | |
| 9 10 |  | 
| 10 11 | 
             
                  HTML_TEMPLATE = File.expand_path('../email.html.erb', __FILE__)
         | 
| 11 12 |  | 
| 12 | 
            -
                  #  | 
| 13 | 
            -
                  # | 
| 14 | 
            -
                   | 
| 15 | 
            -
             | 
| 16 | 
            -
                  #     -F to=bar@example.com \
         | 
| 17 | 
            -
                  #     -F subject='Hello' \
         | 
| 18 | 
            -
                  #     -F text='Testing some Mailgun awesomness!'
         | 
| 19 | 
            -
             | 
| 20 | 
            -
                  def initialize(email)
         | 
| 13 | 
            +
                  # @param email [String]
         | 
| 14 | 
            +
                  # @param config [RssNotifier::Config]
         | 
| 15 | 
            +
                  def initialize(email, config)
         | 
| 16 | 
            +
                    @config = config
         | 
| 21 17 | 
             
                    @email = email
         | 
| 22 18 | 
             
                    @template = ERB.new(File.read(HTML_TEMPLATE))
         | 
| 19 | 
            +
             | 
| 20 | 
            +
                    @config[:adapters][:email][:from] or
         | 
| 21 | 
            +
                      raise 'config[:adapters][:email][:from] is not configured.'
         | 
| 22 | 
            +
             | 
| 23 | 
            +
                    @config[:adapters][:email][:sendgrid_api_key] or
         | 
| 24 | 
            +
                      raise 'config[:adapters][:email][:sendgrid_api_key] is not configured.'
         | 
| 23 25 | 
             
                  end
         | 
| 24 26 |  | 
| 25 27 | 
             
                  def notify(item)
         | 
| 26 28 | 
             
                    b = binding
         | 
| 27 29 | 
             
                    b.local_variable_set(:item, item)
         | 
| 28 30 | 
             
                    html = @template.result(b)
         | 
| 29 | 
            -
             | 
| 31 | 
            +
             | 
| 32 | 
            +
                    RssNotifier.logger.debug("Adapter::Email #{email}, #{html}")
         | 
| 33 | 
            +
             | 
| 34 | 
            +
                    mail = SendGrid::Mail.new do |m|
         | 
| 35 | 
            +
                      m.to = email
         | 
| 36 | 
            +
                      m.from = @config[:adapters][:email][:from]
         | 
| 37 | 
            +
                      m.subject = "#{item.feed.name} | #{item.title}"
         | 
| 38 | 
            +
                      m.text = html
         | 
| 39 | 
            +
                    end
         | 
| 40 | 
            +
             | 
| 41 | 
            +
                    client = RssNotifier::Adapter::Email.client(@config[:adapters][:email][:sendgrid_api_key])
         | 
| 42 | 
            +
             | 
| 43 | 
            +
                    begin
         | 
| 44 | 
            +
                      res = client.send(mail)
         | 
| 45 | 
            +
                      if res.code == 200
         | 
| 46 | 
            +
                        RssNotifier.logger.warn("Could not notify #{self}. Code=#{res.code}")
         | 
| 47 | 
            +
                        p res.body
         | 
| 48 | 
            +
                      else
         | 
| 49 | 
            +
                        RssNotifier.logger.debug("#{self} notified")
         | 
| 50 | 
            +
                        return false
         | 
| 51 | 
            +
                      end
         | 
| 52 | 
            +
                    rescue => e
         | 
| 53 | 
            +
                      puts e.to_s
         | 
| 54 | 
            +
                      puts e.backtrace
         | 
| 55 | 
            +
                      return false
         | 
| 56 | 
            +
                    end
         | 
| 57 | 
            +
             | 
| 58 | 
            +
                    true
         | 
| 30 59 | 
             
                  end
         | 
| 31 60 |  | 
| 32 61 | 
             
                  def to_s
         | 
| 33 62 | 
             
                    "<Adapter::Email email=#{email}>"
         | 
| 34 63 | 
             
                  end
         | 
| 35 64 |  | 
| 65 | 
            +
                  def self.client(api_key)
         | 
| 66 | 
            +
                    @clients ||= {}
         | 
| 67 | 
            +
                    @clients[api_key] ||= SendGrid::Client.new(api_key: api_key)
         | 
| 68 | 
            +
                  end
         | 
| 69 | 
            +
             | 
| 36 70 | 
             
                end
         | 
| 37 71 | 
             
              end
         | 
| 38 72 | 
             
            end
         | 
    
        data/lib/rss_notifier/app.rb
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            require 'rss_notifier/adapter'
         | 
| 2 2 | 
             
            require 'rss_notifier/config'
         | 
| 3 3 | 
             
            require 'rss_notifier/db'
         | 
| 4 | 
            -
            require 'rss_notifier/ | 
| 4 | 
            +
            require 'rss_notifier/models'
         | 
| 5 5 |  | 
| 6 6 | 
             
            require 'pathname'
         | 
| 7 7 | 
             
            require 'rss'
         | 
| @@ -50,7 +50,7 @@ module RssNotifier | |
| 50 50 | 
             
                  notify.each do |d|
         | 
| 51 51 | 
             
                    next unless d[:enabled]
         | 
| 52 52 | 
             
                    if d[:adapter] == 'email'
         | 
| 53 | 
            -
                      @notify << Adapter::Email.new(d[:email])
         | 
| 53 | 
            +
                      @notify << Adapter::Email.new(d[:email], @config)
         | 
| 54 54 | 
             
                    elsif d[:adapter] == 'pushbullet'
         | 
| 55 55 | 
             
                      @notify << Adapter::Pushbullet.new(d[:name], d[:access_token])
         | 
| 56 56 | 
             
                    else
         | 
| @@ -67,40 +67,47 @@ module RssNotifier | |
| 67 67 | 
             
                  end
         | 
| 68 68 | 
             
                end
         | 
| 69 69 |  | 
| 70 | 
            +
                # @return [Array] of tuples (url, name)
         | 
| 71 | 
            +
                def rss_urls_from_config
         | 
| 72 | 
            +
                  @rss_urls_from_config ||= @config.rss_urls.map do |o|
         | 
| 73 | 
            +
                    [ o[:url].to_s.strip, o[:name].to_s.strip ]
         | 
| 74 | 
            +
                  end.to_h
         | 
| 75 | 
            +
                end
         | 
| 76 | 
            +
             | 
| 70 77 | 
             
                def check_rss!
         | 
| 71 | 
            -
                   | 
| 72 | 
            -
             | 
| 78 | 
            +
                  changed_items = []
         | 
| 79 | 
            +
             | 
| 80 | 
            +
                  rss_urls_from_config.each do |url, name|
         | 
| 81 | 
            +
                    RssNotifier.logger.info "Checking #{name} | #{url}"
         | 
| 73 82 |  | 
| 74 | 
            -
                     | 
| 83 | 
            +
                    feed = @db.get_feed(url: url, name: name)
         | 
| 75 84 |  | 
| 76 | 
            -
                     | 
| 77 | 
            -
                     | 
| 85 | 
            +
                    rss_raw = nil
         | 
| 86 | 
            +
                    response = nil
         | 
| 78 87 | 
             
                    begin
         | 
| 79 | 
            -
                       | 
| 80 | 
            -
                       | 
| 88 | 
            +
                      response = HTTP.get(url)
         | 
| 89 | 
            +
                      # require 'pry'; binding.pry
         | 
| 90 | 
            +
                      raw_encoded = response.to_s.encode('UTF-8', 'binary', invalid: :replace, undef: :replace, replace: '')
         | 
| 91 | 
            +
                      rss_raw = RSS::Parser.parse(raw_encoded)
         | 
| 81 92 | 
             
                    rescue => e
         | 
| 82 93 | 
             
                      RssNotifier.logger.warn "Cannot parse RSS: #{e}"
         | 
| 83 94 | 
             
                      puts e.backtrace
         | 
| 84 95 | 
             
                      next
         | 
| 85 96 | 
             
                    end
         | 
| 86 | 
            -
                    items  | 
| 87 | 
            -
             | 
| 88 | 
            -
                       | 
| 89 | 
            -
                         | 
| 90 | 
            -
                         | 
| 91 | 
            -
                         | 
| 92 | 
            -
                        title: item.title,
         | 
| 93 | 
            -
                        description: item.description,
         | 
| 94 | 
            -
                        date: item.date
         | 
| 97 | 
            +
                    rss_raw.items.each do |raw_item|
         | 
| 98 | 
            +
                      item = feed.find_or_create_item(link: raw_item.link)
         | 
| 99 | 
            +
                      item.update({
         | 
| 100 | 
            +
                        title: raw_item.title,
         | 
| 101 | 
            +
                        description: raw_item.description,
         | 
| 102 | 
            +
                        date: raw_item.date
         | 
| 95 103 | 
             
                      })
         | 
| 104 | 
            +
                      changed_items << item if item.changed?
         | 
| 96 105 | 
             
                    end
         | 
| 97 | 
            -
             | 
| 106 | 
            +
             | 
| 107 | 
            +
                    feed.save
         | 
| 98 108 | 
             
                  end
         | 
| 99 | 
            -
                  changed_items = @db.changed_items
         | 
| 100 | 
            -
                  is_changed = @db.changed?
         | 
| 101 | 
            -
                  @db.save
         | 
| 102 109 |  | 
| 103 | 
            -
                   | 
| 110 | 
            +
                  if changed_items.empty?
         | 
| 104 111 | 
             
                    RssNotifier.logger.info 'No changes'
         | 
| 105 112 | 
             
                    return
         | 
| 106 113 | 
             
                  end
         | 
| @@ -111,6 +118,8 @@ module RssNotifier | |
| 111 118 | 
             
                    changed_items.each do |item|
         | 
| 112 119 | 
             
                      notify!(item)
         | 
| 113 120 | 
             
                    end
         | 
| 121 | 
            +
                  else
         | 
| 122 | 
            +
                    RssNotifier.logger.info "#{changed_items.size} items changed"
         | 
| 114 123 | 
             
                  end
         | 
| 115 124 | 
             
                end
         | 
| 116 125 |  | 
    
        data/lib/rss_notifier/config.rb
    CHANGED
    
    | @@ -7,16 +7,16 @@ module RssNotifier | |
| 7 7 | 
             
                DEFAULTS = {
         | 
| 8 8 | 
             
                  adapters: {
         | 
| 9 9 | 
             
                    email: {
         | 
| 10 | 
            -
                       | 
| 11 | 
            -
                      from: ' | 
| 10 | 
            +
                      sendgrid_api_key: '<Get it from sendgrid.com>',
         | 
| 11 | 
            +
                      from: 'RSS Notifier <rss-notifier@joma.pw>',
         | 
| 12 12 | 
             
                    }
         | 
| 13 13 | 
             
                  },
         | 
| 14 14 | 
             
                  notify: [
         | 
| 15 15 | 
             
                    { email: 'me@example.com', adapter: 'email', enabled: false },
         | 
| 16 | 
            -
                    { name: 'mini me', access_token: '< | 
| 16 | 
            +
                    { name: 'mini me', access_token: '<Get it from pushbullet.com>', adapter: 'pushbullet', enabled: false },
         | 
| 17 17 | 
             
                  ],
         | 
| 18 18 | 
             
                  rss_urls: [
         | 
| 19 | 
            -
                    {  | 
| 19 | 
            +
                    { name: 'Some News', url: 'http://some-site.com/rss' }
         | 
| 20 20 | 
             
                  ],
         | 
| 21 21 | 
             
                  period_in_minutes: 20
         | 
| 22 22 | 
             
                }
         | 
    
        data/lib/rss_notifier/db.rb
    CHANGED
    
    | @@ -1,15 +1,18 @@ | |
| 1 1 | 
             
            require 'yaml/store'
         | 
| 2 2 |  | 
| 3 | 
            +
            require 'rss_notifier/models'
         | 
| 4 | 
            +
             | 
| 5 | 
            +
            require 'pry'
         | 
| 6 | 
            +
             | 
| 3 7 | 
             
            module RssNotifier
         | 
| 4 8 | 
             
              class Db
         | 
| 5 9 |  | 
| 6 10 | 
             
                attr_reader :store
         | 
| 7 | 
            -
                attr_accessor : | 
| 11 | 
            +
                attr_accessor :feeds
         | 
| 8 12 |  | 
| 9 13 |  | 
| 10 14 | 
             
                def initialize(store)
         | 
| 11 | 
            -
                   | 
| 12 | 
            -
                  @items = {}
         | 
| 15 | 
            +
                  @feeds = {}
         | 
| 13 16 | 
             
                  @store = store
         | 
| 14 17 | 
             
                end
         | 
| 15 18 |  | 
| @@ -56,13 +59,42 @@ module RssNotifier | |
| 56 59 | 
             
                  true
         | 
| 57 60 | 
             
                end
         | 
| 58 61 |  | 
| 59 | 
            -
                 | 
| 60 | 
            -
             | 
| 61 | 
            -
                   | 
| 62 | 
            +
                # @return [RssNotifier::Models::Feed] creates new Feed if not found
         | 
| 63 | 
            +
                def get_feed(url:, name:)
         | 
| 64 | 
            +
                  @feeds[url] ||= RssNotifier::Models::Feed.new(url: url.to_s.strip, name: name)
         | 
| 65 | 
            +
                end
         | 
| 66 | 
            +
             | 
| 67 | 
            +
                # @return [RssNotifier::Models::Feed]
         | 
| 68 | 
            +
                def find_feed(url:)
         | 
| 69 | 
            +
                  @feeds[url.to_s.strip]
         | 
| 70 | 
            +
                end
         | 
| 71 | 
            +
             | 
| 72 | 
            +
                def load
         | 
| 73 | 
            +
                  @feeds = {}
         | 
| 62 74 | 
             
                  store.transaction do
         | 
| 63 | 
            -
                     | 
| 75 | 
            +
                    feeds_raw = store['feeds'] || {}
         | 
| 76 | 
            +
                    feeds_raw.each do |url, feed_raw|
         | 
| 77 | 
            +
                      feed = RssNotifier::Models::Feed.new(feed_raw)
         | 
| 78 | 
            +
                      @feeds[feed.url] = feed
         | 
| 79 | 
            +
                    end
         | 
| 64 80 | 
             
                  end
         | 
| 65 | 
            -
                   | 
| 81 | 
            +
                  self
         | 
| 82 | 
            +
                end
         | 
| 83 | 
            +
             | 
| 84 | 
            +
                # @return [RssNotifier::Db]
         | 
| 85 | 
            +
                def self.default
         | 
| 86 | 
            +
                  @default or raise "Not initialized"
         | 
| 87 | 
            +
                end
         | 
| 88 | 
            +
             | 
| 89 | 
            +
                def self.default=(default)
         | 
| 90 | 
            +
                  @default = default
         | 
| 91 | 
            +
                end
         | 
| 92 | 
            +
             | 
| 93 | 
            +
                def self.load(filename)
         | 
| 94 | 
            +
                  store = YAML::Store.new(filename)
         | 
| 95 | 
            +
                  RssNotifier::Db.default = RssNotifier::Db.new(store)
         | 
| 96 | 
            +
                  RssNotifier::Db.default.load
         | 
| 97 | 
            +
                  RssNotifier::Db.default
         | 
| 66 98 | 
             
                end
         | 
| 67 99 |  | 
| 68 100 | 
             
              end
         | 
| @@ -0,0 +1,65 @@ | |
| 1 | 
            +
            require 'virtus'
         | 
| 2 | 
            +
            require 'inflecto'
         | 
| 3 | 
            +
            require 'json'
         | 
| 4 | 
            +
             | 
| 5 | 
            +
            # {
         | 
| 6 | 
            +
            #   rss_url => {
         | 
| 7 | 
            +
            #     'Last-Modified' => 'blah',
         | 
| 8 | 
            +
            #     'items' => { item_url => Item, ... },
         | 
| 9 | 
            +
            #   }
         | 
| 10 | 
            +
            # }
         | 
| 11 | 
            +
            module RssNotifier
         | 
| 12 | 
            +
              module Models
         | 
| 13 | 
            +
                class Feed
         | 
| 14 | 
            +
                  include Virtus.model(:finalize => false)
         | 
| 15 | 
            +
             | 
| 16 | 
            +
                  attribute :url, String
         | 
| 17 | 
            +
                  attribute :name, String
         | 
| 18 | 
            +
                  attribute :items, Array['RssNotifier::Models::Item']
         | 
| 19 | 
            +
             | 
| 20 | 
            +
                  # updated_at in DB
         | 
| 21 | 
            +
                  attribute :updated_at, Time
         | 
| 22 | 
            +
             | 
| 23 | 
            +
             | 
| 24 | 
            +
                  # @return [RssNotifier::Models::Item]
         | 
| 25 | 
            +
                  def find_or_create_item(link:)
         | 
| 26 | 
            +
                    item = items.detect { |i| i.link.to_s.strip == link.to_s.strip }
         | 
| 27 | 
            +
                    unless item
         | 
| 28 | 
            +
                      item = RssNotifier::Models::Item.new(feed_url: self.url, link: link)
         | 
| 29 | 
            +
                      self.items << item
         | 
| 30 | 
            +
                    end
         | 
| 31 | 
            +
                    item
         | 
| 32 | 
            +
                  end
         | 
| 33 | 
            +
             | 
| 34 | 
            +
                  def store
         | 
| 35 | 
            +
                    @store ||= RssNotifier::Db.default.store
         | 
| 36 | 
            +
                  end
         | 
| 37 | 
            +
             | 
| 38 | 
            +
                  def changed?
         | 
| 39 | 
            +
                    !updated_at || items.any?(&:changed?)
         | 
| 40 | 
            +
                  end
         | 
| 41 | 
            +
             | 
| 42 | 
            +
                  def save
         | 
| 43 | 
            +
                    items.each do |item|
         | 
| 44 | 
            +
                      item.updated_at = Time.now
         | 
| 45 | 
            +
                    end
         | 
| 46 | 
            +
                    self.updated_at = Time.now
         | 
| 47 | 
            +
             | 
| 48 | 
            +
                    store.transaction do
         | 
| 49 | 
            +
                      store["feeds"] ||= {}
         | 
| 50 | 
            +
                      store["feeds"][url] = self.to_db_object
         | 
| 51 | 
            +
                    end
         | 
| 52 | 
            +
                  end
         | 
| 53 | 
            +
             | 
| 54 | 
            +
                  def to_db_object
         | 
| 55 | 
            +
                    {
         | 
| 56 | 
            +
                      'url' => url,
         | 
| 57 | 
            +
                      'name' => name,
         | 
| 58 | 
            +
                      'updated_at' => updated_at,
         | 
| 59 | 
            +
                      'items' => items.map(&:to_db_object),
         | 
| 60 | 
            +
                    }
         | 
| 61 | 
            +
                  end
         | 
| 62 | 
            +
             | 
| 63 | 
            +
                end
         | 
| 64 | 
            +
              end
         | 
| 65 | 
            +
            end
         | 
| @@ -0,0 +1,61 @@ | |
| 1 | 
            +
            require 'virtus'
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            module RssNotifier
         | 
| 4 | 
            +
              module Models
         | 
| 5 | 
            +
                class Item
         | 
| 6 | 
            +
                  include Virtus.model
         | 
| 7 | 
            +
             | 
| 8 | 
            +
                  attribute :link, String
         | 
| 9 | 
            +
                  attribute :title, String
         | 
| 10 | 
            +
                  attribute :description, String
         | 
| 11 | 
            +
                  attribute :date, Time
         | 
| 12 | 
            +
             | 
| 13 | 
            +
                  # updated_at in DB
         | 
| 14 | 
            +
                  attribute :updated_at, Time
         | 
| 15 | 
            +
             | 
| 16 | 
            +
                  attribute :feed_url, String
         | 
| 17 | 
            +
             | 
| 18 | 
            +
             | 
| 19 | 
            +
                  def feed
         | 
| 20 | 
            +
                    @feed ||= RssNotifier::Db.default.find_feed(url: feed_url)
         | 
| 21 | 
            +
                  end
         | 
| 22 | 
            +
             | 
| 23 | 
            +
                  def update(attributes)
         | 
| 24 | 
            +
                    __title = self.title
         | 
| 25 | 
            +
                    self.attributes = attributes
         | 
| 26 | 
            +
                    @__changed = __title != self.title
         | 
| 27 | 
            +
                  end
         | 
| 28 | 
            +
             | 
| 29 | 
            +
                  def changed?
         | 
| 30 | 
            +
                    new_record? || @__changed
         | 
| 31 | 
            +
                  end
         | 
| 32 | 
            +
             | 
| 33 | 
            +
                  def new_record?
         | 
| 34 | 
            +
                    !self.updated_at
         | 
| 35 | 
            +
                  end
         | 
| 36 | 
            +
             | 
| 37 | 
            +
                  def to_h
         | 
| 38 | 
            +
                    {
         | 
| 39 | 
            +
                      feed_url: feed.url,
         | 
| 40 | 
            +
                      feed_name: feed.name,
         | 
| 41 | 
            +
                      link: link,
         | 
| 42 | 
            +
                      title: title,
         | 
| 43 | 
            +
                      description: description,
         | 
| 44 | 
            +
                      date: date,
         | 
| 45 | 
            +
                    }
         | 
| 46 | 
            +
                  end
         | 
| 47 | 
            +
             | 
| 48 | 
            +
                  def to_db_object
         | 
| 49 | 
            +
                    {
         | 
| 50 | 
            +
                      'link' => link,
         | 
| 51 | 
            +
                      'title' => title,
         | 
| 52 | 
            +
                      'description' => description,
         | 
| 53 | 
            +
                      'date' => date,
         | 
| 54 | 
            +
                      'updated_at' => updated_at,
         | 
| 55 | 
            +
                      'feed_url' => feed_url,
         | 
| 56 | 
            +
                    }
         | 
| 57 | 
            +
                  end
         | 
| 58 | 
            +
             | 
| 59 | 
            +
                end
         | 
| 60 | 
            +
              end
         | 
| 61 | 
            +
            end
         | 
    
        data/lib/rss_notifier/version.rb
    CHANGED
    
    
    
        data/rss_notifier.gemspec
    CHANGED
    
    | @@ -21,6 +21,9 @@ Gem::Specification.new do |spec| | |
| 21 21 |  | 
| 22 22 | 
             
              spec.add_dependency 'http', '~> 1.0'
         | 
| 23 23 | 
             
              spec.add_dependency 'thor', '~> 0.19'
         | 
| 24 | 
            +
              spec.add_dependency 'virtus', '~> 1.0'
         | 
| 25 | 
            +
              spec.add_dependency 'inflecto', '~> 0.0'
         | 
| 26 | 
            +
              spec.add_dependency 'sendgrid-ruby', '~> 1.1'
         | 
| 24 27 |  | 
| 25 28 | 
             
              spec.add_development_dependency "bundler", "~> 1.11"
         | 
| 26 29 | 
             
              spec.add_development_dependency "rake", "~> 10.0"
         | 
    
        metadata
    CHANGED
    
    | @@ -1,14 +1,14 @@ | |
| 1 1 | 
             
            --- !ruby/object:Gem::Specification
         | 
| 2 2 | 
             
            name: rss_notifier
         | 
| 3 3 | 
             
            version: !ruby/object:Gem::Version
         | 
| 4 | 
            -
              version: 0. | 
| 4 | 
            +
              version: 0.2.0
         | 
| 5 5 | 
             
            platform: ruby
         | 
| 6 6 | 
             
            authors:
         | 
| 7 7 | 
             
            - Zhomart Mukhamejanov
         | 
| 8 8 | 
             
            autorequire: 
         | 
| 9 9 | 
             
            bindir: bin
         | 
| 10 10 | 
             
            cert_chain: []
         | 
| 11 | 
            -
            date: 2016-02- | 
| 11 | 
            +
            date: 2016-02-24 00:00:00.000000000 Z
         | 
| 12 12 | 
             
            dependencies:
         | 
| 13 13 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 14 14 | 
             
              name: http
         | 
| @@ -38,6 +38,48 @@ dependencies: | |
| 38 38 | 
             
                - - "~>"
         | 
| 39 39 | 
             
                  - !ruby/object:Gem::Version
         | 
| 40 40 | 
             
                    version: '0.19'
         | 
| 41 | 
            +
            - !ruby/object:Gem::Dependency
         | 
| 42 | 
            +
              name: virtus
         | 
| 43 | 
            +
              requirement: !ruby/object:Gem::Requirement
         | 
| 44 | 
            +
                requirements:
         | 
| 45 | 
            +
                - - "~>"
         | 
| 46 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 47 | 
            +
                    version: '1.0'
         | 
| 48 | 
            +
              type: :runtime
         | 
| 49 | 
            +
              prerelease: false
         | 
| 50 | 
            +
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 51 | 
            +
                requirements:
         | 
| 52 | 
            +
                - - "~>"
         | 
| 53 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 54 | 
            +
                    version: '1.0'
         | 
| 55 | 
            +
            - !ruby/object:Gem::Dependency
         | 
| 56 | 
            +
              name: inflecto
         | 
| 57 | 
            +
              requirement: !ruby/object:Gem::Requirement
         | 
| 58 | 
            +
                requirements:
         | 
| 59 | 
            +
                - - "~>"
         | 
| 60 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 61 | 
            +
                    version: '0.0'
         | 
| 62 | 
            +
              type: :runtime
         | 
| 63 | 
            +
              prerelease: false
         | 
| 64 | 
            +
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 65 | 
            +
                requirements:
         | 
| 66 | 
            +
                - - "~>"
         | 
| 67 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 68 | 
            +
                    version: '0.0'
         | 
| 69 | 
            +
            - !ruby/object:Gem::Dependency
         | 
| 70 | 
            +
              name: sendgrid-ruby
         | 
| 71 | 
            +
              requirement: !ruby/object:Gem::Requirement
         | 
| 72 | 
            +
                requirements:
         | 
| 73 | 
            +
                - - "~>"
         | 
| 74 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 75 | 
            +
                    version: '1.1'
         | 
| 76 | 
            +
              type: :runtime
         | 
| 77 | 
            +
              prerelease: false
         | 
| 78 | 
            +
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 79 | 
            +
                requirements:
         | 
| 80 | 
            +
                - - "~>"
         | 
| 81 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 82 | 
            +
                    version: '1.1'
         | 
| 41 83 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 42 84 | 
             
              name: bundler
         | 
| 43 85 | 
             
              requirement: !ruby/object:Gem::Requirement
         | 
| @@ -119,7 +161,9 @@ files: | |
| 119 161 | 
             
            - lib/rss_notifier/cli.rb
         | 
| 120 162 | 
             
            - lib/rss_notifier/config.rb
         | 
| 121 163 | 
             
            - lib/rss_notifier/db.rb
         | 
| 122 | 
            -
            - lib/rss_notifier/ | 
| 164 | 
            +
            - lib/rss_notifier/models.rb
         | 
| 165 | 
            +
            - lib/rss_notifier/models/feed.rb
         | 
| 166 | 
            +
            - lib/rss_notifier/models/item.rb
         | 
| 123 167 | 
             
            - lib/rss_notifier/version.rb
         | 
| 124 168 | 
             
            - rss_notifier.gemspec
         | 
| 125 169 | 
             
            homepage: https://github.com/Zhomart/rss_notifier
         | 
    
        data/lib/rss_notifier/item.rb
    DELETED
    
    | @@ -1,60 +0,0 @@ | |
| 1 | 
            -
            module RssNotifier
         | 
| 2 | 
            -
              class Item
         | 
| 3 | 
            -
                DONT_SAVE = [ '@is_changed' ]
         | 
| 4 | 
            -
             | 
| 5 | 
            -
                attr_accessor :rss_url
         | 
| 6 | 
            -
                attr_accessor :rss_title
         | 
| 7 | 
            -
                attr_accessor :link
         | 
| 8 | 
            -
                attr_accessor :title
         | 
| 9 | 
            -
                attr_accessor :description
         | 
| 10 | 
            -
                attr_accessor :date
         | 
| 11 | 
            -
                attr_accessor :saved_at
         | 
| 12 | 
            -
             | 
| 13 | 
            -
                attr_accessor :is_changed
         | 
| 14 | 
            -
             | 
| 15 | 
            -
             | 
| 16 | 
            -
                def initialize(params = nil)
         | 
| 17 | 
            -
                  params and params.each do |k, v|
         | 
| 18 | 
            -
                    self.send("#{k}=", v)
         | 
| 19 | 
            -
                  end
         | 
| 20 | 
            -
                  self.is_changed = false
         | 
| 21 | 
            -
                end
         | 
| 22 | 
            -
             | 
| 23 | 
            -
                def update(params)
         | 
| 24 | 
            -
                  old_title = self.title
         | 
| 25 | 
            -
                  params.each do |k, v|
         | 
| 26 | 
            -
                    send("#{k}=", v)
         | 
| 27 | 
            -
                  end
         | 
| 28 | 
            -
                  self.is_changed = old_title != self.title
         | 
| 29 | 
            -
                end
         | 
| 30 | 
            -
             | 
| 31 | 
            -
                def changed?
         | 
| 32 | 
            -
                  self.is_changed
         | 
| 33 | 
            -
                end
         | 
| 34 | 
            -
             | 
| 35 | 
            -
                def new_record?
         | 
| 36 | 
            -
                  !self.saved_at
         | 
| 37 | 
            -
                end
         | 
| 38 | 
            -
             | 
| 39 | 
            -
                def to_h
         | 
| 40 | 
            -
                  {
         | 
| 41 | 
            -
                    rss_url: rss_url,
         | 
| 42 | 
            -
                    rss_title: rss_title,
         | 
| 43 | 
            -
                    link: link,
         | 
| 44 | 
            -
                    title: title,
         | 
| 45 | 
            -
                    description: description,
         | 
| 46 | 
            -
                    date: date,
         | 
| 47 | 
            -
                  }
         | 
| 48 | 
            -
                end
         | 
| 49 | 
            -
             | 
| 50 | 
            -
                def encode_with(coder)
         | 
| 51 | 
            -
                  vars = instance_variables.map { |x| x.to_s } - DONT_SAVE
         | 
| 52 | 
            -
             | 
| 53 | 
            -
                  vars.each do |var|
         | 
| 54 | 
            -
                    var_val = eval(var)
         | 
| 55 | 
            -
                    coder[var.gsub('@', '')] = var_val
         | 
| 56 | 
            -
                  end
         | 
| 57 | 
            -
                end
         | 
| 58 | 
            -
             | 
| 59 | 
            -
              end
         | 
| 60 | 
            -
            end
         |