Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
50 commits
Select commit Hold shift + click to select a range
2f1f416
chore: remove unused Bitbucket.Net.snk file
diomonogatari Feb 7, 2026
d424508
chore: replace .sln with .slnx and update build tasks
diomonogatari Feb 7, 2026
b143763
chore: update .editorconfig with default Microsoft C# coding conventi…
diomonogatari Feb 7, 2026
24ee49b
chore: update .editorconfig and VSCode settings for improved code sty…
diomonogatari Feb 7, 2026
04e5e15
chore: update .editorconfig and VSCode settings for code style prefer…
diomonogatari Feb 7, 2026
547e117
chore: apply dotnet format to the codebase
diomonogatari Feb 7, 2026
615c0b8
feat: add formatting verification scripts and pre-commit hook
diomonogatari Feb 7, 2026
a08cd2d
refactor: remove redundant expected arrays and simplify assertions in…
diomonogatari Feb 7, 2026
cdac727
refactor: update JsonConverter for Permissions property to use Permis…
diomonogatari Feb 7, 2026
250d57f
refactor: enhance documentation for audit URL methods and improve dic…
diomonogatari Feb 7, 2026
c2c8db6
refactor: add xml docs to files
diomonogatari Feb 7, 2026
1fd12fb
refactor: add xml docs to projects client
diomonogatari Feb 7, 2026
3d07929
refactor: enhance documentation for BitbucketClient methods
diomonogatari Feb 7, 2026
2e67400
refactor: enhance documentation for admin permissions methods and imp…
diomonogatari Feb 7, 2026
fdf37cb
refactor: streamline response handling and improve JSON serialization…
diomonogatari Feb 7, 2026
5837c26
refactor: enhance FlurlRequestExtensions with async Get method and im…
diomonogatari Feb 7, 2026
922ac3d
refactor: update BitbucketClient methods to use async response handli…
diomonogatari Feb 7, 2026
38ac6c9
refactor: update error handling tests to use specific Bitbucket excep…
diomonogatari Feb 7, 2026
68b4860
refactor: update branch retrieval methods to use async response handl…
diomonogatari Feb 7, 2026
3d40f23
refactor: replace PostJsonAsync with SendAsync for improved request h…
diomonogatari Feb 7, 2026
b0c8c98
refactor: update Projects BitbucketClient to use async response handl…
diomonogatari Feb 7, 2026
f05ea47
refactor: update repository methods to use async response handling an…
diomonogatari Feb 7, 2026
75a20ed
refactor: consolidate project properties and enhance build configurat…
diomonogatari Feb 7, 2026
bb85548
docs: update changelog and README for clarity and consistency
diomonogatari Feb 7, 2026
e33530e
refactor: update .editorconfig and settings.json for improved code qu…
diomonogatari Feb 7, 2026
ef2e8f9
chore: remove unused usings
diomonogatari Feb 7, 2026
5b19662
refactor: update ToString methods to handle null values gracefully
diomonogatari Feb 7, 2026
b126cba
ci: enhance test coverage reporting and improve publish workflow
diomonogatari Feb 7, 2026
5e1ea52
refactor: remove inheritance from PullRequestInfo in Comment class
diomonogatari Feb 7, 2026
2c7ae38
refactor: remove commented-out Avatar property from ProjectDefinition…
diomonogatari Feb 7, 2026
c3d7d22
refactor: update ToString methods to return "Unknown" for null values
diomonogatari Feb 7, 2026
c0a0a51
chore: update CHANGELOG with breaking changes, fixes, and enhancements
diomonogatari Feb 7, 2026
e223cc5
feat: add streaming methods for pull requests, changes, and comments …
diomonogatari Feb 8, 2026
1186734
chore: update editorconfig and vscode settings for consistent line le…
diomonogatari Feb 8, 2026
35018ef
refactor: simplify namespace usage in tests and Branch class
diomonogatari Feb 8, 2026
14e7bae
refactor: use StringComparer.Ordinal for dictionary initialization
diomonogatari Feb 8, 2026
5b77cf0
chore: update CHANGELOG with new streaming methods for pull requests …
diomonogatari Feb 8, 2026
eea8af3
feat: add test fixtures for branches, commits, projects, and reposito…
diomonogatari Feb 8, 2026
e6b2464
feat: add methods for setting up paged and diff endpoints in WireMock…
diomonogatari Feb 8, 2026
ea1c54e
feat: add methods to create BitbucketClient with HttpClient and Flurl…
diomonogatari Feb 8, 2026
4316bc5
feat: add comprehensive mock tests for cancellation, DI constructors,…
diomonogatari Feb 8, 2026
705bd02
chore: update CHANGELOG with testing improvements
diomonogatari Feb 8, 2026
c0ac8d2
feat: enhance documentation with detailed XML comments
diomonogatari Feb 8, 2026
dc56209
refactor: Split the massive Projects client into dedicated clients fo…
diomonogatari Feb 8, 2026
93e9837
chore: update CHANGELOG and README for version 0.2.0 release
diomonogatari Feb 8, 2026
5b10bda
refactor: update Unix timestamp handling to use milliseconds and adju…
diomonogatari Feb 8, 2026
8c48bee
refactor: improve UnixDateTimeExtensions and related tests for consis…
diomonogatari Feb 8, 2026
24029a9
feat: Add XML documentation comments to converters and models
diomonogatari Feb 8, 2026
955ac2a
refactor: normalize line endings
diomonogatari Feb 8, 2026
6e5c243
refactor: update .gitattributes to ensure shell scripts maintain LF l…
diomonogatari Feb 8, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
261 changes: 259 additions & 2 deletions .editorconfig
Original file line number Diff line number Diff line change
@@ -1,4 +1,261 @@
[*.cs]
root = true

# IDE0055: Fix formatting
# C# files
[*.cs]

#### Core EditorConfig Options ####

# Indentation and spacing
indent_size = 4
indent_style = space
tab_width = 4
max_line_length = 170

# New line preferences
end_of_line = crlf
insert_final_newline = false

#### .NET Coding Conventions ####

# Organize usings
dotnet_separate_import_directive_groups = false
dotnet_sort_system_directives_first = false
file_header_template = unset

# this. and Me. preferences
dotnet_style_qualification_for_event = false
dotnet_style_qualification_for_field = false
dotnet_style_qualification_for_method = false
dotnet_style_qualification_for_property = false

# Language keywords vs BCL types preferences
dotnet_style_predefined_type_for_locals_parameters_members = true
dotnet_style_predefined_type_for_member_access = true

# Parentheses preferences
dotnet_style_parentheses_in_arithmetic_binary_operators = always_for_clarity
dotnet_style_parentheses_in_other_binary_operators = always_for_clarity
dotnet_style_parentheses_in_other_operators = never_if_unnecessary
dotnet_style_parentheses_in_relational_binary_operators = always_for_clarity

# Modifier preferences
dotnet_style_require_accessibility_modifiers = for_non_interface_members

# Expression-level preferences
dotnet_style_coalesce_expression = true
dotnet_style_collection_initializer = true
dotnet_style_explicit_tuple_names = true
dotnet_style_namespace_match_folder = false # Override due to partial classes across folders
dotnet_style_null_propagation = true
dotnet_style_object_initializer = true
dotnet_style_operator_placement_when_wrapping = beginning_of_line
dotnet_style_prefer_auto_properties = true
dotnet_style_prefer_collection_expression = when_types_loosely_match
dotnet_style_prefer_compound_assignment = true
dotnet_style_prefer_conditional_expression_over_assignment = true
dotnet_style_prefer_conditional_expression_over_return = true
dotnet_style_prefer_foreach_explicit_cast_in_source = when_strongly_typed
dotnet_style_prefer_inferred_anonymous_type_member_names = true
dotnet_style_prefer_inferred_tuple_names = true
dotnet_style_prefer_is_null_check_over_reference_equality_method = true
dotnet_style_prefer_simplified_boolean_expressions = true
dotnet_style_prefer_simplified_interpolation = true

# Field preferences
dotnet_style_readonly_field = true

# Parameter preferences
dotnet_code_quality_unused_parameters = all:silent

# Suppression preferences
dotnet_remove_unnecessary_suppression_exclusions = none

# New line preferences
dotnet_style_allow_multiple_blank_lines_experimental = true
dotnet_style_allow_statement_immediately_after_block_experimental = true

#### C# Coding Conventions ####

# var preferences
csharp_style_var_elsewhere = false
csharp_style_var_for_built_in_types = false
csharp_style_var_when_type_is_apparent = false

# Expression-bodied members
csharp_style_expression_bodied_accessors = true
csharp_style_expression_bodied_constructors = false
csharp_style_expression_bodied_indexers = true
csharp_style_expression_bodied_lambdas = true
csharp_style_expression_bodied_local_functions = false
csharp_style_expression_bodied_methods = false
csharp_style_expression_bodied_operators = false
csharp_style_expression_bodied_properties = true

# Pattern matching preferences
csharp_style_pattern_matching_over_as_with_null_check = true
csharp_style_pattern_matching_over_is_with_cast_check = true
csharp_style_prefer_extended_property_pattern = true
csharp_style_prefer_not_pattern = true
csharp_style_prefer_pattern_matching = true
csharp_style_prefer_switch_expression = true

# Null-checking preferences
csharp_style_conditional_delegate_call = true

# Modifier preferences
csharp_prefer_static_local_function = true
csharp_preferred_modifier_order = public,private,protected,internal,file,static,extern,new,virtual,abstract,sealed,override,readonly,unsafe,required,volatile,async
csharp_style_prefer_readonly_struct = true
csharp_style_prefer_readonly_struct_member = true

# Code-block preferences
csharp_prefer_braces = false:suggestion
csharp_prefer_simple_using_statement = true:suggestion
csharp_style_namespace_declarations = file_scoped:warning
csharp_style_prefer_method_group_conversion = true:suggestion
csharp_style_prefer_primary_constructors = true:warning
csharp_style_prefer_top_level_statements = true:silent

# Expression-level preferences
csharp_prefer_simple_default_expression = true
csharp_style_deconstructed_variable_declaration = true
csharp_style_implicit_object_creation_when_type_is_apparent = true
csharp_style_inlined_variable_declaration = true
csharp_style_prefer_index_operator = true
csharp_style_prefer_local_over_anonymous_function = true
csharp_style_prefer_null_check_over_type_check = true
csharp_style_prefer_range_operator = true
csharp_style_prefer_tuple_swap = true
csharp_style_prefer_utf8_string_literals = true
csharp_style_throw_expression = true
csharp_style_unused_value_assignment_preference = discard_variable
csharp_style_unused_value_expression_statement_preference = discard_variable

# 'using' directive preferences
csharp_using_directive_placement = outside_namespace

# New line preferences
csharp_style_allow_blank_line_after_colon_in_constructor_initializer_experimental = true
csharp_style_allow_blank_line_after_token_in_arrow_expression_clause_experimental = true
csharp_style_allow_blank_line_after_token_in_conditional_expression_experimental = true
csharp_style_allow_blank_lines_between_consecutive_braces_experimental = true
csharp_style_allow_embedded_statements_on_same_line_experimental = true

#### C# Formatting Rules ####

# New line preferences
csharp_new_line_before_catch = true
csharp_new_line_before_else = true
csharp_new_line_before_finally = true
csharp_new_line_before_members_in_anonymous_types = true
csharp_new_line_before_members_in_object_initializers = true
csharp_new_line_before_open_brace = all
csharp_new_line_between_query_expression_clauses = true

# Indentation preferences
csharp_indent_block_contents = true
csharp_indent_braces = false
csharp_indent_case_contents = true
csharp_indent_case_contents_when_block = true
csharp_indent_labels = one_less_than_current
csharp_indent_switch_labels = true

# Space preferences
csharp_space_after_cast = false
csharp_space_after_colon_in_inheritance_clause = true
csharp_space_after_comma = true
csharp_space_after_dot = false
csharp_space_after_keywords_in_control_flow_statements = true
csharp_space_after_semicolon_in_for_statement = true
csharp_space_around_binary_operators = before_and_after
csharp_space_around_declaration_statements = false
csharp_space_before_colon_in_inheritance_clause = true
csharp_space_before_comma = false
csharp_space_before_dot = false
csharp_space_before_open_square_brackets = false
csharp_space_before_semicolon_in_for_statement = false
csharp_space_between_empty_square_brackets = false
csharp_space_between_method_call_empty_parameter_list_parentheses = false
csharp_space_between_method_call_name_and_opening_parenthesis = false
csharp_space_between_method_call_parameter_list_parentheses = false
csharp_space_between_method_declaration_empty_parameter_list_parentheses = false
csharp_space_between_method_declaration_name_and_open_parenthesis = false
csharp_space_between_method_declaration_parameter_list_parentheses = false
csharp_space_between_parentheses = false
csharp_space_between_square_brackets = false

# Wrapping preferences
csharp_preserve_single_line_blocks = true
csharp_preserve_single_line_statements = true

#### Naming styles ####

# Naming rules

dotnet_naming_rule.interface_should_be_begins_with_i.severity = suggestion
dotnet_naming_rule.interface_should_be_begins_with_i.symbols = interface
dotnet_naming_rule.interface_should_be_begins_with_i.style = begins_with_i

dotnet_naming_rule.types_should_be_pascal_case.severity = suggestion
dotnet_naming_rule.types_should_be_pascal_case.symbols = types
dotnet_naming_rule.types_should_be_pascal_case.style = pascal_case

dotnet_naming_rule.non_field_members_should_be_pascal_case.severity = suggestion
dotnet_naming_rule.non_field_members_should_be_pascal_case.symbols = non_field_members
dotnet_naming_rule.non_field_members_should_be_pascal_case.style = pascal_case

# Symbol specifications

dotnet_naming_symbols.interface.applicable_kinds = interface
dotnet_naming_symbols.interface.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected
dotnet_naming_symbols.interface.required_modifiers =

dotnet_naming_symbols.types.applicable_kinds = class, struct, interface, enum
dotnet_naming_symbols.types.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected
dotnet_naming_symbols.types.required_modifiers =

dotnet_naming_symbols.non_field_members.applicable_kinds = property, event, method
dotnet_naming_symbols.non_field_members.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected
dotnet_naming_symbols.non_field_members.required_modifiers =

# Naming styles

dotnet_naming_style.pascal_case.required_prefix =
dotnet_naming_style.pascal_case.required_suffix =
dotnet_naming_style.pascal_case.word_separator =
dotnet_naming_style.pascal_case.capitalization = pascal_case

dotnet_naming_style.begins_with_i.required_prefix = I
dotnet_naming_style.begins_with_i.required_suffix =
dotnet_naming_style.begins_with_i.word_separator =
dotnet_naming_style.begins_with_i.capitalization = pascal_case

# ==========================================================================
# Diagnostic overrides
# ==========================================================================

# IDE0055: Fix formatting — disabled (handled by dotnet format on demand)
dotnet_diagnostic.IDE0055.severity = none

# IDE0005: Using directive is unnecessary
dotnet_diagnostic.IDE0005.severity = warning

# IDE0130: Namespace does not match folder structure — this codebase uses
# partial classes across folders, so namespace != folder is expected
dotnet_diagnostic.IDE0130.severity = none

# IDE* suggestions that can cause noisy or potentially breaking refactors when
# running `dotnet format style --severity info` (e.g., renames). Keep formatting
# verification focused on whitespace + explicit style preferences.
dotnet_diagnostic.IDE1006.severity = none
dotnet_diagnostic.IDE0028.severity = none
dotnet_diagnostic.IDE0300.severity = none
dotnet_diagnostic.IDE0305.severity = none

# Meziantou/CA rules that have no auto code-fix — suppress so dotnet format
# does not emit "Unable to fix" warnings
dotnet_diagnostic.MA0011.severity = none
dotnet_diagnostic.MA0015.severity = none
dotnet_diagnostic.MA0016.severity = none
dotnet_diagnostic.MA0048.severity = none
dotnet_diagnostic.CA2024.severity = none
5 changes: 5 additions & 0 deletions .gitattributes
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
# Normalize all text files to CRLF on checkout (matches .editorconfig end_of_line = crlf)
* text=auto eol=crlf

# Shell scripts must keep LF to run on Linux/macOS
*.sh text eol=lf
28 changes: 28 additions & 0 deletions .githooks/pre-commit
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
#!/usr/bin/env bash
set -euo pipefail

# Git pre-commit hook.
#
# To enable for this repo:
# bash scripts/setup-githooks.sh
# (or) ./scripts/setup-githooks.ps1
#
# To bypass once:
# git commit --no-verify

if [[ "${SKIP_DOTNET_FORMAT:-}" == "1" ]]; then
exit 0
fi

ROOT_DIR="$(git rev-parse --show-toplevel 2>/dev/null || true)"
if [[ -z "$ROOT_DIR" ]]; then
echo "pre-commit: not inside a git repository" >&2
exit 1
fi

bash "$ROOT_DIR/scripts/verify-format.sh" --verify || {
echo "" >&2
echo "Commit aborted: formatting verification failed." >&2
echo "Fix by running: bash scripts/verify-format.sh --fix" >&2
exit 1
}
15 changes: 14 additions & 1 deletion .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -31,8 +31,21 @@ jobs:
- name: Restore
run: dotnet restore

- name: Verify formatting
run: bash scripts/verify-format.sh --verify

- name: Build
run: dotnet build --no-restore -c Release

- name: Test
run: dotnet test --no-build -c Release --verbosity normal
run: >
dotnet test --no-build -c Release --verbosity normal
--collect:"XPlat Code Coverage"
--results-directory ./coverage

- name: Upload coverage
if: github.event_name == 'push' && github.ref == 'refs/heads/main'
uses: codecov/codecov-action@v4
with:
directory: ./coverage
fail_ci_if_error: false
12 changes: 9 additions & 3 deletions .github/workflows/publish.yml
Original file line number Diff line number Diff line change
Expand Up @@ -33,13 +33,15 @@ jobs:
- name: Restore
run: dotnet restore

- name: Verify formatting
run: bash scripts/verify-format.sh --verify

- name: Build
run: dotnet build --no-restore -c Release

- name: Test
run: dotnet test --no-build -c Release --verbosity normal

# Extract version from tag (v0.1.0-beta.1 -> 0.1.0-beta.1)
- name: Extract version from tag
id: version
run: echo "VERSION=${GITHUB_REF_NAME#v}" >> "$GITHUB_OUTPUT"
Expand All @@ -48,7 +50,11 @@ jobs:
run: dotnet pack src/Bitbucket.Net/Bitbucket.Net.csproj -c Release --no-build -o ./artifacts -p:PackageVersion=${{ steps.version.outputs.VERSION }}

- name: Push to NuGet.org
run: dotnet nuget push ./artifacts/*.nupkg --api-key ${{ secrets.NUGET_API_KEY }} --source https://api.nuget.org/v3/index.json --skip-duplicate
run: |
dotnet nuget push ./artifacts/*.nupkg --api-key ${{ secrets.NUGET_API_KEY }} --source https://api.nuget.org/v3/index.json --skip-duplicate
dotnet nuget push ./artifacts/*.snupkg --api-key ${{ secrets.NUGET_API_KEY }} --source https://api.nuget.org/v3/index.json --skip-duplicate

- name: Push to GitHub Packages
run: dotnet nuget push ./artifacts/*.nupkg --api-key ${{ secrets.GITHUB_TOKEN }} --source https://nuget.pkg.github.com/diomonogatari/index.json --skip-duplicate
run: |
dotnet nuget push ./artifacts/*.nupkg --api-key ${{ secrets.GITHUB_TOKEN }} --source https://nuget.pkg.github.com/diomonogatari/index.json --skip-duplicate
dotnet nuget push ./artifacts/*.snupkg --api-key ${{ secrets.GITHUB_TOKEN }} --source https://nuget.pkg.github.com/diomonogatari/index.json --skip-duplicate
12 changes: 12 additions & 0 deletions .vscode/settings.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
{
"editor.formatOnSave": true,
"editor.formatOnSaveMode": "modificationsIfAvailable",
"editor.formatOnType": false,
"editor.rulers": [170],
"editor.wordWrapColumn": 170,
"editor.codeActionsOnSave": {
"source.organizeImports": "always",
"source.removeUnusedImports": "always",
"source.fixAll": "always"
}
}
6 changes: 3 additions & 3 deletions .vscode/tasks.json
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
"type": "process",
"args": [
"build",
"${workspaceFolder}/Bitbucket.Net.sln",
"${workspaceFolder}/Bitbucket.Net.slnx",
"/property:GenerateFullPaths=true",
"/consoleloggerparameters:NoSummary;ForceNoAlign"
],
Expand All @@ -23,7 +23,7 @@
"type": "process",
"args": [
"build",
"${workspaceFolder}/Bitbucket.Net.sln",
"${workspaceFolder}/Bitbucket.Net.slnx",
"-c",
"Release",
"/property:GenerateFullPaths=true",
Expand Down Expand Up @@ -131,7 +131,7 @@
"type": "process",
"args": [
"clean",
"${workspaceFolder}/Bitbucket.Net.sln"
"${workspaceFolder}/Bitbucket.Net.slnx"
],
"problemMatcher": "$msCompile"
},
Expand Down
Loading