Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1,736 changes: 1,076 additions & 660 deletions package-lock.json

Large diffs are not rendered by default.

4 changes: 2 additions & 2 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -21,9 +21,9 @@
"ajv": "^8.17.1",
"ajv-cli": "^5.0.0",
"husky": "^9.1.7",
"lint-staged": "^15.5.1",
"lint-staged": "^16.1.2",
"sudachi-synonyms-dictionary": "^14.0.0",
"textlint": "^14.6.0",
"textlint": "^15.2.0",
"textlint-filter-rule-allowlist": "^4.0.0",
"textlint-plugin-rst": "^0.1.1",
"textlint-rule-ja-hiragana-fukushi": "^1.3.0",
Expand Down
1 change: 1 addition & 0 deletions tools/lib/freee_a11y_gl/MANIFEST.in
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
graft src/freee_a11y_gl/data
9 changes: 7 additions & 2 deletions tools/lib/freee_a11y_gl/pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"

[project]
name = "freee_a11y_gl"
version = "0.1.4"
version = "0.2.0"
description = "A module to process a11y guidelines data"
authors = [
{name = "Masafumi NAKANE", email = "[email protected]"}
Expand All @@ -13,8 +13,13 @@ requires-python = ">=3.8"
dependencies = [
"pyyaml>=6.0",
"gitpython>=3.1.43",
"pydantic>=2.7.0"
"pydantic>=2.7.0",
"importlib_resources>=1.3.0; python_version<'3.9'"
]

[tool.setuptools]
package-dir = { "" = "src" }
include-package-data = true

[tool.setuptools.package-data]
freee_a11y_gl = ["data/*.yaml"]
151 changes: 105 additions & 46 deletions tools/lib/freee_a11y_gl/src/freee_a11y_gl/config.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
"""Configuration interface for freee_a11y_gl module."""
import re
from typing import Dict, Literal, Optional
from typing import Any, Dict, List, Literal, Optional
from .settings import settings

LanguageCode = Literal["ja", "en"]
Expand All @@ -9,8 +8,81 @@ class Config:
"""Configuration interface."""

@classmethod
def register_settings(cls, new_settings: Optional[Dict[str, any]] = None) -> None:
"""Register new settings."""
def initialize(cls, profile: Optional[str] = None, config_override: Optional[Dict[str, Any]] = None) -> None:
"""Initialize configuration with profile and overrides.

This method allows you to initialize the library's configuration with a specific
profile and optional configuration overrides. This is the recommended way to
configure the library for different use cases.

Args:
profile: Profile name to use (e.g., "yaml2rst", "yaml2sheet", "custom_project").
If None, uses "default" profile.
config_override: Dictionary of settings to override. Can contain nested
dictionaries for hierarchical configuration.

Examples:
# Use a specific profile
Config.initialize(profile="yaml2rst")

# Use profile with custom overrides
Config.initialize(
profile="yaml2sheet",
config_override={
"base_url": "https://custom.example.com",
"basedir": "/path/to/project",
"languages": {
"default": "en"
},
"paths": {
"guidelines": "/custom/categories/"
}
}
)

Note:
This method should be called before using other Config methods.
Settings are validated after initialization. Localized strings should
be configured through message catalog files, not through config_override.
"""
settings.initialize(profile=profile, config_override=config_override)

@classmethod
def register_settings(cls, new_settings: Optional[Dict[str, Any]] = None) -> None:
"""Register new settings with validation.

This method allows you to customize the library's configuration by providing
a dictionary of settings that will be merged with the existing configuration.

Args:
new_settings: Dictionary of settings to register. Can contain nested
dictionaries for hierarchical configuration.

Examples:
# Simple configuration
Config.register_settings({
"base_url": "https://custom.example.com"
})

# Complex nested configuration
Config.register_settings({
"base_url": "https://custom.example.com",
"basedir": "/path/to/project",
"languages": {
"default": "en",
"available": ["ja", "en"]
},
"paths": {
"guidelines": "/custom/categories/",
"faq": "/custom/faq/"
}
})

Note:
Settings are validated after registration. Invalid configurations
will raise a validation error. Localized strings should be configured
through message catalog files, not through this method.
"""
settings.update(new_settings)

@classmethod
Expand Down Expand Up @@ -68,19 +140,19 @@ def get_separator(cls, lang: Optional[LanguageCode] = None, separator_type: Opti
"""Get separator of specified type for language."""
effective_lang = lang if lang is not None else settings.get("languages.default", "ja")
effective_type = separator_type if separator_type is not None else "text"
return settings.get(f"locale.{effective_lang}.{effective_type}_separator", "")
return settings.message_catalog.get_separator(effective_type, effective_lang)

@classmethod
def get_text_separator(cls, lang: Optional[LanguageCode] = None) -> str:
"""Get text separator for specified language."""
effective_lang = lang if lang is not None else settings.get("languages.default", "ja")
return settings.get(f"locale.{effective_lang}.text_separator", "")
return settings.message_catalog.get_separator("text", effective_lang)

@classmethod
def get_list_separator(cls, lang: Optional[LanguageCode] = None) -> str:
"""Get list item separator for specified language."""
effective_lang = lang if lang is not None else settings.get("languages.default", "ja")
return settings.get(f"locale.{effective_lang}.list_separator", ", ")
return settings.message_catalog.get_separator("list", effective_lang)

@classmethod
def get_pass_singular_text(cls, lang: Optional[LanguageCode] = None) -> str:
Expand All @@ -93,7 +165,7 @@ def get_pass_singular_text(cls, lang: Optional[LanguageCode] = None) -> str:
Localized pass text for single condition
"""
effective_lang = lang if lang is not None else settings.get("languages.default", "ja")
return settings.get(f"locale.{effective_lang}.pass_singular_text", " is true")
return settings.message_catalog.get_pass_text("singular", effective_lang)

@classmethod
def get_pass_plural_text(cls, lang: Optional[LanguageCode] = None) -> str:
Expand All @@ -106,68 +178,38 @@ def get_pass_plural_text(cls, lang: Optional[LanguageCode] = None) -> str:
Localized pass text for multiple conditions
"""
effective_lang = lang if lang is not None else settings.get("languages.default", "ja")
return settings.get(f"locale.{effective_lang}.pass_plural_text", " are true")
return settings.message_catalog.get_pass_text("plural", effective_lang)

@classmethod
def get_conjunction(cls, lang: Optional[LanguageCode] = None, conjunction_type: Optional[str] = None) -> str:
"""Get conjunction of specified type for language."""
effective_lang = lang if lang is not None else settings.get("languages.default", "ja")
effective_type = conjunction_type if conjunction_type is not None else "and"
return settings.get(f"locale.{effective_lang}.{effective_type}_conjunction", "and")
return settings.message_catalog.get_conjunction(effective_type, effective_lang)

@classmethod
def get_check_tool_name(cls, tool_id: str, lang: Optional[LanguageCode] = None) -> str:
"""Get localized check tool name."""
effective_lang = lang if lang is not None else settings.get("languages.default", "ja")
try:
return settings.config.check_tools.names[tool_id][effective_lang]
except (KeyError, AttributeError):
return tool_id
return settings.message_catalog.get_check_tool(tool_id, effective_lang)

@classmethod
def get_check_target_name(cls, target: str, lang: Optional[LanguageCode] = None) -> str:
"""Get localized check target name."""
effective_lang = lang if lang is not None else settings.get("languages.default", "ja")
try:
return settings.config.check_targets.names[target][effective_lang]
except (KeyError, AttributeError):
return target
return settings.message_catalog.get_check_target(target, effective_lang)

@classmethod
def get_severity_tag(cls, severity: str, lang: Optional[LanguageCode] = None) -> str:
"""Get localized severity tag."""
effective_lang = lang if lang is not None else settings.get("languages.default", "ja")
try:
return settings.config.severity_tags.tags[severity][effective_lang]
except (KeyError, AttributeError):
return severity

@classmethod
def get_implementation_target_name(cls, target: str, lang: Optional[LanguageCode] = None) -> str:
"""Get localized implementation target name."""
effective_lang = lang if lang is not None else settings.get("languages.default", "ja")
try:
return settings.config.implementation_targets.targets[target][effective_lang]
except (KeyError, AttributeError):
return target
return settings.message_catalog.get_severity_tag(severity, effective_lang)

@classmethod
def get_platform_name(cls, platform: str, lang: Optional[LanguageCode] = None) -> str:
"""Get localized platform name."""
effective_lang = lang if lang is not None else settings.get("languages.default", "ja")
try:
return settings.config.platform.names[effective_lang][platform]
except (KeyError, AttributeError):
return platform

@classmethod
def get_platform_separator(cls, lang: Optional[LanguageCode] = None) -> str:
"""Get platform list separator for specified language."""
effective_lang = lang if lang is not None else settings.get("languages.default", "ja")
try:
return settings.config.platform.separator[effective_lang]
except (KeyError, AttributeError):
return ", "
return settings.message_catalog.get_platform_name(platform, effective_lang)

@classmethod
def get_faq_path(cls) -> str:
Expand Down Expand Up @@ -201,5 +243,22 @@ def get_date_format(cls, lang: Optional[LanguageCode] = None) -> str:
Date format string in strftime format
"""
effective_lang = lang if lang is not None else settings.get("languages.default", "ja")
default_format = "%Y年%-m月%-d日" if effective_lang == "ja" else "%B %-d, %Y"
return settings.get(f"locale.{effective_lang}.date_format", default_format)
return settings.message_catalog.get_date_format("default", effective_lang)

@classmethod
def get_available_languages(cls) -> List[str]:
"""Get list of available languages.

Returns:
List of available language codes
"""
return settings.get("languages.available", ["ja", "en"])

@classmethod
def get_default_language(cls) -> str:
"""Get default language code.

Returns:
Default language code
"""
return settings.get("languages.default", "ja")
82 changes: 0 additions & 82 deletions tools/lib/freee_a11y_gl/src/freee_a11y_gl/config.yaml.sample

This file was deleted.

1 change: 1 addition & 0 deletions tools/lib/freee_a11y_gl/src/freee_a11y_gl/data/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
"""Data package for freee_a11y_gl."""
25 changes: 25 additions & 0 deletions tools/lib/freee_a11y_gl/src/freee_a11y_gl/data/config.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
# Default configuration for freee_a11y_gl
# This file contains default values for all configuration settings
# All default values are externalized from Python code for consistency

languages:
available: ["ja", "en"]
default: "ja"

base_url: "https://a11y-guidelines.freee.co.jp"

paths:
guidelines: "/categories/"
faq: "/faq/articles/"

# Profile-specific configurations
profiles:
yaml2rst:
# yaml2rst script specific settings
# Inherits all default settings above
description: "Configuration profile for yaml2rst script"

yaml2sheet:
# yaml2sheet script specific settings
# Inherits all default settings above
description: "Configuration profile for yaml2sheet script"
Loading