A simple object model for the Notion SDK.

Overview

notional

A simplified object model for the Notion SDK. This is loosely modeled after concepts found in SQLAlchemy.

⚠️ Work In Progress: The interfaces in this module are still in development and are likely to change frequently. Furthermore, documentation is pretty sparse so use at your own risk!

That being said, if you do use this library, please drop a message! I'd love to see your use case and how you are incorporating this into your project.

Installation

Install using PyPi:

pip install notional

Note: it is recommended to use a virtual environment (venv) for installing libraries to prevent conflicting dependency versions.

Usage

Connect to the API using an integration token or an OAuth access token:

import notional

notion = notional.connect(auth=AUTH_TOKEN)

# do some things

Iterators

The iterators provide convenient access to the Notion endpoints. Rather than looking for each page of data, the iterators take care of this and expose a standard Python iterator:

import notional

from notional.iterator import EndpointIterator

notion = notional.connect(auth=AUTH_TOKEN)

tasks = EndpointIterator(
    endpoint=notion.databases.query,
    database_id=task_db_id,
    sorts=[
        {
            'direction': 'ascending',
            'property': 'Last Update'
        }
    ]
)

for data in tasks:
    # do the things

Note that the parameters to the iterator follow the standard API parameters for the given endpoint.

Query Builder

Notional provides a query builder for interating with the Notion API. Query targets can be either a specific database ID or a custom ORM type (with a __database__ property).

notion = notional.connect(auth=auth_token)
sorts = [{"direction": "ascending", "property": "Last Update"}]
query = notion.query(dbid).sort(sorts)

for data in query.execute():
    # something magic happens

For more information about querying, read the official documentation.

ORM

This library has support for defining custom data types that wrap Notion pages. Typically, these pages are entries in a database (collection) with a consistent schema.

{task.Priority}") task.DueDate = date.today() task.commit() ">
from notional import types
from notional.records import Page, Property

class Task(Page):
    __database__ = NOTION_DATABASE_ID
    Title = Property('Title', types.Title)
    Priority = Property('Priority', types.SelectOne)
    DueDate = Property('Due Date', types.Date)

for task in notion.query(Task).execute():
    print(f"{task.Title} => {task.Priority}")
    task.DueDate = date.today()
    task.commit()

See the examples for more information.

Token Security

It is generally a best practice to read the auth token from an environment variable or a secrets file. To prevent accidental exposure, it is NOT recommended to save the token in source. For more information, read about Notion authorization here.

Contributing

I built this module so that I could interact with Notion in a way that made sense to me. Hopefully, others will find it useful. If someone is particularly passionate about this area, I would be happy to consider other maintainers or contributors.

Any pull requests or other submissions are welcome. As most open source projects go, this is a side project. Large submissions will take time to review for acceptance, so breaking them into smaller pieces is always preferred. Thanks in advance!

Formatted using black.

Known Issues

See Issues on github.

Feature Requests

See Issues on github.

Comments
  • page search

    page search

    First of all, thank you very much for making this library, its amazing. Its really cool how well it integrates with Pydantic!

    I was expecting there to be a method for searching for pages something like:

    import notional
    from notional.records import Page
    
    notion = notional.connect(auth=NOTION_TOKEN)
    notion.pages.query(Page).execute()
    

    Which would yield all the pages (no databases)

    or maybe something like notion.pages.list()

    that would also allow for fuzzy matching

    notion.pages.list(filter='')

    Maybe in the ORM it would be nice to do

    notion.pages.query(page.name= ' ' ).execute()

    idk what the API should be here since the notion API does not explicitly searches in the page name for as far as I know.

    anyway, now I do:

    from notion_client import Client
    from notional.records import Page
    
    def search_notion(NOTION_TOKEN, query=None):
      base_query = dict(
          filter={
        'property':'object',
        'value':'page'
        },
        sort = {
          "direction":"descending",
          "timestamp":"last_edited_time"
        })
      
    
      if query:
        full_query = {**base_query,**dict(query=query)}
      else:
        full_query = base_query
    
      notion = Client(auth=NOTION_TOKEN)
      pages_result = notion.search(**full_query).get("results")
    
      return [Page.parse_obj(page) for page in pages_result if page.title]
    

    (which btw, subclassing Page with pydantic BaseModel opens up a really nice set of validation, parsing and serialisation possibilities so cheers for that!).

    opened by hugocool 6
  • Minor refactoring in Endpoint (sub-)class

    Minor refactoring in Endpoint (sub-)class

    Refactoring inspired by current ConnectedPage.__init_subclass__ usage. Although unlikely, a drastic change in notion-sdk-py future releases could cause problems with the proposed approach (e.g., if they change the attribute-based endpoints hierarchy).

    Even smaller refactoring in ChildrenEndpoint.append.

    opened by falcaopetri 4
  • Easier MentionObject API

    Easier MentionObject API

    Description

    I was trying to create a page titled "@ Today". This requires a types.MentionObject(types.MentionDate())) object. The best snippets I could come up with were:

    1. types.MentionObject.parse_obj
    from datetime import datetime
    today = datetime.now().strftime('%Y-%m-%d')
    
    mention_data = {
        "type": "mention",
        "plain_text": f"{today} → ",
        "mention": {"type": "date", "date": {"start": today, "end": None}},
    }
    types.Title(title=[types.MentionObject.parse_obj(mention_data)])
    

    based on https://github.com/jheddings/notional/blob/391d16fbf53782599d7f4f13fe92a49fdafbaef0/tests/test_types.py#L657

    1. types.MentionObject(types.MentionDate(types.DateRange))
    from datetime import datetime
    today = datetime.now().strftime('%Y-%m-%d')
    
    types.Title(title=[types.MentionObject(plain_text=f"{today} → ", mention=types.MentionDate(date=types.DateRange(start=today)))]),
    

    based on

    page = notion.pages.retrieve(PAGE_ID) # a page with title inserted in Notion
    page["title"]
    

    Moreover, Title does not seem to allow composition with mentions since it assumes a TextObject: https://github.com/jheddings/notional/blob/d96cefbecfbe406b820fbec593e36ea3a886099a/notional/types.py#L266

    Questions

    • Is currently a better approach for creating a mention?
    • If not, could there be a better API for creating a MentionObject? For example, by automagically wrapping a MentionData inside a MentionObject, or having an easier way to build mention_data?
    enhancement 
    opened by falcaopetri 4
  • How to validate the auth token?

    How to validate the auth token?

    Is there a way to:

    1. validate whether the auth token provided is even valid? (via some properties like length, checksum?)
    2. Validate whether the auth token allows one to connect to notion? So basically to check whether this is a token which would allow the user to do stuff with notion the notion API?

    Now I request the user list as a check (I am building a little GUI in flask to manipulate notion, therefore it would be nice for the "login" procedure to be able to throw an error if the token is invalid)

    opened by hugocool 4
  • Bump emoji from 2.0.0 to 2.2.0

    Bump emoji from 2.0.0 to 2.2.0

    Bumps emoji from 2.0.0 to 2.2.0.

    Release notes

    Sourced from emoji's releases.

    v2.2.0

    • Add support for Unicode Version 15
    • Add more translations for existing languages: (similar to Turkish Language)
    • Add Readme on how to add a language
    • Fix 2.0.0: sphinx warnings reference target not found

    v.2.1.0

    • Added Farsi support
    • Added Trove classifiers for Python 3.10 and 3.11
    Changelog

    Sourced from emoji's changelog.

    2.2.0

    • Add support for Unicode Version 15
    • Add more translations for existing languages: (similar to Turkish Language)
    • Add Readme on how to add a language
    • Fix 2.0.0: sphinx warnings reference target not found

    2.1.0

    • Added Farsi support
    • Added Trove classifiers for Python 3.10 and 3.11
    Commits
    • f09583f changelog updated to v2.2.0
    • c1de2f1 Merge pull request #239
    • 96ec1d2 Merge pull request #237
    • 41853d7 Added missed "py.typed package_data
    • 1d0acd3 Add README.md - how to add a new language
    • 5e57840 Change docs of emojize()
    • 5c19561 Normalize emoji name to NFKC to find it in EMOJI_DATA
    • fff013b Update EMOJI_DATA with translations from emojiterra
    • ed5b967 Add missing translations from emojiterra
    • cdd6c51 New tests
    • Additional commits viewable in compare view

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.

    Dependabot will merge this PR once CI passes on it, as requested by @jheddings.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    dependencies python 
    opened by dependabot[bot] 3
  • if self.filter is not None, create a compound for both filters

    if self.filter is not None, create a compound for both filters

    Sorry, this issue was created with VSCode Github extension. Super convenient but didn't give me a chance to explain!

    Exactly as you guessed. I was running multiple filters and getting more results with each filter! Then found out in your code it was basically taking the last one.

    Great library by the way. It's just missing a number of features to make it the de facto Notion ORM.

    opened by SandNerd 3
  • Update dependency flake8 to v6

    Update dependency flake8 to v6

    Mend Renovate

    This PR contains the following updates:

    | Package | Change | Age | Adoption | Passing | Confidence | |---|---|---|---|---|---| | flake8 (changelog) | ^5.0.4 -> ^6.0.0 | age | adoption | passing | confidence |


    Release Notes

    pycqa/flake8

    v6.0.0

    Compare Source


    Configuration

    📅 Schedule: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined).

    🚦 Automerge: Disabled by config. Please merge this manually once you are satisfied.

    Rebasing: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.

    🔕 Ignore: Close this PR and you won't be reminded about this update again.


    • [ ] If you want to rebase/retry this PR, check this box

    This PR has been generated by Mend Renovate. View repository job log here.

    dependencies python 
    opened by renovate[bot] 2
  • Bump pytest from 7.1.2 to 7.2.0

    Bump pytest from 7.1.2 to 7.2.0

    Bumps pytest from 7.1.2 to 7.2.0.

    Release notes

    Sourced from pytest's releases.

    7.2.0

    pytest 7.2.0 (2022-10-23)

    Deprecations

    • #10012: Update pytest.PytestUnhandledCoroutineWarning{.interpreted-text role="class"} to a deprecation; it will raise an error in pytest 8.

    • #10396: pytest no longer depends on the py library. pytest provides a vendored copy of py.error and py.path modules but will use the py library if it is installed. If you need other py.* modules, continue to install the deprecated py library separately, otherwise it can usually be removed as a dependency.

    • #4562: Deprecate configuring hook specs/impls using attributes/marks.

      Instead use :pypytest.hookimpl{.interpreted-text role="func"} and :pypytest.hookspec{.interpreted-text role="func"}. For more details, see the docs <legacy-path-hooks-deprecated>{.interpreted-text role="ref"}.

    • #9886: The functionality for running tests written for nose has been officially deprecated.

      This includes:

      • Plain setup and teardown functions and methods: this might catch users by surprise, as setup() and teardown() are not pytest idioms, but part of the nose support.
      • Setup/teardown using the @​with_setup decorator.

      For more details, consult the deprecation docs <nose-deprecation>{.interpreted-text role="ref"}.

    Features

    • #9897: Added shell-style wildcard support to testpaths.

    Improvements

    • #10218: @pytest.mark.parametrize() (and similar functions) now accepts any Sequence[str] for the argument names, instead of just list[str] and tuple[str, ...].

      (Note that str, which is itself a Sequence[str], is still treated as a comma-delimited name list, as before).

    • #10381: The --no-showlocals flag has been added. This can be passed directly to tests to override --showlocals declared through addopts.

    • #3426: Assertion failures with strings in NFC and NFD forms that normalize to the same string now have a dedicated error message detailing the issue, and their utf-8 representation is expresed instead.

    • #7337: A warning is now emitted if a test function returns something other than [None]{.title-ref}. This prevents a common mistake among beginners that expect that returning a [bool]{.title-ref} (for example [return foo(a, b) == result]{.title-ref}) would cause a test to pass or fail, instead of using [assert]{.title-ref}.

    • #8508: Introduce multiline display for warning matching via :pypytest.warns{.interpreted-text role="func"} and enhance match comparison for :py_pytest._code.ExceptionInfo.match{.interpreted-text role="func"} as returned by :pypytest.raises{.interpreted-text role="func"}.

    • #8646: Improve :pypytest.raises{.interpreted-text role="func"}. Previously passing an empty tuple would give a confusing error. We now raise immediately with a more helpful message.

    • #9741: On Python 3.11, use the standard library's tomllib{.interpreted-text role="mod"} to parse TOML.

      tomli{.interpreted-text role="mod"}` is no longer a dependency on Python 3.11.

    • #9742: Display assertion message without escaped newline characters with -vv.

    • #9823: Improved error message that is shown when no collector is found for a given file.

    ... (truncated)

    Commits
    • 3af3f56 Prepare release version 7.2.0
    • bc2c3b6 Merge pull request #10408 from NateMeyvis/patch-2
    • d84ed48 Merge pull request #10409 from pytest-dev/asottile-patch-1
    • ffe49ac Merge pull request #10396 from pytest-dev/pylib-hax
    • d352098 allow jobs to pass if codecov.io fails
    • c5c562b Fix typos in CONTRIBUTING.rst
    • d543a45 add deprecation changelog for py library vendoring
    • f341a5c Merge pull request #10407 from NateMeyvis/patch-1
    • 1027dc8 [pre-commit.ci] auto fixes from pre-commit.com hooks
    • 6b905ee Add note on tags to CONTRIBUTING.rst
    • Additional commits viewable in compare view

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.

    Dependabot will merge this PR once it's up-to-date and CI passes on it, as requested by @jheddings.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    dependencies python 
    opened by dependabot[bot] 2
  • Bump pydantic from 1.9.1 to 1.10.2

    Bump pydantic from 1.9.1 to 1.10.2

    Bumps pydantic from 1.9.1 to 1.10.2.

    Release notes

    Sourced from pydantic's releases.

    v1.10.2 (2022-09-05)

    Full Changelog: https://github.com/pydantic/pydantic/compare/v1.10.1...v1.10.2

    v1.10.1 (2022-08-31)

    • Add __hash__ method to pydancic.color.Color class, #4454 by @​czaki

    Full Changelog: https://github.com/pydantic/pydantic/compare/v1.10.0...v1.10.1

    v1.10.0 (2022-08-30)

    See #4419 for feedback and discussion, docs are live at pydantic-docs.helpmanual.io.

    • Refactor the whole pydantic dataclass decorator to really act like its standard lib equivalent. It hence keeps __eq__, __hash__, ... and makes comparison with its non-validated version possible. It also fixes usage of frozen dataclasses in fields and usage of default_factory in nested dataclasses. The support of Config.extra has been added. Finally, config customization directly via a dict is now possible, #2557 by @​PrettyWood BREAKING CHANGES:
      • The compiled boolean (whether pydantic is compiled with cython) has been moved from main.py to version.py
      • Now that Config.extra is supported, dataclass ignores by default extra arguments (like BaseModel)
    • Fix PEP487 __set_name__ protocol in BaseModel for PrivateAttrs, #4407 by @​tlambert03
    • Allow for custom parsing of environment variables via parse_env_var in Config, #4406 by @​acmiyaguchi
    • Rename master to main, #4405 by @​hramezani
    • Fix StrictStr does not raise ValidationError when max_length is present in Field, #4388 by @​hramezani
    • Make SecretStr and SecretBytes hashable, #4387 by @​chbndrhnns
    • Fix StrictBytes does not raise ValidationError when max_length is present in Field, #4380 by @​JeanArhancet
    • Add support for bare type, #4375 by @​hramezani
    • Support Python 3.11, including binaries for 3.11 in PyPI, #4374 by @​samuelcolvin
    • Add support for re.Pattern, #4366 by @​hramezani
    • Fix __post_init_post_parse__ is incorrectly passed keyword arguments when no __post_init__ is defined, #4361 by @​hramezani
    • Fix implicitly importing ForwardRef and Callable from pydantic.typing instead of typing and also expose MappingIntStrAny, #4358 by @​aminalaee
    • remove Any types from the dataclass decorator so it can be used with the disallow_any_expr mypy option, #4356 by @​DetachHead
    • moved repo to pydantic/pydantic, #4348 by @​yezz123
    • fix "extra fields not permitted" error when dataclass with Extra.forbid is validated multiple times, #4343 by @​detachhead
    • Add Python 3.9 and 3.10 examples to docs, #4339 by @​Bobronium
    • Discriminated union models now use oneOf instead of anyOf when generating OpenAPI schema definitions, #4335 by @​MaxwellPayne
    • Allow type checkers to infer inner type of Json type. Json[list[str]] will be now inferred as list[str], Json[Any] should be used instead of plain Json. Runtime behaviour is not changed, #4332 by @​Bobronium
    • Allow empty string aliases by using a alias is not None check, rather than bool(alias), #4253 by @​sergeytsaplin
    • Update ForwardRefs in Field.outer_type_, #4249 by @​JacobHayes
    • The use of __dataclass_transform__ has been replaced by typing_extensions.dataclass_transform, which is the preferred way to mark pydantic models as a dataclass under PEP 681, #4241 by @​multimeric
    • Use parent model's Config when validating nested NamedTuple fields, #4219 by @​synek

    ... (truncated)

    Changelog

    Sourced from pydantic's changelog.

    v1.10.2 (2022-09-05)

    v1.10.1 (2022-08-31)

    • Add __hash__ method to pydancic.color.Color class, #4454 by @​czaki

    v1.10.0 (2022-08-30)

    • Refactor the whole pydantic dataclass decorator to really act like its standard lib equivalent. It hence keeps __eq__, __hash__, ... and makes comparison with its non-validated version possible. It also fixes usage of frozen dataclasses in fields and usage of default_factory in nested dataclasses. The support of Config.extra has been added. Finally, config customization directly via a dict is now possible, #2557 by @​PrettyWood BREAKING CHANGES:
      • The compiled boolean (whether pydantic is compiled with cython) has been moved from main.py to version.py
      • Now that Config.extra is supported, dataclass ignores by default extra arguments (like BaseModel)
    • Fix PEP487 __set_name__ protocol in BaseModel for PrivateAttrs, #4407 by @​tlambert03
    • Allow for custom parsing of environment variables via parse_env_var in Config, #4406 by @​acmiyaguchi
    • Rename master to main, #4405 by @​hramezani
    • Fix StrictStr does not raise ValidationError when max_length is present in Field, #4388 by @​hramezani
    • Make SecretStr and SecretBytes hashable, #4387 by @​chbndrhnns
    • Fix StrictBytes does not raise ValidationError when max_length is present in Field, #4380 by @​JeanArhancet
    • Add support for bare type, #4375 by @​hramezani
    • Support Python 3.11, including binaries for 3.11 in PyPI, #4374 by @​samuelcolvin
    • Add support for re.Pattern, #4366 by @​hramezani
    • Fix __post_init_post_parse__ is incorrectly passed keyword arguments when no __post_init__ is defined, #4361 by @​hramezani
    • Fix implicitly importing ForwardRef and Callable from pydantic.typing instead of typing and also expose MappingIntStrAny, #4358 by @​aminalaee
    • remove Any types from the dataclass decorator so it can be used with the disallow_any_expr mypy option, #4356 by @​DetachHead
    • moved repo to pydantic/pydantic, #4348 by @​yezz123
    • fix "extra fields not permitted" error when dataclass with Extra.forbid is validated multiple times, #4343 by @​detachhead
    • Add Python 3.9 and 3.10 examples to docs, #4339 by @​Bobronium
    • Discriminated union models now use oneOf instead of anyOf when generating OpenAPI schema definitions, #4335 by @​MaxwellPayne
    • Allow type checkers to infer inner type of Json type. Json[list[str]] will be now inferred as list[str], Json[Any] should be used instead of plain Json. Runtime behaviour is not changed, #4332 by @​Bobronium
    • Allow empty string aliases by using a alias is not None check, rather than bool(alias), #4253 by @​sergeytsaplin
    • Update ForwardRefs in Field.outer_type_, #4249 by @​JacobHayes
    • The use of __dataclass_transform__ has been replaced by typing_extensions.dataclass_transform, which is the preferred way to mark pydantic models as a dataclass under PEP 681, #4241 by @​multimeric
    • Use parent model's Config when validating nested NamedTuple fields, #4219 by @​synek
    • Update BaseModel.construct to work with aliased Fields, #4192 by @​kylebamos

    ... (truncated)

    Commits
    • bc74342 prepare for v1.10.2
    • f1e9883 fix: dataclass wrapper was not always called (#4484)
    • 91bb8d4 Basic fix of GenericModel cache to detect order of args in Union models [#447...
    • eccd85e prevent long strings as int inputs (#4480)
    • a4367c1 Revert percent encoding in URLs. (#4470)
    • 02cf7f5 fix mypy with default_factory=list etc. (#4471)
    • 5a2ddec Use tomllib on Python 3.11 (#4476)
    • 317bef3 build(deps): bump black from 22.6.0 to 22.8.0 (#4465)
    • 2add8a9 build(deps): bump hypothesis from 6.54.3 to 6.54.4 (#4464)
    • f1fb4f2 build(deps): bump mkdocs-material from 8.4.0 to 8.4.2 (#4463)
    • Additional commits viewable in compare view

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.

    Dependabot will merge this PR once CI passes on it, as requested by @jheddings.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    dependencies python 
    opened by dependabot[bot] 2
  • Bump mkdocstrings-python from 0.7.1 to 0.8.2

    Bump mkdocstrings-python from 0.7.1 to 0.8.2

    Bumps mkdocstrings-python from 0.7.1 to 0.8.2.

    Changelog

    Sourced from mkdocstrings-python's changelog.

    0.8.2 - 2022-11-19

    Compare with 0.8.1

    Bug Fixes

    0.8.1 - 2022-11-19

    Compare with 0.8.0

    Bug Fixes

    0.8.0 - 2022-11-13

    Compare with 0.7.1

    Features

    Code Refactoring

    • Support Griffe 0.24 (3b9f701 by Timothée Mazzucotelli).
    Commits
    • 67206aa chore: Prepare release 0.8.2
    • 34cfa4b fix: Fix base directory used to expand globs
    • 10a7884 chore: Prepare release 0.8.1
    • df1493c ci: Allow CI to run on branches
    • de48df7 ci: Install docs dependencies for tests
    • 0dc45ae fix: Expand globs relative to configuration file path
    • c4d32e1 chore: Prepare release 0.8.0
    • 3b9f701 refactor: Support Griffe 0.24
    • 12cd342 ci: Fix type checking
    • 4de7024 chore: Template upgrade
    • Additional commits viewable in compare view

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.

    Dependabot will merge this PR once CI passes on it, as requested by @jheddings.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    dependencies python 
    opened by dependabot[bot] 2
  • Bump mkdocs from 1.3.1 to 1.4.2

    Bump mkdocs from 1.3.1 to 1.4.2

    Bumps mkdocs from 1.3.1 to 1.4.2.

    Release notes

    Sourced from mkdocs's releases.

    1.4.2

    • Officially support Python 3.11 (#3020)

      Note: Simply upgrading to Python 3.11 can cut off 10-15% of your site's build time.

    • Support multiple instances of the same plugin (#3027)

      If a plugin is specified multiple times in the list under the plugins: config, that will create 2 (or more) instances of the plugin with their own config each.

      Previously this case was unforeseen and, as such, bugged.

      Now even though this works, by default a warning will appear from MkDocs anyway, unless the plugin adds a class variable supports_multiple_instances = True.

    • Bugfix (regression in 1.4.1): Don't error when a plugin puts a plain string into warnings (#3016)

    • Bugfix: Relative links will always render with a trailing slash (#3022)

      Previously under use_directory_urls, links from a sub-page to the main index page rendered as e.g. <a href="../.."> even though in all other cases the links look like <a href="../../">. This caused unwanted behavior on some combinations of Web browsers and servers. Now this special-case bug was removed.

    • Built-in "mkdocs" theme now also supports Norwegian language (#3024)

    • Plugin-related warnings look more readable (#3016)

    See commit log.

    1.4.1

    • Support theme-namespaced plugin loading (#2998)

      Plugins' entry points can be named as 'sometheme/someplugin'. That will have the following outcome:

      • If the current theme is 'sometheme', the plugin 'sometheme/someplugin' will always be preferred over 'someplugin'.
      • If the current theme isn't 'sometheme', the only way to use this plugin is by specifying plugins: [sometheme/someplugin].

      One can also specify plugins: ['/someplugin'] instead of plugins: ['someplugin'] to definitely avoid the theme-namespaced plugin.

    • Bugfix: mkdocs serve will work correctly with non-ASCII paths and redirects (#3001)

    • Windows: 'colorama' is now a dependency of MkDocs, to ensure colorful log output (#2987)

    • Plugin-related config options have more reliable validation and error reporting (#2997)

    • Translation sub-commands of setup.py were completely dropped. See documentation [1] [2] for their new replacements (#2990)

    • The 'mkdocs' package (wheel and source) is now produced by Hatch build system and pyproject.toml instead of setup.py (#2988)

    Other small improvements; see commit log.

    1.4.0

    ... (truncated)

    Commits

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.

    Dependabot will merge this PR once CI passes on it, as requested by @jheddings.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    dependencies python 
    opened by dependabot[bot] 2
  • Updating page properties doesn't work if a formula property is present

    Updating page properties doesn't work if a formula property is present

    To determine to current version, run python -m notional

    Notional Version: current main brunch, i.e. notional.__version__ shows 0.4.1-73c5bc5, it seems like this should have been increased to 0.4.2 in the last release?

    Description

    Updating a page doesn't work if the page contains a formula property.

    Steps To Reproduce

    notion_orm = notional.connect(auth=AUTH_TOKEN)
    query = notion_orm.databases.query(db['id']).sort(property="Name", direction=notional.query.SortDirection.ASCENDING)
    p = query.first()
    notion_orm.pages.update(p)
    

    Expected Behavior

    Since we are not changing anything, calling notion_orm.pages.update(p) should just work. Instead:

    ---------------------------------------------------------------------------
    HTTPStatusError                           Traceback (most recent call last)
    File ~/.mambaforge/envs/ultimate-notion/lib/python3.10/site-packages/notion_client/client.py:116, in BaseClient._parse_response(self, response)
        115 try:
    --> 116     response.raise_for_status()
        117 except httpx.HTTPStatusError as error:
    
    File ~/.mambaforge/envs/ultimate-notion/lib/python3.10/site-packages/httpx/_models.py:736, in Response.raise_for_status(self)
        735 message = message.format(self, error_type=error_type)
    --> 736 raise HTTPStatusError(message, request=request, response=self)
    
    HTTPStatusError: Client error '400 Bad Request' for url 'https://api.notion.com/v1/pages/XXXXXXXXREMOVED'
    For more information check: https://httpstatuses.com/400
    
    During handling of the above exception, another exception occurred:
    
    APIResponseError                          Traceback (most recent call last)
    Input In [86], in <cell line: 1>()
    ----> 1 notion_orm.pages.update(p)
    
    File ~/Sources/notional/src/notional/session.py:345, in PagesEndpoint.update(self, page, **properties)
        338     properties = page.properties
        340 props = {
        341     name: value.to_api() if value is not None else None
        342     for name, value in properties.items()
        343 }
    --> 345 data = self().update(page.id.hex, properties=props)
        347 return page.refresh(**data)
    
    File ~/.mambaforge/envs/ultimate-notion/lib/python3.10/site-packages/notion_client/api_endpoints.py:218, in PagesEndpoint.update(self, page_id, **kwargs)
        213 def update(self, page_id: str, **kwargs: Any) -> SyncAsync[Any]:
        214     """Update [page property values](https://developers.notion.com/reference/page#property-value-object) for the specified page.
        215 
        216     *[🔗 Endpoint documentation](https://developers.notion.com/reference/patch-page)*
        217     """  # noqa: E501
    --> 218     return self.parent.request(
        219         path=f"pages/{page_id}",
        220         method="PATCH",
        221         body=pick(kwargs, "archived", "properties", "icon", "cover"),
        222         auth=kwargs.get("auth"),
        223     )
    
    File ~/.mambaforge/envs/ultimate-notion/lib/python3.10/site-packages/notion_client/client.py:192, in Client.request(self, path, method, query, body, auth)
        190 except httpx.TimeoutException:
        191     raise RequestTimeoutError()
    --> 192 return self._parse_response(response)
    
    File ~/.mambaforge/envs/ultimate-notion/lib/python3.10/site-packages/notion_client/client.py:124, in BaseClient._parse_response(self, response)
        122         code = None
        123     if code and is_api_error_code(code):
    --> 124         raise APIResponseError(response, body["message"], code)
        125     raise HTTPResponseError(error.response)
        127 body = response.json()
    
    APIResponseError: body failed validation. Fix one:
    body.properties.MyFormula.title should be defined, instead was `undefined`.
    body.properties.MyFormula.rich_text should be defined, instead was `undefined`.
    body.properties.MyFormula.number should be defined, instead was `undefined`.
    body.properties.MyFormula.url should be defined, instead was `undefined`.
    body.properties.MyFormula.select should be defined, instead was `undefined`.
    body.properties.MyFormula.multi_select should be defined, instead was `undefined`.
    body.properties.MyFormula.people should be defined, instead was `undefined`.
    body.properties.MyFormula.email should be defined, instead was `undefined`.
    body.properties.MyFormula.phone_number should be defined, instead was `undefined`.
    body.properties.MyFormula.date should be defined, instead was `undefined`.
    body.properties.MyFormula.checkbox should be defined, instead was `undefined`.
    body.properties.MyFormula.relation should be defined, instead was `undefined`.
    body.properties.MyFormula.files should be defined, instead was `undefined`.
    body.properties.Level.type should be not present, instead was `"select"`.
    body.properties.Level.select should be not present, instead was `{"name":"Advanced","id":"]yHE","color":"blue"}`.
    body.properties.Level.name should be defined, instead was `undefined`.
    body.properties.Level.start should be defined, instead was `undefined`.
    

    Just removing the property MyFormula from the database fixes this problem. Interesting is that also the property Level seems to be affected when a Formula is present although it's of type select.

    Additional Context

    bug 
    opened by FlorianWilhelm 2
  • Methods on ORM properties should update on the server.

    Methods on ORM properties should update on the server.

    Description

    When methods are called on ORM properties, only the local objects update due to the get/set handler of a property.

    Proposed Solution

    Calling methods on properties from ORM classes should reflect changes on the server.

    Alternatives

    Alternatives are to use in-place modifiers, such as += for ORM properties. This only works for certain property types.

    Additional Context

    Related issues:

    • #30
    enhancement 
    opened by jheddings 0
  • Late binding of session to custom ORM pages is broken.

    Late binding of session to custom ORM pages is broken.

    Currently, sessions must be bound to a ConnectedPage prior to defining custom types.

    CustomPage = connected_page()
    
    def Animal(CustomPage):
        # ORM properties
    
    def main():
        notion = notional.connect(auth=auth_token)
        CustomPage.bind(notion)
    
        # at this point, the session in Animal is None
    
    bug 
    opened by jheddings 1
  • Page updates fail when page properties are read only.

    Page updates fail when page properties are read only.

    Submitting page changes breaks when the page contains properties that are read only, such as formula and created_by.

    Version: HEAD

    Traceback (most recent call last):
      File ".../notional/examples/props.py", line 40, in <module>
        notion.pages.update(page)
      File ".../notional/notional/session.py", line 249, in update
        data = self().update(page.id.hex, **diff)
      File ".../notional/.venv/lib/python3.9/site-packages/notion_client/api_endpoints.py", line 164, in update
        return self.parent.request(
      File ".../notional/.venv/lib/python3.9/site-packages/notion_client/client.py", line 155, in request
        return self._parse_response(response)
      File ".../notional/.venv/lib/python3.9/site-packages/notion_client/client.py", line 111, in _parse_response
        raise APIResponseError(response, body["message"], code)
    notion_client.errors.APIResponseError: body failed validation. Fix one: body.properties.Created By.title should be defined, instead was `undefined`. body.properties.Created By.rich_text should be defined, instead was `undefined`. body.properties.Created By.number should be defined, instead was `undefined`. body.properties.Created By.url should be defined, instead was `undefined`. body.properties.Created By.select should be defined, instead was `undefined`. body.properties.Created By.multi_select should be defined, instead was `undefined`. body.properties.Created By.people should be defined, instead was `undefined`. body.properties.Created By.email should be defined, instead was `undefined`. body.properties.Created By.phone_number should be defined, instead was `undefined`. body.properties.Created By.date should be defined, instead was `undefined`. body.properties.Created By.checkbox should be defined, instead was `undefined`. body.properties.Created By.relation should be defined, instead was `undefined`. body.properties.Created By.files should be defined, instead was `undefined`. 
    
    bug 
    opened by jheddings 1
Releases(v0.7.0)
  • v0.7.0(Jan 3, 2023)

    ⚠️ BREAKING CHANGES

    • EndpointIterator now requires an additional call when using in a loop
    • to_api() has been renamed dict() - which overrides default Pydantic behavior
    • Time filters have been refactored to use the "composable" object pattern

    Completed PR's

    • Add support for the properties endpoint. by @jheddings in https://github.com/jheddings/notional/pull/101
    • Add support for additional parent objects. by @jheddings in https://github.com/jheddings/notional/pull/105
    • Refactored iterators in support of top-level objects. by @jheddings in https://github.com/jheddings/notional/pull/106

    Full Changelog: https://github.com/jheddings/notional/compare/v0.5.2...v0.7.0

    Source code(tar.gz)
    Source code(zip)
  • v0.5.2(Dec 30, 2022)

  • v0.5.1(Dec 23, 2022)

    What's Changed

    • Improved object references in session endpoints. by @jheddings in https://github.com/jheddings/notional/pull/100

    Full Changelog: https://github.com/jheddings/notional/compare/v0.5.0...v0.5.1

    Source code(tar.gz)
    Source code(zip)
  • v0.5.0(Dec 20, 2022)

    ⚠️ BREAKING CHANGES

    • The records module has been removed; classes have been moved into the blocks module.
    • NestedObject has been removed; this was not adding any real value.
    • Relation objects no longer support the compose interface; callers must compose the appropriate subclass instead.
    • Object references have been moved into the types module with some minor modifications.

    What's Changed

    • Easier MentionObject API by @jheddings in https://github.com/jheddings/notional/pull/94
    • Update object model to match Notion API by @jheddings in https://github.com/jheddings/notional/pull/95
    • Other minor improvements and bug fixes
    • Switched from dependabot to Renovate

    Full Changelog: https://github.com/jheddings/notional/compare/v0.4.4...v0.5.0

    Source code(tar.gz)
    Source code(zip)
  • v0.4.4(Dec 2, 2022)

    What's Changed

    • Fix #69 (composing select blocks)
    • Add indexing for simple tables.
    • Using installed package metadata for version info.
    • Updated several dependencies.

    Full Changelog: https://github.com/jheddings/notional/compare/v0.4.3...v0.4.4

    Source code(tar.gz)
    Source code(zip)
  • v0.4.3(Nov 8, 2022)

    What's Changed

    • Fixed #66
    • Added missing BooleanFormula by @FlorianWilhelm in https://github.com/jheddings/notional/pull/58
    • Allow setting ExternalFile as icon in ORM by @FlorianWilhelm in https://github.com/jheddings/notional/pull/61
    • Simplify and correct is_emoji, add unit test by @FlorianWilhelm in https://github.com/jheddings/notional/pull/62
    • Fixes issue #57 by @FlorianWilhelm in https://github.com/jheddings/notional/pull/63

    New Contributors

    • @FlorianWilhelm made their first contribution in https://github.com/jheddings/notional/pull/58

    Full Changelog: https://github.com/jheddings/notional/compare/v0.4.1...v0.4.3

    Source code(tar.gz)
    Source code(zip)
  • v0.4.1(Jun 7, 2022)

    Thanks to @falcaopetri for the PR's!

    What's Changed

    • Fixed a bug with changes in API field names - #51
    • Fixed typos by @falcaopetri in https://github.com/jheddings/notional/pull/43
    • Default NOTION_{AUTH_TOKEN,TEST_AREA} during preflight by @falcaopetri in https://github.com/jheddings/notional/pull/45
    • Several minor dependency updates.

    New Contributors

    • @falcaopetri made their first contribution in https://github.com/jheddings/notional/pull/43

    Full Changelog: https://github.com/jheddings/notional/compare/v0.4.0...v0.4.1

    Source code(tar.gz)
    Source code(zip)
  • v0.4.0(Apr 27, 2022)

    NOTE due to changes in the Notion API, this is a breaking release. Please verify your applications before updating!

    What's Changed

    • Corrected for API changes (#39, #40).
    • Improved ORM declarations using scheme types. by @jheddings in https://github.com/jheddings/notional/pull/33
    • Improved ORM support. by @jheddings in https://github.com/jheddings/notional/pull/38

    Full Changelog: https://github.com/jheddings/notional/compare/v0.3.2...v0.4.0

    Source code(tar.gz)
    Source code(zip)
  • v0.3.2(Apr 19, 2022)

  • v0.3.1(Apr 14, 2022)

    BREAKING CHANGES

    This release adds a significant change to the way blocks (and other data objects) are created. In particular, objects will use metaclass indexers rather than the from_ factory (and related) methods. Please review the latest documentation and examples for detailed usage.

    I anticipate similar changes to other objects if it makes sense, which may result in additional interface changes.

    What's Changed

    • Add support for composable objects. by @jheddings in https://github.com/jheddings/notional/pull/31
    • Created several additional helper methods & properties.
    • Many documentation and unit test updates.

    Full Changelog: https://github.com/jheddings/notional/compare/v0.2.1...v0.3.1

    Source code(tar.gz)
    Source code(zip)
  • v0.2.1(Apr 9, 2022)

    What's Changed

    • Added helper methods for Relation and Rollup types.
    • Several critical lint fixes, including full docstrings.
    • Various other documentation updates.

    Full Changelog: https://github.com/jheddings/notional/compare/v0.2.0...v0.2.1

    Source code(tar.gz)
    Source code(zip)
  • v0.2.0(Apr 8, 2022)

    NOTE: there are many changes to method and constant names in this release. Most of these are internal, however some may affect users. Please verify these changes to make sure it does not break your project!

    What's Changed

    • New document parsers - HTML and CSV
    • Updates for the latest Notion API release
    • Multiple lint fixes
    • Several bug fixes and dependency updates

    Full Changelog: https://github.com/jheddings/notional/compare/v0.1.1...v0.2.0

    Source code(tar.gz)
    Source code(zip)
  • v0.1.1(Mar 11, 2022)

    What's Changed

    • Fixed an issue with data refresh when appending blocks.
    • Added helper methods for working with tables.
    • More helpers and new block types.

    Full Changelog: https://github.com/jheddings/notional/compare/v0.1.0...v0.1.1

    Available on PyPi: https://pypi.org/project/notional/0.1.1/

    Source code(tar.gz)
    Source code(zip)
  • v0.1.0(Mar 10, 2022)

    Note: this is a significant update with several changes to internal interfaces.

    What's Changed

    • Several features to support new API capabilities.
    • Fixed bugs in query builder that limited to a single filter.
    • Fixed bugs in API blocks with empty nested data.
    • Added basic markdown rendering of some blocks.
    • Added other helpers and data accessors.

    Full Changelog: https://github.com/jheddings/notional/compare/v0.0.10...v0.1.0

    Available on PyPi: https://pypi.org/project/notional/0.1.0/

    Source code(tar.gz)
    Source code(zip)
  • v0.0.10(Nov 12, 2021)

    What's Changed

    • Added search endpoint. by @jheddings in https://github.com/jheddings/notional/pull/19

    Full Changelog: https://github.com/jheddings/notional/compare/v0.0.9...v0.0.10

    Source code(tar.gz)
    Source code(zip)
  • v0.0.9(Nov 11, 2021)

    • Lots of changes to data type handling.
    • Several new features from the Notion API.
    • Improved ORM handling of keywords.
    • Added structured filters to Query (instead of legacy keywords).

    Full Changelog: https://github.com/jheddings/notional/compare/v0.0.8...v0.0.9

    Source code(tar.gz)
    Source code(zip)
  • v0.0.8(Oct 25, 2021)

    This release breaks previous compatibility. See tests and examples for latest usage information.

    • Includes lates data types and features from the public Notion API
    • Multiple improvements in overall usage and readability

    View commit log for full details.

    Source code(tar.gz)
    Source code(zip)
  • v0.0.7(Sep 2, 2021)

    Initial support for creating new content.

    There have been several breaking changes to the SDK interface in this release. Be sure to check the latest tests and examples for working code.

    Source code(tar.gz)
    Source code(zip)
  • v0.0.3(Aug 3, 2021)

  • v0.0.2(Aug 3, 2021)

  • v0.0.1(Aug 3, 2021)

Owner
Jason Heddings
Jason Heddings
A discord bot consuming Notion API to add, retrieve data to Notion databases.

Notion-DiscordBot A discord bot consuming Notion API to add and retrieve data from Notion databases. Instructions to use the bot: Pre-Requisites: a)In

Servatom 57 Dec 29, 2022
Notion4ever - Python tool for export all your content of Notion page using official Notion API

NOTION4EVER Notion4ever is a small python tool that allows you to free your cont

null 50 Dec 30, 2022
Graviti-python-sdk - Graviti Data Platform Python SDK

Graviti Python SDK Graviti Python SDK is a python library to access Graviti Data

Graviti 13 Dec 15, 2022
Unofficial Python API client for Notion.so

notion-py Unofficial Python 3 client for Notion.so API v3. Object-oriented interface (mapping database tables to Python classes/attributes) Automatic

Jamie Alexandre 3.9k Jan 3, 2023
A small repository with convenience functions for working with the Notion API.

Welcome! Within this respository are a few convenience functions to assist with the pulling and pushing of data from the Notion API.

null 10 Jul 9, 2022
A way to export your saved reddit posts to a Notion table.

reddit-saved-to-notion A way to export your saved reddit posts and comments to a Notion table.Uses notion-sdk-py and praw for interacting with Notion

null 19 Sep 12, 2022
Import Notion Tasks to

Notion-to-Google-Calendar (1 way) Import Notion Tasks to Google Calendar NO MORE UPDATES WILL BE MADE TO THIS REPO. Attention has been put on a 2-way

null 12 Aug 11, 2022
Notion API Database Python Implementation

Python Notion Database Notion API Database Python Implementation created only by database from the official Notion API. Installing / Getting started p

minwook 78 Dec 19, 2022
Token-gate Notion pages

This is a Next.js project bootstrapped with create-next-app. Getting Started First, run the development server: npm run dev # or yarn dev Open http://

John 8 Oct 13, 2022
Python 3 tools for interacting with Notion API

NotionDB Python 3 tools for interacting with Notion API: API client Relational database wrapper Installation pip install notiondb API client from noti

Viet Hoang 14 Nov 24, 2022
A small Python app to create Notion pages from Jira issues

Jira to Notion This little program will capture a Jira issue and create a corresponding Notion subpage. Mac users can fetch the current issue from the

Dr. Kerem Koseoglu 12 Oct 27, 2022
A script to automate the process of downloading Markdown and CSV backups of Notion

Automatic-Notion-Backup A script to automate the process of downloading Markdown and CSV backups of Notion. In addition, the data is processed to remo

Jorge Manuel Lozano Gómez 2 Nov 2, 2022
A small package to markdownify Notion blocks.

markdownify-notion A small package to markdownify notion blocks. Installation Install this library using pip: $ pip install markdownify-notion Usage

Sergio Sánchez Zavala 2 Oct 29, 2022
Discord RPC for Notion written in Python

Discord RPC for Notion This is a program that allows you to add your Notion workspace activities to your Discord profile. This project is currently un

Thuliumitation 1 Feb 10, 2022
Notflix - Notion / Netflix and IMDb to organise your movie dates. Happy Valentine <3 from 0x1za

Welcome to notflix ?? This is a project to help organise shows to watch with my

Mwiza Ed' Simbeye 3 Feb 15, 2022
AWS SDK for Python

Boto3 - The AWS SDK for Python Boto3 is the Amazon Web Services (AWS) Software Development Kit (SDK) for Python, which allows Python developers to wri

the boto project 7.8k Jan 8, 2023
Python SDK for Facebook's Graph API

Facebook Python SDK This client library is designed to support the Facebook Graph API and the official Facebook JavaScript SDK, which is the canonical

Mobolic 2.7k Jan 7, 2023
Box SDK for Python

Box Python SDK Installing Getting Started Authorization Server-to-Server Auth with JWT Traditional 3-legged OAuth2 Other Auth Options Usage Documentat

Box 371 Dec 29, 2022