telnyx 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (69) hide show
  1. checksums.yaml +7 -0
  2. data/.gitattributes +4 -0
  3. data/.github/ISSUE_TEMPLATE.md +5 -0
  4. data/.gitignore +9 -0
  5. data/.rubocop.yml +32 -0
  6. data/.rubocop_todo.yml +50 -0
  7. data/.travis.yml +42 -0
  8. data/CHANGELOG.md +2 -0
  9. data/CONTRIBUTORS +0 -0
  10. data/Gemfile +40 -0
  11. data/Guardfile +8 -0
  12. data/LICENSE +22 -0
  13. data/README.md +173 -0
  14. data/Rakefile +28 -0
  15. data/VERSION +1 -0
  16. data/bin/telnyx-console +16 -0
  17. data/lib/telnyx.rb +151 -0
  18. data/lib/telnyx/api_operations/create.rb +12 -0
  19. data/lib/telnyx/api_operations/delete.rb +13 -0
  20. data/lib/telnyx/api_operations/list.rb +29 -0
  21. data/lib/telnyx/api_operations/nested_resource.rb +63 -0
  22. data/lib/telnyx/api_operations/request.rb +57 -0
  23. data/lib/telnyx/api_operations/save.rb +103 -0
  24. data/lib/telnyx/api_resource.rb +69 -0
  25. data/lib/telnyx/available_phone_number.rb +9 -0
  26. data/lib/telnyx/errors.rb +166 -0
  27. data/lib/telnyx/event.rb +9 -0
  28. data/lib/telnyx/list_object.rb +155 -0
  29. data/lib/telnyx/message.rb +9 -0
  30. data/lib/telnyx/messaging_phone_number.rb +10 -0
  31. data/lib/telnyx/messaging_profile.rb +32 -0
  32. data/lib/telnyx/messaging_sender_id.rb +12 -0
  33. data/lib/telnyx/messaging_short_code.rb +10 -0
  34. data/lib/telnyx/number_order.rb +11 -0
  35. data/lib/telnyx/number_reservation.rb +11 -0
  36. data/lib/telnyx/public_key.rb +7 -0
  37. data/lib/telnyx/singleton_api_resource.rb +24 -0
  38. data/lib/telnyx/telnyx_client.rb +545 -0
  39. data/lib/telnyx/telnyx_object.rb +521 -0
  40. data/lib/telnyx/telnyx_response.rb +50 -0
  41. data/lib/telnyx/util.rb +328 -0
  42. data/lib/telnyx/version.rb +5 -0
  43. data/lib/telnyx/webhook.rb +66 -0
  44. data/telnyx.gemspec +25 -0
  45. data/test/api_stub_helpers.rb +1 -0
  46. data/test/openapi/README.md +9 -0
  47. data/test/telnyx/api_operations_test.rb +85 -0
  48. data/test/telnyx/api_resource_test.rb +293 -0
  49. data/test/telnyx/available_phone_number_test.rb +14 -0
  50. data/test/telnyx/errors_test.rb +23 -0
  51. data/test/telnyx/list_object_test.rb +244 -0
  52. data/test/telnyx/message_test.rb +19 -0
  53. data/test/telnyx/messaging_phone_number_test.rb +33 -0
  54. data/test/telnyx/messaging_profile_test.rb +70 -0
  55. data/test/telnyx/messaging_sender_id_test.rb +46 -0
  56. data/test/telnyx/messaging_short_code_test.rb +33 -0
  57. data/test/telnyx/number_order_test.rb +39 -0
  58. data/test/telnyx/number_reservation_test.rb +12 -0
  59. data/test/telnyx/public_key_test.rb +13 -0
  60. data/test/telnyx/telnyx_client_test.rb +631 -0
  61. data/test/telnyx/telnyx_object_test.rb +497 -0
  62. data/test/telnyx/telnyx_response_test.rb +49 -0
  63. data/test/telnyx/util_test.rb +380 -0
  64. data/test/telnyx/webhook_test.rb +108 -0
  65. data/test/telnyx_mock.rb +78 -0
  66. data/test/telnyx_test.rb +40 -0
  67. data/test/test_data.rb +149 -0
  68. data/test/test_helper.rb +73 -0
  69. metadata +162 -0
@@ -0,0 +1,78 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Telnyx
4
+ class TelnyxMock
5
+ include Singleton
6
+
7
+ PATH_SPEC = "#{::File.dirname(__FILE__)}/openapi/spec3.json".freeze
8
+ PATH_FIXTURES = "#{::File.dirname(__FILE__)}/openapi/fixtures3.json".freeze
9
+
10
+ @pid = nil
11
+ @port = -1
12
+
13
+ # Starts telnyx-mock, if necessary. Returns the port on which telnyx-mock is listening.
14
+ def self.start
15
+ unless ::File.exist?(PATH_SPEC)
16
+ port = ENV["TELNYX_MOCK_PORT"] || 12_111
17
+ puts("No custom spec file found, assuming telnyx-mock is already running on port #{port}")
18
+ return port
19
+ end
20
+
21
+ unless @pid.nil?
22
+ puts("telnyx-mock already running on port #{@port}")
23
+ return @port
24
+ end
25
+
26
+ @port = find_available_port
27
+
28
+ puts("Starting telnyx-mock on port #{@port}...")
29
+
30
+ @stdout, @child_stdout = ::IO.pipe
31
+ @stderr, @child_stderr = ::IO.pipe
32
+
33
+ @pid = ::Process.spawn(
34
+ ["telnyx-mock", "telnyx-mock"],
35
+ "-http-port",
36
+ @port.to_s,
37
+ "-spec",
38
+ PATH_SPEC,
39
+ "-fixtures",
40
+ PATH_FIXTURES,
41
+ out: @child_stdout,
42
+ err: @child_stderr
43
+ )
44
+
45
+ [@child_stdout, @child_stderr].each(&:close)
46
+
47
+ sleep 1
48
+
49
+ status = (::Process.wait2(@pid, ::Process::WNOHANG) || []).last
50
+ if status.nil?
51
+ puts("Started telnyx-mock, PID = #{@pid}")
52
+ else
53
+ abort("telnyx-mock terminated early: #{status}")
54
+ end
55
+
56
+ @port
57
+ end
58
+
59
+ # Stops telnyx-mock, if necessary.
60
+ def self.stop
61
+ return if @pid.nil?
62
+ puts("Stopping telnyx-mock...")
63
+ ::Process.kill(:SIGTERM, @pid)
64
+ ::Process.waitpid2(@pid)
65
+ @pid = nil
66
+ @port = -1
67
+ puts("Stopped telnyx-mock")
68
+ end
69
+
70
+ # Finds and returns an available TCP port
71
+ private_class_method def self.find_available_port
72
+ server = TCPServer.new("localhost", 0)
73
+ port = server.addr[1]
74
+ server.close
75
+ port
76
+ end
77
+ end
78
+ end
@@ -0,0 +1,40 @@
1
+ # frozen_string_literal: true
2
+
3
+ require ::File.expand_path("../test_helper", __FILE__)
4
+
5
+ class TelnyxTest < Test::Unit::TestCase
6
+ should "allow app_info to be configured" do
7
+ begin
8
+ old = Telnyx.app_info
9
+ Telnyx.set_app_info(
10
+ "MyAwesomePlugin",
11
+ partner_id: "partner_1234",
12
+ url: "https://myawesomeplugin.info",
13
+ version: "1.2.34"
14
+ )
15
+ assert_equal({
16
+ name: "MyAwesomePlugin",
17
+ partner_id: "partner_1234",
18
+ url: "https://myawesomeplugin.info",
19
+ version: "1.2.34",
20
+ }, Telnyx.app_info)
21
+ ensure
22
+ Telnyx.app_info = old
23
+ end
24
+ end
25
+
26
+ should "allow max_network_retries to be configured" do
27
+ begin
28
+ old = Telnyx.max_network_retries
29
+ Telnyx.max_network_retries = 99
30
+ assert_equal 99, Telnyx.max_network_retries
31
+ ensure
32
+ Telnyx.max_network_retries = old
33
+ end
34
+ end
35
+
36
+ should "have default open and read timeouts" do
37
+ assert_equal Telnyx.open_timeout, 30
38
+ assert_equal Telnyx.read_timeout, 80
39
+ end
40
+ end
data/test/test_data.rb ADDED
@@ -0,0 +1,149 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Telnyx
4
+ module TestData
5
+ def make_error(code, title, detail)
6
+ {
7
+ errors: [
8
+ {
9
+ code: code,
10
+ title: title,
11
+ detail: detail,
12
+ },
13
+ ],
14
+ }
15
+ end
16
+
17
+ def make_invalid_api_key_error
18
+ {
19
+ errors: [
20
+ {
21
+ title: "Authentication failed",
22
+ detail: "The required authentication headers were either invalid or not included in the request.",
23
+ code: "10009",
24
+ },
25
+ ],
26
+ }
27
+ end
28
+
29
+ def make_invalid_id_error
30
+ {
31
+ errors: [
32
+ {
33
+ code: "10006",
34
+ title: "Invalid ID",
35
+ detail: "The resource ID provided was invalid.",
36
+ },
37
+ ],
38
+ }
39
+ end
40
+
41
+ def make_authentication_failed_error
42
+ {
43
+ errors: [
44
+ {
45
+ title: "Authentication failed",
46
+ detail: "The required authentication headers were either invalid or not included in the request.",
47
+ code: "10009",
48
+ },
49
+ ],
50
+ }
51
+ end
52
+
53
+ def make_authorization_failed_error
54
+ {
55
+ errors: [
56
+ {
57
+ title: "Authorization failed",
58
+ detail: "You do not have permission to perform the requested action on the specified resource or resources.",
59
+ code: "10010",
60
+ },
61
+ ],
62
+ }
63
+ end
64
+
65
+ def make_resource_not_found_error
66
+ {
67
+ errors: [
68
+ {
69
+ title: "Resource not found",
70
+ detail: "The requested resource or URL could not be found.",
71
+ code: "10005",
72
+ },
73
+ ],
74
+ }
75
+ end
76
+
77
+ def make_method_not_supported_error
78
+ {
79
+ errors: [
80
+ {
81
+ title: "Method not allowed",
82
+ detail: "The URL is valid, but the method is not allowed.",
83
+ code: "10030",
84
+ },
85
+ ],
86
+ }
87
+ end
88
+
89
+ def make_rate_limit_error
90
+ {
91
+ errors: [
92
+ {
93
+ title: "Too many requests",
94
+ detail: "You have exceeded the maximum number of allowed requests.",
95
+ code: "10011",
96
+ },
97
+ ],
98
+ }
99
+ end
100
+
101
+ def make_timeout_error
102
+ {
103
+ errors: [
104
+ {
105
+ title: "Request timeout",
106
+ detail: "The request timed out.",
107
+ code: "10008",
108
+ },
109
+ ],
110
+ }
111
+ end
112
+
113
+ def make_parameters_error
114
+ {
115
+ errors: [
116
+ {
117
+ title: "Missing required parameter",
118
+ detail: "A required parameter was missing.",
119
+ code: "10004",
120
+ },
121
+ ],
122
+ }
123
+ end
124
+
125
+ def make_service_unavailable_error
126
+ {
127
+ errors: [
128
+ {
129
+ title: "Service unavailable",
130
+ detail: "The service is not available.",
131
+ code: "",
132
+ },
133
+ ],
134
+ }
135
+ end
136
+
137
+ def make_api_error
138
+ {
139
+ errors: [
140
+ {
141
+ title: "Unexpected error",
142
+ detail: "An unexpected error occured.",
143
+ code: "10007",
144
+ },
145
+ ],
146
+ }
147
+ end
148
+ end
149
+ end
@@ -0,0 +1,73 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "coveralls"
4
+ Coveralls.wear!("test_frameworks")
5
+
6
+ require "telnyx"
7
+ require "test/unit"
8
+ require "mocha/setup"
9
+ require "stringio"
10
+ require "shoulda/context"
11
+ require "timecop"
12
+ require "webmock/test_unit"
13
+
14
+ PROJECT_ROOT = ::File.expand_path("../../", __FILE__)
15
+
16
+ require ::File.expand_path("../test_data", __FILE__)
17
+ require ::File.expand_path("../telnyx_mock", __FILE__)
18
+
19
+ # If changing this number, please also change it in `.travis.yml`.
20
+ MOCK_MINIMUM_VERSION = "0.40.1".freeze
21
+ MOCK_PORT = Telnyx::TelnyxMock.start
22
+
23
+ # Disable all real network connections except those that are outgoing to
24
+ # telnyx-mock.
25
+ WebMock.disable_net_connect!(allow: "localhost:#{MOCK_PORT}")
26
+
27
+ # Try one initial test connection to telnyx-mock so that if there's a problem
28
+ # we can print one error and fail fast so that it's more clear to the user how
29
+ # they should fix the problem.
30
+ begin
31
+ conn = Faraday::Connection.new("http://localhost:#{MOCK_PORT}")
32
+ resp = conn.get("/")
33
+ version = resp.headers["Telnyx-Mock-Version"]
34
+ if version != "master" &&
35
+ Gem::Version.new(version) < Gem::Version.new(MOCK_MINIMUM_VERSION)
36
+ abort("Your version of telnyx-mock (#{version}) is too old. The minimum " \
37
+ "version to run this test suite is #{MOCK_MINIMUM_VERSION}. Please " \
38
+ "see its repository for upgrade instructions.")
39
+ end
40
+ rescue Faraday::ConnectionFailed
41
+ abort("Couldn't reach telnyx-mock at `localhost:#{MOCK_PORT}`. Is " \
42
+ "it running? Please see README for setup instructions.")
43
+ end
44
+
45
+ Test::Unit.at_exit do
46
+ Telnyx::TelnyxMock.stop
47
+ end
48
+
49
+ module Test
50
+ module Unit
51
+ class TestCase
52
+ include Telnyx::TestData
53
+ include Mocha
54
+
55
+ setup do
56
+ Telnyx.api_key = "KEYSUPERSECRET"
57
+ Telnyx.api_base = "http://localhost:#{MOCK_PORT}"
58
+
59
+ # stub_connect
60
+ end
61
+
62
+ teardown do
63
+ Telnyx.api_key = nil
64
+ end
65
+
66
+ private
67
+
68
+ def stub_connect
69
+ stub_request(:any, /^#{Telnyx.api_base}/).to_return(body: "{}")
70
+ end
71
+ end
72
+ end
73
+ end
metadata ADDED
@@ -0,0 +1,162 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: telnyx
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Telnyx
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2019-07-17 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: faraday
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '0.13'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '0.13'
27
+ - !ruby/object:Gem::Dependency
28
+ name: net-http-persistent
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '3.0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '3.0'
41
+ description: Telnyx. See https://www.telnyx.com for details.
42
+ email: support@telnyx.com
43
+ executables:
44
+ - telnyx-console
45
+ extensions: []
46
+ extra_rdoc_files: []
47
+ files:
48
+ - ".gitattributes"
49
+ - ".github/ISSUE_TEMPLATE.md"
50
+ - ".gitignore"
51
+ - ".rubocop.yml"
52
+ - ".rubocop_todo.yml"
53
+ - ".travis.yml"
54
+ - CHANGELOG.md
55
+ - CONTRIBUTORS
56
+ - Gemfile
57
+ - Guardfile
58
+ - LICENSE
59
+ - README.md
60
+ - Rakefile
61
+ - VERSION
62
+ - bin/telnyx-console
63
+ - lib/telnyx.rb
64
+ - lib/telnyx/api_operations/create.rb
65
+ - lib/telnyx/api_operations/delete.rb
66
+ - lib/telnyx/api_operations/list.rb
67
+ - lib/telnyx/api_operations/nested_resource.rb
68
+ - lib/telnyx/api_operations/request.rb
69
+ - lib/telnyx/api_operations/save.rb
70
+ - lib/telnyx/api_resource.rb
71
+ - lib/telnyx/available_phone_number.rb
72
+ - lib/telnyx/errors.rb
73
+ - lib/telnyx/event.rb
74
+ - lib/telnyx/list_object.rb
75
+ - lib/telnyx/message.rb
76
+ - lib/telnyx/messaging_phone_number.rb
77
+ - lib/telnyx/messaging_profile.rb
78
+ - lib/telnyx/messaging_sender_id.rb
79
+ - lib/telnyx/messaging_short_code.rb
80
+ - lib/telnyx/number_order.rb
81
+ - lib/telnyx/number_reservation.rb
82
+ - lib/telnyx/public_key.rb
83
+ - lib/telnyx/singleton_api_resource.rb
84
+ - lib/telnyx/telnyx_client.rb
85
+ - lib/telnyx/telnyx_object.rb
86
+ - lib/telnyx/telnyx_response.rb
87
+ - lib/telnyx/util.rb
88
+ - lib/telnyx/version.rb
89
+ - lib/telnyx/webhook.rb
90
+ - telnyx.gemspec
91
+ - test/api_stub_helpers.rb
92
+ - test/openapi/README.md
93
+ - test/telnyx/api_operations_test.rb
94
+ - test/telnyx/api_resource_test.rb
95
+ - test/telnyx/available_phone_number_test.rb
96
+ - test/telnyx/errors_test.rb
97
+ - test/telnyx/list_object_test.rb
98
+ - test/telnyx/message_test.rb
99
+ - test/telnyx/messaging_phone_number_test.rb
100
+ - test/telnyx/messaging_profile_test.rb
101
+ - test/telnyx/messaging_sender_id_test.rb
102
+ - test/telnyx/messaging_short_code_test.rb
103
+ - test/telnyx/number_order_test.rb
104
+ - test/telnyx/number_reservation_test.rb
105
+ - test/telnyx/public_key_test.rb
106
+ - test/telnyx/telnyx_client_test.rb
107
+ - test/telnyx/telnyx_object_test.rb
108
+ - test/telnyx/telnyx_response_test.rb
109
+ - test/telnyx/util_test.rb
110
+ - test/telnyx/webhook_test.rb
111
+ - test/telnyx_mock.rb
112
+ - test/telnyx_test.rb
113
+ - test/test_data.rb
114
+ - test/test_helper.rb
115
+ homepage: https://developers.telnyx.com/docs/api/ruby
116
+ licenses:
117
+ - MIT
118
+ metadata: {}
119
+ post_install_message:
120
+ rdoc_options: []
121
+ require_paths:
122
+ - lib
123
+ required_ruby_version: !ruby/object:Gem::Requirement
124
+ requirements:
125
+ - - ">="
126
+ - !ruby/object:Gem::Version
127
+ version: 2.1.0
128
+ required_rubygems_version: !ruby/object:Gem::Requirement
129
+ requirements:
130
+ - - ">="
131
+ - !ruby/object:Gem::Version
132
+ version: '0'
133
+ requirements: []
134
+ rubygems_version: 3.0.4
135
+ signing_key:
136
+ specification_version: 4
137
+ summary: Ruby bindings for the Telnyx API
138
+ test_files:
139
+ - test/api_stub_helpers.rb
140
+ - test/openapi/README.md
141
+ - test/telnyx/api_operations_test.rb
142
+ - test/telnyx/api_resource_test.rb
143
+ - test/telnyx/available_phone_number_test.rb
144
+ - test/telnyx/errors_test.rb
145
+ - test/telnyx/list_object_test.rb
146
+ - test/telnyx/message_test.rb
147
+ - test/telnyx/messaging_phone_number_test.rb
148
+ - test/telnyx/messaging_profile_test.rb
149
+ - test/telnyx/messaging_sender_id_test.rb
150
+ - test/telnyx/messaging_short_code_test.rb
151
+ - test/telnyx/number_order_test.rb
152
+ - test/telnyx/number_reservation_test.rb
153
+ - test/telnyx/public_key_test.rb
154
+ - test/telnyx/telnyx_client_test.rb
155
+ - test/telnyx/telnyx_object_test.rb
156
+ - test/telnyx/telnyx_response_test.rb
157
+ - test/telnyx/util_test.rb
158
+ - test/telnyx/webhook_test.rb
159
+ - test/telnyx_mock.rb
160
+ - test/telnyx_test.rb
161
+ - test/test_data.rb
162
+ - test/test_helper.rb