isaca 1.0.0 → 1.0.1

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 62f3b9deda4ee74b614e8cd5d91110bb4eb0da73
4
- data.tar.gz: a400dfad4b30039ac630c7318dce4b49aae298ac
3
+ metadata.gz: 268dab3df3c97c1c62f49e26c3e667429acb7017
4
+ data.tar.gz: 916311a0bc1f19b868bede5ea267f2310c9a412f
5
5
  SHA512:
6
- metadata.gz: f70a43588de692625dd4ffcb898eb52dcc3a3c9d45057903b44ff2467e1e1414e97428b2773403913688e795f8ce1c9cba038f640f77faa84d8c5f275d5e49eb
7
- data.tar.gz: 97e79e074276c450560219b636168878e063befbec908052f265327572586967b196d471abe33400889ea98328e9312be67bbc3e42ce31cce7b11d26bf9a5ace
6
+ metadata.gz: 4340024fce029cafe8593391db2be6eb65a8190f5d9de7a2e310dc55220dcc3c8c1873239629831ffb164d608640e51732d0f84c2a4bc6151dec4a997a218012
7
+ data.tar.gz: de6b0cde98d07991a7f8fce17706c04c1eafb48e161eead69f6449d408a8d77beab387ab39386fb493ec58fecee27e1eed3e36342b9dc879e70676a7e38fd0fc
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- isaca (0.2.0)
4
+ isaca (1.0.1)
5
5
  faraday (~> 0.14.0)
6
6
 
7
7
  GEM
@@ -0,0 +1,4 @@
1
+ module ISACA
2
+ class ConfigurationError < StandardError
3
+ end
4
+ end
data/lib/isaca/helpers.rb CHANGED
@@ -2,17 +2,37 @@ require 'date'
2
2
  require 'json'
3
3
 
4
4
  module ISACA
5
+ # A series of helper methods for parsing the way ISACA sends some data.
5
6
  module Helpers
7
+ # ISACA seems to use the default format to pass datetimes. This method exists so you don't have to remember
8
+ # the parse format.
9
+ #
10
+ # @param [String] string_time The time passed by ISACA.
11
+ # @param [String] format The format of the time.
12
+ #
13
+ # @return [DateTime]
6
14
  def self.strptime(string_time, format='%m/%d/%Y %I:%M:%S %p')
7
15
  (string_time.nil? || string_time.empty?) ? nil : DateTime.strptime(string_time, format)
8
16
  end
9
17
 
18
+ # ISACA passes booleans as a string representation, this method helps parse these representations.
19
+ #
20
+ # @param [String] string The string representation of a boolean. (e.g. "True", "false", "False"). If nil this method will return false.
21
+ #
22
+ # @returns [Boolean]
10
23
  def self.parse_boolean(string)
11
- string == 'True' ? true : false
24
+ string.downcase == 'true' ? true : false
12
25
  end
13
26
 
27
+ # ISACA has an abbreviated member type and this method will break down those abbreviations into one of the three primary types: member, non_member or student.
28
+ #
29
+ # @param [String] type The abbreviated member type.
30
+ #
31
+ # @return [Symbol] :member, :non_member or :student.
14
32
  def self.normalize_member_type(type)
15
- case type
33
+ return :non_member if type.nil?
34
+
35
+ case type.upcase
16
36
  when 'COMP' then :member
17
37
  when 'LIFE' then :member
18
38
  when 'STUM' then :student
@@ -1,18 +1,21 @@
1
1
  module ISACA
2
2
  module Model
3
- # Class that is used as an object representation of the response from {ISACA::Request::AuthenticateUser}
3
+ # Class that is used as an object representation of the response from {ISACA::Request::AuthenticateUser}.
4
4
  class AuthenticateUser
5
- # The ISACA error -- ISACA documentation on this is currently limited.
6
5
  attr_reader :error
7
- # The ISACA error code -- ISACA documentation on this is currently limited.
6
+ # @!attribute error
7
+ # @return [Array] The ISACA error -- ISACA documentation on this is currently limited.
8
8
  attr_reader :error_code
9
- # Whether or not the session is valid
9
+ # @!attribute error_code
10
+ # @return [String] The ISACA error code -- ISACA documentation on this is currently limited.
10
11
  attr_reader :is_valid
11
- # Session value or error message
12
+ # @!attribute is_valid
13
+ # @return [Boolean] Whether or not the session is valid.
12
14
  attr_reader :value
15
+ # @!attribute value
16
+ # @return [String] Session value or error message.
13
17
 
14
-
15
- # @param [Hash] params Parameters to create the object with
18
+ # @param [Hash] params Parameters to create the object with.
16
19
  # @option params [String] :Error Required
17
20
  # @option params [String] :ErrorCode Required
18
21
  # @option params [String] :IsValid Required
@@ -1,12 +1,23 @@
1
1
  module ISACA
2
2
  module Model
3
+ # Class that is used as an object representation of the response from {ISACA::Request::Countries} and {ISACA::Request::ExplicitCountries}.
3
4
  class Countries
4
5
  attr_reader :countries
6
+ # @!attribute countries
7
+ # @return [Array] A list of countries that ISACA recognizes.
5
8
 
9
+ # @param [Array<Hash>] countries Countries to create the object with.
10
+ # @option countries [String] :CODE Required
11
+ # @option countries [String] :DESCRIPTION Required
6
12
  def initialize(countries)
7
13
  @countries = countries.map { |c| Country.new(c[:CODE], c[:DESCRIPTION]) }
8
14
  end
9
15
 
16
+ # Method used to see if the a country exists. Searches across both country code and country description. Case insensitive.
17
+ #
18
+ # @param [String] value The value to be searched.
19
+ #
20
+ # @return [Boolean] Whether or not the country is included.
10
21
  def includes_country?(value)
11
22
  @countries.each { |country| return true if country_matches?(country, value) }
12
23
  false
@@ -14,12 +25,20 @@ module ISACA
14
25
 
15
26
  private
16
27
 
28
+ # Method used to see if country matches value. Checks across country code and country description. Case insensitive.
29
+ # Exists for the ease of testing.
30
+ #
31
+ # @param [Country] country The country to be searched.
32
+ # @param [String] value The value to search by.
33
+ #
34
+ # @return [Boolean] Whether or not the given country matches the value.
17
35
  def country_matches?(country, value)
18
36
  value.downcase!
19
37
  country.code.downcase == value || country.description.downcase == value
20
38
  end
21
39
  end
22
40
 
41
+ # Struct that represents an ISACA country data object
23
42
  Country = Struct.new(:code, :description)
24
43
  end
25
44
  end
@@ -1,23 +1,43 @@
1
1
  module ISACA
2
2
  module Model
3
+ # Class is used as an object representation of the response from {ISACA::Request::GetUserByID}.
3
4
  class GetUserByID
4
- attr_accessor :active_member
5
- attr_accessor :expiration_date
6
- attr_accessor :member_type
7
- attr_accessor :imis_id
5
+ attr_reader :active_member
6
+ # @!attribute active_member
7
+ # @return [Boolean] Whether or not the membership is active.
8
8
 
9
- def initialize(hash)
10
- @active_member = ISACA::Helpers.parse_boolean(hash['ActiveMember'])
11
- @expiration_date = ISACA::Helpers.strptime(hash['ExpirationDate'])
12
- @member_type = ISACA::Helpers.normalize_member_type(hash['MemberType'])
9
+ attr_reader :expiration_date
10
+ # @!attribute expiration_date
11
+ # @return [DateTime|nil] The date the membership expires. Never expires if nil.
13
12
 
14
- if hash['iMISID'] == ""
15
- @imis_id = nil
13
+ attr_reader :member_type
14
+ # @!attribute member_type
15
+ # @return [Symbol] The membership's classification.
16
+
17
+ attr_reader :imis_id
18
+ # @!attribute imis_id
19
+ # @return [String] The membership's unique ID
20
+
21
+ # @param [Hash] params The parameters used to create the object
22
+ # @option params [String] :ActiveMember
23
+ # @option params [String] :ExpirationDate
24
+ # @option params [String] :MemberType
25
+ # @option params [String] :iMISID
26
+ def initialize(params)
27
+ @active_member = ISACA::Helpers.parse_boolean(params[:ActiveMember])
28
+ @expiration_date = ISACA::Helpers.strptime(params[:ExpirationDate])
29
+ @member_type = ISACA::Helpers.normalize_member_type(params[:MemberType])
30
+
31
+ if params[:iMISID].to_s.strip.empty?
32
+ raise ServiceError.new('User with given IMIS ID not found')
16
33
  else
17
- @imis_id = hash['iMISID']
34
+ @imis_id = params[:iMISID]
18
35
  end
19
36
  end
20
37
 
38
+ # A method that identifies whether or not the membership is active
39
+ #
40
+ # @return [Boolean] Whether or not the membership is active.
21
41
  def active_member?
22
42
  active_member
23
43
  end
@@ -1,39 +1,81 @@
1
1
  # An object representation of the GetUserDetailsByToken endpoint
2
2
  module ISACA
3
3
  module Model
4
+ # Class is used as an object representation of the response from {ISACA::Request::GetUserDetailsByToken}.
4
5
  class GetUserDetailsByToken
5
6
  attr_reader :imis_id
7
+ # @!attribute imis_id
8
+ # @return [String] The IMIS ID of the requested user
9
+
6
10
  attr_reader :enterprise_id
11
+ # @!attribute enterprise_id
12
+ # @return [String] The Enterprise ID of the requested user
13
+
7
14
  attr_reader :first_name
15
+ # @!attribute first_name
16
+ # @return [String] The first name of the requested user
17
+
8
18
  attr_reader :last_name
19
+ # @!attribute last_name
20
+ # @return [String] The last name of the requested user
21
+
9
22
  attr_reader :email
23
+ # @!attribute email
24
+ # @return [String] The email of the requested user
25
+
10
26
  attr_reader :username
27
+ # @!attribute username
28
+ # @return [String] The username of the requested user
29
+
11
30
  attr_reader :country
31
+ # @!attribute country
32
+ # @return [String] The country of the requested user
33
+
12
34
  attr_reader :privacy
35
+ # @!attribute privacy
36
+ # @return [Boolean|nil] The privacy acceptance status of the requested user
37
+
13
38
  attr_reader :marketing
39
+ # @!attribute marketing
40
+ # @return [Boolean|nil] The marketing acceptance status of the requested user
14
41
 
15
- def initialize(hash)
16
- raise AttributeError.new(:ID, self.class.name, hash) unless hash.has_key?(:ID) && hash[:ID]
42
+ # @param [Hash] params The parameters used to create the object
43
+ # @option params [String] :ID Required
44
+ # @option params [String] :Ent_ID
45
+ # @option params [String] :First_Name
46
+ # @option params [String] :Last_Name
47
+ # @option params [String] :Email
48
+ # @option params [String] :UserName
49
+ # @option params [String] :Country
50
+ # @option params [String] :PRIVACY
51
+ # @option params [String] :MARKETING
52
+ #
53
+ # @raise [ISACA::ServiceError] Raises error if IMIS ID is not present.
54
+ def initialize(params)
55
+ if params[:ID].to_s.strip.empty?
56
+ raise ServiceError.new('User with given IMIS ID not found')
57
+ else
58
+ @imis_id = params[:ID]
59
+ end
17
60
 
18
- @imis_id = hash[:ID]
19
- @enterprise_id = hash[:Ent_ID]
20
- @first_name = hash[:First_Name]
21
- @last_name = hash[:Last_Name]
22
- @email = hash[:Email]
23
- @username = hash[:UserName]
24
- @country = hash[:Country]
61
+ @enterprise_id = params[:Ent_ID]
62
+ @first_name = params[:First_Name]
63
+ @last_name = params[:Last_Name]
64
+ @email = params[:Email]
65
+ @username = params[:UserName]
66
+ @country = params[:Country]
25
67
 
26
- if hash[:PRIVACY] == '1'
68
+ if params[:PRIVACY] == '1'
27
69
  @privacy = true
28
- elsif hash[:PRIVACY] == '0'
70
+ elsif params[:PRIVACY] == '0'
29
71
  @privacy = false
30
72
  else
31
73
  @privacy = nil
32
74
  end
33
75
 
34
- if hash[:MARKETING] == '1'
76
+ if params[:MARKETING] == '1'
35
77
  @marketing = true
36
- elsif hash[:MARKETING] == '0'
78
+ elsif params[:MARKETING] == '0'
37
79
  @marketing = false
38
80
  else
39
81
  @marketing = nil
@@ -1,11 +1,12 @@
1
1
  module ISACA
2
2
  module Request
3
+ # Class used to create user sessions.
3
4
  class AuthenticateUser
4
5
  # Method used to generate a session token.
5
6
  #
6
- # @raise [ISACA::SessionError] Raised if the returned session is invalid
7
+ # @raise [ISACA::SessionError] Raised if the returned session is invalid.
7
8
  #
8
- # @return [ISACA::Model::AuthenticateUser] Returns an object representation of the response
9
+ # @return [ISACA::Model::AuthenticateUser] An object representation of the response.
9
10
  def self.get(username, password)
10
11
  response = self.send_request(username, password)
11
12
 
@@ -20,6 +21,8 @@ module ISACA
20
21
  #
21
22
  # @param username [String]
22
23
  # @param password [String]
24
+ #
25
+ # @return [Faraday::Response]
23
26
  def self.send_request(username, password)
24
27
  ISACA::Request.get do |request|
25
28
  request.path = request.path + '/AuthenticateUser'
@@ -1,7 +1,10 @@
1
1
  module ISACA
2
2
  module Request
3
+ # Class used to fetch countries recognized by ISACA.
3
4
  module Countries
4
- # Method used to fetch all countries
5
+ # Method used to fetch all countries.
6
+ #
7
+ # @return [ISACA::Model::Countries] An object representation of the response.
5
8
  def self.get
6
9
  response = self.send_request
7
10
  ISACA::Model::Countries.new(JSON.parse(response.body, symbolize_names: true))
@@ -10,6 +13,8 @@ module ISACA
10
13
  private
11
14
 
12
15
  # Method used to send the request -- exists for easy testing purposes
16
+ #
17
+ # @return [Faraday::Response]
13
18
  def self.send_request
14
19
  ISACA::Request.get do |request|
15
20
  uri = URI(ISACA.configuration.url)
@@ -1,7 +1,11 @@
1
1
  module ISACA
2
2
  module Request
3
+ # Class used to fetch the explicit countries recognized by ISACA. Explicit countries are countries that require
4
+ # consent for marketing.
3
5
  module ExplicitCountries
4
- # Method used to fetch all of the ExplicitCountries
6
+ # Method used to fetch all of the ExplicitCountries.
7
+ #
8
+ # @return [ISACA::Model::Countries] An object representation of the response.
5
9
  def self.get
6
10
  response = self.send_request
7
11
  ISACA::Model::Countries.new(JSON.parse(response.body, symbolize_names: true))
@@ -9,7 +13,9 @@ module ISACA
9
13
 
10
14
  private
11
15
 
12
- # Method used to send the request -- exists for easy testing purposes
16
+ # Method used to send the request -- exists for easy testing purposes.
17
+ #
18
+ # @return [Faraday::Response]
13
19
  def self.send_request
14
20
  ISACA::Request.get do |request|
15
21
  uri = URI(ISACA.configuration.url)
@@ -1,16 +1,29 @@
1
1
  module ISACA
2
2
  module Request
3
+ # Class used to fetch an ISACA user by their IMIS ID.
3
4
  module GetUserByID
5
+ # Method fetches ISACA user by IMIS ID.
6
+ #
7
+ # @param [String] id The IMIS ID of the requested user.
8
+ #
9
+ # @return [ISACA::Model::GetUserByID] An object representation of the response.
4
10
  def self.get(id)
5
- response = ISACA::Request.get do |request|
11
+ response = self.send_request(id)
12
+ ISACA::Model::GetUserByID.new(JSON.parse(response.body, symbolize_names: true))
13
+ end
14
+
15
+ private
16
+
17
+ # Method used to send the request -- exists to ease testing.
18
+ #
19
+ # @param [String] id The IMIS ID of the requested user.
20
+ #
21
+ # @return [Faraday::Response]
22
+ def self.send_request(id)
23
+ ISACA::Request.get do |request|
6
24
  request.path = request.path + '/GetUserByID'
7
25
  request.params['ID'] = id
8
26
  end
9
-
10
- data = JSON.parse(response.body)
11
- ISACA.logger.debug(data) if ISACA.configuration.debug
12
-
13
- response.status == 200 ? ISACA::Model::GetUserByID.new(data) : nil
14
27
  end
15
28
  end
16
29
  end
@@ -3,9 +3,11 @@ module ISACA
3
3
  class GetUserDetailsByToken
4
4
  # Method used to get user information by token
5
5
  #
6
+ # @param token [String] The user's session token
7
+ #
6
8
  # @raise [ISACA::AttributeError] Raised if the returned IMIS ID is nil or the ID key is missing
7
9
  #
8
- # @return [ISACA::Model::GetUserDetailsByToken] Returns an object representation of the response
10
+ # @return [ISACA::Model::GetUserDetailsByToken] An object representation of the response
9
11
  def self.get(token)
10
12
  response = self.send_request(token)
11
13
 
@@ -16,7 +18,9 @@ module ISACA
16
18
  private
17
19
  # Method used to send the request -- exists for easy stubbing during tests
18
20
  #
19
- # @param token [String]
21
+ # @param token [String] The user's session token
22
+ #
23
+ # @return [Faraday::Response]
20
24
  def self.send_request(token)
21
25
  ISACA::Request.get do |request|
22
26
  request.path = request.path + '/GetUserDetailsByToken'
data/lib/isaca/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module ISACA
2
- VERSION = "1.0.0"
2
+ VERSION = "1.0.1"
3
3
  end
data/lib/isaca.rb CHANGED
@@ -22,6 +22,7 @@ require 'isaca/connection_error'
22
22
  require 'isaca/partner_key_error'
23
23
  require 'isaca/session_error'
24
24
  require 'isaca/attribute_error'
25
+ require 'isaca/configuration_error'
25
26
 
26
27
  # Everything else where order load order does not matter
27
28
  require 'isaca/version'
@@ -29,15 +30,34 @@ require 'fileutils'
29
30
  require 'openssl'
30
31
  require 'logger'
31
32
 
33
+ # Library intended to help ease the implementation of ISACA web services.
32
34
  module ISACA
33
35
  class << self
34
36
  attr_accessor :configuration
37
+ # @!attribute configuration
38
+ # @return [ISACA::Configuration] Object used to configure the library.
39
+
35
40
  attr_accessor :logger
41
+ # @!attribute logger
42
+ # @return [Logger]
36
43
 
44
+ # Method used to fetch the configuration object.
45
+ #
46
+ # @return [ISACA::Configuration]
37
47
  def configuration
38
48
  @configuration ||= Configuration.new
39
49
  end
40
50
 
51
+ # Method used to reset the ISACA configuration. Primarily used for testing.
52
+ #
53
+ # @return [ISACA::Configuration]
54
+ def reset
55
+ @configuration = Configuration.new
56
+ end
57
+
58
+ # Method used to get the logger.
59
+ #
60
+ # @return [Logger]
41
61
  def logger
42
62
  path = 'log/isaca.log'
43
63
  dir = File.dirname(path)
@@ -47,25 +67,59 @@ module ISACA
47
67
  end
48
68
  end
49
69
 
70
+ # Configuration block used to configure the library.
71
+ #
72
+ # @yield [ISACA::Configuration]
73
+ #
74
+ # @example An example configuration
75
+ # ISACA.configure do |config|
76
+ # config.url = 'https://partnerapi.isaca.org:8443/ISACAServices/Service1.svc'
77
+ # config.secret_pass = '1234567890ABCDEFGHI'
78
+ # config.user_agent = 'my_application'
79
+ # config.verify_ssl = false
80
+ # end
50
81
  def self.configure
51
82
  self.configuration ||= Configuration.new
52
83
  yield(configuration)
53
84
  self.configuration
54
85
  end
55
86
 
87
+ # Class used to store library configurations.
56
88
  class Configuration
57
89
  attr_accessor :url
90
+ # @!attribute url
91
+ # @return [String] The root url for the ISACA web service.
92
+
58
93
  attr_accessor :secret_pass
94
+ # @!attribute secret_pass
95
+ # @return [String] Your api key.
96
+
59
97
  attr_accessor :user_agent
98
+ # @!attribute user_agent
99
+ # @return [String] The user agent that will be passed in the request headers.
100
+
60
101
  attr_accessor :verify_ssl
102
+ # @!attribute verify_ssl
103
+ # @return [Boolean] Whether or not SSL certificates should be verified. Recommend true for production.
104
+
61
105
  attr_accessor :logger
106
+ # @!attribute logger
107
+ # @return [Logger] The logger used for logging.
108
+
62
109
  attr_accessor :debug
110
+ # @!attribute debug
111
+ # @return [Boolean] Whether or not logging should be used. Recommend false for production to ease GDPR concerns.
63
112
 
64
113
  def initialize
65
114
  @verify_ssl = true
66
115
  @debug = false
67
116
  end
68
117
 
118
+ # Returns the secret_pass attribute value
119
+ #
120
+ # @raise [ISACA::ConfigurationError] Raises if secret pass was not configured.
121
+ #
122
+ # @return [String]
69
123
  def secret_pass
70
124
  if @secret_pass
71
125
  @secret_pass
@@ -77,6 +131,11 @@ module ISACA
77
131
  end
78
132
  end
79
133
 
134
+ # Returns the url attribute value
135
+ #
136
+ # @raise [ISACA::ConfigurationError] Raises if url was not configured.
137
+ #
138
+ # @return [String]
80
139
  def url
81
140
  if @url
82
141
  @url
@@ -87,18 +146,21 @@ module ISACA
87
146
  raise ConfigurationError.new(msg)
88
147
  end
89
148
  end
90
- end
91
149
 
92
- def user_agent
93
- if @user_agent
94
- @user_agent
95
- else
96
- msg = 'Missing User-Agent configuration. The ISACA Partners API requires a predefined User-Agent.'
97
- msg << ' Example: ISACA.configure {|config| config.user_agent = "MyApplication"}'
150
+ # Returns the user_agent attribute value
151
+ #
152
+ # @raise [ISACA::ConfigurationError] Raises if user agent was not configured.
153
+ #
154
+ # @return [String]
155
+ def user_agent
156
+ if @user_agent
157
+ @user_agent
158
+ else
159
+ msg = 'Missing User-Agent configuration. The ISACA Partners API requires a predefined User-Agent.'
160
+ msg << ' Example: ISACA.configure {|config| config.user_agent = "MyApplication"}'
98
161
 
99
- raise ConfigurationError.new(msg)
162
+ raise ConfigurationError.new(msg)
163
+ end
100
164
  end
101
165
  end
102
-
103
- class ConfigurationError < StandardError; end
104
166
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: isaca
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0
4
+ version: 1.0.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Matt Orahood
@@ -126,6 +126,7 @@ files:
126
126
  - isaca.gemspec
127
127
  - lib/isaca.rb
128
128
  - lib/isaca/attribute_error.rb
129
+ - lib/isaca/configuration_error.rb
129
130
  - lib/isaca/connection_error.rb
130
131
  - lib/isaca/helpers.rb
131
132
  - lib/isaca/models/authenticate_user.rb