proj-flow 0.10.0__py3-none-any.whl → 0.11.0__py3-none-any.whl

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.
proj_flow/__init__.py CHANGED
@@ -6,4 +6,4 @@ The **proj_flow** contains only ``__version__`` to be updated, nothing more.
6
6
  This is in an attempt to make this module easy to load initially.
7
7
  """
8
8
 
9
- __version__ = "0.10.0"
9
+ __version__ = "0.11.0"
proj_flow/api/env.py CHANGED
@@ -23,6 +23,7 @@ from dataclasses import dataclass
23
23
  from enum import Enum
24
24
  from typing import Any, Callable, Dict, List, Optional, Union, cast
25
25
 
26
+ from proj_flow.api import ctx
26
27
  from proj_flow.base import plugins, uname
27
28
 
28
29
  platform = uname.uname()[0]
@@ -115,6 +116,59 @@ class RunAlias:
115
116
  return RunAlias(name, doc, steps)
116
117
 
117
118
 
119
+ def _merge_dicts(dst: dict, src: dict):
120
+ for key in src:
121
+ if key not in dst:
122
+ dst[key] = src[key]
123
+ continue
124
+
125
+ src_val = src[key]
126
+ dst_val = dst[key]
127
+
128
+ if isinstance(src_val, dict):
129
+ if isinstance(dst_val, dict):
130
+ _merge_dicts(dst_val, src_val)
131
+ continue
132
+
133
+ dst[key] = src_val
134
+
135
+
136
+ def _flatten_dict(dst: ctx.SettingsType, defaults: Dict[str, Any], prefix=""):
137
+ for key, val in defaults.items():
138
+ this_key = f"{prefix}{key}"
139
+
140
+ if isinstance(val, dict):
141
+ _flatten_dict(dst, val, f"{this_key}.")
142
+ continue
143
+
144
+ if val is None:
145
+ dst[this_key] = ""
146
+ continue
147
+
148
+ if isinstance(val, bool):
149
+ dst[this_key] = val
150
+ continue
151
+
152
+ dst[this_key] = str(val)
153
+
154
+
155
+ def _merge(cfg: dict, defaults: ctx.SettingsType, path: str):
156
+ config = plugins.load_data(path)
157
+ if not isinstance(config, dict):
158
+ return
159
+
160
+ stored_defaults = config.get("defaults", {})
161
+ try:
162
+ del config["defaults"]
163
+ except KeyError:
164
+ pass
165
+
166
+ _merge_dicts(cfg, config)
167
+
168
+ if isinstance(stored_defaults, dict):
169
+ _flatten_dict(defaults, stored_defaults)
170
+
171
+
118
172
  class FlowConfig:
119
173
  _cfg: dict
120
174
  steps: list = []
@@ -129,9 +183,18 @@ class FlowConfig:
129
183
  self.root = cfg.root
130
184
  else:
131
185
  self.root = os.path.abspath(root)
132
- self._cfg = plugins.load_data(
133
- os.path.join(self.root, ".flow", "config.json")
186
+ defaults: ctx.SettingsType = {}
187
+ dest: dict = {}
188
+
189
+ _merge(
190
+ dest,
191
+ defaults,
192
+ os.path.join(os.path.expanduser("~"), ".config", "proj-flow.json"),
134
193
  )
194
+ _merge(dest, defaults, os.path.join(self.root, ".flow", "config.json"))
195
+
196
+ self._cfg = dest
197
+ self._cfg["defaults"] = defaults
135
198
 
136
199
  self._propagate_compilers()
137
200
  self._load_extensions()
@@ -98,6 +98,12 @@ class Registry(typing.Generic[T]):
98
98
 
99
99
  _debug_copies: typing.List[Registry] = []
100
100
 
101
+ def quoted(s: str) -> str:
102
+ if '"' in s:
103
+ return "'{}'".format(s.replace("\\", r"\\").replace("'", r"\'"))
104
+ if "'" in s or " " in s:
105
+ return '"{}"'.format(s)
106
+ return s
101
107
 
102
108
  def verbose_info():
103
109
  for registry in _debug_copies:
@@ -107,12 +113,12 @@ def verbose_info():
107
113
  kw = OrderedDict()
108
114
 
109
115
  if hasattr(item, "name"):
110
- kw["name"] = getattr(item, "name")
116
+ kw["name"] = quoted(getattr(item, "name"))
111
117
  elif hasattr(item, "__name__"):
112
- kw["name"] = getattr(item, "__name__")
118
+ kw["name"] = quoted(getattr(item, "__name__"))
113
119
 
114
120
  if hasattr(item, "id"):
115
- kw["id"] = getattr(item, "id")
121
+ kw["id"] = quoted(getattr(item, "id"))
116
122
 
117
123
  items = ", ".join([f"{key}={value}" for key, value in kw.items()])
118
124
  if len(items) > 0:
@@ -7,6 +7,6 @@ The **proj_flow.ext.cplusplus.cmake** provides ``"CMake"``, ``"Build"``,
7
7
  context.
8
8
  """
9
9
 
10
- from . import context, parser, steps, version
10
+ from . import parser, steps, version
11
11
 
12
- __all__ = ["context", "parser", "steps", "version"]
12
+ __all__ = ["parser", "steps", "version"]
@@ -12,7 +12,7 @@ from typing import Dict, List, cast
12
12
  from proj_flow import api
13
13
  from proj_flow.api import env, step
14
14
 
15
- from .__version__ import CMAKE_VERSION
15
+ from proj_flow.base.__cmake_version__ import CMAKE_VERSION
16
16
 
17
17
 
18
18
  class CMakeBase(api.step.Step):
@@ -63,8 +63,3 @@ class ConanConfig:
63
63
  if not rt.dry_run and os.path.exists("CMakeUserPresets.json"):
64
64
  os.remove("CMakeUserPresets.json")
65
65
  return 0
66
-
67
-
68
- cplusplus.project.register_switch(
69
- "with_conan", "Use Conan for dependency manager", True
70
- )
proj_flow/minimal/init.py CHANGED
@@ -79,7 +79,7 @@ def main(
79
79
  print(f"proj-flow: {error}", file=sys.stderr)
80
80
  return 1
81
81
 
82
- context = current_project.get_context(not non_interactive)
82
+ context = current_project.get_context(not non_interactive, rt)
83
83
  if not non_interactive and not rt.silent:
84
84
  print()
85
85
 
proj_flow/project/api.py CHANGED
@@ -9,7 +9,7 @@ from abc import ABC, abstractmethod
9
9
  from typing import Any, List, NamedTuple, Optional
10
10
 
11
11
  from proj_flow import base
12
- from proj_flow.api import ctx
12
+ from proj_flow.api import ctx, env
13
13
  from proj_flow.project import interact
14
14
 
15
15
 
@@ -30,8 +30,8 @@ class ProjectType(ABC):
30
30
  def register_init_setting(self, *settings: ctx.Setting, is_hidden=False):
31
31
  ctx.register_init_setting(*settings, is_hidden=is_hidden, project=self.id)
32
32
 
33
- def get_context(self, interactive: bool):
34
- return interact.get_context(interactive, self.id)
33
+ def get_context(self, interactive: bool, rt: env.Runtime):
34
+ return interact.get_context(interactive, self.id, rt)
35
35
 
36
36
 
37
37
  project_type = base.registry.Registry[ProjectType]("ProjectType")
@@ -0,0 +1,10 @@
1
+ # Copyright (c) 2025 Marcin Zdun
2
+ # This code is licensed under MIT license (see LICENSE for details)
3
+
4
+ """
5
+ The **proj_flow.project.cplusplus** registers a ``"C++"`` projects support.
6
+ """
7
+
8
+ from proj_flow.project.cplusplus import cmake_context, conan_context
9
+
10
+ __all__ = ["cmake_context", "conan_context"]
@@ -12,9 +12,10 @@ import uuid
12
12
  import chevron
13
13
 
14
14
  from proj_flow import api, project
15
- from proj_flow.project import cplusplus
15
+ from proj_flow.project import data
16
+ from proj_flow.project.cplusplus import project
16
17
 
17
- from .__version__ import CMAKE_VERSION
18
+ from proj_flow.base.__cmake_version__ import CMAKE_VERSION
18
19
 
19
20
  config_json_mustache = """
20
21
  {{#with_cmake}}
@@ -50,23 +51,23 @@ class CMakeInit(api.init.InitStep):
50
51
  def _list_cmake_types():
51
52
  return api.ctx.move_to_front(
52
53
  "console-application",
53
- sorted(key for key in project.data.get_internal("cmake").keys() if key),
54
+ sorted(key for key in data.get_internal("cmake").keys() if key),
54
55
  )
55
56
 
56
57
 
57
58
  api.init.register_init_step(CMakeInit())
58
59
 
59
- cplusplus.project.register_init_setting(
60
+ project.cxx.register_init_setting(
60
61
  api.ctx.Setting("PROJECT.TYPE", "CMake project type", _list_cmake_types)
61
62
  )
62
- cplusplus.project.register_init_setting(
63
+ project.cxx.register_init_setting(
63
64
  api.ctx.Setting("cmake", fix="{PROJECT.TYPE$map:cmake}"),
64
65
  api.ctx.Setting("CMAKE_VERSION", value=CMAKE_VERSION),
65
66
  api.ctx.Setting("PROJECT.WIX.UPGRADE_GUID", value=lambda: str(uuid.uuid4())),
66
67
  is_hidden=True,
67
68
  )
68
- cplusplus.project.register_switch("with_cmake", "Use CMake", True)
69
- cplusplus.project.register_internal(
69
+ project.cxx.register_switch("with_cmake", "Use CMake", True)
70
+ project.cxx.register_internal(
70
71
  "cmake",
71
72
  {
72
73
  "": {"cmd": "add_executable", "type": ""},
@@ -0,0 +1,12 @@
1
+ # Copyright (c) 2025 Marcin Zdun
2
+ # This code is licensed under MIT license (see LICENSE for details)
3
+
4
+ """
5
+ The **proj_flow.ext.cplusplus.conan** provides the ``"Conan"`` step.
6
+ """
7
+
8
+ from proj_flow.project.cplusplus import project
9
+
10
+ project.cxx.register_switch(
11
+ "with_conan", "Use Conan for dependency manager", True
12
+ )
@@ -7,11 +7,10 @@ The **proj_flow.project.cplusplus** registers a ``"C++"`` projects support.
7
7
 
8
8
  from proj_flow.project import api
9
9
 
10
-
11
10
  @api.project_type.add
12
11
  class CPlusPlus(api.ProjectType):
13
12
  def __init__(self):
14
- super().__init__("C++ + CMake + Conan", "cxx")
13
+ super().__init__("C++ plus CMake plus Conan", "cxx")
15
14
 
16
15
 
17
- project = api.get_project_type("cxx")
16
+ cxx = api.get_project_type("cxx")
@@ -15,7 +15,7 @@ from prompt_toolkit.formatted_text.base import AnyFormattedText
15
15
  from prompt_toolkit.shortcuts import CompleteStyle
16
16
  from prompt_toolkit.validation import Validator
17
17
 
18
- from proj_flow.api import ctx
18
+ from proj_flow.api import ctx, env
19
19
 
20
20
 
21
21
  @dataclass
@@ -25,8 +25,18 @@ class _Question:
25
25
  value: ctx.Values
26
26
 
27
27
  @classmethod
28
- def load_default(cls, default: ctx.Setting, previous: ctx.SettingsType):
28
+ def load_default(
29
+ cls,
30
+ default: ctx.Setting,
31
+ previous: ctx.SettingsType,
32
+ override: Optional[ctx.StrOrBool],
33
+ ):
29
34
  value = default.calc_value(previous)
35
+ if override is not None:
36
+ if isinstance(value, (str, bool)) and type(value) == type(override):
37
+ value = override
38
+ elif isinstance(value, list) and isinstance(override, str):
39
+ value = ctx.move_to_front(override, value)
30
40
  return cls(default.json_key, default.prompt, value)
31
41
 
32
42
  def interact(self, counter: int, size: int) -> ctx.StrOrBool:
@@ -123,7 +133,9 @@ def _project_filter(project: Optional[str]):
123
133
  return impl
124
134
 
125
135
 
126
- def _prompt(wanted: Callable[[ctx.Setting], bool]) -> ctx.SettingsType:
136
+ def _prompt(
137
+ wanted: Callable[[ctx.Setting], bool], overrides: ctx.SettingsType
138
+ ) -> ctx.SettingsType:
127
139
  settings: ctx.SettingsType = {}
128
140
 
129
141
  defaults = [setting for setting in ctx.defaults if wanted(setting)]
@@ -132,22 +144,19 @@ def _prompt(wanted: Callable[[ctx.Setting], bool]) -> ctx.SettingsType:
132
144
  size = len(defaults) + len(switches)
133
145
  counter = 1
134
146
 
135
- for setting in defaults:
136
- loaded = _Question.load_default(setting, settings)
137
- value = loaded.interact(counter, size)
138
- settings[loaded.key] = value
139
- counter += 1
140
-
141
- for setting in switches:
142
- loaded = _Question.load_default(setting, settings)
143
- value = loaded.interact(counter, size)
144
- settings[loaded.key] = value
145
- counter += 1
147
+ for coll in [defaults, switches]:
148
+ for setting in coll:
149
+ loaded = _Question.load_default(
150
+ setting, settings, overrides.get(setting.json_key)
151
+ )
152
+ value = loaded.interact(counter, size)
153
+ settings[loaded.key] = value
154
+ counter += 1
146
155
 
147
156
  return settings
148
157
 
149
158
 
150
- def _all_default(wanted: Callable[[ctx.Setting], bool]):
159
+ def _all_default(wanted: Callable[[ctx.Setting], bool], overrides: ctx.SettingsType):
151
160
  """
152
161
  Chooses default answers for all details of newly-crated project.
153
162
 
@@ -160,13 +169,13 @@ def _all_default(wanted: Callable[[ctx.Setting], bool]):
160
169
  defaults = [setting for setting in ctx.defaults if wanted(setting)]
161
170
  switches = [setting for setting in ctx.switches if wanted(setting)]
162
171
 
163
- for setting in defaults:
164
- value = _get_default(setting, settings)
165
- settings[setting.json_key] = value
166
-
167
- for setting in switches:
168
- value = _get_default(setting, settings)
169
- settings[setting.json_key] = value
172
+ for coll in [defaults, switches]:
173
+ for setting in coll:
174
+ if setting.json_key in overrides:
175
+ settings[setting.json_key] = overrides[setting.json_key]
176
+ else:
177
+ value = _get_default(setting, settings)
178
+ settings[setting.json_key] = value
170
179
 
171
180
  return settings
172
181
 
@@ -217,19 +226,30 @@ def _fixup_context(settings: ctx.SettingsType, wanted: Callable[[ctx.Setting], b
217
226
  return result
218
227
 
219
228
 
220
- def get_context(interactive: bool, project: Optional[str]):
229
+ def get_context(interactive: bool, project: Optional[str], rt: env.Runtime):
221
230
  """
222
231
  Prompts user to provide details of newly-crated project. If `interactive`
223
232
  is true, however, this functions skips the prompts and chooses all the
224
233
  default answers.
225
234
 
226
235
  :param interactive: Selects, if the initialization process is done through
227
- prompts, or not
236
+ prompts, or not.
237
+
238
+ :param project: Alows to select questions for any given language.
239
+
240
+ :param rt: Runtime with config loaded in.
228
241
 
229
242
  :returns: Dictionary with answers to all interactive settings and switches.
230
243
  """
231
244
 
245
+ overrides = rt._cfg.get("defaults", {})
246
+
232
247
  wanted = _project_filter(project)
233
248
  return _fixup_context(
234
- _all_default(wanted) if not interactive else _prompt(wanted), wanted
249
+ (
250
+ _all_default(wanted, overrides)
251
+ if not interactive
252
+ else _prompt(wanted, overrides)
253
+ ),
254
+ wanted,
235
255
  )
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: proj-flow
3
- Version: 0.10.0
3
+ Version: 0.11.0
4
4
  Summary: C++ project maintenance, automated
5
5
  Project-URL: Changelog, https://github.com/mzdun/proj-flow/blob/main/CHANGELOG.rst
6
6
  Project-URL: Documentation, https://proj-flow.readthedocs.io/en/latest/
@@ -1,22 +1,23 @@
1
- proj_flow/__init__.py,sha256=cd3hxTcDnlv9Qd6qQYRRa3g7bs5iuMrPJtfF_ENzMTY,277
1
+ proj_flow/__init__.py,sha256=rJnUcfKn1M3oCrkLIpU66A5IZYuXAN9puzWG3l2KM7s,277
2
2
  proj_flow/__main__.py,sha256=HUar_qQ9Ndmchmryegtzu__5wukwCLrFN_SGRl5Ol_M,233
3
3
  proj_flow/dependency.py,sha256=CpcnR6El8AO9hlLc9lQtYQADYlkx3GMHlkLYbEAtdMI,4639
4
4
  proj_flow/api/__init__.py,sha256=gV2f6kll_5JXtvkGASvnx7CbOWr34PHOdck-4ce-qEk,378
5
5
  proj_flow/api/arg.py,sha256=id08mLFVDWIvsrhEaPuJfng27f92Vf8pIA5VajyjGVo,4802
6
6
  proj_flow/api/completers.py,sha256=NapNVu6QAQ_iF6dqcAzOV5kDHKD9MAMVX209Bklq-Mw,2464
7
7
  proj_flow/api/ctx.py,sha256=IJu0q0Chivo6b2M4MKkAlV09oi7Cn9VxtDFeAeL_tnc,6646
8
- proj_flow/api/env.py,sha256=4VvSkfA2k6OPrtvkPtEPhb24dDyaqbUoqSznIgvAXNg,11082
8
+ proj_flow/api/env.py,sha256=VOJbyyMQydPLV4-xQ9ylxwhkvJ8EhZro1GOYPfUSnCU,12629
9
9
  proj_flow/api/init.py,sha256=an0czDiPCDqW4Bp0I8sGQgaAlDAozLO0ZYnP149lWqk,521
10
10
  proj_flow/api/makefile.py,sha256=AxtGOvmypBtSvoyMEDJq1bGoaVD5yW9YYRZSdunUEeg,3856
11
11
  proj_flow/api/release.py,sha256=A-t4qcjeaptEgfBCZs2Q9cOjsGACrNM0CzmCorms0U4,2401
12
12
  proj_flow/api/step.py,sha256=AOqe1wXYnU_O3pD5KlzfyyOm_D9fcF_4vyhhr1w-NrI,4561
13
+ proj_flow/base/__cmake_version__.py,sha256=imja0GnhpBvS8Crz-64eOUKhc4i6FeRrjBGRB68x_p0,239
13
14
  proj_flow/base/__init__.py,sha256=RRmqiYjdVlC4i8QijXHNiRh9yzNH8305WXezrSaPjKk,311
14
15
  proj_flow/base/cmd.py,sha256=Vo3e8kd4CHRzbsUkO-MnbhQxjLXTczv7YQRUkFlcBQE,1560
15
16
  proj_flow/base/inspect.py,sha256=lt5P19rvSZ-wMCTrCYAaQFCt2S9fUjEQXlrKK-Tmvwc,2786
16
17
  proj_flow/base/matrix.py,sha256=8XBFGYOwW6Myt_4h3WNk36V2bJ5xeqUv6DvzF4B3q_g,7767
17
18
  proj_flow/base/name_list.py,sha256=KiHSnbDgYplJc25O3EehYhFAhD7Z3mHVAK6UYOdg5PQ,416
18
19
  proj_flow/base/plugins.py,sha256=evn2Dym_NeoBaIZAu2YUtRd--15PCFpHD0h5zSsWkQE,978
19
- proj_flow/base/registry.py,sha256=C04Imxux_BO7DffZZth28iFLPnM4Yw9K7IGt06VokE0,3528
20
+ proj_flow/base/registry.py,sha256=JJJONiBwpPvOvwh-Omrsc0OfhDC_88wC9HUJTN9udww,3743
20
21
  proj_flow/base/uname.py,sha256=7Awb3Es0jTAKMpyRawdrC16xc5X9M97BlPqEfQibqIk,2295
21
22
  proj_flow/cli/__init__.py,sha256=cMsZpECkXeSzY4Hv_ela3Ou-FhwE5w1A3ypMSnZZikM,1196
22
23
  proj_flow/cli/argument.py,sha256=OCx_Z0NVm4bmHI30WFdtPdqVMdDnvkqqluhAgP7Ya0w,13686
@@ -26,13 +27,11 @@ proj_flow/ext/markdown_changelog.py,sha256=fRGL09jojnv2B-8vAX2prvgNp8e7uyq5NxboS
26
27
  proj_flow/ext/re_structured_changelog.py,sha256=UF23W9eu_YgPO42MiaoDbEKu8In_48mQg6rH9--mI30,459
27
28
  proj_flow/ext/store.py,sha256=yfyIb2G7UhoIkPmVDnp1RPx2fwFZK8FyLZzrMvPlEUM,3681
28
29
  proj_flow/ext/cplusplus/__init__.py,sha256=dAmLMyGVQq586jJM_jiAuo5Ecw9U8agpvSRbzzPgh3g,245
29
- proj_flow/ext/cplusplus/cmake/__init__.py,sha256=f-_gTY_XpIfcKrAj0jhT57DBGeifkW2s7NlSxjpHTMg,366
30
- proj_flow/ext/cplusplus/cmake/__version__.py,sha256=imja0GnhpBvS8Crz-64eOUKhc4i6FeRrjBGRB68x_p0,239
31
- proj_flow/ext/cplusplus/cmake/context.py,sha256=BJDMRuIvCEXR577yWuYSw-wzQ9PQudpXjnIxo1gKHBU,3172
30
+ proj_flow/ext/cplusplus/cmake/__init__.py,sha256=QRD9qEzIhOuzwyjOFdOWUFiwwGTctss5y6Eam3RzeVc,346
32
31
  proj_flow/ext/cplusplus/cmake/parser.py,sha256=ZqQRZqS_VU5VtC8uwax-dknh7sfuLEvtazG8ChSqHDQ,3814
33
- proj_flow/ext/cplusplus/cmake/steps.py,sha256=Q7HcVlMbKOwrRj-Sms0W7FS027M_shM7s2FJx6rX4KQ,4100
32
+ proj_flow/ext/cplusplus/cmake/steps.py,sha256=sYrx7R96HFxo7wzX1n53pthwWMdQFOBSb3tkL9JHneY,4120
34
33
  proj_flow/ext/cplusplus/cmake/version.py,sha256=E0PAUdO9Wg02pxtU4LWYTNoTB-9Oer3Y9zr1lR2zvgw,962
35
- proj_flow/ext/cplusplus/conan/__init__.py,sha256=1WmGMY1hhvJdHsXfHg5MjA8g6qL3H2FABsK0TLBigCI,2022
34
+ proj_flow/ext/cplusplus/conan/__init__.py,sha256=Fv839SWsKPWMZs9ox9T-bofZ4xDJXOI5UfWKQkm0Vtg,1924
36
35
  proj_flow/ext/cplusplus/conan/_conan.py,sha256=9xnji-f8uN7huXLqavVBUDC33CgnjBIyZX6wVcGm2RA,3352
37
36
  proj_flow/ext/github/__init__.py,sha256=Mgx19YS6SYBXYB66_pOgIgwuB2WKRxqp5UGutq0B9Xk,282
38
37
  proj_flow/ext/github/cli.py,sha256=zQS2TB7fDeY0VwR1bOw065Trz2NPe07JKcFQaJbwKGg,3934
@@ -65,15 +64,18 @@ proj_flow/log/rich_text/re_structured_text.py,sha256=DEl9KjBUF6cxfNWpQ7GVnHi7wKe
65
64
  proj_flow/minimal/__init__.py,sha256=NglaSdKiMebrOqfsqF9ctqi0ZwiiBHOQcUnp3DS8lP0,340
66
65
  proj_flow/minimal/base.py,sha256=yJR3FAigR_x8krTQ1UeifBb4AnLUZAk6LfVVqB_RFO4,758
67
66
  proj_flow/minimal/bootstrap.py,sha256=PcZfBsUmj8uDPGBC55iUgD5O7W4VSkpCQb6r9GEyAaQ,556
68
- proj_flow/minimal/init.py,sha256=YFAsD_wGypGxweEFrbAbCdGptV1jQ2OdxUseUPi-3C8,2945
67
+ proj_flow/minimal/init.py,sha256=kJ4flv_W6ZHMVOEDwDbeURlOXS3O2AjGobGzKIbHxZE,2949
69
68
  proj_flow/minimal/list.py,sha256=RlOqammE8olNKXsnbv1enF5uriu0MZ2wFbht37Z2ETw,4810
70
69
  proj_flow/minimal/run.py,sha256=4qvGLqz2ayCZDvVBrq4tG094fjfcmDPon-xcGPQkM_U,4665
71
70
  proj_flow/minimal/system.py,sha256=9FliH5TD103JYSAe2O5EU7hkOHDgVzTqu0Exxk-WrXE,1579
72
71
  proj_flow/project/__init__.py,sha256=AROrwhbuMR5rJE-HC769eL4IXrMLQYpQb3HgpkOAYqg,293
73
- proj_flow/project/api.py,sha256=xQ3eFcxgLfi6ZAGs2q_1V0uHTpM7v9gsb7Ie2o2z-v8,1358
74
- proj_flow/project/cplusplus.py,sha256=GXHXI4cdrSm0jWTr2g9dCBgeFS1G4g2fC9WCv6ILn0c,398
72
+ proj_flow/project/api.py,sha256=-B9Oj_7Z8hQvfgs32XU-S0nw9y8hFSkO71hx-JUHs7Q,1384
75
73
  proj_flow/project/data.py,sha256=TluhBDoJEYL4dnyTpInmhQ49Uvf8mkWmpU-YMLQPNhE,317
76
- proj_flow/project/interact.py,sha256=DgclUNeY6K146QQe510tdHcYnZmWmQZ0xH9w4HifLTU,7235
74
+ proj_flow/project/interact.py,sha256=Abb6Jt88pCebJMkKLGCF3RQLM-Q9D8Yk92GarZ27e9E,7909
75
+ proj_flow/project/cplusplus/__init__.py,sha256=rEKuxAVMpkTTM01Upv3VUtkSiVIpXDAux-7FreWsF2k,301
76
+ proj_flow/project/cplusplus/cmake_context.py,sha256=HZTJ4D_EYHCZGfrSXUHtX2fPzbPp2jON5OCHRSyLPgk,3203
77
+ proj_flow/project/cplusplus/conan_context.py,sha256=iXKATfS56R8AgO3g02M15CqcAkvNeO4gBahWSLHo8Dg,319
78
+ proj_flow/project/cplusplus/project.py,sha256=gLvymc5bhXsjgBRm0u-oddXjbVHmwf6aIpHnqVAd9nc,399
77
79
  proj_flow/template/layers/base.json,sha256=jrlby8FUUwkx4V_EGMix_pkQlWcUCVUgmeoapZaZnt4,3
78
80
  proj_flow/template/layers/cmake.json,sha256=KJe9uqTDoGm0ppdNOtniKEv30iNV2K4Yk8hZQetEZ7Y,385
79
81
  proj_flow/template/layers/conan.json,sha256=mAhDrxCtDjI_7Rbtr2hlNW5_jZkLdWLiwgfuhRsRuuw,29
@@ -128,8 +130,8 @@ proj_flow/template/licenses/MIT.mustache,sha256=NncPoQaNsuy-WmRmboik3fyhJJ8m5pc2
128
130
  proj_flow/template/licenses/Unlicense.mustache,sha256=awOCsWJ58m_2kBQwBUGWejVqZm6wuRtCL2hi9rfa0X4,1211
129
131
  proj_flow/template/licenses/WTFPL.mustache,sha256=lvF4V_PrKKfZPa2TC8CZo8tlqaKvs3Bpv9G6XsWWQ4k,483
130
132
  proj_flow/template/licenses/Zlib.mustache,sha256=uIj-mhSjes2HJ3rRapyy2ALflKRz4xQgS4mVM9827C0,868
131
- proj_flow-0.10.0.dist-info/METADATA,sha256=bQUtOSHQevlBQB43X1xui_BfX4KBey_TwIYx_tUNx1Q,2868
132
- proj_flow-0.10.0.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
133
- proj_flow-0.10.0.dist-info/entry_points.txt,sha256=d_OmGKZzpY7FCWz0sZ4wnBAPZC75oMEzTgJZWtpDELo,49
134
- proj_flow-0.10.0.dist-info/licenses/LICENSE,sha256=vpOQJ5QlrTedF3coEWvA4wJzVJH304f66ZitR7Od4iU,1068
135
- proj_flow-0.10.0.dist-info/RECORD,,
133
+ proj_flow-0.11.0.dist-info/METADATA,sha256=x-Enl_zQtntZR9HXEwP7m-jaR86E6orA5ofhbaWXudc,2868
134
+ proj_flow-0.11.0.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
135
+ proj_flow-0.11.0.dist-info/entry_points.txt,sha256=d_OmGKZzpY7FCWz0sZ4wnBAPZC75oMEzTgJZWtpDELo,49
136
+ proj_flow-0.11.0.dist-info/licenses/LICENSE,sha256=vpOQJ5QlrTedF3coEWvA4wJzVJH304f66ZitR7Od4iU,1068
137
+ proj_flow-0.11.0.dist-info/RECORD,,