From e9c2d806cf9cae96fb1d90c16e566bbf8ba3b640 Mon Sep 17 00:00:00 2001 From: albcl Date: Sat, 18 Jun 2022 19:12:33 +0200 Subject: [PATCH 01/46] Added "create board by workspace id" --- monday/query_joins.py | 12 ++++++++++++ monday/resources/boards.py | 6 +++++- monday/tests/test_board_resource.py | 12 +++++++++++- monday/tests/test_case_resource.py | 1 + 4 files changed, 29 insertions(+), 2 deletions(-) diff --git a/monday/query_joins.py b/monday/query_joins.py index db34840..f0dd008 100644 --- a/monday/query_joins.py +++ b/monday/query_joins.py @@ -356,6 +356,18 @@ def get_columns_by_board_query(board_ids): }''' % board_ids +def create_board_by_workspace_query(board_name, board_kind, workspace_id = None): + workspace_query = f'workspace_id: {workspace_id}' if workspace_id else '' + query = ''' + mutation { + create_board (board_name:"%s", board_kind: %s, %s) { + id + } + } + ''' % (board_name, board_kind, workspace_query) + return query + + # USER RESOURCE QUERIES def get_users_query(**kwargs): query = '''query diff --git a/monday/resources/boards.py b/monday/resources/boards.py index fe9afd6..9aaccf8 100644 --- a/monday/resources/boards.py +++ b/monday/resources/boards.py @@ -1,5 +1,5 @@ from monday.resources.base import BaseResource -from monday.query_joins import get_boards_query, get_boards_by_id_query, get_board_items_query, \ +from monday.query_joins import create_board_by_workspace_query, get_boards_query, get_boards_by_id_query, get_board_items_query, \ get_columns_by_board_query @@ -22,3 +22,7 @@ def fetch_items_by_board_id(self, board_ids): def fetch_columns_by_board_id(self, board_ids): query = get_columns_by_board_query(board_ids) return self.client.execute(query) + + def create_board(self, board_name, board_kind, workspace_id): + query = create_board_by_workspace_query(board_name, board_kind, workspace_id) + return self.client.execute(query) \ No newline at end of file diff --git a/monday/tests/test_board_resource.py b/monday/tests/test_board_resource.py index 3cd13fb..d476019 100644 --- a/monday/tests/test_board_resource.py +++ b/monday/tests/test_board_resource.py @@ -1,5 +1,5 @@ from monday.tests.test_case_resource import BaseTestCase -from monday.query_joins import get_boards_query, get_boards_by_id_query, get_board_items_query, \ +from monday.query_joins import create_board_by_workspace_query, get_boards_query, get_boards_by_id_query, get_board_items_query, \ get_columns_by_board_query @@ -22,3 +22,13 @@ def test_get_board_items_query(self): def test_get_columns_by_board_query(self): query = get_columns_by_board_query(board_ids=self.board_id) self.assertIn(str(self.board_id), query) + + def test_create_board_by_workspace_query(self): + query_a = create_board_by_workspace_query(board_name=self.board_name, board_kind=self.board_kind, workspace_id=self.workspace_id) + self.assertIn(str(self.board_name), query_a) + self.assertIn(str(self.board_kind), query_a) + self.assertIn(str(self.workspace_id), query_a) + query_b = create_board_by_workspace_query(board_name=self.board_name, board_kind=self.board_kind) + self.assertIn(str(self.board_name), query_b) + self.assertIn(str(self.board_kind), query_b) + self.assertNotIn(str(self.workspace_id), query_b) diff --git a/monday/tests/test_case_resource.py b/monday/tests/test_case_resource.py index d8ad9f0..706f1ca 100644 --- a/monday/tests/test_case_resource.py +++ b/monday/tests/test_case_resource.py @@ -7,6 +7,7 @@ def setUp(self): self.group_name = "my_group" self.item_name = "Nerd" self.item_id = 24 + self.board_name = "my_board" self.board_id = 12 self.board_kind = "public" self.group_id = 7 From 748f418620b972eb69b84d6509e270fb4ac469e1 Mon Sep 17 00:00:00 2001 From: albcl Date: Sat, 18 Jun 2022 19:12:39 +0200 Subject: [PATCH 02/46] Update readme --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 7720eb6..1dc8b1c 100644 --- a/README.md +++ b/README.md @@ -61,6 +61,8 @@ monday.items.create_item(board_id='12345678', group_id='today', item_name='Do a - `fetch_items_by_board_id([board_ids])` - Get all items on a board(s). Accepts a comma separated list of board ids. +- `create_board(board_name, board_kind, workspace_id)` - Create board with the given name and kind by (and optional) workspace id. + #### Users Resource (monday.users) - `fetch_users(**kwargs)` - Fetch user information associated with an account. See Monday API docs for a list of accepted keyword arguments. From 54802284547a554325b2ec6312f2c9aca13252f1 Mon Sep 17 00:00:00 2001 From: albcl Date: Mon, 20 Jun 2022 17:08:51 +0200 Subject: [PATCH 03/46] Added "duplicate board" query and type hint --- monday/query_joins.py | 17 +++++++++++++++++ monday/resources/boards.py | 7 ++++++- monday/resources/types.py | 9 +++++++++ monday/tests/test_board_resource.py | 8 +++++++- monday/tests/test_case_resource.py | 3 +++ 5 files changed, 42 insertions(+), 2 deletions(-) create mode 100644 monday/resources/types.py diff --git a/monday/query_joins.py b/monday/query_joins.py index db34840..4772128 100644 --- a/monday/query_joins.py +++ b/monday/query_joins.py @@ -1,4 +1,5 @@ import json +from monday.resources.types import DuplicateTypes from monday.utils import monday_json_stringify @@ -356,6 +357,22 @@ def get_columns_by_board_query(board_ids): }''' % board_ids +def duplicate_board_query(board_id: int, duplicate_type: DuplicateTypes): + query = """ + mutation { + duplicate_board(board_id: %s, duplicate_type: %s) { + board { + id + } + } + } + """ % ( + board_id, + duplicate_type.value, + ) + return query + + # USER RESOURCE QUERIES def get_users_query(**kwargs): query = '''query diff --git a/monday/resources/boards.py b/monday/resources/boards.py index fe9afd6..73f46e2 100644 --- a/monday/resources/boards.py +++ b/monday/resources/boards.py @@ -1,6 +1,7 @@ from monday.resources.base import BaseResource -from monday.query_joins import get_boards_query, get_boards_by_id_query, get_board_items_query, \ +from monday.query_joins import duplicate_board_query, get_boards_query, get_boards_by_id_query, get_board_items_query, \ get_columns_by_board_query +from monday.resources.types import DuplicateTypes class BoardResource(BaseResource): @@ -22,3 +23,7 @@ def fetch_items_by_board_id(self, board_ids): def fetch_columns_by_board_id(self, board_ids): query = get_columns_by_board_query(board_ids) return self.client.execute(query) + + def duplicate_board(self, board_id: int, duplicate_type: DuplicateTypes): + query = duplicate_board_query(board_id, duplicate_type) + return self.client.execute(query) diff --git a/monday/resources/types.py b/monday/resources/types.py new file mode 100644 index 0000000..01292ea --- /dev/null +++ b/monday/resources/types.py @@ -0,0 +1,9 @@ +from enum import Enum + + +class DuplicateTypes(Enum): + """Board duplication types""" + + WITH_STRUCTURE = "duplicate_board_with_structure" + WITH_PULSES = "duplicate_board_with_pulses" + WITH_PULSES_AND_UPDATES = "duplicate_board_with_pulses_and_updates" diff --git a/monday/tests/test_board_resource.py b/monday/tests/test_board_resource.py index 3cd13fb..411dcc1 100644 --- a/monday/tests/test_board_resource.py +++ b/monday/tests/test_board_resource.py @@ -1,5 +1,5 @@ from monday.tests.test_case_resource import BaseTestCase -from monday.query_joins import get_boards_query, get_boards_by_id_query, get_board_items_query, \ +from monday.query_joins import duplicate_board_query, get_boards_query, get_boards_by_id_query, get_board_items_query, \ get_columns_by_board_query @@ -22,3 +22,9 @@ def test_get_board_items_query(self): def test_get_columns_by_board_query(self): query = get_columns_by_board_query(board_ids=self.board_id) self.assertIn(str(self.board_id), query) + + def test_duplicate_board_query(self): + query = duplicate_board_query(board_id=self.board_id, duplicate_type=self.duplicate_type) + self.assertIn(str(self.board_id), query) + self.assertNotIn(str(self.duplicate_type), query) + self.assertIn(str(self.duplicate_type.value), query) diff --git a/monday/tests/test_case_resource.py b/monday/tests/test_case_resource.py index d8ad9f0..e6859e0 100644 --- a/monday/tests/test_case_resource.py +++ b/monday/tests/test_case_resource.py @@ -1,5 +1,7 @@ import unittest +from monday.resources.types import DuplicateTypes + class BaseTestCase(unittest.TestCase): @@ -9,6 +11,7 @@ def setUp(self): self.item_id = 24 self.board_id = 12 self.board_kind = "public" + self.duplicate_type = DuplicateTypes.WITH_PULSES self.group_id = 7 self.column_id = "file_column" self.user_ids = [1287123, 1230919] From 5dc386dcf5cbd7fc683e0f352f20495fbfc9989b Mon Sep 17 00:00:00 2001 From: albcl Date: Mon, 20 Jun 2022 17:10:00 +0200 Subject: [PATCH 04/46] Readme updated --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 7720eb6..91b211b 100644 --- a/README.md +++ b/README.md @@ -61,6 +61,8 @@ monday.items.create_item(board_id='12345678', group_id='today', item_name='Do a - `fetch_items_by_board_id([board_ids])` - Get all items on a board(s). Accepts a comma separated list of board ids. +- `duplicate_board(board_id, duplicate_type)` - Duplicate a board by its id. It requires a duplication type to be chosen (*duplicate_board_with_structure / duplicate_board_with_pulses / duplicate_board_with_pulses_and_updates*). + #### Users Resource (monday.users) - `fetch_users(**kwargs)` - Fetch user information associated with an account. See Monday API docs for a list of accepted keyword arguments. From 873dda3bd538e2252464b2e369e5c84c8d60273c Mon Sep 17 00:00:00 2001 From: albcl Date: Wed, 29 Jun 2022 10:28:03 +0200 Subject: [PATCH 05/46] Added extra parameters for the query --- monday/query_joins.py | 47 ++++++++++++++++++++++++++------------ monday/resources/boards.py | 13 +++++++++-- 2 files changed, 44 insertions(+), 16 deletions(-) diff --git a/monday/query_joins.py b/monday/query_joins.py index 4772128..3b0a55a 100644 --- a/monday/query_joins.py +++ b/monday/query_joins.py @@ -337,25 +337,44 @@ def get_boards_by_id_query(board_ids): }''' % board_ids -def get_columns_by_board_query(board_ids): - return '''query - { - boards(ids: %s) { +def duplicate_board_query( + board_id: int, + duplicate_type: DuplicateTypes, + board_name: str = None, + workspace_id: int = None, + folder_id: int = None, + keep_subscribers: bool = None, +) -> str: + board_name = board_name if board_name else "" + workspace_id = workspace_id if workspace_id else None + folder_id = folder_id if folder_id else None + keep_subscribers = keep_subscribers if keep_subscribers else False + + params = """board_id: %s, duplicate_type: %s, board_name: \"%s\"""" % ( + board_id, + duplicate_type.value, + board_name, + ) + + if workspace_id: + params += """, workspace_id: %s""" + + query = """ + mutation { + duplicate_board(%s) { + board { id - name - groups { + groups{ id - title } - columns { - title - id - type - settings_str - } } - }''' % board_ids + } + } + """ % ( + params + ) + return query def duplicate_board_query(board_id: int, duplicate_type: DuplicateTypes): query = """ diff --git a/monday/resources/boards.py b/monday/resources/boards.py index 73f46e2..fc05ce6 100644 --- a/monday/resources/boards.py +++ b/monday/resources/boards.py @@ -24,6 +24,15 @@ def fetch_columns_by_board_id(self, board_ids): query = get_columns_by_board_query(board_ids) return self.client.execute(query) - def duplicate_board(self, board_id: int, duplicate_type: DuplicateTypes): - query = duplicate_board_query(board_id, duplicate_type) + def duplicate_board( + self, + board_id: int, + duplicate_type: DuplicateTypes, + board_name: str = None, + workspace_id: int = None, + folder_id: int = None, + keep_subscribers: bool = None, + ): + query = duplicate_board_query(board_id, duplicate_type, board_name, workspace_id, folder_id, keep_subscribers) + return self.client.execute(query) return self.client.execute(query) From d707140e046797198dc1c17a703f09ff4860dbbc Mon Sep 17 00:00:00 2001 From: albcl Date: Tue, 18 Oct 2022 13:39:56 +0200 Subject: [PATCH 06/46] Query and tests updated --- monday/query_joins.py | 15 --------------- monday/tests/test_board_resource.py | 15 +++++++++++---- 2 files changed, 11 insertions(+), 19 deletions(-) diff --git a/monday/query_joins.py b/monday/query_joins.py index 7e22b97..56e34a7 100644 --- a/monday/query_joins.py +++ b/monday/query_joins.py @@ -376,21 +376,6 @@ def duplicate_board_query( return query -def duplicate_board_query(board_id: int, duplicate_type: DuplicateTypes): - query = """ - mutation { - duplicate_board(board_id: %s, duplicate_type: %s) { - board { - id - } - } - } - """ % ( - board_id, - duplicate_type.value, - ) - return query - def create_board_by_workspace_query(board_name, board_kind, workspace_id = None): workspace_query = f'workspace_id: {workspace_id}' if workspace_id else '' diff --git a/monday/tests/test_board_resource.py b/monday/tests/test_board_resource.py index 522763b..59b4d8c 100644 --- a/monday/tests/test_board_resource.py +++ b/monday/tests/test_board_resource.py @@ -23,10 +23,17 @@ def test_get_columns_by_board_query(self): self.assertIn(str(self.board_id), query) def test_duplicate_board_query(self): - query = duplicate_board_query(board_id=self.board_id, duplicate_type=self.duplicate_type) - self.assertIn(str(self.board_id), query) - self.assertNotIn(str(self.duplicate_type), query) - self.assertIn(str(self.duplicate_type.value), query) + query_a = duplicate_board_query(board_id=self.board_id, duplicate_type=self.duplicate_type) + self.assertIn(str(self.board_id), query_a) + self.assertNotIn(str(self.duplicate_type), query_a) + self.assertIn(str(self.duplicate_type.value), query_a) + query_b = duplicate_board_query(board_id=self.board_id, duplicate_type=self.duplicate_type, board_name='testing_name', workspace_id=1, folder_id=2) + self.assertIn(str(self.board_id), query_b) + self.assertNotIn(str(self.duplicate_type), query_b) + self.assertIn(str(self.duplicate_type.value), query_b) + self.assertIn(str('testing_name'), query_b) + self.assertIn(str(1), query_b) + self.assertIn(str(2), query_b) def test_create_board_by_workspace_query(self): query_a = create_board_by_workspace_query(board_name=self.board_name, board_kind=self.board_kind, workspace_id=self.workspace_id) From 12b6834251d6b9cc6fb73bc787f58424c76364be Mon Sep 17 00:00:00 2001 From: albcl Date: Tue, 18 Oct 2022 13:40:02 +0200 Subject: [PATCH 07/46] Readme update --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 127d9e0..b9df741 100644 --- a/README.md +++ b/README.md @@ -61,7 +61,7 @@ monday.items.create_item(board_id='12345678', group_id='today', item_name='Do a - `fetch_items_by_board_id([board_ids])` - Get all items on a board(s). Accepts a comma separated list of board ids. -- `duplicate_board(board_id, duplicate_type)` - Duplicate a board by its id. It requires a duplication type to be chosen (*duplicate_board_with_structure / duplicate_board_with_pulses / duplicate_board_with_pulses_and_updates*). +- `duplicate_board(board_id, duplicate_type, board_name, workspace_id, folder_id, keep_subscribers)` - Duplicate a board by its id. It requires a duplication type to be chosen (*duplicate_board_with_structure / duplicate_board_with_pulses / duplicate_board_with_pulses_and_updates*). Optionaly you can use `board_name` (*String*) to give it a new name, also the destination `workspace_id` (*Int*. Defaults to the original board's workspace) and the destination `folder_id` (*Int*. Defaults to originals board's folder) within the destination workspace. *Note: The folder_id is required if you are duplicating to another workspace. Optional otherwise.* Finally, you can make use of `keep_subscribers` (*Boolean*. Defaults to false) to duplicate the subscribers to the new board. - `create_board(board_name, board_kind, workspace_id)` - Create board with the given name and kind by (and optional) workspace id. From f19658653ef34a295c9c73a4cfc9794215954428 Mon Sep 17 00:00:00 2001 From: albcl Date: Tue, 18 Oct 2022 17:53:56 +0200 Subject: [PATCH 08/46] Restructured Readme --- README.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index b9df741..f6ddcb1 100644 --- a/README.md +++ b/README.md @@ -61,7 +61,11 @@ monday.items.create_item(board_id='12345678', group_id='today', item_name='Do a - `fetch_items_by_board_id([board_ids])` - Get all items on a board(s). Accepts a comma separated list of board ids. -- `duplicate_board(board_id, duplicate_type, board_name, workspace_id, folder_id, keep_subscribers)` - Duplicate a board by its id. It requires a duplication type to be chosen (*duplicate_board_with_structure / duplicate_board_with_pulses / duplicate_board_with_pulses_and_updates*). Optionaly you can use `board_name` (*String*) to give it a new name, also the destination `workspace_id` (*Int*. Defaults to the original board's workspace) and the destination `folder_id` (*Int*. Defaults to originals board's folder) within the destination workspace. *Note: The folder_id is required if you are duplicating to another workspace. Optional otherwise.* Finally, you can make use of `keep_subscribers` (*Boolean*. Defaults to false) to duplicate the subscribers to the new board. +- `duplicate_board(board_id, duplicate_type, board_name, workspace_id, folder_id, keep_subscribers)` - Duplicate a board by its id. It requires a duplication type to be chosen (*duplicate_board_with_structure / duplicate_board_with_pulses / duplicate_board_with_pulses_and_updates*). Optionaly you can use: + - `board_name` - The duplicated board's name (*string*). + - `workspace_id` - The destination workspace (*int* Defaults to the original board's workspace). + - `folder_id` - The destination folder within the destination workspace. The folder_id is required if you are duplicating to another workspace. (*int* Defaults to originals board's folder). + - `keep_subscribers` - Ability to duplicate the subscribers to the new board (*Boolean* Defaults to false). - `create_board(board_name, board_kind, workspace_id)` - Create board with the given name and kind by (and optional) workspace id. From 89a5b8c0c0465b233127cd1bac51b091cbe6f433 Mon Sep 17 00:00:00 2001 From: Tony Morello Date: Fri, 2 Sep 2022 10:52:55 -0700 Subject: [PATCH 09/46] Added move_item_to_group and archive_item_by_id (#73) * Added move item to group and archive item * Added tests for move item to group and archive item * Updated README.md * Update package version --- README.md | 4 ++++ monday/__version__.py | 2 +- monday/query_joins.py | 26 +++++++++++++++++++++++++- monday/resources/items.py | 11 ++++++++++- monday/tests/test_item_resource.py | 20 +++++++++++++++++++- 5 files changed, 59 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index f6ddcb1..e718c19 100644 --- a/README.md +++ b/README.md @@ -38,6 +38,10 @@ monday.items.create_item(board_id='12345678', group_id='today', item_name='Do a - `add_file_to_column(item_id, column_id, file)` - Upload a file to a file type column specified by column_id. Monday limits uploads to 500MB in size. +- `move_item_to_group(item_id, group_id)` - Move the item to a group within the same board. + +- `archive_item_by_id(item_id)` - Archive the item by item_id. + - `delete_item_by_id(item_id)` - Delete the item by item_id. #### Updates Resource (monday.updates) diff --git a/monday/__version__.py b/monday/__version__.py index 8ef82a1..eace817 100644 --- a/monday/__version__.py +++ b/monday/__version__.py @@ -1,3 +1,3 @@ -__version__ = '1.3.0' +__version__ = '1.3.1' __author__ = 'Christina D\'Astolfo' __email__ = 'chdastolfo@gmail.com, pevner@prodperfect.com, lemi@prodperfect.com' diff --git a/monday/query_joins.py b/monday/query_joins.py index 56e34a7..105fb5e 100644 --- a/monday/query_joins.py +++ b/monday/query_joins.py @@ -128,6 +128,30 @@ def update_item_query(board_id, item_id, column_id, value): return query +def move_item_to_group_query(item_id, group_id): + query = ''' + mutation + { + move_item_to_group (item_id: %s, group_id: %s) + { + id + } + }''' % (item_id, group_id) + return query + + +def archive_item_query(item_id): + query = ''' + mutation + { + archive_item (item_id: %s) + { + id + } + }''' % item_id + return query + + def delete_item_query(item_id): query = ''' mutation @@ -190,7 +214,7 @@ def create_update_query(item_id, update_value): def get_updates_for_item_query(board, item, limit): - query = '''query + query = '''query {boards (ids: %s) {items (ids: %s) { updates (limit: %s) { diff --git a/monday/resources/items.py b/monday/resources/items.py index 7d8aa1d..73e365c 100644 --- a/monday/resources/items.py +++ b/monday/resources/items.py @@ -1,6 +1,7 @@ from monday.resources.base import BaseResource from monday.query_joins import mutate_item_query, get_item_query, update_item_query, get_item_by_id_query, \ - update_multiple_column_values_query, mutate_subitem_query, add_file_to_column_query, delete_item_query + update_multiple_column_values_query, mutate_subitem_query, add_file_to_column_query, delete_item_query, \ + archive_item_query, move_item_to_group_query class ItemResource(BaseResource): @@ -40,6 +41,14 @@ def add_file_to_column(self, item_id, column_id, file): query = add_file_to_column_query(item_id, column_id) return self.file_upload_client.execute(query, variables={'file': file}) + def move_item_to_group(self, item_id, group_id): + query = move_item_to_group_query(item_id, group_id) + return self.client.execute(query) + + def archive_item_by_id(self, item_id): + query = archive_item_query(item_id) + return self.client.execute(query) + def delete_item_by_id(self, item_id): query = delete_item_query(item_id) return self.client.execute(query) diff --git a/monday/tests/test_item_resource.py b/monday/tests/test_item_resource.py index 0141db9..5623781 100644 --- a/monday/tests/test_item_resource.py +++ b/monday/tests/test_item_resource.py @@ -1,6 +1,7 @@ from monday.tests.test_case_resource import BaseTestCase from monday.query_joins import mutate_item_query, get_item_query, update_item_query, get_item_by_id_query, \ - update_multiple_column_values_query, mutate_subitem_query, add_file_to_column_query, delete_item_query + update_multiple_column_values_query, mutate_subitem_query, add_file_to_column_query, delete_item_query, \ + archive_item_query, move_item_to_group_query from monday.utils import monday_json_stringify @@ -68,3 +69,20 @@ def test_delete_item_by_id(self): id } }'''.replace(" ", ""), query.replace(" ", "")) + + def test_archive_item_by_id(self): + query = archive_item_query(item_id=self.item_id) + self.assertIn(str(self.item_id), query) + self.assertEqual(''' + mutation + { + archive_item (item_id: 24) + { + id + } + }'''.replace(" ", ""), query.replace(" ", "")) + + def test_move_item_to_group_query(self): + query = move_item_to_group_query(item_id=self.item_id, group_id=self.group_id) + self.assertIn(str(self.item_id), query) + self.assertIn(str(self.group_id), query) From cdeaa30fe2be073d6304ae16bc2a130b03ea19ad Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wojtek=20Ba=C5=BCant?= Date: Sat, 29 Oct 2022 04:44:26 +0100 Subject: [PATCH 10/46] Add id to payload of get_item_by_id_query (#74) --- monday/query_joins.py | 1 + 1 file changed, 1 insertion(+) diff --git a/monday/query_joins.py b/monday/query_joins.py index 105fb5e..557296d 100644 --- a/monday/query_joins.py +++ b/monday/query_joins.py @@ -90,6 +90,7 @@ def get_item_by_id_query(ids): query = '''query { items (ids: %s) { + id, name, group { id From 050c32d300108d732e336a41a8365ed9d23cf961 Mon Sep 17 00:00:00 2001 From: "Alb. C" <17050266+albcl@users.noreply.github.com> Date: Sat, 29 Oct 2022 05:51:07 +0200 Subject: [PATCH 11/46] Feature/create board by workspace (#60) * Added "create board by workspace id" * Update readme * Added missing type hints * Updated test * More custom type hints * Type hints for 'get_boards_query' * Fixed tests * Updated Readme and 'fetch_boards' method --- README.md | 9 +++++- monday/query_joins.py | 45 +++++++++++++++++++++++++---- monday/resources/boards.py | 19 ++++++++---- monday/resources/types.py | 24 +++++++++++++++ monday/tests/test_board_resource.py | 31 +++++++++++++++++--- monday/tests/test_case_resource.py | 6 ++-- 6 files changed, 115 insertions(+), 19 deletions(-) diff --git a/README.md b/README.md index e718c19..79ab4c2 100644 --- a/README.md +++ b/README.md @@ -57,7 +57,14 @@ monday.items.create_item(board_id='12345678', group_id='today', item_name='Do a #### Boards Resource (monday.boards) -- `fetch_boards(**kwargs)` - Fetch boards associated with an account. Returns boards and their groups, tags, and columns. Accepts keyword arguments. See Monday API docs for a list of accepted keyword arguments. +- `fetch_boards(**kwargs)` - Fetch boards associated with an account. Returns boards and their groups, tags, and columns. Accepts keyword arguments: + - `limit` - The number of boards returned (*int*. Default is 25). + - `page` - The page number returned, should you implement pagination(*int*. Starts at 1). + - `ids` - A list of the unique board identifier(s) (*List[int]*). + - `board_kind` - The board's kind (*BoardKind*. public / private / share). + - `state` - The state of the board (*BoardState*. all / active / archived / deleted. Default is active). + - `order_by` - The order in which to retrieve your boards (*BoardsOrderBy*. created_at / used_at). + - `fetch_boards_by_id([board_ids])` - Since Monday does not allow querying boards by name, you can use `fetch_boards` to get a list of boards, and then `fetch_boards_by_id` to get more detailed info about the groups and columns on that board. Accepts a comma separated list of board ids. diff --git a/monday/query_joins.py b/monday/query_joins.py index 557296d..98b3e5e 100644 --- a/monday/query_joins.py +++ b/monday/query_joins.py @@ -1,6 +1,7 @@ import json -from monday.resources.types import DuplicateTypes - +from enum import Enum +from typing import List +from monday.resources.types import BoardKind, BoardState, BoardsOrderBy, DuplicateTypes from monday.utils import monday_json_stringify @@ -312,7 +313,18 @@ def get_board_items_query(board_id): return query -def get_boards_query(**kwargs): +def get_boards_query(limit: int = None, page: int = None, ids: List[int] = None, board_kind: BoardKind = None, state: BoardState = None, order_by: BoardsOrderBy = None): + parameters = locals().items() + query_params = [] + for k, v in parameters: + if v is not None: + value = v + if isinstance(v, Enum): + value = v.value + + query_params.append("%s: %s" % (k, value)) + + query = '''query { boards (%s) { @@ -333,7 +345,8 @@ def get_boards_query(**kwargs): type } } - }''' % ', '.join(["%s: %s" % (arg, kwargs.get(arg)) for arg in kwargs]) + }''' % ', '.join(query_params) + return query @@ -362,6 +375,26 @@ def get_boards_by_id_query(board_ids): }''' % board_ids +def get_columns_by_board_query(board_ids): + return '''query + { + boards(ids: %s) { + id + name + groups { + id + title + } + columns { + title + id + type + settings_str + } + } + }''' % board_ids + + def duplicate_board_query( board_id: int, duplicate_type: DuplicateTypes, @@ -402,7 +435,7 @@ def duplicate_board_query( return query -def create_board_by_workspace_query(board_name, board_kind, workspace_id = None): +def create_board_by_workspace_query(board_name: str, board_kind: BoardKind, workspace_id = None) -> str: workspace_query = f'workspace_id: {workspace_id}' if workspace_id else '' query = ''' mutation { @@ -410,7 +443,7 @@ def create_board_by_workspace_query(board_name, board_kind, workspace_id = None) id } } - ''' % (board_name, board_kind, workspace_query) + ''' % (board_name, board_kind.value, workspace_query) return query diff --git a/monday/resources/boards.py b/monday/resources/boards.py index 22fca7d..1decb99 100644 --- a/monday/resources/boards.py +++ b/monday/resources/boards.py @@ -1,14 +1,22 @@ +from typing import List from monday.resources.base import BaseResource -from monday.query_joins import duplicate_board_query, create_board_by_workspace_query, get_boards_query, get_boards_by_id_query, get_board_items_query, get_columns_by_board_query -from monday.resources.types import DuplicateTypes +from monday.query_joins import ( + duplicate_board_query, + get_boards_query, + get_boards_by_id_query, + get_board_items_query, + get_columns_by_board_query, + create_board_by_workspace_query, +) +from monday.resources.types import BoardKind, BoardState, BoardsOrderBy, DuplicateTypes class BoardResource(BaseResource): def __init__(self, token): super().__init__(token) - def fetch_boards(self, **kwargs): - query = get_boards_query(**kwargs) + def fetch_boards(self, limit: int = None, page: int = None, ids: List[int] = None, board_kind: BoardKind = None, state: BoardState = None, order_by: BoardsOrderBy = None): + query = get_boards_query(limit, page, ids, board_kind, state, order_by) return self.client.execute(query) def fetch_boards_by_id(self, board_ids): @@ -34,8 +42,7 @@ def duplicate_board( ): query = duplicate_board_query(board_id, duplicate_type, board_name, workspace_id, folder_id, keep_subscribers) return self.client.execute(query) - return self.client.execute(query) - def create_board(self, board_name, board_kind, workspace_id): + def create_board(self, board_name: str, board_kind: BoardKind, workspace_id: int = None): query = create_board_by_workspace_query(board_name, board_kind, workspace_id) return self.client.execute(query) diff --git a/monday/resources/types.py b/monday/resources/types.py index 01292ea..8031f19 100644 --- a/monday/resources/types.py +++ b/monday/resources/types.py @@ -1,6 +1,30 @@ from enum import Enum +class BoardKind(Enum): + """Board kinds""" + + PUBLIC = "public" + PRIVATE = "private" + SHARE = "share" + + +class BoardState(Enum): + """Board available states""" + + ALL = "all" + ACTIVE = "active" + ARCHIVED = "archived" + DELETED = "deleted" + + +class BoardsOrderBy(Enum): + """Order to retrieve boards""" + + CREATED_AT = "created_at" + USED_AT = "used_at" + + class DuplicateTypes(Enum): """Board duplication types""" diff --git a/monday/tests/test_board_resource.py b/monday/tests/test_board_resource.py index 59b4d8c..f11bc4c 100644 --- a/monday/tests/test_board_resource.py +++ b/monday/tests/test_board_resource.py @@ -7,8 +7,29 @@ def setUp(self): super(BoardTestCase, self).setUp() def test_get_boards_query(self): - query = get_boards_query(board_kind=self.board_kind) - self.assertIn(self.board_kind, query) + query_a = get_boards_query(limit=1, page=2, ids=[888,999], board_kind=self.board_kind, state=self.board_state, order_by=self.boards_order_by) + self.assertIn('1', query_a) + self.assertIn('2', query_a) + self.assertIn('[888, 999]', query_a) + self.assertNotIn(str(self.board_kind), query_a) + self.assertIn(str(self.board_kind.value), query_a) + self.assertNotIn(str(self.board_state), query_a) + self.assertIn(str(self.board_state.value), query_a) + self.assertNotIn(str(self.boards_order_by), query_a) + self.assertIn(str(self.boards_order_by.value), query_a) + + query_b = get_boards_query(board_kind=self.board_kind) + self.assertNotIn(str(self.board_kind), query_b) + self.assertIn(str(self.board_kind.value), query_b) + + query_c = get_boards_query(limit=1,state=self.board_state) + self.assertIn('1', query_c) + self.assertNotIn(str(self.board_state), query_c) + self.assertIn(str(self.board_state.value), query_c) + self.assertNotIn(str(self.board_kind), query_c) + self.assertNotIn(str(self.boards_order_by), query_c) + + def test_get_boards_by_id_query(self): query = get_boards_by_id_query(board_ids=self.board_id) @@ -38,9 +59,11 @@ def test_duplicate_board_query(self): def test_create_board_by_workspace_query(self): query_a = create_board_by_workspace_query(board_name=self.board_name, board_kind=self.board_kind, workspace_id=self.workspace_id) self.assertIn(str(self.board_name), query_a) - self.assertIn(str(self.board_kind), query_a) + self.assertNotIn(str(self.board_kind), query_a) + self.assertIn(str(self.board_kind.value), query_a) self.assertIn(str(self.workspace_id), query_a) query_b = create_board_by_workspace_query(board_name=self.board_name, board_kind=self.board_kind) self.assertIn(str(self.board_name), query_b) - self.assertIn(str(self.board_kind), query_b) + self.assertNotIn(str(self.board_kind), query_b) + self.assertIn(str(self.board_kind.value), query_b) self.assertNotIn(str(self.workspace_id), query_b) diff --git a/monday/tests/test_case_resource.py b/monday/tests/test_case_resource.py index 378c5ff..0a73602 100644 --- a/monday/tests/test_case_resource.py +++ b/monday/tests/test_case_resource.py @@ -1,6 +1,6 @@ import unittest -from monday.resources.types import DuplicateTypes +from monday.resources.types import BoardKind, BoardState, BoardsOrderBy, DuplicateTypes class BaseTestCase(unittest.TestCase): @@ -11,8 +11,10 @@ def setUp(self): self.item_id = 24 self.board_name = "my_board" self.board_id = 12 - self.board_kind = "public" self.duplicate_type = DuplicateTypes.WITH_PULSES + self.board_kind = BoardKind.PUBLIC + self.board_state = BoardState.ACTIVE + self.boards_order_by = BoardsOrderBy.USED_AT self.group_id = 7 self.column_id = "file_column" self.user_ids = [1287123, 1230919] From 02820ea4692a21b5fd27989b1734f3dc14108604 Mon Sep 17 00:00:00 2001 From: Lemi Boyce Date: Sat, 29 Oct 2022 03:55:47 +0000 Subject: [PATCH 12/46] bump version --- monday/__version__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/monday/__version__.py b/monday/__version__.py index eace817..4b3bf26 100644 --- a/monday/__version__.py +++ b/monday/__version__.py @@ -1,3 +1,3 @@ -__version__ = '1.3.1' +__version__ = '1.3.2' __author__ = 'Christina D\'Astolfo' __email__ = 'chdastolfo@gmail.com, pevner@prodperfect.com, lemi@prodperfect.com' From 0d41eb5f5cb72b01fd03b6fc52e1e84c63cc6af9 Mon Sep 17 00:00:00 2001 From: Lemi Boyce Date: Thu, 1 Dec 2022 01:46:46 -0500 Subject: [PATCH 13/46] Create CODE_OF_CONDUCT.md (#78) --- CODE_OF_CONDUCT.md | 128 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 128 insertions(+) create mode 100644 CODE_OF_CONDUCT.md diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md new file mode 100644 index 0000000..9c1a07e --- /dev/null +++ b/CODE_OF_CONDUCT.md @@ -0,0 +1,128 @@ +# Contributor Covenant Code of Conduct + +## Our Pledge + +We as members, contributors, and leaders pledge to make participation in our +community a harassment-free experience for everyone, regardless of age, body +size, visible or invisible disability, ethnicity, sex characteristics, gender +identity and expression, level of experience, education, socio-economic status, +nationality, personal appearance, race, religion, or sexual identity +and orientation. + +We pledge to act and interact in ways that contribute to an open, welcoming, +diverse, inclusive, and healthy community. + +## Our Standards + +Examples of behavior that contributes to a positive environment for our +community include: + +* Demonstrating empathy and kindness toward other people +* Being respectful of differing opinions, viewpoints, and experiences +* Giving and gracefully accepting constructive feedback +* Accepting responsibility and apologizing to those affected by our mistakes, + and learning from the experience +* Focusing on what is best not just for us as individuals, but for the + overall community + +Examples of unacceptable behavior include: + +* The use of sexualized language or imagery, and sexual attention or + advances of any kind +* Trolling, insulting or derogatory comments, and personal or political attacks +* Public or private harassment +* Publishing others' private information, such as a physical or email + address, without their explicit permission +* Other conduct which could reasonably be considered inappropriate in a + professional setting + +## Enforcement Responsibilities + +Community leaders are responsible for clarifying and enforcing our standards of +acceptable behavior and will take appropriate and fair corrective action in +response to any behavior that they deem inappropriate, threatening, offensive, +or harmful. + +Community leaders have the right and responsibility to remove, edit, or reject +comments, commits, code, wiki edits, issues, and other contributions that are +not aligned to this Code of Conduct, and will communicate reasons for moderation +decisions when appropriate. + +## Scope + +This Code of Conduct applies within all community spaces, and also applies when +an individual is officially representing the community in public spaces. +Examples of representing our community include using an official e-mail address, +posting via an official social media account, or acting as an appointed +representative at an online or offline event. + +## Enforcement + +Instances of abusive, harassing, or otherwise unacceptable behavior may be +reported to the community leaders responsible for enforcement at +info@prodperfect.com. +All complaints will be reviewed and investigated promptly and fairly. + +All community leaders are obligated to respect the privacy and security of the +reporter of any incident. + +## Enforcement Guidelines + +Community leaders will follow these Community Impact Guidelines in determining +the consequences for any action they deem in violation of this Code of Conduct: + +### 1. Correction + +**Community Impact**: Use of inappropriate language or other behavior deemed +unprofessional or unwelcome in the community. + +**Consequence**: A private, written warning from community leaders, providing +clarity around the nature of the violation and an explanation of why the +behavior was inappropriate. A public apology may be requested. + +### 2. Warning + +**Community Impact**: A violation through a single incident or series +of actions. + +**Consequence**: A warning with consequences for continued behavior. No +interaction with the people involved, including unsolicited interaction with +those enforcing the Code of Conduct, for a specified period of time. This +includes avoiding interactions in community spaces as well as external channels +like social media. Violating these terms may lead to a temporary or +permanent ban. + +### 3. Temporary Ban + +**Community Impact**: A serious violation of community standards, including +sustained inappropriate behavior. + +**Consequence**: A temporary ban from any sort of interaction or public +communication with the community for a specified period of time. No public or +private interaction with the people involved, including unsolicited interaction +with those enforcing the Code of Conduct, is allowed during this period. +Violating these terms may lead to a permanent ban. + +### 4. Permanent Ban + +**Community Impact**: Demonstrating a pattern of violation of community +standards, including sustained inappropriate behavior, harassment of an +individual, or aggression toward or disparagement of classes of individuals. + +**Consequence**: A permanent ban from any sort of public interaction within +the community. + +## Attribution + +This Code of Conduct is adapted from the [Contributor Covenant][homepage], +version 2.0, available at +https://www.contributor-covenant.org/version/2/0/code_of_conduct.html. + +Community Impact Guidelines were inspired by [Mozilla's code of conduct +enforcement ladder](https://github.com/mozilla/diversity). + +[homepage]: https://www.contributor-covenant.org + +For answers to common questions about this code of conduct, see the FAQ at +https://www.contributor-covenant.org/faq. Translations are available at +https://www.contributor-covenant.org/translations. From 0a9b87d24947052500dee974621b5c29bf6f5f1d Mon Sep 17 00:00:00 2001 From: Lemi Boyce Date: Thu, 1 Dec 2022 01:49:22 -0500 Subject: [PATCH 14/46] Update README.md --- README.md | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 79ab4c2..69299b5 100644 --- a/README.md +++ b/README.md @@ -116,8 +116,16 @@ monday.items.create_item(board_id='12345678', group_id='today', item_name='Do a - [Read and format all of the items on a board](https://github.com/ProdPerfect/monday/wiki/Code-Examples#whole-board-formatting-example) -### Contributions -TBD +## Contributors + + + + + + + + + ### Bug Reports TBD From 1a30751a5cf4c72ec374dd6507f3234e16cc52d1 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Thu, 1 Dec 2022 01:53:27 -0500 Subject: [PATCH 15/46] docs: add rhymiz as a contributor for code (#79) * docs: update README.md [skip ci] * docs: create .all-contributorsrc [skip ci] Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com> --- .all-contributorsrc | 25 +++++++++++++++++++++++++ README.md | 17 +++++++++++++++++ 2 files changed, 42 insertions(+) create mode 100644 .all-contributorsrc diff --git a/.all-contributorsrc b/.all-contributorsrc new file mode 100644 index 0000000..f8283d8 --- /dev/null +++ b/.all-contributorsrc @@ -0,0 +1,25 @@ +{ + "files": [ + "README.md" + ], + "imageSize": 100, + "commit": false, + "commitConvention": "angular", + "contributors": [ + { + "login": "rhymiz", + "name": "Lemi Boyce", + "avatar_url": "https://avatars.githubusercontent.com/u/7029352?v=4", + "profile": "https://github.com/rhymiz", + "contributions": [ + "code" + ] + } + ], + "contributorsPerLine": 7, + "skipCi": true, + "repoType": "github", + "repoHost": "https://github.com", + "projectName": "monday", + "projectOwner": "ProdPerfect" +} diff --git a/README.md b/README.md index 69299b5..b8152d3 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,7 @@ # monday + +[![All Contributors](https://img.shields.io/badge/all_contributors-1-orange.svg?style=flat-square)](#contributors-) + A monday.com Python Client Library @@ -121,6 +124,20 @@ monday.items.create_item(board_id='12345678', group_id='today', item_name='Do a + + + + + + +
Lemi Boyce
Lemi Boyce

πŸ’»
+ + + + + + + From 4340a287e1c84d66d866663feb178eb64363737e Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Thu, 1 Dec 2022 01:55:09 -0500 Subject: [PATCH 16/46] docs: add tonymorello as a contributor for code (#80) * docs: update README.md [skip ci] * docs: update .all-contributorsrc [skip ci] Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com> --- .all-contributorsrc | 9 +++++++++ README.md | 3 ++- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/.all-contributorsrc b/.all-contributorsrc index f8283d8..89c34e1 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -14,6 +14,15 @@ "contributions": [ "code" ] + }, + { + "login": "tonymorello", + "name": "Tony Morello", + "avatar_url": "https://avatars.githubusercontent.com/u/7967400?v=4", + "profile": "https://github.com/tonymorello", + "contributions": [ + "code" + ] } ], "contributorsPerLine": 7, diff --git a/README.md b/README.md index b8152d3..f010c34 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # monday -[![All Contributors](https://img.shields.io/badge/all_contributors-1-orange.svg?style=flat-square)](#contributors-) +[![All Contributors](https://img.shields.io/badge/all_contributors-2-orange.svg?style=flat-square)](#contributors-) A monday.com Python Client Library @@ -128,6 +128,7 @@ monday.items.create_item(board_id='12345678', group_id='today', item_name='Do a Lemi Boyce
Lemi Boyce

πŸ’» + Tony Morello
Tony Morello

πŸ’» From cd885f84f1789556cbe59995822c3bd0c7bdad98 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Thu, 1 Dec 2022 01:55:53 -0500 Subject: [PATCH 17/46] docs: add chdastolfo as a contributor for code (#81) * docs: update README.md [skip ci] * docs: update .all-contributorsrc [skip ci] Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com> --- .all-contributorsrc | 9 +++++++++ README.md | 3 ++- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/.all-contributorsrc b/.all-contributorsrc index 89c34e1..22d045c 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -23,6 +23,15 @@ "contributions": [ "code" ] + }, + { + "login": "chdastolfo", + "name": "chdastolfo", + "avatar_url": "https://avatars.githubusercontent.com/u/9096407?v=4", + "profile": "https://github.com/chdastolfo", + "contributions": [ + "code" + ] } ], "contributorsPerLine": 7, diff --git a/README.md b/README.md index f010c34..ae81119 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # monday -[![All Contributors](https://img.shields.io/badge/all_contributors-2-orange.svg?style=flat-square)](#contributors-) +[![All Contributors](https://img.shields.io/badge/all_contributors-3-orange.svg?style=flat-square)](#contributors-) A monday.com Python Client Library @@ -129,6 +129,7 @@ monday.items.create_item(board_id='12345678', group_id='today', item_name='Do a Lemi Boyce
Lemi Boyce

πŸ’» Tony Morello
Tony Morello

πŸ’» + chdastolfo
chdastolfo

πŸ’» From 1837e1df7c0233c34b35b9ff92abb42fe8681ca8 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Thu, 1 Dec 2022 01:59:36 -0500 Subject: [PATCH 18/46] docs: add lucioseki as a contributor for code (#84) * docs: update README.md [skip ci] * docs: update .all-contributorsrc [skip ci] Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com> --- .all-contributorsrc | 9 +++++++++ README.md | 3 ++- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/.all-contributorsrc b/.all-contributorsrc index 22d045c..783ef3e 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -32,6 +32,15 @@ "contributions": [ "code" ] + }, + { + "login": "lucioseki", + "name": "Lucio Mitsuru Seki", + "avatar_url": "https://avatars.githubusercontent.com/u/1480296?v=4", + "profile": "https://github.com/lucioseki", + "contributions": [ + "code" + ] } ], "contributorsPerLine": 7, diff --git a/README.md b/README.md index ae81119..41dc55d 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # monday -[![All Contributors](https://img.shields.io/badge/all_contributors-3-orange.svg?style=flat-square)](#contributors-) +[![All Contributors](https://img.shields.io/badge/all_contributors-4-orange.svg?style=flat-square)](#contributors-) A monday.com Python Client Library @@ -130,6 +130,7 @@ monday.items.create_item(board_id='12345678', group_id='today', item_name='Do a Lemi Boyce
Lemi Boyce

πŸ’» Tony Morello
Tony Morello

πŸ’» chdastolfo
chdastolfo

πŸ’» + Lucio Mitsuru Seki
Lucio Mitsuru Seki

πŸ’» From ba4e15993bebf7e8ac98909eed1a6eb5b37f63bc Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Thu, 1 Dec 2022 02:03:36 -0500 Subject: [PATCH 19/46] docs: add yogeshnile as a contributor for code (#86) * docs: update README.md [skip ci] * docs: update .all-contributorsrc [skip ci] Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com> --- .all-contributorsrc | 9 +++++++++ README.md | 3 ++- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/.all-contributorsrc b/.all-contributorsrc index 783ef3e..c22e875 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -41,6 +41,15 @@ "contributions": [ "code" ] + }, + { + "login": "yogeshnile", + "name": "YOGESH NILE", + "avatar_url": "https://avatars.githubusercontent.com/u/54445087?v=4", + "profile": "https://github.com/yogeshnile", + "contributions": [ + "code" + ] } ], "contributorsPerLine": 7, diff --git a/README.md b/README.md index 41dc55d..3dd5528 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # monday -[![All Contributors](https://img.shields.io/badge/all_contributors-4-orange.svg?style=flat-square)](#contributors-) +[![All Contributors](https://img.shields.io/badge/all_contributors-5-orange.svg?style=flat-square)](#contributors-) A monday.com Python Client Library @@ -131,6 +131,7 @@ monday.items.create_item(board_id='12345678', group_id='today', item_name='Do a Tony Morello
Tony Morello

πŸ’» chdastolfo
chdastolfo

πŸ’» Lucio Mitsuru Seki
Lucio Mitsuru Seki

πŸ’» + YOGESH NILE
YOGESH NILE

πŸ’» From af5fa681817f15c2b539fbed22bc962209581710 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Thu, 1 Dec 2022 02:07:48 -0500 Subject: [PATCH 20/46] docs: add spencersamuel7 as a contributor for code (#88) * docs: update README.md [skip ci] * docs: update .all-contributorsrc [skip ci] Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com> --- .all-contributorsrc | 9 +++++++++ README.md | 3 ++- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/.all-contributorsrc b/.all-contributorsrc index c22e875..db38a79 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -50,6 +50,15 @@ "contributions": [ "code" ] + }, + { + "login": "spencersamuel7", + "name": "spencersamuel7", + "avatar_url": "https://avatars.githubusercontent.com/u/20449820?v=4", + "profile": "https://github.com/spencersamuel7", + "contributions": [ + "code" + ] } ], "contributorsPerLine": 7, diff --git a/README.md b/README.md index 3dd5528..fe49c9a 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # monday -[![All Contributors](https://img.shields.io/badge/all_contributors-5-orange.svg?style=flat-square)](#contributors-) +[![All Contributors](https://img.shields.io/badge/all_contributors-6-orange.svg?style=flat-square)](#contributors-) A monday.com Python Client Library @@ -132,6 +132,7 @@ monday.items.create_item(board_id='12345678', group_id='today', item_name='Do a chdastolfo
chdastolfo

πŸ’» Lucio Mitsuru Seki
Lucio Mitsuru Seki

πŸ’» YOGESH NILE
YOGESH NILE

πŸ’» + spencersamuel7
spencersamuel7

πŸ’» From bd9358df05a7a78c344e9f68ee9cf51ee7387295 Mon Sep 17 00:00:00 2001 From: Lemi Boyce Date: Thu, 1 Dec 2022 02:13:39 -0500 Subject: [PATCH 21/46] Update .all-contributorsrc --- .all-contributorsrc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index db38a79..28fc06c 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -59,6 +59,15 @@ "contributions": [ "code" ] + }, + { + "login": "albcl", + "name": "Alb. C", + "avatar_url": "https://avatars.githubusercontent.com/u/17050266?v=4", + "profile": "https://github.com/albcl", + "contributions": [ + "code" + ] } ], "contributorsPerLine": 7, From ee25c902433596c5a0febd518c597b3fe959f305 Mon Sep 17 00:00:00 2001 From: Lemi Boyce Date: Thu, 1 Dec 2022 02:14:47 -0500 Subject: [PATCH 22/46] Update README.md --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index fe49c9a..ccceddc 100644 --- a/README.md +++ b/README.md @@ -133,7 +133,9 @@ monday.items.create_item(board_id='12345678', group_id='today', item_name='Do a Lucio Mitsuru Seki
Lucio Mitsuru Seki

πŸ’» YOGESH NILE
YOGESH NILE

πŸ’» spencersamuel7
spencersamuel7

πŸ’» + Alb. C
Alb. C

πŸ’» + From 6d5b19b32a1f30e9b7402b704ae9c76bf000fd4c Mon Sep 17 00:00:00 2001 From: Lemi Boyce Date: Thu, 1 Dec 2022 02:15:04 -0500 Subject: [PATCH 23/46] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index ccceddc..1a68ef1 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # monday -[![All Contributors](https://img.shields.io/badge/all_contributors-6-orange.svg?style=flat-square)](#contributors-) +[![All Contributors](https://img.shields.io/badge/all_contributors-7-orange.svg?style=flat-square)](#contributors-) A monday.com Python Client Library From 53faa219617c3f0d949e3c430d2e3d5d0b0d123d Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Thu, 1 Dec 2022 02:26:28 -0500 Subject: [PATCH 24/46] docs: add rhymiz as a contributor for code, bug, and maintenance (#90) * docs: update README.md [skip ci] * docs: update .all-contributorsrc [skip ci] Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com> --- .all-contributorsrc | 4 +++- README.md | 3 +-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/.all-contributorsrc b/.all-contributorsrc index 28fc06c..d8a19b4 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -12,7 +12,9 @@ "avatar_url": "https://avatars.githubusercontent.com/u/7029352?v=4", "profile": "https://github.com/rhymiz", "contributions": [ - "code" + "code", + "bug", + "maintenance" ] }, { diff --git a/README.md b/README.md index 1a68ef1..79c61bf 100644 --- a/README.md +++ b/README.md @@ -127,7 +127,7 @@ monday.items.create_item(board_id='12345678', group_id='today', item_name='Do a - + @@ -135,7 +135,6 @@ monday.items.create_item(board_id='12345678', group_id='today', item_name='Do a -
Lemi Boyce
Lemi Boyce

πŸ’»
Lemi Boyce
Lemi Boyce

πŸ’» πŸ› 🚧
Tony Morello
Tony Morello

πŸ’»
chdastolfo
chdastolfo

πŸ’»
Lucio Mitsuru Seki
Lucio Mitsuru Seki

πŸ’»
spencersamuel7
spencersamuel7

πŸ’»
Alb. C
Alb. C

πŸ’»
From 2153140419c66d30eea22e06c1571d6056e8ab22 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Thu, 1 Dec 2022 02:30:52 -0500 Subject: [PATCH 25/46] docs: add chdastolfo as a contributor for code, bug, and 2 more (#92) * docs: update README.md [skip ci] * docs: update .all-contributorsrc [skip ci] Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com> --- .all-contributorsrc | 5 ++++- README.md | 2 +- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/.all-contributorsrc b/.all-contributorsrc index d8a19b4..cd39b88 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -32,7 +32,10 @@ "avatar_url": "https://avatars.githubusercontent.com/u/9096407?v=4", "profile": "https://github.com/chdastolfo", "contributions": [ - "code" + "code", + "bug", + "doc", + "maintenance" ] }, { diff --git a/README.md b/README.md index 79c61bf..db6d260 100644 --- a/README.md +++ b/README.md @@ -129,7 +129,7 @@ monday.items.create_item(board_id='12345678', group_id='today', item_name='Do a Lemi Boyce
Lemi Boyce

πŸ’» πŸ› 🚧 Tony Morello
Tony Morello

πŸ’» - chdastolfo
chdastolfo

πŸ’» + chdastolfo
chdastolfo

πŸ’» πŸ› πŸ“– 🚧 Lucio Mitsuru Seki
Lucio Mitsuru Seki

πŸ’» YOGESH NILE
YOGESH NILE

πŸ’» spencersamuel7
spencersamuel7

πŸ’» From 4e2d9a00dc2e49a50be6689c021faebc8ab8e892 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Thu, 1 Dec 2022 02:38:08 -0500 Subject: [PATCH 26/46] docs: add pevner-p2 as a contributor for code (#93) --- .all-contributorsrc | 9 +++++++++ README.md | 5 ++++- 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/.all-contributorsrc b/.all-contributorsrc index cd39b88..98788bb 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -73,6 +73,15 @@ "contributions": [ "code" ] + }, + { + "login": "pevner-p2", + "name": "pevner-p2", + "avatar_url": "https://avatars.githubusercontent.com/u/45570949?v=4", + "profile": "https://github.com/pevner-p2", + "contributions": [ + "code" + ] } ], "contributorsPerLine": 7, diff --git a/README.md b/README.md index db6d260..6834c47 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # monday -[![All Contributors](https://img.shields.io/badge/all_contributors-7-orange.svg?style=flat-square)](#contributors-) +[![All Contributors](https://img.shields.io/badge/all_contributors-8-orange.svg?style=flat-square)](#contributors-) A monday.com Python Client Library @@ -135,6 +135,9 @@ monday.items.create_item(board_id='12345678', group_id='today', item_name='Do a spencersamuel7
spencersamuel7

πŸ’» Alb. C
Alb. C

πŸ’» + + pevner-p2
pevner-p2

πŸ’» + From 85154c8f0489482b059930369903d640ade9e1c8 Mon Sep 17 00:00:00 2001 From: chdastolfo Date: Thu, 8 Dec 2022 11:27:18 -0500 Subject: [PATCH 27/46] 1.3.3 (#96) * Add in limits and pages to items query * Add in unit test * Add in no params test * Update surface level api * Split up test * Split out gather func * Update README * CORRECTLY update README * bump version number Co-authored-by: Taylor Cochran --- README.md | 12 +++++++----- monday/__version__.py | 4 ++-- monday/query_joins.py | 19 ++++++++++++------- monday/resources/boards.py | 6 +++--- monday/tests/test_board_resource.py | 9 +++++++++ monday/utils.py | 14 ++++++++++++++ 6 files changed, 47 insertions(+), 17 deletions(-) diff --git a/README.md b/README.md index 6834c47..fc2f29e 100644 --- a/README.md +++ b/README.md @@ -67,13 +67,15 @@ monday.items.create_item(board_id='12345678', group_id='today', item_name='Do a - `board_kind` - The board's kind (*BoardKind*. public / private / share). - `state` - The state of the board (*BoardState*. all / active / archived / deleted. Default is active). - `order_by` - The order in which to retrieve your boards (*BoardsOrderBy*. created_at / used_at). - + - `fetch_boards_by_id([board_ids])` - Since Monday does not allow querying boards by name, you can use `fetch_boards` to get a list of boards, and then `fetch_boards_by_id` to get more detailed info about the groups and columns on that board. Accepts a comma separated list of board ids. - `fetch_columns_by_board_id([board_ids])` - Get all columns, as well as their ids, types, and settings. Accepts a comma separated list of board ids. -- `fetch_items_by_board_id([board_ids])` - Get all items on a board(s). Accepts a comma separated list of board ids. +- `fetch_items_by_board_id([board_ids], **kwargs)` - Get all items on a board(s). Accepts a comma separated list of board ids. + - `limit` - The number of rows returned (*int*. no default). + - `page` - The page number returned, should you implement pagination(*int*. no default). - `duplicate_board(board_id, duplicate_type, board_name, workspace_id, folder_id, keep_subscribers)` - Duplicate a board by its id. It requires a duplication type to be chosen (*duplicate_board_with_structure / duplicate_board_with_pulses / duplicate_board_with_pulses_and_updates*). Optionaly you can use: - `board_name` - The duplicated board's name (*string*). @@ -90,7 +92,7 @@ monday.items.create_item(board_id='12345678', group_id='today', item_name='Do a #### Workspaces Resource (monday.workspaces) - `get_workspaces()` - Get all workspaces. -- `create_workspace(name, kind, description)` - Create workspace with the given name, kind and description. +- `create_workspace(name, kind, description)` - Create workspace with the given name, kind and description. - `add_users_to_workspace(workspace_id, [user_ids], kind)` - Add given users of the given kind to the given workspace. @@ -114,7 +116,7 @@ monday.items.create_item(board_id='12345678', group_id='today', item_name='Do a - `delete_group(board_id, group_id)` - Delete a group on a given board. #### Notifications Resource (monday.notifications) -- `create_notification(user_id, target_id, text, target_type)` - The create_notification mutation allows to trigger a notification within the platform (will also send out an email if the recipient's email preferences are set up accordingly). +- `create_notification(user_id, target_id, text, target_type)` - The create_notification mutation allows to trigger a notification within the platform (will also send out an email if the recipient's email preferences are set up accordingly). ### Additional Resources and Code Samples - [Read and format all of the items on a board](https://github.com/ProdPerfect/monday/wiki/Code-Examples#whole-board-formatting-example) @@ -154,4 +156,4 @@ monday.items.create_item(board_id='12345678', group_id='today', item_name='Do a ### Bug Reports -TBD +TBD diff --git a/monday/__version__.py b/monday/__version__.py index 4b3bf26..7bb30fb 100644 --- a/monday/__version__.py +++ b/monday/__version__.py @@ -1,3 +1,3 @@ -__version__ = '1.3.2' +__version__ = '1.3.3' __author__ = 'Christina D\'Astolfo' -__email__ = 'chdastolfo@gmail.com, pevner@prodperfect.com, lemi@prodperfect.com' +__email__ = 'chdastolfo@gmail.com, lemi@prodperfect.com', 'pevner@prodperfect.com' diff --git a/monday/query_joins.py b/monday/query_joins.py index 98b3e5e..8d1d4b7 100644 --- a/monday/query_joins.py +++ b/monday/query_joins.py @@ -1,8 +1,8 @@ import json from enum import Enum -from typing import List +from typing import List, Union, Optional from monday.resources.types import BoardKind, BoardState, BoardsOrderBy, DuplicateTypes -from monday.utils import monday_json_stringify +from monday.utils import monday_json_stringify, gather_params # Eventually I will organize this file better but you know what today is not that day. @@ -217,7 +217,7 @@ def create_update_query(item_id, update_value): def get_updates_for_item_query(board, item, limit): query = '''query - {boards (ids: %s) + {boards (ids: %s) {items (ids: %s) { updates (limit: %s) { id, @@ -234,7 +234,7 @@ def get_updates_for_item_query(board, item, limit): name, url, file_extension, - file_size + file_size }, replies { id, @@ -288,12 +288,17 @@ def get_tags_query(tags): # BOARD RESOURCE QUERIES -def get_board_items_query(board_id): +def get_board_items_query(board_id: Union[str, int], limit: Optional[int] = None, page: Optional[int] = None) -> str: + + raw_params = locals().items() + item_params = gather_params(raw_params, exclusion_list=["board_id"]) + joined_params = ', '.join(item_params) + query = '''query { boards(ids: %s) { name - items { + items(%s) { group { id title @@ -308,7 +313,7 @@ def get_board_items_query(board_id): } } } - }''' % board_id + }''' % (board_id, joined_params) return query diff --git a/monday/resources/boards.py b/monday/resources/boards.py index 1decb99..ef9c634 100644 --- a/monday/resources/boards.py +++ b/monday/resources/boards.py @@ -1,4 +1,4 @@ -from typing import List +from typing import List, Optional from monday.resources.base import BaseResource from monday.query_joins import ( duplicate_board_query, @@ -23,8 +23,8 @@ def fetch_boards_by_id(self, board_ids): query = get_boards_by_id_query(board_ids) return self.client.execute(query) - def fetch_items_by_board_id(self, board_ids): - query = get_board_items_query(board_ids) + def fetch_items_by_board_id(self, board_ids, limit: Optional[int]=None, page: Optional[int]=None): + query = get_board_items_query(board_ids, limit=limit, page=page) return self.client.execute(query) def fetch_columns_by_board_id(self, board_ids): diff --git a/monday/tests/test_board_resource.py b/monday/tests/test_board_resource.py index f11bc4c..f2b72d0 100644 --- a/monday/tests/test_board_resource.py +++ b/monday/tests/test_board_resource.py @@ -38,6 +38,15 @@ def test_get_boards_by_id_query(self): def test_get_board_items_query(self): query = get_board_items_query(board_id=self.board_id) self.assertIn(str(self.board_id), query) + items_line = 'items()' + self.assertIn(items_line, query) + + def test_get_board_items_query_with_limit_and_pages(self): + limit = 100 + page = 1 + query = get_board_items_query(board_id=self.board_id, limit=limit, page=page) + items_line = f'items(limit: {limit}, page: {page})' + self.assertIn(items_line, query) def test_get_columns_by_board_query(self): query = get_columns_by_board_query(board_ids=self.board_id) diff --git a/monday/utils.py b/monday/utils.py index f9fd33a..fe50f1b 100644 --- a/monday/utils.py +++ b/monday/utils.py @@ -1,4 +1,6 @@ import json +from typing import List +from enum import Enum def monday_json_stringify(value): @@ -9,3 +11,15 @@ def monday_json_stringify(value): # "{\"label\":\"Done\"}" return json.dumps(json.dumps(value)) + + +def gather_params(params, exclusion_list: List[str]) -> List[str]: + valid_params: List[str] = [] + for param, value in params: + if value is None or param in exclusion_list: + continue + if isinstance(value, Enum): + valid_params.append(f"{param}: {value.value}") + continue + valid_params.append(f"{param}: {value}") + return valid_params From a528b004a4bde7308efad84b7978f9f67402305d Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Thu, 8 Dec 2022 11:27:40 -0500 Subject: [PATCH 28/46] docs: add t-a-y-l-o-r as a contributor for code (#97) * docs: update README.md [skip ci] * docs: update .all-contributorsrc [skip ci] Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com> --- .all-contributorsrc | 9 +++++++++ README.md | 3 ++- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/.all-contributorsrc b/.all-contributorsrc index 98788bb..6d03dfc 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -82,6 +82,15 @@ "contributions": [ "code" ] + }, + { + "login": "t-a-y-l-o-r", + "name": "Taylor Cochran", + "avatar_url": "https://avatars.githubusercontent.com/u/32030464?v=4", + "profile": "https://github.com/t-a-y-l-o-r", + "contributions": [ + "code" + ] } ], "contributorsPerLine": 7, diff --git a/README.md b/README.md index fc2f29e..f2aff8a 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # monday -[![All Contributors](https://img.shields.io/badge/all_contributors-8-orange.svg?style=flat-square)](#contributors-) +[![All Contributors](https://img.shields.io/badge/all_contributors-9-orange.svg?style=flat-square)](#contributors-) A monday.com Python Client Library @@ -139,6 +139,7 @@ monday.items.create_item(board_id='12345678', group_id='today', item_name='Do a pevner-p2
pevner-p2

πŸ’» + Taylor Cochran
Taylor Cochran

πŸ’» From fb9adc2dc14e12f9a4e62a46a8e53ca3830920bb Mon Sep 17 00:00:00 2001 From: albcl Date: Mon, 20 Jun 2022 17:10:00 +0200 Subject: [PATCH 29/46] Readme updated --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index f2aff8a..85d5def 100644 --- a/README.md +++ b/README.md @@ -85,6 +85,8 @@ monday.items.create_item(board_id='12345678', group_id='today', item_name='Do a - `create_board(board_name, board_kind, workspace_id)` - Create board with the given name and kind by (and optional) workspace id. +- `duplicate_board(board_id, duplicate_type)` - Duplicate a board by its id. It requires a duplication type to be chosen (*duplicate_board_with_structure / duplicate_board_with_pulses / duplicate_board_with_pulses_and_updates*). + #### Users Resource (monday.users) - `fetch_users(**kwargs)` - Fetch user information associated with an account. See Monday API docs for a list of accepted keyword arguments. From 2b0689eb7dc5d23194db3a96d80fdee69168562a Mon Sep 17 00:00:00 2001 From: albcl Date: Sat, 18 Jun 2022 19:12:39 +0200 Subject: [PATCH 30/46] Update readme --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 85d5def..472c7d9 100644 --- a/README.md +++ b/README.md @@ -87,6 +87,8 @@ monday.items.create_item(board_id='12345678', group_id='today', item_name='Do a - `duplicate_board(board_id, duplicate_type)` - Duplicate a board by its id. It requires a duplication type to be chosen (*duplicate_board_with_structure / duplicate_board_with_pulses / duplicate_board_with_pulses_and_updates*). +- `create_board(board_name, board_kind, workspace_id)` - Create board with the given name and kind by (and optional) workspace id. + #### Users Resource (monday.users) - `fetch_users(**kwargs)` - Fetch user information associated with an account. See Monday API docs for a list of accepted keyword arguments. From 1d38403ee5a59a519cbcc905f9961680838ea257 Mon Sep 17 00:00:00 2001 From: albcl Date: Tue, 18 Oct 2022 13:40:02 +0200 Subject: [PATCH 31/46] Readme update --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 472c7d9..704a517 100644 --- a/README.md +++ b/README.md @@ -85,7 +85,7 @@ monday.items.create_item(board_id='12345678', group_id='today', item_name='Do a - `create_board(board_name, board_kind, workspace_id)` - Create board with the given name and kind by (and optional) workspace id. -- `duplicate_board(board_id, duplicate_type)` - Duplicate a board by its id. It requires a duplication type to be chosen (*duplicate_board_with_structure / duplicate_board_with_pulses / duplicate_board_with_pulses_and_updates*). +- `duplicate_board(board_id, duplicate_type, board_name, workspace_id, folder_id, keep_subscribers)` - Duplicate a board by its id. It requires a duplication type to be chosen (*duplicate_board_with_structure / duplicate_board_with_pulses / duplicate_board_with_pulses_and_updates*). Optionaly you can use `board_name` (*String*) to give it a new name, also the destination `workspace_id` (*Int*. Defaults to the original board's workspace) and the destination `folder_id` (*Int*. Defaults to originals board's folder) within the destination workspace. *Note: The folder_id is required if you are duplicating to another workspace. Optional otherwise.* Finally, you can make use of `keep_subscribers` (*Boolean*. Defaults to false) to duplicate the subscribers to the new board. - `create_board(board_name, board_kind, workspace_id)` - Create board with the given name and kind by (and optional) workspace id. From 93938a2d3cc5c8409acd17ec98659507e18bd332 Mon Sep 17 00:00:00 2001 From: albcl Date: Tue, 18 Oct 2022 17:53:56 +0200 Subject: [PATCH 32/46] Restructured Readme --- README.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 704a517..75198c2 100644 --- a/README.md +++ b/README.md @@ -85,7 +85,11 @@ monday.items.create_item(board_id='12345678', group_id='today', item_name='Do a - `create_board(board_name, board_kind, workspace_id)` - Create board with the given name and kind by (and optional) workspace id. -- `duplicate_board(board_id, duplicate_type, board_name, workspace_id, folder_id, keep_subscribers)` - Duplicate a board by its id. It requires a duplication type to be chosen (*duplicate_board_with_structure / duplicate_board_with_pulses / duplicate_board_with_pulses_and_updates*). Optionaly you can use `board_name` (*String*) to give it a new name, also the destination `workspace_id` (*Int*. Defaults to the original board's workspace) and the destination `folder_id` (*Int*. Defaults to originals board's folder) within the destination workspace. *Note: The folder_id is required if you are duplicating to another workspace. Optional otherwise.* Finally, you can make use of `keep_subscribers` (*Boolean*. Defaults to false) to duplicate the subscribers to the new board. +- `duplicate_board(board_id, duplicate_type, board_name, workspace_id, folder_id, keep_subscribers)` - Duplicate a board by its id. It requires a duplication type to be chosen (*duplicate_board_with_structure / duplicate_board_with_pulses / duplicate_board_with_pulses_and_updates*). Optionaly you can use: + - `board_name` - The duplicated board's name (*string*). + - `workspace_id` - The destination workspace (*int* Defaults to the original board's workspace). + - `folder_id` - The destination folder within the destination workspace. The folder_id is required if you are duplicating to another workspace. (*int* Defaults to originals board's folder). + - `keep_subscribers` - Ability to duplicate the subscribers to the new board (*Boolean* Defaults to false). - `create_board(board_name, board_kind, workspace_id)` - Create board with the given name and kind by (and optional) workspace id. From 17efb51d781fb09c0e4582b763acd22b01cfe70c Mon Sep 17 00:00:00 2001 From: albcl Date: Wed, 14 Dec 2022 12:04:35 +0100 Subject: [PATCH 33/46] Tests improved --- monday/tests/test_board_resource.py | 6 +++--- monday/tests/test_case_resource.py | 1 + 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/monday/tests/test_board_resource.py b/monday/tests/test_board_resource.py index f2b72d0..2b8c749 100644 --- a/monday/tests/test_board_resource.py +++ b/monday/tests/test_board_resource.py @@ -57,13 +57,13 @@ def test_duplicate_board_query(self): self.assertIn(str(self.board_id), query_a) self.assertNotIn(str(self.duplicate_type), query_a) self.assertIn(str(self.duplicate_type.value), query_a) - query_b = duplicate_board_query(board_id=self.board_id, duplicate_type=self.duplicate_type, board_name='testing_name', workspace_id=1, folder_id=2) + query_b = duplicate_board_query(board_id=self.board_id, duplicate_type=self.duplicate_type, board_name='testing_name', workspace_id=self.workspace_id, folder_id=self.folder_id) self.assertIn(str(self.board_id), query_b) self.assertNotIn(str(self.duplicate_type), query_b) self.assertIn(str(self.duplicate_type.value), query_b) self.assertIn(str('testing_name'), query_b) - self.assertIn(str(1), query_b) - self.assertIn(str(2), query_b) + self.assertIn(self.workspace_id, query_b) + self.assertIn(self.folder_id, query_b) def test_create_board_by_workspace_query(self): query_a = create_board_by_workspace_query(board_name=self.board_name, board_kind=self.board_kind, workspace_id=self.workspace_id) diff --git a/monday/tests/test_case_resource.py b/monday/tests/test_case_resource.py index 0a73602..de23a3e 100644 --- a/monday/tests/test_case_resource.py +++ b/monday/tests/test_case_resource.py @@ -29,4 +29,5 @@ def setUp(self): self.team_ids = [105939, 105940, 105941] self.notification_text = "This is an awesome notification." self.notification_target_type = "Project" + self.folder_id = "678549" From 23356177891bfc7efbd84d34d4e93602759dde22 Mon Sep 17 00:00:00 2001 From: albcl Date: Wed, 14 Dec 2022 12:06:26 +0100 Subject: [PATCH 34/46] No need to declare variables again --- monday/query_joins.py | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/monday/query_joins.py b/monday/query_joins.py index 603f5e1..9409fc6 100644 --- a/monday/query_joins.py +++ b/monday/query_joins.py @@ -409,12 +409,7 @@ def duplicate_board_query( folder_id: int = None, keep_subscribers: bool = None, ) -> str: - board_name = board_name if board_name else "" - workspace_id = workspace_id if workspace_id else None - folder_id = folder_id if folder_id else None - keep_subscribers = keep_subscribers if keep_subscribers else False - - params = """board_id: %s, duplicate_type: %s, board_name: \"%s\"""" % ( + params = """board_id: %s, duplicate_type: %s, board_name: \"%s\", keep_subscribers: %s""" % ( board_id, duplicate_type.value, board_name, From 3b2c1f0965537080b2cda75bdecc1cf90e90c5db Mon Sep 17 00:00:00 2001 From: albcl Date: Wed, 14 Dec 2022 12:07:39 +0100 Subject: [PATCH 35/46] Better type hints and default values --- monday/query_joins.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/monday/query_joins.py b/monday/query_joins.py index 9409fc6..a98dc0d 100644 --- a/monday/query_joins.py +++ b/monday/query_joins.py @@ -404,10 +404,10 @@ def get_columns_by_board_query(board_ids): def duplicate_board_query( board_id: int, duplicate_type: DuplicateTypes, - board_name: str = None, - workspace_id: int = None, - folder_id: int = None, - keep_subscribers: bool = None, + board_name: str = "", + workspace_id: Union[int, None] = None, + folder_id: Union[int, None] = None, + keep_subscribers: bool = False, ) -> str: params = """board_id: %s, duplicate_type: %s, board_name: \"%s\", keep_subscribers: %s""" % ( board_id, From 0b94fb1f97dce8979be531d4fdaefb516519880e Mon Sep 17 00:00:00 2001 From: albcl Date: Wed, 14 Dec 2022 12:08:55 +0100 Subject: [PATCH 36/46] Added missing query parameters --- monday/query_joins.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/monday/query_joins.py b/monday/query_joins.py index a98dc0d..20ff3f2 100644 --- a/monday/query_joins.py +++ b/monday/query_joins.py @@ -413,10 +413,14 @@ def duplicate_board_query( board_id, duplicate_type.value, board_name, + keep_subscribers, ) + if folder_id: + params += f", folder_id: {folder_id}" + if workspace_id: - params += """, workspace_id: %s""" + params += f", workspace_id: {workspace_id}" query = """ mutation { From d42b3ecc708c843c109b02fbed24a4e56f991e4c Mon Sep 17 00:00:00 2001 From: albcl Date: Mon, 20 Jun 2022 17:08:51 +0200 Subject: [PATCH 37/46] Added "duplicate board" query and type hint --- monday/query_joins.py | 16 ++++++++++++++++ monday/resources/boards.py | 4 ++++ monday/tests/test_board_resource.py | 6 ++++++ monday/tests/test_case_resource.py | 1 + 4 files changed, 27 insertions(+) diff --git a/monday/query_joins.py b/monday/query_joins.py index 20ff3f2..1a12949 100644 --- a/monday/query_joins.py +++ b/monday/query_joins.py @@ -452,6 +452,22 @@ def create_board_by_workspace_query(board_name: str, board_kind: BoardKind, work return query +def duplicate_board_query(board_id: int, duplicate_type: DuplicateTypes): + query = """ + mutation { + duplicate_board(board_id: %s, duplicate_type: %s) { + board { + id + } + } + } + """ % ( + board_id, + duplicate_type.value, + ) + return query + + # USER RESOURCE QUERIES def get_users_query(**kwargs): query = '''query diff --git a/monday/resources/boards.py b/monday/resources/boards.py index ef9c634..e97d0e5 100644 --- a/monday/resources/boards.py +++ b/monday/resources/boards.py @@ -46,3 +46,7 @@ def duplicate_board( def create_board(self, board_name: str, board_kind: BoardKind, workspace_id: int = None): query = create_board_by_workspace_query(board_name, board_kind, workspace_id) return self.client.execute(query) + + def duplicate_board(self, board_id: int, duplicate_type: DuplicateTypes): + query = duplicate_board_query(board_id, duplicate_type) + return self.client.execute(query) diff --git a/monday/tests/test_board_resource.py b/monday/tests/test_board_resource.py index 2b8c749..9d38cdf 100644 --- a/monday/tests/test_board_resource.py +++ b/monday/tests/test_board_resource.py @@ -76,3 +76,9 @@ def test_create_board_by_workspace_query(self): self.assertNotIn(str(self.board_kind), query_b) self.assertIn(str(self.board_kind.value), query_b) self.assertNotIn(str(self.workspace_id), query_b) + + def test_duplicate_board_query(self): + query = duplicate_board_query(board_id=self.board_id, duplicate_type=self.duplicate_type) + self.assertIn(str(self.board_id), query) + self.assertNotIn(str(self.duplicate_type), query) + self.assertIn(str(self.duplicate_type.value), query) diff --git a/monday/tests/test_case_resource.py b/monday/tests/test_case_resource.py index de23a3e..46f9de7 100644 --- a/monday/tests/test_case_resource.py +++ b/monday/tests/test_case_resource.py @@ -15,6 +15,7 @@ def setUp(self): self.board_kind = BoardKind.PUBLIC self.board_state = BoardState.ACTIVE self.boards_order_by = BoardsOrderBy.USED_AT + self.duplicate_type = DuplicateTypes.WITH_PULSES self.group_id = 7 self.column_id = "file_column" self.user_ids = [1287123, 1230919] From 8f445d57fd31d9956aa0bfd8b863b0214e92ed29 Mon Sep 17 00:00:00 2001 From: albcl Date: Wed, 29 Jun 2022 10:28:03 +0200 Subject: [PATCH 38/46] Added extra parameters for the query --- monday/query_joins.py | 47 ++++++++++++++++++++++++++------------ monday/resources/boards.py | 12 ++++++++-- 2 files changed, 43 insertions(+), 16 deletions(-) diff --git a/monday/query_joins.py b/monday/query_joins.py index 1a12949..5794ecd 100644 --- a/monday/query_joins.py +++ b/monday/query_joins.py @@ -381,25 +381,44 @@ def get_boards_by_id_query(board_ids): }''' % board_ids -def get_columns_by_board_query(board_ids): - return '''query - { - boards(ids: %s) { +def duplicate_board_query( + board_id: int, + duplicate_type: DuplicateTypes, + board_name: str = None, + workspace_id: int = None, + folder_id: int = None, + keep_subscribers: bool = None, +) -> str: + board_name = board_name if board_name else "" + workspace_id = workspace_id if workspace_id else None + folder_id = folder_id if folder_id else None + keep_subscribers = keep_subscribers if keep_subscribers else False + + params = """board_id: %s, duplicate_type: %s, board_name: \"%s\"""" % ( + board_id, + duplicate_type.value, + board_name, + ) + + if workspace_id: + params += """, workspace_id: %s""" + + query = """ + mutation { + duplicate_board(%s) { + board { id - name - groups { + groups{ id - title } - columns { - title - id - type - settings_str - } } - }''' % board_ids + } + } + """ % ( + params + ) + return query def duplicate_board_query( board_id: int, diff --git a/monday/resources/boards.py b/monday/resources/boards.py index e97d0e5..b572a91 100644 --- a/monday/resources/boards.py +++ b/monday/resources/boards.py @@ -47,6 +47,14 @@ def create_board(self, board_name: str, board_kind: BoardKind, workspace_id: int query = create_board_by_workspace_query(board_name, board_kind, workspace_id) return self.client.execute(query) - def duplicate_board(self, board_id: int, duplicate_type: DuplicateTypes): - query = duplicate_board_query(board_id, duplicate_type) + def duplicate_board( + self, + board_id: int, + duplicate_type: DuplicateTypes, + board_name: str = None, + workspace_id: int = None, + folder_id: int = None, + keep_subscribers: bool = None, + ): + query = duplicate_board_query(board_id, duplicate_type, board_name, workspace_id, folder_id, keep_subscribers) return self.client.execute(query) From 11ac7b5e5b0830980e35040df19e751e0761bd6a Mon Sep 17 00:00:00 2001 From: albcl Date: Sat, 18 Jun 2022 19:12:33 +0200 Subject: [PATCH 39/46] Added "create board by workspace id" --- monday/query_joins.py | 12 ++++++++++++ monday/tests/test_board_resource.py | 6 ++++++ 2 files changed, 18 insertions(+) diff --git a/monday/query_joins.py b/monday/query_joins.py index 5794ecd..7c55d4a 100644 --- a/monday/query_joins.py +++ b/monday/query_joins.py @@ -487,6 +487,18 @@ def duplicate_board_query(board_id: int, duplicate_type: DuplicateTypes): return query +def create_board_by_workspace_query(board_name, board_kind, workspace_id = None): + workspace_query = f'workspace_id: {workspace_id}' if workspace_id else '' + query = ''' + mutation { + create_board (board_name:"%s", board_kind: %s, %s) { + id + } + } + ''' % (board_name, board_kind, workspace_query) + return query + + # USER RESOURCE QUERIES def get_users_query(**kwargs): query = '''query diff --git a/monday/tests/test_board_resource.py b/monday/tests/test_board_resource.py index 9d38cdf..84c9cc6 100644 --- a/monday/tests/test_board_resource.py +++ b/monday/tests/test_board_resource.py @@ -82,3 +82,9 @@ def test_duplicate_board_query(self): self.assertIn(str(self.board_id), query) self.assertNotIn(str(self.duplicate_type), query) self.assertIn(str(self.duplicate_type.value), query) + self.assertIn(str(self.board_kind), query) + self.assertIn(str(self.workspace_id), query) + query_b = create_board_by_workspace_query(board_name=self.board_name, board_kind=self.board_kind) + self.assertIn(str(self.board_name), query_b) + self.assertIn(str(self.board_kind), query_b) + self.assertNotIn(str(self.workspace_id), query_b) From 5120dbc76cab3e5dbee0d3669fbf2fad676111b8 Mon Sep 17 00:00:00 2001 From: albcl Date: Tue, 18 Oct 2022 13:39:56 +0200 Subject: [PATCH 40/46] Query and tests updated --- README.md | 97 +---------------------------- monday/query_joins.py | 68 +------------------- monday/resources/boards.py | 12 ---- monday/tests/test_board_resource.py | 34 +++++----- 4 files changed, 19 insertions(+), 192 deletions(-) diff --git a/README.md b/README.md index f2aff8a..2ec35f8 100644 --- a/README.md +++ b/README.md @@ -5,7 +5,7 @@ A monday.com Python Client Library -For an overview of the Monday API, [click here](https://monday.com/developers/v2#introduction-section). +For an overview of the Monday API, [click here](https://developer.monday.com/api-reference/docs). #### Requirements @@ -24,102 +24,9 @@ monday = MondayClient('your token') monday.items.create_item(board_id='12345678', group_id='today', item_name='Do a thing') ``` - -**Available methods:** -#### Items Resource (monday.items) -- `create_item(board_id, group_id, item_name, column_values=None, create_labels_if_missing=False)` - Create an item on a board in the given group with name item_name. - -- `create_subitem(parent_item_id, subitem_name, column_values=None, create_labels_if_missing=False)` - Create a subitem underneath a given parent item. Monday API will return an error if the board you're trying to add to does not have a subitems column/at least one subitem created. - -- `fetch_items_by_column_value(board_id, column_id, value)` - Fetch items on a board by column value. - -- `fetch_items_by_id(board_id, [ids])` - Fetch items from any board by ids, passed in as an array of integers. - -- `change_item_value(board_id, item_id, column_id, value)` - Change column values for item on a board. Check Monday's API for which columns are supported. - -- `change_multiple_column_values(board_id, item_id, column_values, create_labels_if_missing=False)` - Change multiple column values for item on a board. Column values should be passed in as JSON. Check Monday's API for which columns are supported. - -- `add_file_to_column(item_id, column_id, file)` - Upload a file to a file type column specified by column_id. Monday limits uploads to 500MB in size. - -- `move_item_to_group(item_id, group_id)` - Move the item to a group within the same board. - -- `archive_item_by_id(item_id)` - Archive the item by item_id. - -- `delete_item_by_id(item_id)` - Delete the item by item_id. - -#### Updates Resource (monday.updates) -- `create_update(item_id, update_body)` - Create an update attached to a given item. - -- `fetch_updates(limit, page=None)` - Fetch a certain number of updates, starting from the given page. Default is 1 - -- `fetch_updates_for_item(board_id, item_id, limit)` - Fetch all updates for a certain item on a certain board up to a certain limit, set by you. Default is 100 updates - - -#### Tags Resource (monday.tags) -- `fetch_tags(tag_ids=None)` - Fetch all tags associated with an account. Optionally takes a list containing tag ids (if you know them). Returns IDs, names, and colors. - - -#### Boards Resource (monday.boards) -- `fetch_boards(**kwargs)` - Fetch boards associated with an account. Returns boards and their groups, tags, and columns. Accepts keyword arguments: - - `limit` - The number of boards returned (*int*. Default is 25). - - `page` - The page number returned, should you implement pagination(*int*. Starts at 1). - - `ids` - A list of the unique board identifier(s) (*List[int]*). - - `board_kind` - The board's kind (*BoardKind*. public / private / share). - - `state` - The state of the board (*BoardState*. all / active / archived / deleted. Default is active). - - `order_by` - The order in which to retrieve your boards (*BoardsOrderBy*. created_at / used_at). - - -- `fetch_boards_by_id([board_ids])` - Since Monday does not allow querying boards by name, you can use `fetch_boards` to get a list of boards, and then `fetch_boards_by_id` to get more detailed info about the groups and columns on that board. Accepts a comma separated list of board ids. - -- `fetch_columns_by_board_id([board_ids])` - Get all columns, as well as their ids, types, and settings. Accepts a comma separated list of board ids. - -- `fetch_items_by_board_id([board_ids], **kwargs)` - Get all items on a board(s). Accepts a comma separated list of board ids. - - `limit` - The number of rows returned (*int*. no default). - - `page` - The page number returned, should you implement pagination(*int*. no default). - -- `duplicate_board(board_id, duplicate_type, board_name, workspace_id, folder_id, keep_subscribers)` - Duplicate a board by its id. It requires a duplication type to be chosen (*duplicate_board_with_structure / duplicate_board_with_pulses / duplicate_board_with_pulses_and_updates*). Optionaly you can use: - - `board_name` - The duplicated board's name (*string*). - - `workspace_id` - The destination workspace (*int* Defaults to the original board's workspace). - - `folder_id` - The destination folder within the destination workspace. The folder_id is required if you are duplicating to another workspace. (*int* Defaults to originals board's folder). - - `keep_subscribers` - Ability to duplicate the subscribers to the new board (*Boolean* Defaults to false). - -- `create_board(board_name, board_kind, workspace_id)` - Create board with the given name and kind by (and optional) workspace id. - - -#### Users Resource (monday.users) -- `fetch_users(**kwargs)` - Fetch user information associated with an account. See Monday API docs for a list of accepted keyword arguments. - -#### Workspaces Resource (monday.workspaces) -- `get_workspaces()` - Get all workspaces. - -- `create_workspace(name, kind, description)` - Create workspace with the given name, kind and description. - -- `add_users_to_workspace(workspace_id, [user_ids], kind)` - Add given users of the given kind to the given workspace. - -- `delete_users_from_workspace(workspace_id, [user_ids])` - Delete given users from the given workspace. - -- `add_teams_to_workspace(workspace_id, [team_ids])` - Add given teams to the given workspace. - -- `delete_teams_from_workspace(workspace_id, [team_ids])` - Delete given teams from the given workspace. - -#### Groups Resource (monday.groups) -- `get_groups_by_board([board_ids])` - Get all groups associated with a certain board or boards. Accepts a single id or a comma separated list of ids. - -- `get_items_by_group(board_id, group_id)` - Get all items that are members of a given group. - -- `create_group(board_id, group_name)` - Create a group on a given board. - -- `duplicate_group(board_id, group_id)` - Duplicate a group and all its items on a given board. - -- `archive_group(board_id, group_id)` - Archive a group on a given board. - -- `delete_group(board_id, group_id)` - Delete a group on a given board. - -#### Notifications Resource (monday.notifications) -- `create_notification(user_id, target_id, text, target_type)` - The create_notification mutation allows to trigger a notification within the platform (will also send out an email if the recipient's email preferences are set up accordingly). ### Additional Resources and Code Samples -- [Read and format all of the items on a board](https://github.com/ProdPerfect/monday/wiki/Code-Examples#whole-board-formatting-example) +- Read our [docs](https://monday.readthedocs.io/en/latest/) for a full list of available resources and methods for interacting with those resources. ## Contributors diff --git a/monday/query_joins.py b/monday/query_joins.py index 7c55d4a..5ce1af7 100644 --- a/monday/query_joins.py +++ b/monday/query_joins.py @@ -1,5 +1,5 @@ -import json from enum import Enum +import json from typing import List, Union, Optional from monday.resources.types import BoardKind, BoardState, BoardsOrderBy, DuplicateTypes @@ -420,72 +420,6 @@ def duplicate_board_query( return query -def duplicate_board_query( - board_id: int, - duplicate_type: DuplicateTypes, - board_name: str = "", - workspace_id: Union[int, None] = None, - folder_id: Union[int, None] = None, - keep_subscribers: bool = False, -) -> str: - params = """board_id: %s, duplicate_type: %s, board_name: \"%s\", keep_subscribers: %s""" % ( - board_id, - duplicate_type.value, - board_name, - keep_subscribers, - ) - - if folder_id: - params += f", folder_id: {folder_id}" - - if workspace_id: - params += f", workspace_id: {workspace_id}" - - query = """ - mutation { - duplicate_board(%s) { - board { - id - groups{ - id - } - } - } - } - """ % ( - params - ) - - return query - - -def create_board_by_workspace_query(board_name: str, board_kind: BoardKind, workspace_id = None) -> str: - workspace_query = f'workspace_id: {workspace_id}' if workspace_id else '' - query = ''' - mutation { - create_board (board_name:"%s", board_kind: %s, %s) { - id - } - } - ''' % (board_name, board_kind.value, workspace_query) - return query - - -def duplicate_board_query(board_id: int, duplicate_type: DuplicateTypes): - query = """ - mutation { - duplicate_board(board_id: %s, duplicate_type: %s) { - board { - id - } - } - } - """ % ( - board_id, - duplicate_type.value, - ) - return query - def create_board_by_workspace_query(board_name, board_kind, workspace_id = None): workspace_query = f'workspace_id: {workspace_id}' if workspace_id else '' diff --git a/monday/resources/boards.py b/monday/resources/boards.py index b572a91..3edf135 100644 --- a/monday/resources/boards.py +++ b/monday/resources/boards.py @@ -31,18 +31,6 @@ def fetch_columns_by_board_id(self, board_ids): query = get_columns_by_board_query(board_ids) return self.client.execute(query) - def duplicate_board( - self, - board_id: int, - duplicate_type: DuplicateTypes, - board_name: str = None, - workspace_id: int = None, - folder_id: int = None, - keep_subscribers: bool = None, - ): - query = duplicate_board_query(board_id, duplicate_type, board_name, workspace_id, folder_id, keep_subscribers) - return self.client.execute(query) - def create_board(self, board_name: str, board_kind: BoardKind, workspace_id: int = None): query = create_board_by_workspace_query(board_name, board_kind, workspace_id) return self.client.execute(query) diff --git a/monday/tests/test_board_resource.py b/monday/tests/test_board_resource.py index 84c9cc6..967373f 100644 --- a/monday/tests/test_board_resource.py +++ b/monday/tests/test_board_resource.py @@ -52,39 +52,37 @@ def test_get_columns_by_board_query(self): query = get_columns_by_board_query(board_ids=self.board_id) self.assertIn(str(self.board_id), query) + def test_create_board_by_workspace_query(self): + query_a = create_board_by_workspace_query(board_name=self.board_name, board_kind=self.board_kind, workspace_id=self.workspace_id) + self.assertIn(str(self.board_name), query_a) + self.assertNotIn(str(self.board_kind), query_a) + self.assertIn(str(self.board_kind.value), query_a) + self.assertIn(str(self.workspace_id), query_a) + query_b = create_board_by_workspace_query(board_name=self.board_name, board_kind=self.board_kind) + self.assertIn(str(self.board_name), query_b) + self.assertNotIn(str(self.board_kind), query_b) + self.assertIn(str(self.board_kind.value), query_b) + self.assertNotIn(str(self.workspace_id), query_b) + def test_duplicate_board_query(self): query_a = duplicate_board_query(board_id=self.board_id, duplicate_type=self.duplicate_type) self.assertIn(str(self.board_id), query_a) self.assertNotIn(str(self.duplicate_type), query_a) self.assertIn(str(self.duplicate_type.value), query_a) - query_b = duplicate_board_query(board_id=self.board_id, duplicate_type=self.duplicate_type, board_name='testing_name', workspace_id=self.workspace_id, folder_id=self.folder_id) + query_b = duplicate_board_query(board_id=self.board_id, duplicate_type=self.duplicate_type, board_name='testing_name', workspace_id=1, folder_id=2) self.assertIn(str(self.board_id), query_b) self.assertNotIn(str(self.duplicate_type), query_b) self.assertIn(str(self.duplicate_type.value), query_b) self.assertIn(str('testing_name'), query_b) - self.assertIn(self.workspace_id, query_b) - self.assertIn(self.folder_id, query_b) + self.assertIn(str(1), query_b) + self.assertIn(str(2), query_b) def test_create_board_by_workspace_query(self): query_a = create_board_by_workspace_query(board_name=self.board_name, board_kind=self.board_kind, workspace_id=self.workspace_id) self.assertIn(str(self.board_name), query_a) - self.assertNotIn(str(self.board_kind), query_a) - self.assertIn(str(self.board_kind.value), query_a) + self.assertIn(str(self.board_kind), query_a) self.assertIn(str(self.workspace_id), query_a) query_b = create_board_by_workspace_query(board_name=self.board_name, board_kind=self.board_kind) self.assertIn(str(self.board_name), query_b) - self.assertNotIn(str(self.board_kind), query_b) - self.assertIn(str(self.board_kind.value), query_b) - self.assertNotIn(str(self.workspace_id), query_b) - - def test_duplicate_board_query(self): - query = duplicate_board_query(board_id=self.board_id, duplicate_type=self.duplicate_type) - self.assertIn(str(self.board_id), query) - self.assertNotIn(str(self.duplicate_type), query) - self.assertIn(str(self.duplicate_type.value), query) - self.assertIn(str(self.board_kind), query) - self.assertIn(str(self.workspace_id), query) - query_b = create_board_by_workspace_query(board_name=self.board_name, board_kind=self.board_kind) - self.assertIn(str(self.board_name), query_b) self.assertIn(str(self.board_kind), query_b) self.assertNotIn(str(self.workspace_id), query_b) From 5027df3c05a7f09a0babf4f97e4b8ed7b4b4bdb7 Mon Sep 17 00:00:00 2001 From: Christina D'Astolfo Date: Thu, 15 Dec 2022 14:16:17 -0500 Subject: [PATCH 41/46] Fix __email__ typo --- monday/__version__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/monday/__version__.py b/monday/__version__.py index 7bb30fb..ec6734e 100644 --- a/monday/__version__.py +++ b/monday/__version__.py @@ -1,3 +1,3 @@ __version__ = '1.3.3' __author__ = 'Christina D\'Astolfo' -__email__ = 'chdastolfo@gmail.com, lemi@prodperfect.com', 'pevner@prodperfect.com' +__email__ = 'chdastolfo@gmail.com, lemi@prodperfect.com, pevner@prodperfect.com' From 0d9cf2f60879603a0a8c3cb07ac09442fb491d78 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 9 Dec 2022 05:18:57 +0000 Subject: [PATCH 42/46] Bump certifi from 2021.5.30 to 2022.12.7 Bumps [certifi](https://github.com/certifi/python-certifi) from 2021.5.30 to 2022.12.7. - [Release notes](https://github.com/certifi/python-certifi/releases) - [Commits](https://github.com/certifi/python-certifi/compare/2021.05.30...2022.12.07) --- updated-dependencies: - dependency-name: certifi dependency-type: indirect ... Signed-off-by: dependabot[bot] --- Pipfile.lock | 387 +++++++++++++++++++++++++++++++++------------------ 1 file changed, 249 insertions(+), 138 deletions(-) diff --git a/Pipfile.lock b/Pipfile.lock index 0ff5e0a..44c2d3f 100644 --- a/Pipfile.lock +++ b/Pipfile.lock @@ -1,7 +1,7 @@ { "_meta": { "hash": { - "sha256": "350178256ed815edb9a38634daf7436b81a7edacb6250110bd0ef02679bf52ab" + "sha256": "d373b036ae9c93724f06d1208a804c0088aa40dcabda25687ff2ec4c83a35756" }, "pipfile-spec": 6, "requires": { @@ -22,143 +22,212 @@ "sha256:71ea07f44df9568a75d0f354c49143a4575d90645e9fead6dfb52c26a85ed13a", "sha256:840947ebfa8b58f318d42301cf8c0a20fd794a33b61cc4638e28e9e61ba32f42" ], + "markers": "python_version >= '3.5'", "version": "==2.3.3" }, + "attrs": { + "hashes": [ + "sha256:29adc2665447e5191d0e7c568fde78b21f9672d344281d0c6e1ab085429b22b6", + "sha256:86efa402f67bf2df34f51a335487cf46b1ec130d02b8d39fd248abfd30da551c" + ], + "markers": "python_version >= '3.5'", + "version": "==22.1.0" + }, "bleach": { "hashes": [ - "sha256:6123ddc1052673e52bab52cdc955bcb57a015264a1c57d37bea2f6b817af0125", - "sha256:98b3170739e5e83dd9dc19633f074727ad848cbedb6026708c8ac2d3b697a433" + "sha256:085f7f33c15bd408dd9b17a4ad77c577db66d76203e5984b1bd59baeee948b2a", + "sha256:0d03255c47eb9bd2f26aa9bb7f2107732e7e8fe195ca2f64709fcf3b0a4a085c" ], - "version": "==3.3.0" + "markers": "python_version >= '3.7'", + "version": "==5.0.1" }, "certifi": { "hashes": [ - "sha256:2bbf76fd432960138b3ef6dda3dde0544f27cbf8546c458e60baf371917ba9ee", - "sha256:50b1e4f8446b06f41be7dd6338db18e0990601dce795c2b1686458aa7e8fa7d8" + "sha256:35824b4c3a97115964b408844d64aa14db1cc518f6562e8d7261699d1350a9e3", + "sha256:4ad3232f5e926d6718ec31cfc1fcadfde020920e278684144551c91769c7bc18" ], - "version": "==2021.5.30" + "index": "pypi", + "version": "==2022.12.7" }, "cffi": { "hashes": [ - "sha256:005a36f41773e148deac64b08f233873a4d0c18b053d37da83f6af4d9087b813", - "sha256:04c468b622ed31d408fea2346bec5bbffba2cc44226302a0de1ade9f5ea3d373", - "sha256:06d7cd1abac2ffd92e65c0609661866709b4b2d82dd15f611e602b9b188b0b69", - "sha256:06db6321b7a68b2bd6df96d08a5adadc1fa0e8f419226e25b2a5fbf6ccc7350f", - "sha256:0857f0ae312d855239a55c81ef453ee8fd24136eaba8e87a2eceba644c0d4c06", - "sha256:0f861a89e0043afec2a51fd177a567005847973be86f709bbb044d7f42fc4e05", - "sha256:1071534bbbf8cbb31b498d5d9db0f274f2f7a865adca4ae429e147ba40f73dea", - "sha256:158d0d15119b4b7ff6b926536763dc0714313aa59e320ddf787502c70c4d4bee", - "sha256:1bf1ac1984eaa7675ca8d5745a8cb87ef7abecb5592178406e55858d411eadc0", - "sha256:1f436816fc868b098b0d63b8920de7d208c90a67212546d02f84fe78a9c26396", - "sha256:24a570cd11895b60829e941f2613a4f79df1a27344cbbb82164ef2e0116f09c7", - "sha256:24ec4ff2c5c0c8f9c6b87d5bb53555bf267e1e6f70e52e5a9740d32861d36b6f", - "sha256:2894f2df484ff56d717bead0a5c2abb6b9d2bf26d6960c4604d5c48bbc30ee73", - "sha256:29314480e958fd8aab22e4a58b355b629c59bf5f2ac2492b61e3dc06d8c7a315", - "sha256:293e7ea41280cb28c6fcaaa0b1aa1f533b8ce060b9e701d78511e1e6c4a1de76", - "sha256:34eff4b97f3d982fb93e2831e6750127d1355a923ebaeeb565407b3d2f8d41a1", - "sha256:35f27e6eb43380fa080dccf676dece30bef72e4a67617ffda586641cd4508d49", - "sha256:3c3f39fa737542161d8b0d680df2ec249334cd70a8f420f71c9304bd83c3cbed", - "sha256:3d3dd4c9e559eb172ecf00a2a7517e97d1e96de2a5e610bd9b68cea3925b4892", - "sha256:43e0b9d9e2c9e5d152946b9c5fe062c151614b262fda2e7b201204de0b99e482", - "sha256:48e1c69bbacfc3d932221851b39d49e81567a4d4aac3b21258d9c24578280058", - "sha256:51182f8927c5af975fece87b1b369f722c570fe169f9880764b1ee3bca8347b5", - "sha256:58e3f59d583d413809d60779492342801d6e82fefb89c86a38e040c16883be53", - "sha256:5de7970188bb46b7bf9858eb6890aad302577a5f6f75091fd7cdd3ef13ef3045", - "sha256:65fa59693c62cf06e45ddbb822165394a288edce9e276647f0046e1ec26920f3", - "sha256:681d07b0d1e3c462dd15585ef5e33cb021321588bebd910124ef4f4fb71aef55", - "sha256:69e395c24fc60aad6bb4fa7e583698ea6cc684648e1ffb7fe85e3c1ca131a7d5", - "sha256:6c97d7350133666fbb5cf4abdc1178c812cb205dc6f41d174a7b0f18fb93337e", - "sha256:6e4714cc64f474e4d6e37cfff31a814b509a35cb17de4fb1999907575684479c", - "sha256:72d8d3ef52c208ee1c7b2e341f7d71c6fd3157138abf1a95166e6165dd5d4369", - "sha256:8ae6299f6c68de06f136f1f9e69458eae58f1dacf10af5c17353eae03aa0d827", - "sha256:8b198cec6c72df5289c05b05b8b0969819783f9418e0409865dac47288d2a053", - "sha256:99cd03ae7988a93dd00bcd9d0b75e1f6c426063d6f03d2f90b89e29b25b82dfa", - "sha256:9cf8022fb8d07a97c178b02327b284521c7708d7c71a9c9c355c178ac4bbd3d4", - "sha256:9de2e279153a443c656f2defd67769e6d1e4163952b3c622dcea5b08a6405322", - "sha256:9e93e79c2551ff263400e1e4be085a1210e12073a31c2011dbbda14bda0c6132", - "sha256:9ff227395193126d82e60319a673a037d5de84633f11279e336f9c0f189ecc62", - "sha256:a465da611f6fa124963b91bf432d960a555563efe4ed1cc403ba5077b15370aa", - "sha256:ad17025d226ee5beec591b52800c11680fca3df50b8b29fe51d882576e039ee0", - "sha256:afb29c1ba2e5a3736f1c301d9d0abe3ec8b86957d04ddfa9d7a6a42b9367e396", - "sha256:b85eb46a81787c50650f2392b9b4ef23e1f126313b9e0e9013b35c15e4288e2e", - "sha256:bb89f306e5da99f4d922728ddcd6f7fcebb3241fc40edebcb7284d7514741991", - "sha256:cbde590d4faaa07c72bf979734738f328d239913ba3e043b1e98fe9a39f8b2b6", - "sha256:cc5a8e069b9ebfa22e26d0e6b97d6f9781302fe7f4f2b8776c3e1daea35f1adc", - "sha256:cd2868886d547469123fadc46eac7ea5253ea7fcb139f12e1dfc2bbd406427d1", - "sha256:d42b11d692e11b6634f7613ad8df5d6d5f8875f5d48939520d351007b3c13406", - "sha256:df5052c5d867c1ea0b311fb7c3cd28b19df469c056f7fdcfe88c7473aa63e333", - "sha256:f2d45f97ab6bb54753eab54fffe75aaf3de4ff2341c9daee1987ee1837636f1d", - "sha256:fd78e5fee591709f32ef6edb9a015b4aa1a5022598e36227500c8f4e02328d9c" - ], - "version": "==1.14.5" - }, - "chardet": { - "hashes": [ - "sha256:0d6f53a15db4120f2b08c94f11e7d93d2c911ee118b6b30a04ec3ee8310179fa", - "sha256:f864054d66fd9118f2e67044ac8981a54775ec5b67aed0441892edb553d21da5" - ], - "version": "==4.0.0" + "sha256:00a9ed42e88df81ffae7a8ab6d9356b371399b91dbdf0c3cb1e84c03a13aceb5", + "sha256:03425bdae262c76aad70202debd780501fabeaca237cdfddc008987c0e0f59ef", + "sha256:04ed324bda3cda42b9b695d51bb7d54b680b9719cfab04227cdd1e04e5de3104", + "sha256:0e2642fe3142e4cc4af0799748233ad6da94c62a8bec3a6648bf8ee68b1c7426", + "sha256:173379135477dc8cac4bc58f45db08ab45d228b3363adb7af79436135d028405", + "sha256:198caafb44239b60e252492445da556afafc7d1e3ab7a1fb3f0584ef6d742375", + "sha256:1e74c6b51a9ed6589199c787bf5f9875612ca4a8a0785fb2d4a84429badaf22a", + "sha256:2012c72d854c2d03e45d06ae57f40d78e5770d252f195b93f581acf3ba44496e", + "sha256:21157295583fe8943475029ed5abdcf71eb3911894724e360acff1d61c1d54bc", + "sha256:2470043b93ff09bf8fb1d46d1cb756ce6132c54826661a32d4e4d132e1977adf", + "sha256:285d29981935eb726a4399badae8f0ffdff4f5050eaa6d0cfc3f64b857b77185", + "sha256:30d78fbc8ebf9c92c9b7823ee18eb92f2e6ef79b45ac84db507f52fbe3ec4497", + "sha256:320dab6e7cb2eacdf0e658569d2575c4dad258c0fcc794f46215e1e39f90f2c3", + "sha256:33ab79603146aace82c2427da5ca6e58f2b3f2fb5da893ceac0c42218a40be35", + "sha256:3548db281cd7d2561c9ad9984681c95f7b0e38881201e157833a2342c30d5e8c", + "sha256:3799aecf2e17cf585d977b780ce79ff0dc9b78d799fc694221ce814c2c19db83", + "sha256:39d39875251ca8f612b6f33e6b1195af86d1b3e60086068be9cc053aa4376e21", + "sha256:3b926aa83d1edb5aa5b427b4053dc420ec295a08e40911296b9eb1b6170f6cca", + "sha256:3bcde07039e586f91b45c88f8583ea7cf7a0770df3a1649627bf598332cb6984", + "sha256:3d08afd128ddaa624a48cf2b859afef385b720bb4b43df214f85616922e6a5ac", + "sha256:3eb6971dcff08619f8d91607cfc726518b6fa2a9eba42856be181c6d0d9515fd", + "sha256:40f4774f5a9d4f5e344f31a32b5096977b5d48560c5592e2f3d2c4374bd543ee", + "sha256:4289fc34b2f5316fbb762d75362931e351941fa95fa18789191b33fc4cf9504a", + "sha256:470c103ae716238bbe698d67ad020e1db9d9dba34fa5a899b5e21577e6d52ed2", + "sha256:4f2c9f67e9821cad2e5f480bc8d83b8742896f1242dba247911072d4fa94c192", + "sha256:50a74364d85fd319352182ef59c5c790484a336f6db772c1a9231f1c3ed0cbd7", + "sha256:54a2db7b78338edd780e7ef7f9f6c442500fb0d41a5a4ea24fff1c929d5af585", + "sha256:5635bd9cb9731e6d4a1132a498dd34f764034a8ce60cef4f5319c0541159392f", + "sha256:59c0b02d0a6c384d453fece7566d1c7e6b7bae4fc5874ef2ef46d56776d61c9e", + "sha256:5d598b938678ebf3c67377cdd45e09d431369c3b1a5b331058c338e201f12b27", + "sha256:5df2768244d19ab7f60546d0c7c63ce1581f7af8b5de3eb3004b9b6fc8a9f84b", + "sha256:5ef34d190326c3b1f822a5b7a45f6c4535e2f47ed06fec77d3d799c450b2651e", + "sha256:6975a3fac6bc83c4a65c9f9fcab9e47019a11d3d2cf7f3c0d03431bf145a941e", + "sha256:6c9a799e985904922a4d207a94eae35c78ebae90e128f0c4e521ce339396be9d", + "sha256:70df4e3b545a17496c9b3f41f5115e69a4f2e77e94e1d2a8e1070bc0c38c8a3c", + "sha256:7473e861101c9e72452f9bf8acb984947aa1661a7704553a9f6e4baa5ba64415", + "sha256:8102eaf27e1e448db915d08afa8b41d6c7ca7a04b7d73af6514df10a3e74bd82", + "sha256:87c450779d0914f2861b8526e035c5e6da0a3199d8f1add1a665e1cbc6fc6d02", + "sha256:8b7ee99e510d7b66cdb6c593f21c043c248537a32e0bedf02e01e9553a172314", + "sha256:91fc98adde3d7881af9b59ed0294046f3806221863722ba7d8d120c575314325", + "sha256:94411f22c3985acaec6f83c6df553f2dbe17b698cc7f8ae751ff2237d96b9e3c", + "sha256:98d85c6a2bef81588d9227dde12db8a7f47f639f4a17c9ae08e773aa9c697bf3", + "sha256:9ad5db27f9cabae298d151c85cf2bad1d359a1b9c686a275df03385758e2f914", + "sha256:a0b71b1b8fbf2b96e41c4d990244165e2c9be83d54962a9a1d118fd8657d2045", + "sha256:a0f100c8912c114ff53e1202d0078b425bee3649ae34d7b070e9697f93c5d52d", + "sha256:a591fe9e525846e4d154205572a029f653ada1a78b93697f3b5a8f1f2bc055b9", + "sha256:a5c84c68147988265e60416b57fc83425a78058853509c1b0629c180094904a5", + "sha256:a66d3508133af6e8548451b25058d5812812ec3798c886bf38ed24a98216fab2", + "sha256:a8c4917bd7ad33e8eb21e9a5bbba979b49d9a97acb3a803092cbc1133e20343c", + "sha256:b3bbeb01c2b273cca1e1e0c5df57f12dce9a4dd331b4fa1635b8bec26350bde3", + "sha256:cba9d6b9a7d64d4bd46167096fc9d2f835e25d7e4c121fb2ddfc6528fb0413b2", + "sha256:cc4d65aeeaa04136a12677d3dd0b1c0c94dc43abac5860ab33cceb42b801c1e8", + "sha256:ce4bcc037df4fc5e3d184794f27bdaab018943698f4ca31630bc7f84a7b69c6d", + "sha256:cec7d9412a9102bdc577382c3929b337320c4c4c4849f2c5cdd14d7368c5562d", + "sha256:d400bfb9a37b1351253cb402671cea7e89bdecc294e8016a707f6d1d8ac934f9", + "sha256:d61f4695e6c866a23a21acab0509af1cdfd2c013cf256bbf5b6b5e2695827162", + "sha256:db0fbb9c62743ce59a9ff687eb5f4afbe77e5e8403d6697f7446e5f609976f76", + "sha256:dd86c085fae2efd48ac91dd7ccffcfc0571387fe1193d33b6394db7ef31fe2a4", + "sha256:e00b098126fd45523dd056d2efba6c5a63b71ffe9f2bbe1a4fe1716e1d0c331e", + "sha256:e229a521186c75c8ad9490854fd8bbdd9a0c9aa3a524326b55be83b54d4e0ad9", + "sha256:e263d77ee3dd201c3a142934a086a4450861778baaeeb45db4591ef65550b0a6", + "sha256:ed9cb427ba5504c1dc15ede7d516b84757c3e3d7868ccc85121d9310d27eed0b", + "sha256:fa6693661a4c91757f4412306191b6dc88c1703f780c8234035eac011922bc01", + "sha256:fcd131dd944808b5bdb38e6f5b53013c5aa4f334c5cad0c72742f6eba4b73db0" + ], + "version": "==1.15.1" + }, + "charset-normalizer": { + "hashes": [ + "sha256:5a3d016c7c547f69d6f81fb0db9449ce888b418b5b9952cc5e6e66843e9dd845", + "sha256:83e9a75d1911279afd89352c68b45348559d1fc0506b054b346651b5e7fee29f" + ], + "markers": "python_version >= '3.6'", + "version": "==2.1.1" }, "cryptography": { "hashes": [ - "sha256:0f1212a66329c80d68aeeb39b8a16d54ef57071bf22ff4e521657b27372e327d", - "sha256:1e056c28420c072c5e3cb36e2b23ee55e260cb04eee08f702e0edfec3fb51959", - "sha256:240f5c21aef0b73f40bb9f78d2caff73186700bf1bc6b94285699aff98cc16c6", - "sha256:26965837447f9c82f1855e0bc8bc4fb910240b6e0d16a664bb722df3b5b06873", - "sha256:37340614f8a5d2fb9aeea67fd159bfe4f5f4ed535b1090ce8ec428b2f15a11f2", - "sha256:3d10de8116d25649631977cb37da6cbdd2d6fa0e0281d014a5b7d337255ca713", - "sha256:3d8427734c781ea5f1b41d6589c293089704d4759e34597dce91014ac125aad1", - "sha256:7ec5d3b029f5fa2b179325908b9cd93db28ab7b85bb6c1db56b10e0b54235177", - "sha256:8e56e16617872b0957d1c9742a3f94b43533447fd78321514abbe7db216aa250", - "sha256:de4e5f7f68220d92b7637fc99847475b59154b7a1b3868fb7385337af54ac9ca", - "sha256:eb8cc2afe8b05acbd84a43905832ec78e7b3873fb124ca190f574dca7389a87d", - "sha256:ee77aa129f481be46f8d92a1a7db57269a2f23052d5f2433b4621bb457081cc9" - ], - "version": "==3.4.7" + "sha256:0e70da4bdff7601b0ef48e6348339e490ebfb0cbe638e083c9c41fb49f00c8bd", + "sha256:10652dd7282de17990b88679cb82f832752c4e8237f0c714be518044269415db", + "sha256:175c1a818b87c9ac80bb7377f5520b7f31b3ef2a0004e2420319beadedb67290", + "sha256:1d7e632804a248103b60b16fb145e8df0bc60eed790ece0d12efe8cd3f3e7744", + "sha256:1f13ddda26a04c06eb57119caf27a524ccae20533729f4b1e4a69b54e07035eb", + "sha256:2ec2a8714dd005949d4019195d72abed84198d877112abb5a27740e217e0ea8d", + "sha256:2fa36a7b2cc0998a3a4d5af26ccb6273f3df133d61da2ba13b3286261e7efb70", + "sha256:2fb481682873035600b5502f0015b664abc26466153fab5c6bc92c1ea69d478b", + "sha256:3178d46f363d4549b9a76264f41c6948752183b3f587666aff0555ac50fd7876", + "sha256:4367da5705922cf7070462e964f66e4ac24162e22ab0a2e9d31f1b270dd78083", + "sha256:4eb85075437f0b1fd8cd66c688469a0c4119e0ba855e3fef86691971b887caf6", + "sha256:50a1494ed0c3f5b4d07650a68cd6ca62efe8b596ce743a5c94403e6f11bf06c1", + "sha256:53049f3379ef05182864d13bb9686657659407148f901f3f1eee57a733fb4b00", + "sha256:6391e59ebe7c62d9902c24a4d8bcbc79a68e7c4ab65863536127c8a9cd94043b", + "sha256:67461b5ebca2e4c2ab991733f8ab637a7265bb582f07c7c88914b5afb88cb95b", + "sha256:78e47e28ddc4ace41dd38c42e6feecfdadf9c3be2af389abbfeef1ff06822285", + "sha256:80ca53981ceeb3241998443c4964a387771588c4e4a5d92735a493af868294f9", + "sha256:8a4b2bdb68a447fadebfd7d24855758fe2d6fecc7fed0b78d190b1af39a8e3b0", + "sha256:8e45653fb97eb2f20b8c96f9cd2b3a0654d742b47d638cf2897afbd97f80fa6d", + "sha256:998cd19189d8a747b226d24c0207fdaa1e6658a1d3f2494541cb9dfbf7dcb6d2", + "sha256:a10498349d4c8eab7357a8f9aa3463791292845b79597ad1b98a543686fb1ec8", + "sha256:b4cad0cea995af760f82820ab4ca54e5471fc782f70a007f31531957f43e9dee", + "sha256:bfe6472507986613dc6cc00b3d492b2f7564b02b3b3682d25ca7f40fa3fd321b", + "sha256:c9e0d79ee4c56d841bd4ac6e7697c8ff3c8d6da67379057f29e66acffcd1e9a7", + "sha256:ca57eb3ddaccd1112c18fc80abe41db443cc2e9dcb1917078e02dfa010a4f353", + "sha256:ce127dd0a6a0811c251a6cddd014d292728484e530d80e872ad9806cfb1c5b3c" + ], + "markers": "python_version >= '3.6'", + "version": "==38.0.4" }, "docutils": { "hashes": [ - "sha256:686577d2e4c32380bb50cbb22f575ed742d58168cee37e99117a854bcd88f125", - "sha256:cf316c8370a737a022b72b56874f6602acf974a37a9fba42ec2876387549fc61" + "sha256:33995a6753c30b7f577febfc2c50411fec6aac7f7ffeb7c4cfe5991072dcf9e6", + "sha256:5e1de4d849fee02c63b040a4a3fd567f4ab104defd8a5511fbbc24a8a017efbc" ], - "version": "==0.17.1" + "markers": "python_version >= '3.7'", + "version": "==0.19" + }, + "exceptiongroup": { + "hashes": [ + "sha256:542adf9dea4055530d6e1279602fa5cb11dab2395fa650b8674eaec35fc4a828", + "sha256:bd14967b79cd9bdb54d97323216f8fdf533e278df937aa2a90089e7d6e06e5ec" + ], + "markers": "python_version < '3.11'", + "version": "==1.0.4" }, "idna": { "hashes": [ - "sha256:b307872f855b18632ce0c21c5e45be78c0ea7ae4c15c828c20788b26921eb3f6", - "sha256:b97d804b1e9b523befed77c48dacec60e6dcb0b5391d57af6a65a312a90648c0" + "sha256:814f528e8dead7d329833b91c5faa87d60bf71824cd12a7530b5526063d02cb4", + "sha256:90b77e79eaa3eba6de819a0c442c0b4ceefc341a7a2ab77d7562bf49f425c5c2" ], - "version": "==2.10" + "markers": "python_version >= '3.5'", + "version": "==3.4" }, "importlib-metadata": { "hashes": [ - "sha256:960d52ba7c21377c990412aca380bf3642d734c2eaab78a2c39319f67c6a5786", - "sha256:e592faad8de1bda9fe920cf41e15261e7131bcf266c30306eec00e8e225c1dd5" + "sha256:d5059f9f1e8e41f80e9c56c2ee58811450c31984dfa625329ffd7c0dad88a73b", + "sha256:d84d17e21670ec07990e1044a99efe8d615d860fd176fc29ef5c306068fda313" ], "markers": "python_version < '3.8'", - "version": "==4.4.0" + "version": "==5.1.0" + }, + "iniconfig": { + "hashes": [ + "sha256:011e24c64b7f47f6ebd835bb12a743f2fbe9a26d4cecaa7f53bc4f35ee9da8b3", + "sha256:bc3af051d7d14b2ee5ef9969666def0cd1a000e121eaea580d4a313df4b37f32" + ], + "version": "==1.1.1" }, "isort": { "hashes": [ "sha256:54da7e92468955c4fceacd0c86bd0ec997b0e1ee80d97f67c35a78b719dccab1", "sha256:6e811fcb295968434526407adb8796944f1988c5b65e8139058f2014cbe100fd" ], + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", "version": "==4.3.21" }, + "jaraco.classes": { + "hashes": [ + "sha256:2353de3288bc6b82120752201c6b1c1a14b058267fa424ed5ce5984e3b922158", + "sha256:89559fa5c1d3c34eff6f631ad80bb21f378dbcbb35dd161fd2c6b93f5be2f98a" + ], + "markers": "python_version >= '3.7'", + "version": "==3.2.3" + }, "jeepney": { "hashes": [ - "sha256:7d59b6622675ca9e993a6bd38de845051d315f8b0c72cca3aef733a20b648657", - "sha256:aec56c0eb1691a841795111e184e13cad504f7703b9a64f63020816afa79a8ae" + "sha256:5efe48d255973902f6badc3ce55e2aa6c5c3b3bc642059ef3a91247bcfcc5806", + "sha256:c0a454ad016ca575060802ee4d590dd912e35c122fa04e70306de3d076cce755" ], "markers": "sys_platform == 'linux'", - "version": "==0.6.0" + "version": "==0.8.0" }, "keyring": { "hashes": [ - "sha256:045703609dd3fccfcdb27da201684278823b72af515aedec1a8515719a038cb8", - "sha256:8f607d7d1cc502c43a932a275a56fe47db50271904513a379d39df1af277ac48" + "sha256:3dd30011d555f1345dec2c262f0153f2f0ca6bca041fb1dc4588349bb4c0ac1e", + "sha256:ad192263e2cdd5f12875dedc2da13534359a7e760e77f8d04b50968a821c2361" ], - "version": "==23.0.1" + "markers": "python_version >= '3.7'", + "version": "==23.11.0" }, "lazy-object-proxy": { "hashes": [ @@ -184,6 +253,7 @@ "sha256:efa1909120ce98bbb3777e8b6f92237f5d5c8ea6758efea36a473e1d38f7d3e4", "sha256:f3900e8a5de27447acbf900b4750b0ddfd7ec1ea7fbaf11dfa911141bc522af0" ], + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", "version": "==1.4.3" }, "mccabe": { @@ -193,6 +263,14 @@ ], "version": "==0.6.1" }, + "more-itertools": { + "hashes": [ + "sha256:250e83d7e81d0c87ca6bd942e6aeab8cc9daa6096d12c5308f3f92fa5e5c1f41", + "sha256:5a6257e40878ef0520b1803990e3e22303a41b5714006c32a3fd8304b26ea1ab" + ], + "markers": "python_version >= '3.7'", + "version": "==9.0.0" + }, "mypy": { "hashes": [ "sha256:02d9bdd3398b636723ecb6c5cfe9773025a9ab7f34612c1cde5c7f2292e2d768", @@ -222,31 +300,42 @@ }, "packaging": { "hashes": [ - "sha256:5b327ac1320dc863dca72f4514ecc086f31186744b84a230374cc1fd776feae5", - "sha256:67714da7f7bc052e064859c05c595155bd1ee9f69f76557e21f051443c20947a" + "sha256:2198ec20bd4c017b8f9717e00f0c8714076fc2fd93816750ab48e2c41de2cfd3", + "sha256:957e2148ba0e1a3b282772e791ef1d8083648bc131c8ab0c1feba110ce1146c3" ], - "version": "==20.9" + "markers": "python_version >= '3.7'", + "version": "==22.0" }, "pkginfo": { "hashes": [ - "sha256:029a70cb45c6171c329dfc890cde0879f8c52d6f3922794796e06f577bb03db4", - "sha256:9fdbea6495622e022cc72c2e5e1b735218e4ffb2a2a69cde2694a6c1f16afb75" + "sha256:ac03e37e4d601aaee40f8087f63fc4a2a6c9814dda2c8fa6aab1b1829653bdfa", + "sha256:d580059503f2f4549ad6e4c106d7437356dbd430e2c7df99ee1efe03d75f691e" + ], + "markers": "python_version >= '3.6'", + "version": "==1.9.2" + }, + "pluggy": { + "hashes": [ + "sha256:4224373bacce55f955a878bf9cfa763c1e360858e330072059e10bad68531159", + "sha256:74134bbf457f031a36d68416e1509f34bd5ccc019f0bcc952c7b909d06b37bd3" ], - "version": "==1.7.0" + "markers": "python_version >= '3.6'", + "version": "==1.0.0" }, "pycparser": { "hashes": [ - "sha256:2d475327684562c3a96cc71adf7dc8c4f0565175cf86b6d7a404ff4c771f15f0", - "sha256:7582ad22678f0fcd81102833f60ef8d0e57288b6b5fb00323d101be910e35705" + "sha256:8ee45429555515e1f6b185e78100aea234072576aa43ab53aefcae078162fca9", + "sha256:e644fdec12f7872f86c58ff790da456218b10f863970249516d60a5eaca77206" ], - "version": "==2.20" + "version": "==2.21" }, "pygments": { "hashes": [ - "sha256:a18f47b506a429f6f4b9df81bb02beab9ca21d0a5fee38ed15aef65f0545519f", - "sha256:d66e804411278594d764fc69ec36ec13d9ae9147193a1740cd34d272ca383b8e" + "sha256:56a8508ae95f98e2b9bdf93a6be5ae3f7d8af858b43e02c5a2ff083726be40c1", + "sha256:f643f331ab57ba3c9d89212ee4a2dabc6e94f117cf4eefde99a0574720d14c42" ], - "version": "==2.9.0" + "markers": "python_version >= '3.6'", + "version": "==2.13.0" }, "pylint": { "hashes": [ @@ -256,55 +345,77 @@ "index": "pypi", "version": "==2.4.4" }, - "pyparsing": { + "pytest": { "hashes": [ - "sha256:c203ec8783bf771a155b207279b9bccb8dea02d8f0c9e5f8ead507bc3246ecc1", - "sha256:ef9d7589ef3c200abe66653d3f1ab1033c3c419ae9b9bdb1240a85b024efc88b" + "sha256:892f933d339f068883b6fd5a459f03d85bfcb355e4981e146d2c7616c21fef71", + "sha256:c4014eb40e10f11f355ad4e3c2fb2c6c6d1919c73f3b5a433de4708202cade59" ], - "version": "==2.4.7" + "index": "pypi", + "version": "==7.2.0" }, "readme-renderer": { "hashes": [ - "sha256:63b4075c6698fcfa78e584930f07f39e05d46f3ec97f65006e430b595ca6348c", - "sha256:92fd5ac2bf8677f310f3303aa4bce5b9d5f9f2094ab98c29f13791d7b805a3db" + "sha256:cd653186dfc73055656f090f227f5cb22a046d7f71a841dfa305f55c9a513273", + "sha256:f67a16caedfa71eef48a31b39708637a6f4664c4394801a7b0d6432d13907343" ], - "version": "==29.0" + "markers": "python_version >= '3.7'", + "version": "==37.3" }, "requests": { "hashes": [ - "sha256:27973dd4a904a4f13b263a19c866c13b92a39ed1c964655f025f3f8d3d75b804", - "sha256:c210084e36a42ae6b9219e00e48287def368a26d03a048ddad7bfee44f75871e" + "sha256:7c5599b102feddaa661c826c56ab4fee28bfd17f5abca1ebbe3e7f19d7c97983", + "sha256:8fefa2a1a1365bf5520aac41836fbee479da67864514bdb821f31ce07ce65349" ], - "version": "==2.25.1" + "markers": "python_version >= '3.7' and python_version < '4'", + "version": "==2.28.1" }, "requests-toolbelt": { "hashes": [ - "sha256:380606e1d10dc85c3bd47bf5a6095f815ec007be7a8b69c878507068df059e6f", - "sha256:968089d4584ad4ad7c171454f0a5c6dac23971e9472521ea3b6d49d610aa6fc0" + "sha256:18565aa58116d9951ac39baa288d3adb5b3ff975c4f25eee78555d89e8f247f7", + "sha256:62e09f7ff5ccbda92772a29f394a49c3ad6cb181d568b1337626b2abb628a63d" ], - "version": "==0.9.1" + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", + "version": "==0.10.1" }, "secretstorage": { "hashes": [ - "sha256:422d82c36172d88d6a0ed5afdec956514b189ddbfb72fefab0c8a1cee4eaf71f", - "sha256:fd666c51a6bf200643495a04abb261f83229dcb6fd8472ec393df7ffc8b6f195" + "sha256:2403533ef369eca6d2ba81718576c5e0f564d5cca1b58f73a8b23e7d4eeebd77", + "sha256:f356e6628222568e3af06f2eba8df495efa13b3b63081dafd4f7d9a7b7bc9f99" ], "markers": "sys_platform == 'linux'", - "version": "==3.3.1" + "version": "==3.3.3" + }, + "setuptools": { + "hashes": [ + "sha256:57f6f22bde4e042978bcd50176fdb381d7c21a9efa4041202288d3737a0c6a54", + "sha256:a7620757bf984b58deaf32fc8a4577a9bbc0850cf92c20e1ce41c38c19e5fb75" + ], + "markers": "python_version >= '3.7'", + "version": "==65.6.3" }, "six": { "hashes": [ "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926", "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254" ], + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", "version": "==1.16.0" }, + "tomli": { + "hashes": [ + "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc", + "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f" + ], + "markers": "python_version < '3.11'", + "version": "==2.0.1" + }, "tqdm": { "hashes": [ - "sha256:736524215c690621b06fc89d0310a49822d75e599fcd0feb7cc742b98d692493", - "sha256:cd5791b5d7c3f2f1819efc81d36eb719a38e0906a7380365c556779f585ea042" + "sha256:5f4f682a004951c1b450bc753c710e9280c5746ce6ffedee253ddbcbf54cf1e4", + "sha256:6fee160d6ffcd1b1c68c65f14c829c22832bc401726335ce92c52d395944a6a1" ], - "version": "==4.61.0" + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", + "version": "==4.64.1" }, "twine": { "hashes": [ @@ -347,25 +458,24 @@ "sha256:f8afcf15cc511ada719a88e013cec87c11aff7b91f019295eb4530f96fe5ef2f", "sha256:fb1bbeac803adea29cedd70781399c99138358c26d05fcbd23c13016b7f5ec65" ], - "markers": "implementation_name == 'cpython' and python_version < '3.8'", + "markers": "python_version < '3.8' and implementation_name == 'cpython'", "version": "==1.4.3" }, "typing-extensions": { "hashes": [ - "sha256:0ac0f89795dd19de6b97debb0c6af1c70987fd80a2d62d1958f7e56fcc31b497", - "sha256:50b6f157849174217d0656f99dc82fe932884fb250826c18350e159ec6cdf342", - "sha256:779383f6086d90c99ae41cf0ff39aac8a7937a9283ce0a414e5dd782f4c94a84" + "sha256:1511434bb92bf8dd198c12b1cc812e800d4181cfcb867674e0f8279cc93087aa", + "sha256:16fa4864408f655d35ec496218b85f79b3437c829e93320c7c9215ccfd92489e" ], - "markers": "python_version < '3.8'", - "version": "==3.10.0.0" + "markers": "python_version >= '3.7'", + "version": "==4.4.0" }, "urllib3": { "hashes": [ - "sha256:753a0374df26658f99d826cfe40394a686d05985786d946fbe4165b5148f5a7c", - "sha256:a7acd0977125325f516bda9735fa7142b909a8d01e8b2e4c8108d0984e6e0098" + "sha256:47cc05d99aaa09c9e72ed5809b60e7ba354e64b59c9c173ac3018642d8bb41fc", + "sha256:c083dd0dce68dbfbe1129d5271cb90f9447dea7d52097c6e0126120c521ddea8" ], - "index": "pypi", - "version": "==1.26.5" + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4, 3.5'", + "version": "==1.26.13" }, "webencodings": { "hashes": [ @@ -382,10 +492,11 @@ }, "zipp": { "hashes": [ - "sha256:3607921face881ba3e026887d8150cca609d517579abe052ac81fc5aeffdbd76", - "sha256:51cb66cc54621609dd593d1787f286ee42a5c0adbb4b29abea5a63edc3e03098" + "sha256:83a28fcb75844b5c0cdaf5aa4003c2d728c77e05f5aeabe8e95e56727005fbaa", + "sha256:a7a22e05929290a67401440b39690ae6563279bced5f314609d9d03798f56766" ], - "version": "==3.4.1" + "markers": "python_version >= '3.7'", + "version": "==3.11.0" } } } From 246bfc781208dd1fd065b95c1cee81f1aa6d2b04 Mon Sep 17 00:00:00 2001 From: Christina D'Astolfo Date: Thu, 5 Jan 2023 16:38:02 -0500 Subject: [PATCH 43/46] Convert README.md to .rst for readthedocs --- README.rst | 364 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 364 insertions(+) create mode 100644 README.rst diff --git a/README.rst b/README.rst new file mode 100644 index 0000000..f043ff9 --- /dev/null +++ b/README.rst @@ -0,0 +1,364 @@ +monday +====== + +.. raw:: html + + + +|All Contributors| A monday.com Python Client Library + +For an overview of the Monday API, `click +here `__. + +Requirements +^^^^^^^^^^^^ + +- Python >= 3.6 + +Getting started +^^^^^^^^^^^^^^^ + +``pip install monday`` + +``monday`` is very simple to use – take a look at the below example: + +.. code:: python + + from monday import MondayClient + + + monday = MondayClient('your token') + + monday.items.create_item(board_id='12345678', group_id='today', item_name='Do a thing') + +**Available methods:** #### Items Resource (monday.items) - +``create_item(board_id, group_id, item_name, column_values=None, create_labels_if_missing=False)`` +- Create an item on a board in the given group with name item_name. + +- ``create_subitem(parent_item_id, subitem_name, column_values=None, create_labels_if_missing=False)`` + - Create a subitem underneath a given parent item. Monday API will + return an error if the board you’re trying to add to does not have a + subitems column/at least one subitem created. + +- ``fetch_items_by_column_value(board_id, column_id, value)`` - Fetch + items on a board by column value. + +- ``fetch_items_by_id(board_id, [ids])`` - Fetch items from any board + by ids, passed in as an array of integers. + +- ``change_item_value(board_id, item_id, column_id, value)`` - Change + column values for item on a board. Check Monday’s API for which + columns are supported. + +- ``change_multiple_column_values(board_id, item_id, column_values, create_labels_if_missing=False)`` + - Change multiple column values for item on a board. Column values + should be passed in as JSON. Check Monday’s API for which columns are + supported. + +- ``add_file_to_column(item_id, column_id, file)`` - Upload a file to a + file type column specified by column_id. Monday limits uploads to + 500MB in size. + +- ``move_item_to_group(item_id, group_id)`` - Move the item to a group + within the same board. + +- ``archive_item_by_id(item_id)`` - Archive the item by item_id. + +- ``delete_item_by_id(item_id)`` - Delete the item by item_id. + +Updates Resource (monday.updates) +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +- ``create_update(item_id, update_body)`` - Create an update attached + to a given item. + +- ``fetch_updates(limit, page=None)`` - Fetch a certain number of + updates, starting from the given page. Default is 1 + +- ``fetch_updates_for_item(board_id, item_id, limit)`` - Fetch all + updates for a certain item on a certain board up to a certain limit, + set by you. Default is 100 updates + +Tags Resource (monday.tags) +^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +- ``fetch_tags(tag_ids=None)`` - Fetch all tags associated with an + account. Optionally takes a list containing tag ids (if you know + them). Returns IDs, names, and colors. + +Boards Resource (monday.boards) +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +- ``fetch_boards(**kwargs)`` - Fetch boards associated with an account. + Returns boards and their groups, tags, and columns. Accepts keyword + arguments: + + - ``limit`` - The number of boards returned (*int*. Default is 25). + - ``page`` - The page number returned, should you implement + pagination(*int*. Starts at 1). + - ``ids`` - A list of the unique board identifier(s) (*List[int]*). + - ``board_kind`` - The board’s kind (*BoardKind*. public / private / + share). + - ``state`` - The state of the board (*BoardState*. all / active / + archived / deleted. Default is active). + - ``order_by`` - The order in which to retrieve your boards + (*BoardsOrderBy*. created_at / used_at). + +- ``fetch_boards_by_id([board_ids])`` - Since Monday does not allow + querying boards by name, you can use ``fetch_boards`` to get a list + of boards, and then ``fetch_boards_by_id`` to get more detailed info + about the groups and columns on that board. Accepts a comma separated + list of board ids. + +- ``fetch_columns_by_board_id([board_ids])`` - Get all columns, as well + as their ids, types, and settings. Accepts a comma separated list of + board ids. + +- ``fetch_items_by_board_id([board_ids], **kwargs)`` - Get all items on + a board(s). Accepts a comma separated list of board ids. + + - ``limit`` - The number of rows returned (*int*. no default). + - ``page`` - The page number returned, should you implement + pagination(*int*. no default). + +- ``create_board(board_name, board_kind, workspace_id)`` - Create board + with the given name and kind by (and optional) workspace id. + +Users Resource (monday.users) +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +- ``fetch_users(**kwargs)`` - Fetch user information associated with an + account. See Monday API docs for a list of accepted keyword + arguments. + +Workspaces Resource (monday.workspaces) +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +- ``get_workspaces()`` - Get all workspaces. + +- ``create_workspace(name, kind, description)`` - Create workspace with + the given name, kind and description. + +- ``add_users_to_workspace(workspace_id, [user_ids], kind)`` - Add + given users of the given kind to the given workspace. + +- ``delete_users_from_workspace(workspace_id, [user_ids])`` - Delete + given users from the given workspace. + +- ``add_teams_to_workspace(workspace_id, [team_ids])`` - Add given + teams to the given workspace. + +- ``delete_teams_from_workspace(workspace_id, [team_ids])`` - Delete + given teams from the given workspace. + +Groups Resource (monday.groups) +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +- ``get_groups_by_board([board_ids])`` - Get all groups associated with + a certain board or boards. Accepts a single id or a comma separated + list of ids. + +- ``get_items_by_group(board_id, group_id)`` - Get all items that are + members of a given group. + +- ``create_group(board_id, group_name)`` - Create a group on a given + board. + +- ``duplicate_group(board_id, group_id)`` - Duplicate a group and all + its items on a given board. + +- ``archive_group(board_id, group_id)`` - Archive a group on a given + board. + +- ``delete_group(board_id, group_id)`` - Delete a group on a given + board. + +Notifications Resource (monday.notifications) +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +- ``create_notification(user_id, target_id, text, target_type)`` - The + create_notification mutation allows to trigger a notification within + the platform (will also send out an email if the recipient’s email + preferences are set up accordingly). ### Additional Resources and + Code Samples + +- `Read and format all of the items on a + board `__ + +Contributors +------------ + +.. raw:: html + + + +.. raw:: html + + + +.. raw:: html + + + +.. raw:: html + + + +.. raw:: html + + + +.. raw:: html + + + +.. raw:: html + + + +.. raw:: html + + + +.. raw:: html + + + +.. raw:: html + + + +.. raw:: html + + + +.. raw:: html + + + +.. raw:: html + + + +.. raw:: html + + + +.. raw:: html + + + +.. raw:: html + + + +.. raw:: html + + + +.. raw:: html + + + +.. raw:: html + + + +.. raw:: html + +
+ +Lemi BoyceπŸ’» πŸ› 🚧 + +.. raw:: html + + + +Tony MorelloπŸ’» + +.. raw:: html + + + +chdastolfoπŸ’» πŸ› πŸ“– 🚧 + +.. raw:: html + + + +Lucio Mitsuru SekiπŸ’» + +.. raw:: html + + + +YOGESH NILEπŸ’» + +.. raw:: html + + + +spencersamuel7πŸ’» + +.. raw:: html + + + +Alb. CπŸ’» + +.. raw:: html + +
+ +pevner-p2πŸ’» + +.. raw:: html + + + +Taylor CochranπŸ’» + +.. raw:: html + +
+ +.. raw:: html + + + +.. raw:: html + + + +.. raw:: html + + + +.. raw:: html + + + +.. raw:: html + + + +.. raw:: html + + + +.. raw:: html + + + +.. raw:: html + + + +Bug Reports +~~~~~~~~~~~ + +TBD + +.. |All Contributors| image:: https://img.shields.io/badge/all_contributors-9-orange.svg?style=flat-square + :target: #contributors- + From 5226ae0fc871a3198ec42e80f301be93b2d37851 Mon Sep 17 00:00:00 2001 From: Christina D'Astolfo Date: Fri, 6 Jan 2023 12:05:47 -0500 Subject: [PATCH 44/46] docs directory and sphinx setup --- docs/Makefile | 216 +++++ README.rst => docs/README.rst | 2 +- docs/_build/doctrees/README.doctree | Bin 0 -> 45599 bytes docs/_build/doctrees/environment.pickle | Bin 0 -> 80649 bytes docs/_build/doctrees/index.doctree | Bin 0 -> 4943 bytes docs/_build/html/.buildinfo | 4 + docs/_build/html/README.html | 301 ++++++ docs/_build/html/_sources/README.rst.txt | 364 +++++++ docs/_build/html/_sources/index.rst.txt | 21 + docs/_build/html/_static/alabaster.css | 701 ++++++++++++++ docs/_build/html/_static/basic.css | 903 ++++++++++++++++++ docs/_build/html/_static/custom.css | 1 + docs/_build/html/_static/doctools.js | 156 +++ .../html/_static/documentation_options.js | 14 + docs/_build/html/_static/file.png | Bin 0 -> 286 bytes docs/_build/html/_static/language_data.js | 199 ++++ docs/_build/html/_static/minus.png | Bin 0 -> 90 bytes docs/_build/html/_static/plus.png | Bin 0 -> 90 bytes docs/_build/html/_static/pygments.css | 83 ++ docs/_build/html/_static/searchtools.js | 566 +++++++++++ docs/_build/html/_static/sphinx_highlight.js | 144 +++ docs/_build/html/genindex.html | 103 ++ docs/_build/html/index.html | 137 +++ docs/_build/html/objects.inv | Bin 0 -> 271 bytes docs/_build/html/search.html | 122 +++ docs/_build/html/searchindex.js | 1 + docs/conf.py | 27 + docs/index.rst | 21 + docs/make.bat | 35 + 29 files changed, 4120 insertions(+), 1 deletion(-) create mode 100644 docs/Makefile rename README.rst => docs/README.rst (99%) create mode 100644 docs/_build/doctrees/README.doctree create mode 100644 docs/_build/doctrees/environment.pickle create mode 100644 docs/_build/doctrees/index.doctree create mode 100644 docs/_build/html/.buildinfo create mode 100644 docs/_build/html/README.html create mode 100644 docs/_build/html/_sources/README.rst.txt create mode 100644 docs/_build/html/_sources/index.rst.txt create mode 100644 docs/_build/html/_static/alabaster.css create mode 100644 docs/_build/html/_static/basic.css create mode 100644 docs/_build/html/_static/custom.css create mode 100644 docs/_build/html/_static/doctools.js create mode 100644 docs/_build/html/_static/documentation_options.js create mode 100644 docs/_build/html/_static/file.png create mode 100644 docs/_build/html/_static/language_data.js create mode 100644 docs/_build/html/_static/minus.png create mode 100644 docs/_build/html/_static/plus.png create mode 100644 docs/_build/html/_static/pygments.css create mode 100644 docs/_build/html/_static/searchtools.js create mode 100644 docs/_build/html/_static/sphinx_highlight.js create mode 100644 docs/_build/html/genindex.html create mode 100644 docs/_build/html/index.html create mode 100644 docs/_build/html/objects.inv create mode 100644 docs/_build/html/search.html create mode 100644 docs/_build/html/searchindex.js create mode 100644 docs/conf.py create mode 100644 docs/index.rst create mode 100644 docs/make.bat diff --git a/docs/Makefile b/docs/Makefile new file mode 100644 index 0000000..430f5d6 --- /dev/null +++ b/docs/Makefile @@ -0,0 +1,216 @@ +# Makefile for Sphinx documentation +# + +# You can set these variables from the command line. +SPHINXOPTS = +SPHINXBUILD = sphinx-build +PAPER = +BUILDDIR = _build + +# User-friendly check for sphinx-build +ifeq ($(shell which $(SPHINXBUILD) >/dev/null 2>&1; echo $$?), 1) +$(error The '$(SPHINXBUILD)' command was not found. Make sure you have Sphinx installed, then set the SPHINXBUILD environment variable to point to the full path of the '$(SPHINXBUILD)' executable. Alternatively you can add the directory with the executable to your PATH. If you don't have Sphinx installed, grab it from http://sphinx-doc.org/) +endif + +# Internal variables. +PAPEROPT_a4 = -D latex_paper_size=a4 +PAPEROPT_letter = -D latex_paper_size=letter +ALLSPHINXOPTS = -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) . +# the i18n builder cannot share the environment and doctrees with the others +I18NSPHINXOPTS = $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) . + +.PHONY: help +help: + @echo "Please use \`make ' where is one of" + @echo " html to make standalone HTML files" + @echo " dirhtml to make HTML files named index.html in directories" + @echo " singlehtml to make a single large HTML file" + @echo " pickle to make pickle files" + @echo " json to make JSON files" + @echo " htmlhelp to make HTML files and a HTML help project" + @echo " qthelp to make HTML files and a qthelp project" + @echo " applehelp to make an Apple Help Book" + @echo " devhelp to make HTML files and a Devhelp project" + @echo " epub to make an epub" + @echo " latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter" + @echo " latexpdf to make LaTeX files and run them through pdflatex" + @echo " latexpdfja to make LaTeX files and run them through platex/dvipdfmx" + @echo " text to make text files" + @echo " man to make manual pages" + @echo " texinfo to make Texinfo files" + @echo " info to make Texinfo files and run them through makeinfo" + @echo " gettext to make PO message catalogs" + @echo " changes to make an overview of all changed/added/deprecated items" + @echo " xml to make Docutils-native XML files" + @echo " pseudoxml to make pseudoxml-XML files for display purposes" + @echo " linkcheck to check all external links for integrity" + @echo " doctest to run all doctests embedded in the documentation (if enabled)" + @echo " coverage to run coverage check of the documentation (if enabled)" + +.PHONY: clean +clean: + rm -rf $(BUILDDIR)/* + +.PHONY: html +html: + $(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html + @echo + @echo "Build finished. The HTML pages are in $(BUILDDIR)/html." + +.PHONY: dirhtml +dirhtml: + $(SPHINXBUILD) -b dirhtml $(ALLSPHINXOPTS) $(BUILDDIR)/dirhtml + @echo + @echo "Build finished. The HTML pages are in $(BUILDDIR)/dirhtml." + +.PHONY: singlehtml +singlehtml: + $(SPHINXBUILD) -b singlehtml $(ALLSPHINXOPTS) $(BUILDDIR)/singlehtml + @echo + @echo "Build finished. The HTML page is in $(BUILDDIR)/singlehtml." + +.PHONY: pickle +pickle: + $(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) $(BUILDDIR)/pickle + @echo + @echo "Build finished; now you can process the pickle files." + +.PHONY: json +json: + $(SPHINXBUILD) -b json $(ALLSPHINXOPTS) $(BUILDDIR)/json + @echo + @echo "Build finished; now you can process the JSON files." + +.PHONY: htmlhelp +htmlhelp: + $(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) $(BUILDDIR)/htmlhelp + @echo + @echo "Build finished; now you can run HTML Help Workshop with the" \ + ".hhp project file in $(BUILDDIR)/htmlhelp." + +.PHONY: qthelp +qthelp: + $(SPHINXBUILD) -b qthelp $(ALLSPHINXOPTS) $(BUILDDIR)/qthelp + @echo + @echo "Build finished; now you can run "qcollectiongenerator" with the" \ + ".qhcp project file in $(BUILDDIR)/qthelp, like this:" + @echo "# qcollectiongenerator $(BUILDDIR)/qthelp/DynamicREST.qhcp" + @echo "To view the help file:" + @echo "# assistant -collectionFile $(BUILDDIR)/qthelp/DynamicREST.qhc" + +.PHONY: applehelp +applehelp: + $(SPHINXBUILD) -b applehelp $(ALLSPHINXOPTS) $(BUILDDIR)/applehelp + @echo + @echo "Build finished. The help book is in $(BUILDDIR)/applehelp." + @echo "N.B. You won't be able to view it unless you put it in" \ + "~/Library/Documentation/Help or install it in your application" \ + "bundle." + +.PHONY: devhelp +devhelp: + $(SPHINXBUILD) -b devhelp $(ALLSPHINXOPTS) $(BUILDDIR)/devhelp + @echo + @echo "Build finished." + @echo "To view the help file:" + @echo "# mkdir -p $$HOME/.local/share/devhelp/DynamicREST" + @echo "# ln -s $(BUILDDIR)/devhelp $$HOME/.local/share/devhelp/DynamicREST" + @echo "# devhelp" + +.PHONY: epub +epub: + $(SPHINXBUILD) -b epub $(ALLSPHINXOPTS) $(BUILDDIR)/epub + @echo + @echo "Build finished. The epub file is in $(BUILDDIR)/epub." + +.PHONY: latex +latex: + $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex + @echo + @echo "Build finished; the LaTeX files are in $(BUILDDIR)/latex." + @echo "Run \`make' in that directory to run these through (pdf)latex" \ + "(use \`make latexpdf' here to do that automatically)." + +.PHONY: latexpdf +latexpdf: + $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex + @echo "Running LaTeX files through pdflatex..." + $(MAKE) -C $(BUILDDIR)/latex all-pdf + @echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex." + +.PHONY: latexpdfja +latexpdfja: + $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex + @echo "Running LaTeX files through platex and dvipdfmx..." + $(MAKE) -C $(BUILDDIR)/latex all-pdf-ja + @echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex." + +.PHONY: text +text: + $(SPHINXBUILD) -b text $(ALLSPHINXOPTS) $(BUILDDIR)/text + @echo + @echo "Build finished. The text files are in $(BUILDDIR)/text." + +.PHONY: man +man: + $(SPHINXBUILD) -b man $(ALLSPHINXOPTS) $(BUILDDIR)/man + @echo + @echo "Build finished. The manual pages are in $(BUILDDIR)/man." + +.PHONY: texinfo +texinfo: + $(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo + @echo + @echo "Build finished. The Texinfo files are in $(BUILDDIR)/texinfo." + @echo "Run \`make' in that directory to run these through makeinfo" \ + "(use \`make info' here to do that automatically)." + +.PHONY: info +info: + $(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo + @echo "Running Texinfo files through makeinfo..." + make -C $(BUILDDIR)/texinfo info + @echo "makeinfo finished; the Info files are in $(BUILDDIR)/texinfo." + +.PHONY: gettext +gettext: + $(SPHINXBUILD) -b gettext $(I18NSPHINXOPTS) $(BUILDDIR)/locale + @echo + @echo "Build finished. The message catalogs are in $(BUILDDIR)/locale." + +.PHONY: changes +changes: + $(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) $(BUILDDIR)/changes + @echo + @echo "The overview file is in $(BUILDDIR)/changes." + +.PHONY: linkcheck +linkcheck: + $(SPHINXBUILD) -b linkcheck $(ALLSPHINXOPTS) $(BUILDDIR)/linkcheck + @echo + @echo "Link check complete; look for any errors in the above output " \ + "or in $(BUILDDIR)/linkcheck/output.txt." + +.PHONY: doctest +doctest: + $(SPHINXBUILD) -b doctest $(ALLSPHINXOPTS) $(BUILDDIR)/doctest + @echo "Testing of doctests in the sources finished, look at the " \ + "results in $(BUILDDIR)/doctest/output.txt." + +.PHONY: coverage +coverage: + $(SPHINXBUILD) -b coverage $(ALLSPHINXOPTS) $(BUILDDIR)/coverage + @echo "Testing of coverage in the sources finished, look at the " \ + "results in $(BUILDDIR)/coverage/python.txt." + +.PHONY: xml +xml: + $(SPHINXBUILD) -b xml $(ALLSPHINXOPTS) $(BUILDDIR)/xml + @echo + @echo "Build finished. The XML files are in $(BUILDDIR)/xml." + +.PHONY: pseudoxml +pseudoxml: + $(SPHINXBUILD) -b pseudoxml $(ALLSPHINXOPTS) $(BUILDDIR)/pseudoxml + @echo + @echo "Build finished. The pseudo-XML files are in $(BUILDDIR)/pseudoxml." diff --git a/README.rst b/docs/README.rst similarity index 99% rename from README.rst rename to docs/README.rst index f043ff9..2390b4d 100644 --- a/README.rst +++ b/docs/README.rst @@ -8,7 +8,7 @@ monday |All Contributors| A monday.com Python Client Library For an overview of the Monday API, `click -here `__. +here `__. Requirements ^^^^^^^^^^^^ diff --git a/docs/_build/doctrees/README.doctree b/docs/_build/doctrees/README.doctree new file mode 100644 index 0000000000000000000000000000000000000000..e071c458199f4d802850908fcd9398248cb7a4af GIT binary patch literal 45599 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 literal 0 HcmV?d00001 diff --git a/docs/_build/html/.buildinfo b/docs/_build/html/.buildinfo new file mode 100644 index 0000000..276d8b4 --- /dev/null +++ b/docs/_build/html/.buildinfo @@ -0,0 +1,4 @@ +# Sphinx build info version 1 +# This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done. +config: f6404a2535785f823afdb42475a23472 +tags: 645f666f9bcd5a90fca523b33c5a78b7 diff --git a/docs/_build/html/README.html b/docs/_build/html/README.html new file mode 100644 index 0000000..d02f471 --- /dev/null +++ b/docs/_build/html/README.html @@ -0,0 +1,301 @@ + + + + + + + + + monday — monday documentation + + + + + + + + + + + + + + + + + +
+
+
+ + +
+ +
+

mondayΒΆ

+

All Contributors A monday.com Python Client Library

+

For an overview of the Monday API, click +here.

+
+

RequirementsΒΆ

+
    +
  • Python >= 3.6

  • +
+
+
+

Getting startedΒΆ

+

pip install monday

+

monday is very simple to use – take a look at the below example:

+
from monday import MondayClient
+
+
+monday = MondayClient('your token')
+
+monday.items.create_item(board_id='12345678', group_id='today',  item_name='Do a thing')
+
+
+

Available methods: #### Items Resource (monday.items) - +create_item(board_id, group_id, item_name, column_values=None, create_labels_if_missing=False) +- Create an item on a board in the given group with name item_name.

+
    +
  • create_subitem(parent_item_id, subitem_name, column_values=None, create_labels_if_missing=False) +- Create a subitem underneath a given parent item. Monday API will +return an error if the board you’re trying to add to does not have a +subitems column/at least one subitem created.

  • +
  • fetch_items_by_column_value(board_id, column_id, value) - Fetch +items on a board by column value.

  • +
  • fetch_items_by_id(board_id, [ids]) - Fetch items from any board +by ids, passed in as an array of integers.

  • +
  • change_item_value(board_id, item_id, column_id, value) - Change +column values for item on a board. Check Monday’s API for which +columns are supported.

  • +
  • change_multiple_column_values(board_id, item_id, column_values, create_labels_if_missing=False) +- Change multiple column values for item on a board. Column values +should be passed in as JSON. Check Monday’s API for which columns are +supported.

  • +
  • add_file_to_column(item_id, column_id, file) - Upload a file to a +file type column specified by column_id. Monday limits uploads to +500MB in size.

  • +
  • move_item_to_group(item_id, group_id) - Move the item to a group +within the same board.

  • +
  • archive_item_by_id(item_id) - Archive the item by item_id.

  • +
  • delete_item_by_id(item_id) - Delete the item by item_id.

  • +
+
+
+

Updates Resource (monday.updates)ΒΆ

+
    +
  • create_update(item_id, update_body) - Create an update attached +to a given item.

  • +
  • fetch_updates(limit, page=None) - Fetch a certain number of +updates, starting from the given page. Default is 1

  • +
  • fetch_updates_for_item(board_id, item_id, limit) - Fetch all +updates for a certain item on a certain board up to a certain limit, +set by you. Default is 100 updates

  • +
+
+
+

Tags Resource (monday.tags)ΒΆ

+
    +
  • fetch_tags(tag_ids=None) - Fetch all tags associated with an +account. Optionally takes a list containing tag ids (if you know +them). Returns IDs, names, and colors.

  • +
+
+
+

Boards Resource (monday.boards)ΒΆ

+
    +
  • fetch_boards(**kwargs) - Fetch boards associated with an account. +Returns boards and their groups, tags, and columns. Accepts keyword +arguments:

    +
      +
    • limit - The number of boards returned (int. Default is 25).

    • +
    • page - The page number returned, should you implement +pagination(int. Starts at 1).

    • +
    • ids - A list of the unique board identifier(s) (List[int]).

    • +
    • board_kind - The board’s kind (BoardKind. public / private / +share).

    • +
    • state - The state of the board (BoardState. all / active / +archived / deleted. Default is active).

    • +
    • order_by - The order in which to retrieve your boards +(BoardsOrderBy. created_at / used_at).

    • +
    +
  • +
  • fetch_boards_by_id([board_ids]) - Since Monday does not allow +querying boards by name, you can use fetch_boards to get a list +of boards, and then fetch_boards_by_id to get more detailed info +about the groups and columns on that board. Accepts a comma separated +list of board ids.

  • +
  • fetch_columns_by_board_id([board_ids]) - Get all columns, as well +as their ids, types, and settings. Accepts a comma separated list of +board ids.

  • +
  • fetch_items_by_board_id([board_ids], **kwargs) - Get all items on +a board(s). Accepts a comma separated list of board ids.

    +
      +
    • limit - The number of rows returned (int. no default).

    • +
    • page - The page number returned, should you implement +pagination(int. no default).

    • +
    +
  • +
  • create_board(board_name, board_kind, workspace_id) - Create board +with the given name and kind by (and optional) workspace id.

  • +
+
+
+

Users Resource (monday.users)ΒΆ

+
    +
  • fetch_users(**kwargs) - Fetch user information associated with an +account. See Monday API docs for a list of accepted keyword +arguments.

  • +
+
+
+

Workspaces Resource (monday.workspaces)ΒΆ

+
    +
  • get_workspaces() - Get all workspaces.

  • +
  • create_workspace(name, kind, description) - Create workspace with +the given name, kind and description.

  • +
  • add_users_to_workspace(workspace_id, [user_ids], kind) - Add +given users of the given kind to the given workspace.

  • +
  • delete_users_from_workspace(workspace_id, [user_ids]) - Delete +given users from the given workspace.

  • +
  • add_teams_to_workspace(workspace_id, [team_ids]) - Add given +teams to the given workspace.

  • +
  • delete_teams_from_workspace(workspace_id, [team_ids]) - Delete +given teams from the given workspace.

  • +
+
+
+

Groups Resource (monday.groups)ΒΆ

+
    +
  • get_groups_by_board([board_ids]) - Get all groups associated with +a certain board or boards. Accepts a single id or a comma separated +list of ids.

  • +
  • get_items_by_group(board_id, group_id) - Get all items that are +members of a given group.

  • +
  • create_group(board_id, group_name) - Create a group on a given +board.

  • +
  • duplicate_group(board_id, group_id) - Duplicate a group and all +its items on a given board.

  • +
  • archive_group(board_id, group_id) - Archive a group on a given +board.

  • +
  • delete_group(board_id, group_id) - Delete a group on a given +board.

  • +
+
+
+

Notifications Resource (monday.notifications)ΒΆ

+
    +
  • create_notification(user_id, target_id, text, target_type) - The +create_notification mutation allows to trigger a notification within +the platform (will also send out an email if the recipient’s email +preferences are set up accordingly). ### Additional Resources and +Code Samples

  • +
  • Read and format all of the items on a +board

  • +
+
+

ContributorsΒΆ

+

Lemi BoyceπŸ’» πŸ› 🚧

+

Tony MorelloπŸ’»

+

chdastolfoπŸ’» πŸ› πŸ“– 🚧

+

Lucio Mitsuru SekiπŸ’»

+

YOGESH NILEπŸ’»

+

spencersamuel7πŸ’»

+

Alb. CπŸ’»

+

pevner-p2πŸ’»

+

Taylor CochranπŸ’»

+
+

Bug ReportsΒΆ

+

TBD

+
+
+
+
+ + +
+ +
+
+ +
+
+ + + + + + + \ No newline at end of file diff --git a/docs/_build/html/_sources/README.rst.txt b/docs/_build/html/_sources/README.rst.txt new file mode 100644 index 0000000..2390b4d --- /dev/null +++ b/docs/_build/html/_sources/README.rst.txt @@ -0,0 +1,364 @@ +monday +====== + +.. raw:: html + + + +|All Contributors| A monday.com Python Client Library + +For an overview of the Monday API, `click +here `__. + +Requirements +^^^^^^^^^^^^ + +- Python >= 3.6 + +Getting started +^^^^^^^^^^^^^^^ + +``pip install monday`` + +``monday`` is very simple to use – take a look at the below example: + +.. code:: python + + from monday import MondayClient + + + monday = MondayClient('your token') + + monday.items.create_item(board_id='12345678', group_id='today', item_name='Do a thing') + +**Available methods:** #### Items Resource (monday.items) - +``create_item(board_id, group_id, item_name, column_values=None, create_labels_if_missing=False)`` +- Create an item on a board in the given group with name item_name. + +- ``create_subitem(parent_item_id, subitem_name, column_values=None, create_labels_if_missing=False)`` + - Create a subitem underneath a given parent item. Monday API will + return an error if the board you’re trying to add to does not have a + subitems column/at least one subitem created. + +- ``fetch_items_by_column_value(board_id, column_id, value)`` - Fetch + items on a board by column value. + +- ``fetch_items_by_id(board_id, [ids])`` - Fetch items from any board + by ids, passed in as an array of integers. + +- ``change_item_value(board_id, item_id, column_id, value)`` - Change + column values for item on a board. Check Monday’s API for which + columns are supported. + +- ``change_multiple_column_values(board_id, item_id, column_values, create_labels_if_missing=False)`` + - Change multiple column values for item on a board. Column values + should be passed in as JSON. Check Monday’s API for which columns are + supported. + +- ``add_file_to_column(item_id, column_id, file)`` - Upload a file to a + file type column specified by column_id. Monday limits uploads to + 500MB in size. + +- ``move_item_to_group(item_id, group_id)`` - Move the item to a group + within the same board. + +- ``archive_item_by_id(item_id)`` - Archive the item by item_id. + +- ``delete_item_by_id(item_id)`` - Delete the item by item_id. + +Updates Resource (monday.updates) +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +- ``create_update(item_id, update_body)`` - Create an update attached + to a given item. + +- ``fetch_updates(limit, page=None)`` - Fetch a certain number of + updates, starting from the given page. Default is 1 + +- ``fetch_updates_for_item(board_id, item_id, limit)`` - Fetch all + updates for a certain item on a certain board up to a certain limit, + set by you. Default is 100 updates + +Tags Resource (monday.tags) +^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +- ``fetch_tags(tag_ids=None)`` - Fetch all tags associated with an + account. Optionally takes a list containing tag ids (if you know + them). Returns IDs, names, and colors. + +Boards Resource (monday.boards) +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +- ``fetch_boards(**kwargs)`` - Fetch boards associated with an account. + Returns boards and their groups, tags, and columns. Accepts keyword + arguments: + + - ``limit`` - The number of boards returned (*int*. Default is 25). + - ``page`` - The page number returned, should you implement + pagination(*int*. Starts at 1). + - ``ids`` - A list of the unique board identifier(s) (*List[int]*). + - ``board_kind`` - The board’s kind (*BoardKind*. public / private / + share). + - ``state`` - The state of the board (*BoardState*. all / active / + archived / deleted. Default is active). + - ``order_by`` - The order in which to retrieve your boards + (*BoardsOrderBy*. created_at / used_at). + +- ``fetch_boards_by_id([board_ids])`` - Since Monday does not allow + querying boards by name, you can use ``fetch_boards`` to get a list + of boards, and then ``fetch_boards_by_id`` to get more detailed info + about the groups and columns on that board. Accepts a comma separated + list of board ids. + +- ``fetch_columns_by_board_id([board_ids])`` - Get all columns, as well + as their ids, types, and settings. Accepts a comma separated list of + board ids. + +- ``fetch_items_by_board_id([board_ids], **kwargs)`` - Get all items on + a board(s). Accepts a comma separated list of board ids. + + - ``limit`` - The number of rows returned (*int*. no default). + - ``page`` - The page number returned, should you implement + pagination(*int*. no default). + +- ``create_board(board_name, board_kind, workspace_id)`` - Create board + with the given name and kind by (and optional) workspace id. + +Users Resource (monday.users) +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +- ``fetch_users(**kwargs)`` - Fetch user information associated with an + account. See Monday API docs for a list of accepted keyword + arguments. + +Workspaces Resource (monday.workspaces) +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +- ``get_workspaces()`` - Get all workspaces. + +- ``create_workspace(name, kind, description)`` - Create workspace with + the given name, kind and description. + +- ``add_users_to_workspace(workspace_id, [user_ids], kind)`` - Add + given users of the given kind to the given workspace. + +- ``delete_users_from_workspace(workspace_id, [user_ids])`` - Delete + given users from the given workspace. + +- ``add_teams_to_workspace(workspace_id, [team_ids])`` - Add given + teams to the given workspace. + +- ``delete_teams_from_workspace(workspace_id, [team_ids])`` - Delete + given teams from the given workspace. + +Groups Resource (monday.groups) +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +- ``get_groups_by_board([board_ids])`` - Get all groups associated with + a certain board or boards. Accepts a single id or a comma separated + list of ids. + +- ``get_items_by_group(board_id, group_id)`` - Get all items that are + members of a given group. + +- ``create_group(board_id, group_name)`` - Create a group on a given + board. + +- ``duplicate_group(board_id, group_id)`` - Duplicate a group and all + its items on a given board. + +- ``archive_group(board_id, group_id)`` - Archive a group on a given + board. + +- ``delete_group(board_id, group_id)`` - Delete a group on a given + board. + +Notifications Resource (monday.notifications) +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +- ``create_notification(user_id, target_id, text, target_type)`` - The + create_notification mutation allows to trigger a notification within + the platform (will also send out an email if the recipient’s email + preferences are set up accordingly). ### Additional Resources and + Code Samples + +- `Read and format all of the items on a + board `__ + +Contributors +------------ + +.. raw:: html + + + +.. raw:: html + + + +.. raw:: html + + + +.. raw:: html + + + +.. raw:: html + + + +.. raw:: html + + + +.. raw:: html + + + +.. raw:: html + + + +.. raw:: html + + + +.. raw:: html + + + +.. raw:: html + + + +.. raw:: html + + + +.. raw:: html + + + +.. raw:: html + + + +.. raw:: html + + + +.. raw:: html + + + +.. raw:: html + + + +.. raw:: html + + + +.. raw:: html + + + +.. raw:: html + +
+ +Lemi BoyceπŸ’» πŸ› 🚧 + +.. raw:: html + + + +Tony MorelloπŸ’» + +.. raw:: html + + + +chdastolfoπŸ’» πŸ› πŸ“– 🚧 + +.. raw:: html + + + +Lucio Mitsuru SekiπŸ’» + +.. raw:: html + + + +YOGESH NILEπŸ’» + +.. raw:: html + + + +spencersamuel7πŸ’» + +.. raw:: html + + + +Alb. CπŸ’» + +.. raw:: html + +
+ +pevner-p2πŸ’» + +.. raw:: html + + + +Taylor CochranπŸ’» + +.. raw:: html + +
+ +.. raw:: html + + + +.. raw:: html + + + +.. raw:: html + + + +.. raw:: html + + + +.. raw:: html + + + +.. raw:: html + + + +.. raw:: html + + + +.. raw:: html + + + +Bug Reports +~~~~~~~~~~~ + +TBD + +.. |All Contributors| image:: https://img.shields.io/badge/all_contributors-9-orange.svg?style=flat-square + :target: #contributors- + diff --git a/docs/_build/html/_sources/index.rst.txt b/docs/_build/html/_sources/index.rst.txt new file mode 100644 index 0000000..baef355 --- /dev/null +++ b/docs/_build/html/_sources/index.rst.txt @@ -0,0 +1,21 @@ +.. monday documentation master file, created by + sphinx-quickstart on Fri Jan 6 11:43:09 2023. + You can adapt this file completely to your liking, but it should at least + contain the root `toctree` directive. + +Welcome to monday's documentation! +================================== + +.. toctree:: + :maxdepth: 4 + :caption: Contents: + + README + + +Indices and tables +================== + +* :ref:`genindex` +* :ref:`modindex` +* :ref:`search` \ No newline at end of file diff --git a/docs/_build/html/_static/alabaster.css b/docs/_build/html/_static/alabaster.css new file mode 100644 index 0000000..0eddaeb --- /dev/null +++ b/docs/_build/html/_static/alabaster.css @@ -0,0 +1,701 @@ +@import url("basic.css"); + +/* -- page layout ----------------------------------------------------------- */ + +body { + font-family: Georgia, serif; + font-size: 17px; + background-color: #fff; + color: #000; + margin: 0; + padding: 0; +} + + +div.document { + width: 940px; + margin: 30px auto 0 auto; +} + +div.documentwrapper { + float: left; + width: 100%; +} + +div.bodywrapper { + margin: 0 0 0 220px; +} + +div.sphinxsidebar { + width: 220px; + font-size: 14px; + line-height: 1.5; +} + +hr { + border: 1px solid #B1B4B6; +} + +div.body { + background-color: #fff; + color: #3E4349; + padding: 0 30px 0 30px; +} + +div.body > .section { + text-align: left; +} + +div.footer { + width: 940px; + margin: 20px auto 30px auto; + font-size: 14px; + color: #888; + text-align: right; +} + +div.footer a { + color: #888; +} + +p.caption { + font-family: inherit; + font-size: inherit; +} + + +div.relations { + display: none; +} + + +div.sphinxsidebar a { + color: #444; + text-decoration: none; + border-bottom: 1px dotted #999; +} + +div.sphinxsidebar a:hover { + border-bottom: 1px solid #999; +} + +div.sphinxsidebarwrapper { + padding: 18px 10px; +} + +div.sphinxsidebarwrapper p.logo { + padding: 0; + margin: -10px 0 0 0px; + text-align: center; +} + +div.sphinxsidebarwrapper h1.logo { + margin-top: -10px; + text-align: center; + margin-bottom: 5px; + text-align: left; +} + +div.sphinxsidebarwrapper h1.logo-name { + margin-top: 0px; +} + +div.sphinxsidebarwrapper p.blurb { + margin-top: 0; + font-style: normal; +} + +div.sphinxsidebar h3, +div.sphinxsidebar h4 { + font-family: Georgia, serif; + color: #444; + font-size: 24px; + font-weight: normal; + margin: 0 0 5px 0; + padding: 0; +} + +div.sphinxsidebar h4 { + font-size: 20px; +} + +div.sphinxsidebar h3 a { + color: #444; +} + +div.sphinxsidebar p.logo a, +div.sphinxsidebar h3 a, +div.sphinxsidebar p.logo a:hover, +div.sphinxsidebar h3 a:hover { + border: none; +} + +div.sphinxsidebar p { + color: #555; + margin: 10px 0; +} + +div.sphinxsidebar ul { + margin: 10px 0; + padding: 0; + color: #000; +} + +div.sphinxsidebar ul li.toctree-l1 > a { + font-size: 120%; +} + +div.sphinxsidebar ul li.toctree-l2 > a { + font-size: 110%; +} + +div.sphinxsidebar input { + border: 1px solid #CCC; + font-family: Georgia, serif; + font-size: 1em; +} + +div.sphinxsidebar hr { + border: none; + height: 1px; + color: #AAA; + background: #AAA; + + text-align: left; + margin-left: 0; + width: 50%; +} + +div.sphinxsidebar .badge { + border-bottom: none; +} + +div.sphinxsidebar .badge:hover { + border-bottom: none; +} + +/* To address an issue with donation coming after search */ +div.sphinxsidebar h3.donation { + margin-top: 10px; +} + +/* -- body styles ----------------------------------------------------------- */ + +a { + color: #004B6B; + text-decoration: underline; +} + +a:hover { + color: #6D4100; + text-decoration: underline; +} + +div.body h1, +div.body h2, +div.body h3, +div.body h4, +div.body h5, +div.body h6 { + font-family: Georgia, serif; + font-weight: normal; + margin: 30px 0px 10px 0px; + padding: 0; +} + +div.body h1 { margin-top: 0; padding-top: 0; font-size: 240%; } +div.body h2 { font-size: 180%; } +div.body h3 { font-size: 150%; } +div.body h4 { font-size: 130%; } +div.body h5 { font-size: 100%; } +div.body h6 { font-size: 100%; } + +a.headerlink { + color: #DDD; + padding: 0 4px; + text-decoration: none; +} + +a.headerlink:hover { + color: #444; + background: #EAEAEA; +} + +div.body p, div.body dd, div.body li { + line-height: 1.4em; +} + +div.admonition { + margin: 20px 0px; + padding: 10px 30px; + background-color: #EEE; + border: 1px solid #CCC; +} + +div.admonition tt.xref, div.admonition code.xref, div.admonition a tt { + background-color: #FBFBFB; + border-bottom: 1px solid #fafafa; +} + +div.admonition p.admonition-title { + font-family: Georgia, serif; + font-weight: normal; + font-size: 24px; + margin: 0 0 10px 0; + padding: 0; + line-height: 1; +} + +div.admonition p.last { + margin-bottom: 0; +} + +div.highlight { + background-color: #fff; +} + +dt:target, .highlight { + background: #FAF3E8; +} + +div.warning { + background-color: #FCC; + border: 1px solid #FAA; +} + +div.danger { + background-color: #FCC; + border: 1px solid #FAA; + -moz-box-shadow: 2px 2px 4px #D52C2C; + -webkit-box-shadow: 2px 2px 4px #D52C2C; + box-shadow: 2px 2px 4px #D52C2C; +} + +div.error { + background-color: #FCC; + border: 1px solid #FAA; + -moz-box-shadow: 2px 2px 4px #D52C2C; + -webkit-box-shadow: 2px 2px 4px #D52C2C; + box-shadow: 2px 2px 4px #D52C2C; +} + +div.caution { + background-color: #FCC; + border: 1px solid #FAA; +} + +div.attention { + background-color: #FCC; + border: 1px solid #FAA; +} + +div.important { + background-color: #EEE; + border: 1px solid #CCC; +} + +div.note { + background-color: #EEE; + border: 1px solid #CCC; +} + +div.tip { + background-color: #EEE; + border: 1px solid #CCC; +} + +div.hint { + background-color: #EEE; + border: 1px solid #CCC; +} + +div.seealso { + background-color: #EEE; + border: 1px solid #CCC; +} + +div.topic { + background-color: #EEE; +} + +p.admonition-title { + display: inline; +} + +p.admonition-title:after { + content: ":"; +} + +pre, tt, code { + font-family: 'Consolas', 'Menlo', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace; + font-size: 0.9em; +} + +.hll { + background-color: #FFC; + margin: 0 -12px; + padding: 0 12px; + display: block; +} + +img.screenshot { +} + +tt.descname, tt.descclassname, code.descname, code.descclassname { + font-size: 0.95em; +} + +tt.descname, code.descname { + padding-right: 0.08em; +} + +img.screenshot { + -moz-box-shadow: 2px 2px 4px #EEE; + -webkit-box-shadow: 2px 2px 4px #EEE; + box-shadow: 2px 2px 4px #EEE; +} + +table.docutils { + border: 1px solid #888; + -moz-box-shadow: 2px 2px 4px #EEE; + -webkit-box-shadow: 2px 2px 4px #EEE; + box-shadow: 2px 2px 4px #EEE; +} + +table.docutils td, table.docutils th { + border: 1px solid #888; + padding: 0.25em 0.7em; +} + +table.field-list, table.footnote { + border: none; + -moz-box-shadow: none; + -webkit-box-shadow: none; + box-shadow: none; +} + +table.footnote { + margin: 15px 0; + width: 100%; + border: 1px solid #EEE; + background: #FDFDFD; + font-size: 0.9em; +} + +table.footnote + table.footnote { + margin-top: -15px; + border-top: none; +} + +table.field-list th { + padding: 0 0.8em 0 0; +} + +table.field-list td { + padding: 0; +} + +table.field-list p { + margin-bottom: 0.8em; +} + +/* Cloned from + * https://github.com/sphinx-doc/sphinx/commit/ef60dbfce09286b20b7385333d63a60321784e68 + */ +.field-name { + -moz-hyphens: manual; + -ms-hyphens: manual; + -webkit-hyphens: manual; + hyphens: manual; +} + +table.footnote td.label { + width: .1px; + padding: 0.3em 0 0.3em 0.5em; +} + +table.footnote td { + padding: 0.3em 0.5em; +} + +dl { + margin: 0; + padding: 0; +} + +dl dd { + margin-left: 30px; +} + +blockquote { + margin: 0 0 0 30px; + padding: 0; +} + +ul, ol { + /* Matches the 30px from the narrow-screen "li > ul" selector below */ + margin: 10px 0 10px 30px; + padding: 0; +} + +pre { + background: #EEE; + padding: 7px 30px; + margin: 15px 0px; + line-height: 1.3em; +} + +div.viewcode-block:target { + background: #ffd; +} + +dl pre, blockquote pre, li pre { + margin-left: 0; + padding-left: 30px; +} + +tt, code { + background-color: #ecf0f3; + color: #222; + /* padding: 1px 2px; */ +} + +tt.xref, code.xref, a tt { + background-color: #FBFBFB; + border-bottom: 1px solid #fff; +} + +a.reference { + text-decoration: none; + border-bottom: 1px dotted #004B6B; +} + +/* Don't put an underline on images */ +a.image-reference, a.image-reference:hover { + border-bottom: none; +} + +a.reference:hover { + border-bottom: 1px solid #6D4100; +} + +a.footnote-reference { + text-decoration: none; + font-size: 0.7em; + vertical-align: top; + border-bottom: 1px dotted #004B6B; +} + +a.footnote-reference:hover { + border-bottom: 1px solid #6D4100; +} + +a:hover tt, a:hover code { + background: #EEE; +} + + +@media screen and (max-width: 870px) { + + div.sphinxsidebar { + display: none; + } + + div.document { + width: 100%; + + } + + div.documentwrapper { + margin-left: 0; + margin-top: 0; + margin-right: 0; + margin-bottom: 0; + } + + div.bodywrapper { + margin-top: 0; + margin-right: 0; + margin-bottom: 0; + margin-left: 0; + } + + ul { + margin-left: 0; + } + + li > ul { + /* Matches the 30px from the "ul, ol" selector above */ + margin-left: 30px; + } + + .document { + width: auto; + } + + .footer { + width: auto; + } + + .bodywrapper { + margin: 0; + } + + .footer { + width: auto; + } + + .github { + display: none; + } + + + +} + + + +@media screen and (max-width: 875px) { + + body { + margin: 0; + padding: 20px 30px; + } + + div.documentwrapper { + float: none; + background: #fff; + } + + div.sphinxsidebar { + display: block; + float: none; + width: 102.5%; + margin: 50px -30px -20px -30px; + padding: 10px 20px; + background: #333; + color: #FFF; + } + + div.sphinxsidebar h3, div.sphinxsidebar h4, div.sphinxsidebar p, + div.sphinxsidebar h3 a { + color: #fff; + } + + div.sphinxsidebar a { + color: #AAA; + } + + div.sphinxsidebar p.logo { + display: none; + } + + div.document { + width: 100%; + margin: 0; + } + + div.footer { + display: none; + } + + div.bodywrapper { + margin: 0; + } + + div.body { + min-height: 0; + padding: 0; + } + + .rtd_doc_footer { + display: none; + } + + .document { + width: auto; + } + + .footer { + width: auto; + } + + .footer { + width: auto; + } + + .github { + display: none; + } +} + + +/* misc. */ + +.revsys-inline { + display: none!important; +} + +/* Make nested-list/multi-paragraph items look better in Releases changelog + * pages. Without this, docutils' magical list fuckery causes inconsistent + * formatting between different release sub-lists. + */ +div#changelog > div.section > ul > li > p:only-child { + margin-bottom: 0; +} + +/* Hide fugly table cell borders in ..bibliography:: directive output */ +table.docutils.citation, table.docutils.citation td, table.docutils.citation th { + border: none; + /* Below needed in some edge cases; if not applied, bottom shadows appear */ + -moz-box-shadow: none; + -webkit-box-shadow: none; + box-shadow: none; +} + + +/* relbar */ + +.related { + line-height: 30px; + width: 100%; + font-size: 0.9rem; +} + +.related.top { + border-bottom: 1px solid #EEE; + margin-bottom: 20px; +} + +.related.bottom { + border-top: 1px solid #EEE; +} + +.related ul { + padding: 0; + margin: 0; + list-style: none; +} + +.related li { + display: inline; +} + +nav#rellinks { + float: right; +} + +nav#rellinks li+li:before { + content: "|"; +} + +nav#breadcrumbs li+li:before { + content: "\00BB"; +} + +/* Hide certain items when printing */ +@media print { + div.related { + display: none; + } +} \ No newline at end of file diff --git a/docs/_build/html/_static/basic.css b/docs/_build/html/_static/basic.css new file mode 100644 index 0000000..7577acb --- /dev/null +++ b/docs/_build/html/_static/basic.css @@ -0,0 +1,903 @@ +/* + * basic.css + * ~~~~~~~~~ + * + * Sphinx stylesheet -- basic theme. + * + * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ + +/* -- main layout ----------------------------------------------------------- */ + +div.clearer { + clear: both; +} + +div.section::after { + display: block; + content: ''; + clear: left; +} + +/* -- relbar ---------------------------------------------------------------- */ + +div.related { + width: 100%; + font-size: 90%; +} + +div.related h3 { + display: none; +} + +div.related ul { + margin: 0; + padding: 0 0 0 10px; + list-style: none; +} + +div.related li { + display: inline; +} + +div.related li.right { + float: right; + margin-right: 5px; +} + +/* -- sidebar --------------------------------------------------------------- */ + +div.sphinxsidebarwrapper { + padding: 10px 5px 0 10px; +} + +div.sphinxsidebar { + float: left; + width: 230px; + margin-left: -100%; + font-size: 90%; + word-wrap: break-word; + overflow-wrap : break-word; +} + +div.sphinxsidebar ul { + list-style: none; +} + +div.sphinxsidebar ul ul, +div.sphinxsidebar ul.want-points { + margin-left: 20px; + list-style: square; +} + +div.sphinxsidebar ul ul { + margin-top: 0; + margin-bottom: 0; +} + +div.sphinxsidebar form { + margin-top: 10px; +} + +div.sphinxsidebar input { + border: 1px solid #98dbcc; + font-family: sans-serif; + font-size: 1em; +} + +div.sphinxsidebar #searchbox form.search { + overflow: hidden; +} + +div.sphinxsidebar #searchbox input[type="text"] { + float: left; + width: 80%; + padding: 0.25em; + box-sizing: border-box; +} + +div.sphinxsidebar #searchbox input[type="submit"] { + float: left; + width: 20%; + border-left: none; + padding: 0.25em; + box-sizing: border-box; +} + + +img { + border: 0; + max-width: 100%; +} + +/* -- search page ----------------------------------------------------------- */ + +ul.search { + margin: 10px 0 0 20px; + padding: 0; +} + +ul.search li { + padding: 5px 0 5px 20px; + background-image: url(file.png); + background-repeat: no-repeat; + background-position: 0 7px; +} + +ul.search li a { + font-weight: bold; +} + +ul.search li p.context { + color: #888; + margin: 2px 0 0 30px; + text-align: left; +} + +ul.keywordmatches li.goodmatch a { + font-weight: bold; +} + +/* -- index page ------------------------------------------------------------ */ + +table.contentstable { + width: 90%; + margin-left: auto; + margin-right: auto; +} + +table.contentstable p.biglink { + line-height: 150%; +} + +a.biglink { + font-size: 1.3em; +} + +span.linkdescr { + font-style: italic; + padding-top: 5px; + font-size: 90%; +} + +/* -- general index --------------------------------------------------------- */ + +table.indextable { + width: 100%; +} + +table.indextable td { + text-align: left; + vertical-align: top; +} + +table.indextable ul { + margin-top: 0; + margin-bottom: 0; + list-style-type: none; +} + +table.indextable > tbody > tr > td > ul { + padding-left: 0em; +} + +table.indextable tr.pcap { + height: 10px; +} + +table.indextable tr.cap { + margin-top: 10px; + background-color: #f2f2f2; +} + +img.toggler { + margin-right: 3px; + margin-top: 3px; + cursor: pointer; +} + +div.modindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +div.genindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +/* -- domain module index --------------------------------------------------- */ + +table.modindextable td { + padding: 2px; + border-collapse: collapse; +} + +/* -- general body styles --------------------------------------------------- */ + +div.body { + min-width: 360px; + max-width: 800px; +} + +div.body p, div.body dd, div.body li, div.body blockquote { + -moz-hyphens: auto; + -ms-hyphens: auto; + -webkit-hyphens: auto; + hyphens: auto; +} + +a.headerlink { + visibility: hidden; +} + +h1:hover > a.headerlink, +h2:hover > a.headerlink, +h3:hover > a.headerlink, +h4:hover > a.headerlink, +h5:hover > a.headerlink, +h6:hover > a.headerlink, +dt:hover > a.headerlink, +caption:hover > a.headerlink, +p.caption:hover > a.headerlink, +div.code-block-caption:hover > a.headerlink { + visibility: visible; +} + +div.body p.caption { + text-align: inherit; +} + +div.body td { + text-align: left; +} + +.first { + margin-top: 0 !important; +} + +p.rubric { + margin-top: 30px; + font-weight: bold; +} + +img.align-left, figure.align-left, .figure.align-left, object.align-left { + clear: left; + float: left; + margin-right: 1em; +} + +img.align-right, figure.align-right, .figure.align-right, object.align-right { + clear: right; + float: right; + margin-left: 1em; +} + +img.align-center, figure.align-center, .figure.align-center, object.align-center { + display: block; + margin-left: auto; + margin-right: auto; +} + +img.align-default, figure.align-default, .figure.align-default { + display: block; + margin-left: auto; + margin-right: auto; +} + +.align-left { + text-align: left; +} + +.align-center { + text-align: center; +} + +.align-default { + text-align: center; +} + +.align-right { + text-align: right; +} + +/* -- sidebars -------------------------------------------------------------- */ + +div.sidebar, +aside.sidebar { + margin: 0 0 0.5em 1em; + border: 1px solid #ddb; + padding: 7px; + background-color: #ffe; + width: 40%; + float: right; + clear: right; + overflow-x: auto; +} + +p.sidebar-title { + font-weight: bold; +} + +nav.contents, +aside.topic, +div.admonition, div.topic, blockquote { + clear: left; +} + +/* -- topics ---------------------------------------------------------------- */ + +nav.contents, +aside.topic, +div.topic { + border: 1px solid #ccc; + padding: 7px; + margin: 10px 0 10px 0; +} + +p.topic-title { + font-size: 1.1em; + font-weight: bold; + margin-top: 10px; +} + +/* -- admonitions ----------------------------------------------------------- */ + +div.admonition { + margin-top: 10px; + margin-bottom: 10px; + padding: 7px; +} + +div.admonition dt { + font-weight: bold; +} + +p.admonition-title { + margin: 0px 10px 5px 0px; + font-weight: bold; +} + +div.body p.centered { + text-align: center; + margin-top: 25px; +} + +/* -- content of sidebars/topics/admonitions -------------------------------- */ + +div.sidebar > :last-child, +aside.sidebar > :last-child, +nav.contents > :last-child, +aside.topic > :last-child, +div.topic > :last-child, +div.admonition > :last-child { + margin-bottom: 0; +} + +div.sidebar::after, +aside.sidebar::after, +nav.contents::after, +aside.topic::after, +div.topic::after, +div.admonition::after, +blockquote::after { + display: block; + content: ''; + clear: both; +} + +/* -- tables ---------------------------------------------------------------- */ + +table.docutils { + margin-top: 10px; + margin-bottom: 10px; + border: 0; + border-collapse: collapse; +} + +table.align-center { + margin-left: auto; + margin-right: auto; +} + +table.align-default { + margin-left: auto; + margin-right: auto; +} + +table caption span.caption-number { + font-style: italic; +} + +table caption span.caption-text { +} + +table.docutils td, table.docutils th { + padding: 1px 8px 1px 5px; + border-top: 0; + border-left: 0; + border-right: 0; + border-bottom: 1px solid #aaa; +} + +th { + text-align: left; + padding-right: 5px; +} + +table.citation { + border-left: solid 1px gray; + margin-left: 1px; +} + +table.citation td { + border-bottom: none; +} + +th > :first-child, +td > :first-child { + margin-top: 0px; +} + +th > :last-child, +td > :last-child { + margin-bottom: 0px; +} + +/* -- figures --------------------------------------------------------------- */ + +div.figure, figure { + margin: 0.5em; + padding: 0.5em; +} + +div.figure p.caption, figcaption { + padding: 0.3em; +} + +div.figure p.caption span.caption-number, +figcaption span.caption-number { + font-style: italic; +} + +div.figure p.caption span.caption-text, +figcaption span.caption-text { +} + +/* -- field list styles ----------------------------------------------------- */ + +table.field-list td, table.field-list th { + border: 0 !important; +} + +.field-list ul { + margin: 0; + padding-left: 1em; +} + +.field-list p { + margin: 0; +} + +.field-name { + -moz-hyphens: manual; + -ms-hyphens: manual; + -webkit-hyphens: manual; + hyphens: manual; +} + +/* -- hlist styles ---------------------------------------------------------- */ + +table.hlist { + margin: 1em 0; +} + +table.hlist td { + vertical-align: top; +} + +/* -- object description styles --------------------------------------------- */ + +.sig { + font-family: 'Consolas', 'Menlo', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace; +} + +.sig-name, code.descname { + background-color: transparent; + font-weight: bold; +} + +.sig-name { + font-size: 1.1em; +} + +code.descname { + font-size: 1.2em; +} + +.sig-prename, code.descclassname { + background-color: transparent; +} + +.optional { + font-size: 1.3em; +} + +.sig-paren { + font-size: larger; +} + +.sig-param.n { + font-style: italic; +} + +/* C++ specific styling */ + +.sig-inline.c-texpr, +.sig-inline.cpp-texpr { + font-family: unset; +} + +.sig.c .k, .sig.c .kt, +.sig.cpp .k, .sig.cpp .kt { + color: #0033B3; +} + +.sig.c .m, +.sig.cpp .m { + color: #1750EB; +} + +.sig.c .s, .sig.c .sc, +.sig.cpp .s, .sig.cpp .sc { + color: #067D17; +} + + +/* -- other body styles ----------------------------------------------------- */ + +ol.arabic { + list-style: decimal; +} + +ol.loweralpha { + list-style: lower-alpha; +} + +ol.upperalpha { + list-style: upper-alpha; +} + +ol.lowerroman { + list-style: lower-roman; +} + +ol.upperroman { + list-style: upper-roman; +} + +:not(li) > ol > li:first-child > :first-child, +:not(li) > ul > li:first-child > :first-child { + margin-top: 0px; +} + +:not(li) > ol > li:last-child > :last-child, +:not(li) > ul > li:last-child > :last-child { + margin-bottom: 0px; +} + +ol.simple ol p, +ol.simple ul p, +ul.simple ol p, +ul.simple ul p { + margin-top: 0; +} + +ol.simple > li:not(:first-child) > p, +ul.simple > li:not(:first-child) > p { + margin-top: 0; +} + +ol.simple p, +ul.simple p { + margin-bottom: 0; +} + +aside.footnote > span, +div.citation > span { + float: left; +} +aside.footnote > span:last-of-type, +div.citation > span:last-of-type { + padding-right: 0.5em; +} +aside.footnote > p { + margin-left: 2em; +} +div.citation > p { + margin-left: 4em; +} +aside.footnote > p:last-of-type, +div.citation > p:last-of-type { + margin-bottom: 0em; +} +aside.footnote > p:last-of-type:after, +div.citation > p:last-of-type:after { + content: ""; + clear: both; +} + +dl.field-list { + display: grid; + grid-template-columns: fit-content(30%) auto; +} + +dl.field-list > dt { + font-weight: bold; + word-break: break-word; + padding-left: 0.5em; + padding-right: 5px; +} + +dl.field-list > dd { + padding-left: 0.5em; + margin-top: 0em; + margin-left: 0em; + margin-bottom: 0em; +} + +dl { + margin-bottom: 15px; +} + +dd > :first-child { + margin-top: 0px; +} + +dd ul, dd table { + margin-bottom: 10px; +} + +dd { + margin-top: 3px; + margin-bottom: 10px; + margin-left: 30px; +} + +dl > dd:last-child, +dl > dd:last-child > :last-child { + margin-bottom: 0; +} + +dt:target, span.highlighted { + background-color: #fbe54e; +} + +rect.highlighted { + fill: #fbe54e; +} + +dl.glossary dt { + font-weight: bold; + font-size: 1.1em; +} + +.versionmodified { + font-style: italic; +} + +.system-message { + background-color: #fda; + padding: 5px; + border: 3px solid red; +} + +.footnote:target { + background-color: #ffa; +} + +.line-block { + display: block; + margin-top: 1em; + margin-bottom: 1em; +} + +.line-block .line-block { + margin-top: 0; + margin-bottom: 0; + margin-left: 1.5em; +} + +.guilabel, .menuselection { + font-family: sans-serif; +} + +.accelerator { + text-decoration: underline; +} + +.classifier { + font-style: oblique; +} + +.classifier:before { + font-style: normal; + margin: 0 0.5em; + content: ":"; + display: inline-block; +} + +abbr, acronym { + border-bottom: dotted 1px; + cursor: help; +} + +/* -- code displays --------------------------------------------------------- */ + +pre { + overflow: auto; + overflow-y: hidden; /* fixes display issues on Chrome browsers */ +} + +pre, div[class*="highlight-"] { + clear: both; +} + +span.pre { + -moz-hyphens: none; + -ms-hyphens: none; + -webkit-hyphens: none; + hyphens: none; + white-space: nowrap; +} + +div[class*="highlight-"] { + margin: 1em 0; +} + +td.linenos pre { + border: 0; + background-color: transparent; + color: #aaa; +} + +table.highlighttable { + display: block; +} + +table.highlighttable tbody { + display: block; +} + +table.highlighttable tr { + display: flex; +} + +table.highlighttable td { + margin: 0; + padding: 0; +} + +table.highlighttable td.linenos { + padding-right: 0.5em; +} + +table.highlighttable td.code { + flex: 1; + overflow: hidden; +} + +.highlight .hll { + display: block; +} + +div.highlight pre, +table.highlighttable pre { + margin: 0; +} + +div.code-block-caption + div { + margin-top: 0; +} + +div.code-block-caption { + margin-top: 1em; + padding: 2px 5px; + font-size: small; +} + +div.code-block-caption code { + background-color: transparent; +} + +table.highlighttable td.linenos, +span.linenos, +div.highlight span.gp { /* gp: Generic.Prompt */ + user-select: none; + -webkit-user-select: text; /* Safari fallback only */ + -webkit-user-select: none; /* Chrome/Safari */ + -moz-user-select: none; /* Firefox */ + -ms-user-select: none; /* IE10+ */ +} + +div.code-block-caption span.caption-number { + padding: 0.1em 0.3em; + font-style: italic; +} + +div.code-block-caption span.caption-text { +} + +div.literal-block-wrapper { + margin: 1em 0; +} + +code.xref, a code { + background-color: transparent; + font-weight: bold; +} + +h1 code, h2 code, h3 code, h4 code, h5 code, h6 code { + background-color: transparent; +} + +.viewcode-link { + float: right; +} + +.viewcode-back { + float: right; + font-family: sans-serif; +} + +div.viewcode-block:target { + margin: -1px -10px; + padding: 0 10px; +} + +/* -- math display ---------------------------------------------------------- */ + +img.math { + vertical-align: middle; +} + +div.body div.math p { + text-align: center; +} + +span.eqno { + float: right; +} + +span.eqno a.headerlink { + position: absolute; + z-index: 1; +} + +div.math:hover a.headerlink { + visibility: visible; +} + +/* -- printout stylesheet --------------------------------------------------- */ + +@media print { + div.document, + div.documentwrapper, + div.bodywrapper { + margin: 0 !important; + width: 100%; + } + + div.sphinxsidebar, + div.related, + div.footer, + #top-link { + display: none; + } +} \ No newline at end of file diff --git a/docs/_build/html/_static/custom.css b/docs/_build/html/_static/custom.css new file mode 100644 index 0000000..2a924f1 --- /dev/null +++ b/docs/_build/html/_static/custom.css @@ -0,0 +1 @@ +/* This file intentionally left blank. */ diff --git a/docs/_build/html/_static/doctools.js b/docs/_build/html/_static/doctools.js new file mode 100644 index 0000000..d06a71d --- /dev/null +++ b/docs/_build/html/_static/doctools.js @@ -0,0 +1,156 @@ +/* + * doctools.js + * ~~~~~~~~~~~ + * + * Base JavaScript utilities for all Sphinx HTML documentation. + * + * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ +"use strict"; + +const BLACKLISTED_KEY_CONTROL_ELEMENTS = new Set([ + "TEXTAREA", + "INPUT", + "SELECT", + "BUTTON", +]); + +const _ready = (callback) => { + if (document.readyState !== "loading") { + callback(); + } else { + document.addEventListener("DOMContentLoaded", callback); + } +}; + +/** + * Small JavaScript module for the documentation. + */ +const Documentation = { + init: () => { + Documentation.initDomainIndexTable(); + Documentation.initOnKeyListeners(); + }, + + /** + * i18n support + */ + TRANSLATIONS: {}, + PLURAL_EXPR: (n) => (n === 1 ? 0 : 1), + LOCALE: "unknown", + + // gettext and ngettext don't access this so that the functions + // can safely bound to a different name (_ = Documentation.gettext) + gettext: (string) => { + const translated = Documentation.TRANSLATIONS[string]; + switch (typeof translated) { + case "undefined": + return string; // no translation + case "string": + return translated; // translation exists + default: + return translated[0]; // (singular, plural) translation tuple exists + } + }, + + ngettext: (singular, plural, n) => { + const translated = Documentation.TRANSLATIONS[singular]; + if (typeof translated !== "undefined") + return translated[Documentation.PLURAL_EXPR(n)]; + return n === 1 ? singular : plural; + }, + + addTranslations: (catalog) => { + Object.assign(Documentation.TRANSLATIONS, catalog.messages); + Documentation.PLURAL_EXPR = new Function( + "n", + `return (${catalog.plural_expr})` + ); + Documentation.LOCALE = catalog.locale; + }, + + /** + * helper function to focus on search bar + */ + focusSearchBar: () => { + document.querySelectorAll("input[name=q]")[0]?.focus(); + }, + + /** + * Initialise the domain index toggle buttons + */ + initDomainIndexTable: () => { + const toggler = (el) => { + const idNumber = el.id.substr(7); + const toggledRows = document.querySelectorAll(`tr.cg-${idNumber}`); + if (el.src.substr(-9) === "minus.png") { + el.src = `${el.src.substr(0, el.src.length - 9)}plus.png`; + toggledRows.forEach((el) => (el.style.display = "none")); + } else { + el.src = `${el.src.substr(0, el.src.length - 8)}minus.png`; + toggledRows.forEach((el) => (el.style.display = "")); + } + }; + + const togglerElements = document.querySelectorAll("img.toggler"); + togglerElements.forEach((el) => + el.addEventListener("click", (event) => toggler(event.currentTarget)) + ); + togglerElements.forEach((el) => (el.style.display = "")); + if (DOCUMENTATION_OPTIONS.COLLAPSE_INDEX) togglerElements.forEach(toggler); + }, + + initOnKeyListeners: () => { + // only install a listener if it is really needed + if ( + !DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS && + !DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS + ) + return; + + document.addEventListener("keydown", (event) => { + // bail for input elements + if (BLACKLISTED_KEY_CONTROL_ELEMENTS.has(document.activeElement.tagName)) return; + // bail with special keys + if (event.altKey || event.ctrlKey || event.metaKey) return; + + if (!event.shiftKey) { + switch (event.key) { + case "ArrowLeft": + if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break; + + const prevLink = document.querySelector('link[rel="prev"]'); + if (prevLink && prevLink.href) { + window.location.href = prevLink.href; + event.preventDefault(); + } + break; + case "ArrowRight": + if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break; + + const nextLink = document.querySelector('link[rel="next"]'); + if (nextLink && nextLink.href) { + window.location.href = nextLink.href; + event.preventDefault(); + } + break; + } + } + + // some keyboard layouts may need Shift to get / + switch (event.key) { + case "/": + if (!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) break; + Documentation.focusSearchBar(); + event.preventDefault(); + } + }); + }, +}; + +// quick alias for translations +const _ = Documentation.gettext; + +_ready(Documentation.init); diff --git a/docs/_build/html/_static/documentation_options.js b/docs/_build/html/_static/documentation_options.js new file mode 100644 index 0000000..b57ae3b --- /dev/null +++ b/docs/_build/html/_static/documentation_options.js @@ -0,0 +1,14 @@ +var DOCUMENTATION_OPTIONS = { + URL_ROOT: document.getElementById("documentation_options").getAttribute('data-url_root'), + VERSION: '', + LANGUAGE: 'en', + COLLAPSE_INDEX: false, + BUILDER: 'html', + FILE_SUFFIX: '.html', + LINK_SUFFIX: '.html', + HAS_SOURCE: true, + SOURCELINK_SUFFIX: '.txt', + NAVIGATION_WITH_KEYS: false, + SHOW_SEARCH_SUMMARY: true, + ENABLE_SEARCH_SHORTCUTS: true, +}; \ No newline at end of file diff --git a/docs/_build/html/_static/file.png b/docs/_build/html/_static/file.png new file mode 100644 index 0000000000000000000000000000000000000000..a858a410e4faa62ce324d814e4b816fff83a6fb3 GIT binary patch literal 286 zcmV+(0pb3MP)s`hMrGg#P~ix$^RISR_I47Y|r1 z_CyJOe}D1){SET-^Amu_i71Lt6eYfZjRyw@I6OQAIXXHDfiX^GbOlHe=Ae4>0m)d(f|Me07*qoM6N<$f}vM^LjV8( literal 0 HcmV?d00001 diff --git a/docs/_build/html/_static/language_data.js b/docs/_build/html/_static/language_data.js new file mode 100644 index 0000000..250f566 --- /dev/null +++ b/docs/_build/html/_static/language_data.js @@ -0,0 +1,199 @@ +/* + * language_data.js + * ~~~~~~~~~~~~~~~~ + * + * This script contains the language-specific data used by searchtools.js, + * namely the list of stopwords, stemmer, scorer and splitter. + * + * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ + +var stopwords = ["a", "and", "are", "as", "at", "be", "but", "by", "for", "if", "in", "into", "is", "it", "near", "no", "not", "of", "on", "or", "such", "that", "the", "their", "then", "there", "these", "they", "this", "to", "was", "will", "with"]; + + +/* Non-minified version is copied as a separate JS file, is available */ + +/** + * Porter Stemmer + */ +var Stemmer = function() { + + var step2list = { + ational: 'ate', + tional: 'tion', + enci: 'ence', + anci: 'ance', + izer: 'ize', + bli: 'ble', + alli: 'al', + entli: 'ent', + eli: 'e', + ousli: 'ous', + ization: 'ize', + ation: 'ate', + ator: 'ate', + alism: 'al', + iveness: 'ive', + fulness: 'ful', + ousness: 'ous', + aliti: 'al', + iviti: 'ive', + biliti: 'ble', + logi: 'log' + }; + + var step3list = { + icate: 'ic', + ative: '', + alize: 'al', + iciti: 'ic', + ical: 'ic', + ful: '', + ness: '' + }; + + var c = "[^aeiou]"; // consonant + var v = "[aeiouy]"; // vowel + var C = c + "[^aeiouy]*"; // consonant sequence + var V = v + "[aeiou]*"; // vowel sequence + + var mgr0 = "^(" + C + ")?" + V + C; // [C]VC... is m>0 + var meq1 = "^(" + C + ")?" + V + C + "(" + V + ")?$"; // [C]VC[V] is m=1 + var mgr1 = "^(" + C + ")?" + V + C + V + C; // [C]VCVC... is m>1 + var s_v = "^(" + C + ")?" + v; // vowel in stem + + this.stemWord = function (w) { + var stem; + var suffix; + var firstch; + var origword = w; + + if (w.length < 3) + return w; + + var re; + var re2; + var re3; + var re4; + + firstch = w.substr(0,1); + if (firstch == "y") + w = firstch.toUpperCase() + w.substr(1); + + // Step 1a + re = /^(.+?)(ss|i)es$/; + re2 = /^(.+?)([^s])s$/; + + if (re.test(w)) + w = w.replace(re,"$1$2"); + else if (re2.test(w)) + w = w.replace(re2,"$1$2"); + + // Step 1b + re = /^(.+?)eed$/; + re2 = /^(.+?)(ed|ing)$/; + if (re.test(w)) { + var fp = re.exec(w); + re = new RegExp(mgr0); + if (re.test(fp[1])) { + re = /.$/; + w = w.replace(re,""); + } + } + else if (re2.test(w)) { + var fp = re2.exec(w); + stem = fp[1]; + re2 = new RegExp(s_v); + if (re2.test(stem)) { + w = stem; + re2 = /(at|bl|iz)$/; + re3 = new RegExp("([^aeiouylsz])\\1$"); + re4 = new RegExp("^" + C + v + "[^aeiouwxy]$"); + if (re2.test(w)) + w = w + "e"; + else if (re3.test(w)) { + re = /.$/; + w = w.replace(re,""); + } + else if (re4.test(w)) + w = w + "e"; + } + } + + // Step 1c + re = /^(.+?)y$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(s_v); + if (re.test(stem)) + w = stem + "i"; + } + + // Step 2 + re = /^(.+?)(ational|tional|enci|anci|izer|bli|alli|entli|eli|ousli|ization|ation|ator|alism|iveness|fulness|ousness|aliti|iviti|biliti|logi)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + suffix = fp[2]; + re = new RegExp(mgr0); + if (re.test(stem)) + w = stem + step2list[suffix]; + } + + // Step 3 + re = /^(.+?)(icate|ative|alize|iciti|ical|ful|ness)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + suffix = fp[2]; + re = new RegExp(mgr0); + if (re.test(stem)) + w = stem + step3list[suffix]; + } + + // Step 4 + re = /^(.+?)(al|ance|ence|er|ic|able|ible|ant|ement|ment|ent|ou|ism|ate|iti|ous|ive|ize)$/; + re2 = /^(.+?)(s|t)(ion)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(mgr1); + if (re.test(stem)) + w = stem; + } + else if (re2.test(w)) { + var fp = re2.exec(w); + stem = fp[1] + fp[2]; + re2 = new RegExp(mgr1); + if (re2.test(stem)) + w = stem; + } + + // Step 5 + re = /^(.+?)e$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(mgr1); + re2 = new RegExp(meq1); + re3 = new RegExp("^" + C + v + "[^aeiouwxy]$"); + if (re.test(stem) || (re2.test(stem) && !(re3.test(stem)))) + w = stem; + } + re = /ll$/; + re2 = new RegExp(mgr1); + if (re.test(w) && re2.test(w)) { + re = /.$/; + w = w.replace(re,""); + } + + // and turn initial Y back to y + if (firstch == "y") + w = firstch.toLowerCase() + w.substr(1); + return w; + } +} + diff --git a/docs/_build/html/_static/minus.png b/docs/_build/html/_static/minus.png new file mode 100644 index 0000000000000000000000000000000000000000..d96755fdaf8bb2214971e0db9c1fd3077d7c419d GIT binary patch literal 90 zcmeAS@N?(olHy`uVBq!ia0vp^+#t*WBp7;*Yy1LIik>cxAr*|t7R?Mi>2?kWtu=nj kDsEF_5m^0CR;1wuP-*O&G^0G}KYk!hp00i_>zopr08q^qX#fBK literal 0 HcmV?d00001 diff --git a/docs/_build/html/_static/plus.png b/docs/_build/html/_static/plus.png new file mode 100644 index 0000000000000000000000000000000000000000..7107cec93a979b9a5f64843235a16651d563ce2d GIT binary patch literal 90 zcmeAS@N?(olHy`uVBq!ia0vp^+#t*WBp7;*Yy1LIik>cxAr*|t7R?Mi>2?kWtu>-2 m3q%Vub%g%s<8sJhVPMczOq}xhg9DJoz~JfX=d#Wzp$Pyb1r*Kz literal 0 HcmV?d00001 diff --git a/docs/_build/html/_static/pygments.css b/docs/_build/html/_static/pygments.css new file mode 100644 index 0000000..9abe04b --- /dev/null +++ b/docs/_build/html/_static/pygments.css @@ -0,0 +1,83 @@ +pre { line-height: 125%; } +td.linenos .normal { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; } +span.linenos { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; } +td.linenos .special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } +span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } +.highlight .hll { background-color: #ffffcc } +.highlight { background: #f8f8f8; } +.highlight .c { color: #8f5902; font-style: italic } /* Comment */ +.highlight .err { color: #a40000; border: 1px solid #ef2929 } /* Error */ +.highlight .g { color: #000000 } /* Generic */ +.highlight .k { color: #004461; font-weight: bold } /* Keyword */ +.highlight .l { color: #000000 } /* Literal */ +.highlight .n { color: #000000 } /* Name */ +.highlight .o { color: #582800 } /* Operator */ +.highlight .x { color: #000000 } /* Other */ +.highlight .p { color: #000000; font-weight: bold } /* Punctuation */ +.highlight .ch { color: #8f5902; font-style: italic } /* Comment.Hashbang */ +.highlight .cm { color: #8f5902; font-style: italic } /* Comment.Multiline */ +.highlight .cp { color: #8f5902 } /* Comment.Preproc */ +.highlight .cpf { color: #8f5902; font-style: italic } /* Comment.PreprocFile */ +.highlight .c1 { color: #8f5902; font-style: italic } /* Comment.Single */ +.highlight .cs { color: #8f5902; font-style: italic } /* Comment.Special */ +.highlight .gd { color: #a40000 } /* Generic.Deleted */ +.highlight .ge { color: #000000; font-style: italic } /* Generic.Emph */ +.highlight .gr { color: #ef2929 } /* Generic.Error */ +.highlight .gh { color: #000080; font-weight: bold } /* Generic.Heading */ +.highlight .gi { color: #00A000 } /* Generic.Inserted */ +.highlight .go { color: #888888 } /* Generic.Output */ +.highlight .gp { color: #745334 } /* Generic.Prompt */ +.highlight .gs { color: #000000; font-weight: bold } /* Generic.Strong */ +.highlight .gu { color: #800080; font-weight: bold } /* Generic.Subheading */ +.highlight .gt { color: #a40000; font-weight: bold } /* Generic.Traceback */ +.highlight .kc { color: #004461; font-weight: bold } /* Keyword.Constant */ +.highlight .kd { color: #004461; font-weight: bold } /* Keyword.Declaration */ +.highlight .kn { color: #004461; font-weight: bold } /* Keyword.Namespace */ +.highlight .kp { color: #004461; font-weight: bold } /* Keyword.Pseudo */ +.highlight .kr { color: #004461; font-weight: bold } /* Keyword.Reserved */ +.highlight .kt { color: #004461; font-weight: bold } /* Keyword.Type */ +.highlight .ld { color: #000000 } /* Literal.Date */ +.highlight .m { color: #990000 } /* Literal.Number */ +.highlight .s { color: #4e9a06 } /* Literal.String */ +.highlight .na { color: #c4a000 } /* Name.Attribute */ +.highlight .nb { color: #004461 } /* Name.Builtin */ +.highlight .nc { color: #000000 } /* Name.Class */ +.highlight .no { color: #000000 } /* Name.Constant */ +.highlight .nd { color: #888888 } /* Name.Decorator */ +.highlight .ni { color: #ce5c00 } /* Name.Entity */ +.highlight .ne { color: #cc0000; font-weight: bold } /* Name.Exception */ +.highlight .nf { color: #000000 } /* Name.Function */ +.highlight .nl { color: #f57900 } /* Name.Label */ +.highlight .nn { color: #000000 } /* Name.Namespace */ +.highlight .nx { color: #000000 } /* Name.Other */ +.highlight .py { color: #000000 } /* Name.Property */ +.highlight .nt { color: #004461; font-weight: bold } /* Name.Tag */ +.highlight .nv { color: #000000 } /* Name.Variable */ +.highlight .ow { color: #004461; font-weight: bold } /* Operator.Word */ +.highlight .pm { color: #000000; font-weight: bold } /* Punctuation.Marker */ +.highlight .w { color: #f8f8f8; text-decoration: underline } /* Text.Whitespace */ +.highlight .mb { color: #990000 } /* Literal.Number.Bin */ +.highlight .mf { color: #990000 } /* Literal.Number.Float */ +.highlight .mh { color: #990000 } /* Literal.Number.Hex */ +.highlight .mi { color: #990000 } /* Literal.Number.Integer */ +.highlight .mo { color: #990000 } /* Literal.Number.Oct */ +.highlight .sa { color: #4e9a06 } /* Literal.String.Affix */ +.highlight .sb { color: #4e9a06 } /* Literal.String.Backtick */ +.highlight .sc { color: #4e9a06 } /* Literal.String.Char */ +.highlight .dl { color: #4e9a06 } /* Literal.String.Delimiter */ +.highlight .sd { color: #8f5902; font-style: italic } /* Literal.String.Doc */ +.highlight .s2 { color: #4e9a06 } /* Literal.String.Double */ +.highlight .se { color: #4e9a06 } /* Literal.String.Escape */ +.highlight .sh { color: #4e9a06 } /* Literal.String.Heredoc */ +.highlight .si { color: #4e9a06 } /* Literal.String.Interpol */ +.highlight .sx { color: #4e9a06 } /* Literal.String.Other */ +.highlight .sr { color: #4e9a06 } /* Literal.String.Regex */ +.highlight .s1 { color: #4e9a06 } /* Literal.String.Single */ +.highlight .ss { color: #4e9a06 } /* Literal.String.Symbol */ +.highlight .bp { color: #3465a4 } /* Name.Builtin.Pseudo */ +.highlight .fm { color: #000000 } /* Name.Function.Magic */ +.highlight .vc { color: #000000 } /* Name.Variable.Class */ +.highlight .vg { color: #000000 } /* Name.Variable.Global */ +.highlight .vi { color: #000000 } /* Name.Variable.Instance */ +.highlight .vm { color: #000000 } /* Name.Variable.Magic */ +.highlight .il { color: #990000 } /* Literal.Number.Integer.Long */ \ No newline at end of file diff --git a/docs/_build/html/_static/searchtools.js b/docs/_build/html/_static/searchtools.js new file mode 100644 index 0000000..97d56a7 --- /dev/null +++ b/docs/_build/html/_static/searchtools.js @@ -0,0 +1,566 @@ +/* + * searchtools.js + * ~~~~~~~~~~~~~~~~ + * + * Sphinx JavaScript utilities for the full-text search. + * + * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ +"use strict"; + +/** + * Simple result scoring code. + */ +if (typeof Scorer === "undefined") { + var Scorer = { + // Implement the following function to further tweak the score for each result + // The function takes a result array [docname, title, anchor, descr, score, filename] + // and returns the new score. + /* + score: result => { + const [docname, title, anchor, descr, score, filename] = result + return score + }, + */ + + // query matches the full name of an object + objNameMatch: 11, + // or matches in the last dotted part of the object name + objPartialMatch: 6, + // Additive scores depending on the priority of the object + objPrio: { + 0: 15, // used to be importantResults + 1: 5, // used to be objectResults + 2: -5, // used to be unimportantResults + }, + // Used when the priority is not in the mapping. + objPrioDefault: 0, + + // query found in title + title: 15, + partialTitle: 7, + // query found in terms + term: 5, + partialTerm: 2, + }; +} + +const _removeChildren = (element) => { + while (element && element.lastChild) element.removeChild(element.lastChild); +}; + +/** + * See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions#escaping + */ +const _escapeRegExp = (string) => + string.replace(/[.*+\-?^${}()|[\]\\]/g, "\\$&"); // $& means the whole matched string + +const _displayItem = (item, searchTerms) => { + const docBuilder = DOCUMENTATION_OPTIONS.BUILDER; + const docUrlRoot = DOCUMENTATION_OPTIONS.URL_ROOT; + const docFileSuffix = DOCUMENTATION_OPTIONS.FILE_SUFFIX; + const docLinkSuffix = DOCUMENTATION_OPTIONS.LINK_SUFFIX; + const showSearchSummary = DOCUMENTATION_OPTIONS.SHOW_SEARCH_SUMMARY; + + const [docName, title, anchor, descr, score, _filename] = item; + + let listItem = document.createElement("li"); + let requestUrl; + let linkUrl; + if (docBuilder === "dirhtml") { + // dirhtml builder + let dirname = docName + "/"; + if (dirname.match(/\/index\/$/)) + dirname = dirname.substring(0, dirname.length - 6); + else if (dirname === "index/") dirname = ""; + requestUrl = docUrlRoot + dirname; + linkUrl = requestUrl; + } else { + // normal html builders + requestUrl = docUrlRoot + docName + docFileSuffix; + linkUrl = docName + docLinkSuffix; + } + let linkEl = listItem.appendChild(document.createElement("a")); + linkEl.href = linkUrl + anchor; + linkEl.dataset.score = score; + linkEl.innerHTML = title; + if (descr) + listItem.appendChild(document.createElement("span")).innerHTML = + " (" + descr + ")"; + else if (showSearchSummary) + fetch(requestUrl) + .then((responseData) => responseData.text()) + .then((data) => { + if (data) + listItem.appendChild( + Search.makeSearchSummary(data, searchTerms) + ); + }); + Search.output.appendChild(listItem); +}; +const _finishSearch = (resultCount) => { + Search.stopPulse(); + Search.title.innerText = _("Search Results"); + if (!resultCount) + Search.status.innerText = Documentation.gettext( + "Your search did not match any documents. Please make sure that all words are spelled correctly and that you've selected enough categories." + ); + else + Search.status.innerText = _( + `Search finished, found ${resultCount} page(s) matching the search query.` + ); +}; +const _displayNextItem = ( + results, + resultCount, + searchTerms +) => { + // results left, load the summary and display it + // this is intended to be dynamic (don't sub resultsCount) + if (results.length) { + _displayItem(results.pop(), searchTerms); + setTimeout( + () => _displayNextItem(results, resultCount, searchTerms), + 5 + ); + } + // search finished, update title and status message + else _finishSearch(resultCount); +}; + +/** + * Default splitQuery function. Can be overridden in ``sphinx.search`` with a + * custom function per language. + * + * The regular expression works by splitting the string on consecutive characters + * that are not Unicode letters, numbers, underscores, or emoji characters. + * This is the same as ``\W+`` in Python, preserving the surrogate pair area. + */ +if (typeof splitQuery === "undefined") { + var splitQuery = (query) => query + .split(/[^\p{Letter}\p{Number}_\p{Emoji_Presentation}]+/gu) + .filter(term => term) // remove remaining empty strings +} + +/** + * Search Module + */ +const Search = { + _index: null, + _queued_query: null, + _pulse_status: -1, + + htmlToText: (htmlString) => { + const htmlElement = new DOMParser().parseFromString(htmlString, 'text/html'); + htmlElement.querySelectorAll(".headerlink").forEach((el) => { el.remove() }); + const docContent = htmlElement.querySelector('[role="main"]'); + if (docContent !== undefined) return docContent.textContent; + console.warn( + "Content block not found. Sphinx search tries to obtain it via '[role=main]'. Could you check your theme or template." + ); + return ""; + }, + + init: () => { + const query = new URLSearchParams(window.location.search).get("q"); + document + .querySelectorAll('input[name="q"]') + .forEach((el) => (el.value = query)); + if (query) Search.performSearch(query); + }, + + loadIndex: (url) => + (document.body.appendChild(document.createElement("script")).src = url), + + setIndex: (index) => { + Search._index = index; + if (Search._queued_query !== null) { + const query = Search._queued_query; + Search._queued_query = null; + Search.query(query); + } + }, + + hasIndex: () => Search._index !== null, + + deferQuery: (query) => (Search._queued_query = query), + + stopPulse: () => (Search._pulse_status = -1), + + startPulse: () => { + if (Search._pulse_status >= 0) return; + + const pulse = () => { + Search._pulse_status = (Search._pulse_status + 1) % 4; + Search.dots.innerText = ".".repeat(Search._pulse_status); + if (Search._pulse_status >= 0) window.setTimeout(pulse, 500); + }; + pulse(); + }, + + /** + * perform a search for something (or wait until index is loaded) + */ + performSearch: (query) => { + // create the required interface elements + const searchText = document.createElement("h2"); + searchText.textContent = _("Searching"); + const searchSummary = document.createElement("p"); + searchSummary.classList.add("search-summary"); + searchSummary.innerText = ""; + const searchList = document.createElement("ul"); + searchList.classList.add("search"); + + const out = document.getElementById("search-results"); + Search.title = out.appendChild(searchText); + Search.dots = Search.title.appendChild(document.createElement("span")); + Search.status = out.appendChild(searchSummary); + Search.output = out.appendChild(searchList); + + const searchProgress = document.getElementById("search-progress"); + // Some themes don't use the search progress node + if (searchProgress) { + searchProgress.innerText = _("Preparing search..."); + } + Search.startPulse(); + + // index already loaded, the browser was quick! + if (Search.hasIndex()) Search.query(query); + else Search.deferQuery(query); + }, + + /** + * execute search (requires search index to be loaded) + */ + query: (query) => { + const filenames = Search._index.filenames; + const docNames = Search._index.docnames; + const titles = Search._index.titles; + const allTitles = Search._index.alltitles; + const indexEntries = Search._index.indexentries; + + // stem the search terms and add them to the correct list + const stemmer = new Stemmer(); + const searchTerms = new Set(); + const excludedTerms = new Set(); + const highlightTerms = new Set(); + const objectTerms = new Set(splitQuery(query.toLowerCase().trim())); + splitQuery(query.trim()).forEach((queryTerm) => { + const queryTermLower = queryTerm.toLowerCase(); + + // maybe skip this "word" + // stopwords array is from language_data.js + if ( + stopwords.indexOf(queryTermLower) !== -1 || + queryTerm.match(/^\d+$/) + ) + return; + + // stem the word + let word = stemmer.stemWord(queryTermLower); + // select the correct list + if (word[0] === "-") excludedTerms.add(word.substr(1)); + else { + searchTerms.add(word); + highlightTerms.add(queryTermLower); + } + }); + + if (SPHINX_HIGHLIGHT_ENABLED) { // set in sphinx_highlight.js + localStorage.setItem("sphinx_highlight_terms", [...highlightTerms].join(" ")) + } + + // console.debug("SEARCH: searching for:"); + // console.info("required: ", [...searchTerms]); + // console.info("excluded: ", [...excludedTerms]); + + // array of [docname, title, anchor, descr, score, filename] + let results = []; + _removeChildren(document.getElementById("search-progress")); + + const queryLower = query.toLowerCase(); + for (const [title, foundTitles] of Object.entries(allTitles)) { + if (title.toLowerCase().includes(queryLower) && (queryLower.length >= title.length/2)) { + for (const [file, id] of foundTitles) { + let score = Math.round(100 * queryLower.length / title.length) + results.push([ + docNames[file], + titles[file] !== title ? `${titles[file]} > ${title}` : title, + id !== null ? "#" + id : "", + null, + score, + filenames[file], + ]); + } + } + } + + // search for explicit entries in index directives + for (const [entry, foundEntries] of Object.entries(indexEntries)) { + if (entry.includes(queryLower) && (queryLower.length >= entry.length/2)) { + for (const [file, id] of foundEntries) { + let score = Math.round(100 * queryLower.length / entry.length) + results.push([ + docNames[file], + titles[file], + id ? "#" + id : "", + null, + score, + filenames[file], + ]); + } + } + } + + // lookup as object + objectTerms.forEach((term) => + results.push(...Search.performObjectSearch(term, objectTerms)) + ); + + // lookup as search terms in fulltext + results.push(...Search.performTermsSearch(searchTerms, excludedTerms)); + + // let the scorer override scores with a custom scoring function + if (Scorer.score) results.forEach((item) => (item[4] = Scorer.score(item))); + + // now sort the results by score (in opposite order of appearance, since the + // display function below uses pop() to retrieve items) and then + // alphabetically + results.sort((a, b) => { + const leftScore = a[4]; + const rightScore = b[4]; + if (leftScore === rightScore) { + // same score: sort alphabetically + const leftTitle = a[1].toLowerCase(); + const rightTitle = b[1].toLowerCase(); + if (leftTitle === rightTitle) return 0; + return leftTitle > rightTitle ? -1 : 1; // inverted is intentional + } + return leftScore > rightScore ? 1 : -1; + }); + + // remove duplicate search results + // note the reversing of results, so that in the case of duplicates, the highest-scoring entry is kept + let seen = new Set(); + results = results.reverse().reduce((acc, result) => { + let resultStr = result.slice(0, 4).concat([result[5]]).map(v => String(v)).join(','); + if (!seen.has(resultStr)) { + acc.push(result); + seen.add(resultStr); + } + return acc; + }, []); + + results = results.reverse(); + + // for debugging + //Search.lastresults = results.slice(); // a copy + // console.info("search results:", Search.lastresults); + + // print the results + _displayNextItem(results, results.length, searchTerms); + }, + + /** + * search for object names + */ + performObjectSearch: (object, objectTerms) => { + const filenames = Search._index.filenames; + const docNames = Search._index.docnames; + const objects = Search._index.objects; + const objNames = Search._index.objnames; + const titles = Search._index.titles; + + const results = []; + + const objectSearchCallback = (prefix, match) => { + const name = match[4] + const fullname = (prefix ? prefix + "." : "") + name; + const fullnameLower = fullname.toLowerCase(); + if (fullnameLower.indexOf(object) < 0) return; + + let score = 0; + const parts = fullnameLower.split("."); + + // check for different match types: exact matches of full name or + // "last name" (i.e. last dotted part) + if (fullnameLower === object || parts.slice(-1)[0] === object) + score += Scorer.objNameMatch; + else if (parts.slice(-1)[0].indexOf(object) > -1) + score += Scorer.objPartialMatch; // matches in last name + + const objName = objNames[match[1]][2]; + const title = titles[match[0]]; + + // If more than one term searched for, we require other words to be + // found in the name/title/description + const otherTerms = new Set(objectTerms); + otherTerms.delete(object); + if (otherTerms.size > 0) { + const haystack = `${prefix} ${name} ${objName} ${title}`.toLowerCase(); + if ( + [...otherTerms].some((otherTerm) => haystack.indexOf(otherTerm) < 0) + ) + return; + } + + let anchor = match[3]; + if (anchor === "") anchor = fullname; + else if (anchor === "-") anchor = objNames[match[1]][1] + "-" + fullname; + + const descr = objName + _(", in ") + title; + + // add custom score for some objects according to scorer + if (Scorer.objPrio.hasOwnProperty(match[2])) + score += Scorer.objPrio[match[2]]; + else score += Scorer.objPrioDefault; + + results.push([ + docNames[match[0]], + fullname, + "#" + anchor, + descr, + score, + filenames[match[0]], + ]); + }; + Object.keys(objects).forEach((prefix) => + objects[prefix].forEach((array) => + objectSearchCallback(prefix, array) + ) + ); + return results; + }, + + /** + * search for full-text terms in the index + */ + performTermsSearch: (searchTerms, excludedTerms) => { + // prepare search + const terms = Search._index.terms; + const titleTerms = Search._index.titleterms; + const filenames = Search._index.filenames; + const docNames = Search._index.docnames; + const titles = Search._index.titles; + + const scoreMap = new Map(); + const fileMap = new Map(); + + // perform the search on the required terms + searchTerms.forEach((word) => { + const files = []; + const arr = [ + { files: terms[word], score: Scorer.term }, + { files: titleTerms[word], score: Scorer.title }, + ]; + // add support for partial matches + if (word.length > 2) { + const escapedWord = _escapeRegExp(word); + Object.keys(terms).forEach((term) => { + if (term.match(escapedWord) && !terms[word]) + arr.push({ files: terms[term], score: Scorer.partialTerm }); + }); + Object.keys(titleTerms).forEach((term) => { + if (term.match(escapedWord) && !titleTerms[word]) + arr.push({ files: titleTerms[word], score: Scorer.partialTitle }); + }); + } + + // no match but word was a required one + if (arr.every((record) => record.files === undefined)) return; + + // found search word in contents + arr.forEach((record) => { + if (record.files === undefined) return; + + let recordFiles = record.files; + if (recordFiles.length === undefined) recordFiles = [recordFiles]; + files.push(...recordFiles); + + // set score for the word in each file + recordFiles.forEach((file) => { + if (!scoreMap.has(file)) scoreMap.set(file, {}); + scoreMap.get(file)[word] = record.score; + }); + }); + + // create the mapping + files.forEach((file) => { + if (fileMap.has(file) && fileMap.get(file).indexOf(word) === -1) + fileMap.get(file).push(word); + else fileMap.set(file, [word]); + }); + }); + + // now check if the files don't contain excluded terms + const results = []; + for (const [file, wordList] of fileMap) { + // check if all requirements are matched + + // as search terms with length < 3 are discarded + const filteredTermCount = [...searchTerms].filter( + (term) => term.length > 2 + ).length; + if ( + wordList.length !== searchTerms.size && + wordList.length !== filteredTermCount + ) + continue; + + // ensure that none of the excluded terms is in the search result + if ( + [...excludedTerms].some( + (term) => + terms[term] === file || + titleTerms[term] === file || + (terms[term] || []).includes(file) || + (titleTerms[term] || []).includes(file) + ) + ) + break; + + // select one (max) score for the file. + const score = Math.max(...wordList.map((w) => scoreMap.get(file)[w])); + // add result to the result list + results.push([ + docNames[file], + titles[file], + "", + null, + score, + filenames[file], + ]); + } + return results; + }, + + /** + * helper function to return a node containing the + * search summary for a given text. keywords is a list + * of stemmed words. + */ + makeSearchSummary: (htmlText, keywords) => { + const text = Search.htmlToText(htmlText); + if (text === "") return null; + + const textLower = text.toLowerCase(); + const actualStartPosition = [...keywords] + .map((k) => textLower.indexOf(k.toLowerCase())) + .filter((i) => i > -1) + .slice(-1)[0]; + const startWithContext = Math.max(actualStartPosition - 120, 0); + + const top = startWithContext === 0 ? "" : "..."; + const tail = startWithContext + 240 < text.length ? "..." : ""; + + let summary = document.createElement("p"); + summary.classList.add("context"); + summary.textContent = top + text.substr(startWithContext, 240).trim() + tail; + + return summary; + }, +}; + +_ready(Search.init); diff --git a/docs/_build/html/_static/sphinx_highlight.js b/docs/_build/html/_static/sphinx_highlight.js new file mode 100644 index 0000000..aae669d --- /dev/null +++ b/docs/_build/html/_static/sphinx_highlight.js @@ -0,0 +1,144 @@ +/* Highlighting utilities for Sphinx HTML documentation. */ +"use strict"; + +const SPHINX_HIGHLIGHT_ENABLED = true + +/** + * highlight a given string on a node by wrapping it in + * span elements with the given class name. + */ +const _highlight = (node, addItems, text, className) => { + if (node.nodeType === Node.TEXT_NODE) { + const val = node.nodeValue; + const parent = node.parentNode; + const pos = val.toLowerCase().indexOf(text); + if ( + pos >= 0 && + !parent.classList.contains(className) && + !parent.classList.contains("nohighlight") + ) { + let span; + + const closestNode = parent.closest("body, svg, foreignObject"); + const isInSVG = closestNode && closestNode.matches("svg"); + if (isInSVG) { + span = document.createElementNS("http://www.w3.org/2000/svg", "tspan"); + } else { + span = document.createElement("span"); + span.classList.add(className); + } + + span.appendChild(document.createTextNode(val.substr(pos, text.length))); + parent.insertBefore( + span, + parent.insertBefore( + document.createTextNode(val.substr(pos + text.length)), + node.nextSibling + ) + ); + node.nodeValue = val.substr(0, pos); + + if (isInSVG) { + const rect = document.createElementNS( + "http://www.w3.org/2000/svg", + "rect" + ); + const bbox = parent.getBBox(); + rect.x.baseVal.value = bbox.x; + rect.y.baseVal.value = bbox.y; + rect.width.baseVal.value = bbox.width; + rect.height.baseVal.value = bbox.height; + rect.setAttribute("class", className); + addItems.push({ parent: parent, target: rect }); + } + } + } else if (node.matches && !node.matches("button, select, textarea")) { + node.childNodes.forEach((el) => _highlight(el, addItems, text, className)); + } +}; +const _highlightText = (thisNode, text, className) => { + let addItems = []; + _highlight(thisNode, addItems, text, className); + addItems.forEach((obj) => + obj.parent.insertAdjacentElement("beforebegin", obj.target) + ); +}; + +/** + * Small JavaScript module for the documentation. + */ +const SphinxHighlight = { + + /** + * highlight the search words provided in localstorage in the text + */ + highlightSearchWords: () => { + if (!SPHINX_HIGHLIGHT_ENABLED) return; // bail if no highlight + + // get and clear terms from localstorage + const url = new URL(window.location); + const highlight = + localStorage.getItem("sphinx_highlight_terms") + || url.searchParams.get("highlight") + || ""; + localStorage.removeItem("sphinx_highlight_terms") + url.searchParams.delete("highlight"); + window.history.replaceState({}, "", url); + + // get individual terms from highlight string + const terms = highlight.toLowerCase().split(/\s+/).filter(x => x); + if (terms.length === 0) return; // nothing to do + + // There should never be more than one element matching "div.body" + const divBody = document.querySelectorAll("div.body"); + const body = divBody.length ? divBody[0] : document.querySelector("body"); + window.setTimeout(() => { + terms.forEach((term) => _highlightText(body, term, "highlighted")); + }, 10); + + const searchBox = document.getElementById("searchbox"); + if (searchBox === null) return; + searchBox.appendChild( + document + .createRange() + .createContextualFragment( + '" + ) + ); + }, + + /** + * helper function to hide the search marks again + */ + hideSearchWords: () => { + document + .querySelectorAll("#searchbox .highlight-link") + .forEach((el) => el.remove()); + document + .querySelectorAll("span.highlighted") + .forEach((el) => el.classList.remove("highlighted")); + localStorage.removeItem("sphinx_highlight_terms") + }, + + initEscapeListener: () => { + // only install a listener if it is really needed + if (!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) return; + + document.addEventListener("keydown", (event) => { + // bail for input elements + if (BLACKLISTED_KEY_CONTROL_ELEMENTS.has(document.activeElement.tagName)) return; + // bail with special keys + if (event.shiftKey || event.altKey || event.ctrlKey || event.metaKey) return; + if (DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS && (event.key === "Escape")) { + SphinxHighlight.hideSearchWords(); + event.preventDefault(); + } + }); + }, +}; + +_ready(SphinxHighlight.highlightSearchWords); +_ready(SphinxHighlight.initEscapeListener); diff --git a/docs/_build/html/genindex.html b/docs/_build/html/genindex.html new file mode 100644 index 0000000..f0dffca --- /dev/null +++ b/docs/_build/html/genindex.html @@ -0,0 +1,103 @@ + + + + + + + + Index — monday documentation + + + + + + + + + + + + + + + + +
+
+
+ + +
+ + +

Index

+ +
+ +
+ + +
+ +
+
+ +
+
+ + + + + + + \ No newline at end of file diff --git a/docs/_build/html/index.html b/docs/_build/html/index.html new file mode 100644 index 0000000..4b2dffb --- /dev/null +++ b/docs/_build/html/index.html @@ -0,0 +1,137 @@ + + + + + + + + + Welcome to monday’s documentation! — monday documentation + + + + + + + + + + + + + + + + + +
+ + +
+
+ + + + + + + \ No newline at end of file diff --git a/docs/_build/html/objects.inv b/docs/_build/html/objects.inv new file mode 100644 index 0000000000000000000000000000000000000000..794c94a9d7271ecf243ab6f20c274efc6ecf1f01 GIT binary patch literal 271 zcmY#Z2rkIT%&Sny%qvUHE6FdaR47X=D$dN$Q!wIERtPA{&q_@$u~Nv*&r3u)FOraG=-9k%wmPK%$!sOAf23_TTql*T%4MsP+FXsm#$Ei zlbNK)RdI{EsI=r`X{d&t=SHuS{$UqPLpYeaU!+cX@=W8&v*$}y!ittIf0p`e>5{O9 zsZUkZmOg6`Ipm_~W$Wmp*J89H(?jb}aPg$i#lfOppB6r|%bF3nh9M+;*6dl~lOiU~ zoWK0U)Y + + + + + + Search — monday documentation + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+ +

Search

+ + + + +

+ Searching for multiple words only shows matches that contain + all words. +

+ + +
+ + + +
+ + + +
+ +
+ + +
+ +
+
+ +
+
+ + + + + + + \ No newline at end of file diff --git a/docs/_build/html/searchindex.js b/docs/_build/html/searchindex.js new file mode 100644 index 0000000..4fa2574 --- /dev/null +++ b/docs/_build/html/searchindex.js @@ -0,0 +1 @@ +Search.setIndex({"docnames": ["README", "index"], "filenames": ["README.rst", "index.rst"], "titles": ["monday", "Welcome to monday\u2019s documentation!"], "terms": {"A": 0, "com": 0, "python": 0, "client": 0, "librari": 0, "For": 0, "an": 0, "overview": 0, "api": 0, "click": 0, "here": 0, "3": 0, "6": 0, "pip": 0, "instal": 0, "i": 0, "veri": 0, "simpl": 0, "us": 0, "take": 0, "look": 0, "below": 0, "exampl": 0, "from": 0, "import": 0, "mondaycli": 0, "your": 0, "token": 0, "item": 0, "create_item": 0, "board_id": 0, "12345678": 0, "group_id": 0, "todai": 0, "item_nam": 0, "do": 0, "thing": 0, "avail": 0, "method": 0, "column_valu": 0, "none": 0, "create_labels_if_miss": 0, "fals": 0, "creat": 0, "given": 0, "name": 0, "create_subitem": 0, "parent_item_id": 0, "subitem_nam": 0, "subitem": 0, "underneath": 0, "parent": 0, "return": 0, "error": 0, "you": 0, "re": 0, "try": 0, "add": 0, "doe": 0, "have": 0, "column": 0, "least": 0, "one": 0, "fetch_items_by_column_valu": 0, "column_id": 0, "valu": 0, "fetch": 0, "fetch_items_by_id": 0, "id": 0, "ani": 0, "pass": 0, "arrai": 0, "integ": 0, "change_item_valu": 0, "item_id": 0, "chang": 0, "check": 0, "": 0, "which": 0, "ar": 0, "support": 0, "change_multiple_column_valu": 0, "multipl": 0, "should": 0, "json": 0, "add_file_to_column": 0, "file": 0, "upload": 0, "type": 0, "specifi": 0, "limit": 0, "500mb": 0, "size": 0, "move_item_to_group": 0, "move": 0, "within": 0, "same": 0, "archive_item_by_id": 0, "archiv": 0, "delete_item_by_id": 0, "delet": 0, "create_upd": 0, "update_bodi": 0, "attach": 0, "fetch_upd": 0, "page": [0, 1], "certain": 0, "number": 0, "default": 0, "1": 0, "fetch_updates_for_item": 0, "all": 0, "up": 0, "set": 0, "100": 0, "fetch_tag": 0, "tag_id": 0, "associ": 0, "account": 0, "option": 0, "list": 0, "contain": 0, "know": 0, "them": 0, "color": 0, "fetch_board": 0, "kwarg": 0, "accept": 0, "keyword": 0, "argument": 0, "The": 0, "int": 0, "25": 0, "implement": 0, "pagin": 0, "uniqu": 0, "identifi": 0, "board_kind": 0, "kind": 0, "boardkind": 0, "public": 0, "privat": 0, "share": 0, "state": 0, "boardstat": 0, "activ": 0, "order_bi": 0, "order": 0, "retriev": 0, "boardsorderbi": 0, "created_at": 0, "used_at": 0, "fetch_boards_by_id": 0, "sinc": 0, "allow": 0, "queri": 0, "can": 0, "more": 0, "detail": 0, "info": 0, "about": 0, "comma": 0, "separ": 0, "fetch_columns_by_board_id": 0, "well": 0, "fetch_items_by_board_id": 0, "row": 0, "create_board": 0, "board_nam": 0, "workspace_id": 0, "fetch_us": 0, "inform": 0, "see": 0, "doc": 0, "get_workspac": 0, "create_workspac": 0, "descript": 0, "add_users_to_workspac": 0, "user_id": 0, "delete_users_from_workspac": 0, "add_teams_to_workspac": 0, "team_id": 0, "team": 0, "delete_teams_from_workspac": 0, "get_groups_by_board": 0, "singl": 0, "get_items_by_group": 0, "member": 0, "create_group": 0, "group_nam": 0, "duplicate_group": 0, "duplic": 0, "its": 0, "archive_group": 0, "delete_group": 0, "create_notif": 0, "target_id": 0, "text": 0, "target_typ": 0, "mutat": 0, "trigger": 0, "platform": 0, "also": 0, "send": 0, "out": 0, "email": 0, "recipi": 0, "prefer": 0, "accordingli": 0, "addit": 0, "code": 0, "sampl": 0, "read": 0, "format": 0, "lemi": 0, "boyc": 0, "toni": 0, "morello": 0, "chdastolfo": 0, "lucio": 0, "mitsuru": 0, "seki": 0, "yogesh": 0, "nile": 0, "spencersamuel7": 0, "alb": 0, "c": 0, "pevner": 0, "p2": 0, "taylor": 0, "cochran": 0, "tbd": 0, "requir": 1, "get": 1, "start": 1, "updat": 1, "resourc": 1, "tag": 1, "board": 1, "user": 1, "workspac": 1, "group": 1, "notif": 1, "contributor": 1, "bug": 1, "report": 1, "index": 1, "modul": 1, "search": 1}, "objects": {}, "objtypes": {}, "objnames": {}, "titleterms": {"mondai": [0, 1], "requir": 0, "get": 0, "start": 0, "updat": 0, "resourc": 0, "tag": 0, "board": 0, "user": 0, "workspac": 0, "group": 0, "notif": 0, "contributor": 0, "bug": 0, "report": 0, "welcom": 1, "": 1, "document": 1, "content": 1, "indic": 1, "tabl": 1}, "envversion": {"sphinx.domains.c": 2, "sphinx.domains.changeset": 1, "sphinx.domains.citation": 1, "sphinx.domains.cpp": 8, "sphinx.domains.index": 1, "sphinx.domains.javascript": 2, "sphinx.domains.math": 2, "sphinx.domains.python": 3, "sphinx.domains.rst": 2, "sphinx.domains.std": 2, "sphinx": 57}, "alltitles": {"monday": [[0, "monday"]], "Requirements": [[0, "requirements"]], "Getting started": [[0, "getting-started"]], "Updates Resource (monday.updates)": [[0, "updates-resource-monday-updates"]], "Tags Resource (monday.tags)": [[0, "tags-resource-monday-tags"]], "Boards Resource (monday.boards)": [[0, "boards-resource-monday-boards"]], "Users Resource (monday.users)": [[0, "users-resource-monday-users"]], "Workspaces Resource (monday.workspaces)": [[0, "workspaces-resource-monday-workspaces"]], "Groups Resource (monday.groups)": [[0, "groups-resource-monday-groups"]], "Notifications Resource (monday.notifications)": [[0, "notifications-resource-monday-notifications"]], "Contributors": [[0, "contributors"]], "Bug Reports": [[0, "bug-reports"]], "Welcome to monday\u2019s documentation!": [[1, "welcome-to-monday-s-documentation"]], "Contents:": [[1, null]], "Indices and tables": [[1, "indices-and-tables"]]}, "indexentries": {}}) \ No newline at end of file diff --git a/docs/conf.py b/docs/conf.py new file mode 100644 index 0000000..7262b22 --- /dev/null +++ b/docs/conf.py @@ -0,0 +1,27 @@ +# Configuration file for the Sphinx documentation builder. +# +# For the full list of built-in configuration values, see the documentation: +# https://www.sphinx-doc.org/en/master/usage/configuration.html + +# -- Project information ----------------------------------------------------- +# https://www.sphinx-doc.org/en/master/usage/configuration.html#project-information + +project = 'monday' +copyright = "2023, Christina D'Astolfo, Lemi Boyce" +author = "Christina D'Astolfo, Lemi Boyce" + +# -- General configuration --------------------------------------------------- +# https://www.sphinx-doc.org/en/master/usage/configuration.html#general-configuration + +extensions = [] + +templates_path = ['_templates'] +exclude_patterns = ['_build', 'Thumbs.db', '.DS_Store'] + + + +# -- Options for HTML output ------------------------------------------------- +# https://www.sphinx-doc.org/en/master/usage/configuration.html#options-for-html-output + +html_theme = 'alabaster' +html_static_path = ['_static'] diff --git a/docs/index.rst b/docs/index.rst new file mode 100644 index 0000000..baef355 --- /dev/null +++ b/docs/index.rst @@ -0,0 +1,21 @@ +.. monday documentation master file, created by + sphinx-quickstart on Fri Jan 6 11:43:09 2023. + You can adapt this file completely to your liking, but it should at least + contain the root `toctree` directive. + +Welcome to monday's documentation! +================================== + +.. toctree:: + :maxdepth: 4 + :caption: Contents: + + README + + +Indices and tables +================== + +* :ref:`genindex` +* :ref:`modindex` +* :ref:`search` \ No newline at end of file diff --git a/docs/make.bat b/docs/make.bat new file mode 100644 index 0000000..32bb245 --- /dev/null +++ b/docs/make.bat @@ -0,0 +1,35 @@ +@ECHO OFF + +pushd %~dp0 + +REM Command file for Sphinx documentation + +if "%SPHINXBUILD%" == "" ( + set SPHINXBUILD=sphinx-build +) +set SOURCEDIR=. +set BUILDDIR=_build + +%SPHINXBUILD% >NUL 2>NUL +if errorlevel 9009 ( + echo. + echo.The 'sphinx-build' command was not found. Make sure you have Sphinx + echo.installed, then set the SPHINXBUILD environment variable to point + echo.to the full path of the 'sphinx-build' executable. Alternatively you + echo.may add the Sphinx directory to PATH. + echo. + echo.If you don't have Sphinx installed, grab it from + echo.https://www.sphinx-doc.org/ + exit /b 1 +) + +if "%1" == "" goto help + +%SPHINXBUILD% -M %1 %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O% +goto end + +:help +%SPHINXBUILD% -M help %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O% + +:end +popd From f5cf788490cd3e67c1b6eb99d5fda10d91fe1f81 Mon Sep 17 00:00:00 2001 From: albcl Date: Fri, 15 Sep 2023 18:22:20 +0200 Subject: [PATCH 45/46] Updated README --- docs/README.rst | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/docs/README.rst b/docs/README.rst index 2390b4d..1eec07f 100644 --- a/docs/README.rst +++ b/docs/README.rst @@ -124,6 +124,13 @@ Boards Resource (monday.boards) - ``create_board(board_name, board_kind, workspace_id)`` - Create board with the given name and kind by (and optional) workspace id. +- ``duplicate_board(board_id, duplicate_type, board_name, workspace_id, folder_id, keep_subscribers)`` - Duplicate a + board by its id. It requires a duplication type to be chosen (*duplicate_board_with_structure / duplicate_board_with_pulses / duplicate_board_with_pulses_and_updates*). Optionaly you can use: + - ``board_name`` - The duplicated board's name (*string*). + - ``workspace_id`` - The destination workspace (*int* Defaults to the original board's workspace). + - ``folder_id`` - The destination folder within the destination workspace. The folder_id is required if you are duplicating to another workspace. (*int* Defaults to originals board's folder). + - ``keep_subscribers`` - Ability to duplicate the subscribers to the new board (*Boolean* Defaults to false). + Users Resource (monday.users) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ From 77c9ca38eb0e89a8c80a946779986ecce5ea99ea Mon Sep 17 00:00:00 2001 From: albcl Date: Fri, 15 Sep 2023 18:28:11 +0200 Subject: [PATCH 46/46] fix/ missing query after rebasing --- monday/query_joins.py | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/monday/query_joins.py b/monday/query_joins.py index 5ce1af7..fcfc0a4 100644 --- a/monday/query_joins.py +++ b/monday/query_joins.py @@ -381,6 +381,26 @@ def get_boards_by_id_query(board_ids): }''' % board_ids +def get_columns_by_board_query(board_ids): + return '''query + { + boards(ids: %s) { + id + name + groups { + id + title + } + columns { + title + id + type + settings_str + } + } + }''' % board_ids + + def duplicate_board_query( board_id: int, duplicate_type: DuplicateTypes,