ae_network_connection_exception 1.4.0 → 1.6.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 5b7cafe89fcbcdaf9925c573d2634a2bb132c1e455410a58eb37aec03ee2f08d
4
- data.tar.gz: f78429a43ab640d0ebb3c957b35a111811fa6e34a715904bcf9881b06b4a093e
3
+ metadata.gz: 670bacf7b250485b96be28e6623494ea3ef88e93830b27de6c7141d273d53737
4
+ data.tar.gz: cdcfd66f3fedd185fdb58fc8f6cdd2da0da799ddb22166a1ce270d608c8378fb
5
5
  SHA512:
6
- metadata.gz: a571e1b3cc34c30bde269b5a3fcf756e2cd74eeef8d1399b6cc76b22404932d2a87a5988a72c5e20d6f2d7a1c07a02f6018bd5fadc02dfb0387034b7e4456175
7
- data.tar.gz: 7b5cab2ccc00495417184b0dbbd7c3a42fd639d8051584273daef29e37f581bfa3004156b36483e6492cb89c9063911021d188559c0f81c44730e181f2a9e765
6
+ metadata.gz: 371c96edecc48bf85bde49dbe33a12afd216da04f40db63ae9bbbedbdcd200e10fe995467a9d60dc385542f1869e5f39440f77dbc731707cf0555ac1f36f4319
7
+ data.tar.gz: f0822a534739ba7d31c14b37873236d41c6a8adae6714ecd86f50ae95ee01ea800576963b158fee142ef88349fb3785f4dec8ec21addaeabf220cc851783baa1
data/LICENSE.txt CHANGED
@@ -1,6 +1,4 @@
1
- Copyright (c) 2015 AppFolio, inc.
2
-
3
- MIT License
1
+ Copyright (c) 2015-2021 AppFolio, Inc
4
2
 
5
3
  Permission is hereby granted, free of charge, to any person obtaining
6
4
  a copy of this software and associated documentation files (the
@@ -1,21 +1,20 @@
1
- # coding: utf-8
2
- lib = File.expand_path('../lib', __FILE__)
3
- $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
- require 'ae_network_connection_exception/version'
1
+ # frozen_string_literal: true
5
2
 
6
- Gem::Specification.new do |spec|
7
- spec.name = "ae_network_connection_exception"
8
- spec.version = AeNetworkConnectionException::VERSION
9
- spec.authors = ["Steven Boyd"]
10
- spec.email = ["engineering@appfolio.com"]
11
- spec.summary = "Provides sane exceptions for network failures"
12
- spec.description = "A simple gem that will catch all manner of exceptions related to establishing a network connection and return a more generic error."
13
- spec.homepage = "http://github.com/appfolio/ae_network_connection_exception"
14
- spec.license = "MIT"
3
+ require_relative 'lib/ae_network_connection_exception/version'
15
4
 
16
- spec.files = `git ls-files -z`.split("\x0")
17
- spec.require_paths = ["lib"]
5
+ Gem::Specification.new do |spec|
6
+ spec.name = 'ae_network_connection_exception'
7
+ spec.version = AeNetworkConnectionException::VERSION
8
+ spec.platform = Gem::Platform::RUBY
9
+ spec.author = 'AppFolio'
10
+ spec.email = 'opensource@appfolio.com'
11
+ spec.description = 'Catch exceptions related to establishing a network connection and return a generic error.'
12
+ spec.summary = 'Provides sane exceptions for network failures.'
13
+ spec.homepage = 'https://github.com/appfolio/ae_network_connection_exception'
14
+ spec.license = 'MIT'
15
+ spec.files = Dir['**/*'].select { |f| f[%r{^(lib/|LICENSE.txt|.*gemspec)}] }
16
+ spec.require_paths = ['lib']
17
+ spec.required_ruby_version = Gem::Requirement.new('>= 2.6.3')
18
18
 
19
- spec.add_development_dependency "bundler", "~> 1.7"
20
- spec.add_development_dependency "rake", "~> 10.0"
19
+ spec.metadata['allowed_push_host'] = 'https://rubygems.org'
21
20
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module AeNetworkConnectionException
2
- VERSION = "1.4.0"
4
+ VERSION = '1.6.0'
3
5
  end
@@ -1,38 +1,30 @@
1
- require "ae_network_connection_exception/version"
2
- require "net/http"
3
- require "socket"
1
+ # frozen_string_literal: true
2
+
3
+ require 'net/http'
4
+ require 'socket'
4
5
 
5
6
  module AeNetworkConnectionException
6
7
  class ConnectionNotEstablished < StandardError
7
8
  end
8
9
 
9
- OTHER_EXCEPTIONS = []
10
- if defined?(RestClient::Exceptions::OpenTimeout)
11
- puts "here"
12
- OTHER_EXCEPTIONS << RestClient::Exceptions::OpenTimeout
13
- end
14
- OTHER_EXCEPTIONS.freeze
15
-
16
10
  class << self
17
11
  def try
18
12
  yield
19
- rescue SocketError, Net::OpenTimeout, *OTHER_EXCEPTIONS => e
20
- # SocketError happens when we fail to connect to a socket. Common problems here are DNS resolution (i.e. getaddrinfo)
21
- # Net::OpenTimeout happens when we are unable to establish an HTTP connection before the open_timeout
22
-
13
+ rescue SocketError, Net::OpenTimeout, *other_exceptions
14
+ # SocketError happens when we fail to connect to a socket.
15
+ # Common problems here are DNS resolution (i.e. getaddrinfo).
16
+ # Net::OpenTimeout happens when we are unable to establish an HTTP connection before the open_timeout.
23
17
  raise ConnectionNotEstablished
24
18
  rescue Errno::ETIMEDOUT, Errno::ECONNREFUSED, Errno::EHOSTUNREACH, Errno::ENETUNREACH => e
25
- # Errno::ECONNREFUSED happens when we can not connect to the port
26
- # Errno::ETIMEDOUT happens when we timeout durring the tcp handshake
27
- # It is important to note, Errno::ETIMEDOUT can also happen after we have established a connection and are waiting for a response.
19
+ # Errno::ECONNREFUSED happens when we can not connect to the port.
20
+ # Errno::ETIMEDOUT happens when we timeout durring the tcp handshake.
21
+ # Errno::ETIMEDOUT can also happen after we have established a connection and are waiting for a response.
28
22
  # Because of this, we also check that the sys call that was made is connect(2).
29
- # Errno::* Exceptions have the following error message format
30
- # "#{Message string} - #{syscall} for "#{host}" port #{port}"
31
-
23
+ # Errno::* Exceptions have the following error message format:
24
+ # "#{Message string} - #{syscall} for "#{host}" port #{port}"
32
25
  raise_if_exception_message_matches(e, /connect\(2\)/)
33
26
  rescue Errno::ECONNRESET => e
34
- # Errno::ECONNRESET happens when the connection is reset. This can happen during ssl negotiation
35
-
27
+ # Errno::ECONNRESET happens when the connection is reset. This can happen during SSL negotiation.
36
28
  raise_if_exception_message_matches(e, /SSL_connect/)
37
29
  end
38
30
 
@@ -43,7 +35,7 @@ module AeNetworkConnectionException
43
35
  Errno::ECONNREFUSED.new('Connection refused - connect(2) for "example.com" port 443'),
44
36
  Errno::ETIMEDOUT.new('Connection timed out - connect(2) for "example.com" port 443'),
45
37
  Net::OpenTimeout.new('message'),
46
- Errno::ECONNRESET.new('Connection reset by peer - SSL_connect', Errno::ECONNREFUSED.new('Connection refused - connect(2) for "example.com" port 443')),
38
+ Errno::ECONNRESET.new('Connection reset by peer - SSL_connect'),
47
39
  Errno::EHOSTUNREACH.new('No route to host - connect(2) for "example.com" port 443'),
48
40
  Errno::ENETUNREACH.new('Network is unreachable - connect(2) for "example.com" port 443')
49
41
  ]
@@ -51,12 +43,14 @@ module AeNetworkConnectionException
51
43
 
52
44
  private
53
45
 
46
+ def other_exceptions
47
+ defined?(RestClient::Exceptions::OpenTimeout) ? [RestClient::Exceptions::OpenTimeout] : []
48
+ end
49
+
54
50
  def raise_if_exception_message_matches(exception, pattern)
55
- if exception.message =~ pattern
56
- raise ConnectionNotEstablished
57
- else
58
- raise exception
59
- end
51
+ raise ConnectionNotEstablished if exception.message =~ pattern
52
+
53
+ raise exception
60
54
  end
61
55
  end
62
56
  end
metadata CHANGED
@@ -1,71 +1,32 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ae_network_connection_exception
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.4.0
4
+ version: 1.6.0
5
5
  platform: ruby
6
6
  authors:
7
- - Steven Boyd
8
- autorequire:
7
+ - AppFolio
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-03-04 00:00:00.000000000 Z
12
- dependencies:
13
- - !ruby/object:Gem::Dependency
14
- name: bundler
15
- requirement: !ruby/object:Gem::Requirement
16
- requirements:
17
- - - "~>"
18
- - !ruby/object:Gem::Version
19
- version: '1.7'
20
- type: :development
21
- prerelease: false
22
- version_requirements: !ruby/object:Gem::Requirement
23
- requirements:
24
- - - "~>"
25
- - !ruby/object:Gem::Version
26
- version: '1.7'
27
- - !ruby/object:Gem::Dependency
28
- name: rake
29
- requirement: !ruby/object:Gem::Requirement
30
- requirements:
31
- - - "~>"
32
- - !ruby/object:Gem::Version
33
- version: '10.0'
34
- type: :development
35
- prerelease: false
36
- version_requirements: !ruby/object:Gem::Requirement
37
- requirements:
38
- - - "~>"
39
- - !ruby/object:Gem::Version
40
- version: '10.0'
41
- description: A simple gem that will catch all manner of exceptions related to establishing
42
- a network connection and return a more generic error.
43
- email:
44
- - engineering@appfolio.com
11
+ date: 2022-02-22 00:00:00.000000000 Z
12
+ dependencies: []
13
+ description: Catch exceptions related to establishing a network connection and return
14
+ a generic error.
15
+ email: opensource@appfolio.com
45
16
  executables: []
46
17
  extensions: []
47
18
  extra_rdoc_files: []
48
19
  files:
49
- - ".circleci/config.yml"
50
- - ".gitignore"
51
- - ".ruby-version"
52
- - Appraisals
53
- - Gemfile
54
20
  - LICENSE.txt
55
- - README.md
56
- - Rakefile
57
21
  - ae_network_connection_exception.gemspec
58
- - gemfiles/ruby_2.3.3.gemfile
59
- - gemfiles/ruby_2.5.3.gemfile
60
22
  - lib/ae_network_connection_exception.rb
61
23
  - lib/ae_network_connection_exception/version.rb
62
- - test/test_helper.rb
63
- - test/unit/ae_network_connection_exception_test.rb
64
- homepage: http://github.com/appfolio/ae_network_connection_exception
24
+ homepage: https://github.com/appfolio/ae_network_connection_exception
65
25
  licenses:
66
26
  - MIT
67
- metadata: {}
68
- post_install_message:
27
+ metadata:
28
+ allowed_push_host: https://rubygems.org
29
+ post_install_message:
69
30
  rdoc_options: []
70
31
  require_paths:
71
32
  - lib
@@ -73,15 +34,15 @@ required_ruby_version: !ruby/object:Gem::Requirement
73
34
  requirements:
74
35
  - - ">="
75
36
  - !ruby/object:Gem::Version
76
- version: '0'
37
+ version: 2.6.3
77
38
  required_rubygems_version: !ruby/object:Gem::Requirement
78
39
  requirements:
79
40
  - - ">="
80
41
  - !ruby/object:Gem::Version
81
42
  version: '0'
82
43
  requirements: []
83
- rubygems_version: 3.0.6
84
- signing_key:
44
+ rubygems_version: 3.3.3
45
+ signing_key:
85
46
  specification_version: 4
86
- summary: Provides sane exceptions for network failures
47
+ summary: Provides sane exceptions for network failures.
87
48
  test_files: []
data/.circleci/config.yml DELETED
@@ -1,30 +0,0 @@
1
- defaults: &defaults
2
- working_directory: ~/repo
3
-
4
- steps:
5
- - checkout
6
- - run: bundle install
7
- - run: bundle exec appraisal install
8
- - run: bundle exec appraisal rake test
9
-
10
- version: 2
11
- jobs:
12
- test-ruby-2.3.3:
13
- <<: *defaults
14
- docker:
15
- - image: circleci/ruby:2.3.3
16
-
17
- test-ruby-2.5.3:
18
- <<: *defaults
19
- docker:
20
- - image: circleci/ruby:2.5.3-stretch
21
-
22
- workflows:
23
- version: 2
24
- rc:
25
- jobs:
26
- - test-ruby-2.3.3:
27
- context: appfolio_test_context
28
- - test-ruby-2.5.3:
29
- context: appfolio_test_context
30
-
data/.gitignore DELETED
@@ -1,16 +0,0 @@
1
- /.bundle/
2
- /.yardoc
3
- /Gemfile.lock
4
- /_yardoc/
5
- /coverage/
6
- /doc/
7
- /pkg/
8
- /spec/reports/
9
- /tmp/
10
- *.bundle
11
- *.so
12
- *.o
13
- *.a
14
- .idea
15
- mkmf.log
16
- gemfiles/*lock
data/.ruby-version DELETED
@@ -1 +0,0 @@
1
- ruby-2.3.3
data/Appraisals DELETED
@@ -1,11 +0,0 @@
1
- case(RUBY_VERSION)
2
-
3
- when '2.3.3', '2.5.3' then
4
-
5
- appraise "ruby-#{RUBY_VERSION}" do
6
- end
7
-
8
- else
9
- raise "Unsupported Ruby version #{RUBY_VERSION}"
10
-
11
- end
data/Gemfile DELETED
@@ -1,12 +0,0 @@
1
- source 'https://rubygems.org'
2
-
3
- # Specify your gem's dependencies in ae_network_connection_exception.gemspec
4
- gemspec
5
-
6
- gem 'minitest', '~> 5.0'
7
-
8
- source 'https://gemini.atl.appfolio.net' do
9
- gem 'af_gems'
10
- end
11
-
12
- gem 'rest-client', '~> 2.0', require: false
data/README.md DELETED
@@ -1,36 +0,0 @@
1
- # AeNetworkConnectionException
2
-
3
- A simple gem that will catch all manner of exceptions related to establishing a network connection and return a more generic error.
4
-
5
- ## Installation
6
-
7
- Add this line to your application's Gemfile:
8
-
9
- ```ruby
10
- gem 'ae_network_connection_exception'
11
- ```
12
-
13
- And then execute:
14
-
15
- $ bundle
16
-
17
- Or install it yourself as:
18
-
19
- $ gem install ae_network_connection_exception
20
-
21
- ## Usage
22
- ```
23
- AeNetworkConnectionException.try do
24
- # your code that will make a network call
25
- end
26
- ```
27
-
28
- If your network call failed to establise a network connection, an exception of type ```AeNetworkConnectionException::ConnectionNotEstablished``` will be thrown
29
-
30
- ## Contributing
31
-
32
- 1. Fork it ( https://github.com/appfolio/ae_network_connection_exception/fork )
33
- 2. Create your feature branch (`git checkout -b my-new-feature`)
34
- 3. Commit your changes (`git commit -am 'Add some feature'`)
35
- 4. Push to the branch (`git push origin my-new-feature`)
36
- 5. Create a new Pull Request
data/Rakefile DELETED
@@ -1,24 +0,0 @@
1
- require 'rubygems'
2
- require 'bundler'
3
- begin
4
- Bundler.setup(:default, :development)
5
- rescue Bundler::BundlerError => e
6
- $stderr.puts e.message
7
- $stderr.puts "Run `bundle install` to install missing gems"
8
- exit e.status_code
9
- end
10
-
11
- require 'af_gems/gem_tasks'
12
- require 'af_gems/appraisal'
13
-
14
- Rake::TestTask.new(:test) do |test|
15
- test.libs << 'lib' << 'test'
16
- test.pattern = 'test/unit/**/*_test.rb'
17
- test.verbose = true
18
- end
19
-
20
- task :default => :test
21
-
22
- namespace :test do
23
- AfGems::RubyAppraisalTask.new(:all, [ 'ruby-2.3.3', 'ruby-2.5.3' ])
24
- end
@@ -1,11 +0,0 @@
1
- # This file was generated by Appraisal
2
-
3
- source "https://rubygems.org"
4
-
5
- gem "minitest", "~> 5.0"
6
-
7
- source "https://gemini.atl.appfolio.net" do
8
- gem "af_gems"
9
- end
10
-
11
- gemspec path: "../"
@@ -1,11 +0,0 @@
1
- # This file was generated by Appraisal
2
-
3
- source "https://rubygems.org"
4
-
5
- gem "minitest", "~> 5.0"
6
-
7
- source "https://gemini.atl.appfolio.net" do
8
- gem "af_gems"
9
- end
10
-
11
- gemspec path: "../"
data/test/test_helper.rb DELETED
@@ -1,32 +0,0 @@
1
- require 'rubygems'
2
- require 'minitest/autorun'
3
- require 'ae_network_connection_exception'
4
-
5
- private
6
-
7
- class Minitest::Test
8
- def assert_connection_not_established_thrown_for(exception)
9
- e = return_raised_error do
10
- AeNetworkConnectionException.try do
11
- raise exception
12
- end
13
- end
14
- assert_equal AeNetworkConnectionException::ConnectionNotEstablished, e.class
15
- assert_equal exception, e.cause
16
- end
17
-
18
- def assert_connection_not_established_not_thrown_for(exception)
19
- e = return_raised_error do
20
- AeNetworkConnectionException.try do
21
- raise exception
22
- end
23
- end
24
- assert_equal exception, e
25
- end
26
-
27
- def return_raised_error
28
- yield
29
- rescue => e
30
- return e
31
- end
32
- end
@@ -1,73 +0,0 @@
1
- require 'rest-client'
2
- require 'test_helper'
3
-
4
- module AeNetworkConnectionException
5
- class AeNetworkConnectionExceptionTest < Minitest::Test
6
- def test_connection_not_established_exception
7
- # Exception Causes are standard with ruby 2.1
8
- # http://devblog.avdi.org/2013/12/25/exception-causes-in-ruby-2-1
9
-
10
- parent_exception = AeNetworkConnectionException::ConnectionNotEstablished.new('Parent Message')
11
-
12
- assert_nil parent_exception.cause
13
- assert_equal 'Parent Message', parent_exception.message
14
-
15
- begin
16
- child_exception = nil
17
- begin
18
- raise StandardError.new('New Child Message')
19
- rescue => e
20
- child_exception = e
21
- parent_exception = AeNetworkConnectionException::ConnectionNotEstablished.new('New Parent Message')
22
- end
23
- rescue AeNetworkConnectionException::ConnectionNotEstablished => parent_exception
24
-
25
- refute_nil child_exception
26
- assert_equal child_exception, parent_exception.cause
27
- assert_equal 'New Parent Message, cause => StandardError: New Child Message', parent_exception.message
28
- end
29
- end
30
-
31
- def test_ae_network_connection_exception_try__doesnt_catch_non_network_exceptions
32
- exception = StandardError.new
33
- e = return_raised_error do
34
- AeNetworkConnectionException.try do
35
- raise exception
36
- end
37
- end
38
- assert_equal exception, e
39
- end
40
-
41
- def test_ae_network_connection_exception_try__raises_connection_not_establised_exception
42
- AeNetworkConnectionException.exception_signatures.each do |e|
43
- assert_connection_not_established_thrown_for(e)
44
- end
45
-
46
- assert_connection_not_established_not_thrown_for(Errno::ECONNRESET.new('Connection timed out - connect(2) for "example.com" port 443'))
47
- assert_connection_not_established_not_thrown_for(Errno::ETIMEDOUT.new('Connection timed out - recvfrom(2) for "example.com" port 443'))
48
- end
49
-
50
- def test_ae_network_connection_exception_try__raises_connection_not_establised_exception_for_rest_client_open_timeout
51
- assert_connection_not_established_thrown_for(RestClient::Exceptions::OpenTimeout.new)
52
- end
53
-
54
- def test_exception_signatures
55
- expected_signatures = [
56
- SocketError.new('getaddrinfo: Name or service not known'),
57
- Errno::ECONNREFUSED.new('Connection refused - connect(2) for "example.com" port 443'),
58
- Errno::ETIMEDOUT.new('Connection timed out - connect(2) for "example.com" port 443'),
59
- Net::OpenTimeout.new('message'),
60
- Errno::ECONNRESET.new('Connection reset by peer - SSL_connect', Errno::ECONNREFUSED.new('Connection refused - connect(2) for "example.com" port 443')),
61
- Errno::EHOSTUNREACH.new('No route to host - connect(2) for "example.com" port 443'),
62
- Errno::ENETUNREACH.new('Network is unreachable - connect(2) for "example.com" port 443')
63
- ]
64
-
65
- assert_equal expected_signatures.size, AeNetworkConnectionException.exception_signatures.size
66
-
67
- expected_signatures.each do |e|
68
- assert_includes AeNetworkConnectionException.exception_signatures, e
69
- end
70
- end
71
- end
72
- end
73
-