تعارف

مقابلہする Urdu translation: ".عام مقصد : متوسط سطح کے Gradle ڈویلپر جو پیچیدہ تنظیمات کو منیج کرنا چاہتے ہیں۔

گریڈل پلاگائنز کی ترقیات میں پیچیدہ تنظیمات کی منظم کرنا ایک عام کام ہے۔ DSL کو سو سو خصوصیات سے بوجھ ڈالنے کی بجائے، اکثر ایک بیرونی فائل، جیسے YAML میں، تنظیم کو تعریف کرنا زیادہ صاف اور برقرار رکھنے میں آسان ہوتا ہے۔ یہ مضمون آپ کو Jackson طاقتور لائبریری کے اندراج کے ذریعے YAML فائلوں کو Kotlin اشیاء میں parse کرنے میں رہنمائی کرتا ہے، سخت TDD رویہ اپنائے تاکہ ہماری پلاگین کی مضبوطی یقینی بنائی جا sake۔site-baker.

1. سیاق : ہمارا پلاگین `site-baker

ہمारा پلاگ‑ان`site-baker`اسے YAML فائل کی تنظیمات پڑھنے کی ضرورت ہے (managed-jbake-context.yml) معلومات حاصل کرنے کے لئے جیسے sorce ke raste, deployment ki jagah, aur Git ki pehchaniyat

ہم جو YAML کنفیگری پارس کرنا چاہتے ہیں وہ اس طرح ہے:

bake:
  srcPath: "./site/jbake"
  destDirPath: "bake"
  cname: "cheroliv.com"
pushPage:
  from: "bake"
  to: "cvs"
  repo:
    name: "trainings"
    repository: "https://github.com/pages-content/pages-content.github.io.git"
    credentials:
      username: "USERNAME"
      password: "SECRET_TOKEN"
  branch: "main"
  message: "cheroliv.com"
# ... autres configurations (pushMaquette, supabase, etc.)

2. Kotlin میں کنفیگریشن کی مڈولنگ

پارس کرنے سے پہلے، ہمیں کاتلن میں اپنی ڈیٹر کی ساخت تعین کرنا ہوگی۔ Jackson ان کلاسوں کا استعمال کر کے YAML contents کو خودکار طور پر map کرے گا۔

// plugin/src/main/kotlin/com/cheroliv/site/baker/data/SiteConfiguration.kt
package com.cheroliv.site.baker.data

import com.fasterxml.jackson.databind.ObjectMapper
import com.fasterxml.jackson.dataformat.yaml.YAMLFactory
import com.fasterxml.jackson.module.kotlin.readValue
import com.fasterxml.jackson.module.kotlin.registerKotlinModule

fun parseSiteConfiguration(yaml: String): SiteConfiguration {
    val mapper = ObjectMapper(YAMLFactory()).registerKotlinModule()
    return mapper.readValue(yaml)
}

data class GitPushConfiguration(
    val from: String = "",
    val to: String = "",
    val repo: RepositoryConfiguration = RepositoryConfiguration(),
    val branch: String = "",
    val message: String = "",
)

data class RepositoryConfiguration(
    val name: String = "",
    val repository: String = "",
    val credentials: RepositoryCredentials = RepositoryCredentials(),
) {
    companion object {
        const val ORIGIN = "origin"
        const val CNAME = "CNAME"
        const val REMOTE = "remote"
    }
}

data class RepositoryCredentials(val username: String = "", val password: String = "")

data class SiteConfiguration(
    val bake: BakeConfiguration = BakeConfiguration(),
    val pushPage: GitPushConfiguration = GitPushConfiguration(),
    val pushMaquette: GitPushConfiguration = GitPushConfiguration(),
    val pushSource: GitPushConfiguration? = null,
    val pushTemplate: GitPushConfiguration? = null,
    val supabase: SupabaseContactFormConfig? = null
)

data class BakeConfiguration(
    val srcPath: String = "",
    val destDirPath: String = "",
    val cname: String? = null,
)

// ... (autres data classes pour Supabase, si nécessaire)

فنکشن`parseSiteConfiguration`یہ ہمارے ڈی سیریالائزیشن کے لیے داخلہ کا نقطہ ہے۔ یہ استعمال karti hai`ObjectMapper`جیکسن کا، کنفیگرڈ کے ساتھ`YAMLFactory`YAML فارمٹ کے لیے اور`registerKotlinModule()`Kotlin کی خصوصیات کے سپورٹ کے لیے (جیسے پراپرٹیز کی بنیادی valeurs)۔

3. Jackson کو build.gradle.kts میں شامل کرنا

جیکسن استعمال کرنے کے لیے، ہمیں ضروری ڈپینڈنسیز شامل کرنے ہوں گے داخل`build.gradle.kts`ہمارے ماڈیول کا`plugin`:

// plugin/build.gradle.kts
dependencies {
    // Jackson for YAML parsing
    implementation("com.fasterxml.jackson.module:jackson-module-kotlin:2.18.3")
    implementation("com.fasterxml.jackson.dataformat:jackson-dataformat-yaml:2.18.3")

    // ... autres dépendances
}

ہم استعمال کرتے ہیں`jackson-module-kotlin`Kotlin کے سپورٹ کے لئے اور`jackson-dataformat-yaml`YAML فارمٹ کے انتظام کے لیے

4. TDD کاApproach : YAML Parsing کا ٹیسٹ

اب، ہم پارسنگ کی لاجک کی تصدیق کرنے کے لیے TDD لاگو کرتے ہیں۔

4.1. یونٹ ٹیسٹ : YAML کو Kotlin অবজেক্ট मेंแมप کریں

ہم یونٹ ٹیسٹ سے شروع کرتے ہیں`SiteBakerPluginTest.kt`فونکشن کی جانچ کرنے`parseSiteConfiguration`یہ YAML سٹرنگ کو صحیح طریقے سے ایک آبجکٹ میں تبدیل کر سکتا ہے`SiteConfiguration`.

// plugin/src/test/kotlin/com/cheroliv/site/baker/SiteBakerPluginTest.kt
@Test
fun `can map configuration text to SiteConfiguration object`() {
    val yamlString = "../../managed-jbake-context.yml"
        .run(::File)
        .readText()
        .trimIndent()

    val config: SiteConfiguration = parseSiteConfiguration(yamlString)

    assertEquals("cheroliv.com", config.bake.cname)
    assertEquals("main", config.pushPage.branch)
    assertEquals("https://github.com/pages-content/pages-content.github.io.git", config.pushPage.repo.repository)
}

یہ ٹیسٹ فائل کی مواد پڑھتا ہے`managed-jbake-context.yml`(جو ٹیسٹ کے معتبر ہونے کے لیے موجود ہونا ضروری ہے) اور اشیاء پر تصدیقات کرتا ہے`SiteConfiguration`نتیجہ. وہ تصدیق کرتا ہے کہ YAML کی کلیدوں کی قيمتیں صحیح طور پر منقوش کی گئی ہیں۔

4.2. فنکشنل ٹیسٹ : کنفیگریشن فائل کی پڑھائی کی تصدیق

ضمان کرنے کے لیے کہ پلاگ ان اپنے DSL کے ذریعے کنفیگریشن فائل پڑھ سکتا ہے اور پارسنگ ایک واقعی Gradle ماحول میں کام کرتا ہے، ہم ایک فنکشنل ٹسٹ شامل کرتے ہیں`SiteBakerPluginFunctionalTest.kt`.

یہ ٹیسٹ ضروری ہے کیونکہ اس میں واقعی پروجیکٹ میں پلاگ ان کا تنفیذ سِملیتا ہے۔ یہ ہونا چاہیےمُحْکم, یہ ہے کہ اسے خود ہی فائل بنانی ہے`managed-jbake-context.yml`کنٹرول شدہ مواد کے ساتھ، ٹیسٹ کی قابلیت بازپیدا کرنے اور ان کی algتاؤ کو یقینی بنانے کے لئے۔

// plugin/src/functionalTest/kotlin/com/cheroliv/site/baker/SiteBakerPluginFunctionalTest.kt
@Test
fun `config file contains good data`(){
    val configContent = configFile.readText(UTF_8)
    // Vérifications comme dans vos commentaires
    assertTrue(configContent.contains("bake"))
    assertTrue(configContent.contains("pushPage"))
    assertTrue(configContent.contains("repository"))
}

یہ فَنکشنل ٹیسٹ جانچta ہے کہ ٹیسٹ کے موقت ڈائریکٹری میں کاپی کردہ کنفیگریشن فائل میں متوقع ڈیٹا موجود ہے۔ اگرچہ یہ ٹیسٹ YAML کو مستقیماً Kotlin شیئ میں parse نہیں کرتا، لیکن یہ فائل اور اس کے مضمون کی موجودگی کی تصدیق کرتا ہے، جو پلاگین کے ذریعے parsing کے لیے ایک بنیادی پیش شرط ہے۔

5. پارسینگ فلو کی نمائش

ایک ڈائگرام YAML کنفیگریشن کے پارسنگ کے دوران ڈیٹا کا فلو اور انٹریکشنز کی نمائندگی کرتا ہے:

@startuml
actor "Utilisateur Gradle" as User
participant "build.gradle.kts" as BuildScript
participant "SiteBakerPlugin" as Plugin
participant "SiteExtension" as Extension
participant "managed-jbake-context.yml" as ConfigFile
participant "parseSiteConfiguration()" as Parser
participant "SiteConfiguration (Objet Kotlin)" as KotlinObject

User -> BuildScript : Applique le plugin et configure le DSL
BuildScript -> Plugin : apply()
Plugin -> Extension : Crée et enregistre l'extension 'site'
User -> BuildScript : site { configPath = "..." }
BuildScript -> Extension : Définit configPath

Plugin -> ConfigFile : Lit le fichier (via configPath)
ConfigFile --> Plugin : Contenu YAML
Plugin -> Parser : Appelle parseSiteConfiguration(yamlString)
Parser -> KotlinObject : Mappe le YAML en objet SiteConfiguration
KotlinObject --> Plugin : Retourne l'objet configuré

@enduml

نتیجہ

TDD طریقے پر عمل کرتے ہوئے، ہم نے Jackson لائبریری کو کامیابی سے داخل کیا ہے تاکہ YAML کنفیگریشن فائلز کو Kotlin اشیاء میں بدل سکیں۔ ہمارے Gradle پلاگین کے اندر۔ اس طریقے نے ہمیں اجازت دی ہے :

  • واضح طور پر ماڈل بنائیںہماری کنفیگریشن Kotlin ڈیٹا کلاسوں کے ساتھ

  • پارسنگ لاجیک کی تصدیق کریںمستهدف یونٹ ٹیسٹس کے ساتھ

  • انٹیگریشن یقینی بنائیںایک واقعی Gradle ماحولیاتی میں، ہرمٹیک فنگش널 ٹسوں کی وجہ سے۔

یہ مضبوط بنیاد ہمیں بڑی بھروسہ دےتی ہے تاکہ ہم اپنی پلاگ‑ان کو اس سیٹنگ پر مبنیFacilities کے ساتھ لاچا سکیں، اس کے ساتھ ساتھ کوڈ کی برقرار رکھنے کی قابلیت اور مضبوطی کو بھی یقینی بنائیں۔ اب YAML parsing ہماری پلاگ‑ان کی ایک قابل اعتماد اور ٹیسٹ کردہ فیچر بن گئی ہے۔site-baker.

متعلقہ مضامین