From b6aa3c1c7941cb776c2faf60ba4dc342c9b5eb8d Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Sat, 14 Feb 2026 13:56:31 +0000 Subject: [PATCH 1/7] codegen metadata --- .stats.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.stats.yml b/.stats.yml index 3e20d4f..ac83981 100644 --- a/.stats.yml +++ b/.stats.yml @@ -1,4 +1,4 @@ configured_endpoints: 15 openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/hexlet%2Fcloudpayments-737bf804f9ef1282c03bc532fc392f69a6e00eb5d229fa39368ea8ca2ff02de1.yml openapi_spec_hash: 68aafd72cb1fa7266ab697cc29f73583 -config_hash: 33c8a1290e177bcab7a82d1fe4e9ecfd +config_hash: 7e3e36dabba4af552324a8ffefba23f5 From e100d4f1eb3433101355817d309ae3008b0faa06 Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Fri, 20 Feb 2026 11:40:52 +0000 Subject: [PATCH 2/7] chore(internal): remove mock server code --- scripts/mock | 41 ----------------------------------------- scripts/test | 46 ---------------------------------------------- 2 files changed, 87 deletions(-) delete mode 100755 scripts/mock diff --git a/scripts/mock b/scripts/mock deleted file mode 100755 index 0b28f6e..0000000 --- a/scripts/mock +++ /dev/null @@ -1,41 +0,0 @@ -#!/usr/bin/env bash - -set -e - -cd "$(dirname "$0")/.." - -if [[ -n "$1" && "$1" != '--'* ]]; then - URL="$1" - shift -else - URL="$(grep 'openapi_spec_url' .stats.yml | cut -d' ' -f2)" -fi - -# Check if the URL is empty -if [ -z "$URL" ]; then - echo "Error: No OpenAPI spec path/url provided or found in .stats.yml" - exit 1 -fi - -echo "==> Starting mock server with URL ${URL}" - -# Run prism mock on the given spec -if [ "$1" == "--daemon" ]; then - npm exec --package=@stainless-api/prism-cli@5.15.0 -- prism mock "$URL" &> .prism.log & - - # Wait for server to come online - echo -n "Waiting for server" - while ! grep -q "✖ fatal\|Prism is listening" ".prism.log" ; do - echo -n "." - sleep 0.1 - done - - if grep -q "✖ fatal" ".prism.log"; then - cat .prism.log - exit 1 - fi - - echo -else - npm exec --package=@stainless-api/prism-cli@5.15.0 -- prism mock "$URL" -fi diff --git a/scripts/test b/scripts/test index e0dc137..df8caf9 100755 --- a/scripts/test +++ b/scripts/test @@ -4,53 +4,7 @@ set -e cd -- "$(dirname -- "$0")/.." -RED='\033[0;31m' -GREEN='\033[0;32m' -YELLOW='\033[0;33m' -NC='\033[0m' # No Color -function prism_is_running() { - curl --silent "http://localhost:4010" >/dev/null 2>&1 -} - -kill_server_on_port() { - pids=$(lsof -t -i tcp:"$1" || echo "") - if [ "$pids" != "" ]; then - kill "$pids" - echo "Stopped $pids." - fi -} - -function is_overriding_api_base_url() { - [ -n "$TEST_API_BASE_URL" ] -} - -if ! is_overriding_api_base_url && ! prism_is_running ; then - # When we exit this script, make sure to kill the background mock server process - trap 'kill_server_on_port 4010' EXIT - - # Start the dev server - ./scripts/mock --daemon -fi - -if is_overriding_api_base_url ; then - echo -e "${GREEN}✔ Running tests against ${TEST_API_BASE_URL}${NC}" - echo -elif ! prism_is_running ; then - echo -e "${RED}ERROR:${NC} The test suite will not run without a mock Prism server" - echo -e "running against your OpenAPI spec." - echo - echo -e "To run the server, pass in the path or url of your OpenAPI" - echo -e "spec to the prism command:" - echo - echo -e " \$ ${YELLOW}npm exec --package=@stainless-api/prism-cli@5.15.0 -- prism mock path/to/your.openapi.yml${NC}" - echo - - exit 1 -else - echo -e "${GREEN}✔ Mock prism server is running with your OpenAPI spec${NC}" - echo -fi echo "==> Running tests" bundle exec rake test "$@" From 36a2a3788aa8b4638c9d41e2fe54a6cd4a939990 Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Fri, 20 Feb 2026 11:41:47 +0000 Subject: [PATCH 3/7] chore: update mock server docs --- CONTRIBUTING.md | 6 ------ test/cloudpayments_ruby/resources/orders_test.rb | 4 ++-- .../resources/payments/tokens_test.rb | 4 ++-- test/cloudpayments_ruby/resources/payments_test.rb | 12 ++++++------ .../resources/subscriptions_test.rb | 10 +++++----- 5 files changed, 15 insertions(+), 21 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index d38fc92..8d2514f 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -66,12 +66,6 @@ $ bundle exec rake ## Running tests -Most tests require you to [set up a mock server](https://github.com/stoplightio/prism) against the OpenAPI spec to run the tests. - -```bash -$ npx prism mock path/to/your/openapi.yml -``` - ```bash $ bundle exec rake test ``` diff --git a/test/cloudpayments_ruby/resources/orders_test.rb b/test/cloudpayments_ruby/resources/orders_test.rb index 392cfaf..c001bd8 100644 --- a/test/cloudpayments_ruby/resources/orders_test.rb +++ b/test/cloudpayments_ruby/resources/orders_test.rb @@ -4,7 +4,7 @@ class CloudpaymentsRuby::Test::Resources::OrdersTest < CloudpaymentsRuby::Test::ResourceTest def test_create_required_params - skip("Prism tests are disabled") + skip("Mock server tests are disabled") response = @cloudpayments.orders.create(amount: 0, description: "Description") @@ -22,7 +22,7 @@ def test_create_required_params end def test_cancel_required_params - skip("Prism tests are disabled") + skip("Mock server tests are disabled") response = @cloudpayments.orders.cancel(id: "Id") diff --git a/test/cloudpayments_ruby/resources/payments/tokens_test.rb b/test/cloudpayments_ruby/resources/payments/tokens_test.rb index bd866eb..ad1d045 100644 --- a/test/cloudpayments_ruby/resources/payments/tokens_test.rb +++ b/test/cloudpayments_ruby/resources/payments/tokens_test.rb @@ -4,7 +4,7 @@ class CloudpaymentsRuby::Test::Resources::Payments::TokensTest < CloudpaymentsRuby::Test::ResourceTest def test_auth_required_params - skip("Prism tests are disabled") + skip("Mock server tests are disabled") response = @cloudpayments.payments.tokens.auth( @@ -28,7 +28,7 @@ def test_auth_required_params end def test_charge_required_params - skip("Prism tests are disabled") + skip("Mock server tests are disabled") response = @cloudpayments.payments.tokens.charge( diff --git a/test/cloudpayments_ruby/resources/payments_test.rb b/test/cloudpayments_ruby/resources/payments_test.rb index b1322d7..4d0bc94 100644 --- a/test/cloudpayments_ruby/resources/payments_test.rb +++ b/test/cloudpayments_ruby/resources/payments_test.rb @@ -4,7 +4,7 @@ class CloudpaymentsRuby::Test::Resources::PaymentsTest < CloudpaymentsRuby::Test::ResourceTest def test_auth_required_params - skip("Prism tests are disabled") + skip("Mock server tests are disabled") response = @cloudpayments.payments.auth( @@ -26,7 +26,7 @@ def test_auth_required_params end def test_charge_required_params - skip("Prism tests are disabled") + skip("Mock server tests are disabled") response = @cloudpayments.payments.charge( @@ -48,7 +48,7 @@ def test_charge_required_params end def test_confirm_required_params - skip("Prism tests are disabled") + skip("Mock server tests are disabled") response = @cloudpayments.payments.confirm(amount: 0, transaction_id: 0) @@ -65,7 +65,7 @@ def test_confirm_required_params end def test_post3ds_required_params - skip("Prism tests are disabled") + skip("Mock server tests are disabled") response = @cloudpayments.payments.post3ds(pa_res: "PaRes", transaction_id: 0) @@ -83,7 +83,7 @@ def test_post3ds_required_params end def test_refund_required_params - skip("Prism tests are disabled") + skip("Mock server tests are disabled") response = @cloudpayments.payments.refund(amount: 0, transaction_id: 0) @@ -101,7 +101,7 @@ def test_refund_required_params end def test_void_required_params - skip("Prism tests are disabled") + skip("Mock server tests are disabled") response = @cloudpayments.payments.void(transaction_id: 0) diff --git a/test/cloudpayments_ruby/resources/subscriptions_test.rb b/test/cloudpayments_ruby/resources/subscriptions_test.rb index 3f49361..81df5bb 100644 --- a/test/cloudpayments_ruby/resources/subscriptions_test.rb +++ b/test/cloudpayments_ruby/resources/subscriptions_test.rb @@ -4,7 +4,7 @@ class CloudpaymentsRuby::Test::Resources::SubscriptionsTest < CloudpaymentsRuby::Test::ResourceTest def test_create_required_params - skip("Prism tests are disabled") + skip("Mock server tests are disabled") response = @cloudpayments.subscriptions.create( @@ -33,7 +33,7 @@ def test_create_required_params end def test_update_required_params - skip("Prism tests are disabled") + skip("Mock server tests are disabled") response = @cloudpayments.subscriptions.update(id: "Id") @@ -51,7 +51,7 @@ def test_update_required_params end def test_cancel_required_params - skip("Prism tests are disabled") + skip("Mock server tests are disabled") response = @cloudpayments.subscriptions.cancel(id: "Id") @@ -68,7 +68,7 @@ def test_cancel_required_params end def test_find_required_params - skip("Prism tests are disabled") + skip("Mock server tests are disabled") response = @cloudpayments.subscriptions.find(account_id: "AccountId") @@ -86,7 +86,7 @@ def test_find_required_params end def test_get_required_params - skip("Prism tests are disabled") + skip("Mock server tests are disabled") response = @cloudpayments.subscriptions.get(id: "Id") From 7cfd8204e2a9d7045d9a05045be6b525768455e0 Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Fri, 27 Feb 2026 13:25:31 +0000 Subject: [PATCH 4/7] fix: properly mock time in ruby ci tests --- test/cloudpayments_ruby/client_test.rb | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/test/cloudpayments_ruby/client_test.rb b/test/cloudpayments_ruby/client_test.rb index edaaec9..2048def 100644 --- a/test/cloudpayments_ruby/client_test.rb +++ b/test/cloudpayments_ruby/client_test.rb @@ -150,9 +150,11 @@ def test_client_retry_after_seconds end def test_client_retry_after_date + time_now = Time.now + stub_request(:post, "http://localhost/payments/cards/charge").to_return_json( status: 500, - headers: {"retry-after" => (Time.now + 10).httpdate}, + headers: {"retry-after" => (time_now + 10).httpdate}, body: {} ) @@ -164,15 +166,15 @@ def test_client_retry_after_date max_retries: 1 ) + Thread.current.thread_variable_set(:time_now, time_now) assert_raises(CloudpaymentsRuby::Errors::InternalServerError) do - Thread.current.thread_variable_set(:time_now, Time.now) cloudpayments.payments.charge( amount: 0, card_cryptogram_packet: "CardCryptogramPacket", ip_address: "IpAddress" ) - Thread.current.thread_variable_set(:time_now, nil) end + Thread.current.thread_variable_set(:time_now, nil) assert_requested(:any, /./, times: 2) assert_in_delta(10, Thread.current.thread_variable_get(:mock_sleep).last, 1.0) From 2fc991731a559b659f2dbe3ae53c130fda957533 Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Wed, 4 Mar 2026 07:40:17 +0000 Subject: [PATCH 5/7] chore(internal): codegen related update --- lib/cloudpayments_ruby/internal/util.rb | 31 ++++++++++++++++++++++++ rbi/cloudpayments_ruby/internal/util.rbi | 20 +++++++++++++++ sig/cloudpayments_ruby/internal/util.rbs | 10 ++++++++ 3 files changed, 61 insertions(+) diff --git a/lib/cloudpayments_ruby/internal/util.rb b/lib/cloudpayments_ruby/internal/util.rb index 0e31459..6e61be6 100644 --- a/lib/cloudpayments_ruby/internal/util.rb +++ b/lib/cloudpayments_ruby/internal/util.rb @@ -490,6 +490,37 @@ def writable_enum(&blk) JSONL_CONTENT = %r{^application/(:?x-(?:n|l)djson)|(:?(?:x-)?jsonl)} class << self + # @api private + # + # @param query [Hash{Symbol=>Object}] + # + # @return [Hash{Symbol=>Object}] + def encode_query_params(query) + out = {} + query.each { write_query_param_element!(out, _1, _2) } + out + end + + # @api private + # + # @param collection [Hash{Symbol=>Object}] + # @param key [String] + # @param element [Object] + # + # @return [nil] + private def write_query_param_element!(collection, key, element) + case element + in Hash + element.each do |name, value| + write_query_param_element!(collection, "#{key}[#{name}]", value) + end + in Array + collection[key] = element.map(&:to_s).join(",") + else + collection[key] = element.to_s + end + end + # @api private # # @param y [Enumerator::Yielder] diff --git a/rbi/cloudpayments_ruby/internal/util.rbi b/rbi/cloudpayments_ruby/internal/util.rbi index aef9b11..a72fb95 100644 --- a/rbi/cloudpayments_ruby/internal/util.rbi +++ b/rbi/cloudpayments_ruby/internal/util.rbi @@ -301,6 +301,26 @@ module CloudpaymentsRuby T.let(%r{^application/(:?x-(?:n|l)djson)|(:?(?:x-)?jsonl)}, Regexp) class << self + # @api private + sig do + params(query: CloudpaymentsRuby::Internal::AnyHash).returns( + CloudpaymentsRuby::Internal::AnyHash + ) + end + def encode_query_params(query) + end + + # @api private + sig do + params( + collection: CloudpaymentsRuby::Internal::AnyHash, + key: String, + element: T.anything + ).void + end + private def write_query_param_element!(collection, key, element) + end + # @api private sig do params( diff --git a/sig/cloudpayments_ruby/internal/util.rbs b/sig/cloudpayments_ruby/internal/util.rbs index 59ee066..7010a22 100644 --- a/sig/cloudpayments_ruby/internal/util.rbs +++ b/sig/cloudpayments_ruby/internal/util.rbs @@ -106,6 +106,16 @@ module CloudpaymentsRuby JSON_CONTENT: Regexp JSONL_CONTENT: Regexp + def encode_query_params: ( + ::Hash[Symbol, top] query + ) -> ::Hash[Symbol, top] + + private def write_query_param_element!: ( + ::Hash[Symbol, top] collection, + String key, + top element + ) -> nil + def self?.write_multipart_content: ( Enumerator::Yielder y, val: top, From 9287b3cf46dba9228ab6aa4472d7f0cc8a2e437d Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Wed, 4 Mar 2026 08:02:16 +0000 Subject: [PATCH 6/7] chore(ci): add build step --- .github/workflows/ci.yml | 34 ++++++++++ scripts/utils/upload-artifact.sh | 113 +++++++++++++++++++++++++++++++ 2 files changed, 147 insertions(+) create mode 100755 scripts/utils/upload-artifact.sh diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 7a90ed0..63b950f 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -13,6 +13,40 @@ on: - 'stl-preview-base/**' jobs: + build: + timeout-minutes: 10 + name: build + permissions: + contents: read + id-token: write + runs-on: ${{ github.repository == 'stainless-sdks/cloudpayments-ruby' && 'depot-ubuntu-24.04' || 'ubuntu-latest' }} + if: |- + github.repository == 'stainless-sdks/cloudpayments-ruby' && + (github.event_name == 'push' || github.event.pull_request.head.repo.fork) + steps: + - uses: actions/checkout@v6 + - name: Set up Ruby + uses: ruby/setup-ruby@v1 + with: + bundler-cache: false + - run: |- + bundle install + + - name: Get GitHub OIDC Token + if: github.repository == 'stainless-sdks/cloudpayments-ruby' + id: github-oidc + uses: actions/github-script@v8 + with: + script: core.setOutput('github_token', await core.getIDToken()); + + - name: Build and upload gem artifacts + if: github.repository == 'stainless-sdks/cloudpayments-ruby' + env: + URL: https://pkg.stainless.com/s + AUTH: ${{ steps.github-oidc.outputs.github_token }} + SHA: ${{ github.sha }} + PACKAGE_NAME: cloudpayments_ruby + run: ./scripts/utils/upload-artifact.sh lint: timeout-minutes: 10 name: lint diff --git a/scripts/utils/upload-artifact.sh b/scripts/utils/upload-artifact.sh new file mode 100755 index 0000000..4ce39b1 --- /dev/null +++ b/scripts/utils/upload-artifact.sh @@ -0,0 +1,113 @@ +#!/usr/bin/env bash + +set -euo pipefail + +# ANSI Color Codes +GREEN='\033[32m' +RED='\033[31m' +NC='\033[0m' # No Color + +DIST_DIR="dist" + +log_error() { + local msg="$1" + local headers="$2" + local body="$3" + echo -e "${RED}${msg}${NC}" + [[ -f "$headers" ]] && echo -e "${RED}Headers:$(cat "$headers")${NC}" + echo -e "${RED}Body: ${body}${NC}" + exit 1 +} + +upload_file() { + local file_name="$1" + local tmp_headers + tmp_headers=$(mktemp) + + if [ -f "$file_name" ]; then + echo -e "${GREEN}Processing file: $file_name${NC}" + pkg_file_name="${file_name#"${DIST_DIR}/"}" + + # Get signed URL for uploading artifact file + signed_url_response=$(curl -X POST -G "$URL" \ + -sS --retry 5 \ + -D "$tmp_headers" \ + --data-urlencode "filename=$pkg_file_name" \ + -H "Authorization: Bearer $AUTH" \ + -H "Content-Type: application/json") + + # Validate JSON and extract URL + if ! signed_url=$(echo "$signed_url_response" | jq -e -r '.url' 2>/dev/null) || [[ "$signed_url" == "null" ]]; then + log_error "Failed to get valid signed URL" "$tmp_headers" "$signed_url_response" + fi + + # Set content-type based on file extension + local extension="${file_name##*.}" + local content_type + case "$extension" in + gem) content_type="application/octet-stream" ;; + gz) content_type="application/gzip" ;; + rz) content_type="application/octet-stream" ;; + html) content_type="text/html" ;; + *) content_type="application/octet-stream" ;; + esac + + # Upload file + upload_response=$(curl -v -X PUT \ + --retry 5 \ + --retry-all-errors \ + -D "$tmp_headers" \ + -H "Content-Type: $content_type" \ + --data-binary "@${file_name}" "$signed_url" 2>&1) + + if ! echo "$upload_response" | grep -q "HTTP/[0-9.]* 200"; then + log_error "Failed to upload artifact file" "$tmp_headers" "$upload_response" + fi + + # Insert small throttle to reduce rate limiting risk + sleep 0.1 + fi +} + +walk_tree() { + local current_dir="$1" + + for entry in "$current_dir"/*; do + # Check that entry is valid + [ -e "$entry" ] || [ -h "$entry" ] || continue + + if [ -d "$entry" ]; then + walk_tree "$entry" + else + upload_file "$entry" + fi + done +} + +cd "$(dirname "$0")/../.." + +echo "::group::Building gem" +VERSION_FILE="lib/${PACKAGE_NAME}/version.rb" +if [[ ! -f "$VERSION_FILE" ]]; then + echo -e "${RED}Version file not found: ${VERSION_FILE}${NC}" + exit 1 +fi +SHORT_SHA="${SHA:0:7}" +sed -i.bak -E "s/(VERSION = \"[^\"]+)\"/\1.beta.${SHORT_SHA}\"/" "$VERSION_FILE" +rm -f "${VERSION_FILE}.bak" + +gem build +mkdir -p "${DIST_DIR}/gems" +mv ./*.gem "${DIST_DIR}/gems/" +echo "::endgroup::" + +echo "::group::Generating gem index" +gem generate_index --directory "$DIST_DIR" +echo "::endgroup::" + +echo "::group::Uploading to pkg.stainless.com" +walk_tree "$DIST_DIR" +echo "::endgroup::" + +echo -e "${GREEN}Gem artifacts uploaded to Stainless storage.${NC}" +echo -e "\033[32mInstallation: bundle remove cloudpayments-ruby && bundle add cloudpayments-ruby --source 'https://pkg.stainless.com/s/cloudpayments-ruby/$SHA'\033[0m" From c153296a1139868895b2c0bc49cba13147982141 Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Wed, 4 Mar 2026 08:02:35 +0000 Subject: [PATCH 7/7] release: 0.4.2 --- .release-please-manifest.json | 2 +- CHANGELOG.md | 16 ++++++++++++++++ Gemfile.lock | 2 +- README.md | 2 +- lib/cloudpayments_ruby/version.rb | 2 +- 5 files changed, 20 insertions(+), 4 deletions(-) diff --git a/.release-please-manifest.json b/.release-please-manifest.json index 3e2bf49..980ea05 100644 --- a/.release-please-manifest.json +++ b/.release-please-manifest.json @@ -1,3 +1,3 @@ { - ".": "0.4.1" + ".": "0.4.2" } \ No newline at end of file diff --git a/CHANGELOG.md b/CHANGELOG.md index be1a340..5f2ecbe 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,21 @@ # Changelog +## 0.4.2 (2026-03-04) + +Full Changelog: [v0.4.1...v0.4.2](https://github.com/Hexlet/cloudpayments-ruby/compare/v0.4.1...v0.4.2) + +### Bug Fixes + +* properly mock time in ruby ci tests ([7cfd820](https://github.com/Hexlet/cloudpayments-ruby/commit/7cfd8204e2a9d7045d9a05045be6b525768455e0)) + + +### Chores + +* **ci:** add build step ([9287b3c](https://github.com/Hexlet/cloudpayments-ruby/commit/9287b3cf46dba9228ab6aa4472d7f0cc8a2e437d)) +* **internal:** codegen related update ([2fc9917](https://github.com/Hexlet/cloudpayments-ruby/commit/2fc991731a559b659f2dbe3ae53c130fda957533)) +* **internal:** remove mock server code ([e100d4f](https://github.com/Hexlet/cloudpayments-ruby/commit/e100d4f1eb3433101355817d309ae3008b0faa06)) +* update mock server docs ([36a2a37](https://github.com/Hexlet/cloudpayments-ruby/commit/36a2a3788aa8b4638c9d41e2fe54a6cd4a939990)) + ## 0.4.1 (2026-02-13) Full Changelog: [v0.4.0...v0.4.1](https://github.com/Hexlet/cloudpayments-ruby/compare/v0.4.0...v0.4.1) diff --git a/Gemfile.lock b/Gemfile.lock index a8d38fb..660c30e 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -11,7 +11,7 @@ GIT PATH remote: . specs: - cloudpayments-ruby (0.4.1) + cloudpayments-ruby (0.4.2) cgi connection_pool diff --git a/README.md b/README.md index 91fdbde..4dd30b8 100644 --- a/README.md +++ b/README.md @@ -15,7 +15,7 @@ To use this gem, install via Bundler by adding the following to your application ```ruby -gem "cloudpayments-ruby", "~> 0.4.1" +gem "cloudpayments-ruby", "~> 0.4.2" ``` diff --git a/lib/cloudpayments_ruby/version.rb b/lib/cloudpayments_ruby/version.rb index e6fd350..9b7fe58 100644 --- a/lib/cloudpayments_ruby/version.rb +++ b/lib/cloudpayments_ruby/version.rb @@ -1,5 +1,5 @@ # frozen_string_literal: true module CloudpaymentsRuby - VERSION = "0.4.1" + VERSION = "0.4.2" end