reach-ruby 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.dockerignore +1 -0
- data/.gitignore +18 -0
- data/.rubocop.yml +58 -0
- data/.rubocop_todo.yml +193 -0
- data/AUTHORS.md +52 -0
- data/CHANGES.md +3 -0
- data/CODE_OF_CONDUCT.md +73 -0
- data/CONTRIBUTING.md +163 -0
- data/Dockerfile +9 -0
- data/Gemfile +3 -0
- data/ISSUE_TEMPLATE.md +30 -0
- data/LICENSE +21 -0
- data/Makefile +34 -0
- data/PULL_REQUEST_TEMPLATE.md +31 -0
- data/README.md +237 -0
- data/Rakefile +10 -0
- data/UPGRADE.md +5 -0
- data/VERSIONS.md +35 -0
- data/advanced-examples/custom-http-client.md +166 -0
- data/examples/examples.rb +23 -0
- data/githooks/pre-commit +1 -0
- data/lib/rack/reach_webhook_authentication.rb +72 -0
- data/lib/reach-ruby/framework/reach_response.rb +19 -0
- data/lib/reach-ruby/framework/request.rb +41 -0
- data/lib/reach-ruby/framework/response.rb +18 -0
- data/lib/reach-ruby/framework/rest/domain.rb +39 -0
- data/lib/reach-ruby/framework/rest/error.rb +51 -0
- data/lib/reach-ruby/framework/rest/helper.rb +11 -0
- data/lib/reach-ruby/framework/rest/page.rb +144 -0
- data/lib/reach-ruby/framework/rest/resource.rb +23 -0
- data/lib/reach-ruby/framework/rest/version.rb +240 -0
- data/lib/reach-ruby/framework/serialize.rb +81 -0
- data/lib/reach-ruby/framework/values.rb +9 -0
- data/lib/reach-ruby/http/http_client.rb +82 -0
- data/lib/reach-ruby/http.rb +5 -0
- data/lib/reach-ruby/rest/api/authentix/.openapi-generator/FILES +10 -0
- data/lib/reach-ruby/rest/api/authentix/.openapi-generator/VERSION +1 -0
- data/lib/reach-ruby/rest/api/authentix/.openapi-generator-ignore +23 -0
- data/lib/reach-ruby/rest/api/authentix/authentication_trial_item.rb +418 -0
- data/lib/reach-ruby/rest/api/authentix/authentication_trial_stat_item.rb +279 -0
- data/lib/reach-ruby/rest/api/authentix/configuration_item/authentication_control_item.rb +214 -0
- data/lib/reach-ruby/rest/api/authentix/configuration_item/authentication_item.rb +449 -0
- data/lib/reach-ruby/rest/api/authentix/configuration_item.rb +583 -0
- data/lib/reach-ruby/rest/api/authentix.rb +72 -0
- data/lib/reach-ruby/rest/api/messaging/.openapi-generator/FILES +2 -0
- data/lib/reach-ruby/rest/api/messaging/.openapi-generator/VERSION +1 -0
- data/lib/reach-ruby/rest/api/messaging/.openapi-generator-ignore +23 -0
- data/lib/reach-ruby/rest/api/messaging/messaging_item.rb +582 -0
- data/lib/reach-ruby/rest/api/messaging.rb +51 -0
- data/lib/reach-ruby/rest/api.rb +50 -0
- data/lib/reach-ruby/rest/client.rb +130 -0
- data/lib/reach-ruby/rest.rb +13 -0
- data/lib/reach-ruby/security/request_validator.rb +149 -0
- data/lib/reach-ruby/util/configuration.rb +25 -0
- data/lib/reach-ruby/version.rb +3 -0
- data/lib/reach-ruby.rb +44 -0
- data/reach-ruby.gemspec +38 -0
- data/sonar-project.properties +13 -0
- metadata +267 -0
@@ -0,0 +1,50 @@
|
|
1
|
+
###
|
2
|
+
# This code was generated by
|
3
|
+
# ___ ___ _ ___ _ _ _____ _ _ _ ___ ___ _ ___ ___ ___ _ ___ ___ ___ _ _ ___ ___ _ _____ ___ ___
|
4
|
+
# | _ \ __| /_\ / __| || |__|_ _/_\ | | | |/ | \ / / | /_\ | _ ) __|___ / _ \ /_\ |_ _|__ / __| __| \| | __| _ \ /_\_ _/ _ \| _ \
|
5
|
+
# | / _| / _ \ (__| __ |___|| |/ _ \| |__| ' < \ V /| |__ / _ \| _ \__ \___| (_) / _ \ | |___| (_ | _|| .` | _|| / / _ \| || (_) | /
|
6
|
+
# |_|_\___/_/ \_\___|_||_| |_/_/ \_\____|_|\_\ |_| |____/_/ \_\___/___/ \___/_/ \_\___| \___|___|_|\_|___|_|_\/_/ \_\_| \___/|_|_\
|
7
|
+
#
|
8
|
+
# NOTE: This class is auto generated by OpenAPI Generator.
|
9
|
+
# https://openapi-generator.tech
|
10
|
+
# Do not edit the class manually.
|
11
|
+
#
|
12
|
+
# frozen_string_literal: true
|
13
|
+
|
14
|
+
module Reach
|
15
|
+
module REST
|
16
|
+
class Api < Domain
|
17
|
+
##
|
18
|
+
# Initialize the Api Domain
|
19
|
+
def initialize(reach)
|
20
|
+
super
|
21
|
+
|
22
|
+
@base_url = 'https://api.reach.talkylabs.com'
|
23
|
+
@host = 'api.reach.talkylabs.com'
|
24
|
+
@port = 443
|
25
|
+
|
26
|
+
# Versions
|
27
|
+
@messaging = nil
|
28
|
+
@authentix = nil
|
29
|
+
end
|
30
|
+
|
31
|
+
##
|
32
|
+
# Version Messaging
|
33
|
+
def messaging
|
34
|
+
@messaging ||= Messaging.new self
|
35
|
+
end
|
36
|
+
|
37
|
+
##
|
38
|
+
# Version Authentix
|
39
|
+
def authentix
|
40
|
+
@authentix ||= Authentix.new self
|
41
|
+
end
|
42
|
+
|
43
|
+
##
|
44
|
+
# Provide a user friendly representation
|
45
|
+
def to_s
|
46
|
+
'#<Reach::REST::Api>'
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
@@ -0,0 +1,130 @@
|
|
1
|
+
###
|
2
|
+
# This code was generated by
|
3
|
+
# ___ ___ _ ___ _ _ _____ _ _ _ ___ ___ _ ___ ___ ___ _ ___ ___ ___ _ _ ___ ___ _ _____ ___ ___
|
4
|
+
# | _ \ __| /_\ / __| || |__|_ _/_\ | | | |/ | \ / / | /_\ | _ ) __|___ / _ \ /_\ |_ _|__ / __| __| \| | __| _ \ /_\_ _/ _ \| _ \
|
5
|
+
# | / _| / _ \ (__| __ |___|| |/ _ \| |__| ' < \ V /| |__ / _ \| _ \__ \___| (_) / _ \ | |___| (_ | _|| .` | _|| / / _ \| || (_) | /
|
6
|
+
# |_|_\___/_/ \_\___|_||_| |_/_/ \_\____|_|\_\ |_| |____/_/ \_\___/___/ \___/_/ \_\___| \___|___|_|\_|___|_|_\/_/ \_\_| \___/|_|_\
|
7
|
+
#
|
8
|
+
# NOTE: This class is auto generated by OpenAPI Generator.
|
9
|
+
# https://openapi-generator.tech
|
10
|
+
# Do not edit the class manually.
|
11
|
+
#
|
12
|
+
# frozen_string_literal: true
|
13
|
+
|
14
|
+
module Reach
|
15
|
+
module REST
|
16
|
+
##
|
17
|
+
# A client for accessing the Reach API.
|
18
|
+
class Client
|
19
|
+
|
20
|
+
attr_accessor :http_client, :username, :password, :auth_token, :logger, :user_agent_extensions
|
21
|
+
|
22
|
+
##
|
23
|
+
# Initializes the Reach Client
|
24
|
+
def initialize(username=nil, password=nil, http_client=nil, logger=nil, user_agent_extensions=nil)
|
25
|
+
@username = username || Reach.username
|
26
|
+
@password = password || Reach.auth_token
|
27
|
+
@auth_token = @password
|
28
|
+
@auth = [@username, @password]
|
29
|
+
@http_client = http_client || Reach.http_client || Reach::HTTP::Client.new
|
30
|
+
@logger = logger || Reach.logger
|
31
|
+
@user_agent_extensions = user_agent_extensions || []
|
32
|
+
|
33
|
+
# Domains
|
34
|
+
@api = nil
|
35
|
+
end
|
36
|
+
|
37
|
+
##
|
38
|
+
# Makes a request to the Reach API using the configured http client
|
39
|
+
# Authentication information is automatically added if none is provided
|
40
|
+
def request(host, port, method, uri, params={}, data={}, headers={}, auth=nil, timeout=nil)
|
41
|
+
auth ||= @auth
|
42
|
+
|
43
|
+
ruby_config = RbConfig::CONFIG
|
44
|
+
headers['User-Agent'] = "reach-ruby/#{Reach::VERSION} (#{ruby_config["host_os"]} #{ruby_config["host_cpu"]}) Ruby/#{RUBY_VERSION}"
|
45
|
+
headers['Accept-Charset'] = 'utf-8'
|
46
|
+
|
47
|
+
user_agent_extensions.each { |extension| headers['User-Agent'] += " #{extension}" }
|
48
|
+
|
49
|
+
if method == 'POST' && !headers['Content-Type']
|
50
|
+
headers['Content-Type'] = 'application/x-www-form-urlencoded'
|
51
|
+
end
|
52
|
+
|
53
|
+
unless headers['Accept']
|
54
|
+
headers['Accept'] = 'application/json'
|
55
|
+
end
|
56
|
+
|
57
|
+
uri = build_uri(uri)
|
58
|
+
|
59
|
+
if @logger
|
60
|
+
@logger.debug("--BEGIN REACH API Request--")
|
61
|
+
@logger.debug("Request Method: <#{method}>")
|
62
|
+
|
63
|
+
headers.each do |key, value|
|
64
|
+
unless key.downcase == 'authorization' || key.downcase == 'apikey' || key.downcase == 'apiuser'
|
65
|
+
@logger.debug("#{key}:#{value}")
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
url = URI(uri)
|
70
|
+
@logger.debug("Host:#{url.host}")
|
71
|
+
@logger.debug("Path:#{url.path}")
|
72
|
+
@logger.debug("Query:#{url.query}")
|
73
|
+
@logger.debug("Request Params:#{params}")
|
74
|
+
end
|
75
|
+
|
76
|
+
response = @http_client.request(
|
77
|
+
host,
|
78
|
+
port,
|
79
|
+
method,
|
80
|
+
uri,
|
81
|
+
params,
|
82
|
+
data,
|
83
|
+
headers,
|
84
|
+
auth,
|
85
|
+
timeout
|
86
|
+
)
|
87
|
+
|
88
|
+
if @logger
|
89
|
+
@logger.debug("Response Status Code:#{response.status_code}")
|
90
|
+
@logger.debug("Response Headers:#{response.headers}")
|
91
|
+
@logger.debug("--END REACH API REQUEST--")
|
92
|
+
end
|
93
|
+
|
94
|
+
response
|
95
|
+
end
|
96
|
+
|
97
|
+
##
|
98
|
+
# Build the final request uri
|
99
|
+
def build_uri(uri)
|
100
|
+
parsed_url = URI(uri)
|
101
|
+
parsed_url.to_s
|
102
|
+
end
|
103
|
+
|
104
|
+
##
|
105
|
+
# Access the Api Reach Domain
|
106
|
+
def api
|
107
|
+
@api ||= Api.new self
|
108
|
+
end
|
109
|
+
|
110
|
+
##
|
111
|
+
# Acess the Messaging api version
|
112
|
+
def messaging
|
113
|
+
self.api.messaging
|
114
|
+
end
|
115
|
+
|
116
|
+
##
|
117
|
+
# Acess the Authentix api version
|
118
|
+
def authentix
|
119
|
+
self.api.authentix
|
120
|
+
end
|
121
|
+
|
122
|
+
##
|
123
|
+
# Provide a user friendly representation
|
124
|
+
def to_s
|
125
|
+
"#<Reach::REST::Client #{@username}>"
|
126
|
+
end
|
127
|
+
end
|
128
|
+
|
129
|
+
end
|
130
|
+
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
Dir[File.join(__dir__, 'framework/rest/*.rb')].sort.each do |file|
|
4
|
+
require file
|
5
|
+
end
|
6
|
+
|
7
|
+
Dir[File.join(__dir__, 'rest/*.rb')].sort.each do |file|
|
8
|
+
require file
|
9
|
+
end
|
10
|
+
|
11
|
+
Dir[File.join(__dir__, 'rest/**/*.rb')].sort.each do |file|
|
12
|
+
require file
|
13
|
+
end
|
@@ -0,0 +1,149 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Reach
|
4
|
+
module Security
|
5
|
+
class RequestValidator
|
6
|
+
##
|
7
|
+
# Initialize a Request Validator. auth_token will either be grabbed from the global Reach object or you can
|
8
|
+
# pass it in here.
|
9
|
+
#
|
10
|
+
# @param [String] auth_token Your account auth token, used to sign requests
|
11
|
+
def initialize(auth_token = nil)
|
12
|
+
@auth_token = auth_token || Reach.auth_token
|
13
|
+
raise ArgumentError, 'Auth token is required' if @auth_token.nil?
|
14
|
+
end
|
15
|
+
|
16
|
+
##
|
17
|
+
# Validates that after hashing a request with Reach's request-signing algorithm, the hash matches the signature parameter
|
18
|
+
#
|
19
|
+
# @param [String] url The url sent to your server, including any query parameters
|
20
|
+
# @param [String, Hash, #to_unsafe_h] params In most cases, this is the POST parameters as a hash. If you received
|
21
|
+
# a bodySHA256 parameter in the query string, this parameter can instead be the POST body as a string to
|
22
|
+
# validate JSON or other text-based payloads that aren't x-www-form-urlencoded.
|
23
|
+
# @param [String] signature The expected signature, from the X-Reach-Signature header of the request
|
24
|
+
#
|
25
|
+
# @return [Boolean] whether or not the computed signature matches the signature parameter
|
26
|
+
def validate(url, params, signature)
|
27
|
+
parsed_url = URI(url)
|
28
|
+
url_with_port = add_port(parsed_url)
|
29
|
+
url_without_port = remove_port(parsed_url)
|
30
|
+
|
31
|
+
valid_body = true # default succeed, since body not always provided
|
32
|
+
params_hash = body_or_hash(params)
|
33
|
+
unless params_hash.is_a? Enumerable
|
34
|
+
body_hash = URI.decode_www_form(parsed_url.query || '').to_h['bodySHA256']
|
35
|
+
params_hash = build_hash_for(params)
|
36
|
+
valid_body = !(params_hash.nil? || body_hash.nil?) && secure_compare(params_hash, body_hash)
|
37
|
+
params_hash = {}
|
38
|
+
end
|
39
|
+
|
40
|
+
# Check signature of the url with and without port numbers
|
41
|
+
# since signature generation on the back end is inconsistent
|
42
|
+
valid_signature_with_port = secure_compare(build_signature_for(url_with_port, params_hash), signature)
|
43
|
+
valid_signature_without_port = secure_compare(build_signature_for(url_without_port, params_hash), signature)
|
44
|
+
|
45
|
+
valid_body && (valid_signature_with_port || valid_signature_without_port)
|
46
|
+
end
|
47
|
+
|
48
|
+
##
|
49
|
+
# Build a SHA256 hash for a body string
|
50
|
+
#
|
51
|
+
# @param [String] body String to hash
|
52
|
+
#
|
53
|
+
# @return [String] A hex-encoded SHA256 of the body string
|
54
|
+
def build_hash_for(body)
|
55
|
+
hasher = OpenSSL::Digest.new('sha256')
|
56
|
+
hasher.hexdigest(body)
|
57
|
+
end
|
58
|
+
|
59
|
+
##
|
60
|
+
# Build a SHA1-HMAC signature for a url and parameter hash
|
61
|
+
#
|
62
|
+
# @param [String] url The request url, including any query parameters
|
63
|
+
# @param [#join] params The POST parameters
|
64
|
+
#
|
65
|
+
# @return [String] A base64 encoded SHA1-HMAC
|
66
|
+
def build_signature_for(url, params)
|
67
|
+
data = url + params.sort.join
|
68
|
+
digest = OpenSSL::Digest.new('sha1')
|
69
|
+
Base64.strict_encode64(OpenSSL::HMAC.digest(digest, @auth_token, data))
|
70
|
+
end
|
71
|
+
|
72
|
+
private
|
73
|
+
|
74
|
+
# Compares two strings in constant time to avoid timing attacks.
|
75
|
+
# Borrowed from ActiveSupport::MessageVerifier.
|
76
|
+
# https://github.com/rails/rails/blob/master/activesupport/lib/active_support/message_verifier.rb
|
77
|
+
def secure_compare(a, b)
|
78
|
+
return false unless a.bytesize == b.bytesize
|
79
|
+
|
80
|
+
l = a.unpack("C#{a.bytesize}")
|
81
|
+
|
82
|
+
res = 0
|
83
|
+
b.each_byte { |byte| res |= byte ^ l.shift }
|
84
|
+
res.zero?
|
85
|
+
end
|
86
|
+
|
87
|
+
# `ActionController::Parameters` no longer, as of Rails 5, inherits
|
88
|
+
# from `Hash` so the `sort` method, used above in `build_signature_for`
|
89
|
+
# is deprecated.
|
90
|
+
#
|
91
|
+
# `to_unsafe_h` was introduced in Rails 4.2.1, before then it is still
|
92
|
+
# possible to sort on an ActionController::Parameters object.
|
93
|
+
#
|
94
|
+
# We use `to_unsafe_h` as `to_h` returns a hash of the permitted
|
95
|
+
# parameters only and we need all the parameters to create the signature.
|
96
|
+
def body_or_hash(params_or_body)
|
97
|
+
if params_or_body.respond_to?(:to_unsafe_h)
|
98
|
+
params_or_body.to_unsafe_h
|
99
|
+
else
|
100
|
+
params_or_body
|
101
|
+
end
|
102
|
+
end
|
103
|
+
|
104
|
+
##
|
105
|
+
# Adds the standard port to the url if it doesn't already have one
|
106
|
+
#
|
107
|
+
# @param [URI] parsed_url The parsed request url
|
108
|
+
#
|
109
|
+
# @return [String] The URL with a port number
|
110
|
+
def add_port(parsed_url)
|
111
|
+
if parsed_url.port.nil? || parsed_url.port == parsed_url.default_port
|
112
|
+
build_url_with_port_for(parsed_url)
|
113
|
+
else
|
114
|
+
parsed_url.to_s
|
115
|
+
end
|
116
|
+
end
|
117
|
+
|
118
|
+
##
|
119
|
+
# Removes the port from the url
|
120
|
+
#
|
121
|
+
# @param [URI] parsed_url The parsed request url
|
122
|
+
#
|
123
|
+
# @return [String] The URL without a port number
|
124
|
+
def remove_port(parsed_url)
|
125
|
+
parsed_url.port = nil
|
126
|
+
parsed_url.to_s
|
127
|
+
end
|
128
|
+
|
129
|
+
##
|
130
|
+
# Builds the url from its component pieces, with the standard port
|
131
|
+
#
|
132
|
+
# @param [URI] parsed_url The parsed request url
|
133
|
+
#
|
134
|
+
# @return [String] The URL with the standard port number
|
135
|
+
def build_url_with_port_for(parsed_url)
|
136
|
+
url = ''
|
137
|
+
|
138
|
+
url += parsed_url.scheme ? "#{parsed_url.scheme}://" : ''
|
139
|
+
url += parsed_url.userinfo ? "#{parsed_url.userinfo}@" : ''
|
140
|
+
url += parsed_url.host ? "#{parsed_url.host}:#{parsed_url.port}" : ''
|
141
|
+
url += parsed_url.path
|
142
|
+
url += parsed_url.query ? "?#{parsed_url.query}" : ''
|
143
|
+
url += parsed_url.fragment ? "##{parsed_url.fragment}" : ''
|
144
|
+
|
145
|
+
url
|
146
|
+
end
|
147
|
+
end
|
148
|
+
end
|
149
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Reach
|
4
|
+
module Util
|
5
|
+
class Configuration
|
6
|
+
attr_accessor :username, :auth_token, :http_client, :logger
|
7
|
+
|
8
|
+
def username=(value)
|
9
|
+
@username = value
|
10
|
+
end
|
11
|
+
|
12
|
+
def auth_token=(value)
|
13
|
+
@auth_token = value
|
14
|
+
end
|
15
|
+
|
16
|
+
def http_client=(value)
|
17
|
+
@http_client = value
|
18
|
+
end
|
19
|
+
|
20
|
+
def logger=(value)
|
21
|
+
@logger = value
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
data/lib/reach-ruby.rb
ADDED
@@ -0,0 +1,44 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'net/http'
|
4
|
+
require 'net/https'
|
5
|
+
require 'cgi'
|
6
|
+
require 'openssl'
|
7
|
+
require 'base64'
|
8
|
+
require 'forwardable'
|
9
|
+
require 'time'
|
10
|
+
require 'json'
|
11
|
+
|
12
|
+
require 'reach-ruby/version' unless defined?(Reach::VERSION)
|
13
|
+
require 'rack/reach_webhook_authentication' if defined?(Rack) && defined?(Rack::MediaType)
|
14
|
+
|
15
|
+
require 'reach-ruby/security/request_validator'
|
16
|
+
require 'reach-ruby/util/configuration'
|
17
|
+
|
18
|
+
Dir[File.join(__dir__, 'reach-ruby/framework/*.rb')].sort.each do |file|
|
19
|
+
require file
|
20
|
+
end
|
21
|
+
|
22
|
+
module Reach
|
23
|
+
extend SingleForwardable
|
24
|
+
|
25
|
+
autoload :HTTP, File.join(__dir__, 'reach-ruby', 'http.rb')
|
26
|
+
autoload :REST, File.join(__dir__, 'reach-ruby', 'rest.rb')
|
27
|
+
|
28
|
+
def_delegators :configuration, :username, :auth_token, :http_client, :logger
|
29
|
+
|
30
|
+
##
|
31
|
+
# Pre-configure with ApiUser and ApiKey so that you don't need to
|
32
|
+
# pass them to various initializers each time.
|
33
|
+
def self.configure(&block)
|
34
|
+
yield configuration
|
35
|
+
end
|
36
|
+
|
37
|
+
##
|
38
|
+
# Returns an existing or instantiates a new configuration object.
|
39
|
+
def self.configuration
|
40
|
+
@configuration ||= Util::Configuration.new
|
41
|
+
end
|
42
|
+
|
43
|
+
private_class_method :configuration
|
44
|
+
end
|
data/reach-ruby.gemspec
ADDED
@@ -0,0 +1,38 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
|
3
|
+
lib = File.expand_path('../lib', __FILE__)
|
4
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
5
|
+
require 'reach-ruby/version'
|
6
|
+
|
7
|
+
Gem::Specification.new do |spec|
|
8
|
+
spec.name = 'reach-ruby'
|
9
|
+
spec.version = Reach::VERSION
|
10
|
+
spec.authors = ['Reach API Team']
|
11
|
+
spec.summary = 'The official library for communicating with the Reach REST API'
|
12
|
+
spec.description = 'The official library for communicating with the Reach REST API'
|
13
|
+
spec.homepage = 'https://github.com/talkylabs/reach-ruby'
|
14
|
+
spec.license = 'MIT'
|
15
|
+
spec.metadata = { 'yard.run' => 'yri' } # use "yard" to build full HTML docs
|
16
|
+
|
17
|
+
spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match?(%r{^(spec)/}) }
|
18
|
+
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
19
|
+
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
20
|
+
spec.require_paths = ['lib']
|
21
|
+
spec.required_ruby_version = '>= 2.0.0'
|
22
|
+
spec.extra_rdoc_files = ['README.md', 'LICENSE']
|
23
|
+
spec.rdoc_options = ['--line-numbers', '--inline-source', '--title', 'reach-ruby', '--main', 'README.md']
|
24
|
+
|
25
|
+
spec.add_dependency('nokogiri', '>= 1.6', '< 2.0')
|
26
|
+
spec.add_dependency('faraday', '>= 0.9', '< 3.0')
|
27
|
+
# Workaround for RBX <= 2.2.1, should be fixed in next version
|
28
|
+
spec.add_dependency('rubysl') if defined?(RUBY_ENGINE) && RUBY_ENGINE == 'rbx'
|
29
|
+
|
30
|
+
spec.add_development_dependency 'bundler', '>= 1.5', '< 3.0'
|
31
|
+
spec.add_development_dependency 'equivalent-xml', '~> 0.6'
|
32
|
+
spec.add_development_dependency 'fakeweb', '~> 1.3'
|
33
|
+
spec.add_development_dependency 'rack', '~> 2.0'
|
34
|
+
spec.add_development_dependency 'rake', '~> 13.0'
|
35
|
+
spec.add_development_dependency 'rspec', '~> 3.0'
|
36
|
+
spec.add_development_dependency 'yard', '~> 0.9.9'
|
37
|
+
spec.add_development_dependency 'logger', '~> 1.4.2'
|
38
|
+
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
sonar.projectKey=talkylabs_reach-ruby
|
2
|
+
sonar.projectName=reach-ruby
|
3
|
+
sonar.organization=talkylabs
|
4
|
+
|
5
|
+
sonar.sources=lib/reach-ruby
|
6
|
+
# Exclude any auto-generated source code
|
7
|
+
sonar.exclusions=lib/reach-ruby/rest/**/*
|
8
|
+
sonar.tests=spec/
|
9
|
+
# Exclude any auto-generated integration tests
|
10
|
+
sonar.test.exclusions=spec/integration/**/*.spec.rb
|
11
|
+
|
12
|
+
# For Code Coverage analysis
|
13
|
+
sonar.ruby.coverage.reportPaths=coverage/coverage.json
|