diff options
| author | Zack Hobson | 2013-12-27 13:19:57 -0800 | 
|---|---|---|
| committer | Zack Hobson | 2013-12-27 13:19:57 -0800 | 
| commit | 8e2e788909c6a634976c80eeb75c79af8f8ab734 (patch) | |
| tree | 8314e9ad539476d0e327ad20abde667203f4115f | |
| parent | 89867bd84610d6d5622540a7e26b6c3467d632bf (diff) | |
| download | hcl-8e2e788909c6a634976c80eeb75c79af8f8ab734.tar.bz2 | |
pass http client into instance commands
| -rw-r--r-- | README.markdown | 12 | ||||
| -rw-r--r-- | lib/hcl/app.rb | 4 | ||||
| -rw-r--r-- | lib/hcl/commands.rb | 14 | ||||
| -rw-r--r-- | lib/hcl/day_entry.rb | 12 | ||||
| -rw-r--r-- | lib/hcl/net.rb | 16 | ||||
| -rw-r--r-- | lib/hcl/task.rb | 10 | ||||
| -rw-r--r-- | lib/hcl/timesheet_resource.rb | 13 | ||||
| -rw-r--r-- | test/command_test.rb | 4 | ||||
| -rw-r--r-- | test/day_entry_test.rb | 10 | ||||
| -rw-r--r-- | test/task_test.rb | 6 | ||||
| -rw-r--r-- | test/test_helper.rb | 3 | 
11 files changed, 59 insertions, 45 deletions
| diff --git a/README.markdown b/README.markdown index 4b05856..d6fe847 100644 --- a/README.markdown +++ b/README.markdown @@ -144,17 +144,19 @@ powerful Harvest API client built into HCl, since not all of its  features are exposed via the command line. The current {HCl::App}  instance is available as `hcl`. -It's also possible to issue HCl commands directly (as Ruby methods), or -to query specific JSON end points and have the results pretty-printed: +It's also possible to issue HCl commands directly (except `alias`, see +below), or to query specific JSON end points and have the results +pretty-printed:      hcl console      hcl> show "yesterday"      # => prints yesterday's timesheet, note the quotes! -    hcl> Net.get('daily') +    hcl> hcl.http.get('daily')      # => displays a pretty-printed version of the JSON output -Note that unlike the commands themselves, the HCl internals may change without -notice. +Note that the the HCl internals may change without notice. +Also, commands (like `alias`) that are also reserved words in Ruby +can't be issued directly (use `send :alias` instead).  ### Date Formats diff --git a/lib/hcl/app.rb b/lib/hcl/app.rb index 115ab65..2799f12 100644 --- a/lib/hcl/app.rb +++ b/lib/hcl/app.rb @@ -20,6 +20,10 @@ module HCl        self      end +    def http +      HCl::Net +    end +      # Run the given command and arguments.      def self.command *args        new.process_args(*args).run diff --git a/lib/hcl/commands.rb b/lib/hcl/commands.rb index 834ba2c..17c86b1 100644 --- a/lib/hcl/commands.rb +++ b/lib/hcl/commands.rb @@ -8,7 +8,7 @@ module HCl      # Display a sanitized view of your auth credentials.      def config -      Net.config_hash.merge(password:'***').map {|k,v| "#{k}: #{v}" }.join("\n") +      http.config_hash.merge(password:'***').map {|k,v| "#{k}: #{v}" }.join("\n")      end      def console @@ -46,7 +46,7 @@ module HCl      def cancel        entry = DayEntry.with_timer || DayEntry.last        if entry -        if entry.cancel +        if entry.cancel http            "Deleted entry #{entry}."          else            fail "Failed to delete #{entry}!" @@ -92,7 +92,7 @@ module HCl        if task.nil?          fail "Unknown task alias, try one of the following: ", aliases.join(', ')        end -      timer = task.start \ +      timer = task.start http,          :starting_time => starting_time,          :note => args.join(' ')        "Started timer for #{timer} (at #{current_time})" @@ -107,8 +107,8 @@ module HCl      def stop *args        entry = DayEntry.with_timer || DayEntry.with_timer(DateTime.yesterday)        if entry -        entry.append_note(args.join(' ')) if args.any? -        entry.toggle +        entry.append_note(http, args.join(' ')) if args.any? +        entry.toggle http          "Stopped #{entry} (at #{current_time})"        else          fail "No running timers found." @@ -121,7 +121,7 @@ module HCl          if args.empty?            return entry.notes          else -          entry.append_note args.join(' ') +          entry.append_note http, args.join(' ')            "Added note to #{entry}."          end        else @@ -152,7 +152,7 @@ module HCl            DayEntry.last          end        if entry -        entry.toggle +        entry.toggle http        else          fail "No matching timer found."        end diff --git a/lib/hcl/day_entry.rb b/lib/hcl/day_entry.rb index 8485139..0a54bfd 100644 --- a/lib/hcl/day_entry.rb +++ b/lib/hcl/day_entry.rb @@ -15,9 +15,9 @@ module HCl        @data[:task]      end -    def cancel +    def cancel http        begin -        Net.delete("daily/delete/#{id}") +        http.delete("daily/delete/#{id}")        rescue HarvestMiddleware::Failure          return false        end @@ -29,11 +29,11 @@ module HCl      end      # Append a string to the notes for this task. -    def append_note new_notes +    def append_note http, new_notes        # If I don't include hours it gets reset.        # This doens't appear to be the case for task and project.        (self.notes << "\n#{new_notes}").lstrip! -      Net.post "daily/update/#{id}", notes:notes, hours:hours +      http.post "daily/update/#{id}", notes:notes, hours:hours      end      def self.with_timer date=nil @@ -58,8 +58,8 @@ module HCl        # TODO cache client/project names and ids      end -    def toggle -      Net.get("daily/timer/#{id}") +    def toggle http +      http.get("daily/timer/#{id}")        self      end diff --git a/lib/hcl/net.rb b/lib/hcl/net.rb index 01fb737..334571c 100644 --- a/lib/hcl/net.rb +++ b/lib/hcl/net.rb @@ -5,8 +5,8 @@ module HCl    module Net      class << self        # configuration accessors -      CONFIG_VARS = [ :login, :password, :subdomain, :ssl ].freeze -      CONFIG_VARS.each { |config_var| attr_reader config_var } +      CONFIG_VARS = [ :login, :password, :subdomain, :ssl ].freeze. +        each { |config_var| attr_reader config_var }        def config_hash          CONFIG_VARS.inject({}) {|c,k| c.update(k => send(k)) } @@ -17,27 +17,25 @@ module HCl          @password = opts['password'].freeze          @subdomain = opts['subdomain'].freeze          @ssl = !!opts['ssl'] -      end - -      def http -        @http ||= Faraday.new( +        @http = Faraday.new(            "http#{ssl ? 's' : '' }://#{subdomain}.harvestapp.com"          ) do |f|            f.use :harvest, login, password            f.adapter Faraday.default_adapter          end +        self        end        def get action -        http.get(action).body +        @http.get(action).body        end        def post action, data -        http.post(action, data).body +        @http.post(action, data).body        end        def delete action -        http.delete(action).body +        @http.delete(action).body        end      end    end diff --git a/lib/hcl/task.rb b/lib/hcl/task.rb index e1d5b58..89e3b97 100644 --- a/lib/hcl/task.rb +++ b/lib/hcl/task.rb @@ -47,10 +47,10 @@ module HCl        end      end -    def add opts +    def add http, opts        notes = opts[:note]        starting_time = opts[:starting_time] || 0 -      DayEntry.new Net.post("daily/add", { +      DayEntry.new http.post("daily/add", {          notes: notes,          hours: starting_time,          project_id: project.id, @@ -59,12 +59,12 @@ module HCl        })      end -    def start opts -      day = add opts +    def start http, opts +      day = add http, opts        if day.running?          day        else -        DayEntry.new Net.get("daily/timer/#{day.id}") +        DayEntry.new http.get("daily/timer/#{day.id}")        end      end    end diff --git a/lib/hcl/timesheet_resource.rb b/lib/hcl/timesheet_resource.rb index 54c74f1..10f8586 100644 --- a/lib/hcl/timesheet_resource.rb +++ b/lib/hcl/timesheet_resource.rb @@ -16,6 +16,10 @@ module HCl        (@data && @data.key?(method.to_sym)) || super      end +    def http +      self.class.http +    end +      class << self        def _prepare_resource name, *args, &url_cb          ((@resources ||= {})[name] = {}).tap do |res| @@ -34,6 +38,11 @@ module HCl          end        end +      def http +        # XXX how do I get the app instance in here? +        HCl::Net +      end +        def resources name, *args, &url_cb          res = _prepare_resource name, *args, &url_cb          cls = res[:opts][:class_name] ? HCl.const_get(res[:opts][:class_name]) : self @@ -41,7 +50,7 @@ module HCl          send(method, name) do |*args|            url = instance_exec *args, &res[:url_cb]            cb = res[:opts][:load_cb] -          Net.get(url).tap{|e| cb.call(e) if cb }[cls.collection_name].map{|e|new(e)} +          http.get(url).tap{|e| cb.call(e) if cb }[cls.collection_name].map{|e|new(e)}          end        end @@ -52,7 +61,7 @@ module HCl          send(method, name) do |*args|            url = instance_exec *args, &res[:url_cb]            cb = res[:opts][:load_cb] -          cls.new Net.get(url).tap{|e| cb.call(e) if cb }[cls.underscore_name] +          cls.new http.get(url).tap{|e| cb.call(e) if cb }[cls.underscore_name]          end        end diff --git a/test/command_test.rb b/test/command_test.rb index 56c7d93..a0cdca1 100644 --- a/test/command_test.rb +++ b/test/command_test.rb @@ -69,7 +69,7 @@ class CommandTest < HCl::TestCase        project: HCl::Project.new(id:456, name:'App', client:'Bob', code:'b')      )      HCl::Task.expects(:find).with('456','123').returns(task) -    task.expects(:start).with(starting_time:nil, note:'do stuff') +    task.expects(:start).with(http, starting_time:nil, note:'do stuff')      start *%w[ 456 123 do stuff ]    end @@ -106,7 +106,7 @@ class CommandTest < HCl::TestCase    def test_note      entry = stub      HCl::DayEntry.expects(:with_timer).returns(entry) -    entry.expects(:append_note).with('hi world') +    entry.expects(:append_note).with(http, 'hi world')      note 'hi world'    end diff --git a/test/day_entry_test.rb b/test/day_entry_test.rb index 5b53463..a685bc0 100644 --- a/test/day_entry_test.rb +++ b/test/day_entry_test.rb @@ -25,19 +25,19 @@ class DayEntryTest < HCl::TestCase    def test_toggle      entry = HCl::DayEntry.new(id:123)      register_uri(:get, '/daily/timer/123', {note:'hi'}) -    entry.toggle +    entry.toggle http    end    def test_cancel_success      entry = HCl::DayEntry.new(id:123)      register_uri(:delete, '/daily/delete/123') -    assert entry.cancel +    assert entry.cancel http    end    def test_cancel_failure      entry = HCl::DayEntry.new(id:123)      HCl::Net.expects(:delete).raises(HCl::HarvestMiddleware::Failure) -    assert !entry.cancel +    assert !entry.cancel(http)    end    def test_to_s @@ -49,14 +49,14 @@ class DayEntryTest < HCl::TestCase    def test_append_note      entry = HCl::DayEntry.new(:id => '1', :notes => 'yourmom.', :hours => '1.0')      HCl::Net.stubs(:post) -    entry.append_note('hi world') +    entry.append_note(http, 'hi world')      assert_equal "yourmom.\nhi world", entry.notes    end    def test_append_note_to_empty      entry = HCl::DayEntry.new(:id => '1', :notes => nil, :hours => '1.0')      HCl::Net.stubs(:post) -    entry.append_note('hi world') +    entry.append_note(http, 'hi world')      assert_equal 'hi world', entry.notes    end  end diff --git a/test/task_test.rb b/test/task_test.rb index 3deb620..b224ed3 100644 --- a/test/task_test.rb +++ b/test/task_test.rb @@ -23,7 +23,7 @@ class TaskTest < HCl::TestCase      task = HCl::Task.new(id:1, project:HCl::Project.new({id:2}))      register_uri(:post, '/daily/add', {        note:'good stuff', hours:0.2, project_id:2, task_id:1, spent_at: Date.today}) -    entry = task.add(note:'good stuff', starting_time:0.2) +    entry = task.add(http, note:'good stuff', starting_time:0.2)      assert_equal 'good stuff', entry.note    end @@ -32,7 +32,7 @@ class TaskTest < HCl::TestCase      register_uri(:post, '/daily/add', {        note:'good stuff', timer_started_at:DateTime.now,        hours:0.2, project_id:2, task_id:1, spent_at: Date.today}) -    entry = task.start(note:'good stuff', starting_time:0.2) +    entry = task.start(http, note:'good stuff', starting_time:0.2)      assert_equal 'good stuff', entry.note    end @@ -41,7 +41,7 @@ class TaskTest < HCl::TestCase      register_uri(:post, '/daily/add', {id:123, note:'woot'})      register_uri(:get, '/daily/timer/123', {note:'good stuff', hours:0.2,                                              project_id:2, task_id:1, spent_at: Date.today}) -    entry = task.start(note:'good stuff', starting_time:0.2) +    entry = task.start(http, note:'good stuff', starting_time:0.2)      assert_equal 'good stuff', entry.note    end  end diff --git a/test/test_helper.rb b/test/test_helper.rb index 47d3517..33cf499 100644 --- a/test/test_helper.rb +++ b/test/test_helper.rb @@ -28,9 +28,10 @@ require 'fakeweb'  Dir[File.dirname(__FILE__) + '/ext/*.rb'].each { |ext| require ext }  class HCl::TestCase < MiniTest::Unit::TestCase +  attr_reader :http    def setup      FakeWeb.allow_net_connect = false -    HCl::Net.configure \ +    @http = HCl::Net.configure \        'login' => 'bob',        'password' => 'secret',        'subdomain' => 'bobclock', | 
