Skip to content
Merged
Show file tree
Hide file tree
Changes from 5 commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
# confluence-cli
来栖川電算が利用しているConfluence v6.15.7を操作するためのCLIです。
Confluence v6.15.7を操作するためのCLIです。


[![Build Status](https://app.travis-ci.com/kurusugawa-computer/confluence-cli.svg?branch=main)](https://app.travis-ci.com/kurusugawa-computer/confluence-cli)
[![Test](https://github.com/kurusugawa-computer/confluence-cli/actions/workflows/test.yml/badge.svg)](https://github.com/kurusugawa-computer/confluence-cli/actions/workflows/test.yml)
[![PyPI version](https://badge.fury.io/py/kci-confluence-cli.svg)](https://badge.fury.io/py/kci-confluence-cli)
[![Python Versions](https://img.shields.io/pypi/pyversions/kci-confluence-cli.svg)](https://pypi.org/project/kci-confluence-cli/)
[![Documentation Status](https://readthedocs.org/projects/confluence-cli/badge/?version=latest)](https://confluence-cli.readthedocs.io/ja/latest/?badge=latest)
Expand All @@ -29,7 +29,7 @@ export CONFLUENCE_BASE_URL="https://your-domain.com/confluence"
ページ本文を取得:

```bash
$ confluence page get_body --page_id 12345
$ confluence page get_body --page_id 123456
```

# Documentation
Expand Down
3 changes: 1 addition & 2 deletions confluence/__main__.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@
import argparse
import logging
from collections.abc import Sequence
from typing import Optional

import confluence
import confluence.attachment.subcommand
Expand All @@ -30,7 +29,7 @@ def create_parser() -> argparse.ArgumentParser:
return parser


def main(arguments: Optional[Sequence[str]] = None): # noqa: ANN201
def main(arguments: Sequence[str] | None = None): # noqa: ANN201
parser = create_parser()
if arguments is None:
args = parser.parse_args()
Expand Down
12 changes: 6 additions & 6 deletions confluence/attachment/create_attachment.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
from pathlib import Path
from typing import Any

import confluence
from confluence.common import cli
from confluence.common.api import Api
from confluence.common.cli import create_api_instance

Expand All @@ -27,9 +27,9 @@ def create_attachments_from_file_list(

try:
api.create_attachment(content_id, file, query_params=query_params, mime_type=mime_type)
logger.debug(f"{index+1}件目: '{file}'をアップロードしました。")
logger.debug(f"{index + 1}件目: '{file}'をアップロードしました。")
if (index + 1) % 10 == 0:
logger.info(f"{index+1}件目のファイルのアップロードが完了しました。")
logger.info(f"{index + 1}件目のファイルのアップロードが完了しました。")

except Exception:
logger.warning(f"'{file}'のアップロードに失敗しました。", exc_info=True)
Expand Down Expand Up @@ -62,9 +62,9 @@ def create_attachments_from_directory(
for index, file in enumerate(files):
try:
api.create_attachment(content_id, file, query_params=query_params, mime_type=mime_type)
logger.debug(f"{index+1}件目: '{file}'をアップロードしました。")
logger.debug(f"{index + 1}件目: '{file}'をアップロードしました。")
if (index + 1) % 10 == 0:
logger.info(f"{index+1}件目のファイルのアップロードが完了しました。")
logger.info(f"{index + 1}件目のファイルのアップロードが完了しました。")

except Exception:
logger.warning(f"'{file}'のアップロードに失敗しました。", exc_info=True)
Expand Down Expand Up @@ -107,7 +107,7 @@ def add_parser(subparsers: argparse._SubParsersAction | None = None) -> argparse
subcommand_name = "create"
subcommand_help = "添付ファイルを作成します。"

parser = confluence.common.cli.add_parser(subparsers, subcommand_name, subcommand_help)
parser = cli.add_parser(subparsers, subcommand_name, subcommand_help)

add_arguments_to_parser(parser)
return parser
10 changes: 5 additions & 5 deletions confluence/attachment/delete_attachment.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
import logging
from typing import Any

import confluence
from confluence.common import cli
from confluence.common.api import Api
from confluence.common.cli import create_api_instance, prompt_yesnoall

Expand Down Expand Up @@ -54,15 +54,15 @@ def main(args: argparse.Namespace) -> None:

yes, all_yes = prompt_yesnoall(confirm_message)
if yes or all_yes:
logger.debug(f"{index+1}件目: id='{attachment_id}', title='{attachment_title}'をゴミ箱に移動します。 ")
logger.debug(f"{index + 1}件目: id='{attachment_id}', title='{attachment_title}'をゴミ箱に移動します。 ")
api.delete_content(attachment_id, query_params={"status": "current"})
if is_purged:
logger.debug(f"{index+1}件目: id='{attachment_id}', title='{attachment_title}'をゴミ箱から完全に削除します。 ")
logger.debug(f"{index + 1}件目: id='{attachment_id}', title='{attachment_title}'をゴミ箱から完全に削除します。 ")
api.delete_content(attachment_id, query_params={"status": "trashed"})
success_count += 1

except Exception:
logger.warning(f"{index+1}件目: id='{attachment_id}', title='{attachment_title}'の削除に失敗しました。", exc_info=True)
logger.warning(f"{index + 1}件目: id='{attachment_id}', title='{attachment_title}'の削除に失敗しました。", exc_info=True)
continue

logger.info(f"{success_count}/{len(results)} 件の添付ファイルを削除しました。")
Expand All @@ -81,7 +81,7 @@ def add_parser(subparsers: argparse._SubParsersAction | None = None) -> argparse
subcommand_name = "delete"
subcommand_help = "添付ファイルを削除します。"

parser = confluence.common.cli.add_parser(subparsers, subcommand_name, subcommand_help)
parser = cli.add_parser(subparsers, subcommand_name, subcommand_help)

add_arguments_to_parser(parser)
return parser
4 changes: 2 additions & 2 deletions confluence/attachment/get_attachment.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
from pathlib import Path
from typing import Any

import confluence
from confluence.common import cli
from confluence.common.cli import create_api_instance
from confluence.common.utils import print_json

Expand Down Expand Up @@ -49,7 +49,7 @@ def add_parser(subparsers: argparse._SubParsersAction | None = None) -> argparse
subcommand_name = "get"
subcommand_help = "添付ファイルの情報を取得します。"

parser = confluence.common.cli.add_parser(subparsers, subcommand_name, subcommand_help)
parser = cli.add_parser(subparsers, subcommand_name, subcommand_help)

add_arguments_to_parser(parser)
return parser
6 changes: 3 additions & 3 deletions confluence/attachment/subcommand.py
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
from __future__ import annotations

import argparse
from typing import Optional

import confluence
import confluence.attachment.create_attachment
import confluence.attachment.delete_attachment
import confluence.attachment.get_attachment
from confluence.common import cli


def add_arguments_to_parser(parser: argparse.ArgumentParser): # noqa: ANN201
Expand All @@ -18,10 +18,10 @@ def add_arguments_to_parser(parser: argparse.ArgumentParser): # noqa: ANN201
confluence.attachment.get_attachment.add_parser(subparsers)


def add_parser(subparsers: Optional[argparse._SubParsersAction] = None) -> argparse.ArgumentParser:
def add_parser(subparsers: argparse._SubParsersAction | None = None) -> argparse.ArgumentParser:
subcommand_name = "attachment"
subcommand_help = "添付ファイルに関するサブコマンド"

parser = confluence.common.cli.add_parser(subparsers, subcommand_name, subcommand_help, description=subcommand_help, is_subcommand=False)
parser = cli.add_parser(subparsers, subcommand_name, subcommand_help, description=subcommand_help, is_subcommand=False)
add_arguments_to_parser(parser)
return parser
24 changes: 11 additions & 13 deletions confluence/common/api.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
import mimetypes
import time
from pathlib import Path
from typing import Any, Optional
from typing import Any

from requests_toolbelt import sessions

Expand Down Expand Up @@ -53,8 +53,8 @@ def _request(
http_method: str,
url: str,
*,
headers: Optional[dict[str, Any]] = None,
params: Optional[QueryParams] = None,
headers: dict[str, Any] | None = None,
params: QueryParams | None = None,
data: Any = None, # noqa: ANN401
**kwargs,
) -> Any: # noqa: ANN401
Expand Down Expand Up @@ -101,12 +101,12 @@ def _request(
response.raise_for_status()
return response

def get_attachments(self, content_id: str, *, query_params: Optional[QueryParams] = None) -> dict[str, Any]:
def get_attachments(self, content_id: str, *, query_params: QueryParams | None = None) -> dict[str, Any]:
url = f"content/{content_id}/child/attachment"
return self._request("get", url, params=query_params).json()

def create_attachment(
self, content_id: str, file: Path, *, query_params: Optional[QueryParams] = None, mime_type: Optional[str] = None
self, content_id: str, file: Path, *, query_params: QueryParams | None = None, mime_type: str | None = None
) -> dict[str, Any]:
"""
Args:
Expand All @@ -122,33 +122,31 @@ def create_attachment(
files = {"file": (file.name, f, new_mime_type)}
return self._request("post", url, params=query_params, files=files, headers=headers).json()

def get_content(self, *, query_params: Optional[QueryParams] = None) -> list[dict[str, Any]]:
def get_content(self, *, query_params: QueryParams | None = None) -> list[dict[str, Any]]:
"""
Returns a paginated list of Content.

https://docs.atlassian.com/ConfluenceServer/rest/6.15.7/#api/content-getContent
"""
return self._request("get", "content", params=query_params).json()

def get_content_by_id(self, content_id: str, *, query_params: Optional[QueryParams] = None) -> dict[str, Any]:
def get_content_by_id(self, content_id: str, *, query_params: QueryParams | None = None) -> dict[str, Any]:
"""
Returns a piece of Content.

https://docs.atlassian.com/ConfluenceServer/rest/6.15.7/#api/content-getContentById
"""
return self._request("get", f"content/{content_id}", params=query_params).json()

def update_content(
self, content_id: str, *, query_params: Optional[QueryParams] = None, request_body: Optional[RequestBody] = None
) -> dict[str, Any]:
def update_content(self, content_id: str, *, query_params: QueryParams | None = None, request_body: RequestBody | None = None) -> dict[str, Any]:
"""
Updates a piece of Content, including changes to content status

https://docs.atlassian.com/ConfluenceServer/rest/6.15.7/#api/content-update
"""
return self._request("put", f"content/{content_id}", params=query_params, json=request_body).json()

def delete_content(self, content_id: str, *, query_params: Optional[QueryParams] = None) -> None:
def delete_content(self, content_id: str, *, query_params: QueryParams | None = None) -> None:
"""
Trashes or purges a piece of Content, based on its {@link ContentType} and {@link ContentStatus}.

Expand All @@ -159,14 +157,14 @@ def delete_content(self, content_id: str, *, query_params: Optional[QueryParams]
"""
self._request("delete", f"content/{content_id}", params=query_params)

def get_content_history(self, content_id: str, *, query_params: Optional[QueryParams] = None): # noqa: ANN201
def get_content_history(self, content_id: str, *, query_params: QueryParams | None = None): # noqa: ANN201
"""Returns the history of a particular piece of content

https://docs.atlassian.com/ConfluenceServer/rest/6.15.7/#api/content-getHistory
"""
return self._request("get", f"content/{content_id}/history", params=query_params).json()

def search_content(self, *, query_params: Optional[QueryParams] = None) -> dict[str, Any]:
def search_content(self, *, query_params: QueryParams | None = None) -> dict[str, Any]:
"""
Fetch a list of content using the Confluence Query Language (CQL)

Expand Down
10 changes: 4 additions & 6 deletions confluence/common/cli.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,6 @@
import getpass
import logging
import os
from typing import Optional

from more_itertools import first_true

Expand Down Expand Up @@ -53,12 +52,12 @@ def _get_help_string(self, action) -> str: # noqa: ANN001


def add_parser(
subparsers: Optional[argparse._SubParsersAction],
subparsers: argparse._SubParsersAction | None,
command_name: str,
command_help: str,
description: Optional[str] = None,
description: str | None = None,
is_subcommand: bool = True,
epilog: Optional[str] = None,
epilog: str | None = None,
) -> argparse.ArgumentParser:
"""
サブコマンド用にparserを追加する
Expand Down Expand Up @@ -215,8 +214,7 @@ def get_confluence_base_url_from_stdin() -> str:

def format_url(url: str) -> str:
url = url.strip()
if url.endswith("/"):
url = url[:-1]
url = url.removesuffix("/")
return url

confluence_base_url = args.confluence_base_url
Expand Down
6 changes: 3 additions & 3 deletions confluence/common/utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
import logging.config
import pkgutil
from pathlib import Path
from typing import Any, Optional, TypeVar
from typing import Any, TypeVar

import yaml

Expand All @@ -28,7 +28,7 @@ def read_lines_except_blank_line(filepath: str) -> list[str]:
return [line for line in lines if line != ""]


def output_string(target: str, output: Optional[Path] = None) -> None:
def output_string(target: str, output: Path | None = None) -> None:
"""
文字列を出力する。

Expand All @@ -45,7 +45,7 @@ def output_string(target: str, output: Optional[Path] = None) -> None:
logger.info(f"{output} に出力しました。")


def print_json(target: Any, is_pretty: bool = False, output: Optional[Path] = None) -> None: # noqa: ANN401
def print_json(target: Any, is_pretty: bool = False, output: Path | None = None) -> None: # noqa: ANN401
"""
JSONを出力する。

Expand Down
4 changes: 2 additions & 2 deletions confluence/content/get_content_by_id.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
import logging
from pathlib import Path

import confluence
from confluence.common import cli
from confluence.common.cli import create_api_instance
from confluence.common.utils import print_json

Expand All @@ -31,7 +31,7 @@ def add_parser(subparsers: argparse._SubParsersAction | None = None) -> argparse
subcommand_name = "get_by_id"
subcommand_help = "コンテンツの情報を取得します。"

parser = confluence.common.cli.add_parser(subparsers, subcommand_name, subcommand_help)
parser = cli.add_parser(subparsers, subcommand_name, subcommand_help)

add_arguments_to_parser(parser)
return parser
6 changes: 3 additions & 3 deletions confluence/content/subcommand.py
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
from __future__ import annotations

import argparse
from typing import Optional

import confluence
import confluence.content.get_content_by_id
from confluence.common import cli


def add_arguments_to_parser(parser: argparse.ArgumentParser): # noqa: ANN201
Expand All @@ -14,10 +14,10 @@ def add_arguments_to_parser(parser: argparse.ArgumentParser): # noqa: ANN201
confluence.content.get_content_by_id.add_parser(subparsers)


def add_parser(subparsers: Optional[argparse._SubParsersAction] = None) -> argparse.ArgumentParser:
def add_parser(subparsers: argparse._SubParsersAction | None = None) -> argparse.ArgumentParser:
subcommand_name = "content"
subcommand_help = "コンテンツ(ページ、ブログ、添付ファイルなど)に関するサブコマンド"

parser = confluence.common.cli.add_parser(subparsers, subcommand_name, subcommand_help, description=subcommand_help, is_subcommand=False)
parser = cli.add_parser(subparsers, subcommand_name, subcommand_help, description=subcommand_help, is_subcommand=False)
add_arguments_to_parser(parser)
return parser
3 changes: 1 addition & 2 deletions confluence/local/subcommand.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
from __future__ import annotations

import argparse
from typing import Optional

import confluence
import confluence.attachment.get_attachment
Expand All @@ -15,7 +14,7 @@ def add_arguments_to_parser(parser: argparse.ArgumentParser): # noqa: ANN201
confluence.local.convert_html_to_xml.add_parser(subparsers)


def add_parser(subparsers: Optional[argparse._SubParsersAction] = None) -> argparse.ArgumentParser:
def add_parser(subparsers: argparse._SubParsersAction | None = None) -> argparse.ArgumentParser:
subcommand_name = "local"
subcommand_help = "Confluenceにアクセスせずにローカル上で完結するコマンド"

Expand Down
Loading
Loading