Compare commits

..

5 Commits

Author SHA1 Message Date
3e2430fbe0 final commit
Some checks failed
Test Suite / lint (push) Has been cancelled
Test Suite / test (3.10) (push) Has been cancelled
Test Suite / test (3.11) (push) Has been cancelled
Test Suite / test (3.12) (push) Has been cancelled
Test Suite / test (3.8) (push) Has been cancelled
Test Suite / test (3.9) (push) Has been cancelled
Test Suite / security (push) Has been cancelled
Test Suite / package (push) Has been cancelled
2025-07-31 23:11:30 -04:00
f4c99ab5db final commit 2025-07-31 23:11:30 -04:00
5f43b3d077 Merge pull request 'initial-setup' (#1) from initial-setup into main
Some checks failed
Test Suite / lint (push) Has been cancelled
Test Suite / test (macos-latest, 3.10) (push) Has been cancelled
Test Suite / test (macos-latest, 3.11) (push) Has been cancelled
Test Suite / test (macos-latest, 3.12) (push) Has been cancelled
Test Suite / test (macos-latest, 3.8) (push) Has been cancelled
Test Suite / test (macos-latest, 3.9) (push) Has been cancelled
Test Suite / test (ubuntu-latest, 3.10) (push) Has been cancelled
Test Suite / test (ubuntu-latest, 3.11) (push) Has been cancelled
Test Suite / test (ubuntu-latest, 3.12) (push) Has been cancelled
Test Suite / test (ubuntu-latest, 3.8) (push) Has been cancelled
Test Suite / test (ubuntu-latest, 3.9) (push) Has been cancelled
Test Suite / package (push) Has been cancelled
Test Suite / test (windows-latest, 3.10) (push) Has been cancelled
Test Suite / test (windows-latest, 3.11) (push) Has been cancelled
Test Suite / test (windows-latest, 3.12) (push) Has been cancelled
Test Suite / test (windows-latest, 3.8) (push) Has been cancelled
Test Suite / test (windows-latest, 3.9) (push) Has been cancelled
Test Suite / security (push) Has been cancelled
Reviewed-on: #1
2025-08-01 02:34:32 +00:00
b0f903660e second commit
Some checks failed
Test Suite / lint (pull_request) Has been cancelled
Test Suite / test (macos-latest, 3.10) (pull_request) Has been cancelled
Test Suite / test (macos-latest, 3.11) (pull_request) Has been cancelled
Test Suite / test (macos-latest, 3.12) (pull_request) Has been cancelled
Test Suite / test (macos-latest, 3.8) (pull_request) Has been cancelled
Test Suite / test (macos-latest, 3.9) (pull_request) Has been cancelled
Test Suite / test (ubuntu-latest, 3.10) (pull_request) Has been cancelled
Test Suite / test (ubuntu-latest, 3.11) (pull_request) Has been cancelled
Test Suite / test (ubuntu-latest, 3.12) (pull_request) Has been cancelled
Test Suite / test (ubuntu-latest, 3.8) (pull_request) Has been cancelled
Test Suite / test (ubuntu-latest, 3.9) (pull_request) Has been cancelled
Test Suite / package (pull_request) Has been cancelled
Test Suite / test (windows-latest, 3.10) (pull_request) Has been cancelled
Test Suite / test (windows-latest, 3.11) (pull_request) Has been cancelled
Test Suite / test (windows-latest, 3.12) (pull_request) Has been cancelled
Test Suite / test (windows-latest, 3.8) (pull_request) Has been cancelled
Test Suite / test (windows-latest, 3.9) (pull_request) Has been cancelled
Test Suite / security (pull_request) Has been cancelled
2025-07-31 22:32:51 -04:00
96ebbb6823 first commit 2025-07-31 22:22:37 -04:00
19 changed files with 219 additions and 262 deletions

18
.flake8 Normal file
View File

@@ -0,0 +1,18 @@
[flake8]
max-line-length = 88
select = E,W,F,C,N
ignore = E203,E501,W503
exclude =
.git,
__pycache__,
build,
dist,
.eggs,
*.egg-info,
.venv,
venv,
.tox
per-file-ignores =
tests/*:F401,F811
__init__.py:F401
max-complexity = 10

View File

@@ -27,7 +27,7 @@ jobs:
- name: Run security scan - name: Run security scan
run: bandit -r wikijs run: bandit -r wikijs
release: build:
needs: test needs: test
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
@@ -35,9 +35,28 @@ jobs:
with: with:
fetch-depth: 0 fetch-depth: 0
- name: Create GitHub Release - name: Set up Python
uses: actions/setup-python@v4
with:
python-version: "3.11"
- name: Install build dependencies
run: |
python -m pip install --upgrade pip
pip install build twine
- name: Build package
run: python -m build
- name: Check package
run: twine check dist/*
- name: Create Release
uses: softprops/action-gh-release@v1 uses: softprops/action-gh-release@v1
with: with:
generate_release_notes: true generate_release_notes: true
files: |
dist/*.whl
dist/*.tar.gz
env: env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

View File

@@ -35,10 +35,9 @@ jobs:
run: mypy wikijs run: mypy wikijs
test: test:
runs-on: ${{ matrix.os }} runs-on: ubuntu-latest
strategy: strategy:
matrix: matrix:
os: [ubuntu-latest, windows-latest, macos-latest]
python-version: ["3.8", "3.9", "3.10", "3.11", "3.12"] python-version: ["3.8", "3.9", "3.10", "3.11", "3.12"]
steps: steps:
@@ -55,15 +54,16 @@ jobs:
pip install -e ".[dev]" pip install -e ".[dev]"
- name: Run unit tests - name: Run unit tests
run: pytest tests/ -v --cov=wikijs --cov-report=xml run: pytest tests/ -v --cov=wikijs --cov-report=xml --cov-report=term-missing
- name: Upload coverage to Codecov - name: Upload coverage report
uses: codecov/codecov-action@v3 uses: actions/upload-artifact@v4
if: matrix.python-version == '3.11' && matrix.os == 'ubuntu-latest' if: matrix.python-version == '3.11'
with: with:
file: ./coverage.xml name: coverage-report
flags: unittests path: |
name: codecov-umbrella ./coverage.xml
./tests/htmlcov/
security: security:
runs-on: ubuntu-latest runs-on: ubuntu-latest
@@ -83,10 +83,10 @@ jobs:
- name: Run security scan with bandit - name: Run security scan with bandit
run: bandit -r wikijs -f json -o bandit-report.json || true run: bandit -r wikijs -f json -o bandit-report.json || true
- name: Upload bandit report - name: Upload security report
uses: actions/upload-artifact@v4 uses: actions/upload-artifact@v4
with: with:
name: bandit-report name: security-report
path: bandit-report.json path: bandit-report.json
package: package:
@@ -109,3 +109,9 @@ jobs:
- name: Check package - name: Check package
run: twine check dist/* run: twine check dist/*
- name: Upload package artifacts
uses: actions/upload-artifact@v4
with:
name: python-package
path: dist/

View File

@@ -1,49 +0,0 @@
---
name: Bug Report
about: Create a report to help us improve
title: '[BUG] '
labels: ['bug']
assignees: ''
---
## Bug Description
A clear and concise description of what the bug is.
## Steps to Reproduce
Steps to reproduce the behavior:
1. Go to '...'
2. Click on '....'
3. Scroll down to '....'
4. See error
## Expected Behavior
A clear and concise description of what you expected to happen.
## Actual Behavior
A clear and concise description of what actually happened.
## Code Example
If applicable, add code snippets to help explain your problem.
```python
# Your code here
```
## Environment
- **SDK Version**: [e.g. 0.1.0]
- **Python Version**: [e.g. 3.11.0]
- **Operating System**: [e.g. Ubuntu 22.04]
- **Wiki.js Version**: [e.g. 2.5.300]
## Error Messages
If applicable, add any error messages or stack traces.
```
Paste error messages here
```
## Additional Context
Add any other context about the problem here.
## Possible Solution
If you have suggestions on how to fix the bug, please describe them here.

View File

@@ -1,59 +0,0 @@
---
name: Feature Request
about: Suggest an idea for this project
title: '[FEATURE] '
labels: ['enhancement']
assignees: ''
---
## Feature Summary
A clear and concise description of the feature you'd like to request.
## Problem Statement
Is your feature request related to a problem? Please describe.
A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]
## Proposed Solution
Describe the solution you'd like.
A clear and concise description of what you want to happen.
## Use Case
Describe your use case for this feature.
- Who would benefit from this feature?
- What problem does it solve?
- How would you use it?
## API Design (if applicable)
If you have ideas about how the API should look, include them here.
```python
# Example of how you envision using this feature
client = WikiJSClient(...)
result = client.new_feature.do_something()
```
## Alternatives Considered
Describe alternatives you've considered.
A clear and concise description of any alternative solutions or features you've considered.
## Implementation Notes
If you have ideas about implementation, include them here.
- Are there any technical challenges?
- Dependencies that might be needed?
- Breaking changes required?
## Additional Context
Add any other context, screenshots, or examples about the feature request here.
## Priority
How important is this feature to you?
- [ ] Nice to have
- [ ] Important for my use case
- [ ] Critical for my use case
## Contribution
Are you willing to contribute to implementing this feature?
- [ ] Yes, I can implement this
- [ ] Yes, but I need guidance
- [ ] No, but I can help with testing
- [ ] No, I just want to request it

View File

@@ -1,66 +0,0 @@
# Pull Request
## Description
Brief description of what this PR does and why.
## Type of Change
Please delete options that are not relevant.
- [ ] Bug fix (non-breaking change which fixes an issue)
- [ ] New feature (non-breaking change which adds functionality)
- [ ] Breaking change (fix or feature that would cause existing functionality to not work as expected)
- [ ] Documentation update
- [ ] Performance improvement
- [ ] Code refactoring (no functional changes)
- [ ] Test improvements
## Related Issues
Closes #(issue_number)
Relates to #(issue_number)
## Changes Made
-
-
-
## Testing
- [ ] Tests pass locally
- [ ] Added tests for new functionality
- [ ] Updated existing tests
- [ ] Manual testing completed
Describe any testing you performed:
## Documentation
- [ ] Updated docstrings
- [ ] Updated README if needed
- [ ] Updated API documentation
- [ ] Added/updated examples
## Code Quality
- [ ] Code follows the style guidelines
- [ ] Self-review of the code completed
- [ ] Code is commented where necessary
- [ ] No new warnings introduced
## Breaking Changes
If this introduces breaking changes, please describe them and provide migration guidance:
## Screenshots/Examples
If applicable, add screenshots or code examples to help explain your changes.
```python
# Example usage
```
## Additional Notes
Any additional information that reviewers should know.
---
## Reviewer Checklist
- [ ] Code follows project style guidelines
- [ ] Changes are well documented
- [ ] Tests are adequate and pass
- [ ] No obvious bugs or performance issues
- [ ] Breaking changes are properly documented

4
.gitignore vendored
View File

@@ -115,5 +115,5 @@ wiki-test-data/
test-wiki/ test-wiki/
# AI # AI
CLAUDE.md # CLAUDE.md
.claude/ # .claude/

View File

@@ -34,7 +34,7 @@
**Name**: wikijs-python-sdk **Name**: wikijs-python-sdk
**Purpose**: Professional-grade Python SDK for Wiki.js API integration **Purpose**: Professional-grade Python SDK for Wiki.js API integration
**Development Approach**: AI-powered, community-driven, open source **Development Approach**: AI-powered, community-driven, open source
**Deployment Strategy**: GitHub-only installation (pip install git+https://github.com/...) **Deployment Strategy**: Gitea-only installation (pip install git+https://gitea.hotserv.cloud/...)
**Target**: Complete professional development lifecycle demonstration **Target**: Complete professional development lifecycle demonstration
### **Current Development State** ### **Current Development State**
@@ -50,23 +50,22 @@ Target_Date: "2 weeks from start"
``` ```
wikijs-python-sdk/ # ✅ COMPLETE wikijs-python-sdk/ # ✅ COMPLETE
├── README.md # ✅ COMPLETE - Central documentation hub ├── README.md # ✅ COMPLETE - Central documentation hub
├── docs/wikijs_sdk_architecture.md # ✅ COMPLETE - Technical foundation
├── docs/wikijs_sdk_release_plan.md # ✅ COMPLETE - Release strategy
├── docs/RISK_MANAGEMENT.md # ✅ COMPLETE - Risk framework
├── docs/GOVERNANCE.md # ✅ COMPLETE - Community charter
├── CLAUDE.md # ✅ COMPLETE - This file ├── CLAUDE.md # ✅ COMPLETE - This file
├── CONTRIBUTING.md # ✅ COMPLETE - Task 1.1
├── LICENSE # ✅ COMPLETE - Task 1.1 ├── LICENSE # ✅ COMPLETE - Task 1.1
├── setup.py # ✅ COMPLETE - Task 1.1 ├── setup.py # ✅ COMPLETE - Task 1.1
├── pyproject.toml # ✅ COMPLETE - Task 1.1 ├── pyproject.toml # ✅ COMPLETE - Task 1.1
├── requirements.txt # ✅ COMPLETE - Task 1.1 ├── requirements.txt # ✅ COMPLETE - Task 1.1
├── requirements-dev.txt # ✅ COMPLETE - Task 1.1 ├── requirements-dev.txt # ✅ COMPLETE - Task 1.1
├── .gitignore # ✅ COMPLETE - Task 1.1 ├── .gitignore # ✅ COMPLETE - Task 1.1
├── CHANGELOG.md # ✅ COMPLETE - Task 1.1 ├── .gitea/ # ✅ COMPLETE - Task 1.1
├── .github/ # ✅ COMPLETE - Task 1.1 │ └── workflows/ # CI/CD pipelines (Gitea Actions)
│ ├── workflows/ # CI/CD pipelines ├── docs/ # ✅ COMPLETE - Task 1.6
│ ├── ISSUE_TEMPLATE/ # Bug & feature templates │ ├── wikijs_sdk_architecture.md # ✅ COMPLETE - Technical foundation
── PULL_REQUEST_TEMPLATE.md # PR template ── wikijs_sdk_release_plan.md # ✅ COMPLETE - Release strategy
│ ├── RISK_MANAGEMENT.md # ✅ COMPLETE - Risk framework
│ ├── GOVERNANCE.md # ✅ COMPLETE - Community charter
│ ├── CONTRIBUTING.md # ✅ COMPLETE - Task 1.1
│ └── CHANGELOG.md # ✅ COMPLETE - Task 1.1
├── wikijs/ # ✅ COMPLETE - Task 1.2 ├── wikijs/ # ✅ COMPLETE - Task 1.2
│ ├── __init__.py # Core package initialization │ ├── __init__.py # Core package initialization
│ ├── version.py # Version management │ ├── version.py # Version management
@@ -193,7 +192,7 @@ Subtasks:
Description: "Create basic project file structure" Description: "Create basic project file structure"
Status: "PENDING" Status: "PENDING"
Files_To_Create: Files_To_Create:
- CONTRIBUTING.md - docs/CONTRIBUTING.md
- LICENSE (MIT) - LICENSE (MIT)
- .gitignore - .gitignore
- setup.py - setup.py
@@ -214,18 +213,15 @@ Subtasks:
Description: "Set up GitHub Actions workflows" Description: "Set up GitHub Actions workflows"
Status: "PENDING" Status: "PENDING"
Files_To_Create: Files_To_Create:
- .github/workflows/test.yml - .gitea/workflows/test.yml
- .github/workflows/release.yml - .gitea/workflows/release.yml
- .github/ISSUE_TEMPLATE/bug_report.md
- .github/ISSUE_TEMPLATE/feature_request.md
- .github/PULL_REQUEST_TEMPLATE.md
1.1.4_Initial_Documentation: 1.1.4_Initial_Documentation:
Description: "Create contributor-focused documentation" Description: "Create contributor-focused documentation"
Status: "PENDING" Status: "PENDING"
Files_To_Create: Files_To_Create:
- CONTRIBUTING.md (detailed contribution guide) - docs/CONTRIBUTING.md (detailed contribution guide)
- CHANGELOG.md (version history template) - docs/CHANGELOG.md (version history template)
``` ```
### **Completion Criteria for Task 1.1** ### **Completion Criteria for Task 1.1**
@@ -267,7 +263,7 @@ Files_To_Update:
```yaml ```yaml
Files_To_Update: Files_To_Update:
- README.md: Update feature list and status badges - README.md: Update feature list and status badges
- CHANGELOG.md: Create v0.1.0 release notes - docs/CHANGELOG.md: Create v0.1.0 release notes
- DEVELOPMENT_PLAN.md: Mark Phase 1 complete - DEVELOPMENT_PLAN.md: Mark Phase 1 complete
- ARCHITECTURE.md: Update implementation status - ARCHITECTURE.md: Update implementation status
``` ```
@@ -409,7 +405,7 @@ Security:
1. **Create Repository Structure** (setup.py, requirements.txt, .gitignore) 1. **Create Repository Structure** (setup.py, requirements.txt, .gitignore)
2. **Configure Python Packaging** (pyproject.toml, dependencies) 2. **Configure Python Packaging** (pyproject.toml, dependencies)
3. **Set Up CI/CD Pipeline** (GitHub Actions workflows) 3. **Set Up CI/CD Pipeline** (GitHub Actions workflows)
4. **Create Contributing Guidelines** (CONTRIBUTING.md) 4. **Create Contributing Guidelines** (docs/CONTRIBUTING.md)
### **Task Dependencies** ### **Task Dependencies**
```yaml ```yaml
@@ -510,13 +506,13 @@ This document evolves based on development experience:
## 🚀 READY FOR DEVELOPMENT ## 🚀 READY FOR DEVELOPMENT
**CURRENT INSTRUCTION**: Phase 1 Complete - GitHub-Only Deployment Ready **CURRENT INSTRUCTION**: Phase 1 Complete - Gitea-Only Deployment Ready
**FOCUS**: Project is ready for GitHub-only installation and usage **FOCUS**: Project is ready for GitHub-only installation and usage
**SUCCESS CRITERIA**: Users can install via `pip install git+https://github.com/...` **SUCCESS CRITERIA**: Users can install via `pip install git+https://gitea.hotserv.cloud/lmiranda/wikijs-sdk-python.git`
**DEPLOYMENT STRATEGY**: GitHub-only (no PyPI publishing required) **DEPLOYMENT STRATEGY**: Gitea-only (no PyPI publishing required)
**REMEMBER**: Always refer to documentation, update progress, and maintain quality standards! **REMEMBER**: Always refer to documentation, update progress, and maintain quality standards!

View File

@@ -2,8 +2,8 @@
[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT) [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
[![Python Support](https://img.shields.io/badge/python-3.8+-blue.svg)](https://python.org) [![Python Support](https://img.shields.io/badge/python-3.8+-blue.svg)](https://python.org)
[![CI Status](https://github.com/yourusername/wikijs-python-sdk/workflows/Test%20Suite/badge.svg)](https://github.com/yourusername/wikijs-python-sdk/actions) [![Repository](https://img.shields.io/badge/repo-Gitea-green.svg)](https://gitea.hotserv.cloud/lmiranda/wikijs-sdk-python)
[![Coverage](https://codecov.io/gh/yourusername/wikijs-python-sdk/branch/main/graph/badge.svg)](https://codecov.io/gh/yourusername/wikijs-python-sdk) [![Issues](https://img.shields.io/badge/issues-Gitea-blue.svg)](https://gitea.hotserv.cloud/lmiranda/wikijs-sdk-python/issues)
**A professional Python SDK for Wiki.js API integration.** **A professional Python SDK for Wiki.js API integration.**
@@ -17,11 +17,11 @@
### Installation ### Installation
```bash ```bash
# Install directly from GitHub # Install directly from Gitea
pip install git+https://github.com/yourusername/wikijs-python-sdk.git pip install git+https://gitea.hotserv.cloud/lmiranda/wikijs-sdk-python.git
# Or clone and install locally # Or clone and install locally
git clone https://github.com/yourusername/wikijs-python-sdk.git git clone https://gitea.hotserv.cloud/lmiranda/wikijs-sdk-python.git
cd wikijs-python-sdk cd wikijs-python-sdk
pip install -e . pip install -e .
``` ```
@@ -117,8 +117,8 @@ We welcome contributions! This project showcases systematic development with pro
### Local Development ### Local Development
```bash ```bash
# Clone and setup (when repository is published) # Clone and setup
git clone https://github.com/yourusername/wikijs-python-sdk git clone https://gitea.hotserv.cloud/lmiranda/wikijs-sdk-python.git
cd wikijs-python-sdk cd wikijs-python-sdk
pip install -e ".[dev]" pip install -e ".[dev]"

View File

@@ -21,8 +21,8 @@ This project was developed by leomiranda, showcasing professional development pr
1. **Fork the Repository** 1. **Fork the Repository**
```bash ```bash
# Fork on GitHub, then clone your fork # Fork on Gitea, then clone your fork
git clone https://github.com/yourusername/wikijs-python-sdk.git git clone https://gitea.hotserv.cloud/lmiranda/wikijs-sdk-python.git
cd wikijs-python-sdk cd wikijs-python-sdk
``` ```
@@ -55,7 +55,7 @@ This project was developed by leomiranda, showcasing professional development pr
1. **Check Current Priorities** 1. **Check Current Priorities**
- Review [CLAUDE.md](CLAUDE.md) for current development tasks - Review [CLAUDE.md](CLAUDE.md) for current development tasks
- See [Development Plan](docs/wikijs_sdk_release_plan.md) for roadmap - See [Development Plan](docs/wikijs_sdk_release_plan.md) for roadmap
- Look for issues labeled `good first issue` - Look for issues in the Gitea repository
2. **Understand Architecture** 2. **Understand Architecture**
- Read [Architecture Overview](docs/wikijs_sdk_architecture.md) - Read [Architecture Overview](docs/wikijs_sdk_architecture.md)
@@ -275,7 +275,7 @@ def test_specific_behavior_with_expected_outcome():
Releases are managed by maintainers: Releases are managed by maintainers:
1. **Version Bump**: Update version in `wikijs/version.py` 1. **Version Bump**: Update version in `wikijs/version.py`
2. **Changelog**: Update `CHANGELOG.md` with changes 2. **Changelog**: Update `docs/CHANGELOG.md` with changes
3. **Tag Release**: Create git tag `v0.1.0` 3. **Tag Release**: Create git tag `v0.1.0`
4. **Automated**: GitHub Actions handles testing and GitHub release creation 4. **Automated**: GitHub Actions handles testing and GitHub release creation
@@ -336,7 +336,7 @@ Significant contributors may be invited to become maintainers.
1. Read our [Governance](docs/GOVERNANCE.md) guidelines 1. Read our [Governance](docs/GOVERNANCE.md) guidelines
2. Check the [current development status](CLAUDE.md) 2. Check the [current development status](CLAUDE.md)
3. Look for [good first issues](https://github.com/yourusername/wikijs-python-sdk/labels/good%20first%20issue) 3. Look for issues in the [repository](https://gitea.hotserv.cloud/lmiranda/wikijs-sdk-python/issues)
4. Join the discussion! 4. Join the discussion!
**Questions?** Don't hesitate to ask in [GitHub Discussions](https://github.com/yourusername/wikijs-python-sdk/discussions) or create an issue. **Questions?** Don't hesitate to create an issue in the [Gitea repository](https://gitea.hotserv.cloud/lmiranda/wikijs-sdk-python/issues).

View File

@@ -112,18 +112,16 @@ Create a high-quality Python SDK for Wiki.js that serves developers' needs while
- **Level 3**: Temporary restriction from participation - **Level 3**: Temporary restriction from participation
- **Level 4**: Permanent ban (only for severe violations) - **Level 4**: Permanent ban (only for severe violations)
Report issues to: [Maintainer Contact] - all reports handled confidentially. Report issues to: lmiranda@hotserv.cloud - all reports handled confidentially.
--- ---
## 📞 Communication Channels ## 📞 Communication Channels
### **GitHub Issues** ### **Gitea Issues**
- Bug reports and feature requests - Bug reports and feature requests
- Project planning and roadmap discussions - Project planning and roadmap discussions
- Technical questions about implementation - Technical questions about implementation
### **GitHub Discussions** *(Coming Soon)*
- General help and usage questions - General help and usage questions
- Community showcase and success stories - Community showcase and success stories
- Brainstorming new ideas and improvements - Brainstorming new ideas and improvements
@@ -131,7 +129,7 @@ Report issues to: [Maintainer Contact] - all reports handled confidentially.
### **Response Expectations** ### **Response Expectations**
- **Issues**: Response within 48-72 hours - **Issues**: Response within 48-72 hours
- **Pull Requests**: Initial review within 1 week - **Pull Requests**: Initial review within 1 week
- **Discussions**: Community-driven with maintainer backup - **Repository discussions**: Community-driven with maintainer backup
--- ---
@@ -178,7 +176,7 @@ This lightweight governance will evolve as the community grows:
- **[Development Plan](wikijs_sdk_release_plan.md)**: Current roadmap and priorities - **[Development Plan](wikijs_sdk_release_plan.md)**: Current roadmap and priorities
- **[Architecture](wikijs_sdk_architecture.md)**: Technical design overview - **[Architecture](wikijs_sdk_architecture.md)**: Technical design overview
- **[CLAUDE.md](../CLAUDE.md)**: Development workflow and coordination - **[CLAUDE.md](../CLAUDE.md)**: Development workflow and coordination
- **[Contributing Guide](../CONTRIBUTING.md)**: Detailed contribution process *(Coming Soon)* - **[Contributing Guide](CONTRIBUTING.md)**: Detailed contribution process
--- ---

View File

@@ -104,7 +104,7 @@ wikijs-python-sdk/
│ ├── development.md # This file │ ├── development.md # This file
│ └── ... │ └── ...
├── examples/ # Usage examples ├── examples/ # Usage examples
├── .github/ # GitHub workflows ├── .gitea/ # Gitea workflows
│ └── workflows/ # CI/CD pipelines │ └── workflows/ # CI/CD pipelines
├── pyproject.toml # Project configuration ├── pyproject.toml # Project configuration
├── setup.py # Package setup ├── setup.py # Package setup
@@ -537,7 +537,7 @@ We use [Semantic Versioning](https://semver.org/):
### Release Steps ### Release Steps
1. **Update version number** in `wikijs/version.py` 1. **Update version number** in `wikijs/version.py`
2. **Update CHANGELOG.md** with new version details 2. **Update docs/CHANGELOG.md** with new version details
3. **Run full test suite** and ensure all checks pass 3. **Run full test suite** and ensure all checks pass
4. **Create release commit**: 4. **Create release commit**:
```bash ```bash
@@ -560,7 +560,7 @@ We use [Semantic Versioning](https://semver.org/):
- [ ] All tests pass - [ ] All tests pass
- [ ] Code coverage meets requirements (>85%) - [ ] Code coverage meets requirements (>85%)
- [ ] Documentation is updated - [ ] Documentation is updated
- [ ] CHANGELOG.md is updated - [ ] docs/CHANGELOG.md is updated
- [ ] Version number is bumped - [ ] Version number is bumped
- [ ] No breaking changes without major version bump - [ ] No breaking changes without major version bump
- [ ] Examples work with new version - [ ] Examples work with new version

View File

@@ -1,7 +1,7 @@
# Wiki.js Python SDK - Release Plan # Wiki.js Python SDK - Release Plan
**Project Name:** `wikijs-python-sdk` **Project Name:** `wikijs-python-sdk`
**Repository:** `https://github.com/yourusername/wikijs-python-sdk` **Repository:** `https://gitea.hotserv.cloud/lmiranda/wikijs-sdk-python`
**License:** MIT **License:** MIT
**Target Audience:** Python developers, DevOps engineers, Data scientists **Target Audience:** Python developers, DevOps engineers, Data scientists
@@ -66,7 +66,7 @@ gantt
- **Documentation**: API documentation and usage examples - **Documentation**: API documentation and usage examples
### Success Criteria ### Success Criteria
- [ ] Package installable via `pip install wikijs-python-sdk` - [ ] Package installable via `pip install git+https://gitea.hotserv.cloud/lmiranda/wikijs-sdk-python.git`
- [ ] Basic page operations work with real Wiki.js instance - [ ] Basic page operations work with real Wiki.js instance
- [ ] >85% test coverage with passing CI/CD - [ ] >85% test coverage with passing CI/CD
- [ ] Complete API documentation - [ ] Complete API documentation
@@ -148,7 +148,7 @@ gantt
3. **Performance Benchmarking**: Regression testing 3. **Performance Benchmarking**: Regression testing
4. **Documentation Update**: Synchronized with code changes 4. **Documentation Update**: Synchronized with code changes
5. **PyPI Publishing**: Automated package distribution 5. **PyPI Publishing**: Automated package distribution
6. **GitHub Release**: Tagged release with changelog 6. **Gitea Release**: Tagged release with changelog
### Version Management ### Version Management
- **Semantic Versioning**: MAJOR.MINOR.PATCH - **Semantic Versioning**: MAJOR.MINOR.PATCH
@@ -172,7 +172,7 @@ gantt
### Community Building ### Community Building
- **Documentation First**: Comprehensive guides and examples - **Documentation First**: Comprehensive guides and examples
- **Issue Templates**: Structured bug reports and feature requests - **Issue Templates**: Structured bug reports and feature requests in Gitea
- **Contributing Guidelines**: Clear onboarding for new contributors - **Contributing Guidelines**: Clear onboarding for new contributors
- **Code of Conduct**: Inclusive community standards - **Code of Conduct**: Inclusive community standards
@@ -188,7 +188,7 @@ gantt
### Key Metrics ### Key Metrics
- **PyPI Downloads**: Measure adoption growth - **PyPI Downloads**: Measure adoption growth
- **GitHub Engagement**: Stars, forks, issues, PRs - **Gitea Engagement**: Stars, forks, issues, PRs
- **Test Coverage**: Maintain >90% throughout development - **Test Coverage**: Maintain >90% throughout development
- **Performance**: Response time and throughput benchmarks - **Performance**: Response time and throughput benchmarks
- **Community**: Contributors, issue resolution time - **Community**: Contributors, issue resolution time

View File

@@ -5,7 +5,7 @@ build-backend = "setuptools.build_meta"
[project] [project]
name = "wikijs-python-sdk" name = "wikijs-python-sdk"
description = "A professional Python SDK for Wiki.js API integration" description = "A professional Python SDK for Wiki.js API integration"
authors = [{name = "Wiki.js SDK Contributors", email = "contact@wikijs-sdk.dev"}] authors = [{name = "leomiranda", email = "lmiranda@hotserv.cloud"}]
license = {text = "MIT"} license = {text = "MIT"}
readme = "README.md" readme = "README.md"
requires-python = ">=3.8" requires-python = ">=3.8"
@@ -60,10 +60,10 @@ all = [
] ]
[project.urls] [project.urls]
Homepage = "https://github.com/yourusername/wikijs-python-sdk" Homepage = "https://gitea.hotserv.cloud/lmiranda/wikijs-sdk-python"
"Bug Reports" = "https://github.com/yourusername/wikijs-python-sdk/issues" "Bug Reports" = "https://gitea.hotserv.cloud/lmiranda/wikijs-sdk-python/issues"
Source = "https://github.com/yourusername/wikijs-python-sdk" Source = "https://gitea.hotserv.cloud/lmiranda/wikijs-sdk-python"
Documentation = "https://github.com/yourusername/wikijs-python-sdk/docs" Documentation = "https://gitea.hotserv.cloud/lmiranda/wikijs-sdk-python/src/branch/main/docs"
[tool.setuptools.dynamic] [tool.setuptools.dynamic]
version = {attr = "wikijs.version.__version__"} version = {attr = "wikijs.version.__version__"}

89
setup.py Normal file
View File

@@ -0,0 +1,89 @@
#!/usr/bin/env python3
"""Setup script for Wiki.js Python SDK."""
from setuptools import setup, find_packages
import os
def read_version():
"""Read version from wikijs/version.py."""
version_file = os.path.join("wikijs", "version.py")
with open(version_file, "r", encoding="utf-8") as f:
for line in f:
if line.startswith("__version__"):
return line.split("=")[1].strip().strip('"').strip("'")
raise RuntimeError("Unable to find version string.")
def read_readme():
"""Read README.md for long description."""
with open("README.md", "r", encoding="utf-8") as f:
return f.read()
def read_requirements():
"""Read requirements.txt for dependencies."""
with open("requirements.txt", "r", encoding="utf-8") as f:
return [line.strip() for line in f if line.strip() and not line.startswith("#")]
def read_dev_requirements():
"""Read requirements-dev.txt for development dependencies."""
try:
with open("requirements-dev.txt", "r", encoding="utf-8") as f:
deps = []
for line in f:
line = line.strip()
if line and not line.startswith("#") and not line.startswith("-r"):
deps.append(line)
return deps
except FileNotFoundError:
return []
setup(
name="wikijs-python-sdk",
version=read_version(),
description="A professional Python SDK for Wiki.js API integration",
long_description=read_readme(),
long_description_content_type="text/markdown",
author="leomiranda",
author_email="lmiranda@hotserv.cloud",
url="https://gitea.hotserv.cloud/lmiranda/wikijs-sdk-python",
project_urls={
"Bug Reports": "https://gitea.hotserv.cloud/lmiranda/wikijs-sdk-python/issues",
"Source": "https://gitea.hotserv.cloud/lmiranda/wikijs-sdk-python",
"Documentation": "https://gitea.hotserv.cloud/lmiranda/wikijs-sdk-python/src/branch/main/docs",
},
packages=find_packages(),
include_package_data=True,
package_data={
"wikijs": ["py.typed"],
},
install_requires=read_requirements(),
extras_require={
"dev": read_dev_requirements(),
"async": ["aiohttp>=3.8.0"],
"cli": ["click>=8.0.0", "rich>=12.0.0"],
"all": ["aiohttp>=3.8.0", "click>=8.0.0", "rich>=12.0.0"],
},
python_requires=">=3.8",
classifiers=[
"Development Status :: 3 - Alpha",
"Intended Audience :: Developers",
"License :: OSI Approved :: MIT License",
"Operating System :: OS Independent",
"Programming Language :: Python :: 3",
"Programming Language :: Python :: 3.8",
"Programming Language :: Python :: 3.9",
"Programming Language :: Python :: 3.10",
"Programming Language :: Python :: 3.11",
"Programming Language :: Python :: 3.12",
"Topic :: Software Development :: Libraries :: Python Modules",
"Topic :: Internet :: WWW/HTTP :: Dynamic Content",
"Topic :: Documentation",
"Typing :: Typed",
],
keywords=["wiki", "wikijs", "api", "sdk", "client", "http", "rest"],
zip_safe=False,
)

View File

@@ -110,7 +110,7 @@ class PagesEndpoint(BaseEndpoint):
""" """
# Build variables object # Build variables object
variables = {} variables: Dict[str, Any] = {}
if limit is not None: if limit is not None:
variables["limit"] = limit variables["limit"] = limit
if offset is not None: if offset is not None:
@@ -129,7 +129,7 @@ class PagesEndpoint(BaseEndpoint):
variables["orderDirection"] = order_direction variables["orderDirection"] = order_direction
# Make request with query and variables # Make request with query and variables
json_data = {"query": query} json_data: Dict[str, Any] = {"query": query}
if variables: if variables:
json_data["variables"] = variables json_data["variables"] = variables

View File

@@ -4,7 +4,7 @@ from datetime import datetime
from typing import Any, Dict, Optional from typing import Any, Dict, Optional
from pydantic import BaseModel as PydanticBaseModel from pydantic import BaseModel as PydanticBaseModel
from pydantic import ConfigDict from pydantic import ConfigDict, field_serializer
class BaseModel(PydanticBaseModel): class BaseModel(PydanticBaseModel):
@@ -26,8 +26,6 @@ class BaseModel(PydanticBaseModel):
use_enum_values=True, use_enum_values=True,
# Allow extra fields for forward compatibility # Allow extra fields for forward compatibility
extra="ignore", extra="ignore",
# Serialize datetime as ISO format
json_encoders={datetime: lambda v: v.isoformat() if v else None},
) )
def to_dict(self, exclude_none: bool = True) -> Dict[str, Any]: def to_dict(self, exclude_none: bool = True) -> Dict[str, Any]:
@@ -83,6 +81,11 @@ class TimestampedModel(BaseModel):
created_at: Optional[datetime] = None created_at: Optional[datetime] = None
updated_at: Optional[datetime] = None updated_at: Optional[datetime] = None
@field_serializer('created_at', 'updated_at')
def serialize_datetime(self, value: Optional[datetime]) -> Optional[str]:
"""Serialize datetime to ISO format."""
return value.isoformat() if value else None
@property @property
def is_new(self) -> bool: def is_new(self) -> bool:
"""Check if this is a new (unsaved) model.""" """Check if this is a new (unsaved) model."""

View File

@@ -3,7 +3,7 @@
import re import re
from typing import List, Optional from typing import List, Optional
from pydantic import Field, validator from pydantic import Field, field_validator
from .base import BaseModel, TimestampedModel from .base import BaseModel, TimestampedModel
@@ -37,7 +37,8 @@ class Page(TimestampedModel):
# Editor information # Editor information
editor: Optional[str] = Field(None, description="Editor used") editor: Optional[str] = Field(None, description="Editor used")
@validator("path") @field_validator("path")
@classmethod
def validate_path(cls, v: str) -> str: def validate_path(cls, v: str) -> str:
"""Validate page path format.""" """Validate page path format."""
if not v: if not v:
@@ -52,7 +53,8 @@ class Page(TimestampedModel):
return v return v
@validator("title") @field_validator("title")
@classmethod
def validate_title(cls, v: str) -> str: def validate_title(cls, v: str) -> str:
"""Validate page title.""" """Validate page title."""
if not v or not v.strip(): if not v or not v.strip():
@@ -132,7 +134,8 @@ class PageCreate(BaseModel):
locale: str = Field("en", description="Page locale") locale: str = Field("en", description="Page locale")
editor: str = Field("markdown", description="Editor to use") editor: str = Field("markdown", description="Editor to use")
@validator("path") @field_validator("path")
@classmethod
def validate_path(cls, v: str) -> str: def validate_path(cls, v: str) -> str:
"""Validate page path format.""" """Validate page path format."""
if not v: if not v:
@@ -147,7 +150,8 @@ class PageCreate(BaseModel):
return v return v
@validator("title") @field_validator("title")
@classmethod
def validate_title(cls, v: str) -> str: def validate_title(cls, v: str) -> str:
"""Validate page title.""" """Validate page title."""
if not v or not v.strip(): if not v or not v.strip():
@@ -172,7 +176,8 @@ class PageUpdate(BaseModel):
tags: Optional[List[str]] = Field(None, description="Page tags") tags: Optional[List[str]] = Field(None, description="Page tags")
@validator("title") @field_validator("title")
@classmethod
def validate_title(cls, v: Optional[str]) -> Optional[str]: def validate_title(cls, v: Optional[str]) -> Optional[str]:
"""Validate page title if provided.""" """Validate page title if provided."""
if v is not None: if v is not None:

View File

@@ -2,14 +2,13 @@
import sys import sys
import os import os
sys.path.insert(0, os.path.dirname(os.path.abspath(__file__))) sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))
from wikijs import WikiJSClient from wikijs import WikiJSClient
client = WikiJSClient( client = WikiJSClient(
base_url="https://wikijs.hotserv.cloud", base_url="https://wikijs.hotserv.cloud",
auth="eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJhcGkiOjEsImdycCI6MSwiaWF0IjoxNTM4ODM1NTQ1LCJleHAiOjE3ODUzOTMxNDUsImF1ZCI6InVybjp3aWtpLmpzIiwiaXNzIjoidXJuOndpa2kuanMifQ.d1fCZMqS-4gR5TfcMU4CLc_mD-uyYxlUxPbxbqqdIazruKKmBLACkVEumf-RFgEatsuCQjQiU0A6E_IfwFBgqFy1g5W_Ly9st7_5k6JOHfn4shGnCrRv3FBLHOtiRUexURcXNvHxh00oEJ8IPuhmTDSpc1g5ssVeNR9oHwz8V-CIvtmP_S5NIalTVEeOXmSSfyHXK4_sMx8zbBb8tCHNt1tbhZ8Z5N--pqvWZFC_ddYZ8-kMkQo-ni1rP48WLpEngWCij6mAPKhdqLjykmIkZF_hwnfvunG7iIZpFVoUJ3uIc09GkIVa5VdpcBHD4w1rnpouWZP8FuR9aHlAL7sB3Q", auth="eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJhcGkiOjEsImdycCI6MSwiaWF0IjoxNTM4ODM1NTQ1LCJleHAiOjE3ODUzOTMxNDUsImF1ZCI6InVybjp3aWtpLmpzIiwiaXNzIjoidXJuOndpa2kuanMifQ.d1fCZMqS-4gR5TfcMU4CLc_mD-uyYxlUxPbxbqqdIazruKKmBLACkVEumf-RFgEatsuCQjQiU0A6E_IfwFBgqFy1g5W_Ly9st7_5k6JOHfn4shGnCrRv3FBLHOtiRUexURcXNvHxh00oEJ8IPuhmTDSpc1g5ssVeNR9oHwz8V-CIvtmP_S5NIalTVEeOXmSSfyHXK4_sMx8zbBb8tCHNt1tbhZ8Z5N--pqvWZFC_ddYZ8-kMkQo-ni1rP48WLpEngWCij6mAPKhdqLjykmIkZF_hwnfvunG7iIZpFVoUJ3uIc09GkIVa5VdpcBHD4w1rnpouWZP8FuR9aHlAL7sB3Q"
) )
print("✅ Client created") print("✅ Client created")
@@ -20,5 +19,3 @@ for i, page in enumerate(pages[:5], 1):
print(f" {i}. {page.title} (ID: {page.id})") print(f" {i}. {page.title} (ID: {page.id})")
client.close() client.close()
print("✅ SDK working!") print("✅ SDK working!")
print("just my test")