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 Python API to retrieve and read MLB GameDay data

mlbgame mlbgame is a Python API to retrieve and read MLB GameDay data. mlbgame works with real time data, getting information as games are being playe

Zach Panzarino 493 Dec 13, 2022
This project is a basic login system in terminal for Discord

Welcome to Discord Login System(Terminal) 👋 This project is a basic login system in terminal for Discord Author 👤 arukovic Github: @SONIC-CODEZ Show

SONIC-CODEZ 2 Feb 11, 2022
Fun telegram bot =)

Recolor Bot About Fun telegram bot, that can change your hair color. Preparations Update package lists sudo apt-get update; Make sure Git and docker-c

Just Koala 4 Jul 09, 2022
Fast IP address lookup

ipscoop Fast IP Scoop Table of Contents Installation CLI Getting Started Ref Installation To install ipscoop, simply: $ python3 -m pip install -U git+

6 Mar 16, 2022
Trading bot rienforcement with python

Trading_bot_rienforcement System: Ubuntu 16.04 GPU (GeForce GTX 1080 Ti) Instructions: In order to run the code: Make sure to clone the stable baselin

1 Oct 22, 2021
API Wrapper for seedr.cc

Seedr Python Client Seedr API built with 💛 by Souvik Pratiher Hit that Star button if you like this kind of SDKs and wants more of similar SDKs for o

Souvik Pratiher 2 Oct 24, 2021
Integrating Amazon API Gateway private endpoints with on-premises networks

Integrating Amazon API Gateway private endpoints with on-premises networks Read the blog about this application: Integrating Amazon API Gateway privat

AWS Samples 12 Sep 09, 2022
Simple Craigslist wrapper

python-craigslist A simple Craigslist wrapper. License: MIT-Zero. Disclaimer I don't work for or have any affiliation with Craigslist. This module was

Julio M. Alegria 370 Dec 22, 2022
BleachBit system cleaner for Windows and Linux

BleachBit BleachBit cleans files to free disk space and to maintain privacy. Running from source To run BleachBit without installation, unpack the tar

1.9k Jan 06, 2023
WhatsApp Multi Device Client

WhatsApp Multi Device Client

23 Nov 18, 2022
Python client for the Socrata Open Data API

sodapy sodapy is a python client for the Socrata Open Data API. Installation You can install with pip install sodapy. If you want to install from sour

Cristina 368 Dec 09, 2022
This is an Advanced Calculator maybe with Discord Buttons in python.

Welcome! This is an Advanced Calculator maybe with Discord Buttons in python. This was the first version of the calculator, made for my discord bot, P

Polsulpicien 18 Dec 24, 2022
Terraform wrapper to manage state across multiple cloud providers(AWS, GCP, and Azure)

Terraform Remote State Manager(tfremote) tf is a python package for managing terraform remote state for: Google(Gcloud), AWS, and Azure. It sets a def

tomarv2 1 Dec 08, 2021
Resources for the AMLD 2022 workshop "DevOps on AWS"

MLOPS on AWS | AMLD 2022 This repository contains all the resources necessary to follow along and reproduce the workshop "MLOps on AWS: a Hands-On Tut

xtream 8 Jun 16, 2022
A decentralized messaging daemon built on top of the Kademlia routing protocol.

parakeet-message A decentralized messaging daemon built on top of the Kademlia routing protocol. Now that you are done laughing... pictures what is it

Jonathan Abbott 3 Apr 23, 2022
Template to create a telegram bot in python

Template for Telegram Bot Template to create a telegram bot in python. How to Run Set your telegram bot token as environment variable TELEGRAM_BOT_TOK

PyTopia 12 Aug 14, 2022
You can share your Chegg account for answers using this bot with your friends without getting your account blocked/flagged

Chegg-Answer-Bot You can share your Chegg account for answers using this bot with your friends without getting your account blocked/flagged Reuirement

Ammey Saini 27 Dec 24, 2022
Make your Pass (sanitaire) Fun Again

Make Your Pass (Sanitaire) Fun Again Customize your Pass Sanitaire (French name for EU digital Covide19 Certificate) with colors and images, thus make

101 Dec 01, 2022
trackbranch is a tool for developers that can be used to store collections of branches in the form of profiles.

trackbranch trackbranch is a tool for developers that can be used to store collections of branches in the form of profiles. This can be useful for sit

Kevin Morris 1 Oct 21, 2021
A Next-Gen modular Python3 Telegram-Bot with Anime Theme to it.

Hsea Robot A modular Telegram Python bot running on python3 with a sqlalchemy database and an entirely themed persona to make Cutiepii suitable for An

Wahyusaputra 1 Dec 29, 2021