From a42bcbee431f761a878af10173be9f1b250d4857 Mon Sep 17 00:00:00 2001 From: Owens Ehimen Date: Tue, 20 Oct 2026 09:20:21 -0400 Subject: [PATCH 1/6] Return nil from member#details when Identity responds 404 (CON-1324) Callers such as Tokyo already treat a nil member as \"not found\"; avoid raising Faraday::ResourceNotFound for missing members. Bump to 0.1.5. --- VERSION | 2 +- identity-api-client.gemspec | 6 +++--- lib/identity-api-client/member.rb | 2 ++ spec/member_spec.rb | 10 ++++++++++ 4 files changed, 16 insertions(+), 4 deletions(-) diff --git a/VERSION b/VERSION index 446ba66..9faa1b7 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -0.1.4 \ No newline at end of file +0.1.5 diff --git a/identity-api-client.gemspec b/identity-api-client.gemspec index c5df5c1..417e25b 100644 --- a/identity-api-client.gemspec +++ b/identity-api-client.gemspec @@ -2,16 +2,16 @@ # DO NOT EDIT THIS FILE DIRECTLY # Instead, edit Juwelier::Tasks in Rakefile, and run 'rake gemspec' # -*- encoding: utf-8 -*- -# stub: identity-api-client 0.1.4 ruby lib +# stub: identity-api-client 0.1.5 ruby lib Gem::Specification.new do |s| s.name = "identity-api-client".freeze - s.version = "0.1.4" + s.version = "0.1.5" s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version= s.require_paths = ["lib".freeze] s.authors = ["Nathan Woodhull".freeze] - s.date = "2021-12-14" + s.date = "2026-10-20" s.description = "Provides a simple ruby binding to 38dgs identity API".freeze s.email = "nathan@controlshiftlabs.com".freeze s.extra_rdoc_files = [ diff --git a/lib/identity-api-client/member.rb b/lib/identity-api-client/member.rb index 786a7d0..8859eaf 100644 --- a/lib/identity-api-client/member.rb +++ b/lib/identity-api-client/member.rb @@ -15,6 +15,8 @@ def details(guid: nil, email: nil, load_current_consents: false) resp = client.post_request('/api/member/details', params) resp.body + rescue Faraday::ResourceNotFound + nil end end end diff --git a/spec/member_spec.rb b/spec/member_spec.rb index f8f0a19..f7d1948 100644 --- a/spec/member_spec.rb +++ b/spec/member_spec.rb @@ -11,6 +11,16 @@ expect { subject.member.details() }.to raise_error "Must have one of guid or email" end end + + context 'when Identity responds with 404' do + before(:each) do + stub_post(request_path).to_return(status: 404, body: '404 page not found') + end + + it 'returns nil instead of raising' do + expect(subject.member.details(guid: 'abcdef1234567890')).to be_nil + end + end end describe 'success' do From 01e07bb71e36a8b94b79135069333075f71d54a2 Mon Sep 17 00:00:00 2001 From: Owens Ehimen Date: Tue, 20 Oct 2026 09:24:50 -0400 Subject: [PATCH 2/6] Modernize Ruby/CI and align with Vertebrae 2 (CON-1324) - Ruby 3.4+ (local/CI 4.0), refresh GitHub Actions and commit Gemfile.lock - Require vertebrae >= 2.0; replace juwelier with a hand-maintained gemspec - Handle 404 via Vertebrae::ResponseError and Faraday::ResourceNotFound - JSON.generate for request bodies; fix WebMock stubs for Vertebrae paths --- .github/workflows/ci.yml | 17 ++-- .gitignore | 1 - .ruby-version | 2 +- Gemfile | 18 +--- Gemfile.lock | 160 ++++++++++++++++++++++++++++++ Rakefile | 15 --- identity-api-client.gemspec | 96 +++++------------- lib/identity-api-client/client.rb | 4 +- lib/identity-api-client/member.rb | 4 + spec/member_spec.rb | 7 +- spec/spec_helper.rb | 3 +- 11 files changed, 211 insertions(+), 116 deletions(-) create mode 100644 Gemfile.lock diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 97c0804..3fcb839 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -4,21 +4,22 @@ on: [push] jobs: test: runs-on: ubuntu-latest + strategy: + matrix: + ruby-version: ['3.4', '4.0'] steps: - - uses: actions/checkout@v2 - - uses: ruby/setup-ruby@477b21f02be01bcb8030d50f37cfec92bfa615b6 + - uses: actions/checkout@v4 + - uses: ruby/setup-ruby@v1 with: - ruby-version: 2.7 + ruby-version: ${{ matrix.ruby-version }} bundler-cache: true - - run: bundle install - run: bundle exec rspec rubocop: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v2 - - uses: ruby/setup-ruby@477b21f02be01bcb8030d50f37cfec92bfa615b6 + - uses: actions/checkout@v4 + - uses: ruby/setup-ruby@v1 with: - ruby-version: 2.7 + ruby-version: '4.0' bundler-cache: true - - run: bundle install - run: bundle exec rubocop diff --git a/.gitignore b/.gitignore index 6a4ab06..131d747 100644 --- a/.gitignore +++ b/.gitignore @@ -11,7 +11,6 @@ doc # bundler .bundle -Gemfile.lock # juwelier generated pkg diff --git a/.ruby-version b/.ruby-version index a4dd9db..43beb40 100644 --- a/.ruby-version +++ b/.ruby-version @@ -1 +1 @@ -2.7.4 +4.0.7 diff --git a/Gemfile b/Gemfile index a208771..7f4f5e9 100644 --- a/Gemfile +++ b/Gemfile @@ -1,17 +1,5 @@ -source 'https://rubygems.org' +# frozen_string_literal: true -gem 'vertebrae', '> 0.5' +source 'https://rubygems.org' -# Add dependencies to develop your gem here. -# Include everything needed to run rake, tests, features, etc. -group :development do - gem 'pry', '~> 0.10' - gem 'pry-byebug', '~> 3.4' - gem 'webmock', '~> 3.0', '>= 3.0.1' - gem 'rspec', '~> 3.6' - gem 'rdoc', ">= 6.3.1" - gem 'bundler' - gem 'juwelier' - gem 'simplecov', ">= 0" - gem 'rubocop' -end +gemspec diff --git a/Gemfile.lock b/Gemfile.lock new file mode 100644 index 0000000..5f96907 --- /dev/null +++ b/Gemfile.lock @@ -0,0 +1,160 @@ +PATH + remote: . + specs: + identity-api-client (0.1.5) + vertebrae (>= 2.0, < 3.0) + +GEM + remote: https://rubygems.org/ + specs: + activesupport (8.1.4) + base64 + bigdecimal + concurrent-ruby (~> 1.0, >= 1.3.1) + connection_pool (>= 2.2.5) + drb + i18n (>= 1.6, < 2) + json + logger (>= 1.4.2) + minitest (>= 5.1) + securerandom (>= 0.3) + tzinfo (~> 2.0, >= 2.0.5) + uri (>= 0.13.1) + addressable (2.9.0) + public_suffix (>= 2.0.2, < 8.0) + ast (2.4.3) + base64 (0.3.0) + bigdecimal (4.1.3) + byebug (13.0.0) + reline (>= 0.6.0) + coderay (1.1.3) + concurrent-ruby (1.3.8) + connection_pool (3.0.2) + crack (1.0.1) + bigdecimal + rexml + diff-lcs (1.6.2) + drb (2.2.3) + erb (6.0.7) + faraday (2.15.0) + faraday-net_http (>= 2.0, < 3.6) + json + logger + faraday-mashify (1.0.3) + faraday (~> 2.0) + hashie + faraday-multipart (1.2.0) + multipart-post (~> 2.0) + faraday-net_http (3.5.0) + net-http (~> 0.5) + hashdiff (1.2.1) + hashie (3.6.0) + i18n (1.15.2) + concurrent-ruby (~> 1.0) + io-console (0.9.4) + json (3.1.0) + language_server-protocol (3.17.0.6) + lint_roller (1.1.0) + logger (1.7.0) + method_source (1.1.0) + minitest (6.0.6) + drb (~> 2.0) + prism (~> 1.5) + multipart-post (2.4.1) + net-http (0.10.0) + net-protocol (>= 0.3.0) + uri (>= 0.11.1) + net-protocol (0.4.0) + timeout + parallel (2.3.0) + parser (3.3.12.0) + ast (~> 2.4.1) + racc + prism (1.9.0) + pry (0.16.1) + coderay (~> 1.1) + method_source (~> 1.0) + reline (>= 0.6.0) + pry-byebug (3.12.0) + byebug (~> 13.0) + pry (>= 0.13, < 0.17) + public_suffix (7.0.5) + racc (1.8.1) + rainbow (3.1.1) + rbs (4.2.0) + logger + prism (>= 1.6.0) + tsort + rdoc (8.1.0) + erb + prism (>= 1.6.0) + rbs (>= 4.0.0) + tsort + regexp_parser (2.13.1) + reline (0.7.0) + io-console (~> 0.5) + rexml (3.4.4) + rspec (3.13.2) + rspec-core (~> 3.13.0) + rspec-expectations (~> 3.13.0) + rspec-mocks (~> 3.13.0) + rspec-core (3.13.6) + rspec-support (~> 3.13.0) + rspec-expectations (3.13.5) + diff-lcs (>= 1.2.0, < 2.0) + rspec-support (~> 3.13.0) + rspec-mocks (3.13.8) + diff-lcs (>= 1.2.0, < 2.0) + rspec-support (~> 3.13.0) + rspec-support (3.13.7) + rubocop (1.92.0) + json (>= 2.3) + language_server-protocol (~> 3.17.0.2) + lint_roller (~> 1.1.0) + parallel (>= 1.10) + parser (>= 3.3.0.2) + rainbow (>= 2.2.2, < 4.0) + regexp_parser (>= 2.11.3, < 3.0) + rubocop-ast (>= 1.49.0, < 2.0) + ruby-progressbar (~> 1.7) + unicode-display_width (>= 2.4.0, < 4.0) + rubocop-ast (1.50.0) + parser (>= 3.3.7.2) + prism (~> 1.7) + ruby-progressbar (1.13.0) + securerandom (0.4.1) + simplecov (1.3.2) + timeout (0.6.1) + tsort (0.2.0) + tzinfo (2.0.6) + concurrent-ruby (~> 1.0) + unicode-display_width (3.3.0) + unicode-emoji (~> 4.3) + unicode-emoji (4.3.0) + uri (1.1.2) + vertebrae (2.0.0) + activesupport (>= 6.1) + faraday (~> 2.0) + faraday-mashify (~> 1.0) + faraday-multipart (~> 1.0) + webmock (3.34.0) + addressable (>= 2.8.0) + crack (>= 0.3.2) + hashdiff (>= 0.4.0, < 2.0.0) + +PLATFORMS + ruby + +DEPENDENCIES + bundler (>= 2.4) + identity-api-client! + pry (~> 0.10) + pry-byebug (~> 3.4) + rdoc (>= 6.3.1) + rspec (~> 3.6) + rubocop + simplecov + webmock (~> 3.0, >= 3.0.1) + +BUNDLED WITH + 4.0.20 diff --git a/Rakefile b/Rakefile index 0701d86..91c5565 100644 --- a/Rakefile +++ b/Rakefile @@ -11,21 +11,6 @@ rescue Bundler::BundlerError => e end require 'rake' -require 'juwelier' -Juwelier::Tasks.new do |gem| - # gem is a Gem::Specification... see http://guides.rubygems.org/specification-reference/ for more options - gem.name = "identity-api-client" - gem.homepage = "http://github.com/controlshift/identity-api-client" - gem.license = "MIT" - gem.summary = %Q{API Client for 38 Degree's Identity API} - gem.description = %Q{Provides a simple ruby binding to 38dgs identity API} - gem.email = 'nathan@controlshiftlabs.com' - gem.authors = ['Nathan Woodhull'] - - # dependencies defined in Gemfile -end -Juwelier::RubygemsDotOrgTasks.new - require 'rspec/core' require 'rspec/core/rake_task' RSpec::Core::RakeTask.new(:spec) do |spec| diff --git a/identity-api-client.gemspec b/identity-api-client.gemspec index 417e25b..bd116cd 100644 --- a/identity-api-client.gemspec +++ b/identity-api-client.gemspec @@ -1,77 +1,31 @@ -# Generated by juwelier -# DO NOT EDIT THIS FILE DIRECTLY -# Instead, edit Juwelier::Tasks in Rakefile, and run 'rake gemspec' -# -*- encoding: utf-8 -*- -# stub: identity-api-client 0.1.5 ruby lib +# frozen_string_literal: true -Gem::Specification.new do |s| - s.name = "identity-api-client".freeze - s.version = "0.1.5" +version = File.read(File.join(__dir__, 'VERSION')).strip - s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version= - s.require_paths = ["lib".freeze] - s.authors = ["Nathan Woodhull".freeze] - s.date = "2026-10-20" - s.description = "Provides a simple ruby binding to 38dgs identity API".freeze - s.email = "nathan@controlshiftlabs.com".freeze - s.extra_rdoc_files = [ - "LICENSE", - "README.md" - ] - s.files = [ - ".document", - ".github/workflows/ci.yml", - ".rspec", - ".rubocop.yml", - ".ruby-gemset", - ".ruby-version", - "Gemfile", - "LICENSE", - "README.md", - "Rakefile", - "VERSION", - "identity-api-client.gemspec", - "lib/identity-api-client.rb", - "lib/identity-api-client/base.rb", - "lib/identity-api-client/client.rb", - "lib/identity-api-client/member.rb", - "spec/client_spec.rb", - "spec/fixtures/details.json", - "spec/fixtures/details_with_consents.json", - "spec/member_spec.rb", - "spec/spec_helper.rb" - ] - s.homepage = "http://github.com/controlshift/identity-api-client".freeze - s.licenses = ["MIT".freeze] - s.rubygems_version = "3.1.6".freeze - s.summary = "API Client for 38 Degree's Identity API".freeze +Gem::Specification.new do |s| + s.name = 'identity-api-client' + s.version = version + s.authors = ['Nathan Woodhull'] + s.email = 'nathan@controlshiftlabs.com' + s.homepage = 'https://github.com/controlshift/identity-api-client' + s.license = 'MIT' + s.summary = "API Client for 38 Degree's Identity API" + s.description = 'Provides a simple ruby binding to 38dgs identity API' + s.required_ruby_version = '>= 3.4.0' - if s.respond_to? :specification_version then - s.specification_version = 4 + s.files = Dir.chdir(__dir__) do + `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^pkg/}) } end + s.require_paths = ['lib'] - if s.respond_to? :add_runtime_dependency then - s.add_runtime_dependency(%q.freeze, ["> 0.5"]) - s.add_development_dependency(%q.freeze, ["~> 0.10"]) - s.add_development_dependency(%q.freeze, ["~> 3.4"]) - s.add_development_dependency(%q.freeze, ["~> 3.0", ">= 3.0.1"]) - s.add_development_dependency(%q.freeze, ["~> 3.6"]) - s.add_development_dependency(%q.freeze, [">= 6.3.1"]) - s.add_development_dependency(%q.freeze, [">= 0"]) - s.add_development_dependency(%q.freeze, [">= 0"]) - s.add_development_dependency(%q.freeze, [">= 0"]) - s.add_development_dependency(%q.freeze, [">= 0"]) - else - s.add_dependency(%q.freeze, ["> 0.5"]) - s.add_dependency(%q.freeze, ["~> 0.10"]) - s.add_dependency(%q.freeze, ["~> 3.4"]) - s.add_dependency(%q.freeze, ["~> 3.0", ">= 3.0.1"]) - s.add_dependency(%q.freeze, ["~> 3.6"]) - s.add_dependency(%q.freeze, [">= 6.3.1"]) - s.add_dependency(%q.freeze, [">= 0"]) - s.add_dependency(%q.freeze, [">= 0"]) - s.add_dependency(%q.freeze, [">= 0"]) - s.add_dependency(%q.freeze, [">= 0"]) - end -end + s.add_runtime_dependency 'vertebrae', '>= 2.0', '< 3.0' + s.add_development_dependency 'bundler', '>= 2.4' + s.add_development_dependency 'pry', '~> 0.10' + s.add_development_dependency 'pry-byebug', '~> 3.4' + s.add_development_dependency 'rdoc', '>= 6.3.1' + s.add_development_dependency 'rspec', '~> 3.6' + s.add_development_dependency 'rubocop', '>= 0' + s.add_development_dependency 'simplecov', '>= 0' + s.add_development_dependency 'webmock', '~> 3.0', '>= 3.0.1' +end diff --git a/lib/identity-api-client/client.rb b/lib/identity-api-client/client.rb index 2db85fe..8ac43f5 100644 --- a/lib/identity-api-client/client.rb +++ b/lib/identity-api-client/client.rb @@ -1,3 +1,5 @@ +require 'json' + module IdentityApiClient class Client < Vertebrae::API def member @@ -7,7 +9,7 @@ def member private def extract_data_from_params(params) - params.to_json + JSON.generate(params) end def default_options diff --git a/lib/identity-api-client/member.rb b/lib/identity-api-client/member.rb index 8859eaf..046528e 100644 --- a/lib/identity-api-client/member.rb +++ b/lib/identity-api-client/member.rb @@ -15,6 +15,10 @@ def details(guid: nil, email: nil, load_current_consents: false) resp = client.post_request('/api/member/details', params) resp.body + rescue Vertebrae::ResponseError => e + return nil if e.status_code == 404 + + raise rescue Faraday::ResourceNotFound nil end diff --git a/spec/member_spec.rb b/spec/member_spec.rb index f7d1948..661fe49 100644 --- a/spec/member_spec.rb +++ b/spec/member_spec.rb @@ -1,3 +1,4 @@ +require 'json' require File.expand_path(File.dirname(__FILE__) + '/spec_helper') describe IdentityApiClient::Member do @@ -32,7 +33,7 @@ end context 'without load_current_consents' do - let(:expected_request) { {'guid' => 'abcdef1234567890', 'api_token' => '1234567890abcdef'}.to_json } + let(:expected_request) { JSON.generate('guid' => 'abcdef1234567890', 'api_token' => '1234567890abcdef') } let(:body) { fixture('details.json') } it 'should get member details back from the API' do @@ -46,7 +47,7 @@ context 'with load_current_consents' do - let(:expected_request) { {'guid' => 'abcdef1234567890', 'api_token' => '1234567890abcdef', 'load_current_consents' => true}.to_json } + let(:expected_request) { JSON.generate('guid' => 'abcdef1234567890', 'api_token' => '1234567890abcdef', 'load_current_consents' => true) } let(:body) { fixture('details_with_consents.json') } it 'should get member details with consents back from the API' do @@ -62,7 +63,7 @@ end context 'with email passed' do - let(:expected_request) { {'email' => 'test@example.com', 'api_token' => '1234567890abcdef'}.to_json } + let(:expected_request) { JSON.generate('email' => 'test@example.com', 'api_token' => '1234567890abcdef') } let(:body) { fixture('details.json') } it 'should get member details back from the API' do diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb index bdfb816..fce5fcc 100644 --- a/spec/spec_helper.rb +++ b/spec/spec_helper.rb @@ -30,7 +30,8 @@ def stub_post(path) end def stub_identity_request(method, path) - stub_request(method, "https://test.com" + path) + path_suffix = path.to_s.delete_prefix('/') + stub_request(method, %r{\Ahttps://test\.com/+#{Regexp.escape(path_suffix)}\z}) end def fixture_path From 5b90271a774857135d4d0abd9e557562cb2c3cce Mon Sep 17 00:00:00 2001 From: Owens Ehimen Date: Tue, 20 Oct 2026 09:26:03 -0400 Subject: [PATCH 3/6] Add Owens Ehimen, Diego Marcet, and Grey Moore as gem authors --- identity-api-client.gemspec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/identity-api-client.gemspec b/identity-api-client.gemspec index bd116cd..b1e9d9b 100644 --- a/identity-api-client.gemspec +++ b/identity-api-client.gemspec @@ -5,7 +5,7 @@ version = File.read(File.join(__dir__, 'VERSION')).strip Gem::Specification.new do |s| s.name = 'identity-api-client' s.version = version - s.authors = ['Nathan Woodhull'] + s.authors = ['Nathan Woodhull', 'Owens Ehimen', 'Diego Marcet', 'Grey Moore'] s.email = 'nathan@controlshiftlabs.com' s.homepage = 'https://github.com/controlshift/identity-api-client' s.license = 'MIT' From 9df6e934d44f435ba069f59a4f0820580b66e938 Mon Sep 17 00:00:00 2001 From: Owens Ehimen Date: Tue, 20 Oct 2026 12:11:37 -0400 Subject: [PATCH 4/6] Address PR review feedback (CON-1324) - Bump to 1.0.0; drop committed Gemfile.lock - Update gemspec metadata, exclude spec/, use vertebrae ~> 2.0 - Revert to params.to_json; rescue only Faraday::ResourceNotFound --- .gitignore | 1 + Gemfile.lock | 160 ------------------------------ README.md | 2 +- VERSION | 2 +- identity-api-client.gemspec | 11 +- lib/identity-api-client/client.rb | 4 +- lib/identity-api-client/member.rb | 4 - spec/member_spec.rb | 7 +- 8 files changed, 12 insertions(+), 179 deletions(-) delete mode 100644 Gemfile.lock diff --git a/.gitignore b/.gitignore index 131d747..6a4ab06 100644 --- a/.gitignore +++ b/.gitignore @@ -11,6 +11,7 @@ doc # bundler .bundle +Gemfile.lock # juwelier generated pkg diff --git a/Gemfile.lock b/Gemfile.lock deleted file mode 100644 index 5f96907..0000000 --- a/Gemfile.lock +++ /dev/null @@ -1,160 +0,0 @@ -PATH - remote: . - specs: - identity-api-client (0.1.5) - vertebrae (>= 2.0, < 3.0) - -GEM - remote: https://rubygems.org/ - specs: - activesupport (8.1.4) - base64 - bigdecimal - concurrent-ruby (~> 1.0, >= 1.3.1) - connection_pool (>= 2.2.5) - drb - i18n (>= 1.6, < 2) - json - logger (>= 1.4.2) - minitest (>= 5.1) - securerandom (>= 0.3) - tzinfo (~> 2.0, >= 2.0.5) - uri (>= 0.13.1) - addressable (2.9.0) - public_suffix (>= 2.0.2, < 8.0) - ast (2.4.3) - base64 (0.3.0) - bigdecimal (4.1.3) - byebug (13.0.0) - reline (>= 0.6.0) - coderay (1.1.3) - concurrent-ruby (1.3.8) - connection_pool (3.0.2) - crack (1.0.1) - bigdecimal - rexml - diff-lcs (1.6.2) - drb (2.2.3) - erb (6.0.7) - faraday (2.15.0) - faraday-net_http (>= 2.0, < 3.6) - json - logger - faraday-mashify (1.0.3) - faraday (~> 2.0) - hashie - faraday-multipart (1.2.0) - multipart-post (~> 2.0) - faraday-net_http (3.5.0) - net-http (~> 0.5) - hashdiff (1.2.1) - hashie (3.6.0) - i18n (1.15.2) - concurrent-ruby (~> 1.0) - io-console (0.9.4) - json (3.1.0) - language_server-protocol (3.17.0.6) - lint_roller (1.1.0) - logger (1.7.0) - method_source (1.1.0) - minitest (6.0.6) - drb (~> 2.0) - prism (~> 1.5) - multipart-post (2.4.1) - net-http (0.10.0) - net-protocol (>= 0.3.0) - uri (>= 0.11.1) - net-protocol (0.4.0) - timeout - parallel (2.3.0) - parser (3.3.12.0) - ast (~> 2.4.1) - racc - prism (1.9.0) - pry (0.16.1) - coderay (~> 1.1) - method_source (~> 1.0) - reline (>= 0.6.0) - pry-byebug (3.12.0) - byebug (~> 13.0) - pry (>= 0.13, < 0.17) - public_suffix (7.0.5) - racc (1.8.1) - rainbow (3.1.1) - rbs (4.2.0) - logger - prism (>= 1.6.0) - tsort - rdoc (8.1.0) - erb - prism (>= 1.6.0) - rbs (>= 4.0.0) - tsort - regexp_parser (2.13.1) - reline (0.7.0) - io-console (~> 0.5) - rexml (3.4.4) - rspec (3.13.2) - rspec-core (~> 3.13.0) - rspec-expectations (~> 3.13.0) - rspec-mocks (~> 3.13.0) - rspec-core (3.13.6) - rspec-support (~> 3.13.0) - rspec-expectations (3.13.5) - diff-lcs (>= 1.2.0, < 2.0) - rspec-support (~> 3.13.0) - rspec-mocks (3.13.8) - diff-lcs (>= 1.2.0, < 2.0) - rspec-support (~> 3.13.0) - rspec-support (3.13.7) - rubocop (1.92.0) - json (>= 2.3) - language_server-protocol (~> 3.17.0.2) - lint_roller (~> 1.1.0) - parallel (>= 1.10) - parser (>= 3.3.0.2) - rainbow (>= 2.2.2, < 4.0) - regexp_parser (>= 2.11.3, < 3.0) - rubocop-ast (>= 1.49.0, < 2.0) - ruby-progressbar (~> 1.7) - unicode-display_width (>= 2.4.0, < 4.0) - rubocop-ast (1.50.0) - parser (>= 3.3.7.2) - prism (~> 1.7) - ruby-progressbar (1.13.0) - securerandom (0.4.1) - simplecov (1.3.2) - timeout (0.6.1) - tsort (0.2.0) - tzinfo (2.0.6) - concurrent-ruby (~> 1.0) - unicode-display_width (3.3.0) - unicode-emoji (~> 4.3) - unicode-emoji (4.3.0) - uri (1.1.2) - vertebrae (2.0.0) - activesupport (>= 6.1) - faraday (~> 2.0) - faraday-mashify (~> 1.0) - faraday-multipart (~> 1.0) - webmock (3.34.0) - addressable (>= 2.8.0) - crack (>= 0.3.2) - hashdiff (>= 0.4.0, < 2.0.0) - -PLATFORMS - ruby - -DEPENDENCIES - bundler (>= 2.4) - identity-api-client! - pry (~> 0.10) - pry-byebug (~> 3.4) - rdoc (>= 6.3.1) - rspec (~> 3.6) - rubocop - simplecov - webmock (~> 3.0, >= 3.0.1) - -BUNDLED WITH - 4.0.20 diff --git a/README.md b/README.md index 8366dac..c3aa160 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ [![CI Status](https://github.com/controlshift/identity-api-client/actions/workflows/ci.yml/badge.svg)](https://github.com/controlshift/identity-api-client/actions/workflows/ci.yml) -API Client for 38 Degree's Identity API +API client for the [Identity](https://github.com/controlshift/identity) service ## Install diff --git a/VERSION b/VERSION index 9faa1b7..3eefcb9 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -0.1.5 +1.0.0 diff --git a/identity-api-client.gemspec b/identity-api-client.gemspec index b1e9d9b..ce65fbb 100644 --- a/identity-api-client.gemspec +++ b/identity-api-client.gemspec @@ -6,21 +6,20 @@ Gem::Specification.new do |s| s.name = 'identity-api-client' s.version = version s.authors = ['Nathan Woodhull', 'Owens Ehimen', 'Diego Marcet', 'Grey Moore'] - s.email = 'nathan@controlshiftlabs.com' + s.email = ['talk@controlshiftlabs.com'] s.homepage = 'https://github.com/controlshift/identity-api-client' s.license = 'MIT' - s.summary = "API Client for 38 Degree's Identity API" - s.description = 'Provides a simple ruby binding to 38dgs identity API' + s.summary = 'API client for the Identity service' + s.description = 'Ruby client for the ControlShift Identity member API' s.required_ruby_version = '>= 3.4.0' s.files = Dir.chdir(__dir__) do - `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^pkg/}) } + `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(pkg|spec)/}) } end s.require_paths = ['lib'] - s.add_runtime_dependency 'vertebrae', '>= 2.0', '< 3.0' + s.add_runtime_dependency 'vertebrae', '~> 2.0' - s.add_development_dependency 'bundler', '>= 2.4' s.add_development_dependency 'pry', '~> 0.10' s.add_development_dependency 'pry-byebug', '~> 3.4' s.add_development_dependency 'rdoc', '>= 6.3.1' diff --git a/lib/identity-api-client/client.rb b/lib/identity-api-client/client.rb index 8ac43f5..2db85fe 100644 --- a/lib/identity-api-client/client.rb +++ b/lib/identity-api-client/client.rb @@ -1,5 +1,3 @@ -require 'json' - module IdentityApiClient class Client < Vertebrae::API def member @@ -9,7 +7,7 @@ def member private def extract_data_from_params(params) - JSON.generate(params) + params.to_json end def default_options diff --git a/lib/identity-api-client/member.rb b/lib/identity-api-client/member.rb index 046528e..8859eaf 100644 --- a/lib/identity-api-client/member.rb +++ b/lib/identity-api-client/member.rb @@ -15,10 +15,6 @@ def details(guid: nil, email: nil, load_current_consents: false) resp = client.post_request('/api/member/details', params) resp.body - rescue Vertebrae::ResponseError => e - return nil if e.status_code == 404 - - raise rescue Faraday::ResourceNotFound nil end diff --git a/spec/member_spec.rb b/spec/member_spec.rb index 661fe49..9688c30 100644 --- a/spec/member_spec.rb +++ b/spec/member_spec.rb @@ -1,4 +1,3 @@ -require 'json' require File.expand_path(File.dirname(__FILE__) + '/spec_helper') describe IdentityApiClient::Member do @@ -33,7 +32,7 @@ end context 'without load_current_consents' do - let(:expected_request) { JSON.generate('guid' => 'abcdef1234567890', 'api_token' => '1234567890abcdef') } + let(:expected_request) { { 'guid' => 'abcdef1234567890', 'api_token' => '1234567890abcdef' }.to_json } let(:body) { fixture('details.json') } it 'should get member details back from the API' do @@ -47,7 +46,7 @@ context 'with load_current_consents' do - let(:expected_request) { JSON.generate('guid' => 'abcdef1234567890', 'api_token' => '1234567890abcdef', 'load_current_consents' => true) } + let(:expected_request) { { 'guid' => 'abcdef1234567890', 'api_token' => '1234567890abcdef', 'load_current_consents' => true }.to_json } let(:body) { fixture('details_with_consents.json') } it 'should get member details with consents back from the API' do @@ -63,7 +62,7 @@ end context 'with email passed' do - let(:expected_request) { JSON.generate('email' => 'test@example.com', 'api_token' => '1234567890abcdef') } + let(:expected_request) { { 'email' => 'test@example.com', 'api_token' => '1234567890abcdef' }.to_json } let(:body) { fixture('details.json') } it 'should get member details back from the API' do From 2eb7a1e37f15dd257b311383429e8bb5568e5e0c Mon Sep 17 00:00:00 2001 From: Owens Ehimen <43546100+ehimen-io@users.noreply.github.com> Date: Tue, 20 Oct 2026 12:20:26 -0400 Subject: [PATCH 5/6] Update identity-api-client.gemspec Co-authored-by: Grey Moore --- identity-api-client.gemspec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/identity-api-client.gemspec b/identity-api-client.gemspec index ce65fbb..e9e6bf1 100644 --- a/identity-api-client.gemspec +++ b/identity-api-client.gemspec @@ -10,7 +10,7 @@ Gem::Specification.new do |s| s.homepage = 'https://github.com/controlshift/identity-api-client' s.license = 'MIT' s.summary = 'API client for the Identity service' - s.description = 'Ruby client for the ControlShift Identity member API' + s.description = 'Ruby client for the Identity member API' s.required_ruby_version = '>= 3.4.0' s.files = Dir.chdir(__dir__) do From d180ec65b9463d4861a1f9f0d51bca6b152ea7ec Mon Sep 17 00:00:00 2001 From: Owens Ehimen Date: Tue, 20 Oct 2026 12:21:02 -0400 Subject: [PATCH 6/6] Fix README link to identity-api-client repo --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index c3aa160..2a0f6e9 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ [![CI Status](https://github.com/controlshift/identity-api-client/actions/workflows/ci.yml/badge.svg)](https://github.com/controlshift/identity-api-client/actions/workflows/ci.yml) -API client for the [Identity](https://github.com/controlshift/identity) service +API client for the [Identity](https://github.com/controlshift/identity-api-client) service ## Install