Skip to content

chore(license): standardize LICENSE files to use http URLs and enforce in tooling - #3205

Merged
gspencergoog merged 2 commits into
a2ui-project:mainfrom
gspencergoog:fix/license-consistency
Oct 14, 2026
Merged

gspencergoog merged 2 commits into
a2ui-project:mainfrom
gspencergoog:fix/license-consistency

Conversation

@gspencergoog

@gspencergoog gspencergoog commented Oct 14, 2026 •

Copy link
Copy Markdown
Collaborator

Summary

Standardizes Apache 2.0 URLs across all repository LICENSE files to http:// while preserving https:// Apache URLs in source file headers. Updates scripts/fix_licenses.py to enforce http:// across all tracked LICENSE files and adds corresponding unit test coverage in scripts/test_fix_licenses.py.

This is for consistency, and because pana and other license tools don't recognize the license as an Apache license if it's not identical.

Background & Rationale

  • Package managers and tooling like pub.dev's pana analyzer match the Apache 2.0 license against the canonical SPDX template, which specifies http://www.apache.org/licenses/ and http://www.apache.org/licenses/LICENSE-2.0 (as previously identified in a2ui_core and a2ui_agent lose 30 and 20 pub points to packaging, not code #2957 and addressed for a2ui_core and a2ui_agent in chore(dart): let pub.dev recognize the license of a2ui_core and a2ui_agent #2958).
  • When https:// is used in a package LICENSE file, pana fails to identify the license and treats it as unknown.
  • The root LICENSE covers the entire repository (including eval/bin/transcrypt, which requires the appended MIT license notice), whereas individual packages (dart/a2ui_cli, dart/a2ui_core, dart/a2ui_agent) should not include the Transcrypt MIT notice since they do not bundle that script.

Changes

  • Root LICENSE: Converted Apache license URLs on lines 4 and 196 to http://. Retained the eval/bin/transcrypt MIT license notice at the bottom.
  • dart/a2ui_cli/LICENSE: Converted Apache license URLs to http:// and removed the Transcrypt MIT notice to match dart/a2ui_core/LICENSE and dart/a2ui_agent/LICENSE.
  • scripts/fix_licenses.py:
    • Updated license checking to inspect all tracked files named LICENSE.
    • In --check mode, reports an error if any tracked LICENSE file contains https://www.apache.org/licenses.
    • In fix mode, automatically replaces https:// with http:// in all tracked LICENSE files.
    • Continues to enforce https:// Apache URLs and copyright year 2024 for Google LLC across source code headers.
  • scripts/test_fix_licenses.py:
    • Updated test_process_files_check_mode_errors to assert https:// in LICENSE produces a check-mode error.
    • Added test_process_files_license_http_enforcement to verify http:// root and nested LICENSE files pass check mode, https:// in nested LICENSE files is detected, and fix mode converts them to http://.

Testing

  • Unit tests: python3 -m unittest scripts.test_fix_licenses (20/20 tests passed).
  • License validation: ./scripts/fix_licenses.py --check (passed with 0 errors).
  • Format check: ./scripts/fix_format.sh --check (Prettier, Pyink, and Dart format checks passed).

…e in tooling

- Update root LICENSE to use http:// URLs for Apache 2.0 license text while retaining the transcrypt MIT license notice.
- Update dart/a2ui_cli/LICENSE to use http:// URLs and remove the transcrypt MIT notice to align with dart/a2ui_core and dart/a2ui_agent.
- Update scripts/fix_licenses.py to enforce http:// Apache URLs across all tracked LICENSE files while preserving https:// enforcement on source file headers.
- Update scripts/test_fix_licenses.py unit tests to verify http:// enforcement on root and nested LICENSE files.
gemini-code-assist[bot]

This comment was marked as resolved.

…fix_licenses

Update should_ignore to accept an optional patterns parameter, and filter
out 'LICENSE' from IGNORE_PATTERNS when selecting LICENSE files so that
LICENSE files inside ignored directories (such as third_party/) are not
modified or flagged.
@gspencergoog
gspencergoog marked this pull request as ready for review October 14, 2026 17:17
@gspencergoog
gspencergoog requested review from jacobsimionato and polina-c and removed request for jacobsimionato October 14, 2026 17:18
@gspencergoog
gspencergoog merged commit 03f95ba into a2ui-project:main Oct 14, 2026
39 checks passed
@github-project-automation github-project-automation Bot moved this from Todo to Done in A2UI Oct 14, 2026
andrewkolos added a commit that referenced this pull request Oct 14, 2026
#3205 standardized LICENSE files on http://www.apache.org/licenses/ and
made the license check enforce it. a2ui_flutter's LICENSE, added in
#3084, used https, so the static-checks job fails on main.

⚠️ Agent-generated
nan-yu pushed a commit that referenced this pull request Oct 14, 2026
* fix(a2ui_flutter): adopt a2ui_core's renderer renames

#3194 renamed A2uiClientAction and A2uiClientError to A2uiRendererAction
and A2uiRendererError, MessageProcessor.groupModel to model and
getClientDataModel to getRendererDataModel, and replaced
EventSource.addListener with subscribe. The adapter's tests and README
still used the old names, so the package's tests no longer compiled on
main.

⚠️ Agent-generated

* fix(a2ui_flutter): use the http Apache license URL

#3205 standardized LICENSE files on http://www.apache.org/licenses/ and
made the license check enforce it. a2ui_flutter's LICENSE, added in
#3084, used https, so the static-checks job fails on main.

⚠️ Agent-generated
andrewkolos added a commit that referenced this pull request Oct 15, 2026
* feat(a2ui_flutter): add the framework adapter core

A2uiSurface renders a SurfaceModel through a NodeResolver, and NodeView
renders each ComponentNode through its catalog entry, rebuilding when the
node's props change. ComponentImplementation pairs a component schema with
a widget builder, WidgetCatalog is a catalog of them, and ComponentProps
reads a node's resolved properties, bindings and actions. A component
that has not arrived shows a small progress indicator.

* feat(a2ui_core): expose the v0.9 basic catalog's API

BasicCatalog.v0_9Api() returns the published v0.9 basic catalog document
parsed with Catalog.fromJson: its components, function signatures and theme
schema, so a framework adapter can read the component schemas without
embedding its own copy of the document.

* feat(a2ui_flutter): add the v0.9 basic catalog

package:a2ui_flutter/basic_catalog.dart implements the 18 components of the
v0.9 basic catalog with Material widgets, with their schemas from
a2ui_core's BasicCatalog.v0_9Api() and the functions of
BasicCatalog.v0_9(). basicCatalog() builds the whole catalog under the
basic catalog's id; BasicComponents holds each component for a catalog of
the app's own. The components apply the surface theme's primaryColor as
the primary color, and every specification example renders in a test.

* fix(a2ui_flutter): key a node's subtree by its implementation

A component whose catalogId changes is recreated with the same instance
id, like one whose type changes. Keying the subtree by the type name kept
the old implementation's state when only the catalog changed. Keying by
the resolved implementation resets it in both cases.

* test(a2ui_flutter): cover A2uiSurface.of and maybeOf

* fix(a2ui_flutter): forward the basic catalog's protocol version and instructions

* refactor(a2ui_flutter): rename WidgetCatalog to CatalogImplementation

Pairs it with CatalogApi in a2ui_core, as ComponentImplementation and
FunctionImplementation pair with ComponentApi and FunctionApi.

🤖 Agent-generated

* refactor(a2ui_flutter): use CatalogImplementation in the basic catalog

🤖 Agent-generated

* feat(a2ui_flutter): apply a component's accessibility label and description

NodeView wraps every resolved component in a Semantics that carries the
component's accessibility label as its label and its description as its
hint, so basic and custom components both get them. Without either
attribute the Semantics adds no node, and it stays in the tree so that
adding one later keeps the component's state.

🤖 Agent-generated

* fix(a2ui_flutter): adopt a2ui_core's renderer renames

#3194 renamed A2uiClientAction and A2uiClientError to A2uiRendererAction
and A2uiRendererError, MessageProcessor.groupModel to model and
getClientDataModel to getRendererDataModel, and replaced
EventSource.addListener with subscribe. The adapter's tests and README
still used the old names, so the package's tests no longer compiled on
main.

⚠️ Agent-generated

* fix(a2ui_flutter): use the http Apache license URL

#3205 standardized LICENSE files on http://www.apache.org/licenses/ and
made the license check enforce it. a2ui_flutter's LICENSE, added in
#3084, used https, so the static-checks job fails on main.

⚠️ Agent-generated

* docs(a2ui_flutter): match the README's a2ui_core constraint to the pubspec

The package now depends on a2ui_core ^0.3.0 (#3192), but the install
sample still showed ^0.2.2.

⚠️ Agent-generated

* docs(a2ui_flutter): drop accessibility from the README's unsupported list

NodeView applies a component's accessibility label and description, the
two attributes v0.9 defines, since effca52.

⚠️ Agent-generated
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants