diff --git a/.gitattributes b/.gitattributes index 7416493..c339f54 100644 --- a/.gitattributes +++ b/.gitattributes @@ -3,3 +3,4 @@ OneDotNet/srcs/private/app/OxfordWordlistExtractor/*.html linguist-vendored OneDotNet/tests/OxfordDictExtractor.Tests/examples/*.html linguist-vendored src/private/app/supermemo-mcp/references/*.ahk linguist-vendored +src/private/app/factorio-cycle-calculator/src/factorio_cycle_calculator/generated/* linguist-generated diff --git a/.mise.toml b/.mise.toml index f547a08..004a73d 100644 --- a/.mise.toml +++ b/.mise.toml @@ -1,3 +1,11 @@ +experimental_monorepo_root = true + +[settings] +experimental = true + +[monorepo] +config_roots = ["src/private/app/factorio-cycle-calculator"] + [tools] # Runtimes dotnet = "10" diff --git a/src/private/app/factorio-cycle-calculator/.mise.toml b/src/private/app/factorio-cycle-calculator/.mise.toml new file mode 100644 index 0000000..cc2f3e7 --- /dev/null +++ b/src/private/app/factorio-cycle-calculator/.mise.toml @@ -0,0 +1,35 @@ +[tasks."schema:generate"] +description = "Generate Python models from the JSON schema." +run = [ + """ + uv run \ + --project src/private/app/factorio-cycle-calculator \ + --package factorio-cycle-calculator \ + --group dev \ + datamodel-codegen \ + --url https://raw.githubusercontent.com/jacquev6/factorio-data-raw-json-schema/refs/heads/main/factorio-data-raw-json-schema.full.json \ + --output src/factorio_cycle_calculator/generated/data_raw_models.py \ + --input-file-type jsonschema \ + --output-model-type dataclasses.dataclass \ + --target-python-version 3.12 \ + --formatters ruff-format""", + """ + uv run \ + --project src/private/app/factorio-cycle-calculator \ + --package factorio-cycle-calculator \ + --group dev \ + ruff check \ + --fix \ + --exit-zero \ + --quiet \ + src/factorio_cycle_calculator/generated/data_raw_models.py""", + """ + uv run \ + --project src/private/app/factorio-cycle-calculator \ + --package factorio-cycle-calculator \ + --group dev \ + ruff format \ + --quiet \ + src/factorio_cycle_calculator/generated/data_raw_models.py""", +] +outputs = ["src/factorio_cycle_calculator/generated/data_raw_models.py"] diff --git a/src/private/app/factorio-cycle-calculator/README.md b/src/private/app/factorio-cycle-calculator/README.md index 99b1bef..6ce14b4 100644 --- a/src/private/app/factorio-cycle-calculator/README.md +++ b/src/private/app/factorio-cycle-calculator/README.md @@ -20,6 +20,18 @@ An initial Streamlit prototype is available in `app.py`. It focuses on the advanced oil processing chain and uses Google OR-Tools to compute machine counts given a petroleum gas demand and the chosen machine/effect settings. -Run the app with: +Run the app after installation with the script entry point: -- `uv run --project src/private/app/factorio-cycle-calculator streamlit run app.py` +- `uv run --project src/private/app/factorio-cycle-calculator factorio-cycle-calculator` + +## Schema and generated models + +The generated models live in +`src/factorio_cycle_calculator/generated/data_raw_models.py`. + +Model generation is driven entirely by a mise task that pulls the schema from +the upstream URL and does not store a local JSON schema file. + +Generate models: + +- `mise //src/private/app/factorio-cycle-calculator:schema:generate` diff --git a/src/private/app/factorio-cycle-calculator/pyproject.toml b/src/private/app/factorio-cycle-calculator/pyproject.toml index e700259..8304d46 100644 --- a/src/private/app/factorio-cycle-calculator/pyproject.toml +++ b/src/private/app/factorio-cycle-calculator/pyproject.toml @@ -1,3 +1,7 @@ +[build-system] +requires = ["hatchling>=1.24.2"] +build-backend = "hatchling.build" + [project] name = "factorio-cycle-calculator" version = "0.0.0-dev" @@ -9,5 +13,24 @@ license = "GPL-3.0-or-later" classifiers = ["Private :: Do Not Upload"] dependencies = ["ortools>=9.11.4210", "pillow>=10.3.0", "streamlit>=1.42.0"] +[project.scripts] +factorio-cycle-calculator = "factorio_cycle_calculator.__main__:main" + [dependency-groups] -dev = ["datamodel-code-generator[ruff]>=0.53.0"] +dev = ["datamodel-code-generator[debug,ruff,http]>=0.53.0"] + +[tool.hatch.build.targets.wheel] +packages = ["src/factorio_cycle_calculator"] + +[tool.datamodel-codegen] +input = "https://raw.githubusercontent.com/jacquev6/factorio-data-raw-json-schema/refs/heads/main/factorio-data-raw-json-schema.full.json" +input-file-type = "jsonschema" +output = "src/factorio_cycle_calculator/generated/data_raw_models.py" +output-model-type = "dataclasses.dataclass" +target-python-version = "3.12" + +[tool.ruff] +extend = "../../../../pyproject.toml" + +[tool.ruff.lint.per-file-ignores] +"src/factorio_cycle_calculator/generated/data_raw_models.py" = ["D", "N815"] diff --git a/src/private/app/factorio-cycle-calculator/src/factorio_cycle_calculator/__main__.py b/src/private/app/factorio-cycle-calculator/src/factorio_cycle_calculator/__main__.py new file mode 100644 index 0000000..04f0ce6 --- /dev/null +++ b/src/private/app/factorio-cycle-calculator/src/factorio_cycle_calculator/__main__.py @@ -0,0 +1,27 @@ +"""Run the Streamlit app via the package entry point.""" + +from __future__ import annotations + +import sys +from importlib import import_module +from pathlib import Path + +from streamlit.web.cli import main as streamlit_main + + +def main(argv: list[str] | None = None) -> None: + """Launch the Streamlit application.""" + module = import_module("factorio_cycle_calculator.app") + app_path = Path(module.__file__).resolve() + old_argv = sys.argv + extra_args = old_argv[1:] if argv is None else list(argv) + new_argv = ["streamlit", "run", str(app_path), *extra_args] + try: + sys.argv = new_argv + streamlit_main() + finally: + sys.argv = old_argv + + +if __name__ == "__main__": + main() diff --git a/src/private/app/factorio-cycle-calculator/app.py b/src/private/app/factorio-cycle-calculator/src/factorio_cycle_calculator/app.py similarity index 99% rename from src/private/app/factorio-cycle-calculator/app.py rename to src/private/app/factorio-cycle-calculator/src/factorio_cycle_calculator/app.py index 678fc2b..14831bc 100644 --- a/src/private/app/factorio-cycle-calculator/app.py +++ b/src/private/app/factorio-cycle-calculator/src/factorio_cycle_calculator/app.py @@ -2,12 +2,10 @@ from __future__ import annotations -import importlib import io import json import os import re -import sys from collections.abc import Mapping, Sequence from dataclasses import MISSING, dataclass, fields, is_dataclass from pathlib import Path @@ -58,20 +56,14 @@ class ModulePrototype(_GeneratedModel): class RecipePrototype(_GeneratedModel): """Type-checking stub for recipes.""" else: - _generated_path = ( - Path(__file__).resolve().parent / "generated" / "data_raw_models.py" - ) - if not _generated_path.exists(): - raise GeneratedModelsImportError( - _generated_path, - reason="Generated models not found", - ) - _generated_root = _generated_path.parent.parent - if str(_generated_root) not in sys.path: - sys.path.insert(0, str(_generated_root)) try: - _module = importlib.import_module("generated.data_raw_models") + from factorio_cycle_calculator.generated import ( + data_raw_models as _module, + ) except Exception as exc: + _generated_path = ( + Path(__file__).resolve().parent / "generated" / "data_raw_models.py" + ) raise GeneratedModelsImportError( _generated_path, reason="Failed to import generated models", diff --git a/src/private/app/factorio-cycle-calculator/generated/data_raw_models.py b/src/private/app/factorio-cycle-calculator/src/factorio_cycle_calculator/generated/data_raw_models.py similarity index 99% rename from src/private/app/factorio-cycle-calculator/generated/data_raw_models.py rename to src/private/app/factorio-cycle-calculator/src/factorio_cycle_calculator/generated/data_raw_models.py index fd4ac55..3e26262 100644 --- a/src/private/app/factorio-cycle-calculator/generated/data_raw_models.py +++ b/src/private/app/factorio-cycle-calculator/src/factorio_cycle_calculator/generated/data_raw_models.py @@ -1,26 +1,26 @@ # generated by datamodel-codegen: -# filename: factorio-data-raw-json-schema.full.json -# timestamp: 2026-02-13T23:23:05+00:00 +# filename: https://raw.githubusercontent.com/jacquev6/factorio-data-raw-json-schema/refs/heads/main/factorio-data-raw-json-schema.full.json +# timestamp: 2026-02-16T07:49:34+00:00 from __future__ import annotations from dataclasses import dataclass -from enum import Enum -from typing import Any, Literal, TypeAlias, Union +from enum import StrEnum +from typing import Any, Literal -class Effect(Enum): +class Effect(StrEnum): compilatron_hologram = "compilatron-hologram" -class Priority(Enum): +class Priority(StrEnum): closest = "closest" farthest = "farthest" newest = "newest" oldest = "oldest" -class Alignment(Enum): +class Alignment(StrEnum): top_left = "top-left" middle_left = "middle-left" left = "left" @@ -35,38 +35,38 @@ class Alignment(Enum): bottom_right = "bottom-right" -class AmbientSoundType(Enum): +class AmbientSoundType(StrEnum): menu_track = "menu-track" main_track = "main-track" hero_track = "hero-track" interlude = "interlude" -class AmmoSourceType(Enum): +class AmmoSourceType(StrEnum): default = "default" player = "player" turret = "turret" vehicle = "vehicle" -class TargetType(Enum): +class TargetType(StrEnum): entity = "entity" position = "position" direction = "direction" -class AnimationRunMode(Enum): +class AnimationRunMode(StrEnum): forward = "forward" backward = "backward" forward_then_backward = "forward-then-backward" -class CollisionMode(Enum): +class CollisionMode(StrEnum): distance_from_collision_box = "distance-from-collision-box" distance_from_center = "distance-from-center" -class AttenuationType(Enum): +class AttenuationType(StrEnum): none = "none" linear = "linear" logarithmic = "logarithmic" @@ -75,19 +75,19 @@ class AttenuationType(Enum): S_curve = "S-curve" -class ModuleTintMode(Enum): +class ModuleTintMode(StrEnum): single_module = "single-module" mix = "mix" -class ActivationType(Enum): +class ActivationType(StrEnum): shoot = "shoot" throw = "throw" consume = "consume" activate = "activate" -class BlendMode(Enum): +class BlendMode(StrEnum): normal = "normal" additive = "additive" additive_soft = "additive-soft" @@ -96,13 +96,13 @@ class BlendMode(Enum): overwrite = "overwrite" -class BuildMode(Enum): +class BuildMode(StrEnum): normal = "normal" forced = "forced" superforced = "superforced" -class CloudEffectStyle(Enum): +class CloudEffectStyle(StrEnum): none = "none" euclidean = "euclidean" manhattan = "manhattan" @@ -113,7 +113,7 @@ class CloudEffectStyle(Enum): texture_outside = "texture-outside" -class ComparatorString(Enum): +class ComparatorString(StrEnum): field_ = "=" field__1 = ">" field__2 = "<" @@ -125,18 +125,18 @@ class ComparatorString(Enum): field___2 = "!=" -class ConsumingType(Enum): +class ConsumingType(StrEnum): none = "none" game_only = "game-only" -class EventType(Enum): +class EventType(StrEnum): crafting_of_single_item_ordered = "crafting-of-single-item-ordered" crafting_of_multiple_items_ordered = "crafting-of-multiple-items-ordered" crafting_finished = "crafting-finished" -class ApplyTileTint(Enum): +class ApplyTileTint(StrEnum): primary = "primary" secondary = "secondary" @@ -146,7 +146,7 @@ class CreateSpacePlatformTechnologyTrigger: type: Literal["create-space-platform"] -class CursorBoxType(Enum): +class CursorBoxType(StrEnum): entity = "entity" multiplayer_entity = "multiplayer-entity" electricity = "electricity" @@ -165,7 +165,7 @@ class DependenciesMetTipTrigger: type: Literal["dependencies-met"] -class DirectionString(Enum): +class DirectionString(StrEnum): north = "north" north_north_east = "north_north_east" north_east = "north_east" @@ -184,13 +184,13 @@ class DirectionString(Enum): north_north_west = "north_north_west" -class EffectRelativeTo(Enum): +class EffectRelativeTo(StrEnum): ground_origin = "ground-origin" pod = "pod" spawn_origin = "spawn-origin" -class EffectTypeLimitationEnum(Enum): +class EffectTypeLimitationEnum(StrEnum): speed = "speed" productivity = "productivity" consumption = "consumption" @@ -198,21 +198,21 @@ class EffectTypeLimitationEnum(Enum): quality = "quality" -EffectTypeLimitation: TypeAlias = ( +type EffectTypeLimitation = ( Literal["speed", "productivity", "consumption", "pollution", "quality"] | list[EffectTypeLimitationEnum] | dict[str, Any] ) -class EffectVariation(Enum): +class EffectVariation(StrEnum): lava = "lava" wetland_water = "wetland-water" oil = "oil" water = "water" -class ElectricUsagePriority(Enum): +class ElectricUsagePriority(StrEnum): primary_input = "primary-input" primary_output = "primary-output" secondary_input = "secondary-input" @@ -222,17 +222,17 @@ class ElectricUsagePriority(Enum): lamp = "lamp" -class DrawType(Enum): +class DrawType(StrEnum): inner = "inner" outer = "outer" -class Type(Enum): +class Type(StrEnum): none = "none" composition = "composition" -class EntityPrototypeFlag(Enum): +class EntityPrototypeFlag(StrEnum): not_rotatable = "not-rotatable" placeable_neutral = "placeable-neutral" placeable_player = "placeable-player" @@ -260,10 +260,10 @@ class EntityPrototypeFlag(Enum): not_in_made_in = "not-in-made-in" -EntityPrototypeFlags: TypeAlias = list[EntityPrototypeFlag] | dict[str, Any] +type EntityPrototypeFlags = list[EntityPrototypeFlag] | dict[str, Any] -class EntityStatus(Enum): +class EntityStatus(StrEnum): working = "working" normal = "normal" ghost = "ghost" @@ -333,35 +333,35 @@ class EntityStatus(Enum): recipe_not_researched = "recipe-not-researched" -class Transfer(Enum): +class Transfer(StrEnum): in_ = "in" out = "out" -class Type1(Enum): +class Type1(StrEnum): full = "full" manual = "manual" -class ProductionType(Enum): +class ProductionType(StrEnum): none = "none" input = "input" input_output = "input-output" output = "output" -class FluidFlowDirection(Enum): +class FluidFlowDirection(StrEnum): input_output = "input-output" input = "input" output = "output" -class FogType(Enum): +class FogType(StrEnum): vulcanus = "vulcanus" gleba = "gleba" -class ForceCondition(Enum): +class ForceCondition(StrEnum): all = "all" enemy = "enemy" ally = "ally" @@ -371,24 +371,24 @@ class ForceCondition(Enum): not_same = "not-same" -class PlayFor(Enum): +class PlayFor(StrEnum): character_actions = "character_actions" everything = "everything" -class HorizontalAlign(Enum): +class HorizontalAlign(StrEnum): left = "left" center_ = "center" right = "right" -class RenderLayer1(Enum): +class RenderLayer1(StrEnum): entity_info_icon = "entity-info-icon" entity_info_icon_above = "entity-info-icon-above" air_entity_info_icon = "air-entity-info-icon" -class ItemPrototypeFlag(Enum): +class ItemPrototypeFlag(StrEnum): draw_logistic_overlay = "draw-logistic-overlay" excluded_from_trash_unrequested = "excluded-from-trash-unrequested" always_show = "always-show" @@ -403,15 +403,15 @@ class ItemPrototypeFlag(Enum): ignore_spoil_time_modifier = "ignore-spoil-time-modifier" -ItemPrototypeFlags: TypeAlias = list[ItemPrototypeFlag] | dict[str, Any] +type ItemPrototypeFlags = list[ItemPrototypeFlag] | dict[str, Any] -class Type2(Enum): +class Type2(StrEnum): basic = "basic" oriented = "oriented" -class Type4(Enum): +class Type4(StrEnum): impact_soundset = "impact-soundset" prototype = "prototype" id = "id" @@ -420,7 +420,7 @@ class Type4(Enum): ) -class LinkedGameControl(Enum): +class LinkedGameControl(StrEnum): move_up = "move-up" move_down = "move-down" move_left = "move-left" @@ -615,26 +615,26 @@ class LinkedGameControl(Enum): field_ = "" -class WireType(Enum): +class WireType(StrEnum): red = "red" green = "green" copper = "copper" -class AutoplaceSettings1(Enum): +class AutoplaceSettings1(StrEnum): entity = "entity" tile = "tile" decorative = "decorative" -class Mirroring(Enum): +class Mirroring(StrEnum): horizontal = "horizontal" vertical = "vertical" diagonal_pos = "diagonal-pos" diagonal_neg = "diagonal-neg" -class ModuleTint(Enum): +class ModuleTint(StrEnum): primary = "primary" secondary = "secondary" tertiary = "tertiary" @@ -642,30 +642,30 @@ class ModuleTint(Enum): none = "none" -class OrderEnum(Enum): +class OrderEnum(StrEnum): wind = "wind" base_ambience = "base_ambience" -class ConnectionType(Enum): +class ConnectionType(StrEnum): normal = "normal" underground = "underground" linked = "linked" -class PlayerInputMethodFilter(Enum): +class PlayerInputMethodFilter(StrEnum): all = "all" keyboard_and_mouse = "keyboard_and_mouse" game_controller = "game_controller" -class ProcessionAudioEventType(Enum): +class ProcessionAudioEventType(StrEnum): play_sound = "play-sound" start_looped_sound = "start-looped-sound" stop_looped_sound = "stop-looped-sound" -class ProcessionAudioType(Enum): +class ProcessionAudioType(StrEnum): none = "none" sound = "sound" looped_sound = "looped-sound" @@ -673,13 +673,13 @@ class ProcessionAudioType(Enum): location_catalogue = "location-catalogue" -class ProcessionAudioUsage(Enum): +class ProcessionAudioUsage(StrEnum): both = "both" passenger = "passenger" outside = "outside" -class ProcessionGraphicType(Enum): +class ProcessionGraphicType(StrEnum): none = "none" sprite = "sprite" animation = "animation" @@ -688,13 +688,13 @@ class ProcessionGraphicType(Enum): hatch_location_catalogue_index = "hatch-location-catalogue-index" -class RangeMode(Enum): +class RangeMode(StrEnum): center_to_center = "center-to-center" bounding_box_to_bounding_box = "bounding-box-to-bounding-box" center_to_bounding_box = "center-to-bounding-box" -class RenderLayer(Enum): +class RenderLayer(StrEnum): zero = "zero" background_transitions = "background-transitions" under_tiles = "under-tiles" @@ -768,23 +768,23 @@ class RenderLayer(Enum): cursor = "cursor" -class RichTextSetting(Enum): +class RichTextSetting(StrEnum): enabled = "enabled" disabled = "disabled" highlight = "highlight" -class EntityFilterMode(Enum): +class EntityFilterMode(StrEnum): whitelist = "whitelist" blacklist = "blacklist" -class TileFilterMode(Enum): +class TileFilterMode(StrEnum): whitelist = "whitelist" blacklist = "blacklist" -class SelectionModeFlag(Enum): +class SelectionModeFlag(StrEnum): blueprint = "blueprint" deconstruct = "deconstruct" cancel_deconstruct = "cancel-deconstruct" @@ -814,7 +814,7 @@ class SelectionModeFlag(Enum): tile_ghost = "tile-ghost" -SelectionModeFlags: TypeAlias = ( +type SelectionModeFlags = ( Literal[ "blueprint", "deconstruct", @@ -849,18 +849,18 @@ class SelectionModeFlag(Enum): ) -class SendToOrbitMode(Enum): +class SendToOrbitMode(StrEnum): not_sendable = "not-sendable" manual = "manual" automated = "automated" -class Target(Enum): +class Target(StrEnum): enemy = "enemy" entity = "entity" -class Type6(Enum): +class Type6(StrEnum): virtual = "virtual" item = "item" fluid = "fluid" @@ -871,7 +871,7 @@ class Type6(Enum): quality = "quality" -class SoundModifierType(Enum): +class SoundModifierType(StrEnum): game = "game" main_menu = "main-menu" tips_and_tricks = "tips-and-tricks" @@ -880,7 +880,7 @@ class SoundModifierType(Enum): space_platform = "space-platform" -class SoundType(Enum): +class SoundType(StrEnum): game_effect = "game-effect" gui_effect = "gui-effect" ambient = "ambient" @@ -894,12 +894,12 @@ class SoundType(Enum): enemy = "enemy" -class Type8(Enum): +class Type8(StrEnum): entity = "entity" asteroid_chunk = "asteroid-chunk" -class SpriteFlag(Enum): +class SpriteFlag(StrEnum): no_crop = "no-crop" not_compressed = "not-compressed" always_compressed = "always-compressed" @@ -935,10 +935,10 @@ class SpriteFlag(Enum): group_effect_texture = "group=effect-texture" -SpriteFlags: TypeAlias = list[SpriteFlag] | dict[str, Any] +type SpriteFlags = list[SpriteFlag] | dict[str, Any] -class SpritePriority(Enum): +class SpritePriority(StrEnum): extra_high_no_scale = "extra-high-no-scale" extra_high = "extra-high" high = "high" @@ -948,7 +948,7 @@ class SpritePriority(Enum): no_atlas = "no-atlas" -class SpriteUsageHint(Enum): +class SpriteUsageHint(StrEnum): any = "any" mining = "mining" tile_artifical = "tile-artifical" @@ -965,7 +965,7 @@ class SpriteUsageHint(Enum): decorative = "decorative" -class SpriteUsageSurfaceHint(Enum): +class SpriteUsageSurfaceHint(StrEnum): any = "any" nauvis = "nauvis" vulcanus = "vulcanus" @@ -975,20 +975,20 @@ class SpriteUsageSurfaceHint(Enum): space = "space" -class Transfer1(Enum): +class Transfer1(StrEnum): stack = "stack" inventory = "inventory" whole_inventory = "whole-inventory" -class StretchRule(Enum): +class StretchRule(StrEnum): on = "on" off = "off" auto = "auto" stretch_and_expand = "stretch_and_expand" -class TileRenderLayer(Enum): +class TileRenderLayer(StrEnum): zero = "zero" water = "water" water_overlay = "water-overlay" @@ -997,7 +997,7 @@ class TileRenderLayer(Enum): top = "top" -class TipStatus(Enum): +class TipStatus(StrEnum): locked = "locked" optional = "optional" dependencies_not_met = "dependencies-not-met" @@ -1008,7 +1008,7 @@ class TipStatus(Enum): completed = "completed" -class TurretState(Enum): +class TurretState(StrEnum): folded = "folded" preparing = "preparing" prepared = "prepared" @@ -1019,44 +1019,44 @@ class TurretState(Enum): folding = "folding" -class ValveMode(Enum): +class ValveMode(StrEnum): one_way = "one-way" overflow = "overflow" top_up = "top-up" -class VariableAmbientSoundCompositionMode(Enum): +class VariableAmbientSoundCompositionMode(StrEnum): randomized = "randomized" semi_randomized = "semi-randomized" shuffled = "shuffled" layer_controlled = "layer-controlled" -class VariableAmbientSoundNextStateTrigger(Enum): +class VariableAmbientSoundNextStateTrigger(StrEnum): layers_finished = "layers-finished" duration = "duration" -class VariableAmbientSoundStateType(Enum): +class VariableAmbientSoundStateType(StrEnum): regular = "regular" intermezzo = "intermezzo" final = "final" stop = "stop" -class VerticalAlign(Enum): +class VerticalAlign(StrEnum): top = "top" center_ = "center" bottom = "bottom" -class Effect32(Enum): +class Effect32(StrEnum): flicker = "flicker" uranium_glow = "uranium-glow" none = "none" -class ApplyRecipeTint(Enum): +class ApplyRecipeTint(StrEnum): primary = "primary" secondary = "secondary" tertiary = "tertiary" @@ -1064,7 +1064,7 @@ class ApplyRecipeTint(Enum): none = "none" -class ApplyTint(Enum): +class ApplyTint(StrEnum): resource_color = "resource-color" input_fluid_base_color = "input-fluid-base-color" input_fluid_flow_color = "input-fluid-flow-color" @@ -1073,81 +1073,81 @@ class ApplyTint(Enum): visual_state_color = "visual-state-color" -Boolean: TypeAlias = bool +type Boolean = bool -Double: TypeAlias = float +type Double = float -Float: TypeAlias = float +type Float = float -Int16: TypeAlias = float +type Int16 = float -Int32: TypeAlias = float +type Int32 = float -Int8: TypeAlias = float +type Int8 = float -Number: TypeAlias = float +type Number = float -String: TypeAlias = str +type String = str -Table: TypeAlias = Any +type Table = Any -Uint16: TypeAlias = float +type Uint16 = float -Uint32: TypeAlias = float +type Uint32 = float -Uint64: TypeAlias = float +type Uint64 = float -Uint8: TypeAlias = float +type Uint8 = float -class RemoveDecoratives(Enum): +class RemoveDecoratives(StrEnum): automatic = "automatic" true = "true" false = "false" -class Category(Enum): +class Category(StrEnum): resource = "resource" terrain = "terrain" cliff = "cliff" enemy = "enemy" -class BeaconCounter(Enum): +class BeaconCounter(StrEnum): total = "total" same_type = "same_type" -class FilterMode(Enum): +class FilterMode(StrEnum): blacklist = "blacklist" whitelist = "whitelist" -class Mode(Enum): +class Mode(StrEnum): heat_fluid_inside = "heat-fluid-inside" output_to_separate_pipe = "output-to-separate-pipe" -class ObjectiveCondition(Enum): +class ObjectiveCondition(StrEnum): game_finished = "game-finished" rocket_launched = "rocket-launched" late_research = "late-research" late_research_1 = "late-research" -class InventoryType(Enum): +class InventoryType(StrEnum): normal = "normal" with_bar = "with_bar" with_filters_and_bar = "with_filters_and_bar" @@ -1155,7 +1155,7 @@ class InventoryType(Enum): with_weight_limit = "with_weight_limit" -class Action(Enum): +class Action(StrEnum): lua = "lua" spawn_item = "spawn-item" toggle_personal_roboport = "toggle-personal-roboport" @@ -1169,13 +1169,13 @@ class DeliverCategory: name: String -class GuiMode(Enum): +class GuiMode(StrEnum): all = "all" none = "none" admins = "admins" -class AttackType(Enum): +class AttackType(StrEnum): autonomous = "autonomous" distraction = "distraction" scripted = "scripted" @@ -1187,7 +1187,7 @@ class ImpactCategory: name: String -class LogisticMode(Enum): +class LogisticMode(StrEnum): active_provider = "active-provider" passive_provider = "passive-provider" requester = "requester" @@ -1195,7 +1195,7 @@ class LogisticMode(Enum): buffer = "buffer" -class GlowRenderMode(Enum): +class GlowRenderMode(StrEnum): additive = "additive" multiplicative = "multiplicative" @@ -1206,7 +1206,7 @@ class MapGenPresets: name: String -class SystemCursor(Enum): +class SystemCursor(StrEnum): arrow = "arrow" i_beam = "i-beam" crosshair = "crosshair" @@ -1216,7 +1216,7 @@ class SystemCursor(Enum): hand = "hand" -class Usage(Enum): +class Usage(StrEnum): departure = "departure" arrival = "arrival" intermezzo = "intermezzo" @@ -1229,7 +1229,7 @@ class RemoteControllerPrototype: movement_speed: Double -class Action1(Enum): +class Action1(StrEnum): toggle_alt_mode = "toggle-alt-mode" undo = "undo" redo = "redo" @@ -1243,7 +1243,7 @@ class Action1(Enum): redo_1 = "redo" -class Style(Enum): +class Style(StrEnum): default = "default" blue = "blue" red = "red" @@ -1257,7 +1257,7 @@ class SpectatorControllerPrototype: movement_speed: Double -class Shader(Enum): +class Shader(StrEnum): water = "water" space = "space" puddle = "puddle" @@ -1299,7 +1299,7 @@ class ActivatePasteTipTrigger: count: Uint32 | None = None -ActiveTriggerID: TypeAlias = String +type ActiveTriggerID = String @dataclass @@ -1335,7 +1335,7 @@ class AgriculturalCraneSpeedGrappler: allow_transpolar_movement: Boolean | None = None -AirbornePollutantID: TypeAlias = String +type AirbornePollutantID = String @dataclass @@ -1344,13 +1344,13 @@ class AlternativeBuildTipTrigger: count: Uint32 | None = None -AmmoCategoryID: TypeAlias = String +type AmmoCategoryID = String -AnimationFrameSequence: TypeAlias = list[Uint16] | dict[str, Any] +type AnimationFrameSequence = list[Uint16] | dict[str, Any] -AnyBasic: TypeAlias = String | Boolean | Number | Table +type AnyBasic = String | Boolean | Number | Table @dataclass @@ -1359,7 +1359,7 @@ class ApplyStarterPackTipTrigger: count: Uint32 | None = None -AsteroidChunkID: TypeAlias = String +type AsteroidChunkID = String @dataclass @@ -1368,7 +1368,7 @@ class AsteroidSettings: max_ray_portals_expanded_per_tick: Uint32 -AutoplaceControlID: TypeAlias = String +type AutoplaceControlID = String @dataclass @@ -1383,7 +1383,7 @@ class BuildEntityByRobotTipTrigger: count: Uint32 | None = None -BurnerUsageID: TypeAlias = String +type BurnerUsageID = String @dataclass @@ -1421,7 +1421,7 @@ class CloudsTextureCoordinateTransformation: wind_speed_factor: Float | None = None -CollisionLayerID: TypeAlias = String +type CollisionLayerID = String @dataclass @@ -1440,7 +1440,7 @@ class Color1: a: Float | None = None -Color: TypeAlias = Color1 | list[Float] +type Color = Color1 | list[Float] @dataclass @@ -1476,13 +1476,13 @@ class ControlPoint1: volume_percentage: Float -ControlPoint: TypeAlias = ControlPoint1 | list[Float] +type ControlPoint = ControlPoint1 | list[Float] -DamageTypeID: TypeAlias = String +type DamageTypeID = String -DecorativeID: TypeAlias = String +type DecorativeID = String @dataclass @@ -1498,7 +1498,7 @@ class DropItemTipTrigger: drop_into_entity: Boolean | None = None -EffectValue: TypeAlias = Float +type EffectValue = Float @dataclass @@ -1532,10 +1532,10 @@ class EnemySpawnerAbsorption: proportional: Double -Energy: TypeAlias = String +type Energy = String -EntityID: TypeAlias = String +type EntityID = String @dataclass @@ -1545,13 +1545,13 @@ class EntityTransferTipTrigger: transfer: Transfer | None = None -EquipmentCategoryID: TypeAlias = String +type EquipmentCategoryID = String -EquipmentGridID: TypeAlias = String +type EquipmentGridID = String -EquipmentID: TypeAlias = String +type EquipmentID = String @dataclass @@ -1570,7 +1570,7 @@ class Fade1: to: ControlPoint | None = None -Fade: TypeAlias = Fade1 | AttenuationType +type Fade = Fade1 | AttenuationType @dataclass @@ -1594,7 +1594,7 @@ class FastReplaceTipTrigger: match_type_only: Boolean | None = None -FileName: TypeAlias = String +type FileName = String @dataclass @@ -1603,7 +1603,7 @@ class FlipEntityTipTrigger: count: Uint32 | None = None -FluidAmount: TypeAlias = Double +type FluidAmount = Double @dataclass @@ -1614,10 +1614,10 @@ class SecondaryDrawOrders: west: Int8 | None = None -FluidBoxLinkedConnectionID: TypeAlias = Uint32 +type FluidBoxLinkedConnectionID = Uint32 -FluidID: TypeAlias = String +type FluidID = String @dataclass @@ -1648,7 +1648,7 @@ class FluidProductPrototype: show_details_in_recipe_tooltip: Boolean | None = None -FuelCategoryID: TypeAlias = String +type FuelCategoryID = String @dataclass @@ -1733,13 +1733,13 @@ class GroupAttackTipTrigger: count: Uint32 | None = None -ItemCountType: TypeAlias = Uint32 +type ItemCountType = Uint32 -ItemGroupID: TypeAlias = String +type ItemGroupID = String -ItemID: TypeAlias = String +type ItemID = String @dataclass @@ -1765,10 +1765,10 @@ class ItemProductPrototype: percent_spoiled: Float | None = None -ItemStackIndex: TypeAlias = Uint16 +type ItemStackIndex = Uint16 -ItemSubGroupID: TypeAlias = String +type ItemSubGroupID = String @dataclass @@ -1825,10 +1825,10 @@ class LimitChestTipTrigger: count: Uint32 | None = None -LocalisedString: TypeAlias = String | (list["LocalisedString"] | dict[str, Any]) +type LocalisedString = String | list[LocalisedString] | dict[str, Any] -LogisticFilterIndex: TypeAlias = Uint16 +type LogisticFilterIndex = Uint16 @dataclass @@ -1900,7 +1900,7 @@ class MapGenPresetPollutionSettings: pollution_restored_per_tree_damage: Double | None = None -MapGenSize: TypeAlias = ( +type MapGenSize = ( Literal[ "none", "very-low", @@ -1929,16 +1929,16 @@ class MapPosition1: y: Double -MapPosition: TypeAlias = MapPosition1 | list[Double] +type MapPosition = MapPosition1 | list[Double] -MapTick: TypeAlias = Uint64 +type MapTick = Uint64 -MaterialAmountType: TypeAlias = Double +type MaterialAmountType = Double -MathExpression: TypeAlias = String +type MathExpression = String @dataclass @@ -1953,7 +1953,7 @@ class MineItemByRobotTipTrigger: count: Uint32 | None = None -ModuleCategoryID: TypeAlias = String +type ModuleCategoryID = String @dataclass @@ -1963,10 +1963,10 @@ class ModuleTransferTipTrigger: count: Uint32 | None = None -MouseCursorID: TypeAlias = String +type MouseCursorID = String -NeighbourConnectableConnectionCategory: TypeAlias = String +type NeighbourConnectableConnectionCategory = String @dataclass @@ -1984,7 +1984,7 @@ class NeighbourConnectableConnectionDefinition: ) = None -NoiseExpression: TypeAlias = String | Boolean | Double +type NoiseExpression = String | Boolean | Double @dataclass @@ -1995,10 +1995,10 @@ class NoiseFunction: local_functions: dict[String, NoiseFunction] | None = None -Order: TypeAlias = String +type Order = String -ParticleID: TypeAlias = String +type ParticleID = String @dataclass @@ -2131,13 +2131,13 @@ class PollutionSettings: enemy_attack_pollution_consumption_modifier: Double -ProbabilityTableItem: TypeAlias = list[Uint8] +type ProbabilityTableItem = list[Uint8] -ProcessionID: TypeAlias = String +type ProcessionID = String -ProcessionLayerInheritanceGroupID: TypeAlias = String +type ProcessionLayerInheritanceGroupID = String @dataclass @@ -2146,7 +2146,7 @@ class ProcessionSet: departure: list[ProcessionID] | dict[str, Any] -ProductPrototype: TypeAlias = ItemProductPrototype | FluidProductPrototype +type ProductPrototype = ItemProductPrototype | FluidProductPrototype @dataclass @@ -2167,7 +2167,7 @@ class PrototypeStrafeSettings: face_target: Boolean | None = None -QualityID: TypeAlias = String +type QualityID = String @dataclass @@ -2191,19 +2191,19 @@ class RailSignalColorToFrameIndex: yellow: Uint8 | None = None -RandomRange: TypeAlias = list[Uint8] | Uint8 +type RandomRange = list[Uint8] | Uint8 -RangedValue: TypeAlias = list[Float] | Float +type RangedValue = list[Float] | Float -RealOrientation: TypeAlias = Float +type RealOrientation = Float -RecipeCategoryID: TypeAlias = String +type RecipeCategoryID = String -RecipeID: TypeAlias = String +type RecipeID = String @dataclass @@ -2214,7 +2214,7 @@ class RecipeTints: quaternary: Color | None = None -ResearchIngredient: TypeAlias = list[ItemID | Uint16] +type ResearchIngredient = list[ItemID | Uint16] @dataclass @@ -2230,7 +2230,7 @@ class Resistance: percent: Float | None = None -ResourceCategoryID: TypeAlias = String +type ResourceCategoryID = String @dataclass @@ -2292,7 +2292,7 @@ class SimpleBoundingBox1: right_bottom: MapPosition -SimpleBoundingBox: TypeAlias = SimpleBoundingBox1 | list[MapPosition] +type SimpleBoundingBox = SimpleBoundingBox1 | list[MapPosition] @dataclass @@ -2309,7 +2309,7 @@ class SpaceConnectionAsteroidSpawnPoint: angle_when_stopped: Float | None = None -SpaceConnectionID: TypeAlias = String +type SpaceConnectionID = String @dataclass @@ -2321,7 +2321,7 @@ class SpaceLocationAsteroidSpawnDefinition: type: Type8 | None = None -SpaceLocationID: TypeAlias = String +type SpaceLocationID = String @dataclass @@ -2355,10 +2355,10 @@ class SpawnPoint1: spawn_weight: Double -SpawnPoint: TypeAlias = SpawnPoint1 | list[Double] +type SpawnPoint = SpawnPoint1 | list[Double] -SpriteSizeType: TypeAlias = Int16 +type SpriteSizeType = Int16 @dataclass @@ -2403,13 +2403,13 @@ class Stripe: y: Uint32 | None = None -SurfaceID: TypeAlias = String +type SurfaceID = String -SurfacePropertyID: TypeAlias = String +type SurfacePropertyID = String -TechnologyID: TypeAlias = String +type TechnologyID = String @dataclass @@ -2435,7 +2435,7 @@ class ThrusterPerformancePoint1: effectivity: Double -ThrusterPerformancePoint: TypeAlias = ThrusterPerformancePoint1 | list[Double] +type ThrusterPerformancePoint = ThrusterPerformancePoint1 | list[Double] @dataclass @@ -2452,10 +2452,10 @@ class TileBuildabilityRule: remove_on_collision: Boolean | None = None -TileEffectDefinitionID: TypeAlias = String +type TileEffectDefinitionID = String -TileID: TypeAlias = String +type TileID = String @dataclass @@ -2488,7 +2488,7 @@ class TilePosition1: y: Int32 -TilePosition: TypeAlias = TilePosition1 | list[Int32] +type TilePosition = TilePosition1 | list[Int32] @dataclass @@ -2620,10 +2620,10 @@ class TransitionApplication: rotation: Boolean | None = None -TriggerTargetMask: TypeAlias = list[String] | dict[str, Any] +type TriggerTargetMask = list[String] | dict[str, Any] -TrivialSmokeID: TypeAlias = String +type TrivialSmokeID = String @dataclass @@ -2675,7 +2675,7 @@ class UnitSpawnDefinition1: spawn_points: list[SpawnPoint] | dict[str, Any] -UnitSpawnDefinition: TypeAlias = ( +type UnitSpawnDefinition = ( UnitSpawnDefinition1 | list[EntityID | list[SpawnPoint] | dict[str, Any]] ) @@ -2705,7 +2705,7 @@ class UseRailPlannerTipTrigger: count: Uint32 | None = None -VariableAmbientSoundLayerSample: TypeAlias = list[String | Uint32] +type VariableAmbientSoundLayerSample = list[String | Uint32] @dataclass @@ -2727,7 +2727,7 @@ class Vector1: y: Double -Vector: TypeAlias = Vector1 | list[Double] +type Vector = Vector1 | list[Double] @dataclass @@ -2737,7 +2737,7 @@ class Vector3D1: z: Float -Vector3D: TypeAlias = Vector3D1 | list[Float] +type Vector3D = Vector3D1 | list[Float] @dataclass @@ -2748,7 +2748,7 @@ class Vector4f1: w: Float -Vector4f: TypeAlias = Vector4f1 | list[Float] +type Vector4f = Vector4f1 | list[Float] @dataclass @@ -2789,7 +2789,7 @@ class VerticalFlowStyleSpecification: vertical_spacing: Int32 | None = None -VirtualSignalID: TypeAlias = String +type VirtualSignalID = String @dataclass @@ -2809,7 +2809,7 @@ class VoidEnergySource: render_no_network_icon: Boolean | None = None -Weight: TypeAlias = Double +type Weight = Double @dataclass @@ -3091,7 +3091,7 @@ class Animation4Way1: north_west: Animation | None = None -Animation4Way: TypeAlias = Animation4Way1 | Animation +type Animation4Way = Animation4Way1 | Animation @dataclass @@ -3155,7 +3155,7 @@ class AnimationVariations1: sheets: list[AnimationSheet] | dict[str, Any] | None = None -AnimationVariations: TypeAlias = ( +type AnimationVariations = ( AnimationVariations1 | Animation | list[Animation] | dict[str, Any] ) @@ -3198,7 +3198,7 @@ class BoundingBox1: orientation: RealOrientation | None = None -BoundingBox: TypeAlias = ( +type BoundingBox = ( BoundingBox1 | list[MapPosition] | list[MapPosition | RealOrientation] @@ -3298,7 +3298,7 @@ class CircularParticleCreationSpecification: use_source_position: Boolean | None = None -CircularProjectileCreationSpecification: TypeAlias = ( +type CircularProjectileCreationSpecification = ( list[list[RealOrientation | Vector]] | dict[str, Any] ) @@ -3313,7 +3313,7 @@ class CliffPlacementSettings: richness: Float | None = None -ColorLookupTable: TypeAlias = FileName | Literal["identity"] +type ColorLookupTable = FileName | Literal["identity"] @dataclass @@ -3405,12 +3405,12 @@ class DamageTypeFilters1: whitelist: Boolean | None = None -DamageTypeFilters: TypeAlias = ( +type DamageTypeFilters = ( DamageTypeFilters1 | DamageTypeID | list[DamageTypeID] | dict[str, Any] ) -DaytimeColorLookupTable: TypeAlias = ( +type DaytimeColorLookupTable = ( list[list[Double | ColorLookupTable]] | dict[str, Any] ) @@ -3512,7 +3512,7 @@ class EntityIDFilter1: comparator: ComparatorString | None = None -EntityIDFilter: TypeAlias = EntityIDFilter1 | EntityID +type EntityIDFilter = EntityIDFilter1 | EntityID @dataclass @@ -3521,7 +3521,7 @@ class ExplosionDefinition1: offset: Vector | None = None -ExplosionDefinition: TypeAlias = EntityID | ExplosionDefinition1 +type ExplosionDefinition = EntityID | ExplosionDefinition1 @dataclass @@ -3693,9 +3693,7 @@ class IconSequencePositioning: multi_row_initial_height_modifier: Float | None = None -IngredientPrototype: TypeAlias = ( - ItemIngredientPrototype | FluidIngredientPrototype -) +type IngredientPrototype = ItemIngredientPrototype | FluidIngredientPrototype @dataclass @@ -3752,7 +3750,7 @@ class ItemIDFilter1: comparator: ComparatorString | None = None -ItemIDFilter: TypeAlias = ItemIDFilter1 | ItemID +type ItemIDFilter = ItemIDFilter1 | ItemID @dataclass @@ -3966,7 +3964,7 @@ class PodOpacityProcessionLayer: frames: list[Frame4] | dict[str, Any] -ProbabilityTable: TypeAlias = list[ProbabilityTableItem] | dict[str, Any] +type ProbabilityTable = list[ProbabilityTableItem] | dict[str, Any] @dataclass @@ -4110,10 +4108,10 @@ class RotatedAnimation8Way1: north_west: RotatedAnimation | None = None -RotatedAnimation8Way: TypeAlias = RotatedAnimation8Way1 | RotatedAnimation +type RotatedAnimation8Way = RotatedAnimation8Way1 | RotatedAnimation -RotatedAnimationVariations: TypeAlias = ( +type RotatedAnimationVariations = ( RotatedAnimation | list[RotatedAnimation] | dict[str, Any] ) @@ -4307,7 +4305,7 @@ class SoundDefinition1: ) -SoundDefinition: TypeAlias = SoundDefinition1 | FileName +type SoundDefinition = SoundDefinition1 | FileName @dataclass @@ -4317,7 +4315,7 @@ class SpaceConnectionAsteroidSpawnDefinition1: type: Type8 | None = None -SpaceConnectionAsteroidSpawnDefinition: TypeAlias = ( +type SpaceConnectionAsteroidSpawnDefinition = ( SpaceConnectionAsteroidSpawnDefinition1 | list[EntityID | list[SpaceConnectionAsteroidSpawnPoint] | dict[str, Any]] ) @@ -4466,7 +4464,7 @@ class SpriteVariations1: sheet: SpriteSheet -SpriteVariations: TypeAlias = ( +type SpriteVariations = ( SpriteVariations1 | SpriteSheet | list[Sprite] | dict[str, Any] ) @@ -4780,7 +4778,7 @@ class TurretSpecialEffectCenter1: north_west: Vector | None = None -TurretSpecialEffectCenter: TypeAlias = TurretSpecialEffectCenter1 | Vector +type TurretSpecialEffectCenter = TurretSpecialEffectCenter1 | Vector @dataclass @@ -7773,7 +7771,7 @@ class ElementImageSetLayer1: left_outer_border_shift: Int32 | None = None -ElementImageSetLayer: TypeAlias = ElementImageSetLayer1 | Sprite +type ElementImageSetLayer = ElementImageSetLayer1 | Sprite @dataclass @@ -7835,7 +7833,7 @@ class FootstepTriggerEffectItem: use_as_default: Boolean | None = None -FootstepTriggerEffectList: TypeAlias = ( +type FootstepTriggerEffectList = ( list[FootstepTriggerEffectItem] | dict[str, Any] ) @@ -7970,12 +7968,10 @@ class LayeredSprite1: dice_y: SpriteSizeType | None = None -LayeredSprite: TypeAlias = LayeredSprite1 | ( - list["LayeredSprite"] | dict[str, Any] -) +type LayeredSprite = LayeredSprite1 | list[LayeredSprite] | dict[str, Any] -LayeredSpriteVariations: TypeAlias = list[LayeredSprite] | dict[str, Any] +type LayeredSpriteVariations = list[LayeredSprite] | dict[str, Any] @dataclass @@ -8014,7 +8010,7 @@ class LightDefinitionItem: minimum_darkness: Float | None = None -LightDefinition: TypeAlias = ( +type LightDefinition = ( LightDefinition1 | list[LightDefinitionItem] | dict[str, Any] ) @@ -8122,7 +8118,7 @@ class MapGenSettings: territory_settings: TerritorySettings | None = None -Modifier: TypeAlias = ( +type Modifier = ( InserterStackSizeBonusModifier | BulkInserterCapacityBonusModifier | LaboratorySpeedModifier @@ -8457,7 +8453,7 @@ class Sound1: ) -Sound: TypeAlias = ( +type Sound = ( Sound1 | SoundDefinition | list[SoundDefinition] | dict[str, Any] | String ) @@ -8550,7 +8546,7 @@ class Sprite4Way1: west: Sprite | None = None -Sprite4Way: TypeAlias = Sprite4Way1 | Sprite +type Sprite4Way = Sprite4Way1 | Sprite @dataclass @@ -8607,7 +8603,7 @@ class SurfaceRenderParameters: space_dust_foreground: SpaceDustEffectProperties | None = None -TechnologyTrigger: TypeAlias = ( +type TechnologyTrigger = ( MineEntityTechnologyTrigger | CraftItemTechnologyTrigger | CraftFluidTechnologyTrigger @@ -8833,7 +8829,7 @@ class WorldAmbientSoundDefinition1: average_pause_seconds: Double | None = None -WorldAmbientSoundDefinition: TypeAlias = WorldAmbientSoundDefinition1 | Sound +type WorldAmbientSoundDefinition = WorldAmbientSoundDefinition1 | Sound @dataclass @@ -9928,7 +9924,7 @@ class ElementImageSet1: glow: ElementImageSetLayer | None = None -ElementImageSet: TypeAlias = ElementImageSet1 | ElementImageSetLayer +type ElementImageSet = ElementImageSet1 | ElementImageSetLayer @dataclass @@ -10228,7 +10224,7 @@ class LayeredSound1: layers: list[Sound] | dict[str, Any] -LayeredSound: TypeAlias = LayeredSound1 | Sound +type LayeredSound = LayeredSound1 | Sound @dataclass @@ -10348,7 +10344,7 @@ class PersistentWorldAmbientSoundDefinition1: sound: Sound -PersistentWorldAmbientSoundDefinition: TypeAlias = ( +type PersistentWorldAmbientSoundDefinition = ( PersistentWorldAmbientSoundDefinition1 | Sound ) @@ -10453,12 +10449,12 @@ class ProcessionAudioEvent: loop_id: Uint32 | None = None -ProcessionGraphicCatalogue: TypeAlias = ( +type ProcessionGraphicCatalogue = ( list[ProcessionGraphicCatalogueItem] | dict[str, Any] ) -ProcessionLayer: TypeAlias = ( +type ProcessionLayer = ( PodDistanceTraveledProcessionLayer | PodMovementProcessionLayer | PodOpacityProcessionLayer @@ -10656,7 +10652,7 @@ class SemiPersistentWorldAmbientSoundDefinition1: delay_variance_seconds: Float | None = None -SemiPersistentWorldAmbientSoundDefinition: TypeAlias = ( +type SemiPersistentWorldAmbientSoundDefinition = ( SemiPersistentWorldAmbientSoundDefinition1 | Sound ) @@ -10975,7 +10971,7 @@ class WorkingSound1: ) -WorkingSound: TypeAlias = WorkingSound1 | Sound +type WorkingSound = WorkingSound1 | Sound @dataclass @@ -11393,7 +11389,7 @@ class DoubleSliderStyleSpecification: high_button: ButtonStyleSpecification | None = None -EnergySource: TypeAlias = ( +type EnergySource = ( ElectricEnergySource | BurnerEnergySource | HeatEnergySource @@ -11475,7 +11471,7 @@ class PersistentWorldAmbientSoundsDefinition: ) = None -ProcessionAudioCatalogue: TypeAlias = ( +type ProcessionAudioCatalogue = ( list[ProcessionAudioCatalogueItem] | dict[str, Any] ) @@ -11950,7 +11946,7 @@ class DropDownStyleSpecification: opened_sound: Sound | None = None -StyleSpecification: TypeAlias = ( +type StyleSpecification = ( ActivityBarStyleSpecification | ButtonStyleSpecification | CameraStyleSpecification @@ -12393,11 +12389,9 @@ class ArtilleryTriggerDelivery: trigger_fired_artillery: Boolean | None = None -AttackParameters: TypeAlias = Union[ - "ProjectileAttackParameters", - "BeamAttackParameters", - "StreamAttackParameters", -] +type AttackParameters = ( + ProjectileAttackParameters | BeamAttackParameters | StreamAttackParameters +) @dataclass @@ -12454,13 +12448,13 @@ class BeamTriggerDelivery: destroy_with_source_or_target: Boolean | None = None -CapsuleAction: TypeAlias = Union[ - "ThrowCapsuleAction", - ActivateEquipmentCapsuleAction, - "UseOnSelfCapsuleAction", - "DestroyCliffsCapsuleAction", - ArtilleryRemoteCapsuleAction, -] +type CapsuleAction = ( + ThrowCapsuleAction + | ActivateEquipmentCapsuleAction + | UseOnSelfCapsuleAction + | DestroyCliffsCapsuleAction + | ArtilleryRemoteCapsuleAction +) @dataclass @@ -12839,7 +12833,7 @@ class ThrowCapsuleAction: uses_stack: Boolean | None = None -TipTrigger: TypeAlias = ( +type TipTrigger = ( OrTipTrigger | AndTipTrigger | SequenceTipTrigger @@ -12892,7 +12886,7 @@ class ThrowCapsuleAction: ) -Trigger: TypeAlias = ( +type Trigger = ( DirectTriggerItem | AreaTriggerItem | LineTriggerItem @@ -12907,7 +12901,7 @@ class ThrowCapsuleAction: ) -TriggerDelivery: TypeAlias = ( +type TriggerDelivery = ( InstantTriggerDelivery | ProjectileTriggerDelivery | BeamTriggerDelivery @@ -12918,7 +12912,7 @@ class ThrowCapsuleAction: ) -TriggerEffect: TypeAlias = ( +type TriggerEffect = ( DamageEntityTriggerEffectItem | DamageTileTriggerEffectItem | CreateEntityTriggerEffectItem diff --git a/uv.lock b/uv.lock index c7ef783..6ad4fb9 100644 --- a/uv.lock +++ b/uv.lock @@ -666,6 +666,12 @@ wheels = [ ] [package.optional-dependencies] +debug = [ + { name = "pysnooper" }, +] +http = [ + { name = "httpx" }, +] ruff = [ { name = "ruff" }, ] @@ -762,7 +768,7 @@ wheels = [ [[package]] name = "factorio-cycle-calculator" version = "0.0.0.dev0" -source = { virtual = "src/private/app/factorio-cycle-calculator" } +source = { editable = "src/private/app/factorio-cycle-calculator" } dependencies = [ { name = "ortools" }, { name = "pillow" }, @@ -771,7 +777,7 @@ dependencies = [ [package.dev-dependencies] dev = [ - { name = "datamodel-code-generator", extra = ["ruff"] }, + { name = "datamodel-code-generator", extra = ["debug", "http", "ruff"] }, ] [package.metadata] @@ -782,7 +788,7 @@ requires-dist = [ ] [package.metadata.requires-dev] -dev = [{ name = "datamodel-code-generator", extras = ["ruff"], specifier = ">=0.53.0" }] +dev = [{ name = "datamodel-code-generator", extras = ["debug", "ruff", "http"], specifier = ">=0.53.0" }] [[package]] name = "fastavro" @@ -2655,6 +2661,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/e8/56/44be6a681679d82949b0917a09bc0eefd038bbd787dc198d49d85fff8d8f/pyrefly-0.25.0-py3-none-win_arm64.whl", hash = "sha256:b13ca14f5f582ad57a5f959487f498dd1d82b75d7bf2cb0db162a6f67404c6af", size = 6054101, upload-time = "2025-07-21T21:43:29.278Z" }, ] +[[package]] +name = "pysnooper" +version = "1.2.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d2/4a/be3c144f58de6b78911c417cc4a3b3fe5eb6d13cae4c12daf3ca17a8d473/pysnooper-1.2.3.tar.gz", hash = "sha256:1fa1425444a7af45108aaed860b5ca8b62b25bba25b0b037c059ba353d8f1e74", size = 46283, upload-time = "2025-05-31T23:22:46.786Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/69/87/df62c8a998216e6749b67d548dae0967906036c61457510ef49667927c49/PySnooper-1.2.3-py2.py3-none-any.whl", hash = "sha256:546372f0e72da89f8d1b89e758b7c05a478d65288569a1ca2cc1620e7b1b1944", size = 15086, upload-time = "2025-05-31T23:22:45.745Z" }, +] + [[package]] name = "pytest" version = "9.0.0"