Changelogs >


PyUp actively tracks 437,546 Python packages for vulnerabilities to keep your Python environments secure.

Scan your dependencies


* Updated `factorio-data` to version `1.1.65`
* Fixed 38 and 39


* Updated `factorio-data` to version `1.1.61`
* Added a `Vector` class to represent 2d positions, and changed most of the code to reflect this change
* This is a breaking change, but it should be much more natural to access positions by attribute `x` and `y` instead of `["x"]` and `["y"]`
* By specifying a class like this, custom operators are allowed such as vector math, which means that offsetting positions and other operations have become much easier as a result
* `Vector` has a static member function `from_other()` that constructs a `Vector` object from all valid formats accepted in the past (`tuple`, `dict`, `list`, etc.) which is used in all standard functions, so you shouldn't have to change any of their signatures
* `Vector` also has a `to_dict()` method to turn it back into it's dictionary format for exporting (`{"x": ..., "y": ...}`)
* The `Vector` class is only used on the "outermost" layer due to performance reasons, internally the most common representation is still `list[float, float]`
* Added an abstract `Shape` class, along with two implementations: `AABB` and `Rectangle`
* `AABB` and `Rectangle` are now used for issuing `OverlappingObjectWarning`
* All functions that used to use `Sequences` or `list[list[float], list[float]]` have been changed to `Vector` and `AABB` respectively for user clarity
* Added another class: `CollisionSet`, which is a list of `Shapes` used for checking if two `Entity`s intersect one another
* This was needed because curved rails have 2 collision boxes instead of a single one
* Collision sets also support rotations, which means that rotations are automatically generated or specified manually for edge cases like rails
* In essence, `CollisionSets` provide more flexibility for entity footprints on a per-entity-type (or even per-entity) level
* Added `find_entity_at_position()` so you can simply check for any entity in particular at a position instead of having to use fully-blown `find_entities_filtered` or the more-specific `find_entity()` function
* Abstracted `SpatialHashMap` to be an implementation of abstract class `SpatialDataStructure`, which will allow for different implementations such as quadtrees or other algorithms if they happen to be more performant than hash-mapping (For now all `Collections` still use `SpatialHashMap` though)
* Renamed `entity_hashmap` and `tile_hashmap` to more generic `entity_map` and `tile_map` to reflect the above change
* Move almost all entity insert/set/remove logic to `EntityCollection.on_entity_insert`, `on_entity_set`, and `on_entity_remove`, which gets called from `EntityList.insert` and related
* Added `on_tile_insert`, `on_tile_set`, and `on_tile_remove` to `TileCollection` to mirror the changes to `EntityCollection`
* Added `copy` keyword to `TileList.insert` and `TileList.append` to mirror `EntityList.insert` and `EntityList.append`
* Added Entity/Tile merging
* Added `merge` keyword to both `EntityList.insert/append` and `TileList.insert/append`
* Attempting to use `merge=True` keywords and `copy=False` will result in a `ValueError`, as this behavior is loosely defined (for now at least)
* Rails now properly issue `OverlappingObjectsWarnings`; Rails can overlap each other provided they don't have the exact same position + direction + type
* Another big documentation pass
* Split the `signatures.CONTROL_BEHAVIOR` into many sub implementations, which should improve both safety and (hopefully) performance
* Fixed 24, 25, 27, 32, 33, and 34


* Merged louga31's pull request
* Rewrite of the `_shift_key_indices` in `EntityList` to make it faster using list comprehension
* Merged elswindle's pull request
* Moved conversion of associations from `Blueprint.load_from_string` to `Blueprint.setup` so they always take place
* Fixed `UndergroundBelt` `io_type` attribute not reading correctly from key `type`
* Changed test case to account for this
* Added `DirectionalMixin` to `AssemblingMachine` (as technically it can have it in select circumstances)
* Fixed load conflict between `items` and `recipe` in `AssemblingMachine` (23)
* Fixed `` so that it properly requires `typing_extensions` on versions of Python prior to 3.8 (30)
* Fixed importing `Literal` so that it follows the above change (30)
* Fixed an issue where `BlueprintBook` icons were not properly set and issued an incorrect warning (31)


* Merged sposker's pull request
* Fixed an bug where `IndexError` would be triggered on setting the final item filter slot
* Updated `signatures.CONTROL_BEHAVIOR` to include the `send_to_train` key
* Merged elswindle's pull request
* Dictionary Blueprints and BlueprintBook's are now properly converted to `Blueprint` and `BlueprintBook` objects when added to a `BlueprintableList`
* Fixed documentation for `FilterMixin.set_item_filters` that labeled `"name"` key as `"signal"`
* Made docs for `FilterMixin.set_item_filters` and `FilterMixin.set_item_filter` more clear
* Changed `signals.raw` to actually be the extraction from `data.raw` so people can query the order strings and other information (17)
* Sorted `signals.raw` according to signal-processing order (virtual -> fluid -> item) instead of item sort order (17)
* Added `signals.type_of` as a more specific structure to fulfill the old functionality of `signals.raw` (17)
* Changed the functionality of `ConstantCombinator` so that attempting to set one of it's signals to a pure virtual signal results in a `DraftsmanWarning` (because for some grotesque reason Factorio actually allows this)
* Renamed `InvalidConnectionError` to more general `InvalidAssociationError` and updated documentation
* Removed requirement for `Groups` to have an ID associated with it (this was required in the past, but is no longer necessary)
* Fixed unable to find connectable entities when calling `Blueprint.generate_power_connections()` on blueprint that contained `Groups` (19)
* Added the capability to specify connections based on entity reference as well instead of just ID or index (`[add/remove]_power_connection`, `[add/remove]_circuit_connection`) (19)
* Made these functions issue `InvalidAssociationError` when attempting to connect two entities that lie outside of the `EntityCollection`
* Added recursive `__contains__` function to `EntityList` to facilitate the above
* Fixed copying of entities between `Blueprints` and `Groups` (20)
* Added capability to deepcopy `Entities`, `Groups`, and `Blueprints`, with appropriate errors
* Added capability to set the `entities` of a `Blueprint` or `Group` to another `Blueprints` or `Groups` `entities` (16)
* Added optional `string` keyword for the constructor of `Group` so you can import a blueprint string directly into a group instead of having to create a "scratch" `Blueprint`


* Added `keywords` to ``
* Added `__contains__` function to `Blueprint` (I thought it was inferred from `__getitem__`, whoops) (14)
* Added `defines.lua` as a more comprehensive solution to the Factorio `defines` issue (15)
* Added distinguishing between multiple versions of the same mod; the latest mod is always preferred, with warnings for duplicates issued (15)
* Started work on `RailPlanner`
* Other minor documentation changes
* Fixed the old repo link in ``
* Fixed 13:
* Implemented the functionality according to the game, preserving Factorio safety
* Added the new list `pure_virtual` signals to `` for ease of access/iteration
* Updated documentation to reflect these changes
* Moved initialization of `Blueprint.area` attribute before loading entities in `Blueprint.setup()` (14)


* Added the capability to display any logged messages to during `draftsman-update` with the command line argument `-l` or `--log`
* Added `` to prepare releases more automatically so I don't miss steps like a fool (maybe I'll integrate something like poetry in the future)
* Updated `` to create the `factorio-mods` folder if it doesn't exist, in case the user accidentally deleted it
* Updated `` so that everything is now sorted (mostly) properly
* Updated readme to point to related Alt-F4 article
* Updated `requirements.txt` to include `build` for development
* Changed the manner in which sort items are searched in `` (related to issue 9)
* Changed the manner in which the order of items are determined so there's less redundancy
* Changed `normalize_module_name` from non-digit characters to alphanumeric characters (duh!) (11)
* Changed `normalize_module_name` to distinguish between "slash" paths and "dot" paths and only convert "dot" paths if found (11)
* Added more duct tape to the local file requiring issue machine (11)
* Removed `` from GitHub distribution, it was only really intended as scrap paper for me
* Fixed 10
* Fixed 12


* Fixed 9


* Added `signals` attribute to `ConstantCombinator`, which aliases `control_behavior["filters"]`
* (Re)Added circuit attributes back to `ArithmeticCombinator` and `DeciderCombinator`
* Minor docs fixes
* Bugfix: resolved 6
* Bugfix: resolved 8 (At least for now, current behavior should be more predictable)
* Also cleaned and documented the `update` process in `` to make it a little clearer exactly what's going on, and trimmed the fat


* Updated `factorio-data` to `1.1.58`
* Added description of `control_behavior` attribute structure to `docs/source` folder
* Added read-only `global_position` property to `SpatialLike`; allows for efficient querying of an objects root-most position
* Added `SpatialHashMap.get_all`
* Added `utils.flatten_entities` since it's used in a number of places
* Added a `ItemCapacityWarning`, issued when `*Container` objects request items that exceed their inventory size
* Added `entities.flippable` to hold whether or not each entity can be flipped or not (tentative, still WIP)
* Integrated `entities.flippable` into `Entity` class, as well as `Transformable`
* Updated `tox.ini` to use `--no-mods` on `draftsman-update`
* Reworked `SpatialHashMap` and `get_area` to use `global_position` instead of `position`
* Reworked `RequestItemsMixin` and added it to more prototypes
* Split `ModuleSlotsMixin` from `RequestItemsMixin` to compartmentalize more
* Adding science pack item requests to a `Lab` no longer raises a warning (works with any lab)
* Made `set_x_filter` code more consistent across different prototype filter types
* Added folder loading to `draftsman-update`
* Documentation format fixes/additions
* Bugfix: Fixed the local paths that now point from `factorio-draftsman` instead of `factorio-draftsman/draftsman` in `draftsman-update` for folders
* Bugfix: Changed Lua file requiring so that it makes (somewhat) more sense; Honestly the whole thing is pretty fricking scuffed, and needs a redo
* Bugfix: Fixed `OverlappingObjectsWarning` occurring when placing two groups with the same local coordinates but different global coordinates in an `EntityCollection`
* Bugfix: Fixed Maximum recursion depth errors when running `examples/` with large modpacks with many items; this should no longer occur period
* Bugfix: Split `index_dict` in `env.extract_items` to `group_index_dict` and `subgroup_index_dict`
* Bugfix: Encapsulated `order` swapping in `env.get_order` with a `try except` block


* Officially added to PyPI (in beta state for the foreseeable future)


* Finished first pass of documentation
* Added ``, which tests against prior versions of Factorio
* Draftsman is validated to work with versions of Factorio >= 1.0.0
* Added `Association`, which is a loose wrapper around `weakref` and takes care of the association problem
* Added docs for `Association`
* Added `--no-mods` flag to `draftsman-update` that just loads the base mod (why didn't I do this before)


* Added a *whole lot* of documentation, or a first pass at least
* Updated the quick-start with updated information
* Setup a GitHub workflow to automatically upload code coverage for the badge
* Split the `ModeOfOperation` enumeration into `InserterModeOfOperation` and `LogisticModeOfOperation`
* Going to attempt to get Docs integration and passing
* Fixed ``draftsman-update`` greedy module name regex


* First public release!
* Added `Groups`(!)
* Added the `` example to illustrate `Group`s and `` for `RailPlanner` (`RailPlanner` is not implemented yet)
* Added `` example
* Lots of cleaning and formatting, though there's still many cases to analyze
* Added support for command line arguments with `draftsman-update` (currently only `--verbose`)
* updated `requirements.txt`
* Build system appears to be working as desired


* Backported to Python 2.7; tested via `tox` that it works with latest version of Python 2 and 3
* (Should work with every version between, but I'm too lazy to test right now)
* Got everything prepared (I think) for building and ultimately distribution
* Fixed `` so that it should work with all versions greater than 2.7 (as well as requirements.txt)
* Added entry-point `draftsman-update` that must be called after installation to initialize the module
* Lots of general folder restructuring (mainly moving everything needed into the module folder)
* Renamed `` to ``
* Formatted everything using `black`
* Updated readme
* Updated examples
* Removed some redundant files

* Split all of the mixins into their own files, as well as Entity, EntityLike, Group, etc.
* Added the `SpatialHashMap` structure for Blueprints to speed up `find_entities` and `find_tiles`
* Added lots of utility functions related to `SpatialHashMap`
* Changed Blueprint `entities` and `tiles` to `KeyList` instead of `list`
* Added Blueprint warnings

* Changed ALL of the setters to use properties because I didn't know Python properties _existed_
* Revised test cases to match this revelation


* Unified all of the data into pickles instead of generating source files
- (Still need to figure out module init)
* Updated `.gitignore` to avoid committing previously mentioned pickle files
* Added `` for warning specification
* Added lots of warnings and their messages
* Renamed `` to `` to match the new ``
* Renamed all Errors to have the 'Error' suffix, renamed a few
* Added `DraftsmanError` and `DraftsmanWarning` so you can catch any specific error or warning with them
* Made the testing suite compatible (or, at least *more* compatible) with mods
* Added LogisticActiveContainer and LogisticPassiveContainer to complete the logistic suite
(I think its clearer this way rather than treating them as containers)
* Hundreds of other small changes


* Finally finished entity testing (for now, reworks are coming)
* Split all of the entity definitions into their own file (much clearer)
* Added `` example
* Updated all other examples
* Changed data loading for items and entities to use pickle instead of writing
source files (the rest need to be done like this I think)


* Renamed the package from "factoriotools" to the more succinct and pythonic "draftsman"
* General folder structure rework for both the package itself as well as testing
* Started the behemoth that is going to be Entity and Blueprint testing suites
* Added `.coveragerc` for coverage configuration
* Added this changelog


* Initial version