Universal Design Patterns Generator - From UVL Feature Models to Swift Code
Transform Universal Variability Language models into Swift design pattern implementations with future multi-language support
pip install jinja2 flamapy-fm pathlib click
git clone https://github.com/trran/UVL2Pat.git
cd UVL2Pat
pip install -r requirements.txt
pip install -e .
main.py
:
# Available categories and patterns:
# behavioral: strategy, observer
# creational: factory_method, singleton
# structural: adapter, bridge, decorator
general_group = "creational" # Change category
pattern = "singleton" # Change pattern
python main.py
features
"Singleton Pattern" {abstract}
mandatory
"Initialization" {abstract}
alternative
"Eager"
"Lazy"
"Access Method" {abstract}
alternative
"getInstance()"
"Static Field"
"Property"
optional
"Thread Safety"
"Serialization Support"
String "Class Name"
String "Namespace"
constraints
"Eager" => !"Thread Safety"
"Static Field" => "Eager"
"Serialization Support" => "Thread Safety"
{
"Eager": false,
"Lazy": true,
"Initialization": true,
"Access Method": true,
"Thread Safety": true,
"Serialization Support": false,
"Class Name": "DatabaseManager",
"Namespace": "com.example.data",
"getInstance()": true,
"Static Field": false,
"Property": false
}
{% set class_name = features.get("Class Name", "Singleton") %}
{% if features.get("Namespace") %}// Namespace: {{ features.get("Namespace") }}{% endif %}
import Foundation
{% if features.get("Thread Safety") and features.get("Lazy") %}
import Dispatch
{% endif %}
class {{ class_name }} {
{% if features.get("Eager") %}
static let shared = {{ class_name }}()
{% elif features.get("Lazy") %}
{% if features.get("Thread Safety") %}
private static var _instance: {{ class_name }}?
private static let queue = DispatchQueue(label: "{{ class_name.lower() }}.queue")
{% else %}
private static var _instance: {{ class_name }}?
{% endif %}
{% endif %}
private init() {
// Private initializer
}
}
// Namespace: com.example.data
import Foundation
import Dispatch
class DatabaseManager {
private static var _instance: DatabaseManager?
private static let queue = DispatchQueue(label: "databasemanager.queue")
private init() {
// Private initializer
}
static func getInstance() -> DatabaseManager {
return queue.sync {
if _instance == nil {
_instance = DatabaseManager()
}
return _instance!
}
}
}
Pattern | Swift Support | UVL Model | Configurations | Template Features |
---|---|---|---|---|
Singleton | ✅ Complete | ✅ | 8 variants | Thread Safety, Lazy/Eager, Access Methods |
Observer | ✅ Complete | ✅ | 6 variants | Type Safety, Weak References, Combine |
Strategy | ✅ Complete | ✅ | 4 variants | Protocol-based, Generic Implementation |
Factory Method | 🚧 In Progress | ✅ | 5 variants | Generic Factories, Protocol Conformance |
Decorator | 🚧 In Progress | ✅ | 3 variants | Protocol Extensions, Composition |
"Eager" => !"Thread Safety"
: Eager initialization excludes thread safety"Static Field" => "Eager"
: Static field access requires eager initialization"Serialization Support" => "Thread Safety"
: Serialization requires thread-safe implementationpatterns/{category}/{pattern}/{pattern}.uvl
patterns/{category}/{pattern}/templates/{pattern}.swift.j2
patterns/{category}/{pattern}/configurations/
https://github.com/trran/UVL2Pat
git checkout -b feature/new-pattern
🌟 Made with ❤️ for the Software Engineering Research Community 🌟
Transforming Feature Models into Code, One Pattern at a Time