From 1f1f5f0d868ebee513260f6f440e72fdb0b0ecee Mon Sep 17 00:00:00 2001 From: HitBlast Date: Sat, 27 Jan 2024 12:16:51 +0600 Subject: [PATCH 1/8] updated workflows and configurations --- .github/workflows/formatting.yml | 50 ++++++++++++++++++++++++ .github/workflows/linting.yml | 50 ++++++++++++++++++++++++ .github/workflows/stylecheck.yml | 65 -------------------------------- .vscode/settings.json | 18 +++++---- 4 files changed, 110 insertions(+), 73 deletions(-) create mode 100644 .github/workflows/formatting.yml create mode 100644 .github/workflows/linting.yml delete mode 100644 .github/workflows/stylecheck.yml diff --git a/.github/workflows/formatting.yml b/.github/workflows/formatting.yml new file mode 100644 index 0000000..6c0c887 --- /dev/null +++ b/.github/workflows/formatting.yml @@ -0,0 +1,50 @@ +# SPDX-License-Identifier: MIT + +name: Format + +on: + push: + branches: + - main + pull_request: + branches: + - main + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + +jobs: + ruff: + name: Ruff + runs-on: ubuntu-latest + + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Check + id: formatcheck + uses: chartboost/ruff-action@v1 + continue-on-error: true + with: + args: format --check . + + - name: Format + uses: chartboost/ruff-action@v1 + with: + args: format . + + - name: Create pull request + if: steps.formatcheck.outcome != 'success' + uses: peter-evans/create-pull-request@v5 + with: + token: ${{ secrets.GITHUB_TOKEN }} + title: "🎨 Automated formatting errors fix" + commit-message: "fixed formatting errors (ruff)" + body: | + Formatter errors found in: ${{ github.sha }}. + base: ${{ github.head_ref }} + branch: actions/ruff + reviewers: hitblast + delete-branch: true \ No newline at end of file diff --git a/.github/workflows/linting.yml b/.github/workflows/linting.yml new file mode 100644 index 0000000..c509a35 --- /dev/null +++ b/.github/workflows/linting.yml @@ -0,0 +1,50 @@ +# SPDX-License-Identifier: MIT + +name: Lint + +on: + push: + branches: + - main + pull_request: + branches: + - main + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + +jobs: + ruff: + name: Ruff + runs-on: ubuntu-latest + + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Check + id: lintcheck + uses: chartboost/ruff-action@v1 + continue-on-error: true + with: + args: check . + + - name: Lint + uses: chartboost/ruff-action@v1 + with: + args: check . --fix + + - name: Create pull request + if: steps.lintcheck.outcome != 'success' + uses: peter-evans/create-pull-request@v5 + with: + token: ${{ secrets.GITHUB_TOKEN }} + title: "🎨 Automated linting errors fix" + commit-message: "fixed linting errors (ruff)" + body: | + Linter errors found in: ${{ github.sha }}. + base: ${{ github.head_ref }} + branch: actions/ruff + reviewers: hitblast + delete-branch: true \ No newline at end of file diff --git a/.github/workflows/stylecheck.yml b/.github/workflows/stylecheck.yml deleted file mode 100644 index 34e4d12..0000000 --- a/.github/workflows/stylecheck.yml +++ /dev/null @@ -1,65 +0,0 @@ -# SPDX-License-Identifier: MIT - -name: Style Check - -on: - push: - branches: - - main - pull_request: - branches: - - main - -concurrency: - group: ${{ github.workflow }}-${{ github.ref }} - cancel-in-progress: true - -jobs: - linting: - name: Ruff - runs-on: ubuntu-latest - - steps: - - name: Checkout - uses: actions/checkout@v3 - - - name: Run Ruff - uses: chartboost/ruff-action@v1 - - formatting: - name: Black - - runs-on: ubuntu-latest - needs: [linting] - - steps: - - name: Checkout - uses: actions/checkout@v3 - - - name: Check - id: checkifneeded - uses: psf/black@stable - with: - options: "--check --verbose" - version: "~= 23.0" - continue-on-error: true - - - name: Format - uses: psf/black@stable - with: - options: "--verbose" - version: "~= 23.0" - - - name: Create pull request - if: steps.checkifneeded.outcome != 'success' - uses: peter-evans/create-pull-request@v4 - with: - token: ${{ secrets.GITHUB_TOKEN }} - title: "🎨 [tuning] Resolved formatting errors" - commit-message: "format code using psf/black" - body: | - Formatter errors found in: ${{ github.sha }}. - base: ${{ github.head_ref }} - branch: actions/black - reviewers: hitblast - delete-branch: true diff --git a/.vscode/settings.json b/.vscode/settings.json index 7425cdd..cf81513 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,11 +1,13 @@ // SPDX-License-Identifier: MIT + { - "[python]": { - "editor.codeActionsOnSave": { - "source.fixAll.ruff": true, - "source.organizeImports.ruff": true - }, - "editor.formatOnSave": true - }, - "python.formatting.provider": "black" + "[python]": { + "editor.formatOnSave": true, + "editor.codeActionsOnSave": { + "source.fixAll.ruff": "explicit", + "source.organizeImports.ruff": "explicit" + }, + "editor.defaultFormatter": "charliermarsh.ruff", + }, + "ruff.importStrategy": "fromEnvironment" } \ No newline at end of file From 04e8fb7b7195366b0e51e1848dc4e72d571cbd1d Mon Sep 17 00:00:00 2001 From: HitBlast Date: Sat, 27 Jan 2024 12:19:40 +0600 Subject: [PATCH 2/8] updated configurations --- pyproject.toml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 186cf4e..f0953b2 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,14 +1,14 @@ # SPDX-License-Identifier: MIT -[tool.black] -line-length = 100 -skip-string-normalization = true - [tool.ruff] target-version = "py311" line-length = 100 +exclude = ["venv"] [tool.ruff.per-file-ignores] "core/__init__.py" = ["F401", "F403"] "core/global_.py" = ["F841"] -"cogs/customization.py" = ["E203"] \ No newline at end of file +"cogs/customization.py" = ["E203"] + +[tool.ruff.format] +quote-style = "single" \ No newline at end of file From 6043b834997c6e3527dbe41ca1b32fc69815ec50 Mon Sep 17 00:00:00 2001 From: HitBlast Date: Sat, 27 Jan 2024 12:25:20 +0600 Subject: [PATCH 3/8] updated requirements --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index fe7ac51..27c95f0 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,7 +1,7 @@ # SPDX-License-Identifier: MIT +async-timeout==4.0.3 disnake[voice]==2.9.1 python-decouple==3.8 spotipy==2.23.0 yt-dlp==2023.12.30 -async-timeout==4.0.3 From e6d92414cf92fc2c7b14e6a9c0b0ab1d43aea3e3 Mon Sep 17 00:00:00 2001 From: hitblast Date: Sat, 27 Jan 2024 06:25:42 +0000 Subject: [PATCH 4/8] fixed formatting errors (ruff) --- cogs/customization.py | 2 +- cogs/exceptionhandler.py | 10 +++++----- cogs/general.py | 10 +++++----- cogs/inspection.py | 2 +- cogs/moderation.py | 2 +- cogs/music.py | 43 ++++++++++++++++++++-------------------- core/__init__.py | 4 ++-- core/bot.py | 8 ++++---- core/datacls.py | 4 ++-- core/ui.py | 16 +++++++-------- 10 files changed, 50 insertions(+), 51 deletions(-) diff --git a/cogs/customization.py b/cogs/customization.py index 7c7ffe2..e65f065 100644 --- a/cogs/customization.py +++ b/cogs/customization.py @@ -100,7 +100,7 @@ async def _unassignrole( role: disnake.Role = Param(description='Mention the role to remove from the user.'), ) -> None: if role not in member.roles: - return await inter.send('The member doesn\'t has this role.', ephemeral=True) + return await inter.send("The member doesn't has this role.", ephemeral=True) await member.remove_roles(role) await inter.send(f'Role {role.mention} has been removed from **{member.display_name}**!') diff --git a/cogs/exceptionhandler.py b/cogs/exceptionhandler.py index 53abc49..f9a1a5d 100644 --- a/cogs/exceptionhandler.py +++ b/cogs/exceptionhandler.py @@ -18,17 +18,17 @@ def __init__(self, bot: core.IgKnite) -> None: def get_view(self, inter: disnake.CommandInter) -> core.SmallView: view = core.SmallView(inter).add_button( - label='Think it\'s a bug?', + label="Think it's a bug?", url=core.BotData.repo + '/issues/new?template=bug.yml', style=disnake.ButtonStyle.red, ) return view async def process_error(self, inter: disnake.CommandInter, error: Any) -> None: - ''' + """ A method for processing the exceptions caused in interaction commands and responding accordingly. - ''' + """ error = getattr(error, 'original', error) embed = core.TypicalEmbed(inter=inter, is_error=True) @@ -37,13 +37,13 @@ async def process_error(self, inter: disnake.CommandInter, error: Any) -> None: if isinstance(error, commands.errors.MissingPermissions) or isinstance( error, errors.Forbidden ): - embed.title = 'Nice try! I don\'t have permission to do that.' + embed.title = "Nice try! I don't have permission to do that." # MissingRole elif isinstance(error, commands.errors.MissingRole) or isinstance( error, commands.errors.MissingAnyRole ): - embed.title = 'Oops! You\'re missing a role.' + embed.title = "Oops! You're missing a role." # Anything else... else: diff --git a/cogs/general.py b/cogs/general.py index 7ddc8a1..769625c 100644 --- a/cogs/general.py +++ b/cogs/general.py @@ -71,7 +71,7 @@ async def on_raw_reaction_add(self, payload: disnake.RawReactionActionEvent) -> chnl = self.bot.get_channel(payload.channel_id) msg = disnake.utils.get(await chnl.history(limit=5).flatten(), id=payload.message_id) embed = core.TypicalEmbed( - title='You\'ve bookmarked a message.', + title="You've bookmarked a message.", description=msg.content + f'\n\nSent by {msg.author.name} ' + f'on {payload.member.guild.name}', @@ -84,7 +84,7 @@ async def on_raw_reaction_add(self, payload: disnake.RawReactionActionEvent) -> async def _avatar_backend( self, inter: disnake.CommandInter, member: disnake.Member = None ) -> None: - embed = core.TypicalEmbed(inter=inter, title='Here\'s what I found!').set_image( + embed = core.TypicalEmbed(inter=inter, title="Here's what I found!").set_image( url=member.avatar ) @@ -122,9 +122,9 @@ async def _ping(self, inter: disnake.CommandInter) -> None: async def help(self, inter: disnake.CommandInter): embed = core.TypicalEmbed( inter, - title='Hey there! I\'m IgKnite.', - description='I\'m a bot with no text commands (you heard that right) ' - + 'and I\'m here to help you manage and moderate your Discord server alongside ' + title="Hey there! I'm IgKnite.", + description="I'm a bot with no text commands (you heard that right) " + + "and I'm here to help you manage and moderate your Discord server alongside " + 'having a midnight music party with your friends in a random voice channel. ' + 'Looking forward to being friends with you!', disabled_footer=True, diff --git a/cogs/inspection.py b/cogs/inspection.py index 856d80c..f038674 100644 --- a/cogs/inspection.py +++ b/cogs/inspection.py @@ -125,7 +125,7 @@ async def _userinfo_backend(self, inter: disnake.CommandInter, member: disnake.M ), ) .add_field(name='On Mobile', value=member.is_on_mobile()) - .add_field(name='Race', value="Bot" if member.bot else "Human") + .add_field(name='Race', value='Bot' if member.bot else 'Human') .add_field(name='Roles', value=len(member.roles)) .add_field(name='Position', value=member.top_role.mention) .add_field(name='Identifier', value=member.id) diff --git a/cogs/moderation.py b/cogs/moderation.py index 829e38a..80a4fc6 100644 --- a/cogs/moderation.py +++ b/cogs/moderation.py @@ -454,7 +454,7 @@ async def _showbannedwords(self, inter: disnake.CommandInter) -> None: if rule.name == 'IgKnite Banwords': words += (f'{item} \n' for item in rule.trigger_metadata.keyword_filter) embed = core.TypicalEmbed( - inter, title='Here\'s the list of banned words:', description=words + inter, title="Here's the list of banned words:", description=words ) await inter.send(embed=embed) diff --git a/cogs/music.py b/cogs/music.py index e477a99..0484528 100644 --- a/cogs/music.py +++ b/cogs/music.py @@ -117,7 +117,7 @@ async def create_source( data = await loop.run_in_executor(None, partial) if data is None: - raise YTDLError(f'Anything matching **{search}** couldn\'t be found.') + raise YTDLError(f"Anything matching **{search}** couldn't be found.") if 'entries' not in data: process_info = data @@ -130,14 +130,14 @@ async def create_source( break if process_info is None: - raise YTDLError(f'Anything matching **{search}** couldn\'t be found.') + raise YTDLError(f"Anything matching **{search}** couldn't be found.") webpage_url = process_info['webpage_url'] partial = functools.partial(cls.ytdl.extract_info, webpage_url, download=False) processed_info = await loop.run_in_executor(None, partial) if processed_info is None: - raise YTDLError(f'Couldn\'t fetch **{webpage_url}**') + raise YTDLError(f"Couldn't fetch **{webpage_url}**") if 'entries' not in processed_info: info = processed_info @@ -148,7 +148,7 @@ async def create_source( try: info = processed_info['entries'].pop(0) except IndexError: - raise YTDLError(f'Any matches for {webpage_url} couldn\'t be retrieved.') + raise YTDLError(f"Any matches for {webpage_url} couldn't be retrieved.") return cls(inter, disnake.FFmpegPCMAudio(info['url'], **cls.FFMPEG_OPTIONS), data=info) @@ -174,9 +174,9 @@ def parse_duration(duration: int) -> str: # YTDLSource class with equalized playback. # Note: This feature is still work-in-progress and the audio filters need to be improved. class YTDLSourceBoosted(YTDLSource): - ''' + """ A child class of `YTDLSource` for serving equalized playback. - ''' + """ FFMPEG_OPTIONS = { 'before_options': '-reconnect 1 -reconnect_streamed 1 -reconnect_delay_max 5', @@ -532,9 +532,9 @@ async def on_voice_state_update( state.voice.resume() def _init_voice_state(self, inter: disnake.CommandInter) -> VoiceState: - ''' + """ A method that initializes the `VoiceState` object for a specific guild. - ''' + """ state = self.voice_states.get(inter.guild.id) @@ -551,17 +551,17 @@ async def _ensure_voice_safety( skip_self: bool = False, ignore_lock: bool = False, ) -> Any | None: - ''' + """ A coroutine for ensuring proper voice safety during playback. - ''' + """ if (not skip_self) and (not inter.voice_state.voice): - return await inter.send('I\'m not inside any voice channel.') + return await inter.send("I'm not inside any voice channel.") elif ( not inter.author.voice or inter.author.voice.channel != inter.voice_state.voice.channel ): - return await inter.send('You\'re not in my voice channel.') + return await inter.send("You're not in my voice channel.") elif ( not ignore_lock @@ -623,15 +623,14 @@ async def cog_before_user_command_invoke(self, inter: disnake.CommandInter) -> N # join @commands.slash_command( name='join', - description='Joins the voice channel you\'re in. ' + description="Joins the voice channel you're in. " + 'You can also specify which channel to join.', dm_permission=False, ) async def _join( self, inter: disnake.CommandInter, - channel: disnake.VoiceChannel - | disnake.StageChannel = Param( + channel: disnake.VoiceChannel | disnake.StageChannel = Param( description='Specify a channel to join.', default=None, channel_types=[ChannelType.voice, ChannelType.stage_voice], @@ -674,7 +673,7 @@ async def _volume( if not await self._ensure_voice_safety(inter): return elif not inter.voice_state.is_playing: - return await inter.send('There\'s nothing being played at the moment.') + return await inter.send("There's nothing being played at the moment.") inter.voice_state.current.source.volume = (vol_mod := volume / 100) inter.voice_state.volume = vol_mod @@ -709,7 +708,7 @@ async def _now(self, inter: disnake.CommandInter) -> None: embed, view = inter.voice_state.current.create_embed(inter) await inter.send(embed=embed, view=view) else: - await inter.send('There\'s nothing being played at the moment.') + await inter.send("There's nothing being played at the moment.") # pause @commands.slash_command( @@ -725,7 +724,7 @@ async def _pause(self, inter: disnake.CommandInter) -> None: inter.voice_state.voice.pause() await inter.send('Paused voice state.') else: - await inter.send('There\'s nothing being played at the moment.') + await inter.send("There's nothing being played at the moment.") # resume @commands.slash_command( @@ -741,7 +740,7 @@ async def _resume(self, inter: disnake.CommandInter) -> None: inter.voice_state.voice.resume() await inter.send('Resumed voice state.') else: - await inter.send('Playback isn\'t paused to be resumed in the first place.') + await inter.send("Playback isn't paused to be resumed in the first place.") # stop @commands.slash_command( @@ -772,7 +771,7 @@ async def _skip(self, inter: disnake.CommandInter) -> None: if not await self._ensure_voice_safety(inter): return elif not inter.voice_state.is_playing: - return await inter.send('There\'s nothing being played at the moment.') + return await inter.send("There's nothing being played at the moment.") if inter.voice_state.loop: inter.voice_state.loop = not inter.voice_state.loop @@ -804,7 +803,7 @@ async def _skip(self, inter: disnake.CommandInter) -> None: # queue @commands.slash_command( - name='queue', description='Shows the player\'s queue.', dm_permission=False + name='queue', description="Shows the player's queue.", dm_permission=False ) async def _queue(self, inter: disnake.CommandInter) -> None: if not await self._ensure_voice_safety(inter, ignore_lock=True): @@ -1022,7 +1021,7 @@ async def _playrich_backend(self, inter: disnake.CommandInter, member: disnake.M # playrich (slash) @commands.slash_command( name='playrich', - description='Tries to enqueue a song from one\'s Spotify rich presence.', + description="Tries to enqueue a song from one's Spotify rich presence.", dm_permission=False, ) async def _playrich( diff --git a/core/__init__.py b/core/__init__.py index d45327e..98cfcb9 100644 --- a/core/__init__.py +++ b/core/__init__.py @@ -18,9 +18,9 @@ # Set bot metadata. @dataclass(frozen=True) class BotData: - ''' + """ A dataclass used for storing bot metadata. - ''' + """ repo: str = 'https://github.com/IgKniteDev/IgKnite' documentation: str = 'https://igknitedev.github.io/docs' diff --git a/core/bot.py b/core/bot.py index 9e9ec85..163accd 100644 --- a/core/bot.py +++ b/core/bot.py @@ -13,10 +13,10 @@ # Set up a custom class for core functionality. class IgKnite(commands.AutoShardedInteractionBot): - ''' + """ A subclassed version of `commands.AutoShardedInteractionBot`.\n Basically works as the core class for all-things IgKnite! - ''' + """ def __init__(self, *args, initial_extensions: List[str], **kwargs) -> None: super().__init__(*args, **kwargs) @@ -25,9 +25,9 @@ def __init__(self, *args, initial_extensions: List[str], **kwargs) -> None: self.load_extension(extension) async def _update_presence(self) -> None: - ''' + """ Updates the rich presence of IgKnite. - ''' + """ await self.change_presence( status=disnake.Status.dnd, diff --git a/core/datacls.py b/core/datacls.py index 44b1612..0b8cea9 100644 --- a/core/datacls.py +++ b/core/datacls.py @@ -8,9 +8,9 @@ # Decorate pre-existing classes with @dataclass . @dataclass(frozen=True) class LockRoles: - ''' + """ A dataclass used for role-locking. - ''' + """ mod: str = 'BotMod' admin: str = 'BotAdmin' diff --git a/core/ui.py b/core/ui.py index 64e2bb5..8239bbc 100644 --- a/core/ui.py +++ b/core/ui.py @@ -10,9 +10,9 @@ # Overwrite disnake.Embed class to form custom embeds. class TypicalEmbed(disnake.Embed): - ''' + """ Represents an embed common to all the normal commands. - ''' + """ def __init__( self, @@ -34,8 +34,8 @@ def __init__( [ 'When pigs fly...', 'Stunned stork!', - 'A perfect debugged life doesn\'t exist.', - 'Haven\'t I made it obvious?', + "A perfect debugged life doesn't exist.", + "Haven't I made it obvious?", 'Hello World, from the other side!', 'A computer is like air conditioning' + '- it becomes useless when you open Windows.', @@ -48,9 +48,9 @@ def __init__( # Overwrite disnake.ui.View class to form custom views. class SmallView(disnake.ui.View): - ''' + """ Can be used for simple views with buttons. - ''' + """ def __init__(self, inter: disnake.CommandInter | None = None, *, timeout: float = 60) -> None: super().__init__(timeout=timeout) @@ -64,9 +64,9 @@ def add_button( style: disnake.ButtonStyle = disnake.ButtonStyle.gray, disabled: bool = False, ) -> Self: - ''' + """ Adds a button to the view. - ''' + """ self.add_item(disnake.ui.Button(label=label, url=url, style=style, disabled=disabled)) return self From 8127a58196426ffedd71766b4e5e5dfedce594d1 Mon Sep 17 00:00:00 2001 From: HitBlast Date: Sat, 27 Jan 2024 12:33:42 +0600 Subject: [PATCH 5/8] updated workflow permissions --- .github/workflows/formatting.yml | 8 ++++++-- .github/workflows/linting.yml | 4 ++++ 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/.github/workflows/formatting.yml b/.github/workflows/formatting.yml index 6c0c887..12a04c5 100644 --- a/.github/workflows/formatting.yml +++ b/.github/workflows/formatting.yml @@ -10,6 +10,10 @@ on: branches: - main +permissions: + contents: write + pull-requests: write + concurrency: group: ${{ github.workflow }}-${{ github.ref }} cancel-in-progress: true @@ -46,5 +50,5 @@ jobs: Formatter errors found in: ${{ github.sha }}. base: ${{ github.head_ref }} branch: actions/ruff - reviewers: hitblast - delete-branch: true \ No newline at end of file + delete-branch: true + reviewers: hitblast \ No newline at end of file diff --git a/.github/workflows/linting.yml b/.github/workflows/linting.yml index c509a35..4d4f87d 100644 --- a/.github/workflows/linting.yml +++ b/.github/workflows/linting.yml @@ -10,6 +10,10 @@ on: branches: - main +permissions: + contents: write + pull-requests: write + concurrency: group: ${{ github.workflow }}-${{ github.ref }} cancel-in-progress: true From 32a6351dca3a4f4de742558f3d6e8a9182836614 Mon Sep 17 00:00:00 2001 From: HitBlast Date: Sat, 27 Jan 2024 12:40:07 +0600 Subject: [PATCH 6/8] fixed argument error with the /help slash command --- cogs/general.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cogs/general.py b/cogs/general.py index 769625c..a61c550 100644 --- a/cogs/general.py +++ b/cogs/general.py @@ -121,7 +121,7 @@ async def _ping(self, inter: disnake.CommandInter) -> None: @commands.slash_command(name='help', description='Get to know IgKnite!') async def help(self, inter: disnake.CommandInter): embed = core.TypicalEmbed( - inter, + inter=inter, title="Hey there! I'm IgKnite.", description="I'm a bot with no text commands (you heard that right) " + "and I'm here to help you manage and moderate your Discord server alongside " From 8b0a97c13afe38551a6c9d8e381dd9509c96c452 Mon Sep 17 00:00:00 2001 From: HitBlast Date: Sat, 27 Jan 2024 12:48:51 +0600 Subject: [PATCH 7/8] bumped version to current date --- core/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/__init__.py b/core/__init__.py index 98cfcb9..1829679 100644 --- a/core/__init__.py +++ b/core/__init__.py @@ -11,7 +11,7 @@ from .ui import * # Set version number. -__version_info__ = ('2023', '8', '25') # Year.Month.Day +__version_info__ = ('2024', '1', '27') # Year.Month.Day __version__ = '.'.join(__version_info__) From b7f0205c308970d7d9304f829ae169501d3f750b Mon Sep 17 00:00:00 2001 From: HitBlast Date: Sat, 27 Jan 2024 07:08:42 +0000 Subject: [PATCH 8/8] removed black from devcontainer --- .devcontainer/devcontainer.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json index b9d1b50..834e1ba 100644 --- a/.devcontainer/devcontainer.json +++ b/.devcontainer/devcontainer.json @@ -4,7 +4,7 @@ { "name": "Python 3", "image": "mcr.microsoft.com/devcontainers/python:0-3.11", - "postCreateCommand": "sudo apt update && sudo apt install -y --no-install-recommends ffmpeg && pip install -U pip && pip install -r requirements.txt && pip install black ruff", + "postCreateCommand": "sudo apt update && sudo apt install -y --no-install-recommends ffmpeg && pip install -U pip && pip install -r requirements.txt && pip install ruff", "customizations": { "vscode": { "extensions": [