harvested2 5.0.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.document +3 -0
- data/.gitignore +35 -0
- data/.rspec +1 -0
- data/.rubocop.yml +34 -0
- data/.ruby-version +1 -0
- data/.travis.yml +12 -0
- data/Gemfile +20 -0
- data/HISTORY.md +118 -0
- data/MIT-LICENSE +21 -0
- data/README.md +66 -0
- data/Rakefile +24 -0
- data/harvested2.gemspec +30 -0
- data/lib/ext/array.rb +52 -0
- data/lib/ext/date.rb +9 -0
- data/lib/ext/hash.rb +17 -0
- data/lib/ext/time.rb +5 -0
- data/lib/harvest/account.rb +13 -0
- data/lib/harvest/api/account.rb +25 -0
- data/lib/harvest/api/base.rb +72 -0
- data/lib/harvest/api/clients.rb +10 -0
- data/lib/harvest/api/company.rb +12 -0
- data/lib/harvest/api/contacts.rb +9 -0
- data/lib/harvest/api/expense_categories.rb +9 -0
- data/lib/harvest/api/expenses.rb +26 -0
- data/lib/harvest/api/invoice_categories.rb +9 -0
- data/lib/harvest/api/invoice_messages.rb +86 -0
- data/lib/harvest/api/invoice_payments.rb +41 -0
- data/lib/harvest/api/invoices.rb +9 -0
- data/lib/harvest/api/projects.rb +9 -0
- data/lib/harvest/api/task_assignments.rb +75 -0
- data/lib/harvest/api/tasks.rb +9 -0
- data/lib/harvest/api/time_entry.rb +19 -0
- data/lib/harvest/api/user_assignments.rb +75 -0
- data/lib/harvest/api/users.rb +10 -0
- data/lib/harvest/base.rb +333 -0
- data/lib/harvest/behavior/activatable.rb +31 -0
- data/lib/harvest/behavior/crud.rb +80 -0
- data/lib/harvest/client.rb +23 -0
- data/lib/harvest/company.rb +8 -0
- data/lib/harvest/contact.rb +20 -0
- data/lib/harvest/credentials.rb +34 -0
- data/lib/harvest/errors.rb +27 -0
- data/lib/harvest/expense.rb +54 -0
- data/lib/harvest/expense_category.rb +10 -0
- data/lib/harvest/hardy_client.rb +80 -0
- data/lib/harvest/invoice.rb +75 -0
- data/lib/harvest/invoice_category.rb +8 -0
- data/lib/harvest/invoice_message.rb +8 -0
- data/lib/harvest/invoice_payment.rb +8 -0
- data/lib/harvest/line_item.rb +21 -0
- data/lib/harvest/model.rb +133 -0
- data/lib/harvest/project.rb +41 -0
- data/lib/harvest/receipt.rb +12 -0
- data/lib/harvest/task.rb +21 -0
- data/lib/harvest/task_assignment.rb +27 -0
- data/lib/harvest/time_entry.rb +57 -0
- data/lib/harvest/timezones.rb +130 -0
- data/lib/harvest/user.rb +58 -0
- data/lib/harvest/user_assignment.rb +27 -0
- data/lib/harvest/version.rb +3 -0
- data/lib/harvested2.rb +96 -0
- data/spec/factories/client.rb +14 -0
- data/spec/factories/contact.rb +8 -0
- data/spec/factories/expense.rb +10 -0
- data/spec/factories/expenses_category.rb +7 -0
- data/spec/factories/invoice.rb +25 -0
- data/spec/factories/invoice_category.rb +5 -0
- data/spec/factories/invoice_message.rb +9 -0
- data/spec/factories/invoice_payment.rb +7 -0
- data/spec/factories/line_item.rb +9 -0
- data/spec/factories/project.rb +15 -0
- data/spec/factories/task.rb +8 -0
- data/spec/factories/task_assignment.rb +8 -0
- data/spec/factories/time_entry.rb +13 -0
- data/spec/factories/user.rb +19 -0
- data/spec/factories/user_assigment.rb +7 -0
- data/spec/functional/clients_spec.rb +105 -0
- data/spec/functional/errors_spec.rb +42 -0
- data/spec/functional/expenses_spec.rb +97 -0
- data/spec/functional/invoice_messages_spec.rb +48 -0
- data/spec/functional/invoice_payments_spec.rb +51 -0
- data/spec/functional/invoice_spec.rb +138 -0
- data/spec/functional/project_spec.rb +76 -0
- data/spec/functional/tasks_spec.rb +119 -0
- data/spec/functional/time_entries_spec.rb +87 -0
- data/spec/functional/users_spec.rb +72 -0
- data/spec/harvest/base_spec.rb +10 -0
- data/spec/harvest/basic_auth_credentials_spec.rb +12 -0
- data/spec/harvest/expense_category_spec.rb +5 -0
- data/spec/harvest/expense_spec.rb +18 -0
- data/spec/harvest/invoice_message_spec.rb +5 -0
- data/spec/harvest/invoice_payment_spec.rb +5 -0
- data/spec/harvest/invoice_spec.rb +5 -0
- data/spec/harvest/oauth_credentials_spec.rb +11 -0
- data/spec/harvest/project_spec.rb +5 -0
- data/spec/harvest/task_assignment_spec.rb +5 -0
- data/spec/harvest/task_spec.rb +5 -0
- data/spec/harvest/time_entry_spec.rb +23 -0
- data/spec/harvest/user_assignment_spec.rb +5 -0
- data/spec/harvest/user_spec.rb +34 -0
- data/spec/spec_helper.rb +22 -0
- data/spec/support/factory_bot.rb +5 -0
- data/spec/support/harvested_helpers.rb +28 -0
- data/spec/support/json_examples.rb +9 -0
- metadata +238 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: ee945ac9e562e426b40c904e32025c47dcde6186
|
4
|
+
data.tar.gz: 9383142f811b6040b1554498ad7e5fb2215663a9
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: b0e235f4e3dc3fc1bcaef473d289ccfd7b41373a3c5abce161721f1e3faf03be94d82bc98253e5110ddee1894f13e41df1e0dedf58cae4c9c9e5f799a7a2bca5
|
7
|
+
data.tar.gz: f0d85bb0e06ed404ffe2dcd4265ad0a00f26da7267bd21da1817bab503c604fb0d9864adc33aa431680a165dbb730888770f040318846f3dd675a0369e35fe16
|
data/.document
ADDED
data/.gitignore
ADDED
@@ -0,0 +1,35 @@
|
|
1
|
+
## MAC OS
|
2
|
+
.DS_Store
|
3
|
+
|
4
|
+
## TEXTMATE
|
5
|
+
*.tmproj
|
6
|
+
tmtags
|
7
|
+
|
8
|
+
## EMACS
|
9
|
+
*~
|
10
|
+
\#*
|
11
|
+
.\#*
|
12
|
+
|
13
|
+
## VIM
|
14
|
+
*.swp
|
15
|
+
|
16
|
+
## PROJECT::GENERAL
|
17
|
+
coverage
|
18
|
+
rdoc
|
19
|
+
pkg
|
20
|
+
doc
|
21
|
+
.yardoc
|
22
|
+
|
23
|
+
## PROJECT::SPECIFIC
|
24
|
+
features/support/harvest_credentials.yml
|
25
|
+
spec/support/harvest_credentials.yml
|
26
|
+
.cassettes
|
27
|
+
.rbx
|
28
|
+
|
29
|
+
## RUBYGEMS
|
30
|
+
*.gem
|
31
|
+
Gemfile.lock
|
32
|
+
.bundle
|
33
|
+
vendor/bundle
|
34
|
+
|
35
|
+
tmp
|
data/.rspec
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
--color
|
data/.rubocop.yml
ADDED
@@ -0,0 +1,34 @@
|
|
1
|
+
AllCops:
|
2
|
+
TargetRubyVersion: 2.1
|
3
|
+
DisplayCopNames: true
|
4
|
+
Exclude:
|
5
|
+
- .git/**/*
|
6
|
+
- spec/core/middleware/response/sanitize_response_spec.rb
|
7
|
+
- vendor/**/*
|
8
|
+
|
9
|
+
# Align the elements of a hash literal if they span more than one line.
|
10
|
+
Layout/AlignHash:
|
11
|
+
EnforcedLastArgumentHashStyle: ignore_implicit
|
12
|
+
|
13
|
+
# Align the parameters of a method call if they span more than one line.
|
14
|
+
Layout/AlignParameters:
|
15
|
+
EnforcedStyle: with_fixed_indentation
|
16
|
+
|
17
|
+
# Checks the indentation of hanging closing parentheses.
|
18
|
+
Layout/ClosingParenthesisIndentation:
|
19
|
+
Enabled: false
|
20
|
+
|
21
|
+
# Checks the indentation of the first parameter in a method call.
|
22
|
+
Layout/FirstParameterIndentation:
|
23
|
+
EnforcedStyle: consistent
|
24
|
+
|
25
|
+
# Checks indentation of method calls with the dot operator that span more than one line.
|
26
|
+
Layout/MultilineMethodCallIndentation:
|
27
|
+
EnforcedStyle: indented
|
28
|
+
|
29
|
+
# Checks indentation of binary operations that span more than one line.
|
30
|
+
Layout/MultilineOperationIndentation:
|
31
|
+
EnforcedStyle: indented
|
32
|
+
|
33
|
+
Metrics:
|
34
|
+
Enabled: false
|
data/.ruby-version
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
2.5.1
|
data/.travis.yml
ADDED
data/Gemfile
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
source 'https://rubygems.org'
|
2
|
+
|
3
|
+
gemspec
|
4
|
+
|
5
|
+
group :development do
|
6
|
+
gem 'rake'
|
7
|
+
gem 'rubocop'
|
8
|
+
gem 'jruby-openssl', platform: [:jruby]
|
9
|
+
gem 'byebug'
|
10
|
+
gem 'pry'
|
11
|
+
gem 'pry-rails'
|
12
|
+
gem 'yard'
|
13
|
+
gem 'redcarpet'
|
14
|
+
end
|
15
|
+
|
16
|
+
group :test do
|
17
|
+
gem 'rspec'
|
18
|
+
gem 'webmock'
|
19
|
+
gem 'factory_bot'
|
20
|
+
end
|
data/HISTORY.md
ADDED
@@ -0,0 +1,118 @@
|
|
1
|
+
## 5.0.3 - Jun 10, 2018
|
2
|
+
* Add support for API V2
|
3
|
+
* Task/UserAssignment endpoints now are called Task/UserProjectAssignmens
|
4
|
+
* Update invoice, categories, messages and payment related actions
|
5
|
+
* Update expense actions
|
6
|
+
* Update client actions
|
7
|
+
* Update time entry actions
|
8
|
+
* Update user actions
|
9
|
+
* Update task actions
|
10
|
+
* Update line item actions
|
11
|
+
* Update account actions
|
12
|
+
* Add company actions
|
13
|
+
* Add receipt actions
|
14
|
+
* Update project, task and user assignments actions
|
15
|
+
* Remove deprecated reports endpoint
|
16
|
+
|
17
|
+
## 4.0.0 - Apr 21, 2017
|
18
|
+
* Invoices need to be told explicitly to send line items to the server with a new attribute: `update_line_items`.
|
19
|
+
* Task/UserAssignment endpoints can now be passed query params. (Thanks Brendan Loudermilk - @bloudermilk and Nick Giancola @patbenatar)
|
20
|
+
* Expense Attachments work again. (Thanks Peter - @toothfairy)
|
21
|
+
* Company information is now included when retreiving info from `who_am_i`. (Thanks André Arko - @indirect)
|
22
|
+
|
23
|
+
## 3.1.0 - Aug 29, 2014
|
24
|
+
* Allows Invoice Messages to be created (Thanks Thomas Balthazar - @tbalthazar)
|
25
|
+
|
26
|
+
## 3.0.0 - Aug 29, 2014
|
27
|
+
* No longer requires Hashie v1 as a dependency
|
28
|
+
* Fixes bug where project hints were not handled properly
|
29
|
+
|
30
|
+
## 3.0.0.rc1 - May 30, 2014
|
31
|
+
* Require Ruby 2.0+
|
32
|
+
* Allow OAuth authentication (Thanks Brendan Loudermilk - @bloudermilk)
|
33
|
+
* Allow expenses_by_project to be retrieved (Thanks Jordan Yeo - @jordanyeo)
|
34
|
+
* Reports now pass through any remaining options (Thanks Philip Arndt - @parndt)
|
35
|
+
|
36
|
+
## 2.0.0 - April 23, 2014
|
37
|
+
* Every connection must be SSL
|
38
|
+
|
39
|
+
## 1.2.0 - February 21, 2014
|
40
|
+
* Adds time.trackable_projects: projects that the current user can create entries for
|
41
|
+
* Show hint on error for projects.all as unprivileged user
|
42
|
+
|
43
|
+
## 1.1.0 - December 13, 2013
|
44
|
+
* Adds ability to toggle timers (thanks Eli Fatsi - @efatsi)
|
45
|
+
|
46
|
+
## 1.0.1 - June 21, 2013
|
47
|
+
* Adds ability to pass updated_since paramter to report methods (thanks Pete McWilliams)
|
48
|
+
* Adds ability to create time entries for a given user
|
49
|
+
|
50
|
+
## 1.0.0 - April 26, 2013
|
51
|
+
* Same as 0.6.4 - This should have been v1.0 long ago.
|
52
|
+
|
53
|
+
## 0.6.4 - October 24, 2012
|
54
|
+
* Removes yard and redcarpet dependencies (added on accident)
|
55
|
+
|
56
|
+
## 0.6.3 - October 24, 2012
|
57
|
+
* Adds task activation (Thanks Mark Rickert - @markrickert)
|
58
|
+
* Adds basic invoice support (Thanks Jeffrey Lee - @jlee42)
|
59
|
+
* Adds basic invoice payment support (Thanks Adam Doeler - @releod)
|
60
|
+
|
61
|
+
## 0.6.2 - August 25, 2012
|
62
|
+
* Fixes Mash constructor errors
|
63
|
+
|
64
|
+
## 0.6.1 - August 22, 2012
|
65
|
+
* Adds options to "all" finder (thanks Mikel Lindsaar)
|
66
|
+
* Adds Unauthorized error type (thanks @bcobb)
|
67
|
+
|
68
|
+
## 0.6.0 - August 22, 2012
|
69
|
+
* Replaces Dash with Mash
|
70
|
+
|
71
|
+
## 0.5.3 - August 21, 2012
|
72
|
+
* Adds new fields has_timesheet_2012_beta and timesheet_2012_beta_control_group to Users (thanks Aldric Giacomoni)
|
73
|
+
|
74
|
+
## 0.5.2 - August 17, 2012
|
75
|
+
* Adds new field password_change_required to Users
|
76
|
+
|
77
|
+
## 0.5.1 - June 27, 2012
|
78
|
+
* Updates README and harvested_credentials.example.yml with warnings about normal accounts
|
79
|
+
|
80
|
+
## 0.5.0 - June 18, 2012
|
81
|
+
* Bugfixes on User: https://github.com/zmoazeni/harvested/pull/26
|
82
|
+
* Bugfixes on TimeEntry: https://github.com/zmoazeni/harvested/pull/25
|
83
|
+
|
84
|
+
## 0.4.0 - August 4, 2011
|
85
|
+
* Large rewrite of codebase
|
86
|
+
* Rewrite of library to use JSON instead of XML
|
87
|
+
* Rewrite of tests to use rspec instead of cucumber
|
88
|
+
* Brings in VCR to help cache test responses
|
89
|
+
* Implements more reporting functionality
|
90
|
+
* Implements most of the invoice functionality. Creating/Editing/Updating is disabled due to Harvest API issue
|
91
|
+
* Consolidates various forks (thanks Chris Ritterdorf, bricooke, Michelle Moon Lee, tkwong, Steve McKinney, and others that helped but aren't in the git log!)
|
92
|
+
* Tests passing against MRI 1.8, 1.9, JRuby, and Rubinius
|
93
|
+
|
94
|
+
## 0.3.3 - January 27, 2010
|
95
|
+
* Adds fields to TaskAssignment (Quilted)
|
96
|
+
|
97
|
+
## 0.3.2 - January 27, 2010
|
98
|
+
* Adds of_user support to Time Entry (Benjamin Wong - tkwong)
|
99
|
+
|
100
|
+
## 0.3.1 - October 14, 2010
|
101
|
+
* Updates docs removing :ssl => false since Harvest released SSL to everyone
|
102
|
+
* Adds department to the User model (Steve McKinney - )
|
103
|
+
|
104
|
+
## 0.3.0 - April 11, 2010
|
105
|
+
* Adds users
|
106
|
+
* Adds clients
|
107
|
+
* Adds contacts
|
108
|
+
* Adds expense categories
|
109
|
+
* Adds expenses
|
110
|
+
* Adds projects
|
111
|
+
* Adds tasks
|
112
|
+
* Adds task assignments
|
113
|
+
* Adds user assignments
|
114
|
+
* Adds time tracking
|
115
|
+
* Adds reporting
|
116
|
+
* Adds account information
|
117
|
+
* Adds common errors
|
118
|
+
* Adds Harvest#hardy_client
|
data/MIT-LICENSE
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
MIT License
|
2
|
+
|
3
|
+
Copyright (c) 2018 MagmaLabs
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
7
|
+
in the Software without restriction, including without limitation the rights
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
10
|
+
furnished to do so, subject to the following conditions:
|
11
|
+
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
13
|
+
copies or substantial portions of the Software.
|
14
|
+
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
21
|
+
SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,66 @@
|
|
1
|
+
# Harvested: A Ruby Harvest API V2
|
2
|
+
[![Build Status](https://travis-ci.org/magma-labs/harvested2.svg?branch=master)](https://travis-ci.org/magma-labs/harvested2)
|
3
|
+
|
4
|
+
This is a Ruby wrapper for the [Harvest API V2](https://help.getharvest.com/api-v2)
|
5
|
+
|
6
|
+
## Installation
|
7
|
+
|
8
|
+
gem install harvested2
|
9
|
+
|
10
|
+
## Requirements
|
11
|
+
- Personal Access Token or OAuth2 application credentials
|
12
|
+
|
13
|
+
You can get them at https://id.getharvest.com/developers
|
14
|
+
|
15
|
+
## Examples
|
16
|
+
|
17
|
+
```ruby
|
18
|
+
harvest = Harvest.client(access_token: 'token', account_id: '123')
|
19
|
+
harvest.projects.all # list out projects
|
20
|
+
|
21
|
+
client = Harvest::Client.new(name: "Billable Company LTD.")
|
22
|
+
client = harvest.clients.create(client)
|
23
|
+
harvest.clients.find(client.id) # returns a Harvest::Client
|
24
|
+
```
|
25
|
+
|
26
|
+
You can also pass query options in as the last parameter on any object's `all` finder
|
27
|
+
method, for example to find all the projects for client ID 12345:
|
28
|
+
|
29
|
+
```ruby
|
30
|
+
harvest = Harvest.client(access_token: 'token', account_id: '123')
|
31
|
+
harvest.projects.all(nil, client: 12345)
|
32
|
+
```
|
33
|
+
|
34
|
+
Note: the first parameter is a User ID field that is optional, but needs to be specified
|
35
|
+
as nil if not included.
|
36
|
+
|
37
|
+
You can pass in any hash of query attributes you wish as per the
|
38
|
+
[Harvest API V2](https://help.getharvest.com/api-v2) page.
|
39
|
+
|
40
|
+
You can find more examples at [Harvested Examples](https://github.com/harvesthq/harvest_api_samples/tree/master/v2)
|
41
|
+
|
42
|
+
## Permissions
|
43
|
+
|
44
|
+
For most operations you need to be an Admin on the Harvest account. You can do a few select things as a normal user or a project manager, but you will likely get errors.
|
45
|
+
|
46
|
+
## Hardy Client
|
47
|
+
|
48
|
+
The team at Harvest built a great API, but there are always dangers in writing code that depends on an API. For example: HTTP Timeouts, Occasional Bad Gateways, and Rate Limiting issues need to be accounted for.
|
49
|
+
|
50
|
+
Using `Harvested#client` your code needs to handle all these situations. However you can also use `Harvested#hardy_client` which will retry errors and wait for Rate Limit resets.
|
51
|
+
|
52
|
+
```ruby
|
53
|
+
harvest = Harvest.hardy_client(access_token: 'token', account_id: '123')
|
54
|
+
harvest.projects.all # This will wait for the Rate Limit reset if you have gone over your limit
|
55
|
+
```
|
56
|
+
|
57
|
+
## Ruby support
|
58
|
+
|
59
|
+
Harvested's tests currently support Ruby version 2.1+
|
60
|
+
|
61
|
+
## Links
|
62
|
+
|
63
|
+
* [Harvested Documentation](http://rdoc.info/projects/zmoazeni/harvested)
|
64
|
+
* [Harvest API Documentation](https://help.getharvest.com/api-v2/)
|
65
|
+
* [Source Code for Harvested](http://github.com/zmoazeni/harvested)
|
66
|
+
|
data/Rakefile
ADDED
@@ -0,0 +1,24 @@
|
|
1
|
+
require 'bundler'
|
2
|
+
require 'bundler/gem_tasks'
|
3
|
+
Bundler::GemHelper.install_tasks
|
4
|
+
|
5
|
+
require 'rspec/core/rake_task'
|
6
|
+
RSpec::Core::RakeTask.new(:spec)
|
7
|
+
|
8
|
+
task :default => %w(spec)
|
9
|
+
|
10
|
+
begin
|
11
|
+
require 'yard'
|
12
|
+
YARD::Rake::YardocTask.new
|
13
|
+
rescue LoadError
|
14
|
+
task :yardoc do
|
15
|
+
abort "YARD is not available. In order to run yardoc, you must: sudo gem install yard"
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
desc 'Removes all data on harvest'
|
20
|
+
task 'clean_remote' do
|
21
|
+
require 'harvested2'
|
22
|
+
require File.expand_path('../spec/support/harvested_helpers', __FILE__)
|
23
|
+
HarvestedHelpers.clean_remote
|
24
|
+
end
|
data/harvested2.gemspec
ADDED
@@ -0,0 +1,30 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
require 'harvest/version'
|
5
|
+
|
6
|
+
Gem::Specification.new do |s|
|
7
|
+
s.platform = Gem::Platform::RUBY
|
8
|
+
s.name = 'harvested2'
|
9
|
+
s.version = Harvest::VERSION
|
10
|
+
s.summary = 'A Ruby Wrapper for the Harvest API http://www.getharvest.com/ V2'
|
11
|
+
s.description = 'Harvested wraps the Harvest API concisely without the use of Rails dependencies. More information about the Harvest API can be found on their website (http://www.getharvest.com/api). For support hit up the Mailing List (http://groups.google.com/group/harvested)'
|
12
|
+
|
13
|
+
s.authors = ['Zach Moazeni', 'Jonathan Tapia']
|
14
|
+
s.email = ['zach.moazeni@gmail.com', 'jonathan.tapia@magmalabs.io']
|
15
|
+
s.homepage = 'http://github.com/jtapia/harvested2'
|
16
|
+
s.license = 'MIT'
|
17
|
+
|
18
|
+
s.require_path = 'lib'
|
19
|
+
s.requirements << 'none'
|
20
|
+
s.files = `git ls-files -z`.split("\x0")
|
21
|
+
s.executables = s.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
22
|
+
s.test_files = s.files.grep(%r{^(test|spec|features)/})
|
23
|
+
|
24
|
+
s.required_ruby_version = '>= 2.2'
|
25
|
+
s.required_rubygems_version = '>= 1.3.6'
|
26
|
+
|
27
|
+
s.add_runtime_dependency('httparty')
|
28
|
+
s.add_runtime_dependency('hashie')
|
29
|
+
s.add_runtime_dependency('json')
|
30
|
+
end
|
data/lib/ext/array.rb
ADDED
@@ -0,0 +1,52 @@
|
|
1
|
+
# Shamelessly ripped from https://github.com/rails/rails/blob/master/activesupport/lib/active_support/core_ext/array/wrap.rb
|
2
|
+
|
3
|
+
unless Array.respond_to?(:wrap)
|
4
|
+
class Array
|
5
|
+
# Wraps its argument in an array unless it is already an array (or array-like).
|
6
|
+
#
|
7
|
+
# Specifically:
|
8
|
+
#
|
9
|
+
# * If the argument is +nil+ an empty list is returned.
|
10
|
+
# * Otherwise, if the argument responds to +to_ary+ it is invoked, and its result returned.
|
11
|
+
# * Otherwise, returns an array with the argument as its single element.
|
12
|
+
#
|
13
|
+
# Array.wrap(nil) # => []
|
14
|
+
# Array.wrap([1, 2, 3]) # => [1, 2, 3]
|
15
|
+
# Array.wrap(0) # => [0]
|
16
|
+
#
|
17
|
+
# This method is similar in purpose to <tt>Kernel#Array</tt>, but there are some differences:
|
18
|
+
#
|
19
|
+
# * If the argument responds to +to_ary+ the method is invoked. <tt>Kernel#Array</tt>
|
20
|
+
# moves on to try +to_a+ if the returned value is +nil+, but <tt>Arraw.wrap</tt> returns
|
21
|
+
# such a +nil+ right away.
|
22
|
+
# * If the returned value from +to_ary+ is neither +nil+ nor an +Array+ object, <tt>Kernel#Array</tt>
|
23
|
+
# raises an exception, while <tt>Array.wrap</tt> does not, it just returns the value.
|
24
|
+
# * It does not call +to_a+ on the argument, though special-cases +nil+ to return an empty array.
|
25
|
+
#
|
26
|
+
# The last point is particularly worth comparing for some enumerables:
|
27
|
+
#
|
28
|
+
# Array(:foo => :bar) # => [[:foo, :bar]]
|
29
|
+
# Array.wrap(:foo => :bar) # => [{:foo => :bar}]
|
30
|
+
#
|
31
|
+
# Array("foo\nbar") # => ["foo\n", "bar"], in Ruby 1.8
|
32
|
+
# Array.wrap("foo\nbar") # => ["foo\nbar"]
|
33
|
+
#
|
34
|
+
# There's also a related idiom that uses the splat operator:
|
35
|
+
#
|
36
|
+
# [*object]
|
37
|
+
#
|
38
|
+
# which returns <tt>[nil]</tt> for +nil+, and calls to <tt>Array(object)</tt> otherwise.
|
39
|
+
#
|
40
|
+
# Thus, in this case the behavior is different for +nil+, and the differences with
|
41
|
+
# <tt>Kernel#Array</tt> explained above apply to the rest of +object+s.
|
42
|
+
def self.wrap(object)
|
43
|
+
if object.nil?
|
44
|
+
[]
|
45
|
+
elsif object.respond_to?(:to_ary)
|
46
|
+
object.to_ary
|
47
|
+
else
|
48
|
+
[object]
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
data/lib/ext/date.rb
ADDED