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.
Files changed (36) hide show
  1. getjobber_cli-1.0.0/LICENSE +21 -0
  2. getjobber_cli-1.0.0/PKG-INFO +427 -0
  3. getjobber_cli-1.0.0/README.md +384 -0
  4. getjobber_cli-1.0.0/pyproject.toml +85 -0
  5. getjobber_cli-1.0.0/setup.cfg +4 -0
  6. getjobber_cli-1.0.0/src/getjobber_cli/__init__.py +5 -0
  7. getjobber_cli-1.0.0/src/getjobber_cli/__main__.py +6 -0
  8. getjobber_cli-1.0.0/src/getjobber_cli/api/__init__.py +0 -0
  9. getjobber_cli-1.0.0/src/getjobber_cli/api/client.py +149 -0
  10. getjobber_cli-1.0.0/src/getjobber_cli/api/mutations.py +251 -0
  11. getjobber_cli-1.0.0/src/getjobber_cli/api/queries.py +264 -0
  12. getjobber_cli-1.0.0/src/getjobber_cli/auth/__init__.py +0 -0
  13. getjobber_cli-1.0.0/src/getjobber_cli/auth/callback_server.py +187 -0
  14. getjobber_cli-1.0.0/src/getjobber_cli/auth/oauth.py +211 -0
  15. getjobber_cli-1.0.0/src/getjobber_cli/auth/token_manager.py +226 -0
  16. getjobber_cli-1.0.0/src/getjobber_cli/cli.py +115 -0
  17. getjobber_cli-1.0.0/src/getjobber_cli/commands/__init__.py +0 -0
  18. getjobber_cli-1.0.0/src/getjobber_cli/commands/auth_commands.py +184 -0
  19. getjobber_cli-1.0.0/src/getjobber_cli/commands/client_commands.py +335 -0
  20. getjobber_cli-1.0.0/src/getjobber_cli/commands/config_commands.py +87 -0
  21. getjobber_cli-1.0.0/src/getjobber_cli/commands/invoice_commands.py +192 -0
  22. getjobber_cli-1.0.0/src/getjobber_cli/commands/job_commands.py +250 -0
  23. getjobber_cli-1.0.0/src/getjobber_cli/commands/query_commands.py +70 -0
  24. getjobber_cli-1.0.0/src/getjobber_cli/commands/quote_commands.py +209 -0
  25. getjobber_cli-1.0.0/src/getjobber_cli/constants.py +56 -0
  26. getjobber_cli-1.0.0/src/getjobber_cli/utils/__init__.py +0 -0
  27. getjobber_cli-1.0.0/src/getjobber_cli/utils/config.py +147 -0
  28. getjobber_cli-1.0.0/src/getjobber_cli/utils/errors.py +112 -0
  29. getjobber_cli-1.0.0/src/getjobber_cli/utils/formatters.py +238 -0
  30. getjobber_cli-1.0.0/src/getjobber_cli.egg-info/PKG-INFO +427 -0
  31. getjobber_cli-1.0.0/src/getjobber_cli.egg-info/SOURCES.txt +34 -0
  32. getjobber_cli-1.0.0/src/getjobber_cli.egg-info/dependency_links.txt +1 -0
  33. getjobber_cli-1.0.0/src/getjobber_cli.egg-info/entry_points.txt +2 -0
  34. getjobber_cli-1.0.0/src/getjobber_cli.egg-info/requires.txt +16 -0
  35. getjobber_cli-1.0.0/src/getjobber_cli.egg-info/top_level.txt +1 -0
  36. 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
+ [![PyPI version](https://img.shields.io/pypi/v/getjobber-cli.svg)](https://pypi.org/project/getjobber-cli/) [![License: MIT](https://img.shields.io/badge/license-MIT-blue.svg)](LICENSE) [![Python versions](https://img.shields.io/pypi/pyversions/getjobber-cli.svg)](https://pypi.org/project/getjobber-cli/) [![CI](https://github.com/acaracappa/getjobber-cli/actions/workflows/test.yml/badge.svg)](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