millisami
millisami

Reputation: 10151

Re-using a single file with basic ruby tested code in rails?

I got this code in a single file snippet.rb and it runs as expected. This script if from dzone snippet that fetches the thumbnail of the URL at the current time.

Now I wan to integrate this functionality with Rails and here I'm stuck how to begin. Should I put this in some ruby file inside lib directory or make it modules??? I'm not much fluent in Ruby, so can anyone plz initiate me how and where to start??

    require 'net/http'
    require 'rubygems'
    require 'xmlsimple'

    class Nailer

        @@api_baseurl = 'http://webthumb.bluga.net/api.php'
        @@api_key = 'YOUR-API-KEY'

        attr_accessor :collection_time, :job_id, :ok

        def initialize(url, width = 1024, height = 768)
            url = url.gsub!(/&/, '&')
            api_request = 
    %Q{<webthumb><apikey>#{@@api_key}</apikey><request><url>#{url}</url><width>#{width}</width><height>#{height}</height></request></webthumb>}

            result = do_request(api_request)

            if result.class == Net::HTTPOK
              result_data = XmlSimple.xml_in(result.body)
              @job_id = result_data['jobs'].first['job'].first['content']
              @collection_time = Time.now.to_i + result_data['jobs'].first['job'].first['estimate'].to_i
              @ok = true
            else
              @ok = false
            end
        end

        def retrieve(size = :small)
            api_request = 
    %Q{<webthumb><apikey>#{@@api_key}</apikey><fetch><job>#{@job_id}</job><size>#{size.to_s}</size></fetch></webthumb>}
            result = do_request(api_request)
            result.body
        end

        def retrieve_to_file(filename, size = :small)
            File.new(filename, 'w+').write(retrieve(size.to_s))
        end

        def ready?
            return unless Time.now.to_i >= @collection_time

            api_request = %Q{<webthumb><apikey>#{@@api_key}</apikey><status><job>#{@job_id}</job></status></webthumb>}
            result = do_request(api_request)

            if result.class == Net::HTTPOK
              @ok = true
              result_data = XmlSimple.xml_in(result.body)
              begin
                @result_url = result_data['jobStatus'].first['status'].first['pickup']
                @completion_time = result_data['jobStatus'].first['status'].first['completionTime']
              rescue
                @collection_time += 60 
                  return false
              end
            else
              @ok = false
            end

            true
        end

        def ok?
            @ok == true
        end

        def wait_until_ready
            sleep 1 until ready?
        end

        private

        def do_request(body)
            api_url = URI.parse(@@api_baseurl)
            request = Net::HTTP::Post.new(api_url.path)
            request.body = body
            Net::HTTP.new(api_url.host, api_url.port).start {|h| h.request(request) }
        end
    end

    url = 'http://www.rubyinside.com/'
    t = Nailer.new(url)

    if t.ok?
        t.wait_until_ready
        t.retrieve_to_file('out1.jpg', :small)
        t.retrieve_to_file('out2.jpg', :medium)
        t.retrieve_to_file('out3.jpg', :medium2)
        t.retrieve_to_file('out4.jpg', :large)
        puts "Thumbnails saved"
    else
        puts "Error"
    end

Upvotes: 1

Views: 143

Answers (3)

August Lilleaas
August Lilleaas

Reputation: 54593

Put it in lib/nailer.rb, and you're good to go. Rails' autoloading lets you use Nailer.new(...) and such without any configurations or requires.

Upvotes: 3

John Hyland
John Hyland

Reputation: 6872

Looks to me like you can just drop this straight in to your lib/ directory in a file called nailer.rb, and you should be good to go. Since lib/ is in your load path in a Rails app, a simple "require 'nailer'" at the top of any given file should be all you need to pull the class in to your name space.

You could also put it in app/models - it's totally ok to put non-ActiveRecord models in there. Since this isn't exactly a data model in your domain, though, I think lib/ is probably the better place.

Upvotes: 0

Avdi
Avdi

Reputation: 18418

The lib directory is a good place for utility code like that.

Upvotes: 0

Related Questions