From c0c373bfda25f06415a99b34b877959b87247e16 Mon Sep 17 00:00:00 2001 From: Gabriel Lima Pereira Date: Sun, 4 Aug 2024 15:35:10 -0300 Subject: [PATCH 1/9] Add Token authentication (#30) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Adicionado opção de configurar o token * Utilizando config de token no lugar do api_secret * Ajustado teste para validar o token no lugar do api_secret * ajustado teste para secret * Ajustado teste validando erro de secret em branco, para agr validar o token * Ajustado teste quando a falta de autenticação valida * Ajustado utilização do token, como opcional e sempre tentando utilizado primeiro * Ajustado raise * Ajustado nome do método * Ajustado erro de autenticação * Ajustado testes unitarios * adjust the readme to use secret or token * adjusts the examples to use secret or token * adjusts the specs for the use of secret or token * skipped user test, as it is not included in the request * Update README.md --------- Co-authored-by: fernando.sacchet@gmail.com Co-authored-by: Fernando Sacchet dos Santos <75328547+FernandoSacchet@users.noreply.github.com> --- .github/workflows/main.yml | 1 + README.md | 17 +++++++++++++-- examples/alternative_converter.rb | 2 ++ examples/conversions_chaining.rb | 2 ++ examples/convert_stream.rb | 2 ++ examples/convert_url_to_pdf.rb | 3 ++- examples/convert_word_to_pdf_and_png.rb | 2 ++ examples/create_pdf_thumbnail.rb | 2 ++ examples/retrieve_user_information.rb | 2 ++ examples/split_and_merge_pdf.rb | 2 ++ lib/convert_api/client.rb | 13 ++++++++--- lib/convert_api/configuration.rb | 1 + lib/convert_api/errors.rb | 2 +- spec/convert_api_spec.rb | 29 ++++++++++++++++--------- spec/spec_helper.rb | 2 ++ 15 files changed, 65 insertions(+), 17 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 1a81f4c..f4aa040 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -23,4 +23,5 @@ jobs: - run: bundle install - env: CONVERT_API_SECRET: ${{ secrets.CONVERTAPI_SECRET }} + CONVERT_API_TOKEN: ${{ secrets.CONVERTAPI_TOKEN }} run: bundle exec rake spec diff --git a/README.md b/README.md index 4347ba0..f6d56c4 100644 --- a/README.md +++ b/README.md @@ -23,7 +23,7 @@ gem 'convert_api' ### Configuration -You can get your secret at https://www.convertapi.com/a +You can get your secret at https://www.convertapi.com/a/auth ```ruby ConvertApi.configure do |config| @@ -31,9 +31,18 @@ ConvertApi.configure do |config| end ``` +Or + +You can get your token at https://www.convertapi.com/a/access-tokens +```ruby +ConvertApi.configure do |config| + config.token = 'your-token' +end +``` + ### File conversion -Example to convert file to PDF. All supported formats and options can be found +Example to convert file to PDF. All supported formats and options can be found [here](https://www.convertapi.com/doc/supported-formats). ```ruby @@ -127,6 +136,10 @@ Find more advanced examples in the [examples/](https://github.com/ConvertAPI/con Run `CONVERT_API_SECRET=your_secret rake spec` to run the tests. +Or + +Run `CONVERT_API_TOKEN=your_token rake spec` to run the tests. + To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org). ## Contributing diff --git a/examples/alternative_converter.rb b/examples/alternative_converter.rb index 405042f..34e441b 100644 --- a/examples/alternative_converter.rb +++ b/examples/alternative_converter.rb @@ -3,6 +3,8 @@ ConvertApi.configure do |config| config.api_secret = ENV['CONVERT_API_SECRET'] # your api secret + # or + config.token = ENV['CONVERT_API_TOKEN'] # your token end # Example of saving Word docx to PDF using OpenOffice converter diff --git a/examples/conversions_chaining.rb b/examples/conversions_chaining.rb index c3d583c..1ab1a97 100644 --- a/examples/conversions_chaining.rb +++ b/examples/conversions_chaining.rb @@ -3,6 +3,8 @@ ConvertApi.configure do |config| config.api_secret = ENV['CONVERT_API_SECRET'] # your api secret + # or + config.token = ENV['CONVERT_API_TOKEN'] # your token end # Short example of conversions chaining, the PDF pages extracted and saved as separated JPGs and then ZIP'ed diff --git a/examples/convert_stream.rb b/examples/convert_stream.rb index a398d7d..ad78a61 100644 --- a/examples/convert_stream.rb +++ b/examples/convert_stream.rb @@ -3,6 +3,8 @@ ConvertApi.configure do |config| config.api_secret = ENV['CONVERT_API_SECRET'] # your api secret + # or + config.token = ENV['CONVERT_API_TOKEN'] # your token end # Example of converting text to PDF diff --git a/examples/convert_url_to_pdf.rb b/examples/convert_url_to_pdf.rb index 166bf41..5214208 100644 --- a/examples/convert_url_to_pdf.rb +++ b/examples/convert_url_to_pdf.rb @@ -3,8 +3,9 @@ ConvertApi.configure do |config| config.api_secret = ENV['CONVERT_API_SECRET'] # your api secret + # or + config.token = ENV['CONVERT_API_TOKEN'] # your token end - # Example of converting Web Page URL to PDF file # https://www.convertapi.com/web-to-pdf diff --git a/examples/convert_word_to_pdf_and_png.rb b/examples/convert_word_to_pdf_and_png.rb index 82c129b..b24d283 100644 --- a/examples/convert_word_to_pdf_and_png.rb +++ b/examples/convert_word_to_pdf_and_png.rb @@ -3,6 +3,8 @@ ConvertApi.configure do |config| config.api_secret = ENV['CONVERT_API_SECRET'] # your api secret + # or + config.token = ENV['CONVERT_API_TOKEN'] # your token end # Example of saving Word docx to PDF and to PNG diff --git a/examples/create_pdf_thumbnail.rb b/examples/create_pdf_thumbnail.rb index fb32705..3321032 100644 --- a/examples/create_pdf_thumbnail.rb +++ b/examples/create_pdf_thumbnail.rb @@ -3,6 +3,8 @@ ConvertApi.configure do |config| config.api_secret = ENV['CONVERT_API_SECRET'] # your api secret + # or + config.token = ENV['CONVERT_API_TOKEN'] # your token end # Example of extracting first page from PDF and then chaining conversion PDF page to JPG. diff --git a/examples/retrieve_user_information.rb b/examples/retrieve_user_information.rb index 3280b16..0795184 100644 --- a/examples/retrieve_user_information.rb +++ b/examples/retrieve_user_information.rb @@ -2,6 +2,8 @@ ConvertApi.configure do |config| config.api_secret = ENV['CONVERT_API_SECRET'] # your api secret + # or + config.token = ENV['CONVERT_API_TOKEN'] # your token end # Retrieve user information diff --git a/examples/split_and_merge_pdf.rb b/examples/split_and_merge_pdf.rb index 483c359..2d4e260 100644 --- a/examples/split_and_merge_pdf.rb +++ b/examples/split_and_merge_pdf.rb @@ -3,6 +3,8 @@ ConvertApi.configure do |config| config.api_secret = ENV['CONVERT_API_SECRET'] # your api secret + # or + config.token = ENV['CONVERT_API_TOKEN'] # your token end # Example of extracting first and last pages from PDF and then merging them back to new PDF. diff --git a/lib/convert_api/client.rb b/lib/convert_api/client.rb index 59489e7..e028ef4 100644 --- a/lib/convert_api/client.rb +++ b/lib/convert_api/client.rb @@ -101,10 +101,10 @@ def http(options = {}) end def request_uri(path, params = {}) - raise(SecretError, 'API secret not configured') if config.api_secret.nil? + raise(AuthenticationError, 'API secret or Token not configured') if authentication.nil? - params_with_secret = params.merge(Secret: config.api_secret) - query = URI.encode_www_form(params_with_secret) + params_with_authentication = params.merge(authentication) + query = URI.encode_www_form(params_with_authentication) base_uri.path + path + '?' + query end @@ -123,6 +123,13 @@ def build_form_data(params) data end + def authentication + return { Token: config.token } unless config.token.nil? + return { Secret: config.api_secret } unless config.api_secret.nil? + + nil + end + def base_uri config.base_uri end diff --git a/lib/convert_api/configuration.rb b/lib/convert_api/configuration.rb index bcd43f5..8f0783c 100644 --- a/lib/convert_api/configuration.rb +++ b/lib/convert_api/configuration.rb @@ -1,6 +1,7 @@ module ConvertApi class Configuration attr_accessor :api_secret + attr_accessor :token attr_accessor :base_uri attr_accessor :connect_timeout attr_accessor :read_timeout diff --git a/lib/convert_api/errors.rb b/lib/convert_api/errors.rb index ccff5ad..bdf78d0 100644 --- a/lib/convert_api/errors.rb +++ b/lib/convert_api/errors.rb @@ -1,6 +1,6 @@ module ConvertApi class Error < StandardError; end - class SecretError < Error; end + class AuthenticationError < Error; end class FileNameError < Error; end class TimeoutError < Error; end class ConnectionFailed < Error; end diff --git a/spec/convert_api_spec.rb b/spec/convert_api_spec.rb index 14df27f..d0143c2 100644 --- a/spec/convert_api_spec.rb +++ b/spec/convert_api_spec.rb @@ -10,15 +10,18 @@ describe '.configure' do let(:api_secret) { 'test_secret' } + let(:token) { 'test_token' } let(:conversion_timeout) { 20 } it 'configures' do described_class.configure do |config| config.api_secret = api_secret + config.token = token config.conversion_timeout = conversion_timeout end expect(described_class.config.api_secret).to eq(api_secret) + expect(described_class.config.token).to eq(token) expect(described_class.config.conversion_timeout).to eq(conversion_timeout) end end @@ -89,19 +92,25 @@ it_behaves_like 'successful conversion' end - context 'when secret is not set' do - before { ConvertApi.config.api_secret = nil } + context 'when has error' do + it 'raises error without secret or token' do + described_class.config.api_secret = nil + described_class.config.token = nil - it 'raises error' do - expect { subject }.to raise_error(ConvertApi::SecretError, /not configured/) + expect { subject }.to raise_error(ConvertApi::AuthenticationError, /not configured/) end - end - context 'with invalid secret' do - before { ConvertApi.config.api_secret = 'invalid' } + it 'with invalid secret' do + described_class.config.api_secret = 'invalid' + described_class.config.token = 'invalid' - it 'raises error' do - expect { subject }.to raise_error(ConvertApi::ClientError, /bad secret/) + expect { subject }.to raise_error(ConvertApi::ClientError) + end + + it 'with invalid token' do + described_class.config.token = 'invalid' + + expect { subject }.to raise_error(ConvertApi::ClientError) end end @@ -117,7 +126,7 @@ describe '.user' do subject { described_class.user } - it 'returns user information' do + xit 'returns user information' do expect(subject).to include('Email' => instance_of(String)) end end diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb index 833b9c4..fcd8a63 100644 --- a/spec/spec_helper.rb +++ b/spec/spec_helper.rb @@ -10,5 +10,7 @@ config.before(:each) do ConvertApi.config.api_secret = ENV['CONVERT_API_SECRET'] + # or + ConvertApi.config.token = ENV['CONVERT_API_TOKEN'] end end From 57ac274fa4afcb61c8e54549eac6275b5eb8d170 Mon Sep 17 00:00:00 2001 From: Laurynas Butkus Date: Sun, 4 Aug 2024 21:39:02 +0300 Subject: [PATCH 2/9] Enable user information test case --- spec/convert_api_spec.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spec/convert_api_spec.rb b/spec/convert_api_spec.rb index d0143c2..2b2baa0 100644 --- a/spec/convert_api_spec.rb +++ b/spec/convert_api_spec.rb @@ -126,7 +126,7 @@ describe '.user' do subject { described_class.user } - xit 'returns user information' do + it 'returns user information' do expect(subject).to include('Email' => instance_of(String)) end end From dca4bea7f5185a4260d36409c962a53fcd697e00 Mon Sep 17 00:00:00 2001 From: Laurynas Butkus Date: Sun, 4 Aug 2024 21:39:18 +0300 Subject: [PATCH 3/9] Switch to ruby 3.3 --- .github/workflows/main.yml | 1 + .ruby-version | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index f4aa040..643bb2c 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -11,6 +11,7 @@ jobs: - 2.7 - 3.1 - 3.2 + - 3.3 - jruby-9.1 - jruby-head name: Ruby ${{ matrix.ruby-version }} sample diff --git a/.ruby-version b/.ruby-version index ec1cf33..a0891f5 100644 --- a/.ruby-version +++ b/.ruby-version @@ -1 +1 @@ -2.6.3 +3.3.4 From 232d30dd9e8e1f9fa7aef5f9c5505504c2a5b074 Mon Sep 17 00:00:00 2001 From: Laurynas Butkus Date: Sun, 4 Aug 2024 21:45:54 +0300 Subject: [PATCH 4/9] Disable token injection in actions --- .github/workflows/main.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 643bb2c..b4c9f80 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -24,5 +24,5 @@ jobs: - run: bundle install - env: CONVERT_API_SECRET: ${{ secrets.CONVERTAPI_SECRET }} - CONVERT_API_TOKEN: ${{ secrets.CONVERTAPI_TOKEN }} + # CONVERT_API_TOKEN: ${{ secrets.CONVERTAPI_TOKEN }} run: bundle exec rake spec From 0bcb1d4c475dd5077c10d9729496e401f599d26e Mon Sep 17 00:00:00 2001 From: Laurynas Butkus Date: Sun, 4 Aug 2024 21:49:42 +0300 Subject: [PATCH 5/9] Prioritize secret over token --- .github/workflows/main.yml | 2 +- lib/convert_api/client.rb | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index b4c9f80..643bb2c 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -24,5 +24,5 @@ jobs: - run: bundle install - env: CONVERT_API_SECRET: ${{ secrets.CONVERTAPI_SECRET }} - # CONVERT_API_TOKEN: ${{ secrets.CONVERTAPI_TOKEN }} + CONVERT_API_TOKEN: ${{ secrets.CONVERTAPI_TOKEN }} run: bundle exec rake spec diff --git a/lib/convert_api/client.rb b/lib/convert_api/client.rb index e028ef4..3027d1a 100644 --- a/lib/convert_api/client.rb +++ b/lib/convert_api/client.rb @@ -124,8 +124,8 @@ def build_form_data(params) end def authentication - return { Token: config.token } unless config.token.nil? return { Secret: config.api_secret } unless config.api_secret.nil? + return { Token: config.token } unless config.token.nil? nil end From a4665b6b53a9f2370f10a4d38c77594b96143e9c Mon Sep 17 00:00:00 2001 From: Laurynas Butkus Date: Sun, 4 Aug 2024 21:53:29 +0300 Subject: [PATCH 6/9] Fix spec --- spec/convert_api_spec.rb | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/spec/convert_api_spec.rb b/spec/convert_api_spec.rb index 2b2baa0..9eb58d4 100644 --- a/spec/convert_api_spec.rb +++ b/spec/convert_api_spec.rb @@ -102,13 +102,14 @@ it 'with invalid secret' do described_class.config.api_secret = 'invalid' - described_class.config.token = 'invalid' + described_class.config.token = nil expect { subject }.to raise_error(ConvertApi::ClientError) end it 'with invalid token' do described_class.config.token = 'invalid' + described_class.config.api_secret = nil expect { subject }.to raise_error(ConvertApi::ClientError) end From 5790da8a794174be827f5eb1387d32753c59b64d Mon Sep 17 00:00:00 2001 From: Laurynas Butkus Date: Sun, 4 Aug 2024 22:27:27 +0300 Subject: [PATCH 7/9] Add gem publish action --- .github/workflows/publish.yml | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) create mode 100644 .github/workflows/publish.yml diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml new file mode 100644 index 0000000..7f27d9d --- /dev/null +++ b/.github/workflows/publish.yml @@ -0,0 +1,18 @@ +name: Publish gem to rubygems +on: + release: + types: [published] +jobs: + build: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - uses: ruby/setup-ruby@v1 + + # setup .gem/credentials + - run: mkdir -p ~/.gem + - run: echo -e "---\n:rubygems_api_key: ${{ secrets.RUBYGEMS_API_KEY }}" > ~/.gem/credentials + - run: chmod 0600 ~/.gem/credentials + + - run: gem build convert_api.gemspec --output=release.gem + - run: gem push release.gem From 12574a317f126e6727aacd63bf36db1087df2b3b Mon Sep 17 00:00:00 2001 From: Laurynas Butkus Date: Sun, 4 Aug 2024 22:32:09 +0300 Subject: [PATCH 8/9] Update README to use ConversionsConsumed --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index f6d56c4..a0e854f 100644 --- a/README.md +++ b/README.md @@ -113,7 +113,7 @@ You can always check your remaining seconds programmatically by fetching [user i ```ruby user_info = ConvertApi.user -puts user_info['SecondsLeft'] +puts user_info['ConversionsConsumed'] ``` ### Alternative domain From f9b64a9a454813929991c46dbecfc41c4aeb59b9 Mon Sep 17 00:00:00 2001 From: Laurynas Butkus Date: Sun, 4 Aug 2024 22:35:52 +0300 Subject: [PATCH 9/9] Bump version --- lib/convert_api/version.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/convert_api/version.rb b/lib/convert_api/version.rb index 84d7d2b..b1c1a8c 100644 --- a/lib/convert_api/version.rb +++ b/lib/convert_api/version.rb @@ -1,3 +1,3 @@ module ConvertApi - VERSION = '1.4.0' + VERSION = '2.0.0' end