diff options
| -rw-r--r-- | Gemfile.lock | 7 | ||||
| -rw-r--r-- | hcl.gemspec | 2 | ||||
| -rw-r--r-- | lib/hcl/task.rb | 11 | ||||
| -rw-r--r-- | lib/hcl/timesheet_resource.rb | 60 | 
4 files changed, 49 insertions, 31 deletions
| diff --git a/Gemfile.lock b/Gemfile.lock index 3e5e81e..d6f1a8b 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -3,6 +3,8 @@ PATH    specs:      hcl (0.4.9)        chronic +      faraday +      faraday_middleware        highline        trollop @@ -11,12 +13,17 @@ GEM    specs:      chronic (0.10.2)      fakeweb (1.3.0) +    faraday (0.8.8) +      multipart-post (~> 1.2.0) +    faraday_middleware (0.9.0) +      faraday (>= 0.7.4, < 0.9)      highline (1.6.20)      metaclass (0.0.1)      minitest (4.7.5)      mocha (0.14.0)        metaclass (~> 0.0.1)      multi_json (1.8.2) +    multipart-post (1.2.0)      rake (10.1.0)      rubinius-coverage (2.0.3)      rubygems-tasks (0.2.4) diff --git a/hcl.gemspec b/hcl.gemspec index ec2222b..d0fa7f8 100644 --- a/hcl.gemspec +++ b/hcl.gemspec @@ -18,6 +18,8 @@ Gem::Specification.new do |s|    s.add_runtime_dependency 'trollop'    s.add_runtime_dependency 'chronic'    s.add_runtime_dependency 'highline' +  s.add_runtime_dependency 'faraday' +  s.add_runtime_dependency 'faraday_middleware'    s.add_development_dependency 'rake'    s.add_development_dependency 'rubygems-tasks'    s.add_development_dependency 'mocha' diff --git a/lib/hcl/task.rb b/lib/hcl/task.rb index 79b9917..4bb635c 100644 --- a/lib/hcl/task.rb +++ b/lib/hcl/task.rb @@ -3,6 +3,17 @@ require 'fileutils'  module HCl    class Task < TimesheetResource +    def self.cache_tasks_hash day_entry_hash +      tasks = day_entry_hash['projects']. +        map { |p| p['tasks'].each {|t| new t.merge(project:p) } }.flatten.uniq +      unless tasks.empty? +        FileUtils.mkdir_p(cache_dir) +        File.open(cache_file, 'w') do |f| +          f.write tasks.to_yaml +        end +      end +    end +      def self.cache_tasks doc        tasks = []        doc.root.elements.collect('projects/project') do |project_elem| diff --git a/lib/hcl/timesheet_resource.rb b/lib/hcl/timesheet_resource.rb index 8fa7f5c..44d9ca0 100644 --- a/lib/hcl/timesheet_resource.rb +++ b/lib/hcl/timesheet_resource.rb @@ -1,6 +1,7 @@  require 'net/http'  require 'net/https'  require 'cgi' +require 'faraday_middleware'  module HCl    class TimesheetResource @@ -41,48 +42,45 @@ module HCl        CONFIG_VARS.inject({}) {|c,k| c.update(k => TimesheetResource.send(k)) }      end +    def get action +      new self.class.get(action).body +    end +    def post action, data +      new self.class.post(action, data).body +    end +    def delete action +      new self.class.delete(action).body +    end + +    def self.faraday +      @faraday ||= begin +        Faraday.new( +          "http#{ssl && 's'}://#{subdomain}.harvestapp.com" +        ) do |f| +          #f.headers['Accept'] = 'application/json' +          f.headers['Accept'] = 'application/xml' +          #f.request :json +          f.request :basic_auth, login, password +          #f.response :json, content_type: /\bjson$/ +          f.adapter Faraday.default_adapter +        end +      end +    end +      def initialize params        @data = params      end      def self.get action -      http_do Net::HTTP::Get, action +      faraday.get(action).body      end      def self.post action, data -      http_do Net::HTTP::Post, action, data +      faraday.post(action, data).body      end      def self.delete action -      http_do Net::HTTP::Delete, action -    end - -    def self.connect -      Net::HTTP.new("#{subdomain}.harvestapp.com", (ssl ? 443 : 80)).tap do |https| -        https.use_ssl = ssl -        https.verify_mode = OpenSSL::SSL::VERIFY_NONE if ssl -      end -    end - -    def self.http_do method_class, action, data = nil -      https = connect -      request = method_class.new "/#{action}" -      request.basic_auth login, password -      request.content_type = 'application/xml' -      request['Accept']    = 'application/xml' -      response = https.request request, data -      case response -      when Net::HTTPSuccess -        response.body -      when Net::HTTPFound -        raise Failure, "Redirected! Perhaps your ssl configuration variable is set incorrectly?" -      when Net::HTTPServiceUnavailable -        raise ThrottleFailure, response -      when Net::HTTPUnauthorized -        raise AuthFailure, "Login failed." -      else -        raise Failure, "Unexpected response from the upstream API." -      end +      faraday.delete(action).body      end      def id | 
