modforge-cli 0.2.8__tar.gz → 0.2.9__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 (25) hide show
  1. {modforge_cli-0.2.8 → modforge_cli-0.2.9}/PKG-INFO +1 -1
  2. {modforge_cli-0.2.8 → modforge_cli-0.2.9}/pyproject.toml +1 -1
  3. {modforge_cli-0.2.8 → modforge_cli-0.2.9}/src/modforge_cli/__version__.py +1 -1
  4. {modforge_cli-0.2.8 → modforge_cli-0.2.9}/src/modforge_cli/cli/modpack.py +19 -4
  5. {modforge_cli-0.2.8 → modforge_cli-0.2.9}/src/modforge_cli/core/downloader.py +3 -3
  6. {modforge_cli-0.2.8 → modforge_cli-0.2.9}/src/modforge_cli/core/models.py +1 -0
  7. {modforge_cli-0.2.8 → modforge_cli-0.2.9}/src/modforge_cli/core/resolver.py +11 -4
  8. {modforge_cli-0.2.8 → modforge_cli-0.2.9}/LICENSE +0 -0
  9. {modforge_cli-0.2.8 → modforge_cli-0.2.9}/README.md +0 -0
  10. {modforge_cli-0.2.8 → modforge_cli-0.2.9}/src/modforge_cli/__init__.py +0 -0
  11. {modforge_cli-0.2.8 → modforge_cli-0.2.9}/src/modforge_cli/__main__.py +0 -0
  12. {modforge_cli-0.2.8 → modforge_cli-0.2.9}/src/modforge_cli/api/__init__.py +0 -0
  13. {modforge_cli-0.2.8 → modforge_cli-0.2.9}/src/modforge_cli/api/modrinth.py +0 -0
  14. {modforge_cli-0.2.8 → modforge_cli-0.2.9}/src/modforge_cli/cli/__init__.py +0 -0
  15. {modforge_cli-0.2.8 → modforge_cli-0.2.9}/src/modforge_cli/cli/export.py +0 -0
  16. {modforge_cli-0.2.8 → modforge_cli-0.2.9}/src/modforge_cli/cli/mods.py +0 -0
  17. {modforge_cli-0.2.8 → modforge_cli-0.2.9}/src/modforge_cli/cli/project.py +0 -0
  18. {modforge_cli-0.2.8 → modforge_cli-0.2.9}/src/modforge_cli/cli/setup.py +0 -0
  19. {modforge_cli-0.2.8 → modforge_cli-0.2.9}/src/modforge_cli/cli/shared.py +0 -0
  20. {modforge_cli-0.2.8 → modforge_cli-0.2.9}/src/modforge_cli/cli/sklauncher.py +0 -0
  21. {modforge_cli-0.2.8 → modforge_cli-0.2.9}/src/modforge_cli/cli/utils.py +0 -0
  22. {modforge_cli-0.2.8 → modforge_cli-0.2.9}/src/modforge_cli/core/__init__.py +0 -0
  23. {modforge_cli-0.2.8 → modforge_cli-0.2.9}/src/modforge_cli/core/policy.py +0 -0
  24. {modforge_cli-0.2.8 → modforge_cli-0.2.9}/src/modforge_cli/core/utils.py +0 -0
  25. {modforge_cli-0.2.8 → modforge_cli-0.2.9}/src/modforge_cli/test.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: modforge-cli
3
- Version: 0.2.8
3
+ Version: 0.2.9
4
4
  Summary: ModForge-CLI — a Modrinth-based Minecraft modpack builder
5
5
  License: MIT
6
6
  License-File: LICENSE
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "modforge-cli"
3
- version = "0.2.8"
3
+ version = "0.2.9"
4
4
  description = "ModForge-CLI — a Modrinth-based Minecraft modpack builder"
5
5
  readme = "README.md"
6
6
  requires-python = ">=3.13,<3.15"
@@ -1,5 +1,5 @@
1
1
  """
2
2
  Auto-generated file. DO NOT EDIT.
3
3
  """
4
- __version__ = "0.2.8"
4
+ __version__ = "0.2.9"
5
5
  __author__ = "Frank1o3"
@@ -61,7 +61,14 @@ def add(name: str, project_type: str = "mod", pack_name: str | None = None) -> N
61
61
 
62
62
 
63
63
  @app.command()
64
- def resolve(pack_name: str | None = None) -> None:
64
+ def resolve(
65
+ pack_name: str | None = None,
66
+ include_optional: bool = typer.Option(
67
+ False,
68
+ "--include-optional",
69
+ help="Include optional dependencies (e.g., ViaFabric multi-version sub-mods)",
70
+ ),
71
+ ) -> None:
65
72
  """Resolve all mod dependencies"""
66
73
  api = ModrinthAPIConfig(MODRINTH_API)
67
74
 
@@ -87,14 +94,22 @@ def resolve(pack_name: str | None = None) -> None:
87
94
  console.print("[red]Could not load manifest[/red]")
88
95
  raise typer.Exit(1)
89
96
 
90
- console.print(f"[cyan]Resolving dependencies for {pack_name}...[/cyan]")
97
+ if include_optional:
98
+ console.print(f"[cyan]Resolving dependencies for {pack_name} (including optional)...[/cyan]")
99
+ else:
100
+ console.print(f"[cyan]Resolving dependencies for {pack_name} (required only)...[/cyan]")
101
+ console.print("[dim]Tip: Use --include-optional to add optional dependencies[/dim]")
91
102
 
92
103
  policy = ModPolicy(POLICY_PATH)
93
104
  resolver = ModResolver(
94
- policy=policy, api=api, mc_version=manifest.minecraft, loader=manifest.loader
105
+ policy=policy,
106
+ api=api,
107
+ mc_version=manifest.minecraft,
108
+ loader=manifest.loader,
109
+ include_optional_deps=include_optional,
95
110
  )
96
111
 
97
- async def do_resolve():
112
+ async def do_resolve() -> set[str]:
98
113
  async with await get_api_session() as session:
99
114
  return await resolver.resolve(manifest.mods, session)
100
115
 
@@ -69,9 +69,9 @@ class ModDownloader:
69
69
 
70
70
  def version_score(v: Any) -> tuple[int, str]:
71
71
  vtype = version_priority.get(v.get("version_type", "alpha"), 0)
72
- # Use version id as proxy for date (IDs are timestamp-based)
73
- vid = v.get("id", "")
74
- return (vtype, vid)
72
+ # Use date_published for chronological ordering (ISO 8601, sortable)
73
+ vdate = v.get("date_published", "") or ""
74
+ return (vtype, str(vdate))
75
75
 
76
76
  # Filter compatible versions
77
77
  compatible = []
@@ -55,6 +55,7 @@ class ProjectVersion(BaseAPIModel):
55
55
  files: list[File] = Field(default_factory=list)
56
56
  game_versions: list[str] = Field(default_factory=list)
57
57
  loaders: list[str] = Field(default_factory=list)
58
+ date_published: str | None = None
58
59
 
59
60
  @property
60
61
  def is_release(self) -> bool:
@@ -28,11 +28,13 @@ class ModResolver:
28
28
  api: ModrinthAPIConfig,
29
29
  mc_version: str,
30
30
  loader: str,
31
+ include_optional_deps: bool = False,
31
32
  ) -> None:
32
33
  self.policy = policy
33
34
  self.api = api
34
35
  self.mc_version = mc_version
35
36
  self.loader = loader
37
+ self.include_optional_deps = include_optional_deps
36
38
 
37
39
  self._headers = {"User-Agent": f"{__author__}/ModForge-CLI/{__version__}"}
38
40
 
@@ -48,8 +50,9 @@ class ModResolver:
48
50
 
49
51
  def version_score(v: ProjectVersion) -> tuple[int, str]:
50
52
  vtype = version_priority.get(v.version_type, 0)
51
- # Use version id as proxy for date (IDs are timestamp-based)
52
- return (vtype, v.id)
53
+ # Use date_published for chronological ordering (ISO 8601, sortable)
54
+ vdate = v.date_published or ""
55
+ return (vtype, vdate)
53
56
 
54
57
  # Filter compatible versions
55
58
  compatible = [
@@ -60,7 +63,7 @@ class ModResolver:
60
63
  if not compatible:
61
64
  return None
62
65
 
63
- # Sort by version type (release > beta > alpha), then by ID (newest first)
66
+ # Sort by version type (release > beta > alpha), then by date (newest first)
64
67
  compatible.sort(key=version_score, reverse=True)
65
68
  return compatible[0]
66
69
 
@@ -231,9 +234,13 @@ class ModResolver:
231
234
  f"(conflicts with '{pid}')[/yellow]"
232
235
  )
233
236
 
234
- if dtype in ("required", "optional") and dep_id not in resolved:
237
+ if dtype == "required" and dep_id not in resolved:
235
238
  resolved.add(dep_id)
236
239
  queue.append(dep_id)
240
+ elif dtype == "optional" and self.include_optional_deps and dep_id not in resolved:
241
+ resolved.add(dep_id)
242
+ queue.append(dep_id)
243
+ console.print(f"[dim] + Optional dep added: {dep_id}[/dim]")
237
244
 
238
245
  # Report failed slugs
239
246
  if failed_slugs:
File without changes
File without changes