प्लगइन केस स्टडी: प्लगी – एली बेंडरस्कीची वेबसाइट

प्लगइन केस स्टडी: प्लगी – एली बेंडरस्कीची वेबसाइट


अलीकडेच मी Pluggy वर आलो, प्लगइन सिस्टम विकसित करण्यासाठी Python लायब्ररी. हे मूलतः भाग म्हणून विकसित केले गेले pytest प्रकल्प – त्याच्या समृद्ध प्लगइन इकोसिस्टमसाठी ओळखला जातो – आणि नंतर स्टँडअलोन लायब्ररीमध्ये काढला. तुम्हाला तुमच्या टूल किंवा लायब्ररीमध्ये प्लगइन सिस्टम जोडायची असल्यास आणि तुमच्या स्वत:चा रोल करण्याऐवजी सिद्ध केलेले काहीतरी वापरायचे असल्यास तुम्हाला प्लग्गीशी संपर्क साधावा लागेल.

या पोस्टमध्ये मी प्लगी कसे कार्य करते यावर काही टिपा सामायिक करेन आणि नंतर ते प्लगइन इन्फ्रास्ट्रक्चरच्या मूलभूत संकल्पनांशी कसे संरेखित होते याचे पुनरावलोकन करेन.

प्लगइन केस स्टडी: प्लगी – एली बेंडरस्कीची वेबसाइट

प्लगी वापरणे

च्या संकल्पनेभोवती प्लगी बांधले आहे हुक: फंक्शन्स जे होस्ट ऍप्लिकेशन्स किंवा टूल्स (येथून, फक्त “होस्ट”) एक्सपोज करतात आणि प्लगइन्स अंमलात आणतात. यजमान परत आलेल्या डेकोरेटरचा वापर करून हुक उघड करतो pluggy.HookspecMarker आणि एक प्लगइन या हुकमधून परत आलेल्या डेकोरेटरचा वापर करते pluggy.HookimplMarker.

प्लगीचे दस्तऐवजीकरण हे बऱ्यापैकी स्पष्ट करते; या पोस्टमध्ये, मी कसे अंमलात आणायचे ते दर्शवू htmlize माझ्या प्लगइन मालिकेतील मूळ लेखात सादर केलेले काही प्लगइन असलेले साधन.

आठवण म्हणून, htmlize हे एक टॉय टूल आहे जे restructuredText प्रमाणेच मार्कअप नोटेशन घेते आणि ते HTML मध्ये रूपांतरित करते. हे सानुकूल “भूमिका” हाताळण्यासाठी प्लगइनना समर्थन देते जसे:

some text :role:`customized text` and more text

तसेच प्लगइन जे संपूर्ण मजकूरावर अनियंत्रित प्रक्रिया करतात.

हुक परिभाषित करणे

आउट होस्ट दोन हुक परिभाषित करतो:

import pluggy

hookspec = pluggy.HookspecMarker("htmlize")

@hookspec(firstresult=True)
def htmlize_role_handler(role_name):
    """Return a function accepting role contents.

    The function will be called with a single argument - the role contents, and
    should return what the role gets replaced with.
    """
    pass

@hookspec
def htmlize_contents(post, db):
    """Return a function accepting full document contents.

    The function will be called with a single argument - the document contents
    (after paragraph splitting and role processing), and should return the
    transformed contents.
    """
    pass

कॉल करून एक हुक तयार केला जातो हुकस्पेक मार्कर प्रकल्पाच्या नावासह. या प्रकल्पाचे नाव होस्ट आणि त्याचे प्लगइन यांच्यात जुळले पाहिजे. हुक पॅरामीटर्स म्हणून काय स्वीकारतात आणि ते काय परत करतात याबद्दल प्लगी परवानगी आहे; जास्तीत जास्त लवचिकतेसाठी आणि मूळवर खरे राहण्यासाठी htmlize उदाहरणार्थ, आमचे हुक रिटर्न फंक्शन्स.

या सोबत हुकस्पेक मार्करहोस्ट देखील परिभाषित करतो a हुकिम्पलमार्कर त्याच नावाने:

hookimpl = pluggy.HookimplMarker("htmlize")

हे प्लगइन लोड झाल्यावर हुक जोडण्यासाठी वापरले जाते.

होस्टमध्ये प्लगइन लोड करत आहे

होस्टचे मुख्य फंक्शन स्टार्टअपवर खालीलप्रमाणे प्लगइन लोड करते:

pm = pluggy.PluginManager("htmlize")
pm.add_hookspecs(hookspecs)
pm.load_setuptools_entrypoints("htmlize")

हुकस्पेक्स आमचे पायथन मॉड्यूल आहे ज्यामध्ये वर दर्शविलेले हुक आहेत.
load_setuptools_entrypoints प्लगइन लोड करण्यासाठी प्लगीचा मदतनीस आहे pip-समान वातावरणात स्थापित आणि सेटअप टूल्स एंट्री पॉइंट म्हणून नोंदणीकृत. हे सिग्नल करण्याचा एक मार्ग आहे – एखाद्याच्या मध्ये setup.py किंवा pyproject.toml फाइल – काही मेटाडेटा ज्याचे प्रोजेक्ट रनटाइममध्ये पुनरावलोकन करू शकतात. आमच्या प्रकल्पात, प्लगइन या विभागात स्वतःची नोंदणी करतात pyproject.toml फाइल:

(project.entry-points.htmlize)
tt = "tt"

हे म्हणतात “प्रवेश बिंदूसाठी htmlizeनावाची नवीन नोंद परिभाषित करा tt“. प्लगीज load_setuptools_entrypoints नंतर ही माहिती ऍक्सेस करण्यासाठी importlib.metadata वापरते.

लक्षात ठेवा की प्लगीला ही यंत्रणा वापरण्याची आवश्यकता नाही. यजमान त्यांना हवी असलेली कोणतीही प्लगइन शोध पद्धत लागू करू शकतात आणि त्यांच्यामध्ये थेट प्लगइन जोडू शकतात
प्लगइन मॅनेजर सह नोंदणी करा पद्धत पण यासाठी वापरली जाणारी यंत्रणा आहे pytest आणि इतर अनेक प्रकल्प; हे स्थापित केलेले प्लगइन स्वयंचलितपणे शोधणे आणि नोंदणी करणे खूप सोपे करते pip आणि समतुल्य साधने.

प्लगइन्सची विनंती करत आहे

एकदा प्लगइन मॅनेजर प्लगइन लोड करते, त्यांना आवाहन करणे सोपे आहे; कसे ते येथे आहे htmlize सामग्री हुक आमंत्रित करते:

# Build full contents back again, and ask plugins to act on
# contents.
contents = ''.join(parts)
for handler in plugin_manager.hook.htmlize_contents(post=post, db=db):
    contents = handler(contents)
return contents

साधारणपणे, हुक इनव्होकेशन रिटर्न a यादी वेगवेगळ्या प्लगइन्सद्वारे जोडलेल्या सर्व हुकपैकी (एकाच होस्ट ऍप्लिकेशनमध्ये एकाधिक प्लगइन स्थापित केले जाऊ शकतात आणि त्याच हुकला जोडले जाऊ शकतात). जेव्हा होस्ट वर दर्शविल्याप्रमाणे हुक लावतो तेव्हा डीफॉल्ट ऑर्डर LIFO असते, परंतु प्लगइन हुक पर्यायांसह प्रभावित करू शकतात. प्रथम प्रयत्न करा आणि ट्रायलास्ट.

प्लगइनमध्ये हुक लागू करणे

येथे आमचे संपूर्ण आहे narcissist सामग्री हुकशी संलग्न असलेले प्लगइन:

import htmlize

@htmlize.hookimpl
def htmlize_contents(post, db):
    repl = f'I ({post.author})'

    def hook(contents):
        return re.sub(r'\bI\b', repl, contents)

    return hook

काही टिपा:

  • अपेक्षा करतो htmlize स्थापित करणे; आधी चर्चा केल्याप्रमाणे, आम्ही Pluggy च्या डीफॉल्ट इंस्टॉल-आधारित पध्दतीवर अवलंबून आहोत जेथे होस्ट आणि प्लगइन दोन्ही एकाच Python वातावरणात स्थापित केले जातात आणि अशा प्रकारे एकमेकांना शोधू शकतात. तथापि, प्लगी कोणत्याही सानुकूल शोध पद्धतीचे समर्थन करते.
  • ते वापरते हुकिमप्ल पूर्वी दर्शविलेले निर्यात मूल्य.
  • हे एक फंक्शन देते जे सामग्रीवर कार्य करते; हे आहे htmlize-विशिष्ट करार (एबीआय, जर तुम्ही कराल) आम्ही आधी चर्चा केली आहे.

या केस स्टडीमधील मूलभूत प्लगइन संकल्पना

Pluggy चा हा केस स्टडी या ब्लॉगवर अनेक वेळा कव्हर केलेल्या मूलभूत प्लगइन संकल्पनांवर कसा उपाय करतो ते पाहू या.

हे लक्षात ठेवणे महत्त्वाचे आहे की प्लगी हा बेस्पोक प्लगइन प्रणालीसह विशिष्ट होस्ट अनुप्रयोग नाही; त्याऐवजी, अशा प्लगइन सिस्टम तयार करण्यासाठी ही एक पुन्हा वापरता येण्याजोगी लायब्ररी आहे. म्हणून, हे अधिक आहे मेटा केस स्टडी.

शोध

साधारणपणे, प्लगी शोध तर्कशास्त्र वापरकर्त्याच्या विवेकबुद्धीनुसार सोडते. त्याची
प्लगइन मॅनेजर आहे नोंदणी करा प्लगइन जोडण्याची पद्धत, आणि हे अनुप्रयोग निवडलेल्या कोणत्याही मार्गाने शोधले जाऊ शकते.

असे म्हटले आहे की, Pluggy वर दर्शविल्याप्रमाणे, Python पॅकेजिंगच्या एंट्री पॉइंट प्रक्रियेद्वारे – एक शोध यंत्रणा अंगभूत आहे. मोठ्या संख्येने ऍप्लिकेशन्ससाठी हे अत्यंत सोयीचे आहे, जोपर्यंत ऍप्लिकेशन आणि त्याचे प्लगइन दोन्ही मानक पायथन पॅकेजिंग टूल्सद्वारे स्थापित केले जातात (जे पायथन इकोसिस्टममध्ये एक अतिशय वाजवी गृहीतक आहे).

नोंदणी

एंट्री पॉइंट प्रक्रियेत, प्लगइन्स a जोडून स्वतःची नोंदणी करतात
(project.entry-points.) त्यांच्या मध्ये विभाग pyproject.toml
फाइल

अन्यथा – मागील विभागाप्रमाणे – वापरकर्ते त्यांच्या स्वतःच्या नोंदणी योजना तयार करण्यास मोकळे आहेत.

हुक

हे एक सोपे आहे, कारण ते म्हणतात हुक प्लगी भाषेतही! प्लगइन्स सेट करण्यासाठी प्लगइन्ससाठी फंक्शन डेकोरेटर्ससह, हुकची अंमलबजावणी खूपच सुंदर आहे. याचे उदाहरण आपण वर पाहिले आहे
@htmlize.hookimpl सजावट htmlize_contents.

प्लगइनवर अनुप्रयोग API उघड करणे

Pluggy हे Python होस्ट आणि Python प्लगइनसाठी डिझाइन केलेले असल्याने, हे अगदी सरळ आहे. प्लगइन्स सहसा असे गृहीत धरतात की होस्ट प्रोजेक्ट आधीपासूनच पायथन वातावरणात स्थापित केलेला आहे आणि त्याचे मॉड्यूल आयात केले जाऊ शकतात.

आमच्या उदाहरणात, हुकिमप्ल पासून आयात केले जाते htmlize हे पूर्ण करण्यासाठी प्लगइनद्वारे. हे प्लगइनवर होस्ट डेटा कसा पास केला जातो हे देखील दर्शविते – द
पोस्ट आणि db पॅरामीटर्स हे प्लगइन्सच्या वापरासाठी होस्टद्वारे उघड केलेले API आहेत.

निष्कर्ष – प्लगी हे योग्य आहे का?

प्लगइन इन्फ्रास्ट्रक्चर पोस्टच्या माझ्या मूळ मूलभूत संकल्पनांच्या तळटीप 2 मध्ये, मी लिहिले:

त्यामुळेच कदाचित फार कमी सु-स्थापित प्लगइन फ्रेमवर्क अस्तित्वात आहेत (अगदी C किंवा C++ सारख्या निम्न-स्तरीय भाषांमध्येही). आपले स्वतःचे रोल करणे खूप सोपे (आणि मोहक) आहे.

मला अजूनही विश्वास आहे की माझे विधान सत्य आहे – प्लगइन फ्रेमवर्क तयार करणे खूप सोपे आहे आणि ते प्रदान केलेली कार्यक्षमता त्यांच्या मोठ्या पृष्ठभागाच्या तुलनेत तुलनेने लहान आहे. दुसऱ्या शब्दांत, हे ए उथळ API.

ते म्हणाले, प्लगइनच्या अधिक प्रगत वापरांसाठी प्लगी काही छान कार्यक्षमता प्रदान करते:

  • स्वयंचलित एंट्री पॉइंट नोंदणी यंत्रणा – जर तुम्हाला त्याची गरज असेल
  • स्वाक्षरी प्रमाणीकरण
  • एकाच प्लगइनमधील एकाधिक हुक संलग्नकांवर आणि अनेक प्लगइनवर सातत्यपूर्ण प्लगइन परिणाम संग्रह
  • सह ऑर्डरिंग प्लगइन पहिला परिणाम, प्रथम प्रयत्न करा, ट्रायलास्टइ.
  • काही विशेष वापराच्या प्रकरणांसाठी हुक “रॅपर्स”.

तुमच्या प्रकल्पासाठी हे फायदेशीर आहेत का? हे खरोखर प्रकल्पावर अवलंबून असते, आणि अवलंबित्व आणि प्रकल्प प्रयत्न यांच्यातील ट्रेडऑफ लक्षात ठेवणे नेहमीच फायदेशीर असते.



Source link

Postagens Similares

  • AI SaaS-ersättning är eldens eld

    Lagt till i mina påminnelser denna vecka: Avbryt Zapier Avbryt Skicka igen Avbryt Figma Avbryt Canva Avbryt Browserbase Avbryt Supabase Återskapade allt detta i min egen PAI-sele med olika repos, mina egna färdigheter/arbetsflöden/CLI:er och CC. Så rolig och befriande känsla. Det intressanta här är att ställa frågan om vilka verktyg/tjänster jag kommer att behålla. Idag,…

  • 無制限に寄付する

    2021年3月 非営利の世界の密かな呪いは、寄付の制限です。非営利団体に関わったことがない人は、このフレーズを聞いたことがないかもしれません。しかし、もしあなたがそうしたことがあるなら、おそらくひるむでしょう。 制限付き寄付とは、寄付者がそのお金でできることを制限する寄付を意味します。これは多額の寄付によく見られることであり、おそらくデフォルトです。それでも、それは通常悪い考えです。通常、寄付者が望む資金の使い方は、非営利団体が選択する方法ではありません。そうでなければ寄付を制限する必要はなかったでしょう。しかし、お金がどこに使われる必要があるのか​​について、非営利団体と寄付者ではどちらがよりよく理解しているでしょうか? 非営利団体が資金をどこに使う必要があるのか​​を寄付者よりもよく理解していない場合、その非営利団体は無能であり、まったく寄付をすべきではありません。 つまり、制限された寄付は本質的に最適ではないということです。それは悪質な非営利団体への寄付か、間違ったものへの寄付のどちらかです。 この原則にはいくつかの例外があります。 1 つは、非営利団体が包括的な組織である場合です。たとえば、大学は名目上単一の非営利団体にすぎないため、大学に制限付きの寄付を行うことは合理的です。もう 1 つの例外は、資金がどこに使われる必要があるかについて、寄付者が非営利団体と同じくらい実際に知っている場合です。たとえば、ゲイツ財団には特定の目標があり、それを達成するために個々の非営利団体に限定的な寄付を行うことがよくあります。ただし、あなた自身がドメインの専門家であるか、包括的な組織に寄付している場合を除き、寄付は制限がなかったほうがより効果的です。 制限付きの寄付が制限なしの寄付よりも効果が低い場合、なぜ寄付者はこれほど頻繁に寄付を行うのでしょうか?一つには、善を行うことが寄付者の唯一の動機ではないからです。多くの場合、彼らは他の動機も持っています – 名を残すため、または良い評判を生み出すため (1)、または規制や企業ポリシーに準拠するため。多くの寄付者は、制限付き寄付と制限なし寄付の区別をまったく考えたこともなかったかもしれません。彼らは、特定の目的のためにお金を寄付することが寄付の仕組みだと信じているかもしれません。そして公平を期すために言うと、非営利団体はそのような幻想を阻止しようとあまり努力していません。彼らにはそんな余裕はない。非営利団体を運営している人は、ほとんどの場合、お金のことを心配しています。彼らには大口寄付者に口答えする余裕はない。 これほど非対称な関係では率直さを期待することはできません。そこで、非営利団体があなたに伝えたいことをお話しします。非営利団体に寄付したい場合は、無制限に寄付してください。お金の使い方を彼らに任せるなら、その使い方も彼らに決めてもらいましょう。 注記 (1) 残念ながら、制限付きの寄付は、制限なしの寄付よりも注目を集める傾向があります。 「X はアフリカに学校を建設するために資金を寄付します」は、「X が Y の非営利団体に資金を寄付し、Y の選択に合わせて使用​​します」よりも興味深いだけでなく、X により多くの注目を集めます。 ありがとう この草稿を読んでくれたチェイス・アダム、イングリッド・バセット、トレバー・ブラックウェル、エディス・エリオットに感謝します。 Source link

  • Größenchaos

    Um die mittleren Körperproportionen der erwachsenen Frauen in den USA hervorzuheben, haben wir uns auf anthropometrische Referenzdaten für Kinder und Erwachsene gestützt, die regelmäßig vom National Center for Health Statistics im US-Gesundheitsministerium veröffentlicht werden. Für diese Geschichte haben wir Daten zum mittleren Taillenumfang von Frauen und Mädchen herangezogen, die zwischen 2021 und 2023 gesammelt wurden….

  • Chrome 137-এ Gemini Nano: AI ইঞ্জিনিয়ারদের জন্য নোট

    শেষ পর্যন্ত, জেমিনি ন্যানো প্রায় সমস্ত ক্রোম ব্যবহারকারীদের জন্য এখানে (আমাকে মূলত ভুল জানানো হয়েছিল যে এটি ক্রোম 138-এ ছিল – কিন্তু আমি আমার নিজের তথ্য পরীক্ষা করেছি এবং ক্রোম 137+ থেকে এটি সীমিত পরিস্থিতিতে ফ্ল্যাগ ছাড়াই পাঠানো শুরু হয়েছে)। আমি এই HN পোস্ট দ্বারা মনে করিয়ে দেওয়া হয়েছে. আমি আশা করি এটি বছরের শেষ…

Deixe um comentário

O seu endereço de email não será publicado. Campos obrigatórios marcados com *