العودة إلى التحديثات
New releaseJul 14, 2026

kit-policy v2026.7.12

إطار عمل تفويض مرن وقابل للتكوين لـ Kit (مستوحى من Action Policy)

مشاركة

kit-policy

إطار عمل للتفويض مرن وقابل للتكوين لـ Kit، مستوحى من Action Policy الخاص بـ Ruby.


[TOC]


الملفات

الملفالوصف
.editorconfigإعدادات تنسيق المحرر
.gitignoreقواعد تجاهل Git لمخرجات البناء والتبعيات
.tool-versionsإصدارات أدوات asdf (Zig, Kit)
LICENSEملف ترخيص MIT
README.mdهذا الملف
examples/blog-policy.kitمثال لسياسة المدونة
kit.tomlبيان الحزمة مع البيانات الوصفية والمهام وتكوين lint
src/core.kitمساعدات التفويض الأساسية
src/error.kitأخطاء التفويض، أنواع النتائج، وأسباب الفشل
src/main.kitالوحدة الجذرية للحزمة
src/scope.kitمساعدات النطاق، المسند، والترقيم
tests/policy.test.kitاختبارات سلوك السياسة الشاملة
tests/types.test.kitاختبارات أنواع السياسة والمساعدات

التبعيات

لا تبعيات لحزمة Kit.

التثبيت

kit add gitlab.com/kit-lang/packages/kit-policy.git

الاستخدام

import Kit.Policy.Core as PolicyCore
import Kit.Policy.Error as PolicyError
import Kit.Policy.Scope as PolicyScope

type Post = {id: Int, author-id: Int, published?: Bool, title: String}
type User = {id: Int, admin?: Bool}
type AuthContext = {user: User}

post-policy = fn(post, ctx, action) =>
  if ctx.user.admin? then
    PolicyCore.allow
  else
    match PolicyCore.resolve-alias action
      | :show -> PolicyCore.allow-if post.published?
      | :update -> PolicyCore.allow-if (ctx.user.id == post.author-id)
      | :destroy -> PolicyCore.allow-if (ctx.user.id == post.author-id)
      | _ -> PolicyCore.no-rule action

post-scope = fn(posts, ctx) =>
  if ctx.user.admin? then
    posts
  else
    posts |>> List.filter (fn(post) => post.published?)

main = fn =>
  user = {id: 1, admin?: false}
  ctx = {user: user}
  post = {id: 1, author-id: 1, published?: true, title: "Hello"}
  posts = [post]

  if PolicyCore.can-with? post-policy post ctx :update then
    println "Can update post"
  else
    println "Cannot update post"

  visible-posts = PolicyScope.scope-with post-scope posts ctx
  page = PolicyScope.paginate 1 10 visible-posts
  info = PolicyScope.pagination-info 1 10 visible-posts

  println "Visible posts: ${page}"
  println "Pages: ${info.pages}"

  err = PolicyError.not-authorized "Post" :update "not the author"
  println (PolicyError.message err)

main

نظرة عامة على API

Policy.Core

مساعدات أساسية لدوال السياسة التي ترجع Result Bool PolicyError.

PolicyCore.can-with? policy resource context action
PolicyCore.may-with? policy resource context action

PolicyCore.allow
PolicyCore.deny
PolicyCore.allow-if condition
PolicyCore.deny-if condition
PolicyCore.no-rule action
PolicyCore.allow-or-deny condition resource-name reason action

مساعدات التحقق الأولي ترجع Option Bool: Some true يسمح، Some false يمنع، و None يستمر إلى القاعدة الرئيسية.

PolicyCore.admin-bypass is-admin? ctx
PolicyCore.owner-check is-owner? resource ctx
PolicyCore.first-pre-check [check1, check2, check3]

مساعدات الإجراءات توفر مجموعات إجراءات شائعة وأسماء مستعارة.

PolicyCore.crud-actions
PolicyCore.read-actions
PolicyCore.write-actions

PolicyCore.read-action? action
PolicyCore.write-action? action

PolicyCore.resolve-alias :new     # :create
PolicyCore.resolve-alias :edit    # :update
PolicyCore.resolve-alias :delete  # :destroy
PolicyCore.resolve-alias :view    # :show

مساعدات تركيب السياسة تجمع عدة نتائج تفويض.

PolicyCore.all-allowed? [result1, result2, result3]
PolicyCore.any-allowed? [result1, result2, result3]

Policy.Scope

مساعدات النطاق لتصفية المجموعات قبل إرجاع البيانات للمتصل.

PolicyScope.scope-with scope-fn items ctx
PolicyScope.filter-by predicate items

PolicyScope.is-owned-by? get-owner-id get-user-id item ctx
PolicyScope.is-published? get-published item
PolicyScope.is-in-state? get-state target-state item
PolicyScope.is-admin-or? check-admin fallback-check ctx item

التابعات المسندية مفيدة لبناء فحوصات نطاق قابلة لإعادة الاستخدام.

PolicyScope.both? pred1 pred2 item
PolicyScope.either? pred1 pred2 item
PolicyScope.not-matching? pred item

مساعدات الترقيم تستند إلى الفهرسة من 1.

page1 = PolicyScope.paginate 1 10 items
pages = PolicyScope.total-pages 10 items
info = PolicyScope.pagination-info 1 10 items

Policy.Error

أنواع الأخطاء والنتائج لأعطال التفويض.

type PolicyError =
  | NotAuthorized {resource: String, action: Keyword, reason: String}
  | RuleNotFound {action: Keyword}
  | ContextMissing {field: String}
  | PolicyNotFound {resource-type: String}
  | CustomError String

type FailureReason = FailureReason {
  policy: String,
  action: Keyword,
  details: String
}

type AuthResult =
  | Allowed
  | Denied String

الدوال المساعدة مصدرة من الوحدة، لذلك عند استيرادها باسم PolicyError يتم استدعاؤها كدوال وحدة.

PolicyError.not-authorized resource action reason
PolicyError.rule-not-found action
PolicyError.context-missing field
PolicyError.policy-not-found resource-type
PolicyError.custom message

PolicyError.message err
PolicyError.kind err
PolicyError.is-not-authorized? err
PolicyError.is-rule-not-found? err

PolicyError.new policy action
PolicyError.with-details policy action details
PolicyError.policy reason
PolicyError.action reason
PolicyError.details reason
PolicyError.format reason

PolicyError.allowed
PolicyError.denied reason
PolicyError.is-allowed? result
PolicyError.is-denied? result
PolicyError.reason result
PolicyError.to-result resource-name action result

ملاحظات التصميم

  • السياسات هي دوال عادية، لذا يسهل اختبارها وتركيبها.
  • التفويض صريح: المساعدات ترجع Result Bool PolicyError بدلاً من رمي الاستثناءات.
  • النطاقات منفصلة عن فحوصات السياسة بحيث يمكن تصفية القوائم قبل العرض أو التسلسل.
  • الإجراءات الشائعة تستخدم كلمات مفتاحية مثل :index, :show, :create, :update, و :destroy.
  • الحزمة غير مرتبطة بإطار معين ويمكن استخدامها مع أي كود لتطبيقات Kit.

التطوير

تشغيل الأمثلة

تشغيل مثال سياسة المدونة باستخدام المفسر:

kit run examples/blog-policy.kit

تجميع المثال إلى ثنائي أصلي:

kit build examples/blog-policy.kit && ./blog-policy

تشغيل الاختبارات

تشغيل مجموعة الاختبارات:

kit test

تشغيل مجموعة الاختبارات مع تغطية:

kit test --coverage

تشغيل kit dev

تشغيل سير العمل التطويري القياسي (تنسيق، فحص، اختبار):

kit dev

سيقوم هذا بما يلي:

  1. تنسيق وفحص ملفات المصدر في src/
  2. فحص أنواع الأمثلة في examples/
  3. تشغيل الاختبارات في tests/ مع تغطية

التحقق من توافق المفسر/المترجم

تشغيل فحوصات التطابق للأمثلة:

kit parity --failures-only

توليد التوثيق

توليد توثيق API من تعليقات التوثيق:

kit doc

ملاحظة: مصادر Kit التي تحتوي على تعليقات توثيق (##) ستولد مستندات HTML في docs/*.html.

تنظيف مخرجات البناء

إزالة الملفات المولدة وذاكرة التخزين المؤقت ومخرجات البناء:

kit task clean

ملاحظة: معرفة في kit.toml.

التثبيت المحلي

لتثبيت هذه الحزمة محلياً للتطوير:

kit install

هذا يقوم بتثبيت الحزمة في ~/.kit/packages/@kit/policy/، مما يجعلها متاحة للاستيراد كـ Kit.Policy في مشاريع أخرى.

الترخيص

هذه الحزمة مرخصة بموجب رخصة MIT - راجع LICENSE للتفاصيل.

الفئات