pullup 0.0.2__tar.gz → 0.0.5__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 (40) hide show
  1. pullup-0.0.5/PKG-INFO +163 -0
  2. pullup-0.0.5/README.md +135 -0
  3. pullup-0.0.5/pullup/__init__.py +15 -0
  4. pullup-0.0.5/pullup/_modidx.py +190 -0
  5. pullup-0.0.5/pullup/deploy.py +357 -0
  6. pullup-0.0.5/pullup/drive.py +179 -0
  7. pullup-0.0.5/pullup/env.py +127 -0
  8. pullup-0.0.5/pullup/infra.py +121 -0
  9. pullup-0.0.5/pullup/pipeline.py +247 -0
  10. pullup-0.0.5/pullup/project.py +167 -0
  11. pullup-0.0.5/pullup/stack.py +127 -0
  12. pullup-0.0.5/pullup/wfbuild.py +244 -0
  13. pullup-0.0.5/pullup/workflows.py +463 -0
  14. pullup-0.0.5/pullup.egg-info/PKG-INFO +163 -0
  15. pullup-0.0.5/pullup.egg-info/SOURCES.txt +26 -0
  16. pullup-0.0.5/pullup.egg-info/requires.txt +9 -0
  17. pullup-0.0.5/pyproject.toml +41 -0
  18. pullup-0.0.5/tests/test_env.py +54 -0
  19. pullup-0.0.5/tests/test_pipeline.py +103 -0
  20. pullup-0.0.5/tests/test_project.py +56 -0
  21. pullup-0.0.5/tests/test_stack.py +55 -0
  22. pullup-0.0.5/tests/test_workflows.py +59 -0
  23. pullup-0.0.2/PKG-INFO +0 -105
  24. pullup-0.0.2/README.md +0 -67
  25. pullup-0.0.2/pullup/__init__.py +0 -1
  26. pullup-0.0.2/pullup/_modidx.py +0 -8
  27. pullup-0.0.2/pullup/core.py +0 -9
  28. pullup-0.0.2/pullup.egg-info/PKG-INFO +0 -105
  29. pullup-0.0.2/pullup.egg-info/SOURCES.txt +0 -16
  30. pullup-0.0.2/pullup.egg-info/not-zip-safe +0 -1
  31. pullup-0.0.2/pullup.egg-info/requires.txt +0 -7
  32. pullup-0.0.2/pyproject.toml +0 -24
  33. pullup-0.0.2/settings.ini +0 -39
  34. pullup-0.0.2/setup.py +0 -64
  35. {pullup-0.0.2 → pullup-0.0.5}/LICENSE +0 -0
  36. {pullup-0.0.2 → pullup-0.0.5}/MANIFEST.in +0 -0
  37. {pullup-0.0.2 → pullup-0.0.5}/pullup.egg-info/dependency_links.txt +0 -0
  38. {pullup-0.0.2 → pullup-0.0.5}/pullup.egg-info/entry_points.txt +0 -0
  39. {pullup-0.0.2 → pullup-0.0.5}/pullup.egg-info/top_level.txt +0 -0
  40. {pullup-0.0.2 → pullup-0.0.5}/setup.cfg +0 -0
pullup-0.0.5/PKG-INFO ADDED
@@ -0,0 +1,163 @@
1
+ Metadata-Version: 2.4
2
+ Name: pullup
3
+ Version: 0.0.5
4
+ Summary: build, release, and deploy projects
5
+ Author-email: Karthik Rajgopal <karthik.rajgopal@hotmail.com>
6
+ License: Apache-2.0
7
+ Project-URL: Repository, https://github.com/vedicreader/pullup
8
+ Project-URL: Documentation, https://vedicreader.github.io/pullup
9
+ Keywords: nbdev,jupyter,notebook,python
10
+ Classifier: Natural Language :: English
11
+ Classifier: Intended Audience :: Developers
12
+ Classifier: Development Status :: 3 - Alpha
13
+ Classifier: Programming Language :: Python :: 3
14
+ Classifier: Programming Language :: Python :: 3 :: Only
15
+ Requires-Python: >=3.11
16
+ Description-Content-Type: text/markdown
17
+ License-File: LICENSE
18
+ Requires-Dist: fastcore>=1.8.17
19
+ Requires-Dist: ptymini>=0.0.5
20
+ Requires-Dist: pyyaml>=6.0
21
+ Requires-Dist: dockeasy>=0.0.5
22
+ Requires-Dist: gheasy>=0.0.10
23
+ Requires-Dist: vpseasy>=0.0.18
24
+ Requires-Dist: cfeasy>=0.0.4
25
+ Requires-Dist: python-dotenv>=1.0.0
26
+ Requires-Dist: keyring>=25.0.0
27
+ Dynamic: license-file
28
+
29
+ # pullup
30
+
31
+
32
+ <!-- WARNING: THIS FILE WAS AUTOGENERATED! DO NOT EDIT! -->
33
+
34
+ ## Install
35
+
36
+ ``` sh
37
+ pip install pullup
38
+ ```
39
+
40
+ Cloud integrations load only when used.
41
+
42
+ ## Project detection
43
+
44
+ [`Project`](https://vedicreader.github.io/pullup/project.html#project) detects the release flow from files in the project directory.
45
+
46
+ ``` python
47
+ project = Project(root)
48
+ project.kind, [step.id for step in project.steps()]
49
+ ```
50
+
51
+ ('nbdev', ['prepare', 'bump', 'gh', 'pypi'])
52
+
53
+ ## Running steps
54
+
55
+ Steps run in one PTY. Automatic execution stops at the first failure.
56
+
57
+ ``` python
58
+ pipeline = Pipeline(root, dir='.demo')
59
+ pipeline.save([{'id': 'hello', 'cmd': 'say hello',
60
+ 'argv': [sys.executable, '-c', 'print("ready")']}])
61
+ await pipeline.start()
62
+ pipeline.state()['done'], pipeline.tail().splitlines()[-2:]
63
+ ```
64
+
65
+ (False, ['', '❯ say hello'])
66
+
67
+ ## Plan storage
68
+
69
+ Plans are written only below the project directory.
70
+
71
+ ``` python
72
+ custom = Pipeline(root, dir='.myapp')
73
+ custom.save([{'id': 'show', 'cmd': 'show', 'argv': [sys.executable, '-c', 'print("saved")']}])
74
+ custom.path.relative_to(root)
75
+ ```
76
+
77
+ Path('.myapp/pipeline.json')
78
+
79
+ ## Deployment pipelines
80
+
81
+ [`Deploy`](https://vedicreader.github.io/pullup/deploy.html#deploy) runs a project’s deployment script. [`Drive`](https://vedicreader.github.io/pullup/drive.html#drive) exposes each operation as a library call.
82
+
83
+ ``` python
84
+ Deploy(root).state()['kind'], Drive(root).state()['kind']
85
+ ```
86
+
87
+ ('deploy', 'drive')
88
+
89
+ ## Workflows
90
+
91
+ Local workflow inspection needs no GitHub credentials.
92
+
93
+ ``` python
94
+ workflow_dir = root/'.github'/'workflows'
95
+ workflow_dir.mkdir(parents=True)
96
+ (workflow_dir/'ci.yml').write_text('''name: CI
97
+ on: push
98
+ jobs:
99
+ test:
100
+ runs-on: ubuntu-latest
101
+ steps:
102
+ - run: pytest
103
+ ''')
104
+ workflows = Workflows(root)
105
+ [(row['name'], [job['id'] for job in row['jobs']]) for row in workflows.parsed()]
106
+ ```
107
+
108
+ [('CI', ['test'])]
109
+
110
+ ## Environment
111
+
112
+ A pipeline injects required values into the child without changing the parent environment.
113
+
114
+ ``` python
115
+ class Values:
116
+ def get(self, key, secret=True): return 'demo-token' if key == 'DEMO_TOKEN' else ''
117
+ def values(self, keys): return {key: self.get(key) for key in keys if self.get(key)}
118
+
119
+ with_values = Pipeline(root, env=Values(), dir='.env-demo')
120
+ with_values.save([{'id': 'env', 'cmd': 'read environment', 'needs': ['DEMO_TOKEN'],
121
+ 'argv': [sys.executable, '-c', 'import os; print(os.environ["DEMO_TOKEN"])']}])
122
+ await with_values.start()
123
+ with_values.tail().splitlines()[-2:]
124
+ ```
125
+
126
+ ['', '❯ read environment']
127
+
128
+ ## Package errors
129
+
130
+ [`blame`](https://vedicreader.github.io/pullup/stack.html#blame) identifies the deepest selected-package frame.
131
+
132
+ ``` python
133
+ trace = '''Traceback (most recent call last):
134
+ File "/tmp/pullup/demo.py", line 7, in release
135
+ raise RuntimeError("stopped")
136
+ RuntimeError: stopped
137
+ '''
138
+ blame(trace, family=['pullup'])
139
+ ```
140
+
141
+ {'package': 'pullup',
142
+ 'file': '/tmp/pullup/demo.py',
143
+ 'line': 7,
144
+ 'fn': 'release',
145
+ 'error': 'RuntimeError: stopped',
146
+ 'open': '/tmp/pullup/demo.py',
147
+ 'checkout': '',
148
+ 'version': '0.0.4'}
149
+
150
+ ## Infrastructure
151
+
152
+ [`Infra.status`](https://vedicreader.github.io/pullup/infra.html#infra.status) reports provider and token availability without making a request.
153
+
154
+ ``` python
155
+ infra = Infra(env={})
156
+ infra.status()
157
+ ```
158
+
159
+ {'vpseasy': True,
160
+ 'cfeasy': True,
161
+ 'hcloud_token': True,
162
+ 'cf_token': False,
163
+ 'keys': ['HCLOUD_TOKEN', 'CLOUDFLARE_API_TOKEN']}
pullup-0.0.5/README.md ADDED
@@ -0,0 +1,135 @@
1
+ # pullup
2
+
3
+
4
+ <!-- WARNING: THIS FILE WAS AUTOGENERATED! DO NOT EDIT! -->
5
+
6
+ ## Install
7
+
8
+ ``` sh
9
+ pip install pullup
10
+ ```
11
+
12
+ Cloud integrations load only when used.
13
+
14
+ ## Project detection
15
+
16
+ [`Project`](https://vedicreader.github.io/pullup/project.html#project) detects the release flow from files in the project directory.
17
+
18
+ ``` python
19
+ project = Project(root)
20
+ project.kind, [step.id for step in project.steps()]
21
+ ```
22
+
23
+ ('nbdev', ['prepare', 'bump', 'gh', 'pypi'])
24
+
25
+ ## Running steps
26
+
27
+ Steps run in one PTY. Automatic execution stops at the first failure.
28
+
29
+ ``` python
30
+ pipeline = Pipeline(root, dir='.demo')
31
+ pipeline.save([{'id': 'hello', 'cmd': 'say hello',
32
+ 'argv': [sys.executable, '-c', 'print("ready")']}])
33
+ await pipeline.start()
34
+ pipeline.state()['done'], pipeline.tail().splitlines()[-2:]
35
+ ```
36
+
37
+ (False, ['', '❯ say hello'])
38
+
39
+ ## Plan storage
40
+
41
+ Plans are written only below the project directory.
42
+
43
+ ``` python
44
+ custom = Pipeline(root, dir='.myapp')
45
+ custom.save([{'id': 'show', 'cmd': 'show', 'argv': [sys.executable, '-c', 'print("saved")']}])
46
+ custom.path.relative_to(root)
47
+ ```
48
+
49
+ Path('.myapp/pipeline.json')
50
+
51
+ ## Deployment pipelines
52
+
53
+ [`Deploy`](https://vedicreader.github.io/pullup/deploy.html#deploy) runs a project’s deployment script. [`Drive`](https://vedicreader.github.io/pullup/drive.html#drive) exposes each operation as a library call.
54
+
55
+ ``` python
56
+ Deploy(root).state()['kind'], Drive(root).state()['kind']
57
+ ```
58
+
59
+ ('deploy', 'drive')
60
+
61
+ ## Workflows
62
+
63
+ Local workflow inspection needs no GitHub credentials.
64
+
65
+ ``` python
66
+ workflow_dir = root/'.github'/'workflows'
67
+ workflow_dir.mkdir(parents=True)
68
+ (workflow_dir/'ci.yml').write_text('''name: CI
69
+ on: push
70
+ jobs:
71
+ test:
72
+ runs-on: ubuntu-latest
73
+ steps:
74
+ - run: pytest
75
+ ''')
76
+ workflows = Workflows(root)
77
+ [(row['name'], [job['id'] for job in row['jobs']]) for row in workflows.parsed()]
78
+ ```
79
+
80
+ [('CI', ['test'])]
81
+
82
+ ## Environment
83
+
84
+ A pipeline injects required values into the child without changing the parent environment.
85
+
86
+ ``` python
87
+ class Values:
88
+ def get(self, key, secret=True): return 'demo-token' if key == 'DEMO_TOKEN' else ''
89
+ def values(self, keys): return {key: self.get(key) for key in keys if self.get(key)}
90
+
91
+ with_values = Pipeline(root, env=Values(), dir='.env-demo')
92
+ with_values.save([{'id': 'env', 'cmd': 'read environment', 'needs': ['DEMO_TOKEN'],
93
+ 'argv': [sys.executable, '-c', 'import os; print(os.environ["DEMO_TOKEN"])']}])
94
+ await with_values.start()
95
+ with_values.tail().splitlines()[-2:]
96
+ ```
97
+
98
+ ['', '❯ read environment']
99
+
100
+ ## Package errors
101
+
102
+ [`blame`](https://vedicreader.github.io/pullup/stack.html#blame) identifies the deepest selected-package frame.
103
+
104
+ ``` python
105
+ trace = '''Traceback (most recent call last):
106
+ File "/tmp/pullup/demo.py", line 7, in release
107
+ raise RuntimeError("stopped")
108
+ RuntimeError: stopped
109
+ '''
110
+ blame(trace, family=['pullup'])
111
+ ```
112
+
113
+ {'package': 'pullup',
114
+ 'file': '/tmp/pullup/demo.py',
115
+ 'line': 7,
116
+ 'fn': 'release',
117
+ 'error': 'RuntimeError: stopped',
118
+ 'open': '/tmp/pullup/demo.py',
119
+ 'checkout': '',
120
+ 'version': '0.0.4'}
121
+
122
+ ## Infrastructure
123
+
124
+ [`Infra.status`](https://vedicreader.github.io/pullup/infra.html#infra.status) reports provider and token availability without making a request.
125
+
126
+ ``` python
127
+ infra = Infra(env={})
128
+ infra.status()
129
+ ```
130
+
131
+ {'vpseasy': True,
132
+ 'cfeasy': True,
133
+ 'hcloud_token': True,
134
+ 'cf_token': False,
135
+ 'keys': ['HCLOUD_TOKEN', 'CLOUDFLARE_API_TOKEN']}
@@ -0,0 +1,15 @@
1
+ __version__ = "0.0.5"
2
+
3
+ # The names a caller reaches for. The modules stay importable for everything else.
4
+ from .env import EnvError, EnvStore, venv_env
5
+ from .project import Project, Step
6
+ from .pipeline import Pipeline, PipelineError, Release
7
+ from .deploy import Deploy
8
+ from .drive import Drive
9
+ from .workflows import Workflows, WorkflowError, levels
10
+ from .infra import Infra, InfraError
11
+ from .stack import blame, survey
12
+
13
+ __all__ = ['EnvError', 'EnvStore', 'venv_env', 'Project', 'Step', 'Pipeline', 'PipelineError',
14
+ 'Release', 'Deploy', 'Drive', 'Workflows', 'WorkflowError', 'levels', 'Infra',
15
+ 'InfraError', 'blame', 'survey']
@@ -0,0 +1,190 @@
1
+ # Autogenerated by nbdev
2
+
3
+ d = { 'settings': { 'branch': 'main',
4
+ 'doc_baseurl': '/pullup',
5
+ 'doc_host': 'https://vedicreader.github.io',
6
+ 'git_url': 'https://github.com/vedicreader/pullup',
7
+ 'lib_path': 'pullup'},
8
+ 'syms': { 'pullup.deploy': { 'pullup.deploy.Deploy': ('deploy.html#deploy', 'pullup/deploy.py'),
9
+ 'pullup.deploy.Deploy.defaults': ('deploy.html#deploy.defaults', 'pullup/deploy.py'),
10
+ 'pullup.deploy.Deploy.scaffold': ('deploy.html#deploy.scaffold', 'pullup/deploy.py'),
11
+ 'pullup.deploy.Deploy.state': ('deploy.html#deploy.state', 'pullup/deploy.py'),
12
+ 'pullup.deploy.Deploy.target': ('deploy.html#deploy.target', 'pullup/deploy.py'),
13
+ 'pullup.deploy.deploy_template': ('deploy.html#deploy_template', 'pullup/deploy.py'),
14
+ 'pullup.deploy.generator': ('deploy.html#generator', 'pullup/deploy.py'),
15
+ 'pullup.deploy.setup_template': ('deploy.html#setup_template', 'pullup/deploy.py'),
16
+ 'pullup.deploy.use_generator': ('deploy.html#use_generator', 'pullup/deploy.py')},
17
+ 'pullup.drive': { 'pullup.drive.Drive': ('drive.html#drive', 'pullup/drive.py'),
18
+ 'pullup.drive.Drive.__init__': ('drive.html#drive.__init__', 'pullup/drive.py'),
19
+ 'pullup.drive.Drive.defaults': ('drive.html#drive.defaults', 'pullup/drive.py'),
20
+ 'pullup.drive.Drive.refresh': ('drive.html#drive.refresh', 'pullup/drive.py'),
21
+ 'pullup.drive.Drive.state': ('drive.html#drive.state', 'pullup/drive.py'),
22
+ 'pullup.drive.Part': ('drive.html#part', 'pullup/drive.py'),
23
+ 'pullup.drive._step': ('drive.html#_step', 'pullup/drive.py'),
24
+ 'pullup.drive.context': ('drive.html#context', 'pullup/drive.py'),
25
+ 'pullup.drive.parts': ('drive.html#parts', 'pullup/drive.py')},
26
+ 'pullup.env': { 'pullup.env.EnvError': ('env.html#enverror', 'pullup/env.py'),
27
+ 'pullup.env.EnvStore': ('env.html#envstore', 'pullup/env.py'),
28
+ 'pullup.env.EnvStore.__init__': ('env.html#envstore.__init__', 'pullup/env.py'),
29
+ 'pullup.env.EnvStore.get': ('env.html#envstore.get', 'pullup/env.py'),
30
+ 'pullup.env.EnvStore.set': ('env.html#envstore.set', 'pullup/env.py'),
31
+ 'pullup.env.EnvStore.unset': ('env.html#envstore.unset', 'pullup/env.py'),
32
+ 'pullup.env.EnvStore.values': ('env.html#envstore.values', 'pullup/env.py'),
33
+ 'pullup.env._call': ('env.html#_call', 'pullup/env.py'),
34
+ 'pullup.env._dockeasy': ('env.html#_dockeasy', 'pullup/env.py'),
35
+ 'pullup.env.clean_env': ('env.html#clean_env', 'pullup/env.py'),
36
+ 'pullup.env.env_value': ('env.html#env_value', 'pullup/env.py'),
37
+ 'pullup.env.extra': ('env.html#extra', 'pullup/env.py'),
38
+ 'pullup.env.needs_extra': ('env.html#needs_extra', 'pullup/env.py'),
39
+ 'pullup.env.strip_bundle': ('env.html#strip_bundle', 'pullup/env.py'),
40
+ 'pullup.env.use_extra': ('env.html#use_extra', 'pullup/env.py'),
41
+ 'pullup.env.venv_env': ('env.html#venv_env', 'pullup/env.py')},
42
+ 'pullup.infra': { 'pullup.infra.Infra': ('infra.html#infra', 'pullup/infra.py'),
43
+ 'pullup.infra.Infra.__init__': ('infra.html#infra.__init__', 'pullup/infra.py'),
44
+ 'pullup.infra.Infra._cf': ('infra.html#infra._cf', 'pullup/infra.py'),
45
+ 'pullup.infra.Infra._hetzner': ('infra.html#infra._hetzner', 'pullup/infra.py'),
46
+ 'pullup.infra.Infra.delete_server': ('infra.html#infra.delete_server', 'pullup/infra.py'),
47
+ 'pullup.infra.Infra.delete_tunnel': ('infra.html#infra.delete_tunnel', 'pullup/infra.py'),
48
+ 'pullup.infra.Infra.keys': ('infra.html#infra.keys', 'pullup/infra.py'),
49
+ 'pullup.infra.Infra.overview': ('infra.html#infra.overview', 'pullup/infra.py'),
50
+ 'pullup.infra.Infra.records': ('infra.html#infra.records', 'pullup/infra.py'),
51
+ 'pullup.infra.Infra.servers': ('infra.html#infra.servers', 'pullup/infra.py'),
52
+ 'pullup.infra.Infra.status': ('infra.html#infra.status', 'pullup/infra.py'),
53
+ 'pullup.infra.Infra.token': ('infra.html#infra.token', 'pullup/infra.py'),
54
+ 'pullup.infra.Infra.tunnels': ('infra.html#infra.tunnels', 'pullup/infra.py'),
55
+ 'pullup.infra.Infra.verify': ('infra.html#infra.verify', 'pullup/infra.py'),
56
+ 'pullup.infra.Infra.zones': ('infra.html#infra.zones', 'pullup/infra.py'),
57
+ 'pullup.infra.InfraError': ('infra.html#infraerror', 'pullup/infra.py'),
58
+ 'pullup.infra._record': ('infra.html#_record', 'pullup/infra.py'),
59
+ 'pullup.infra._why': ('infra.html#_why', 'pullup/infra.py'),
60
+ 'pullup.infra._with_env': ('infra.html#_with_env', 'pullup/infra.py')},
61
+ 'pullup.pipeline': { 'pullup.pipeline.Pipeline': ('pipeline.html#pipeline', 'pullup/pipeline.py'),
62
+ 'pullup.pipeline.Pipeline.__init__': ('pipeline.html#pipeline.__init__', 'pullup/pipeline.py'),
63
+ 'pullup.pipeline.Pipeline._after': ('pipeline.html#pipeline._after', 'pullup/pipeline.py'),
64
+ 'pullup.pipeline.Pipeline._broadcast': ('pipeline.html#pipeline._broadcast', 'pullup/pipeline.py'),
65
+ 'pullup.pipeline.Pipeline._drain': ('pipeline.html#pipeline._drain', 'pullup/pipeline.py'),
66
+ 'pullup.pipeline.Pipeline._env': ('pipeline.html#pipeline._env', 'pullup/pipeline.py'),
67
+ 'pullup.pipeline.Pipeline._load': ('pipeline.html#pipeline._load', 'pullup/pipeline.py'),
68
+ 'pullup.pipeline.Pipeline._next': ('pipeline.html#pipeline._next', 'pullup/pipeline.py'),
69
+ 'pullup.pipeline.Pipeline._resolve': ('pipeline.html#pipeline._resolve', 'pullup/pipeline.py'),
70
+ 'pullup.pipeline.Pipeline._row': ('pipeline.html#pipeline._row', 'pullup/pipeline.py'),
71
+ 'pullup.pipeline.Pipeline._run': ('pipeline.html#pipeline._run', 'pullup/pipeline.py'),
72
+ 'pullup.pipeline.Pipeline.blame': ('pipeline.html#pipeline.blame', 'pullup/pipeline.py'),
73
+ 'pullup.pipeline.Pipeline.defaults': ('pipeline.html#pipeline.defaults', 'pullup/pipeline.py'),
74
+ 'pullup.pipeline.Pipeline.missing': ('pipeline.html#pipeline.missing', 'pullup/pipeline.py'),
75
+ 'pullup.pipeline.Pipeline.needs': ('pipeline.html#pipeline.needs', 'pullup/pipeline.py'),
76
+ 'pullup.pipeline.Pipeline.path': ('pipeline.html#pipeline.path', 'pullup/pipeline.py'),
77
+ 'pullup.pipeline.Pipeline.reset': ('pipeline.html#pipeline.reset', 'pullup/pipeline.py'),
78
+ 'pullup.pipeline.Pipeline.reset_plan': ('pipeline.html#pipeline.reset_plan', 'pullup/pipeline.py'),
79
+ 'pullup.pipeline.Pipeline.resize': ('pipeline.html#pipeline.resize', 'pullup/pipeline.py'),
80
+ 'pullup.pipeline.Pipeline.save': ('pipeline.html#pipeline.save', 'pullup/pipeline.py'),
81
+ 'pullup.pipeline.Pipeline.skip': ('pipeline.html#pipeline.skip', 'pullup/pipeline.py'),
82
+ 'pullup.pipeline.Pipeline.start': ('pipeline.html#pipeline.start', 'pullup/pipeline.py'),
83
+ 'pullup.pipeline.Pipeline.state': ('pipeline.html#pipeline.state', 'pullup/pipeline.py'),
84
+ 'pullup.pipeline.Pipeline.step': ('pipeline.html#pipeline.step', 'pullup/pipeline.py'),
85
+ 'pullup.pipeline.Pipeline.stop': ('pipeline.html#pipeline.stop', 'pullup/pipeline.py'),
86
+ 'pullup.pipeline.Pipeline.subscribe': ('pipeline.html#pipeline.subscribe', 'pullup/pipeline.py'),
87
+ 'pullup.pipeline.Pipeline.tail': ('pipeline.html#pipeline.tail', 'pullup/pipeline.py'),
88
+ 'pullup.pipeline.Pipeline.unsubscribe': ('pipeline.html#pipeline.unsubscribe', 'pullup/pipeline.py'),
89
+ 'pullup.pipeline.Pipeline.write': ('pipeline.html#pipeline.write', 'pullup/pipeline.py'),
90
+ 'pullup.pipeline.PipelineError': ('pipeline.html#pipelineerror', 'pullup/pipeline.py'),
91
+ 'pullup.pipeline.Release': ('pipeline.html#release', 'pullup/pipeline.py'),
92
+ 'pullup.pipeline.Release.defaults': ('pipeline.html#release.defaults', 'pullup/pipeline.py'),
93
+ 'pullup.pipeline.Release.state': ('pipeline.html#release.state', 'pullup/pipeline.py'),
94
+ 'pullup.pipeline.resolve_script': ('pipeline.html#resolve_script', 'pullup/pipeline.py'),
95
+ 'pullup.pipeline.uv_argv': ('pipeline.html#uv_argv', 'pullup/pipeline.py')},
96
+ 'pullup.project': { 'pullup.project.Project': ('project.html#project', 'pullup/project.py'),
97
+ 'pullup.project.Project.__init__': ('project.html#project.__init__', 'pullup/project.py'),
98
+ 'pullup.project.Project.__repr__': ('project.html#project.__repr__', 'pullup/project.py'),
99
+ 'pullup.project.Project.dict': ('project.html#project.dict', 'pullup/project.py'),
100
+ 'pullup.project.Project.kind': ('project.html#project.kind', 'pullup/project.py'),
101
+ 'pullup.project.Project.packages_an_app': ('project.html#project.packages_an_app', 'pullup/project.py'),
102
+ 'pullup.project.Project.steps': ('project.html#project.steps', 'pullup/project.py'),
103
+ 'pullup.project.Step': ('project.html#step', 'pullup/project.py'),
104
+ 'pullup.project.Step.dict': ('project.html#step.dict', 'pullup/project.py'),
105
+ 'pullup.project._toml': ('project.html#_toml', 'pullup/project.py'),
106
+ 'pullup.project._with_app': ('project.html#_with_app', 'pullup/project.py'),
107
+ 'pullup.project.app_project': ('project.html#app_project', 'pullup/project.py'),
108
+ 'pullup.project.default_steps': ('project.html#default_steps', 'pullup/project.py'),
109
+ 'pullup.project.fastship_project': ('project.html#fastship_project', 'pullup/project.py'),
110
+ 'pullup.project.maturin_project': ('project.html#maturin_project', 'pullup/project.py'),
111
+ 'pullup.project.nbdev_project': ('project.html#nbdev_project', 'pullup/project.py'),
112
+ 'pullup.project.release_flow': ('project.html#release_flow', 'pullup/project.py'),
113
+ 'pullup.project.rust_project': ('project.html#rust_project', 'pullup/project.py')},
114
+ 'pullup.stack': { 'pullup.stack._is_error': ('stack.html#_is_error', 'pullup/stack.py'),
115
+ 'pullup.stack._origin': ('stack.html#_origin', 'pullup/stack.py'),
116
+ 'pullup.stack._package_of': ('stack.html#_package_of', 'pullup/stack.py'),
117
+ 'pullup.stack._roots': ('stack.html#_roots', 'pullup/stack.py'),
118
+ 'pullup.stack._row': ('stack.html#_row', 'pullup/stack.py'),
119
+ 'pullup.stack._vendored': ('stack.html#_vendored', 'pullup/stack.py'),
120
+ 'pullup.stack._version': ('stack.html#_version', 'pullup/stack.py'),
121
+ 'pullup.stack.blame': ('stack.html#blame', 'pullup/stack.py'),
122
+ 'pullup.stack.checkout_for': ('stack.html#checkout_for', 'pullup/stack.py'),
123
+ 'pullup.stack.frames': ('stack.html#frames', 'pullup/stack.py'),
124
+ 'pullup.stack.installed': ('stack.html#installed', 'pullup/stack.py'),
125
+ 'pullup.stack.survey': ('stack.html#survey', 'pullup/stack.py')},
126
+ 'pullup.wfbuild': { 'pullup.wfbuild._adopt': ('wfbuild.html#_adopt', 'pullup/wfbuild.py'),
127
+ 'pullup.wfbuild._branches': ('wfbuild.html#_branches', 'pullup/wfbuild.py'),
128
+ 'pullup.wfbuild._lines': ('wfbuild.html#_lines', 'pullup/wfbuild.py'),
129
+ 'pullup.wfbuild._listy': ('wfbuild.html#_listy', 'pullup/wfbuild.py'),
130
+ 'pullup.wfbuild._run_job': ('wfbuild.html#_run_job', 'pullup/wfbuild.py'),
131
+ 'pullup.wfbuild._triggers': ('wfbuild.html#_triggers', 'pullup/wfbuild.py'),
132
+ 'pullup.wfbuild.compose': ('wfbuild.html#compose', 'pullup/wfbuild.py'),
133
+ 'pullup.wfbuild.deploy_job': ('wfbuild.html#deploy_job', 'pullup/wfbuild.py'),
134
+ 'pullup.wfbuild.fastship_job': ('wfbuild.html#fastship_job', 'pullup/wfbuild.py'),
135
+ 'pullup.wfbuild.load_spec': ('wfbuild.html#load_spec', 'pullup/wfbuild.py'),
136
+ 'pullup.wfbuild.nbdev_job': ('wfbuild.html#nbdev_job', 'pullup/wfbuild.py'),
137
+ 'pullup.wfbuild.preset_rows': ('wfbuild.html#preset_rows', 'pullup/wfbuild.py'),
138
+ 'pullup.wfbuild.save_spec': ('wfbuild.html#save_spec', 'pullup/wfbuild.py'),
139
+ 'pullup.wfbuild.spec_dir': ('wfbuild.html#spec_dir', 'pullup/wfbuild.py'),
140
+ 'pullup.wfbuild.spec_path': ('wfbuild.html#spec_path', 'pullup/wfbuild.py'),
141
+ 'pullup.wfbuild.use_spec_dir': ('wfbuild.html#use_spec_dir', 'pullup/wfbuild.py')},
142
+ 'pullup.workflows': { 'pullup.workflows.WorkflowError': ('workflows.html#workflowerror', 'pullup/workflows.py'),
143
+ 'pullup.workflows.Workflows': ('workflows.html#workflows', 'pullup/workflows.py'),
144
+ 'pullup.workflows.Workflows.__init__': ('workflows.html#workflows.__init__', 'pullup/workflows.py'),
145
+ 'pullup.workflows.Workflows._api': ('workflows.html#workflows._api', 'pullup/workflows.py'),
146
+ 'pullup.workflows.Workflows._build': ('workflows.html#workflows._build', 'pullup/workflows.py'),
147
+ 'pullup.workflows.Workflows._deploy_workflow': ( 'workflows.html#workflows._deploy_workflow',
148
+ 'pullup/workflows.py'),
149
+ 'pullup.workflows.Workflows._job': ('workflows.html#workflows._job', 'pullup/workflows.py'),
150
+ 'pullup.workflows.Workflows._steps': ('workflows.html#workflows._steps', 'pullup/workflows.py'),
151
+ 'pullup.workflows.Workflows._triggers': ('workflows.html#workflows._triggers', 'pullup/workflows.py'),
152
+ 'pullup.workflows.Workflows.add': ('workflows.html#workflows.add', 'pullup/workflows.py'),
153
+ 'pullup.workflows.Workflows.build': ('workflows.html#workflows.build', 'pullup/workflows.py'),
154
+ 'pullup.workflows.Workflows.cancel': ('workflows.html#workflows.cancel', 'pullup/workflows.py'),
155
+ 'pullup.workflows.Workflows.catalogue': ('workflows.html#workflows.catalogue', 'pullup/workflows.py'),
156
+ 'pullup.workflows.Workflows.config': ('workflows.html#workflows.config', 'pullup/workflows.py'),
157
+ 'pullup.workflows.Workflows.detect': ('workflows.html#workflows.detect', 'pullup/workflows.py'),
158
+ 'pullup.workflows.Workflows.dir': ('workflows.html#workflows.dir', 'pullup/workflows.py'),
159
+ 'pullup.workflows.Workflows.dispatch': ('workflows.html#workflows.dispatch', 'pullup/workflows.py'),
160
+ 'pullup.workflows.Workflows.docker': ('workflows.html#workflows.docker', 'pullup/workflows.py'),
161
+ 'pullup.workflows.Workflows.files': ('workflows.html#workflows.files', 'pullup/workflows.py'),
162
+ 'pullup.workflows.Workflows.generate': ('workflows.html#workflows.generate', 'pullup/workflows.py'),
163
+ 'pullup.workflows.Workflows.parse': ('workflows.html#workflows.parse', 'pullup/workflows.py'),
164
+ 'pullup.workflows.Workflows.parsed': ('workflows.html#workflows.parsed', 'pullup/workflows.py'),
165
+ 'pullup.workflows.Workflows.preview': ('workflows.html#workflows.preview', 'pullup/workflows.py'),
166
+ 'pullup.workflows.Workflows.push_env': ('workflows.html#workflows.push_env', 'pullup/workflows.py'),
167
+ 'pullup.workflows.Workflows.remote_env': ('workflows.html#workflows.remote_env', 'pullup/workflows.py'),
168
+ 'pullup.workflows.Workflows.repo': ('workflows.html#workflows.repo', 'pullup/workflows.py'),
169
+ 'pullup.workflows.Workflows.run_jobs': ('workflows.html#workflows.run_jobs', 'pullup/workflows.py'),
170
+ 'pullup.workflows.Workflows.runs': ('workflows.html#workflows.runs', 'pullup/workflows.py'),
171
+ 'pullup.workflows.Workflows.schema': ('workflows.html#workflows.schema', 'pullup/workflows.py'),
172
+ 'pullup.workflows.Workflows.spec': ('workflows.html#workflows.spec', 'pullup/workflows.py'),
173
+ 'pullup.workflows.Workflows.status': ('workflows.html#workflows.status', 'pullup/workflows.py'),
174
+ 'pullup.workflows.Workflows.write_dockerfile': ( 'workflows.html#workflows.write_dockerfile',
175
+ 'pullup/workflows.py'),
176
+ 'pullup.workflows.Workflows.write_generated': ( 'workflows.html#workflows.write_generated',
177
+ 'pullup/workflows.py'),
178
+ 'pullup.workflows.Workflows.write_spec': ('workflows.html#workflows.write_spec', 'pullup/workflows.py'),
179
+ 'pullup.workflows._fastship': ('workflows.html#_fastship', 'pullup/workflows.py'),
180
+ 'pullup.workflows._from_line': ('workflows.html#_from_line', 'pullup/workflows.py'),
181
+ 'pullup.workflows._gh_authed': ('workflows.html#_gh_authed', 'pullup/workflows.py'),
182
+ 'pullup.workflows._gheasy': ('workflows.html#_gheasy', 'pullup/workflows.py'),
183
+ 'pullup.workflows._opened': ('workflows.html#_opened', 'pullup/workflows.py'),
184
+ 'pullup.workflows._read': ('workflows.html#_read', 'pullup/workflows.py'),
185
+ 'pullup.workflows._run_row': ('workflows.html#_run_row', 'pullup/workflows.py'),
186
+ 'pullup.workflows._sync_api': ('workflows.html#_sync_api', 'pullup/workflows.py'),
187
+ 'pullup.workflows._wf_file': ('workflows.html#_wf_file', 'pullup/workflows.py'),
188
+ 'pullup.workflows._wf_name': ('workflows.html#_wf_name', 'pullup/workflows.py'),
189
+ 'pullup.workflows._yaml': ('workflows.html#_yaml', 'pullup/workflows.py'),
190
+ 'pullup.workflows.levels': ('workflows.html#levels', 'pullup/workflows.py')}}}