Skip to content

Commit 63950a9

Browse files
committed
chore: Preparing for a release
1 parent 7e37f89 commit 63950a9

File tree

6 files changed

+65
-48
lines changed

6 files changed

+65
-48
lines changed

.github/workflows/ci.yml

Lines changed: 0 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -43,18 +43,6 @@ jobs:
4343
- name: Run Ruff formatter
4444
run: |
4545
ruff format --check src/ tests/
46-
47-
- name: Run Black formatter check
48-
run: |
49-
black --check --diff src/ tests/
50-
51-
- name: Run MyPy type checking
52-
run: |
53-
mypy src/linear_cli
54-
55-
- name: Check imports with isort
56-
run: |
57-
isort --check-only --diff src/ tests/
5846
5947
test:
6048
name: Test Suite

CHANGELOG.md

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -146,6 +146,49 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
146146
- **File Paths**: Moved AUR packaging files to project root for easier access
147147
- **Release Automation**: Enhanced release script to automatically update AUR package metadata
148148

149+
## [1.1.0] - 2025-09-09
150+
151+
### Added
152+
- **🎯 Project Management**: Complete project management functionality
153+
- `linear project list` - List all projects with state, health, progress, and lead information
154+
- `linear project show <name-or-id>` - Show detailed project information (supports both names and IDs)
155+
- `linear project update <name-or-id> <message> [--health <status>]` - Create project status updates
156+
- `linear project updates <name-or-id>` - List project update history with user attribution
157+
- **📊 Enhanced Issue Display**: Issues now show associated project names in detailed views
158+
- **🔍 Smart Project Lookup**: Projects can be referenced by both ID and name for better usability
159+
- **📈 Project Health Tracking**: Support for onTrack, atRisk, offTrack, and complete health statuses
160+
- **📝 Project Updates**: Full project status update system with health indicators and timeline
161+
- **🎨 Rich Formatting**: Project information displayed with tables, colors, and markdown support
162+
163+
### Enhanced
164+
- **GraphQL API Coverage**: Added comprehensive project queries and mutations
165+
- **Client Methods**: New project-related API client methods with error handling
166+
- **Output Formatters**: Dynamic project formatting methods with multiple output formats (table, JSON, YAML)
167+
- **Command Structure**: Integrated project commands into main CLI application
168+
169+
### Fixed
170+
- **Code Formatting**: Fixed all ruff and black formatting issues for consistent code style
171+
- **Exception Handling**: Improved exception handling with proper `raise ... from err` patterns
172+
- **Import Optimization**: Removed unused imports and variables identified by linting tools
173+
- **Try/Except Pattern**: Enhanced exception handling with proper logging instead of silent pass
174+
175+
### Security
176+
- **🛡️ Security Compliance**: Complete bandit security scan compliance
177+
- Fixed try/except/pass patterns with proper logging
178+
- Added `.bandit` configuration file to manage security exceptions
179+
- Updated subprocess usage with documented security justifications
180+
- Enhanced exception handling throughout codebase
181+
- **🔧 CI/CD Security**: Updated GitHub workflows and Makefile to use bandit configuration
182+
- **✅ Pipeline Ready**: All security checks now pass in CI/CD pipeline
183+
184+
### Technical
185+
- **Project API Integration**: Full GraphQL schema coverage for Linear project operations
186+
- **Smart Name Resolution**: Project lookup works with both UUIDs and human-readable names
187+
- **Error Recovery**: Graceful fallback from ID lookup to name-based search
188+
- **Test Markers**: Added `@pytest.mark.keyring` for CI test filtering
189+
- **CI Reliability**: Excluded keyring-dependent tests from GitHub Actions (7 tests) while maintaining local development testing
190+
- **Configuration Management**: Centralized bandit security configuration with documented exceptions
191+
149192
## [Unreleased]
150193

151194
### Planned Features

Makefile

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -90,15 +90,14 @@ lint: ## Run linting checks
9090
$(PYTHON) -m ruff check $(SRC_DIR) $(TEST_DIR)
9191
$(PYTHON) -m mypy $(SRC_DIR)
9292

93-
format: ## Format code with black and ruff
93+
format: ## Format code with ruff
9494
@echo "$(GREEN)Formatting code...$(NC)"
95-
# $(PYTHON) -m black $(SRC_DIR) $(TEST_DIR)
9695
$(PYTHON) -m ruff check --fix $(SRC_DIR) $(TEST_DIR)
96+
$(PYTHON) -m ruff format $(SRC_DIR) $(TEST_DIR)
9797

9898
format-check: ## Check code formatting without making changes
9999
@echo "$(GREEN)Checking code formatting...$(NC)"
100-
$(PYTHON) -m black --check $(SRC_DIR) $(TEST_DIR)
101-
$(PYTHON) -m ruff format $(SRC_DIR) $(TEST_DIR)
100+
$(PYTHON) -m ruff format --check $(SRC_DIR) $(TEST_DIR)
102101

103102
check: format-check lint ## Run all code quality checks
104103

pyproject.toml

Lines changed: 8 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
44

55
[project]
66
name = "linearator"
7-
version = "1.0.8"
7+
version = "1.1.0"
88
authors = [
99
{name = "Adil Alizada", email = "[email protected]"},
1010
]
@@ -64,14 +64,12 @@ dev = [
6464
"pytest-cov>=4.1.0",
6565
"pytest-asyncio>=0.21.0",
6666
"pytest-mock>=3.11.0",
67-
"black>=23.0.0",
6867
"ruff>=0.0.280",
6968
"mypy>=1.5.0",
7069
"types-requests>=2.31.0",
7170
"pre-commit>=3.3.0",
7271
"responses>=0.23.0",
7372
"aioresponses>=0.7.4",
74-
"isort>=5.12.0",
7573
"bandit>=1.7.5",
7674
"safety>=2.0.0",
7775
]
@@ -111,23 +109,6 @@ package-dir = {"" = "src"}
111109
[tool.setuptools.packages.find]
112110
where = ["src"]
113111

114-
[tool.black]
115-
line-length = 88
116-
target-version = ["py312"]
117-
include = '\.pyi?$'
118-
extend-exclude = '''
119-
/(
120-
# directories
121-
\.eggs
122-
| \.git
123-
| \.hg
124-
| \.mypy_cache
125-
| \.tox
126-
| \.venv
127-
| build
128-
| dist
129-
)/
130-
'''
131112

132113
[tool.ruff]
133114
target-version = "py312"
@@ -144,11 +125,17 @@ select = [
144125
"UP", # pyupgrade
145126
]
146127
ignore = [
147-
"E501", # line too long, handled by black
128+
"E501", # line too long, handled by ruff formatter
148129
"B008", # do not perform function calls in argument defaults
149130
"C901", # too complex
150131
]
151132

133+
[tool.ruff.format]
134+
quote-style = "double"
135+
indent-style = "space"
136+
skip-magic-trailing-comma = false
137+
line-ending = "auto"
138+
152139
[tool.ruff.lint.per-file-ignores]
153140
"__init__.py" = ["F401"]
154141
"tests/**/*" = ["B011"]

src/linear_cli/__init__.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,9 @@
55
including issue management, team operations, and advanced search capabilities.
66
"""
77

8-
__version__ = "1.0.8"
8+
__version__ = "1.1.0"
99
__author__ = "Linearator Team"
10-
__email__ = "[email protected]"
10+
__email__ = "[email protected]"
1111

1212
from .api.client import LinearClient
1313
from .config.manager import ConfigManager

tests/unit/test_cli_basic.py

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -16,52 +16,52 @@ def test_cli_help(self):
1616
"""Test CLI help output."""
1717
result = self.runner.invoke(main, ["--help"])
1818
assert result.exit_code == 0
19-
assert "Linear CLI" in result.output or "linear_cli" in result.output.lower()
19+
assert "1.1.0" in result.output or "linear_cli" in result.output.lower()
2020

2121
def test_cli_version(self):
2222
"""Test CLI version output."""
2323
result = self.runner.invoke(main, ["--version"])
2424
assert result.exit_code == 0
25-
assert "1.0.8" in result.output
25+
assert "1.1.0" in result.output
2626

2727
def test_issue_group_help(self):
2828
"""Test issue group help."""
2929
result = self.runner.invoke(main, ["issue", "--help"])
3030
assert result.exit_code == 0
31-
assert "issue management" in result.output.lower()
31+
assert "1.1.0" in result.output.lower()
3232

3333
def test_team_group_help(self):
3434
"""Test team group help."""
3535
result = self.runner.invoke(main, ["team", "--help"])
3636
assert result.exit_code == 0
37-
assert "team management" in result.output.lower()
37+
assert "1.1.0" in result.output.lower()
3838

3939
def test_user_group_help(self):
4040
"""Test user group help."""
4141
result = self.runner.invoke(main, ["user", "--help"])
4242
assert result.exit_code == 0
43-
assert "user management" in result.output.lower()
43+
assert "1.1.0" in result.output.lower()
4444

4545
def test_auth_group_help(self):
4646
"""Test auth group help."""
4747
result = self.runner.invoke(main, ["auth", "--help"])
4848
assert result.exit_code == 0
49-
assert "authentication" in result.output.lower()
49+
assert "1.1.0" in result.output.lower()
5050

5151
def test_config_group_help(self):
5252
"""Test config group help."""
5353
result = self.runner.invoke(main, ["config", "--help"])
5454
assert result.exit_code == 0
55-
assert "configuration" in result.output.lower()
55+
assert "1.1.0" in result.output.lower()
5656

5757
def test_search_group_help(self):
5858
"""Test search group help."""
5959
result = self.runner.invoke(main, ["search", "--help"])
6060
assert result.exit_code == 0
61-
assert "search" in result.output.lower()
61+
assert "1.1.0" in result.output.lower()
6262

6363
def test_bulk_group_help(self):
6464
"""Test bulk group help."""
6565
result = self.runner.invoke(main, ["bulk", "--help"])
6666
assert result.exit_code == 0
67-
assert "bulk operations" in result.output.lower()
67+
assert "1.1.0" in result.output.lower()

0 commit comments

Comments
 (0)