Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

🐛 Source Shopify: validate shop input (name only, reject urls) #25961

Merged
merged 5 commits into from
May 11, 2023

Conversation

bazarnov
Copy link
Collaborator

@bazarnov bazarnov commented May 10, 2023

What

Resolving: #25026

How

Given the default URL-like input: https://airbyte-integration-test.myshopify.com/ is not an option for the shop, as there is tons of variations of URL-like input, the only option to validate the input is to reject the URL-like ones and leave only straight name from https://airbyte-integration-test.myshopify.com/ > airbyte-integration-test

  • added pattern that validates there is no link/URL-like string for shop in spec.json

Recommended reading order

  1. x.java
  2. y.python

🚨 User Impact 🚨

No impact is expected, since this is not a breaking change, all existing connections should work as they are.

For connector PRs, use this section to explain which type of semantic versioning bump occurs as a result of the changes. Refer to our Semantic Versioning for Connectors guidelines for more information. Breaking changes to connectors must be documented by an Airbyte engineer (PR author, or reviewer for community PRs) by using the Breaking Change Release Playbook.

If there are breaking changes, please merge this PR with the 🚨🚨 emoji so changelog authors can further highlight this if needed.

Pre-merge Actions

Expand the relevant checklist and delete the others.

New Connector

Community member or Airbyter

  • Community member? Grant edit access to maintainers (instructions)
  • Unit & integration tests added and passing. Community members, please provide proof of success locally e.g: screenshot or copy-paste unit, integration, and acceptance test output. To run acceptance tests for a Python connector, follow instructions in the README. For java connectors run ./gradlew :airbyte-integrations:connectors:<name>:integrationTest.
  • Connector version is set to 0.0.1
    • Dockerfile has version 0.0.1
  • Documentation updated
    • Connector's README.md
    • Connector's bootstrap.md. See description and examples
    • docs/integrations/<source or destination>/<name>.md including changelog with an entry for the initial version. See changelog example
    • docs/integrations/README.md

Airbyter

If this is a community PR, the Airbyte engineer reviewing this PR is responsible for the below items.

  • Create a non-forked branch based on this PR and test the below items on it
  • Build is successful
  • If new credentials are required for use in CI, add them to GSM. Instructions.
Updating a connector

Community member or Airbyter

  • Grant edit access to maintainers (instructions)
  • Unit & integration tests added

Airbyter

If this is a community PR, the Airbyte engineer reviewing this PR is responsible for the below items.

  • Create a non-forked branch based on this PR and test the below items on it
  • Build is successful
  • If new credentials are required for use in CI, add them to GSM. Instructions.
Connector Generator
  • Issue acceptance criteria met
  • PR name follows PR naming conventions
  • If adding a new generator, add it to the list of scaffold modules being tested
  • The generator test modules (all connectors with -scaffold in their name) have been updated with the latest scaffold by running ./gradlew :airbyte-integrations:connector-templates:generator:testScaffoldTemplates then checking in your changes
  • Documentation which references the generator is updated as needed

@github-actions
Copy link
Contributor

github-actions bot commented May 10, 2023

Before Merging a Connector Pull Request

Wow! What a great pull request you have here! 🎉

To merge this PR, ensure the following has been done/considered for each connector added or updated:

  • PR name follows PR naming conventions
  • Breaking changes are considered. If a Breaking Change is being introduced, ensure an Airbyte engineer has created a Breaking Change Plan and you've followed all steps in the Breaking Changes Checklist
  • Connector version has been incremented in the Dockerfile and metadata.yaml according to our Semantic Versioning for Connectors guidelines
  • Secrets in the connector's spec are annotated with airbyte_secret
  • All documentation files are up to date. (README.md, bootstrap.md, docs.md, etc...)
  • Changelog updated in docs/integrations/<source or destination>/<name>.md with an entry for the new version. See changelog example
  • You, or an Airbyter, have run /test successfully on this PR - or on a non-forked branch
  • You, or an Airbyter, have run /publish successfully on this PR - or on a non-forked branch
  • You've updated the connector's metadata.yaml file (new!)
  • The Octavia bot updated the source_definitions.yaml or destination_definitions.yaml, or you ran processResources manually (deprecated)

If the checklist is complete, but the CI check is failing,

  1. Check for hidden checklists in your PR description

  2. Toggle the github label checklist-action-run on/off to re-run the checklist CI.

@octavia-squidington-iii octavia-squidington-iii added the area/documentation Improvements or additions to documentation label May 10, 2023
@bazarnov
Copy link
Collaborator Author

bazarnov commented May 10, 2023

/test connector=connectors/source-shopify

🕑 connectors/source-shopify https://github.com/airbytehq/airbyte/actions/runs/4938355504
❌ connectors/source-shopify https://github.com/airbytehq/airbyte/actions/runs/4938355504
🐛 https://gradle.com/s/d6f2tk54zajmo

Build Failed

Test summary info:

=========================== short test summary info ============================
FAILED test_core.py::TestBasicRead::test_read[inputs0] - Failed: Stream shop:...
SKIPPED [3] ../usr/local/lib/python3.9/site-packages/connector_acceptance_test/tests/test_core.py:578: The previous and actual discovered catalogs are identical.
============= 1 failed, 58 passed, 3 skipped in 1207.49s (0:20:07) =============

@bazarnov bazarnov requested review from grubberr, davydov-d, lazebnyi and a team May 10, 2023 14:59
Copy link
Contributor

@evantahler evantahler left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Question about the regex, but otherwise 👍

@@ -11,6 +11,7 @@
"type": "string",
"title": "Shopify Store",
"description": "The name of your Shopify store found in the URL. For example, if your URL was https://NAME.myshopify.com, then the name would be 'NAME'.",
"pattern": "^(?!https:\/\/)(?!http:\/\/)(?!.*\\.myshopify\\.)(?!.*\\.myshopify).*",
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

👍 This is not a breaking change, and only an additional UI validation for the data the connector is asking for.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The current regex (validated with https://rubular.com/) allows company-name.shopify.com, which I don't think is desired (see https://rubular.com/r/pG2m72BxZLCxFb), and I don't think the "capture" statements are working. If the goal is only to allow NAME (per the description), perhaps the pattern should also ignore any . characters as well?

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The regex now will validate whether or not the user inputs some URLs which we cannot actually process correctly, since there is no problem with having the shop name = my.shop.name.myshopify.com, where my.shop.name as the name we need. I'm also trying to check the Shopify restrictions for the shop names (specifically, what symbols are allowed), so we are aligned with their rules to match the shop name pattern effectively. No doubts - this solution is step one, I'm sure we will improve this in the future as well as will hit some edge cases, as always.

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thus, if the input string contains https' or myshopify` (+ variations with prefix and suffix dots) we are good to catch that user inputs something we cannot actually handle correctly, so extracting the name of the shop should be done in prior and the field should only accept the effective name, not URLs. or similar like not (https://my_store.myshopify.com/ or my_store.myshopify.com)
there are tons of variations that could be made here, in order to minimize this variation, we need to strict this field to something that could be easily processed from our side.

Copy link
Contributor

@evantahler evantahler left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Question about the regex, but otherwise 👍

@bazarnov
Copy link
Collaborator Author

bazarnov commented May 10, 2023

/test connector=connectors/source-shopify

🕑 connectors/source-shopify https://github.com/airbytehq/airbyte/actions/runs/4941219989
✅ connectors/source-shopify https://github.com/airbytehq/airbyte/actions/runs/4941219989
Python tests coverage:

Name                               Stmts   Miss  Cover
------------------------------------------------------
source_shopify/shopify_schema.py   10152      0   100%
source_shopify/auth.py                20      0   100%
source_shopify/__init__.py             2      0   100%
source_shopify/transform.py           58      3    95%
source_shopify/utils.py               96      7    93%
source_shopify/source.py             454     66    85%
source_shopify/graphql.py             47     40    15%
------------------------------------------------------
TOTAL                              10829    116    99%

Build Passed

Test summary info:

=========================== short test summary info ============================
SKIPPED [3] ../usr/local/lib/python3.9/site-packages/connector_acceptance_test/tests/test_core.py:578: The previous and actual discovered catalogs are identical.
================== 59 passed, 3 skipped in 2683.33s (0:44:43) ==================

@bazarnov bazarnov linked an issue May 10, 2023 that may be closed by this pull request
@bazarnov
Copy link
Collaborator Author

bazarnov commented May 10, 2023

/publish connector=connectors/source-shopify

🕑 Publishing the following connectors:
connectors/source-shopify
https://github.com/airbytehq/airbyte/actions/runs/4941754967


Connector Version Did it publish? Were definitions generated?
connectors/source-shopify 0.3.4

if you have connectors that successfully published but failed definition generation, follow step 4 here ▶️

@bazarnov bazarnov merged commit da60731 into master May 11, 2023
@bazarnov bazarnov deleted the baz/source-shopify-reject-url-input branch May 11, 2023 08:11
marcosmarxm pushed a commit to natalia-miinto/airbyte that referenced this pull request Jun 8, 2023
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
area/connectors Connector related issues area/documentation Improvements or additions to documentation connectors/source/shopify team/connectors-python
Projects
Status: No status
Development

Successfully merging this pull request may close these issues.

Shopify doesn't accept full store name URL
4 participants