greenhouse_io 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
data/.gitignore ADDED
@@ -0,0 +1,15 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ Gemfile.lock
7
+ InstalledFiles
8
+ _yardoc
9
+ coverage
10
+ doc/
11
+ lib/bundler/man
12
+ pkg
13
+ rdoc
14
+ spec/reports
15
+ tmp
data/.travis.yml ADDED
@@ -0,0 +1,4 @@
1
+ language: ruby
2
+ rvm:
3
+ - 2.0.0
4
+ - 1.9.3
data/Gemfile ADDED
@@ -0,0 +1,11 @@
1
+ source 'https://rubygems.org'
2
+
3
+ group :development do
4
+ gem 'pry'
5
+ end
6
+
7
+ group :test do
8
+ gem 'coveralls', :require => false
9
+ end
10
+
11
+ gemspec
data/LICENSE.txt ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2013 Adrian Bautista
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,99 @@
1
+ # Greenhouse
2
+
3
+ [![Gem
4
+ Version](https://badge.fury.io/rb/greenhouse-io.png)](http://badge.fury.io/rb/greenhouse-io)
5
+ [![Build
6
+ Status](https://travis-ci.org/adrianbautista/greenhouse.png)](https://travis-ci.org/adrianbautista/greenhouse)
7
+ [![Coverage Status](https://coveralls.io/repos/adrianbautista/greenhouse/badge.png)](https://coveralls.io/r/adrianbautista/greenhouse)
8
+
9
+ A Ruby interface to
10
+ [Greenhouse.io's](https://app.greenhouse.io/jobboard/jsonp_instructions)
11
+ API.
12
+
13
+ ## Installation
14
+
15
+ Add this line to your application's Gemfile:
16
+
17
+ gem 'greenhouse-io'
18
+
19
+ And then execute:
20
+
21
+ $ bundle
22
+
23
+ Or install it yourself as:
24
+
25
+ $ gem install greenhouse-io
26
+
27
+ ## Usage
28
+
29
+ Creating an instance of the API client:
30
+ ```ruby
31
+ gh = GreenhouseIo::API.new("api_token")
32
+ ```
33
+
34
+ The client will also use the environment variable `'GREENHOUSE_API_TOKEN'` by default:
35
+ ```ruby
36
+ gh = GreenhouseIo::API.new
37
+ ```
38
+
39
+ A default organization can be passed through an options hash:
40
+ ```ruby
41
+ gh = GreenhouseIo::API.new("api_token", :organization => "your_organization")
42
+ ```
43
+
44
+ ### Fetching Office Data
45
+ ```ruby
46
+ gh.offices
47
+ gh.offices(:organization => 'different_organization')
48
+ # returns a hash containing all of the organization's department and jobs grouped by office
49
+ ```
50
+
51
+ ```ruby
52
+ gh.office(officeID)
53
+ gh.office(officeID, :organization => 'different_organization')
54
+ # returns a hash containing the departments and jobs of a specific office
55
+ ```
56
+
57
+ ### Fetching Department Data
58
+ ```ruby
59
+ gh.departments
60
+ gh.departments(:organization => 'different_organizaton')
61
+ ```
62
+
63
+ ```ruby
64
+ gh.department(departmentID)
65
+ gh.department(departmentID, :organization => 'different_organization')
66
+ ```
67
+
68
+ ### Fetching Job Data
69
+ ```ruby
70
+ gh.jobs
71
+ gh.jobs(:content => 'true')
72
+ # includes the job description in the response
73
+ gh.jobs(:organization => 'different_organization')
74
+ ```
75
+
76
+ ```ruby
77
+ gh.job(jobID)
78
+ gh.job(jobID, :questions => true)
79
+ # returns the specified job and the array of questions on the application
80
+ gh.job(jobID, :organization => 'different_organization')
81
+ ```
82
+
83
+ ### Submitting a Job Application
84
+ This is the only API method that **requires** an API token from Greenhouse
85
+ ```ruby
86
+ gh.apply_to_job(form_parameter_hash)
87
+
88
+ # form_parameter_hash should match the questions array of a given job opening
89
+ # there should be a hidden input with name id in your form that
90
+ # has the value of the job ID on Greenhouse.io
91
+ ```
92
+
93
+ ## Contributing
94
+
95
+ 1. Fork it
96
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
97
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
98
+ 4. Push to the branch (`git push origin my-new-feature`)
99
+ 5. Create new Pull Request
data/Rakefile ADDED
@@ -0,0 +1,8 @@
1
+ require 'rspec/core/rake_task'
2
+ require "bundler/gem_tasks"
3
+
4
+ task :default => :spec
5
+ desc "Run all spec tests"
6
+ RSpec::Core::RakeTask.new do |t|
7
+ t.pattern = FileList['spec/**/*_spec.rb']
8
+ end
@@ -0,0 +1,28 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'greenhouse_io/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "greenhouse_io"
8
+ spec.version = GreenhouseIo::VERSION
9
+ spec.authors = ["Adrian Bautista"]
10
+ spec.email = ["adrianbautista8@gmail.com"]
11
+ spec.description = %q{A Ruby based wrapper for Greenhouse.io API}
12
+ spec.summary = %q{A Ruby based wrapper for Greenhouse.io API}
13
+ spec.license = "MIT"
14
+
15
+ spec.files = `git ls-files`.split($/)
16
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
17
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
18
+ spec.require_paths = ["lib"]
19
+
20
+ spec.add_dependency('httparty')
21
+ spec.add_dependency('multi_json', '~> 1.8.0')
22
+
23
+ spec.add_development_dependency "bundler", "~> 1.3"
24
+ spec.add_development_dependency "rake"
25
+ spec.add_development_dependency "rspec", "~> 2.14.1"
26
+ spec.add_development_dependency "webmock", "~> 1.8.0"
27
+ spec.add_development_dependency "vcr", "~> 2.5.0"
28
+ end
@@ -0,0 +1,7 @@
1
+ require 'httparty'
2
+ require 'multi_json'
3
+ require 'cgi'
4
+
5
+ require "greenhouse_io/version"
6
+ require "greenhouse_io/error"
7
+ require "greenhouse_io/api"
@@ -0,0 +1,72 @@
1
+ module GreenhouseIo
2
+ class API
3
+ attr_accessor :api_token, :organization
4
+
5
+ include HTTParty
6
+ base_uri 'https://api.greenhouse.io/v1'
7
+
8
+ def initialize(api_token = nil, default_options = {})
9
+ @api_token = api_token || ENV['GREENHOUSE_API_TOKEN']
10
+ @organization = default_options.delete(:organization)
11
+ end
12
+
13
+ def offices(options = {})
14
+ get_response_hash("/boards/#{ query_organization(options) }/embed/offices")
15
+ end
16
+
17
+ def office(id, options = {})
18
+ get_response_hash("/boards/#{ query_organization(options) }/embed/office?id=#{ id }")
19
+ end
20
+
21
+ def departments(options = {})
22
+ get_response_hash("/boards/#{ query_organization(options) }/embed/departments")
23
+ end
24
+
25
+ def department(id, options = {})
26
+ get_response_hash("/boards/#{ query_organization(options) }/embed/department?id=#{ id }")
27
+ end
28
+
29
+ def jobs(options = {})
30
+ get_response_hash("/boards/#{ query_organization(options) }/embed/jobs?content=#{ options[:content] }")
31
+ end
32
+
33
+ def job(id, options = { :questions => false })
34
+ get_response_hash("/boards/#{ query_organization(options) }/embed/job?id=#{ id }&questions=#{ options[:questions] }")
35
+ end
36
+
37
+ def apply_to_job(job_form_hash)
38
+ options = { :body => job_form_hash, :basic_auth => basic_auth }
39
+ post_response_hash('/applications', options)
40
+ end
41
+
42
+ private
43
+
44
+ def query_organization(options_hash)
45
+ org = options_hash[:organization] || @organization
46
+ org.nil? ? (raise GreenhouseIo::Error.new("organization can't be blank")) : org
47
+ end
48
+
49
+ def get_response_hash(url)
50
+ response = self.class.get(url)
51
+ if response.code == 200
52
+ MultiJson.load(response.body, :symbolize_keys => true)
53
+ else
54
+ raise GreenhouseIo::Error.new(response.code)
55
+ end
56
+ end
57
+
58
+ def post_response_hash(url, options)
59
+ response = self.class.post(url, options)
60
+ if response.code == 200
61
+ response.include?("success") ? MultiJson.load(response.body, :symbolize_keys => true) : raise(GreenhouseIo::Error.new(response["reason"]))
62
+ else
63
+ raise GreenhouseIo::Error.new(response.code)
64
+ end
65
+ end
66
+
67
+ def basic_auth
68
+ { :username => @api_token }
69
+ end
70
+
71
+ end
72
+ end
@@ -0,0 +1,22 @@
1
+ module GreenhouseIo
2
+ class Error < StandardError
3
+ attr_reader :msg, :code
4
+
5
+ def initialize(msg = nil, code = nil)
6
+ @msg = msg
7
+ @code = code
8
+ end
9
+
10
+ def inspect
11
+ if @code
12
+ "GreenhouseIo::Error: #{ @code } response from server"
13
+ else
14
+ "GreenhouseIo::Error: #{ @msg }"
15
+ end
16
+ end
17
+
18
+ def message
19
+ @msg
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,3 @@
1
+ module GreenhouseIo
2
+ VERSION = "1.0.0"
3
+ end
@@ -0,0 +1,44 @@
1
+ ---
2
+ http_interactions:
3
+ - request:
4
+ method: post
5
+ uri: https://123FakeToken:@api.greenhouse.io/v1/applications
6
+ body:
7
+ encoding: US-ASCII
8
+ string: id=721&first_name=Richard&last_name=Feynman&email=richard123%40test.ga.co
9
+ headers: {}
10
+ response:
11
+ status:
12
+ code: 200
13
+ message: OK
14
+ headers:
15
+ Cache-Control:
16
+ - max-age=0, private, must-revalidate
17
+ Content-Type:
18
+ - text/javascript; charset=utf-8
19
+ Date:
20
+ - Mon, 16 Sep 2013 18:25:13 GMT
21
+ Etag:
22
+ - ! '"60d45e24e36a2c0bbd1b09470dc4712c"'
23
+ Set-Cookie:
24
+ - _session_id=0b94e410bd34c2cefaae8257f0f4a6b4; path=/; HttpOnly
25
+ Status:
26
+ - 200 OK
27
+ Vary:
28
+ - Accept-Encoding
29
+ X-Request-Id:
30
+ - e4ffe754f2c13976f8b77fb36794d7a4
31
+ X-Runtime:
32
+ - '0.438182'
33
+ X-Ua-Compatible:
34
+ - IE=Edge,chrome=1
35
+ Transfer-Encoding:
36
+ - chunked
37
+ Connection:
38
+ - keep-alive
39
+ body:
40
+ encoding: US-ASCII
41
+ string: ! '{"success":"Candidate saved successfully"}'
42
+ http_version:
43
+ recorded_at: Mon, 16 Sep 2013 18:25:13 GMT
44
+ recorded_with: VCR 2.5.0
@@ -0,0 +1,45 @@
1
+ ---
2
+ http_interactions:
3
+ - request:
4
+ method: get
5
+ uri: https://api.greenhouse.io/v1/boards/generalassembly/embed/department?id=187
6
+ body:
7
+ encoding: US-ASCII
8
+ string: ''
9
+ headers: {}
10
+ response:
11
+ status:
12
+ code: 200
13
+ message: OK
14
+ headers:
15
+ Cache-Control:
16
+ - max-age=0, private, must-revalidate
17
+ Content-Type:
18
+ - text/html; charset=utf-8
19
+ Date:
20
+ - Mon, 16 Sep 2013 16:10:23 GMT
21
+ Etag:
22
+ - ! '"bb32e60fd177f151cf0e062eab98a28e"'
23
+ Status:
24
+ - 200 OK
25
+ Vary:
26
+ - Accept-Encoding
27
+ X-Request-Id:
28
+ - 3b821356ecf1bc276d417fc20cacacc7
29
+ X-Runtime:
30
+ - '0.032134'
31
+ X-Ua-Compatible:
32
+ - IE=Edge,chrome=1
33
+ Content-Length:
34
+ - '398'
35
+ Connection:
36
+ - keep-alive
37
+ body:
38
+ encoding: US-ASCII
39
+ string: ! '{"id":187,"name":"Engineering","jobs":[{"id":721,"title":"Application
40
+ developer","updated_at":"2013-09-12T21:01:50Z","location":{"name":"New York,
41
+ NY"},"absolute_url":"http://boards.greenhouse.io/generalassembly/jobs/721"},{"id":722,"title":"Finance
42
+ Analyst","updated_at":"2013-09-12T21:01:50Z","location":{"name":"New York"},"absolute_url":"http://boards.greenhouse.io/generalassembly/jobs/722"}]}'
43
+ http_version:
44
+ recorded_at: Mon, 16 Sep 2013 16:10:28 GMT
45
+ recorded_with: VCR 2.5.0
@@ -0,0 +1,45 @@
1
+ ---
2
+ http_interactions:
3
+ - request:
4
+ method: get
5
+ uri: https://api.greenhouse.io/v1/boards/generalassembly/embed/departments
6
+ body:
7
+ encoding: US-ASCII
8
+ string: ''
9
+ headers: {}
10
+ response:
11
+ status:
12
+ code: 200
13
+ message: OK
14
+ headers:
15
+ Cache-Control:
16
+ - max-age=0, private, must-revalidate
17
+ Content-Type:
18
+ - text/html; charset=utf-8
19
+ Date:
20
+ - Mon, 16 Sep 2013 16:08:54 GMT
21
+ Etag:
22
+ - ! '"f205d9810b3463764180a02bef17ee4b"'
23
+ Status:
24
+ - 200 OK
25
+ Vary:
26
+ - Accept-Encoding
27
+ X-Request-Id:
28
+ - 9f6f27869358dfe950413e981e5238ba
29
+ X-Runtime:
30
+ - '0.013228'
31
+ X-Ua-Compatible:
32
+ - IE=Edge,chrome=1
33
+ Content-Length:
34
+ - '495'
35
+ Connection:
36
+ - keep-alive
37
+ body:
38
+ encoding: US-ASCII
39
+ string: ! '{"departments":[{"id":187,"name":"Engineering","jobs":[]},{"id":188,"name":"Finance","jobs":[{"id":722,"title":"Finance
40
+ Analyst","updated_at":"2013-09-12T21:01:50Z","location":{"name":"New York"},"absolute_url":"http://boards.greenhouse.io/generalassembly/jobs/722"}]},{"id":0,"name":"No
41
+ Department","jobs":[{"id":721,"title":"Application developer","updated_at":"2013-09-12T21:01:50Z","location":{"name":"New
42
+ York, NY"},"absolute_url":"http://boards.greenhouse.io/generalassembly/jobs/721"}]}]}'
43
+ http_version:
44
+ recorded_at: Mon, 16 Sep 2013 16:08:59 GMT
45
+ recorded_with: VCR 2.5.0