clearconnect 0.0.3

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,6 @@
1
+ *.gem
2
+ .bundle
3
+ Gemfile.lock
4
+ pkg/*
5
+ doc/
6
+ .yardoc
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source "http://rubygems.org"
2
+
3
+ # Specify your gem's dependencies in clearconnect.gemspec
4
+ gemspec
@@ -0,0 +1,81 @@
1
+ Usage
2
+ -----
3
+
4
+ The ClearConnect gem all starts with `ClearConnect::Client`. Initialize
5
+ a client and then you can access the ClearConnect API methods via
6
+ `Client#get` and `Client#post`. Pass all parameters to these methods
7
+ as hashes, and make sure to include the action parameter to specify the
8
+ API method to invoke. When a call is completed successfully, a plain
9
+ Ruby structure (Array/Hash) with the retrieved information (or
10
+ confirmation information) is returned.
11
+
12
+ ```ruby
13
+ client = ClearConnect::Client.new('myname', 'mypassword', 'sitename')
14
+ client.get(action: 'getTemps', tempIdIn: 1000)
15
+ # => [{"tempId"=>"1000", "homeRegion"=>"1", ...}]
16
+ ```
17
+
18
+ Add/Update requests are no more difficult to execute than the get
19
+ request demonstrated above. The Ruby structure passed to the method is
20
+ converted directly to XML which is sent to the API endpoint. Take the
21
+ `insertWorkHistory` API method as an example. Since it requires a root
22
+ node of `workHistoryRecords` with multiple `workHistoryRecord`
23
+ sub-nodes, we would construct a call to this method as follows:
24
+
25
+ ```ruby
26
+ data = {
27
+ workHistoryRecords: [
28
+ { workHistoryRecord: {
29
+ tempId: 1000,
30
+ facility: 'Previous Employer 1',
31
+ startDate: '2013-04-09',
32
+ endDate: '2014-01-01'
33
+ }}
34
+ ]
35
+ }
36
+ client.post(action: 'insertWorkHistory', workHistoryRecords: data)
37
+ ```
38
+
39
+ Configure
40
+ ---------
41
+
42
+ The username, password, and sitename to use for authentication can be
43
+ configured in a few ways. When used in a larger project with
44
+ centralized configuration (e.g. a Rails application), the class method
45
+ `ClearConnect#configure` allows you to set the information that will be
46
+ used to authenticate the ClearConnect clients created. As an example,
47
+ you may create the file `config/initializers/clearconnect.rb` with the
48
+ content:
49
+
50
+ ```ruby
51
+ ClearConnect.configure do |config|
52
+ config.username = ENV['cc_username']
53
+ config.password = ENV['cc_password']
54
+ config.site_name = ENV['cc_sitename']
55
+ end
56
+ ```
57
+
58
+ In smaller applications or scripts, it may be easier to pass the info
59
+ via the constructor of the `ClearConnect::Client`, like so:
60
+
61
+ ```ruby
62
+ client = ClearConnect::Client.new('username', 'password', 'sitename')
63
+ ```
64
+
65
+ Notes
66
+ -----
67
+
68
+ The `#get` method of `ClearConnect::Client` uses the http client library
69
+ [HTTParty](https://github.com/jnunemaker/httparty). The `#post` method
70
+ uses the SOAP client [Savon](https://github.com/savonrb/savon). The
71
+ Savon client used internally is initialized when the first call is made
72
+ that requires it because the initialization can take some time, but
73
+ requests use the cached Savon client thereafter.
74
+
75
+ Issues
76
+ ------
77
+
78
+ Since the endpoint for the ClearConnect API uses SSL (i.e. is accessed
79
+ via an https url), you may encounter the error `OpenSSL certificate
80
+ verify failed`. The solution for this is relatively simple, and can be
81
+ found [here](http://railsapps.github.io/openssl-certificate-verify-failed.html).
@@ -0,0 +1 @@
1
+ require "bundler/gem_tasks"
@@ -0,0 +1,25 @@
1
+ # -*- encoding: utf-8 -*-
2
+ $:.push File.expand_path("../lib", __FILE__)
3
+ require "clearconnect/version"
4
+
5
+ Gem::Specification.new do |s|
6
+ s.name = 'clearconnect'
7
+ s.version = ClearConnect::VERSION
8
+ s.platform = Gem::Platform::RUBY
9
+ s.authors = ["Christopher Hunt"]
10
+ s.email = 'chrahunt@gmail.com'
11
+ s.homepage = ''
12
+ s.summary = 'ClearConnect API Interface for Ruby'
13
+ s.description = ''
14
+
15
+ s.rubyforge_project = "clearconnect"
16
+
17
+ s.files = `git ls-files`.split("\n")
18
+ s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
19
+ s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
20
+ s.require_paths = ["lib"]
21
+
22
+ s.add_runtime_dependency 'httparty', '~> 0.10'
23
+ s.add_runtime_dependency 'savon', '~> 2.1.0'
24
+ s.add_runtime_dependency 'xml-simple', '~> 1.1.2'
25
+ end
@@ -0,0 +1,18 @@
1
+ require 'httparty'
2
+ require 'savon'
3
+ require 'xmlsimple'
4
+ require 'json'
5
+
6
+ # the clearconnect gem handles authentication and message passing between a
7
+ # Ruby/Rails application and the ClearConnect API offered by API Healthcare
8
+ # as a supplement to their Contingent Staffing software.
9
+ module ClearConnect
10
+ class NoFunctionError < StandardError; end
11
+ class AuthenticateError < StandardError; end
12
+ end
13
+
14
+ require 'clearconnect/client'
15
+ require 'clearconnect/configuration'
16
+ require 'clearconnect/rest_client'
17
+ require 'clearconnect/soap_client'
18
+ require 'clearconnect/version'
@@ -0,0 +1,69 @@
1
+ module ClearConnect
2
+ ##
3
+ # This class is the interface to the ClearConnect API.
4
+ #
5
+ # Authentication can be managed via configuration (see the documentation for ClearConnect::Configuration)
6
+ # or by passing the username, password, and sitename for the Contingent Staffing user directly to the client
7
+ # on initialization.
8
+ #
9
+ # example:
10
+ # client = ClearConnect::Client.new('username', 'password', 'sitename')
11
+ # client.get(action: 'getOrders') # => array of orders
12
+ class Client
13
+ def initialize(username = ClearConnect.configuration.username,
14
+ password = ClearConnect.configuration.password,
15
+ site_name = ClearConnect.configuration.site_name,
16
+ session = (ClearConnect.configuration and ClearConnect.configuration.session))
17
+ # to ensure the endpoints are available
18
+ if !ClearConnect.configuration
19
+ ClearConnect.configure do |c|
20
+ c.username = username
21
+ c.password = password
22
+ c.site_name = site_name
23
+ c.session = session
24
+ end
25
+ end
26
+ @username = username
27
+ @password = password
28
+ @session = session
29
+ end
30
+
31
+ def soap_client
32
+ @soap_client ||= SoapClient.new(@username, @password)
33
+ @soap_client
34
+ end
35
+
36
+ def rest_client
37
+ @rest_client ||= RestClient.new(@username, @password)
38
+ @rest_client
39
+ end
40
+
41
+ # alias for ClearConnect::RestClient#get_request
42
+ def get(query)
43
+ rest_client.get_request(query)
44
+ end
45
+
46
+ # alias for ClearConnect::SoapClient#post_request
47
+ def post(query)
48
+ soap_client.post_request(query)
49
+ end
50
+
51
+ # retrieves and sets session key for making requests, may raise
52
+ # exception if there is an error.
53
+ def get_session_key
54
+ response = rest_client.get_no_session(
55
+ action: 'getSessionKey').parsed_response[0]
56
+
57
+ if response['success'] == "1"
58
+ @sessionKey = response['sessionKey']
59
+ rest_client.set_session_key @sessionKey
60
+ # TODO: Incorporate sessions into Savon client.
61
+ #@soap_client.set_session_key @sessionKey if @soap_client
62
+ elsif response['errorCode']
63
+ raise "Session key retrieval failed with code: #{response['errorCode']}."
64
+ else
65
+ raise "Session key retrieval failed for an unknown reason."
66
+ end
67
+ end
68
+ end
69
+ end
@@ -0,0 +1,64 @@
1
+ module ClearConnect
2
+ class Configuration
3
+ attr_accessor \
4
+ :username,
5
+ :password,
6
+ :site_name,
7
+ :session,
8
+ :format
9
+
10
+ def initialize
11
+ @username = nil
12
+ @password = nil
13
+ @site_name = nil
14
+ @format = :json
15
+ @session = false
16
+ @endpoints = nil
17
+ end
18
+
19
+ def site_name=(site_name)
20
+ @site_name = site_name
21
+ end
22
+
23
+ #--
24
+ # do endpoints need to be set at any point?
25
+ #++
26
+ def endpoints
27
+ @endpoints ||= {
28
+ clearconnect: "https://agencystaffing.apihealthcare.com/#{@site_name}/clearConnect/2_0/index.cfm",
29
+ wsdl: "https://agencymedia001.apihealthcare.com/#{@site_name}/wsdl/staffingWebService.wsdl"
30
+ }
31
+ end
32
+
33
+ #--
34
+ # I don't think this is necessary
35
+ #++
36
+ def endpoints=(options = {})
37
+ if options.nil?
38
+ @endpoints
39
+ end
40
+ @endpoints = options
41
+ end
42
+ end
43
+
44
+ class << self
45
+ attr_accessor :configuration
46
+ end
47
+
48
+ # Configure clearconnect someplace sensible,
49
+ # like config/initializers/clearconnect.rb
50
+ #
51
+ # @example
52
+ # ClearConnect.configure do |c|
53
+ # c.username = 'username'
54
+ # c.password = 'password'
55
+ # c.sitename = 'sitename'
56
+ # end
57
+
58
+ def self.configure
59
+ self.configuration ||= Configuration.new
60
+ if block_given?
61
+ yield configuration
62
+ end
63
+ end
64
+ end
@@ -0,0 +1,49 @@
1
+ class RestClient
2
+ include HTTParty
3
+
4
+ def initialize(username, password)
5
+ self.class.base_uri ClearConnect.configuration.endpoints[:clearconnect]
6
+ self.class.default_params :resultType => ClearConnect.configuration.format.to_s
7
+ self.class.format ClearConnect.configuration.format
8
+ @username = username
9
+ @password = password
10
+ @session = false
11
+ @sessionKey = nil
12
+ end
13
+
14
+ # Takes a query of the format { key: 'value', key2: 'value' } where the keys are symbols corresponding
15
+ # to the parameters passed to the ClearConnect REST API
16
+ def get_request(query)
17
+ if @session and @sessionKey.nil?
18
+ raise "Invalid session key. You must first acquire a session key by calling 'get_session_key' before executing requests."
19
+ elsif not @session
20
+ query = normalize_query(query.merge(:sessionKey => @sessionKey))
21
+ options = { :query => query }
22
+ self.class.get("", options)
23
+ else
24
+ get_no_session(query)
25
+ end
26
+ end
27
+
28
+ def get_no_session(query)
29
+ query = normalize_query(query.merge(:username => @username, :password => @password))
30
+ options = { :query => query }
31
+ self.class.get("", options)
32
+ end
33
+
34
+ def set_session_key(key)
35
+ puts "Setting session key: #{key}."
36
+ @session = true
37
+ @sessionKey = key
38
+ end
39
+
40
+ private
41
+ # Turns arguments that are arrays into comma-delimited strings
42
+ def normalize_query(query)
43
+ query.each_pair do |param, arg|
44
+ if arg.is_a? Array
45
+ query[param] = arg.join(',')
46
+ end
47
+ end
48
+ end
49
+ end
@@ -0,0 +1,71 @@
1
+ class SoapClient
2
+ def initialize(username, password, session)
3
+ wsdl = HTTParty.get(ClearConnect.configuration.endpoints[:wsdl], :format => 'xml').parsed_response
4
+ @client = Savon::Client.new(
5
+ wsdl: wsdl,
6
+ log_level: :info
7
+ )
8
+ @username = username
9
+ @password = password
10
+ @session = session
11
+ @default_params = {
12
+ :username => username,
13
+ :password => password,
14
+ :resultType => ClearConnect.configuration.format.to_s
15
+ }
16
+ end
17
+
18
+ # Encodes request, packages into required node, sends, decodes response
19
+ def generic_request(message)
20
+ request = "<requestXmlString>#{xml_encode(message)}</requestXmlString>"
21
+ response = @client.call(:tss_request, message: request)
22
+ # :tss_request_response => {:tss_request_return => [ugly value to be decoded]}
23
+ # response.body
24
+ JSON.parse(response.body[:tss_request_response][:tss_request_return])[0]
25
+ end
26
+
27
+ # Takes a query of format { :key => 'value' } where :key is the properly formatted parameter and 'value' is the string value
28
+ # Parameters can be nested like so: { :tempRecords => { :tempRecord => [ { :key1 = 'value1', :key2 => 'value2' }, { :key1 => 'value3' } ] } }
29
+ # will produce <tempRecords><tempRecord><key1>value1</key1><key2>value2</key2></tempRecord><tempRecord><key1>value3</key1></tempRecord></tempRecords>
30
+ def post_request(query)
31
+ params = @default_params.merge(query)
32
+ post_data = XmlSimple.xml_out(params, RootName: 'clearviewRequest', NoAttr: true)
33
+ generic_request(post_data)
34
+ end
35
+
36
+ def xml_encode(xml_string)
37
+ string = xml_string
38
+ characters = [
39
+ { find: '&', replacement: '&amp;' },
40
+ { find: '"', replacement: '&quot;' },
41
+ { find: '<', replacement: '&lt;' },
42
+ { find: '>', replacement: '&gt;' },
43
+ { find: "'", replacement: '&apos;' }
44
+ ]
45
+ characters.each do |set|
46
+ new_string = string.gsub(set[:find], set[:replacement])
47
+ if not new_string.nil?
48
+ string = new_string
49
+ end
50
+ end
51
+ return string
52
+ end
53
+
54
+ def xml_decode(xml_string)
55
+ string = xml_string
56
+ characters = [
57
+ { replacement: '&', find: '&amp;' },
58
+ { replacement: '"', find: '&quot;' },
59
+ { replacement: '<', find: '&lt;' },
60
+ { replacement: '>', find: '&gt;' },
61
+ { replacement: "'", find: '&apos;' }
62
+ ]
63
+ characters.each do |set|
64
+ new_string = string.gsub(set[:find], set[:replacement])
65
+ if not new_string.nil?
66
+ string = new_string
67
+ end
68
+ end
69
+ return string
70
+ end
71
+ end
@@ -0,0 +1,3 @@
1
+ module ClearConnect
2
+ VERSION = "0.0.3"
3
+ end
metadata ADDED
@@ -0,0 +1,104 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: clearconnect
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.3
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Christopher Hunt
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2015-05-27 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: httparty
16
+ requirement: !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ~>
20
+ - !ruby/object:Gem::Version
21
+ version: '0.10'
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ~>
28
+ - !ruby/object:Gem::Version
29
+ version: '0.10'
30
+ - !ruby/object:Gem::Dependency
31
+ name: savon
32
+ requirement: !ruby/object:Gem::Requirement
33
+ none: false
34
+ requirements:
35
+ - - ~>
36
+ - !ruby/object:Gem::Version
37
+ version: 2.1.0
38
+ type: :runtime
39
+ prerelease: false
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ~>
44
+ - !ruby/object:Gem::Version
45
+ version: 2.1.0
46
+ - !ruby/object:Gem::Dependency
47
+ name: xml-simple
48
+ requirement: !ruby/object:Gem::Requirement
49
+ none: false
50
+ requirements:
51
+ - - ~>
52
+ - !ruby/object:Gem::Version
53
+ version: 1.1.2
54
+ type: :runtime
55
+ prerelease: false
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ none: false
58
+ requirements:
59
+ - - ~>
60
+ - !ruby/object:Gem::Version
61
+ version: 1.1.2
62
+ description: ''
63
+ email: chrahunt@gmail.com
64
+ executables: []
65
+ extensions: []
66
+ extra_rdoc_files: []
67
+ files:
68
+ - .gitignore
69
+ - Gemfile
70
+ - README.md
71
+ - Rakefile
72
+ - clearconnect.gemspec
73
+ - lib/clearconnect.rb
74
+ - lib/clearconnect/client.rb
75
+ - lib/clearconnect/configuration.rb
76
+ - lib/clearconnect/rest_client.rb
77
+ - lib/clearconnect/soap_client.rb
78
+ - lib/clearconnect/version.rb
79
+ homepage: ''
80
+ licenses: []
81
+ post_install_message:
82
+ rdoc_options: []
83
+ require_paths:
84
+ - lib
85
+ required_ruby_version: !ruby/object:Gem::Requirement
86
+ none: false
87
+ requirements:
88
+ - - ! '>='
89
+ - !ruby/object:Gem::Version
90
+ version: '0'
91
+ required_rubygems_version: !ruby/object:Gem::Requirement
92
+ none: false
93
+ requirements:
94
+ - - ! '>='
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
97
+ requirements: []
98
+ rubyforge_project: clearconnect
99
+ rubygems_version: 1.8.28
100
+ signing_key:
101
+ specification_version: 3
102
+ summary: ClearConnect API Interface for Ruby
103
+ test_files: []
104
+ has_rdoc: