💎 🏗️ Object Operations in TuskLang - Ruby Edition
🏗️ Object Operations in TuskLang - Ruby Edition
"We don't bow to any king" - Ruby Edition
TuskLang's object operations provide powerful data structure manipulation capabilities that integrate seamlessly with Ruby's rich object-oriented features, enabling dynamic object creation, transformation, and intelligent data modeling.
🎯 Overview
Object operations in TuskLang allow you to manipulate complex data structures directly in configuration files, enabling dynamic object creation, property access, and transformation. When combined with Ruby's powerful object-oriented capabilities, these operations become incredibly versatile.
🚀 Basic Object Operations
Object Creation and Access
TuskLang configuration with object operations
tsk_content = <<~TSK
[object_operations]
# Object creation
user_config: {
id: @env("USER_ID"),
name: @env("USER_NAME"),
email: @env("USER_EMAIL"),
role: @env("USER_ROLE")
}
# Nested objects
app_config: {
database: {
host: @env("DB_HOST"),
port: @env("DB_PORT"),
name: @env("DB_NAME"),
user: @env("DB_USER")
},
api: {
base_url: @env("API_BASE_URL"),
version: @env("API_VERSION"),
timeout: @env("API_TIMEOUT")
}
}
# Object property access
db_host: @get(@app_config, "database.host")
api_version: @get(@app_config, "api.version")
user_name: @get(@user_config, "name")
TSKRuby integration
require 'tusklang'parser = TuskLang.new
config = parser.parse(tsk_content)
Use in Ruby classes
class ObjectProcessor
def initialize(tusk_config)
@config = tusk_config
end
def user_config
@config['object_operations']['user_config']
end
def app_config
@config['object_operations']['app_config']
end
def db_host
@config['object_operations']['db_host']
end
def api_version
@config['object_operations']['api_version']
end
def user_name
@config['object_operations']['user_name']
end
def get_database_config
app_config['database']
end
def get_api_config
app_config['api']
end
def validate_config
{
user_valid: user_config['id'] && user_config['email'],
database_valid: get_database_config['host'] && get_database_config['name'],
api_valid: get_api_config['base_url'] && get_api_config['version']
}
end
endUsage
processor = ObjectProcessor.new(config)
puts processor.validate_config
Object Merging and Cloning
TuskLang with object merging
tsk_content = <<~TSK
[object_merging]
# Object merging
default_config: {
timeout: 30,
retries: 3,
cache_enabled: true
}
custom_config: {
timeout: @env("CUSTOM_TIMEOUT"),
cache_enabled: @env("CACHE_ENABLED") == "true"
}
# Merge objects
final_config: @merge(@default_config, @custom_config)
# Deep merge
base_settings: {
logging: {
level: "info",
format: "json"
},
security: {
ssl: true,
cors: false
}
}
override_settings: {
logging: {
level: @env("LOG_LEVEL")
},
security: {
cors: @env("ENABLE_CORS") == "true"
}
}
merged_settings: @deep_merge(@base_settings, @override_settings)
TSKRuby integration with object merging
class ObjectMerger
def initialize(tusk_config)
@config = tusk_config
end
def get_final_config
@config['object_merging']['final_config']
end
def get_merged_settings
@config['object_merging']['merged_settings']
end
def get_default_config
@config['object_merging']['default_config']
end
def get_custom_config
@config['object_merging']['custom_config']
end
def apply_config_overrides(base_config, overrides)
# Simulate deep merge in Ruby
merged = base_config.deep_dup
overrides.each do |key, value|
if value.is_a?(Hash) && merged[key].is_a?(Hash)
merged[key] = apply_config_overrides(merged[key], value)
else
merged[key] = value
end
end
merged
end
end
🔧 Advanced Object Operations
Object Transformation and Mapping
TuskLang with object transformation
tsk_content = <<~TSK
[object_transformation]
# Object mapping
user_objects: @map(@query("SELECT id, name, email, role FROM users"), {
id: @item("id"),
name: @item("name"),
email: @item("email"),
role: @item("role"),
display_name: @concat(@item("name"), " (", @item("role"), ")")
})
# Object filtering
active_users: @filter(@user_objects, @equals(@item("role"), "active"))
admin_users: @filter(@user_objects, @equals(@item("role"), "admin"))
# Object sorting
users_by_name: @sort(@user_objects, @item("name"))
users_by_role: @sort(@user_objects, @item("role"))
# Object grouping
users_by_role: @group_by(@user_objects, @item("role"))
TSKRuby integration with object transformation
class ObjectTransformer
def initialize(tusk_config)
@config = tusk_config
end
def get_user_objects
@config['object_transformation']['user_objects']
end
def get_active_users
@config['object_transformation']['active_users']
end
def get_admin_users
@config['object_transformation']['admin_users']
end
def get_users_by_name
@config['object_transformation']['users_by_name']
end
def get_users_by_role
@config['object_transformation']['users_by_role']
end
def get_users_grouped_by_role
@config['object_transformation']['users_by_role']
end
def generate_user_report
{
total_users: get_user_objects.length,
active_users: get_active_users.length,
admin_users: get_admin_users.length,
users_by_role: get_users_grouped_by_role,
sorted_users: get_users_by_name
}
end
end
Object Validation and Schema
TuskLang with object validation
tsk_content = <<~TSK
[object_validation]
# Object schema validation
user_schema: {
id: "number",
name: "string",
email: "string",
role: "string"
}
# Validate object against schema
user_valid: @validate_schema(@user_config, @user_schema)
# Required fields validation
required_fields: ["id", "name", "email"]
has_required_fields: @has_all_keys(@user_config, @required_fields)
# Object property validation
email_valid: @matches(@get(@user_config, "email"), "^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$")
role_valid: @in_array(@get(@user_config, "role"), ["user", "admin", "moderator"])
# Nested object validation
config_valid: @and(
@has_key(@app_config, "database"),
@has_key(@app_config, "api"),
@has_key(@get(@app_config, "database"), "host"),
@has_key(@get(@app_config, "api"), "base_url")
)
TSKRuby integration with object validation
class ObjectValidator
def initialize(tusk_config)
@config = tusk_config
end
def validate_user_object(user_data)
errors = []
unless @config['object_validation']['user_valid']
errors << "User object does not match schema"
end
unless @config['object_validation']['has_required_fields']
errors << "User object missing required fields"
end
unless @config['object_validation']['email_valid']
errors << "Invalid email format"
end
unless @config['object_validation']['role_valid']
errors << "Invalid role value"
end
{
valid: errors.empty?,
errors: errors
}
end
def validate_app_config
@config['object_validation']['config_valid']
end
def validate_object_structure(obj, schema)
schema.each do |key, expected_type|
unless obj.key?(key)
return false
end
actual_type = obj[key].class.name.downcase
unless actual_type == expected_type
return false
end
end
true
end
end
🎛️ Object Serialization and Deserialization
JSON Operations
TuskLang with JSON operations
tsk_content = <<~TSK
[json_operations]
# Object to JSON
user_json: @to_json(@user_config)
app_config_json: @to_json(@app_config)
# JSON to object
parsed_user: @from_json(@env("USER_JSON"))
parsed_config: @from_json(@file.read("config.json"))
# JSON validation
json_valid: @is_valid_json(@env("USER_JSON"))
json_schema_valid: @validate_json_schema(@env("USER_JSON"), @user_schema)
# JSON transformation
user_response: @format_json({
status: "success",
data: @user_config,
timestamp: @date.now(),
version: @env("API_VERSION")
})
TSKRuby integration with JSON operations
class JsonProcessor
def initialize(tusk_config)
@config = tusk_config
end
def get_user_json
@config['json_operations']['user_json']
end
def get_app_config_json
@config['json_operations']['app_config_json']
end
def get_parsed_user
@config['json_operations']['parsed_user']
end
def get_parsed_config
@config['json_operations']['parsed_config']
end
def get_user_response
JSON.parse(@config['json_operations']['user_response'])
end
def validate_json_input(json_string)
{
is_valid: @config['json_operations']['json_valid'],
schema_valid: @config['json_operations']['json_schema_valid']
}
end
def serialize_user_data(user_data)
{
json: @config['json_operations']['user_json'],
response: get_user_response
}
end
end
Object Cloning and Immutability
TuskLang with object cloning
tsk_content = <<~TSK
[object_cloning]
# Object cloning
cloned_user: @clone(@user_config)
cloned_config: @deep_clone(@app_config)
# Immutable object creation
immutable_user: @freeze(@user_config)
immutable_config: @deep_freeze(@app_config)
# Object with computed properties
computed_user: @computed(@user_config, {
full_name: @concat(@item("first_name"), " ", @item("last_name")),
display_role: @upper(@item("role")),
created_date: @date.format(@item("created_at"), "Y-m-d")
})
# Object transformation with preservation
transformed_user: @transform(@user_config, {
name: @upper(@item("name")),
email: @lower(@item("email"))
})
TSKRuby integration with object cloning
class ObjectCloner
def initialize(tusk_config)
@config = tusk_config
end
def get_cloned_user
@config['object_cloning']['cloned_user']
end
def get_cloned_config
@config['object_cloning']['cloned_config']
end
def get_immutable_user
@config['object_cloning']['immutable_user']
end
def get_computed_user
@config['object_cloning']['computed_user']
end
def get_transformed_user
@config['object_cloning']['transformed_user']
end
def create_immutable_copy(obj)
# Create a frozen copy in Ruby
obj.deep_dup.freeze
end
def add_computed_properties(obj)
obj.dup.tap do |computed|
computed[:full_name] = "#{obj[:first_name]} #{obj[:last_name]}"
computed[:display_role] = obj[:role].upcase
computed[:created_date] = obj[:created_at].strftime("%Y-%m-%d")
end
end
end
🔄 Dynamic Object Operations
Object Factory and Builder Patterns
TuskLang with object factory patterns
tsk_content = <<~TSK
[object_factory]
# Object factory
user_factory: @factory({
id: @generate_id(),
name: @env("USER_NAME"),
email: @env("USER_EMAIL"),
role: @env("USER_ROLE") || "user",
created_at: @date.now(),
status: "active"
})
# Conditional object creation
conditional_user: @when(@env("IS_ADMIN") == "true", {
id: @generate_id(),
name: @env("USER_NAME"),
email: @env("USER_EMAIL"),
role: "admin",
permissions: ["read", "write", "delete", "admin"]
}, {
id: @generate_id(),
name: @env("USER_NAME"),
email: @env("USER_EMAIL"),
role: "user",
permissions: ["read", "write"]
})
# Object builder pattern
user_builder: @builder({
base: {
id: @generate_id(),
created_at: @date.now(),
status: "active"
},
with_name: @concat(@base, {name: @env("USER_NAME")}),
with_email: @concat(@with_name, {email: @env("USER_EMAIL")}),
with_role: @concat(@with_email, {role: @env("USER_ROLE") || "user"})
})
TSKRuby integration with object factory
class ObjectFactory
def initialize(tusk_config)
@config = tusk_config
end
def create_user
@config['object_factory']['user_factory']
end
def create_conditional_user
@config['object_factory']['conditional_user']
end
def build_user
@config['object_factory']['user_builder']['with_role']
end
def generate_user_with_defaults
{
id: SecureRandom.uuid,
name: ENV['USER_NAME'],
email: ENV['USER_EMAIL'],
role: ENV['USER_ROLE'] || 'user',
created_at: Time.current,
status: 'active'
}
end
def create_user_with_permissions(is_admin)
base_user = generate_user_with_defaults
if is_admin
base_user.merge({
role: 'admin',
permissions: ['read', 'write', 'delete', 'admin']
})
else
base_user.merge({
role: 'user',
permissions: ['read', 'write']
})
end
end
end
Object Composition and Inheritance
TuskLang with object composition
tsk_content = <<~TSK
[object_composition]
# Object composition
base_entity: {
id: @generate_id(),
created_at: @date.now(),
updated_at: @date.now()
}
user_entity: @compose(@base_entity, {
name: @env("USER_NAME"),
email: @env("USER_EMAIL"),
role: @env("USER_ROLE")
})
product_entity: @compose(@base_entity, {
name: @env("PRODUCT_NAME"),
price: @env("PRODUCT_PRICE"),
category: @env("PRODUCT_CATEGORY")
})
# Object inheritance
admin_user: @extend(@user_entity, {
role: "admin",
permissions: ["read", "write", "delete", "admin"],
admin_level: @env("ADMIN_LEVEL") || 1
})
# Object mixins
audit_mixin: {
created_by: @env("CREATED_BY"),
modified_by: @env("MODIFIED_BY"),
audit_trail: @array([])
}
audited_user: @mixin(@user_entity, @audit_mixin)
TSKRuby integration with object composition
class ObjectComposer
def initialize(tusk_config)
@config = tusk_config
end
def get_base_entity
@config['object_composition']['base_entity']
end
def get_user_entity
@config['object_composition']['user_entity']
end
def get_product_entity
@config['object_composition']['product_entity']
end
def get_admin_user
@config['object_composition']['admin_user']
end
def get_audited_user
@config['object_composition']['audited_user']
end
def create_base_entity
{
id: SecureRandom.uuid,
created_at: Time.current,
updated_at: Time.current
}
end
def compose_entity(base, additional_props)
base.merge(additional_props)
end
def extend_entity(base, extensions)
base.merge(extensions)
end
end
🛡️ Object Security and Validation
Object Security
TuskLang with object security
tsk_content = <<~TSK
[object_security]
# Object sanitization
sanitized_user: @sanitize_object(@user_config, ["id", "name", "email"], ["password", "token", "secret"])
# Object encryption
encrypted_user: @encrypt_object(@user_config, @env("ENCRYPTION_KEY"))
decrypted_user: @decrypt_object(@encrypted_user, @env("ENCRYPTION_KEY"))
# Object signing
signed_user: @sign_object(@user_config, @env("SIGNING_KEY"))
verified_user: @verify_object(@signed_user, @env("SIGNING_KEY"))
# Object access control
public_user: @public_fields(@user_config, ["id", "name", "role"])
private_user: @private_fields(@user_config, ["email", "password", "token"])
TSKRuby integration with object security
class ObjectSecurity
def initialize(tusk_config)
@config = tusk_config
end
def get_sanitized_user
@config['object_security']['sanitized_user']
end
def get_encrypted_user
@config['object_security']['encrypted_user']
end
def get_decrypted_user
@config['object_security']['decrypted_user']
end
def get_signed_user
@config['object_security']['signed_user']
end
def get_verified_user
@config['object_security']['verified_user']
end
def get_public_user
@config['object_security']['public_user']
end
def sanitize_object(obj, allowed_fields, sensitive_fields)
sanitized = {}
allowed_fields.each do |field|
sanitized[field] = obj[field] if obj.key?(field)
end
sanitized
end
def encrypt_object(obj, key)
# Implement encryption logic
cipher = OpenSSL::Cipher.new('AES-256-GCM')
cipher.encrypt
cipher.key = key
encrypted = cipher.update(obj.to_json) + cipher.final
{
data: Base64.strict_encode64(encrypted),
iv: Base64.strict_encode64(cipher.random_iv),
tag: Base64.strict_encode64(cipher.auth_tag)
}
end
end
🚀 Performance Optimization
Efficient Object Operations
TuskLang with performance optimizations
tsk_content = <<~TSK
[optimized_objects]
# Cached object operations
cached_user: @cache("5m", @user_config)
cached_config: @cache("1h", @app_config)
# Lazy object evaluation
expensive_object: @when(@env("DEBUG"), @complex_object_creation())
# Object pooling
user_pool: @object_pool(@user_factory, 100)
# Object streaming
stream_objects: @stream_objects(@query("SELECT * FROM users"), 1000)
TSKRuby integration with optimized objects
class OptimizedObjectProcessor
def initialize(tusk_config)
@config = tusk_config
end
def get_cached_user
@config['optimized_objects']['cached_user']
end
def get_cached_config
@config['optimized_objects']['cached_config']
end
def get_user_pool
@config['optimized_objects']['user_pool']
end
def process_efficiently
Rails.cache.fetch("object_operations", expires_in: 5.minutes) do
{
cached_user: get_cached_user,
cached_config: get_cached_config,
user_pool: get_user_pool
}
end
end
def process_object_stream
stream = @config['optimized_objects']['stream_objects']
stream.each do |batch|
# Process batch of objects
Rails.logger.info "Processed batch of #{batch.length} objects"
end
end
end
🎯 Best Practices
1. Use Descriptive Object Names
Good
user_configuration: {id: @env("USER_ID"), name: @env("USER_NAME")}
database_connection: {host: @env("DB_HOST"), port: @env("DB_PORT")}Avoid
config: {id: @env("USER_ID"), name: @env("USER_NAME")}
db: {host: @env("DB_HOST"), port: @env("DB_PORT")}
2. Validate Objects Before Processing
TuskLang with object validation
tsk_content = <<~TSK
[validation_first]
# Validate before processing
safe_user: @when(@validate_schema(@user_config, @user_schema), @user_config, {})
# Sanitize before use
clean_object: @sanitize_object(@user_config, ["id", "name"], ["password"])
TSK
3. Use Caching for Expensive Operations
Cache expensive object operations
expensive_object: @cache("10m", @complex_object_creation())
4. Handle Object Edge Cases
TuskLang with edge case handling
tsk_content = <<~TSK
[edge_cases]
# Handle null objects
safe_object: @coalesce(@user_config, {})
# Handle missing properties
safe_property: @get(@user_config, "name") || "Unknown"
# Handle object type mismatches
type_safe_object: @ensure_object(@user_data)
TSK
🔧 Troubleshooting
Common Object Issues
Issue: Null object references
Solution: Use safe object access
tsk_content = <<~TSK
[null_object_fixes]
# Safe object access
safe_property: @get(@user_config, "name") || "Default"
# Null coalescing
safe_object: @coalesce(@user_config, {})
TSKIssue: Object type mismatches
Solution: Ensure proper object types
tsk_content = <<~TSK
[type_fixes]
# Ensure object type
safe_object: @ensure_object(@user_data)
# Type conversion
string_object: @to_object(@user_string)
TSKIssue: Object performance problems
Solution: Use optimization techniques
tsk_content = <<~TSK
[performance_fixes]
# Use object caching
cached_object: @cache("5m", @expensive_object_creation())
# Use object pooling
pooled_object: @object_pool(@object_factory, 100)
# Use object streaming
stream_objects: @stream_objects(@large_dataset, 1000)
TSK
🎯 Summary
TuskLang's object operations provide powerful data structure manipulation capabilities that integrate seamlessly with Ruby applications. By leveraging these operations, you can:
- Manipulate complex objects dynamically in configuration files - Create and transform objects efficiently - Validate and secure objects safely - Handle object composition and inheritance patterns - Optimize object performance with caching and pooling
The Ruby integration makes these operations even more powerful by combining TuskLang's declarative syntax with Ruby's rich object-oriented features and libraries.
Remember: TuskLang object operations are designed to be expressive, performant, and Ruby-friendly. Use them to create dynamic, efficient, and maintainable object processing configurations.
Key Takeaways: - Always validate objects before processing - Use caching for expensive object operations - Handle null objects and edge cases gracefully - Implement proper object security measures - Combine with Ruby's object libraries for advanced functionality