/habraparser

Habrahabr parser

Primary LanguageRuby

Habraparser Gem

Compatible with Ruby on Rails.

Usage:

    require 'habraparser'

    # get post from habr
    post_id = 57829
    post = Habr::Post.find post_id

    # puts post info
    puts "#{post.blog_title} -> #{post.title}"
    puts post.before_habracut
    puts "author: #{post.author_name}"

Simple example:

    # find user
    user = Habr::User.find 'blackfoks'

    # each fav
    user.favs.pages.each |page| do
      page.each |fav| do
        # find blog, post and author
        blog = Habr::Blog.find fav.blog_slug
        post = Habr::Post.find fav.post_id
        author = Habr::User.find fav.author_slug

        # puts past preview
        puts "#{blog.name} > #{post.title}"
        puts post.before_habracut
        puts "by #{author.name} (#{author.karma}, #{author.power})"
      end
    end

Instead of directly find blog by its slug and post by its id you can simply call special methods of Fav instance:

    # explicit
    blog = Habr::Blog.find fav.blog_slug
    post = Habr::Post.find fav.post_id
    author = Habr::User.find fav.author_slug

    # inplicit
    blog = fav.blog
    post = fav.post
    author = fav.author

You also can iterate over all favs instead of pages and favs. UserFavs#each gets an iterator and hides iterating over pages.

All attributes of FavsPage is lazy. This means that when you create FavsPage object or even when you get it from iterator or #each method it contains nothing but URL of favorites page.

When you start iterating over favorites on the page on the first time FavsPage instance calls #load and loads appropriate web-page and parses its content then it fills @favs array with Fav objects and lets you iterate over the array.

Notice: #load is called only once so if you need to reload the page you should create a new FavsPage instance.

All attributes of Fav is not lazy. There's only one way you can get an object of this kind: from FavsPage instance. Although you can use #new because it gets empty Fav object.

How to use:

    user = Habr::User.find 'blackfoks'
    user.favs.count #=> 786
    user.favs.pages.count #=> 64
    user.favs.page(1) #=> [Fav, Fav, Fav...]

    user.favs.class #=> UserFavs
    user.favs.pages[1].class #=> FavsPage
    user.favs.pages.class #=> Array

    user.favs.pages.each do |page|
      page.each do |fav|
       fav.title #=> ...
       fav.blog_title #=> "Ruby"
       fav.blog_slug #=> "ruby"
       fav.post_id #=> 123876
      end
    end

Usage with Rails:

    # app/models/post.rb
    class Post < ActiveRecord::Base
      # ...

      # fetches post from habr, saves it and then returns it
      def self.fetch(id)
        # find post on habr
        hpost = Habr::Post.find id
        Post.create(
          :title => hpost.title,
          :content => hpost.content,
          # find blog in db or save it with given data
          :blog => Blog.find_or_save(
            :slug => hpost.blog_slug,
            :title => hpost.blog_title
          ),
          # find habrauser in db or save it with given data
          :author => Habrauser.find_or_save(
            :slug => hpost.author_slug,
            :name => hpost_author_name
          )
        )
      end
    end

For more see documentation or wiki.