getjobber-cli 1.0.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- getjobber_cli-1.0.0/LICENSE +21 -0
- getjobber_cli-1.0.0/PKG-INFO +427 -0
- getjobber_cli-1.0.0/README.md +384 -0
- getjobber_cli-1.0.0/pyproject.toml +85 -0
- getjobber_cli-1.0.0/setup.cfg +4 -0
- getjobber_cli-1.0.0/src/getjobber_cli/__init__.py +5 -0
- getjobber_cli-1.0.0/src/getjobber_cli/__main__.py +6 -0
- getjobber_cli-1.0.0/src/getjobber_cli/api/__init__.py +0 -0
- getjobber_cli-1.0.0/src/getjobber_cli/api/client.py +149 -0
- getjobber_cli-1.0.0/src/getjobber_cli/api/mutations.py +251 -0
- getjobber_cli-1.0.0/src/getjobber_cli/api/queries.py +264 -0
- getjobber_cli-1.0.0/src/getjobber_cli/auth/__init__.py +0 -0
- getjobber_cli-1.0.0/src/getjobber_cli/auth/callback_server.py +187 -0
- getjobber_cli-1.0.0/src/getjobber_cli/auth/oauth.py +211 -0
- getjobber_cli-1.0.0/src/getjobber_cli/auth/token_manager.py +226 -0
- getjobber_cli-1.0.0/src/getjobber_cli/cli.py +115 -0
- getjobber_cli-1.0.0/src/getjobber_cli/commands/__init__.py +0 -0
- getjobber_cli-1.0.0/src/getjobber_cli/commands/auth_commands.py +184 -0
- getjobber_cli-1.0.0/src/getjobber_cli/commands/client_commands.py +335 -0
- getjobber_cli-1.0.0/src/getjobber_cli/commands/config_commands.py +87 -0
- getjobber_cli-1.0.0/src/getjobber_cli/commands/invoice_commands.py +192 -0
- getjobber_cli-1.0.0/src/getjobber_cli/commands/job_commands.py +250 -0
- getjobber_cli-1.0.0/src/getjobber_cli/commands/query_commands.py +70 -0
- getjobber_cli-1.0.0/src/getjobber_cli/commands/quote_commands.py +209 -0
- getjobber_cli-1.0.0/src/getjobber_cli/constants.py +56 -0
- getjobber_cli-1.0.0/src/getjobber_cli/utils/__init__.py +0 -0
- getjobber_cli-1.0.0/src/getjobber_cli/utils/config.py +147 -0
- getjobber_cli-1.0.0/src/getjobber_cli/utils/errors.py +112 -0
- getjobber_cli-1.0.0/src/getjobber_cli/utils/formatters.py +238 -0
- getjobber_cli-1.0.0/src/getjobber_cli.egg-info/PKG-INFO +427 -0
- getjobber_cli-1.0.0/src/getjobber_cli.egg-info/SOURCES.txt +34 -0
- getjobber_cli-1.0.0/src/getjobber_cli.egg-info/dependency_links.txt +1 -0
- getjobber_cli-1.0.0/src/getjobber_cli.egg-info/entry_points.txt +2 -0
- getjobber_cli-1.0.0/src/getjobber_cli.egg-info/requires.txt +16 -0
- getjobber_cli-1.0.0/src/getjobber_cli.egg-info/top_level.txt +1 -0
- getjobber_cli-1.0.0/tests/test_config.py +43 -0
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 getjobber-cli contributors
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
|
@@ -0,0 +1,427 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: getjobber-cli
|
|
3
|
+
Version: 1.0.0
|
|
4
|
+
Summary: A portable Python CLI for the Jobber GraphQL API — originally built by DC Tree Cutting and Land Service for internal automation.
|
|
5
|
+
Author-email: Anthony Vincent Caracappa <now@dctreecutting.com>, DC Tree Cutting and Land Service <now@dctreecutting.com>
|
|
6
|
+
Maintainer: Anthony Vincent Caracappa
|
|
7
|
+
License: MIT
|
|
8
|
+
Project-URL: Homepage, https://dctreecutting.com
|
|
9
|
+
Project-URL: Author, https://github.com/acaracappa
|
|
10
|
+
Project-URL: Sponsor, https://dctreecutting.com
|
|
11
|
+
Project-URL: Repository, https://github.com/acaracappa/getjobber-cli
|
|
12
|
+
Project-URL: Documentation, https://github.com/acaracappa/getjobber-cli#readme
|
|
13
|
+
Project-URL: Issues, https://github.com/acaracappa/getjobber-cli/issues
|
|
14
|
+
Keywords: getjobber,cli,crm,graphql,api
|
|
15
|
+
Classifier: Development Status :: 5 - Production/Stable
|
|
16
|
+
Classifier: Intended Audience :: Developers
|
|
17
|
+
Classifier: License :: OSI Approved :: MIT License
|
|
18
|
+
Classifier: Programming Language :: Python :: 3
|
|
19
|
+
Classifier: Programming Language :: Python :: 3.10
|
|
20
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
21
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
22
|
+
Classifier: Topic :: Software Development :: Libraries :: Python Modules
|
|
23
|
+
Classifier: Topic :: Utilities
|
|
24
|
+
Requires-Python: >=3.10
|
|
25
|
+
Description-Content-Type: text/markdown
|
|
26
|
+
License-File: LICENSE
|
|
27
|
+
Requires-Dist: typer[all]>=0.9.0
|
|
28
|
+
Requires-Dist: gql[requests]>=3.4.0
|
|
29
|
+
Requires-Dist: requests>=2.31.0
|
|
30
|
+
Requires-Dist: requests-oauthlib>=1.3.1
|
|
31
|
+
Requires-Dist: requests-toolbelt>=1.0.0
|
|
32
|
+
Requires-Dist: keyring>=24.0.0
|
|
33
|
+
Requires-Dist: rich>=13.0.0
|
|
34
|
+
Requires-Dist: pyyaml>=6.0
|
|
35
|
+
Requires-Dist: typing_extensions>=4.0.0
|
|
36
|
+
Provides-Extra: dev
|
|
37
|
+
Requires-Dist: pytest>=7.4.0; extra == "dev"
|
|
38
|
+
Requires-Dist: pytest-cov>=4.1.0; extra == "dev"
|
|
39
|
+
Requires-Dist: black>=23.0.0; extra == "dev"
|
|
40
|
+
Requires-Dist: mypy>=1.5.0; extra == "dev"
|
|
41
|
+
Requires-Dist: responses>=0.23.0; extra == "dev"
|
|
42
|
+
Dynamic: license-file
|
|
43
|
+
|
|
44
|
+
# getjobber-cli
|
|
45
|
+
|
|
46
|
+
[](https://pypi.org/project/getjobber-cli/) [](LICENSE) [](https://pypi.org/project/getjobber-cli/) [](https://github.com/acaracappa/getjobber-cli/actions/workflows/test.yml)
|
|
47
|
+
|
|
48
|
+
Built and maintained by [DC Tree Cutting](https://dctreecutting.com), an Eastern North Carolina tree service.
|
|
49
|
+
|
|
50
|
+
A portable, Python-based CLI tool that provides terminal access to the GetJobber CRM GraphQL API.
|
|
51
|
+
|
|
52
|
+
## Table of Contents
|
|
53
|
+
|
|
54
|
+
- [⚠️ Important](#-important)
|
|
55
|
+
- [Features](#features)
|
|
56
|
+
- [About this tool](#about-this-tool)
|
|
57
|
+
- [Requirements](#requirements)
|
|
58
|
+
- [Installation](#installation)
|
|
59
|
+
- [Quick Start](#quick-start)
|
|
60
|
+
- [Command Reference](#command-reference)
|
|
61
|
+
- [Output Formats](#output-formats)
|
|
62
|
+
- [Configuration](#configuration)
|
|
63
|
+
- [Token Storage](#token-storage)
|
|
64
|
+
- [Troubleshooting](#troubleshooting)
|
|
65
|
+
- [Development](#development)
|
|
66
|
+
- [Maintainer](#maintainer)
|
|
67
|
+
- [License](#license)
|
|
68
|
+
- [Contributing](#contributing)
|
|
69
|
+
- [Support](#support)
|
|
70
|
+
- [Acknowledgments](#acknowledgments)
|
|
71
|
+
|
|
72
|
+
## ⚠️ Important
|
|
73
|
+
|
|
74
|
+
**Please read our [Privacy Policy and Terms of Use](PRIVACY_AND_TERMS.md) before using this tool.**
|
|
75
|
+
|
|
76
|
+
This tool is provided as-is with no warranties. You use it at your own risk. We collect no data and assume no liability for any impact to your GetJobber account.
|
|
77
|
+
|
|
78
|
+
## Features
|
|
79
|
+
|
|
80
|
+
- **OAuth 2.0 Authentication** - Secure browser-based authentication with automatic token refresh
|
|
81
|
+
- **Client Management** - Create, read, update, delete, and search clients
|
|
82
|
+
- **Job Management** - Manage jobs with full CRUD operations
|
|
83
|
+
- **Quote Management** - Create, send, and approve quotes
|
|
84
|
+
- **Invoice Management** - Create and send invoices, track payments
|
|
85
|
+
- **Raw GraphQL Queries** - Execute custom GraphQL queries directly
|
|
86
|
+
- **Multiple Output Formats** - Table, JSON, CSV, and YAML output formats
|
|
87
|
+
- **Secure Token Storage** - OS-level keychain integration (macOS Keychain, Windows Credential Manager, Linux Secret Service)
|
|
88
|
+
|
|
89
|
+
## About this tool
|
|
90
|
+
|
|
91
|
+
`getjobber-cli` was originally built by [DC Tree Cutting and Land Service](https://dctreecutting.com) — an Eastern North Carolina tree service operating from Rocky Mount and Goldsboro across nine counties — to automate internal workflows on top of the Jobber field-service platform. It is released as open source under the MIT License for any Jobber customer or developer who wants terminal access to the Jobber GraphQL API.
|
|
92
|
+
|
|
93
|
+
## Requirements
|
|
94
|
+
|
|
95
|
+
- Python 3.10 or higher
|
|
96
|
+
- GetJobber account with OAuth app credentials
|
|
97
|
+
|
|
98
|
+
## Installation
|
|
99
|
+
|
|
100
|
+
### From Source
|
|
101
|
+
|
|
102
|
+
```bash
|
|
103
|
+
# Clone the repository (or navigate to the project directory)
|
|
104
|
+
cd getjobber-cli
|
|
105
|
+
|
|
106
|
+
# Install in development mode
|
|
107
|
+
pip install -e .
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
### Via pip (future)
|
|
111
|
+
|
|
112
|
+
```bash
|
|
113
|
+
pip install getjobber-cli
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
## Quick Start
|
|
117
|
+
|
|
118
|
+
### 1. Set up OAuth Credentials
|
|
119
|
+
|
|
120
|
+
First, you need to create an OAuth app in your GetJobber account:
|
|
121
|
+
|
|
122
|
+
1. Log in to your GetJobber account at https://app.getjobber.com
|
|
123
|
+
2. Navigate to **Settings → Developer Center**
|
|
124
|
+
3. Click "Create New App"
|
|
125
|
+
4. Fill in app details:
|
|
126
|
+
- **App Name**: "getjobber-cli" (or your preferred name)
|
|
127
|
+
- **Redirect URI**: `http://localhost:8888/callback`
|
|
128
|
+
- **Scopes**: Select the scopes you need (clients:read, clients:write, jobs:read, etc.)
|
|
129
|
+
5. Click "Create App" and copy your Client ID and Client Secret
|
|
130
|
+
|
|
131
|
+
### 2. Configure the CLI
|
|
132
|
+
|
|
133
|
+
```bash
|
|
134
|
+
# Set your OAuth credentials
|
|
135
|
+
getjobber-cli config set client_id YOUR_CLIENT_ID
|
|
136
|
+
getjobber-cli config set client_secret YOUR_CLIENT_SECRET
|
|
137
|
+
|
|
138
|
+
# Verify configuration
|
|
139
|
+
getjobber-cli config list
|
|
140
|
+
```
|
|
141
|
+
|
|
142
|
+
### 3. Authenticate
|
|
143
|
+
|
|
144
|
+
```bash
|
|
145
|
+
# Start OAuth login flow (will open browser)
|
|
146
|
+
getjobber-cli login
|
|
147
|
+
|
|
148
|
+
# Check authentication status
|
|
149
|
+
getjobber-cli auth status
|
|
150
|
+
```
|
|
151
|
+
|
|
152
|
+
### 4. Start Using
|
|
153
|
+
|
|
154
|
+
```bash
|
|
155
|
+
# List all clients
|
|
156
|
+
getjobber-cli clients list
|
|
157
|
+
|
|
158
|
+
# Get client details
|
|
159
|
+
getjobber-cli clients get CLIENT_ID
|
|
160
|
+
|
|
161
|
+
# Create a new client
|
|
162
|
+
getjobber-cli clients create --first-name="John" --last-name="Doe" --email="john@example.com"
|
|
163
|
+
|
|
164
|
+
# List jobs
|
|
165
|
+
getjobber-cli jobs list
|
|
166
|
+
|
|
167
|
+
# Execute a raw GraphQL query
|
|
168
|
+
getjobber-cli query '{ clients(first: 5) { nodes { id firstName lastName } } }'
|
|
169
|
+
```
|
|
170
|
+
|
|
171
|
+
## Command Reference
|
|
172
|
+
|
|
173
|
+
### Authentication Commands
|
|
174
|
+
|
|
175
|
+
```bash
|
|
176
|
+
# Login with OAuth
|
|
177
|
+
getjobber-cli login
|
|
178
|
+
|
|
179
|
+
# Logout
|
|
180
|
+
getjobber-cli logout
|
|
181
|
+
|
|
182
|
+
# Check authentication status
|
|
183
|
+
getjobber-cli auth status
|
|
184
|
+
|
|
185
|
+
# Manually refresh token
|
|
186
|
+
getjobber-cli auth refresh
|
|
187
|
+
```
|
|
188
|
+
|
|
189
|
+
### Client Commands
|
|
190
|
+
|
|
191
|
+
```bash
|
|
192
|
+
# List clients
|
|
193
|
+
getjobber-cli clients list
|
|
194
|
+
getjobber-cli clients list --limit=50 --format=json
|
|
195
|
+
|
|
196
|
+
# Get client details
|
|
197
|
+
getjobber-cli clients get CLIENT_ID
|
|
198
|
+
|
|
199
|
+
# Create client (interactive)
|
|
200
|
+
getjobber-cli clients create
|
|
201
|
+
|
|
202
|
+
# Create client (with flags)
|
|
203
|
+
getjobber-cli clients create \
|
|
204
|
+
--first-name="John" \
|
|
205
|
+
--last-name="Doe" \
|
|
206
|
+
--email="john@example.com" \
|
|
207
|
+
--phone="555-1234"
|
|
208
|
+
|
|
209
|
+
# Update client
|
|
210
|
+
getjobber-cli clients update CLIENT_ID --email="newemail@example.com"
|
|
211
|
+
|
|
212
|
+
# Search clients
|
|
213
|
+
getjobber-cli clients search "company name"
|
|
214
|
+
|
|
215
|
+
# Delete client
|
|
216
|
+
getjobber-cli clients delete CLIENT_ID
|
|
217
|
+
```
|
|
218
|
+
|
|
219
|
+
### Job Commands
|
|
220
|
+
|
|
221
|
+
```bash
|
|
222
|
+
# List jobs
|
|
223
|
+
getjobber-cli jobs list
|
|
224
|
+
getjobber-cli jobs list --status=active
|
|
225
|
+
|
|
226
|
+
# Get job details
|
|
227
|
+
getjobber-cli jobs get JOB_ID
|
|
228
|
+
|
|
229
|
+
# Create job
|
|
230
|
+
getjobber-cli jobs create --client-id=CLIENT_ID --title="Lawn Maintenance"
|
|
231
|
+
|
|
232
|
+
# Update job
|
|
233
|
+
getjobber-cli jobs update JOB_ID --title="Updated Title"
|
|
234
|
+
|
|
235
|
+
# Complete job
|
|
236
|
+
getjobber-cli jobs complete JOB_ID
|
|
237
|
+
```
|
|
238
|
+
|
|
239
|
+
### Quote Commands
|
|
240
|
+
|
|
241
|
+
```bash
|
|
242
|
+
# List quotes
|
|
243
|
+
getjobber-cli quotes list
|
|
244
|
+
getjobber-cli quotes list --status=draft
|
|
245
|
+
|
|
246
|
+
# Get quote details
|
|
247
|
+
getjobber-cli quotes get QUOTE_ID
|
|
248
|
+
|
|
249
|
+
# Create quote
|
|
250
|
+
getjobber-cli quotes create --client-id=CLIENT_ID --title="Service Quote"
|
|
251
|
+
|
|
252
|
+
# Send quote to client
|
|
253
|
+
getjobber-cli quotes send QUOTE_ID
|
|
254
|
+
|
|
255
|
+
# Approve quote
|
|
256
|
+
getjobber-cli quotes approve QUOTE_ID
|
|
257
|
+
```
|
|
258
|
+
|
|
259
|
+
### Invoice Commands
|
|
260
|
+
|
|
261
|
+
```bash
|
|
262
|
+
# List invoices
|
|
263
|
+
getjobber-cli invoices list
|
|
264
|
+
getjobber-cli invoices list --unpaid
|
|
265
|
+
|
|
266
|
+
# Get invoice details
|
|
267
|
+
getjobber-cli invoices get INVOICE_ID
|
|
268
|
+
|
|
269
|
+
# Create invoice from job
|
|
270
|
+
getjobber-cli invoices create --job-id=JOB_ID --subject="Service Invoice"
|
|
271
|
+
|
|
272
|
+
# Create invoice for client
|
|
273
|
+
getjobber-cli invoices create --client-id=CLIENT_ID --subject="Invoice"
|
|
274
|
+
|
|
275
|
+
# Send invoice to client
|
|
276
|
+
getjobber-cli invoices send INVOICE_ID
|
|
277
|
+
```
|
|
278
|
+
|
|
279
|
+
### Raw GraphQL Query
|
|
280
|
+
|
|
281
|
+
```bash
|
|
282
|
+
# Execute inline query
|
|
283
|
+
getjobber-cli query '{ clients(first: 5) { nodes { id firstName lastName } } }'
|
|
284
|
+
|
|
285
|
+
# Execute query from file
|
|
286
|
+
getjobber-cli query --file=query.graphql
|
|
287
|
+
|
|
288
|
+
# Interactive query (opens editor)
|
|
289
|
+
getjobber-cli query --interactive
|
|
290
|
+
```
|
|
291
|
+
|
|
292
|
+
### Configuration Commands
|
|
293
|
+
|
|
294
|
+
```bash
|
|
295
|
+
# Set configuration value
|
|
296
|
+
getjobber-cli config set KEY VALUE
|
|
297
|
+
|
|
298
|
+
# Get configuration value
|
|
299
|
+
getjobber-cli config get KEY
|
|
300
|
+
|
|
301
|
+
# List all configuration
|
|
302
|
+
getjobber-cli config list
|
|
303
|
+
|
|
304
|
+
# Reset to defaults
|
|
305
|
+
getjobber-cli config reset
|
|
306
|
+
```
|
|
307
|
+
|
|
308
|
+
## Output Formats
|
|
309
|
+
|
|
310
|
+
All list commands support multiple output formats:
|
|
311
|
+
|
|
312
|
+
```bash
|
|
313
|
+
# Table format (default, human-readable)
|
|
314
|
+
getjobber-cli clients list --format=table
|
|
315
|
+
|
|
316
|
+
# JSON format (machine-readable)
|
|
317
|
+
getjobber-cli clients list --format=json
|
|
318
|
+
|
|
319
|
+
# CSV format (spreadsheet export)
|
|
320
|
+
getjobber-cli clients list --format=csv
|
|
321
|
+
|
|
322
|
+
# YAML format
|
|
323
|
+
getjobber-cli clients list --format=yaml
|
|
324
|
+
```
|
|
325
|
+
|
|
326
|
+
## Configuration
|
|
327
|
+
|
|
328
|
+
Configuration is stored in `~/.getjobber/config.json`:
|
|
329
|
+
|
|
330
|
+
```json
|
|
331
|
+
{
|
|
332
|
+
"client_id": "your_client_id",
|
|
333
|
+
"client_secret": "your_client_secret",
|
|
334
|
+
"default_output_format": "table",
|
|
335
|
+
"items_per_page": 20
|
|
336
|
+
}
|
|
337
|
+
```
|
|
338
|
+
|
|
339
|
+
## Token Storage
|
|
340
|
+
|
|
341
|
+
Authentication tokens are stored securely using the OS keychain:
|
|
342
|
+
- **macOS**: Keychain
|
|
343
|
+
- **Windows**: Credential Manager
|
|
344
|
+
- **Linux**: Secret Service
|
|
345
|
+
|
|
346
|
+
If keychain is unavailable, tokens are stored in an encrypted file at `~/.getjobber/credentials.enc` with restricted permissions (0600).
|
|
347
|
+
|
|
348
|
+
## Troubleshooting
|
|
349
|
+
|
|
350
|
+
### "Not authenticated" error
|
|
351
|
+
|
|
352
|
+
Run `getjobber-cli login` to authenticate.
|
|
353
|
+
|
|
354
|
+
### "OAuth credentials not configured" error
|
|
355
|
+
|
|
356
|
+
Configure your OAuth credentials:
|
|
357
|
+
```bash
|
|
358
|
+
getjobber-cli config set client_id YOUR_CLIENT_ID
|
|
359
|
+
getjobber-cli config set client_secret YOUR_CLIENT_SECRET
|
|
360
|
+
```
|
|
361
|
+
|
|
362
|
+
### Browser doesn't open during login
|
|
363
|
+
|
|
364
|
+
If the browser doesn't open automatically, copy the URL from the terminal and paste it into your browser.
|
|
365
|
+
|
|
366
|
+
### Token expired
|
|
367
|
+
|
|
368
|
+
Tokens are automatically refreshed when they expire. If you encounter issues, run:
|
|
369
|
+
```bash
|
|
370
|
+
getjobber-cli auth refresh
|
|
371
|
+
```
|
|
372
|
+
|
|
373
|
+
Or login again:
|
|
374
|
+
```bash
|
|
375
|
+
getjobber-cli login
|
|
376
|
+
```
|
|
377
|
+
|
|
378
|
+
## Development
|
|
379
|
+
|
|
380
|
+
### Running Tests
|
|
381
|
+
|
|
382
|
+
```bash
|
|
383
|
+
# Install development dependencies
|
|
384
|
+
pip install -e ".[dev]"
|
|
385
|
+
|
|
386
|
+
# Run tests
|
|
387
|
+
pytest
|
|
388
|
+
|
|
389
|
+
# Run tests with coverage
|
|
390
|
+
pytest --cov=getjobber_cli --cov-report=html
|
|
391
|
+
```
|
|
392
|
+
|
|
393
|
+
### Code Formatting
|
|
394
|
+
|
|
395
|
+
```bash
|
|
396
|
+
# Format code with black
|
|
397
|
+
black src/ tests/
|
|
398
|
+
|
|
399
|
+
# Type checking with mypy
|
|
400
|
+
mypy src/
|
|
401
|
+
```
|
|
402
|
+
|
|
403
|
+
## Maintainer
|
|
404
|
+
|
|
405
|
+
Maintained by Anthony Vincent Caracappa ([github.com/acaracappa](https://github.com/acaracappa)) at [dctreecutting.com](https://dctreecutting.com).
|
|
406
|
+
|
|
407
|
+
## License
|
|
408
|
+
|
|
409
|
+
MIT License - see LICENSE file for details.
|
|
410
|
+
|
|
411
|
+
## Contributing
|
|
412
|
+
|
|
413
|
+
Contributions are welcome! Please feel free to submit a Pull Request.
|
|
414
|
+
|
|
415
|
+
## Support
|
|
416
|
+
|
|
417
|
+
For issues and questions:
|
|
418
|
+
- GitHub Issues: https://github.com/acaracappa/getjobber-cli/issues
|
|
419
|
+
- GetJobber API Documentation: https://developer.getjobber.com/
|
|
420
|
+
|
|
421
|
+
## Acknowledgments
|
|
422
|
+
|
|
423
|
+
Built with:
|
|
424
|
+
- [Typer](https://typer.tiangolo.com/) - CLI framework
|
|
425
|
+
- [GQL](https://github.com/graphql-python/gql) - GraphQL client
|
|
426
|
+
- [Rich](https://rich.readthedocs.io/) - Terminal formatting
|
|
427
|
+
- [Keyring](https://github.com/jaraco/keyring) - Secure credential storage
|