active_utils 3.4.1 → 3.5.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: 9de480a810228c07a1d980254f1d402df7ba80f2e988feacc95aec1afd883675
4
- data.tar.gz: c2ebda446fe2252803c210ec96252417a3e3f7c1bb99a21471358b639254f7ae
3
+ metadata.gz: 6cb69c8f7a4335a1da1843d3bd397d876c333a3db37363eeee23b50a2b56e2a9
4
+ data.tar.gz: 1f1812202ee78f4eb51412e95c6c959a0ce78ca72cfbd933bf5313f61e0500fd
5
5
  SHA512:
6
- metadata.gz: 14a096c421ce499640357f80be62252783ca9ab300b56c019bdde6e13fcf45b1dfedde17ce1f398efd364d4f2f1613256ee9e1b72be301fe99fc6a19838e57a0
7
- data.tar.gz: 58fcc9f444a65ca230009c4a341ee4ad80ae037ac6316e6f01b2e55e215cfbc88c525f1fa6e31cfdb8c31a865b4183176d15a51a1dbc95a377facd76cc6e1ef6
6
+ metadata.gz: f6dc883ae82940c4d26a63ce03c58a1e7169817fc9e557a3c5d6fb4ebbe38722b6a75159b8733b7914f6d99088f28700bff5c97066c1f9a3587d37410be8d0e7
7
+ data.tar.gz: bc8b18eff03ed494e284f8286c17c2df58e0edabe2c9f5c0d6bed1f57e51c8f7c5369852903e5c410919f45d8c98029b2330a08e9972640d4b05abea35c583e2
@@ -0,0 +1,20 @@
1
+ version: 2
2
+ registries:
3
+ ruby-shopify:
4
+ type: rubygems-server
5
+ url: https://pkgs.shopify.io/basic/gems/ruby
6
+ username: ${{secrets.RUBYGEMS_SERVER_PKGS_SHOPIFY_IO_USERNAME}}
7
+ password: ${{secrets.RUBYGEMS_SERVER_PKGS_SHOPIFY_IO_PASSWORD}}
8
+ github-com:
9
+ type: git
10
+ url: https://github.com
11
+ username: ${{secrets.DEPENDENCIES_GITHUB_USER}}
12
+ password: ${{secrets.DEPENDENCIES_GITHUB_TOKEN}}
13
+ updates:
14
+ - package-ecosystem: bundler
15
+ directory: "/"
16
+ schedule:
17
+ interval: weekly
18
+ open-pull-requests-limit: 100
19
+ insecure-external-code-execution: allow
20
+ registries: "*"
@@ -0,0 +1,93 @@
1
+ name: Dependabot auto-merge
2
+ on: pull_request_target
3
+
4
+ jobs:
5
+ dependabot:
6
+ runs-on: shopify-ubuntu-latest
7
+ if: ${{ github.event.pull_request.user.login == 'dependabot[bot]' }}
8
+ steps:
9
+ - name: Dependabot metadata
10
+ id: metadata
11
+ uses: dependabot/fetch-metadata@v1.6.0
12
+ with:
13
+ github-token: "${{ secrets.GITHUB_TOKEN }}"
14
+
15
+ - name: Waiting for CI to finish
16
+ id: check_ci_failure
17
+ continue-on-error: true
18
+ if: ${{ steps.metadata.outputs.update-type == 'version-update:semver-patch' || steps.metadata.outputs.update-type == 'version-update:semver-minor' || steps.metadata.outputs.dependency-group == 'auto_merge' }}
19
+ uses: actions/github-script@v6
20
+ with:
21
+ script: |
22
+ function sleep(ms) {
23
+ return new Promise(resolve => setTimeout(resolve, ms))
24
+ }
25
+ const query = `query ($org: String!, $repo: String!, $pullRequestNumber: Int!) {
26
+ organization(login: $org) {
27
+ repository(name: $repo) {
28
+ pullRequest(number: $pullRequestNumber) {
29
+ commits(last: 1) {
30
+ nodes {
31
+ commit {
32
+ status {
33
+ state
34
+ }
35
+ }
36
+ }
37
+ }
38
+ }
39
+ }
40
+ }
41
+ }`;
42
+ const variables = {
43
+ org: context.repo.owner,
44
+ repo: context.repo.repo,
45
+ pullRequestNumber: context.issue.number
46
+ }
47
+ // Try for 30 minutes
48
+ let attempts = 30
49
+ let ci_state = false
50
+ for (let i = 1; i <= attempts; i++) {
51
+ console.log(`Sleeping for 60 seconds`)
52
+ await sleep(60000)
53
+ const result = await github.graphql(query, variables)
54
+ const state = result["organization"]["repository"]["pullRequest"]["commits"]["nodes"][0]["commit"]["status"]["state"]
55
+ console.log(`Status is ${state} after ${i} attempts`)
56
+ if (state === "SUCCESS") {
57
+ ci_state = true
58
+ console.log("Proceeding with workflow as CI succeed")
59
+ break
60
+ }
61
+ }
62
+ core.setOutput("ci_state", ci_state)
63
+ - name: Send Slack notification if auto-merge failed
64
+ if: ${{ steps.check_ci_failure.outputs.ci_state == 'false' }}
65
+ uses: ruby/action-slack@v3.0.0
66
+ with:
67
+ payload: |
68
+ {
69
+ "attachments": [{
70
+ "text": "Auto-merge failed for pull request <${{ github.event.pull_request.html_url }}|#${{ github.event.pull_request.number }}> in repository ${{ github.repository }}",
71
+ "color": "danger"
72
+ }
73
+ ]
74
+ }
75
+ env:
76
+ SLACK_WEBHOOK_URL: ${{ secrets.METRICS_SLACK_WEBHOOK_URL }}
77
+
78
+ - name: Approve and merge
79
+ if: ${{ steps.check_ci_failure.outputs.ci_state == 'true' && (steps.metadata.outputs.update-type == 'version-update:semver-patch' || steps.metadata.outputs.update-type == 'version-update:semver-minor' || steps.metadata.outputs.dependency-group == 'auto_merge') }}
80
+ uses: actions/github-script@v6
81
+ with:
82
+ script: |
83
+ await github.rest.pulls.createReview({
84
+ pull_number: context.issue.number,
85
+ owner: context.repo.owner,
86
+ repo: context.repo.repo,
87
+ event: 'APPROVE',
88
+ })
89
+ await github.rest.pulls.merge({
90
+ owner: context.repo.owner,
91
+ repo: context.repo.repo,
92
+ issue_number: context.issue.number,
93
+ })
@@ -0,0 +1,24 @@
1
+ name: CI
2
+ on:
3
+ pull_request:
4
+ branches:
5
+ - '**'
6
+ push:
7
+ branches:
8
+ - main
9
+ jobs:
10
+ build:
11
+ name: Ruby ${{ matrix.version }}
12
+ runs-on: ubuntu-latest
13
+ strategy:
14
+ matrix:
15
+ version: [ '2.7', '3.0', '3.1', '3.2', '3.3' ]
16
+ steps:
17
+ - uses: actions/checkout@v4
18
+ - name: Set up Ruby ${{ matrix.version }}
19
+ uses: ruby/setup-ruby@v1
20
+ with:
21
+ ruby-version: ${{ matrix.version }}
22
+ bundler-cache: true
23
+ - name: Test
24
+ run: bundle exec rake test
data/.gitignore CHANGED
@@ -2,4 +2,3 @@ pkg/*
2
2
  *.gem
3
3
  .bundle
4
4
  .DS_Store
5
- Gemfile.lock
data/.ruby-version ADDED
@@ -0,0 +1 @@
1
+ 2.7.5
data/CHANGELOG.md CHANGED
@@ -1,5 +1,11 @@
1
1
  # ActiveUtils changelog
2
2
 
3
+ ### Version 3.5.0 (February 04, 2025)
4
+ - Catch and raise `EHOSTUNREACH` and `EADDRNOTAVAIL` syscall errors as `ActiveUtils::ConnectionError`
5
+
6
+ ### Version 3.4.2 (January 15, 2025)
7
+ - Remove numeric as a required param for `ActiveUtils::Country`
8
+
3
9
  ### Version 3.4.1 (APril 04, 2023)
4
10
  - Fix depracated deprecated calling of `=~` on Object which is removed by ruby 3.2.0 as described here: https://bugs.ruby-lang.org/issues/15231
5
11
 
data/Gemfile.lock ADDED
@@ -0,0 +1,56 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ active_utils (3.5.0)
5
+ activesupport (>= 4.2)
6
+ i18n
7
+
8
+ GEM
9
+ remote: https://rubygems.org/
10
+ specs:
11
+ activesupport (7.1.5.1)
12
+ base64
13
+ benchmark (>= 0.3)
14
+ bigdecimal
15
+ concurrent-ruby (~> 1.0, >= 1.0.2)
16
+ connection_pool (>= 2.2.5)
17
+ drb
18
+ i18n (>= 1.6, < 2)
19
+ logger (>= 1.4.2)
20
+ minitest (>= 5.1)
21
+ mutex_m
22
+ securerandom (>= 0.3)
23
+ tzinfo (~> 2.0)
24
+ base64 (0.2.0)
25
+ benchmark (0.4.0)
26
+ bigdecimal (3.1.9)
27
+ concurrent-ruby (1.3.5)
28
+ connection_pool (2.5.0)
29
+ drb (2.2.1)
30
+ i18n (1.14.7)
31
+ concurrent-ruby (~> 1.0)
32
+ logger (1.6.5)
33
+ minitest (5.22.3)
34
+ mocha (2.1.0)
35
+ ruby2_keywords (>= 0.0.5)
36
+ mutex_m (0.3.0)
37
+ rake (13.2.0)
38
+ ruby2_keywords (0.0.5)
39
+ securerandom (0.3.2)
40
+ tzinfo (2.0.6)
41
+ concurrent-ruby (~> 1.0)
42
+
43
+ PLATFORMS
44
+ arm64-darwin-21
45
+ arm64-darwin-23
46
+ arm64-darwin-24
47
+ x86_64-linux
48
+
49
+ DEPENDENCIES
50
+ active_utils!
51
+ minitest
52
+ mocha
53
+ rake
54
+
55
+ BUNDLED WITH
56
+ 2.4.18
data/Rakefile CHANGED
@@ -5,7 +5,6 @@ require 'rake/testtask'
5
5
 
6
6
  Rake::TestTask.new(:test) do |t|
7
7
  t.pattern = 'test/unit/**/*_test.rb'
8
- t.ruby_opts << '-rubygems'
9
8
  t.libs << 'test'
10
9
  t.verbose = true
11
10
  end
data/active_utils.gemspec CHANGED
@@ -12,6 +12,8 @@ Gem::Specification.new do |s|
12
12
  s.summary = %q{Common utils used by active_merchant, active_fulfillment, and active_shipping}
13
13
  s.license = 'MIT'
14
14
 
15
+ s.required_ruby_version = ">= 2.7"
16
+
15
17
  s.rubyforge_project = "active_utils"
16
18
 
17
19
  s.add_dependency('activesupport', '>= 4.2')
@@ -40,7 +40,7 @@ module ActiveUtils #:nodoc:
40
40
  attr_reader :name
41
41
 
42
42
  def initialize(options = {})
43
- requires!(options, :name, :alpha2, :alpha3, :numeric)
43
+ requires!(options, :name, :alpha2, :alpha3)
44
44
  @name = options.delete(:name)
45
45
  @codes = options.collect{|k,v| CountryCode.new(v)}
46
46
  end
@@ -66,7 +66,6 @@ module ActiveUtils #:nodoc:
66
66
  { :alpha2 => 'AF', :name => 'Afghanistan', :alpha3 => 'AFG', :numeric => '004' },
67
67
  { :alpha2 => 'AX', :name => 'Aland Islands', :alpha3 => 'ALA', :numeric => '248' },
68
68
  { :alpha2 => 'AL', :name => 'Albania', :alpha3 => 'ALB', :numeric => '008' },
69
- { :alpha2 => 'AC', :name => 'Ascension Island', :alpha3 => 'ASC' },
70
69
  { :alpha2 => 'DZ', :name => 'Algeria', :alpha3 => 'DZA', :numeric => '012' },
71
70
  { :alpha2 => 'AS', :name => 'American Samoa', :alpha3 => 'ASM', :numeric => '016' },
72
71
  { :alpha2 => 'AD', :name => 'Andorra', :alpha3 => 'AND', :numeric => '020' },
@@ -77,6 +76,7 @@ module ActiveUtils #:nodoc:
77
76
  { :alpha2 => 'AR', :name => 'Argentina', :alpha3 => 'ARG', :numeric => '032' },
78
77
  { :alpha2 => 'AM', :name => 'Armenia', :alpha3 => 'ARM', :numeric => '051' },
79
78
  { :alpha2 => 'AW', :name => 'Aruba', :alpha3 => 'ABW', :numeric => '533' },
79
+ { :alpha2 => 'AC', :name => 'Ascension Island', :alpha3 => 'ASC' },
80
80
  { :alpha2 => 'AU', :name => 'Australia', :alpha3 => 'AUS', :numeric => '036' },
81
81
  { :alpha2 => 'AT', :name => 'Austria', :alpha3 => 'AUT', :numeric => '040' },
82
82
  { :alpha2 => 'AZ', :name => 'Azerbaijan', :alpha3 => 'AZE', :numeric => '031' },
@@ -7,7 +7,9 @@ module ActiveUtils
7
7
  Timeout::Error => "The connection to the remote server timed out",
8
8
  Errno::ETIMEDOUT => "The connection to the remote server timed out",
9
9
  SocketError => "The connection to the remote server could not be established",
10
- OpenSSL::SSL::SSLError => "The SSL connection to the remote server could not be established"
10
+ OpenSSL::SSL::SSLError => "The SSL connection to the remote server could not be established",
11
+ Errno::EHOSTUNREACH => "The remote server could not be reached",
12
+ Errno::EADDRNOTAVAIL => "The remote server address is not available"
11
13
  }
12
14
 
13
15
  DEFAULT_RETRY_ERRORS = {
@@ -1,3 +1,3 @@
1
1
  module ActiveUtils
2
- VERSION = "3.4.1"
2
+ VERSION = "3.5.0"
3
3
  end
@@ -11,7 +11,7 @@ class ConnectionTest < Minitest::Test
11
11
  end
12
12
 
13
13
  def test_path_to_cert_is_correct
14
- assert File.exists?(ActiveUtils::Connection::CA_FILE)
14
+ assert File.file?(ActiveUtils::Connection::CA_FILE)
15
15
  end
16
16
 
17
17
  def test_connection_endpoint_parses_string_to_uri
@@ -130,8 +130,8 @@ class ConnectionTest < Minitest::Test
130
130
  assert_equal "/bogus", @connection.send(:http).ca_path
131
131
  end
132
132
 
133
- def test_default_proxy_address_is_nil
134
- assert_equal nil, @connection.proxy_address
133
+ def test_default_proxy_address_is_env
134
+ assert_equal :ENV, @connection.proxy_address
135
135
  end
136
136
 
137
137
  def test_default_proxy_port_is_nil
@@ -84,4 +84,10 @@ class CountryTest < Minitest::Test
84
84
  qatar = Country.find('Qatar')
85
85
  refute qatar.uses_postal_codes?
86
86
  end
87
+
88
+ def test_find_country_without_numeric_code
89
+ country = Country.find('ASC')
90
+ assert_equal 'Ascension Island', country.to_s
91
+ assert_nil country.code(:numeric)
92
+ end
87
93
  end
@@ -32,6 +32,24 @@ class NetworkConnectionRetriesTest < Minitest::Test
32
32
  assert_equal "The remote server reset the connection", raised.message
33
33
  end
34
34
 
35
+ def test_ehostunreach_raises_correctly
36
+ raised = assert_raises(ActiveUtils::ConnectionError) do
37
+ retry_exceptions do
38
+ raise Errno::EHOSTUNREACH
39
+ end
40
+ end
41
+ assert_equal "The remote server could not be reached", raised.message
42
+ end
43
+
44
+ def test_eaddrnotavail_raises_correctly
45
+ raised = assert_raises(ActiveUtils::ConnectionError) do
46
+ retry_exceptions do
47
+ raise Errno::EADDRNOTAVAIL
48
+ end
49
+ end
50
+ assert_equal "The remote server address is not available", raised.message
51
+ end
52
+
35
53
  def test_timeout_errors_raise_correctly
36
54
  exceptions = [Timeout::Error, Errno::ETIMEDOUT]
37
55
  if RUBY_VERSION >= '2.0.0'
@@ -2,7 +2,6 @@ require 'test_helper'
2
2
  require 'active_support/core_ext/class'
3
3
 
4
4
  class PostsDataTest < Minitest::Test
5
-
6
5
  class SSLPoster
7
6
  include PostsData
8
7
 
@@ -44,6 +43,8 @@ class PostsDataTest < Minitest::Test
44
43
 
45
44
  SSLPoster.ssl_strict = false
46
45
  @poster.raw_ssl_request(:post, "https://shopify.com", "", {})
46
+ ensure
47
+ SSLPoster.ssl_strict = true
47
48
  end
48
49
 
49
50
  def test_logger_warns_can_handle_non_string_endpoints
@@ -65,10 +66,15 @@ class PostsDataTest < Minitest::Test
65
66
  end
66
67
 
67
68
  def test_set_proxy_address_and_port
69
+ original_proxy_address = SSLPoster.proxy_address
70
+ original_proxy_port = SSLPoster.proxy_port
68
71
  SSLPoster.proxy_address = 'http://proxy.example.com'
69
72
  SSLPoster.proxy_port = '8888'
70
73
  assert_equal @poster.proxy_address, 'http://proxy.example.com'
71
74
  assert_equal @poster.proxy_port, '8888'
75
+ ensure
76
+ SSLPoster.proxy_address = original_proxy_address
77
+ SSLPoster.proxy_port = original_proxy_port
72
78
  end
73
79
 
74
80
  class HttpConnectionAbort < StandardError; end
metadata CHANGED
@@ -1,14 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: active_utils
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.4.1
4
+ version: 3.5.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Shopify
8
- autorequire:
9
8
  bindir: bin
10
9
  cert_chain: []
11
- date: 2023-04-04 00:00:00.000000000 Z
10
+ date: 2025-02-05 00:00:00.000000000 Z
12
11
  dependencies:
13
12
  - !ruby/object:Gem::Dependency
14
13
  name: activesupport
@@ -80,19 +79,23 @@ dependencies:
80
79
  - - ">="
81
80
  - !ruby/object:Gem::Version
82
81
  version: '0'
83
- description:
84
82
  email:
85
83
  - developers@jadedpixel.com
86
84
  executables: []
87
85
  extensions: []
88
86
  extra_rdoc_files: []
89
87
  files:
88
+ - ".github/dependabot.yml"
89
+ - ".github/workflows/.github/workflows/dependabot_auto_merge.yml"
90
+ - ".github/workflows/ci.yml"
90
91
  - ".github/workflows/cla.yml"
91
92
  - ".gitignore"
93
+ - ".ruby-version"
92
94
  - ".travis.yml"
93
95
  - CHANGELOG.md
94
96
  - CONTRIBUTING.md
95
97
  - Gemfile
98
+ - Gemfile.lock
96
99
  - MIT-LICENSE
97
100
  - README.md
98
101
  - Rakefile
@@ -128,7 +131,6 @@ licenses:
128
131
  - MIT
129
132
  metadata:
130
133
  allowed_push_host: https://rubygems.org
131
- post_install_message:
132
134
  rdoc_options: []
133
135
  require_paths:
134
136
  - lib
@@ -136,15 +138,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
136
138
  requirements:
137
139
  - - ">="
138
140
  - !ruby/object:Gem::Version
139
- version: '0'
141
+ version: '2.7'
140
142
  required_rubygems_version: !ruby/object:Gem::Requirement
141
143
  requirements:
142
144
  - - ">="
143
145
  - !ruby/object:Gem::Version
144
146
  version: '0'
145
147
  requirements: []
146
- rubygems_version: 3.4.10
147
- signing_key:
148
+ rubygems_version: 3.6.3
148
149
  specification_version: 4
149
150
  summary: Common utils used by active_merchant, active_fulfillment, and active_shipping
150
151
  test_files: []