Web API

Package Maximizer Web API — Flask-based REST API with API-key authentication.

class package_maximizer.web.app.RateLimiter(max_requests=100, window=60.0)[source]

Bases: object

Fixed-window rate limiter keyed by client identity.

Parameters:
  • max_requests (int)

  • window (float)

__init__(max_requests=100, window=60.0)[source]
Parameters:
  • max_requests (int)

  • window (float)

Return type:

None

is_allowed(key)[source]
Parameters:

key (str)

Return type:

bool

reset(key)[source]
Parameters:

key (str)

Return type:

None

package_maximizer.web.app.validate_maximize_payload(data)[source]

Validate the JSON body for /api/v1/maximize.

Returns (cleaned_pkgs, conflicts, weights) when valid, or raises a ValueError whose message is client-safe.

Parameters:

data (Any)

Return type:

tuple[list[str], list, dict | None]

package_maximizer.web.app.before_request()[source]
package_maximizer.web.app.after_request(response)[source]
package_maximizer.web.app.require_api_key(f)[source]

Simple API key authentication.

package_maximizer.web.app.health()[source]

Health check endpoint.

Return type:

tuple[dict, int]

package_maximizer.web.app.list_solvers()[source]

List all available solvers.

Return type:

tuple[dict, int]

package_maximizer.web.app.list_parsers()[source]

List all available parsers.

Return type:

tuple[dict, int]

package_maximizer.web.app.list_managers()[source]

List all available package managers (parsers).

Return type:

tuple[dict, int]

package_maximizer.web.app.maximize_post()[source]

Maximize packages from JSON body.

Expected JSON body:

{
    "packages": ["pkg1", "pkg2", "pkg3"],
    "manager": "apt",
    "solver": "greedy",
    "conflicts": [["pkg1", "pkg2"]],
    "depends": [["pkg1", "pkg2"]],
    "weights": {"pkg1": 2.0, "pkg2": 1.5},
    "explain": false
}
Return type:

tuple[dict, int]

package_maximizer.web.app.propose_post()[source]

Propose optimal package set with automatic metadata extraction.

Expected JSON body:

{
    "packages": ["requests", "certifi"],
    "manager": "apt",
    "solver": "greedy",
    "explain": false
}
Return type:

tuple[dict, int]

package_maximizer.web.app.maximize_get()[source]

GET /api/maximize?packages=vim,nano&manager=apt&solver=pulp

Return type:

tuple[dict, int]

package_maximizer.web.app.export_post()[source]

Maximize packages and return the result in JSON/CSV/GraphML.

Body is the same as /api/v1/maximize plus an format field (json | csv | graphml).

Return type:

tuple[dict, int] | tuple[str, int] | tuple[str, int, dict[str, str]]

package_maximizer.web.app.benchmark_post()[source]

Run benchmark on specified solvers.

Return type:

tuple[dict, int]

package_maximizer.web.app.cache_stats()[source]

Get cache statistics.

Return type:

tuple[dict, int]

package_maximizer.web.app.cache_clear()[source]

Clear the cache.

Return type:

tuple[dict, int]

package_maximizer.web.app.analyze_post()[source]

Analyze package conflicts and dependencies.

Expected JSON body:

{
    "packages": ["pkg1", "pkg2"],
    "manager": "apt",
    "solver": "greedy",
    "metadata": false,
    "conflicts": [["pkg1", "pkg2"]],
    "depends": [["pkg1", "dep1"]]
}
Return type:

tuple[dict, int]

package_maximizer.web.app.compare_post()[source]

Compare all available solvers on the given package set.

Expected JSON body:

{
    "packages": ["pkg1", "pkg2"],
    "manager": "apt",
    "metadata": false
}
Return type:

tuple[dict, int]

package_maximizer.web.app.not_found(e)[source]
package_maximizer.web.app.method_not_allowed(e)[source]
package_maximizer.web.app.internal_error(e)[source]
package_maximizer.web.app.openapi_spec()[source]

Machine-readable API description (OpenAPI 3.0 subset).

Return type:

tuple[dict, int]

package_maximizer.web.app.api_docs()[source]

Minimal human-readable API documentation page.

Return type:

tuple[str, int]

package_maximizer.web.app.run_app(host='127.0.0.1', port=5000, debug=False)[source]

Run the Flask application.

Parameters:
  • host (str)

  • port (int)

  • debug (bool)

Return type:

None

package_maximizer.web.app.run(host='127.0.0.1', port=5000, debug=False)

Run the Flask application.

Parameters:
  • host (str)

  • port (int)

  • debug (bool)

Return type:

None