From 90db5293918a8ff9cc958ed64b6e10a6e9292111 Mon Sep 17 00:00:00 2001 From: Ivan Maslov Date: Sun, 21 Feb 2021 20:59:46 +0300 Subject: [PATCH] Update Sphinx - look Wiki/ENG_Guide/HTML/index.html --- .../Orchestrator/01_Orchestrator.rst | 59 ++-- Sources/GuideSphinx/Orchestrator/02_Defs.rst | 32 ++ ...sTemplate.rst => 03_gSettingsTemplate.rst} | 2 +- .../{HowToStart.rst => 04_HowToStart.rst} | 2 +- Sources/GuideSphinx/conf.py | 2 +- Sources/GuideSphinx/index.rst | 6 +- .../Orchestrator/__Orchestrator__.py | 152 ++++++++- .../Orchestrator/01_Orchestrator.doctree | Bin 0 -> 14288 bytes .../doctrees/Orchestrator/02_Defs.doctree | Bin 0 -> 248211 bytes .../Orchestrator/03_gSettingsTemplate.doctree | Bin 0 -> 42654 bytes .../Orchestrator/04_HowToStart.doctree | Bin 0 -> 9873 bytes Wiki/ENG_Guide/html/.buildinfo | 2 +- .../html/Orchestrator/01_Orchestrator.html | 295 ++++++++++++++++++ .../{Orchestrator.html => 02_Defs.html} | 270 ++++++++++------ ...emplate.html => 03_gSettingsTemplate.html} | 23 +- .../{HowToStart.html => 04_HowToStart.html} | 21 +- Wiki/ENG_Guide/html/Robot/Robot.html | 12 +- Wiki/ENG_Guide/html/Studio/Studio.html | 11 +- Wiki/ENG_Guide/html/_modules/index.html | 7 +- .../Orchestrator/__Orchestrator__.html | 279 ++++++++++++----- .../Orchestrator/01_Orchestrator.rst.txt | 59 ++-- .../_sources/Orchestrator/02_Defs.rst.txt | 32 ++ ...e.rst.txt => 03_gSettingsTemplate.rst.txt} | 2 +- ...wToStart.rst.txt => 04_HowToStart.rst.txt} | 2 +- Wiki/ENG_Guide/html/_sources/index.rst.txt | 6 +- Wiki/ENG_Guide/html/genindex.html | 105 ++++--- Wiki/ENG_Guide/html/index.html | 30 +- Wiki/ENG_Guide/html/objects.inv | Bin 854 -> 886 bytes Wiki/ENG_Guide/html/py-modindex.html | 9 +- Wiki/ENG_Guide/html/search.html | 7 +- Wiki/ENG_Guide/html/searchindex.js | 2 +- .../markdown/Orchestrator/01_Orchestrator.md | 82 +++++ .../{Orchestrator.md => 02_Defs.md} | 258 +++++++++------ ...ngsTemplate.md => 03_gSettingsTemplate.md} | 4 +- .../{HowToStart.md => 04_HowToStart.md} | 2 +- Wiki/ENG_Guide/markdown/index.md | 33 +- 36 files changed, 1358 insertions(+), 450 deletions(-) rename Wiki/ENG_Guide/html/_sources/Orchestrator/Orchestrator.rst.txt => Sources/GuideSphinx/Orchestrator/01_Orchestrator.rst (70%) create mode 100644 Sources/GuideSphinx/Orchestrator/02_Defs.rst rename Sources/GuideSphinx/Orchestrator/{gSettingsTemplate.rst => 03_gSettingsTemplate.rst} (82%) rename Sources/GuideSphinx/Orchestrator/{HowToStart.rst => 04_HowToStart.rst} (89%) create mode 100644 Wiki/ENG_Guide/doctrees/Orchestrator/01_Orchestrator.doctree create mode 100644 Wiki/ENG_Guide/doctrees/Orchestrator/02_Defs.doctree create mode 100644 Wiki/ENG_Guide/doctrees/Orchestrator/03_gSettingsTemplate.doctree create mode 100644 Wiki/ENG_Guide/doctrees/Orchestrator/04_HowToStart.doctree create mode 100644 Wiki/ENG_Guide/html/Orchestrator/01_Orchestrator.html rename Wiki/ENG_Guide/html/Orchestrator/{Orchestrator.html => 02_Defs.html} (82%) rename Wiki/ENG_Guide/html/Orchestrator/{gSettingsTemplate.html => 03_gSettingsTemplate.html} (97%) rename Wiki/ENG_Guide/html/Orchestrator/{HowToStart.html => 04_HowToStart.html} (93%) rename Sources/GuideSphinx/Orchestrator/Orchestrator.rst => Wiki/ENG_Guide/html/_sources/Orchestrator/01_Orchestrator.rst.txt (70%) create mode 100644 Wiki/ENG_Guide/html/_sources/Orchestrator/02_Defs.rst.txt rename Wiki/ENG_Guide/html/_sources/Orchestrator/{gSettingsTemplate.rst.txt => 03_gSettingsTemplate.rst.txt} (82%) rename Wiki/ENG_Guide/html/_sources/Orchestrator/{HowToStart.rst.txt => 04_HowToStart.rst.txt} (89%) create mode 100644 Wiki/ENG_Guide/markdown/Orchestrator/01_Orchestrator.md rename Wiki/ENG_Guide/markdown/Orchestrator/{Orchestrator.md => 02_Defs.md} (79%) rename Wiki/ENG_Guide/markdown/Orchestrator/{gSettingsTemplate.md => 03_gSettingsTemplate.md} (99%) rename Wiki/ENG_Guide/markdown/Orchestrator/{HowToStart.md => 04_HowToStart.md} (99%) diff --git a/Wiki/ENG_Guide/html/_sources/Orchestrator/Orchestrator.rst.txt b/Sources/GuideSphinx/Orchestrator/01_Orchestrator.rst similarity index 70% rename from Wiki/ENG_Guide/html/_sources/Orchestrator/Orchestrator.rst.txt rename to Sources/GuideSphinx/Orchestrator/01_Orchestrator.rst index b94fc25c..6004515a 100644 --- a/Wiki/ENG_Guide/html/_sources/Orchestrator/Orchestrator.rst.txt +++ b/Sources/GuideSphinx/Orchestrator/01_Orchestrator.rst @@ -1,6 +1,6 @@ -************************ -Description -************************ +#################################### +1. Description +#################################### pyOpenRPA Orchestrator is the executable process. @@ -9,8 +9,9 @@ The features of the orchestrator is: - Automatized robots control (customized algorithms, robots scheduling) - Source code mega flexibility: Light Orchestrator architecture is good for own customization +************************************ Global settings dict concept -################################## +************************************ pyOpenRPA project is complex tool which consist of several executable modules such as Robot, Orchestrator, Studio, Because of module compexity, we use 1 init arg - inGSettings @@ -18,9 +19,9 @@ inGSettings is a complex dictionary which has all reqired parameters for the mod The description of the GSettings you can find in executable module details. - +************************************ Orchestrator how to configure -################################## +************************************ To init pyOpenRPA Orchestrator instance use script: @@ -31,12 +32,10 @@ Orchestrator.Orchestrator(inGSettings=gSettings) # Call the orchestrator def gSettings structure -:ref:`gSettingsTemplate`. - - +************************************ Orchestrator architecture -################################## +************************************ Orchestrator has several source code components: - User/robot activity consolidated queue single thread (Processor) - User/robot activity asynchonus many threads (Processor) @@ -49,16 +48,19 @@ Orchestrator has several source code components: Below you can find more information about all of the component. +*************************** Component Processor -################################## +*************************** Sync - Append activity list to consolidated processor queue. Execution goes sequency by the activity list order Async - Create New thread to execute the activity list - Activity list -Liast of the activity item + +List of the activity item - Activity item + Activity item is universal mechanism to execute different algorythms from any sources. The core feature of the Activity is to call python defs with args and kwargs. If you need to init do some activity you can write some python def, then create Activity item with current def. @@ -66,16 +68,23 @@ ATTENTION: In some cases (such as web transmition), when you can't transmit pyth ?Why i cant transmit python def from the web Because the WEB space is not the Python executable space. Interaction between it spaces create by JSON protocol. So, we know than JSON apply int, float, str, bool, None, list, dict - that is all. -{ - "Def":"DefAliasTest", # def link or def alias (look gSettings["Processor"]["AliasDefDict"]) - "ArgList":[1,2,3], # Args list - "ArgDict":{"ttt":1,"222":2,"dsd":3}, # Args dictionary - "ArgGSettings": None # Name of GSettings attribute: str (ArgDict) or index (for ArgList) - "ArgLogger": None # Name of GSettings attribute: str (ArgDict) or index (for ArgList) -}# Pay attention! Do not left comma symbol after the end of the dict - it can be interpretated like a turple.. - - -pyOpenRPA Orchestrator -################################## -.. automodule:: pyOpenRPA.Orchestrator.__Orchestrator__ - :members: \ No newline at end of file + +.. note:: + Example + { + "Def":"DefAliasTest", # def link or def alias (look gSettings["Processor"]["AliasDefDict"]) + "ArgList":[1,2,3], # Args list + "ArgDict":{"ttt":1,"222":2,"dsd":3}, # Args dictionary + "ArgGSettings": None # Name of GSettings attribute: str (ArgDict) or index (for ArgList) + "ArgLogger": None # Name of GSettings attribute: str (ArgDict) or index (for ArgList) + }# Pay attention! Do not left comma symbol after the end of the dict - it can be interpretated like a turple.. + + +********** +References +********** + +`Python-sphinx`_ + +.. target-notes:: +.. _`reStructuredText`: http://docutils.sourceforge.net/rst.html diff --git a/Sources/GuideSphinx/Orchestrator/02_Defs.rst b/Sources/GuideSphinx/Orchestrator/02_Defs.rst new file mode 100644 index 00000000..2be63177 --- /dev/null +++ b/Sources/GuideSphinx/Orchestrator/02_Defs.rst @@ -0,0 +1,32 @@ +#################################### +2. Defs +#################################### + +************************************************** +pyOpenRPA.Orchestrator.__Orchestrator__ +************************************************** + +.. code-block:: python + + # EXAMPLE 1 + from pyOpenRPA import Orchestrator + Orchestrator.OSCMD(inCMDStr = "git status", inRunAsyncBool=True) + + # EXAMPLE 2 + from pyOpenRPA.Orchestrator import __Orchestrator__ + __Orchestrator__.OSCMD(inCMDStr = "git status", inRunAsyncBool=True) + + + +.. automodule:: pyOpenRPA.Orchestrator.__Orchestrator__ + :members: + + +********** +References +********** + +`Python-sphinx`_ + +.. target-notes:: +.. _`reStructuredText`: http://docutils.sourceforge.net/rst.html diff --git a/Sources/GuideSphinx/Orchestrator/gSettingsTemplate.rst b/Sources/GuideSphinx/Orchestrator/03_gSettingsTemplate.rst similarity index 82% rename from Sources/GuideSphinx/Orchestrator/gSettingsTemplate.rst rename to Sources/GuideSphinx/Orchestrator/03_gSettingsTemplate.rst index a99645f5..4efe8d47 100644 --- a/Sources/GuideSphinx/Orchestrator/gSettingsTemplate.rst +++ b/Sources/GuideSphinx/Orchestrator/03_gSettingsTemplate.rst @@ -1,6 +1,6 @@ .. _gSettingsTemplate: ************************ -gSettings Template +3. gSettings Template ************************ gSettings structure diff --git a/Sources/GuideSphinx/Orchestrator/HowToStart.rst b/Sources/GuideSphinx/Orchestrator/04_HowToStart.rst similarity index 89% rename from Sources/GuideSphinx/Orchestrator/HowToStart.rst rename to Sources/GuideSphinx/Orchestrator/04_HowToStart.rst index e704cc56..66e056d7 100644 --- a/Sources/GuideSphinx/Orchestrator/HowToStart.rst +++ b/Sources/GuideSphinx/Orchestrator/04_HowToStart.rst @@ -1,5 +1,5 @@ ************************ -How to start +4. How to start ************************ Start configuration example diff --git a/Sources/GuideSphinx/conf.py b/Sources/GuideSphinx/conf.py index c2a7a4b2..2b8ef4ca 100644 --- a/Sources/GuideSphinx/conf.py +++ b/Sources/GuideSphinx/conf.py @@ -31,7 +31,7 @@ release = 'v1.2.0' # Add any Sphinx extension module names here, as strings. They can be # extensions coming with Sphinx (named 'sphinx.ext.*') or your custom # ones. -extensions = ['sphinx.ext.todo', 'sphinx.ext.viewcode', 'sphinx.ext.autodoc', "sphinx_rtd_theme",] +extensions = ['sphinx.ext.todo', 'sphinx.ext.viewcode', 'sphinx.ext.autodoc', 'sphinx.ext.autosummary', "sphinx_rtd_theme",] # Add any paths that contain templates here, relative to this directory. templates_path = ['_templates'] diff --git a/Sources/GuideSphinx/index.rst b/Sources/GuideSphinx/index.rst index d91941ab..81357a57 100644 --- a/Sources/GuideSphinx/index.rst +++ b/Sources/GuideSphinx/index.rst @@ -10,7 +10,6 @@ Welcome to pyOpenRPA's documentation! :maxdepth: 2 :caption: GENERAL :glob: - :titlesonly: * @@ -18,7 +17,6 @@ Welcome to pyOpenRPA's documentation! :maxdepth: 2 :caption: ROBOT :glob: - :titlesonly: Robot/* @@ -26,14 +24,12 @@ Welcome to pyOpenRPA's documentation! :maxdepth: 2 :caption: STUDIO :glob: - :titlesonly: Studio/* .. toctree:: - :maxdepth: 2 + :maxdepth: 3 :caption: ORCHESTRATOR :glob: - :titlesonly: Orchestrator/* \ No newline at end of file diff --git a/Sources/pyOpenRPA/Orchestrator/__Orchestrator__.py b/Sources/pyOpenRPA/Orchestrator/__Orchestrator__.py index 710ea456..0d2f269a 100644 --- a/Sources/pyOpenRPA/Orchestrator/__Orchestrator__.py +++ b/Sources/pyOpenRPA/Orchestrator/__Orchestrator__.py @@ -31,6 +31,11 @@ def AgentActivityItemAdd(inGSettings, inHostNameStr, inUserStr, inActivityItemDi """ Add activity in AgentDict. Check if item is created + .. code-block:: python + + # USAGE + import this + :param inGSettings: Global settings dict (singleton) :param inHostNameStr: Agent host name :param inUserStr: User login, where agent is based @@ -480,9 +485,27 @@ def GSettingsKeyListValueAppend(inGSettings, inValue, inKeyList=None): """ Append value in GSettings by the key list + .. code-block:: python + + # USAGE + from pyOpenRPA import Orchestrator + + Orchestrator.GSettingsKeyListValueAppend( + inGSettings = gSettings, + inValue = "NewValue", + inKeyList=["NewKeyDict","NewKeyList"]): + # result inGSettings: { + # ... another keys in gSettings ..., + # "NewKeyDict":{ + # "NewKeyList":[ + # "NewValue" + # ] + # } + #} + :param inGSettings: Global settings dict (singleton) - :param inValue: - :param inKeyList: + :param inValue: Any value to be appended in gSettings Dict by the key list + :param inKeyList: List of the nested keys (see example) :return: True every time """ if inKeyList is None: inKeyList = [] @@ -499,11 +522,32 @@ def GSettingsKeyListValueAppend(inGSettings, inValue, inKeyList=None): def GSettingsKeyListValueOperatorPlus(inGSettings, inValue, inKeyList=None): """ - Operator plus value in GSettings by the key list + Execute plus operation between 2 lists (1:inValue and 2:gSettings by the inKeyList) + + .. code-block:: python + + # USAGE + from pyOpenRPA import Orchestrator + + Orchestrator.GSettingsKeyListValueOperatorPlus( + inGSettings = gSettings, + inValue = [1,2,3], + inKeyList=["NewKeyDict","NewKeyList"]): + # result inGSettings: { + # ... another keys in gSettings ..., + # "NewKeyDict":{ + # "NewKeyList":[ + # "NewValue", + # 1, + # 2, + # 3 + # ] + # } + #} :param inGSettings: Global settings dict (singleton) - :param inValue: - :param inKeyList: + :param inValue: List with values to be merged with list in gSettings + :param inKeyList: List of the nested keys (see example) :return: True every time """ if inKeyList is None: inKeyList = [] @@ -521,12 +565,27 @@ def GSettingsKeyListValueOperatorPlus(inGSettings, inValue, inKeyList=None): def ProcessorAliasDefCreate(inGSettings, inDef, inAliasStr=None): """ Create alias for def (can be used in ActivityItem in field Def) + !WHEN DEF ALIAS IS REQUIRED! - Def alias is required when you try to call Python def from the Orchestrator WEB side (because you can't transmit Python def object out of the Python environment) + + .. code-block:: python + + # USAGE + from pyOpenRPA import Orchestrator + + def TestDef(): + pass + lAliasStr = Orchestrator.ProcessorAliasDefCreate( + inGSettings = gSettings, + inDef = TestDef, + inAliasStr="TestDefAlias") + # Now you can call TestDef by the alias from var lAliasStr with help of ActivityItem (key Def = lAliasStr) :param inGSettings: Global settings dict (singleton) - :param inDef: - :param inAliasStr: - :return: str Alias + :param inDef: Def + :param inAliasStr: String alias for associated def + :return: str Alias string (Alias can be regenerated if previous alias was occupied) """ + #TODO Pay attention - New alias can be used too - need to create more complex algorythm to create new alias! lL = inGSettings["Logger"] if inAliasStr is None: inAliasStr = str(inDef) # Check if key is not exists @@ -538,12 +597,26 @@ def ProcessorAliasDefCreate(inGSettings, inDef, inAliasStr=None): def ProcessorAliasDefUpdate(inGSettings, inDef, inAliasStr): """ - Update alias for def (can be used in ActivityItem in field Def) + Update alias for def (can be used in ActivityItem in field Def). + !WHEN DEF ALIAS IS REQUIRED! - Def alias is required when you try to call Python def from the Orchestrator WEB side (because you can't transmit Python def object out of the Python environment) + + .. code-block:: python + + # USAGE + from pyOpenRPA import Orchestrator + + def TestDef(): + pass + Orchestrator.ProcessorAliasDefUpdate( + inGSettings = gSettings, + inDef = TestDef, + inAliasStr="TestDefAlias") + # Now you can call TestDef by the alias "TestDefAlias" with help of ActivityItem (key Def = "TestDefAlias") :param inGSettings: Global settings dict (singleton) - :param inDef: - :param inAliasStr: - :return: str Alias + :param inDef: Def + :param inAliasStr: String alias for associated def + :return: str Alias string """ if callable(inDef): inGSettings["ProcessorDict"]["AliasDefDict"][inAliasStr] = inDef else: raise Exception(f"pyOpenRPA Exception: You can't use Orchestrator.ProcessorAliasDefUpdate with arg 'inDef' string value. inDef is '{inDef}', inAliasStr is '{inAliasStr}'") @@ -553,11 +626,56 @@ def ProcessorActivityItemCreate(inDef, inArgList=None, inArgDict=None, inArgGSet """ Create ActivityItem - :param inDef: - :param inArgList: - :param inArgDict: - :param inArgGSettingsStr: - :param inArgLoggerStr: + .. code-block:: python + + # USAGE + from pyOpenRPA import Orchestrator + + # EXAMPLE 1 + def TestDef(inArg1Str, inGSettings, inLogger): + pass + lActivityItem = Orchestrator.ProcessorActivityItemCreate( + inDef = TestDef, + inArgList=[], + inArgDict={"inArg1Str": "ArgValueStr"}, + inArgGSettingsStr = "inGSettings", + inArgLoggerStr = "inLogger") + # lActivityItem: + # { + # "Def":TestDef, + # "ArgList":inArgList, + # "ArgDict":inArgDict, + # "ArgGSettings": "inArgGSettings", + # "ArgLogger": "inLogger" + # } + + # EXAMPLE 2 + def TestDef(inArg1Str): + pass + Orchestrator.ProcessorAliasDefUpdate( + inGSettings = gSettings, + inDef = TestDef, + inAliasStr="TestDefAlias") + lActivityItem = Orchestrator.ProcessorActivityItemCreate( + inDef = "TestDefAlias", + inArgList=[], + inArgDict={"inArg1Str": "ArgValueStr"}, + inArgGSettingsStr = None, + inArgLoggerStr = None) + # lActivityItem: + # { + # "Def":"TestDefAlias", + # "ArgList":inArgList, + # "ArgDict":inArgDict, + # "ArgGSettings": None, + # "ArgLogger": None + # } + + :param inDef: def link or def alias (look gSettings["Processor"]["AliasDefDict"]) + :param inArgList: Args list for the Def + :param inArgDict: Args dict for the def + :param inArgGSettingsStr: Name of def argument of the GSettings dict + :param inArgLoggerStr: Name of def argument of the logging object :return: {} """ if inArgList is None: inArgList=[] diff --git a/Wiki/ENG_Guide/doctrees/Orchestrator/01_Orchestrator.doctree b/Wiki/ENG_Guide/doctrees/Orchestrator/01_Orchestrator.doctree new file mode 100644 index 0000000000000000000000000000000000000000..30351a56190a52a47ebbf7a7f418121317bd3fb3 GIT binary patch literal 14288 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 A4FCWD literal 0 HcmV?d00001 diff --git a/Wiki/ENG_Guide/doctrees/Orchestrator/03_gSettingsTemplate.doctree b/Wiki/ENG_Guide/doctrees/Orchestrator/03_gSettingsTemplate.doctree new file mode 100644 index 0000000000000000000000000000000000000000..ad408c0aca9359036c882bbfef2cb7014927506a GIT binary patch literal 42654 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 Yoo1glgBOAW$?BmDmEIr&E$y`a54@@RUH||9 literal 0 HcmV?d00001 diff --git a/Wiki/ENG_Guide/doctrees/Orchestrator/04_HowToStart.doctree b/Wiki/ENG_Guide/doctrees/Orchestrator/04_HowToStart.doctree new file mode 100644 index 0000000000000000000000000000000000000000..6a8e829440f62ad7ca36002b22e282af70786002 GIT binary patch literal 9873 zcmeHN>2Djk70=~M@sXq1FG&hoX&3gcHTGuHqMO!59XZJwNo2#8(*m(E7|l=`)}!H+ zzYEIhEt_k2JUCsH{=rFtkvUTM=4O~Ts){+Sx8 zfc9oG89AT>ldk(0{maQ@PGu{(60ne_t+?YPHAgAIIx)%M|4lP z`_B)e;dVsB-JOktJtIAN@HA!~-7_LT*v14Zm2ean2Wt;(NTJR5vKOQH9b!-JQR1f%PLU6p5rZ zl@;PSiYnHpD^REbQ-Z7$QMar@?scHmJ*3M8fgOO7Vls)KVy8#-5?ie&+hmsp5auymg;IF{ zt06h@l2X#40c^EFoGzFxX(23RN+W1fh#$O}b@FM=9gGL@O7H+ggfx&CxzTPvZnd|z zTj<En)0H-5$$5PS$GiTwF5$f*tqwV&=qZmOz)|Z!; zfu_*!aF=(uvYR`AMPjYOXU-^VtV_-|(#3UBuRr`y9h`|1>Ua-Zzelp@k*h7UX4n!!3DKrC@{X?Y zs#-3wJe*nMW|{eRp~un(;7?gkHxA8?0E1;}SgUEl*tWKC+a~Lffo=C47TPvsagVg< z!1xmxz%Afuf%Z5Nhs2Sj&%HRHq|qm(^N-O|BlwKdS}1pnWGs`@#w$S>Zo@)@qBKgx zk<)xxO+hmwet``Wv1YygXk%}yS=WNk`bcTsWWW%0I*w%Sc&M(Kbr3Ng@3qN>=aGH5 zA8BoZW8Her5fyb)Z;LTZD%Rb+YqV2k#h?lHH=50WA%JW$SG|j7+b)M}czqUTblUdP za!!Xw12T^0RlT$VjkSLGs&1wh4UqVf(E$~YI1lQFAC0H^Vsk5uV)cn=_FO?}D1ELz z3st+=B(M`#Mg55cz60aat@chF1fK`-PV>X@>~8Knqr*(2AEdw@Z0)0FHcv13lSWsW z@v8ok3W-g!=~MTpez@KiG0o`yFf`ihK5Y8N7{{;bn~(RNwYPT~`24oDS;bW~84F%_ z)}FV5NVlxrZte1be$TM;Ae;?1 zbjYNhR_pq>TncX=k2+f~92xNAvCvb%-Yfom3d{LIAHnxq%ie^*m8T1kOG4JW)JP6f3tG=ZWHZqIjMt zo+pZ*mTBi1=y{?zx+{6dCC6C4d7da%ucwNnuzE*Tz|IrJ{KP!E(bkFid7>!K%B8a$ z{yb6q*v$9;EKwZQEdPMwEv43g?{Zdo zH6>LPe1E+5T5^P?QHH&k%)43UZkJW>*#eSPzmw@AjZc&7Wt|=uBq558UYbn4bb^@5 zQL%QRmCWFxQ&+IKNYT()7+C5@Xk5*fv4Q&t&05}!MS#|v;;yZ$<+>NI2qti&ARx~h zUCtFQ5NM_I*~Mf|KN1MzzI}pQ?qRw4fg?gxmN5ba zo<1NmsLi`nGnM|3%rjl2uxaRW52IiyvFbK{(~u0m?~HfaR0u9?-wC~d3dmWL>MFct zKw*0v%Y?y_CU;NuoI>IMHJQ(ljtD5G-Wl&WH8Z)U8IX{Y5BUVfu;&6N?8PX0L);z= z{SuyXBsT?hx$ta{;?mN?G7Of{N+z?ipcV)7YI27ntUDncjF2p0?lq79|i{Rk9E8hhM^17g%QdJ=I-?dnWpBCfKJnPi!LF4!KE zPAAZe=;9?NP8HtZf1S*N8Hv{d=5Yl2=JH{7mjz%>zg~%GWP>M)8!+4wW6Z3EpkPOB zZP*F%m5SuU)z!gZfB>O<9$H-VRy}&Wiji_PO>XHK8l#?JtNaOo4j(jX{BrF9#4<0s z?x|%oWVFnkVi|=azO)!sU9*g@`T>@hQBDW;?L!f3UOJXrBnyyPjH@VaYq7%Jz)_F2yl@P&gfslFill%G`7zuY-*oCSK=f9!Dfs8xj z;(|Oz}77rliK?6cnI(*4a|P~`~I#> zW;8(GjOuQGza@Qw|GWOIOy;VpGPCDghA^a;2gVGd-KiLtky(Xg<3KzV*6;A3)V>+| zvs1uw^voE>nPOEl>BboTY~O-K+&Yab@41jn!`aJW^LUg5AHkz3i8zuWEPZ+me6<7{ RmDD^PW^#|zTVLF<{tJdchOqzu literal 0 HcmV?d00001 diff --git a/Wiki/ENG_Guide/html/.buildinfo b/Wiki/ENG_Guide/html/.buildinfo index 5f28f966..2a953b20 100644 --- a/Wiki/ENG_Guide/html/.buildinfo +++ b/Wiki/ENG_Guide/html/.buildinfo @@ -1,4 +1,4 @@ # Sphinx build info version 1 # This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done. -config: 428b1a8b711af25fb408c9d4784014f7 +config: b242bb7d21650146bd8bbd75ad743c60 tags: 645f666f9bcd5a90fca523b33c5a78b7 diff --git a/Wiki/ENG_Guide/html/Orchestrator/01_Orchestrator.html b/Wiki/ENG_Guide/html/Orchestrator/01_Orchestrator.html new file mode 100644 index 00000000..e0390d6a --- /dev/null +++ b/Wiki/ENG_Guide/html/Orchestrator/01_Orchestrator.html @@ -0,0 +1,295 @@ + + + + + + + + + + 1. Description — pyOpenRPA v1.2.0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+ + + +
+ + + + + +
+ +
+ + + + + + + + + + + + + + + + + + + +
+ + + + +
+
+
+
+ +
+

1. Description

+

pyOpenRPA Orchestrator is the executable process.

+

The features of the orchestrator is: +- Centralized/decentralized user control interface (applicable and for business users and for technical users). Web based, support desktop, tablet, phone. +- Automatized robots control (customized algorithms, robots scheduling) +- Source code mega flexibility: Light Orchestrator architecture is good for own customization

+
+

Global settings dict concept

+

pyOpenRPA project is complex tool which consist of several executable modules such as Robot, Orchestrator, Studio,

+

Because of module compexity, we use 1 init arg - inGSettings +inGSettings is a complex dictionary which has all reqired parameters for the module execution.

+

The description of the GSettings you can find in executable module details.

+
+
+

Orchestrator how to configure

+

To init pyOpenRPA Orchestrator instance use script:

+

from pyOpenRPA import Orchestrator # Import orchestrator main +gSettings = SettingsTemplate.Create(inModeStr=”BASIC”) # Create GSettings with basic configuration +Orchestrator.Orchestrator(inGSettings=gSettings) # Call the orchestrator def

+

gSettings structure

+
+
+

Orchestrator architecture

+

Orchestrator has several source code components: +- User/robot activity consolidated queue single thread (Processor) +- User/robot activity asynchonus many threads (Processor) +- Scheduler single thread (main) +- RDP keep active many thread +- Autocleaner single thread +- GUI keep active single thread +- HTTP web server single thread (create user socket threads) +-

+

Below you can find more information about all of the component.

+
+
+

Component Processor

+

Sync - Append activity list to consolidated processor queue. Execution goes sequency by the activity list order

+

Async - Create New thread to execute the activity list

+
    +
  • Activity list

  • +
+

List of the activity item

+
    +
  • Activity item

  • +
+

Activity item is universal mechanism to execute different algorythms from any sources. +The core feature of the Activity is to call python defs with args and kwargs. +If you need to init do some activity you can write some python def, then create Activity item with current def. +ATTENTION: In some cases (such as web transmition), when you can’t transmit python def as object you can use symbolic names for python defs. It is apply you to init all of you want from the web UI.

+

?Why i cant transmit python def from the web +Because the WEB space is not the Python executable space. Interaction between it spaces create by JSON protocol. So, we know than JSON apply int, float, str, bool, None, list, dict - that is all.

+
+

Note

+

Example +{

+
+

“Def”:”DefAliasTest”, # def link or def alias (look gSettings[“Processor”][“AliasDefDict”]) +“ArgList”:[1,2,3], # Args list +“ArgDict”:{“ttt”:1,”222”:2,”dsd”:3}, # Args dictionary +“ArgGSettings”: None # Name of GSettings attribute: str (ArgDict) or index (for ArgList) +“ArgLogger”: None # Name of GSettings attribute: str (ArgDict) or index (for ArgList)

+
+

}# Pay attention! Do not left comma symbol after the end of the dict - it can be interpretated like a turple..

+
+
+
+

References

+

`Python-sphinx`_

+
+
+ + +
+ +
+ +
+
+ +
+ +
+ + + + + + + + + + + \ No newline at end of file diff --git a/Wiki/ENG_Guide/html/Orchestrator/Orchestrator.html b/Wiki/ENG_Guide/html/Orchestrator/02_Defs.html similarity index 82% rename from Wiki/ENG_Guide/html/Orchestrator/Orchestrator.html rename to Wiki/ENG_Guide/html/Orchestrator/02_Defs.html index 577c78ce..53ec3667 100644 --- a/Wiki/ENG_Guide/html/Orchestrator/Orchestrator.html +++ b/Wiki/ENG_Guide/html/Orchestrator/02_Defs.html @@ -7,7 +7,7 @@ - Description — pyOpenRPA v1.2.0 documentation + 2. Defs — pyOpenRPA v1.2.0 documentation @@ -38,8 +38,8 @@ - - + + @@ -94,9 +94,14 @@

ORCHESTRATOR

@@ -145,13 +150,13 @@
  • »
  • -
  • Description
  • +
  • 2. Defs
  • - View page source + View page source
  • @@ -164,75 +169,27 @@
    -
    -

    Description

    -

    pyOpenRPA Orchestrator is the executable process.

    -

    The features of the orchestrator is: -- Centralized/decentralized user control interface (applicable and for business users and for technical users). Web based, support desktop, tablet, phone. -- Automatized robots control (customized algorithms, robots scheduling) -- Source code mega flexibility: Light Orchestrator architecture is good for own customization

    -
    -

    Global settings dict concept

    -

    pyOpenRPA project is complex tool which consist of several executable modules such as Robot, Orchestrator, Studio,

    -

    Because of module compexity, we use 1 init arg - inGSettings -inGSettings is a complex dictionary which has all reqired parameters for the module execution.

    -

    The description of the GSettings you can find in executable module details.

    -
    -
    -

    Orchestrator how to configure

    -

    To init pyOpenRPA Orchestrator instance use script:

    -

    from pyOpenRPA import Orchestrator # Import orchestrator main -gSettings = SettingsTemplate.Create(inModeStr=”BASIC”) # Create GSettings with basic configuration -Orchestrator.Orchestrator(inGSettings=gSettings) # Call the orchestrator def

    -

    gSettings structure

    -

    gSettingsTemplate.

    -
    -
    -

    Orchestrator architecture

    -

    Orchestrator has several source code components: -- User/robot activity consolidated queue single thread (Processor) -- User/robot activity asynchonus many threads (Processor) -- Scheduler single thread (main) -- RDP keep active many thread -- Autocleaner single thread -- GUI keep active single thread -- HTTP web server single thread (create user socket threads) --

    -

    Below you can find more information about all of the component.

    -
    -
    -

    Component Processor

    -

    Sync - Append activity list to consolidated processor queue. Execution goes sequency by the activity list order

    -

    Async - Create New thread to execute the activity list

    -
      -
    • Activity list

    • -
    -

    Liast of the activity item

    -
      -
    • Activity item

    • -
    -

    Activity item is universal mechanism to execute different algorythms from any sources. -The core feature of the Activity is to call python defs with args and kwargs. -If you need to init do some activity you can write some python def, then create Activity item with current def. -ATTENTION: In some cases (such as web transmition), when you can’t transmit python def as object you can use symbolic names for python defs. It is apply you to init all of you want from the web UI.

    -

    ?Why i cant transmit python def from the web -Because the WEB space is not the Python executable space. Interaction between it spaces create by JSON protocol. So, we know than JSON apply int, float, str, bool, None, list, dict - that is all. -{

    -
    -

    “Def”:”DefAliasTest”, # def link or def alias (look gSettings[“Processor”][“AliasDefDict”]) -“ArgList”:[1,2,3], # Args list -“ArgDict”:{“ttt”:1,”222”:2,”dsd”:3}, # Args dictionary -“ArgGSettings”: None # Name of GSettings attribute: str (ArgDict) or index (for ArgList) -“ArgLogger”: None # Name of GSettings attribute: str (ArgDict) or index (for ArgList)

    -
    -

    }# Pay attention! Do not left comma symbol after the end of the dict - it can be interpretated like a turple..

    +
    +

    2. Defs

    +
    +

    pyOpenRPA.Orchestrator.__Orchestrator__

    +
    # EXAMPLE 1
    +from pyOpenRPA import Orchestrator
    +Orchestrator.OSCMD(inCMDStr = "git status", inRunAsyncBool=True)
    +
    +# EXAMPLE 2
    +from pyOpenRPA.Orchestrator import __Orchestrator__
    +__Orchestrator__.OSCMD(inCMDStr = "git status", inRunAsyncBool=True)
    +
    -
    -

    pyOpenRPA Orchestrator

    -
    +
    pyOpenRPA.Orchestrator.__Orchestrator__.AgentActivityItemAdd(inGSettings, inHostNameStr, inUserStr, inActivityItemDict)[source]

    Add activity in AgentDict. Check if item is created

    +
    # USAGE
    +import this
    +
    +
    Parameters
      @@ -343,12 +300,29 @@ Create Activity Item for the agent

      pyOpenRPA.Orchestrator.__Orchestrator__.GSettingsKeyListValueAppend(inGSettings, inValue, inKeyList=None)[source]

      Append value in GSettings by the key list

      +
      # USAGE
      +from pyOpenRPA import Orchestrator
      +
      +Orchestrator.GSettingsKeyListValueAppend(
      +    inGSettings = gSettings,
      +    inValue = "NewValue",
      +    inKeyList=["NewKeyDict","NewKeyList"]):
      +# result inGSettings: {
      +#    ... another keys in gSettings ...,
      +#    "NewKeyDict":{
      +#        "NewKeyList":[
      +#            "NewValue"
      +#        ]
      +#    }
      +#}
      +
      +
      Parameters
      • inGSettings – Global settings dict (singleton)

      • -
      • inValue

      • -
      • inKeyList

      • +
      • inValue – Any value to be appended in gSettings Dict by the key list

      • +
      • inKeyList – List of the nested keys (see example)

      Returns
      @@ -377,13 +351,33 @@ Create Activity Item for the agent

      pyOpenRPA.Orchestrator.__Orchestrator__.GSettingsKeyListValueOperatorPlus(inGSettings, inValue, inKeyList=None)[source]
      -

      Operator plus value in GSettings by the key list

      +

      Execute plus operation between 2 lists (1:inValue and 2:gSettings by the inKeyList)

      +
      # USAGE
      +from pyOpenRPA import Orchestrator
      +
      +Orchestrator.GSettingsKeyListValueOperatorPlus(
      +    inGSettings = gSettings,
      +    inValue = [1,2,3],
      +    inKeyList=["NewKeyDict","NewKeyList"]):
      +# result inGSettings: {
      +#    ... another keys in gSettings ...,
      +#    "NewKeyDict":{
      +#        "NewKeyList":[
      +#            "NewValue",
      +#            1,
      +#            2,
      +#            3
      +#        ]
      +#    }
      +#}
      +
      +
      Parameters
      • inGSettings – Global settings dict (singleton)

      • -
      • inValue

      • -
      • inKeyList

      • +
      • inValue – List with values to be merged with list in gSettings

      • +
      • inKeyList – List of the nested keys (see example)

      Returns
      @@ -554,14 +548,58 @@ Create Activity Item for the agent

      pyOpenRPA.Orchestrator.__Orchestrator__.ProcessorActivityItemCreate(inDef, inArgList=None, inArgDict=None, inArgGSettingsStr=None, inArgLoggerStr=None)[source]

      Create ActivityItem

      +
      # USAGE
      +from pyOpenRPA import Orchestrator
      +
      +# EXAMPLE 1
      +def TestDef(inArg1Str, inGSettings, inLogger):
      +    pass
      +lActivityItem = Orchestrator.ProcessorActivityItemCreate(
      +    inDef = TestDef,
      +    inArgList=[],
      +    inArgDict={"inArg1Str": "ArgValueStr"},
      +    inArgGSettingsStr = "inGSettings",
      +    inArgLoggerStr = "inLogger")
      +# lActivityItem:
      +#   {
      +#       "Def":TestDef,
      +#       "ArgList":inArgList,
      +#       "ArgDict":inArgDict,
      +#       "ArgGSettings": "inArgGSettings",
      +#       "ArgLogger": "inLogger"
      +#   }
      +
      +# EXAMPLE 2
      +def TestDef(inArg1Str):
      +    pass
      +Orchestrator.ProcessorAliasDefUpdate(
      +    inGSettings = gSettings,
      +    inDef = TestDef,
      +    inAliasStr="TestDefAlias")
      +lActivityItem = Orchestrator.ProcessorActivityItemCreate(
      +    inDef = "TestDefAlias",
      +    inArgList=[],
      +    inArgDict={"inArg1Str": "ArgValueStr"},
      +    inArgGSettingsStr = None,
      +    inArgLoggerStr = None)
      +# lActivityItem:
      +#   {
      +#       "Def":"TestDefAlias",
      +#       "ArgList":inArgList,
      +#       "ArgDict":inArgDict,
      +#       "ArgGSettings": None,
      +#       "ArgLogger": None
      +#   }
      +
      +
      Parameters
        -
      • inDef

      • -
      • inArgList

      • -
      • inArgDict

      • -
      • inArgGSettingsStr

      • -
      • inArgLoggerStr

      • +
      • inDef – def link or def alias (look gSettings[“Processor”][“AliasDefDict”])

      • +
      • inArgList – Args list for the Def

      • +
      • inArgDict – Args dict for the def

      • +
      • inArgGSettingsStr – Name of def argument of the GSettings dict

      • +
      • inArgLoggerStr – Name of def argument of the logging object

      Returns
      @@ -573,17 +611,30 @@ Create Activity Item for the agent

      pyOpenRPA.Orchestrator.__Orchestrator__.ProcessorAliasDefCreate(inGSettings, inDef, inAliasStr=None)[source]
      -

      Create alias for def (can be used in ActivityItem in field Def)

      +

      Create alias for def (can be used in ActivityItem in field Def) +!WHEN DEF ALIAS IS REQUIRED! - Def alias is required when you try to call Python def from the Orchestrator WEB side (because you can’t transmit Python def object out of the Python environment)

      +
      # USAGE
      +from pyOpenRPA import Orchestrator
      +
      +def TestDef():
      +    pass
      +lAliasStr = Orchestrator.ProcessorAliasDefCreate(
      +    inGSettings = gSettings,
      +    inDef = TestDef,
      +    inAliasStr="TestDefAlias")
      +# Now you can call TestDef by the alias from var lAliasStr with help of ActivityItem (key Def = lAliasStr)
      +
      +
      Parameters
      • inGSettings – Global settings dict (singleton)

      • -
      • inDef

      • -
      • inAliasStr

      • +
      • inDef – Def

      • +
      • inAliasStr – String alias for associated def

      Returns
      -

      str Alias

      +

      str Alias string (Alias can be regenerated if previous alias was occupied)

      @@ -591,17 +642,30 @@ Create Activity Item for the agent

      pyOpenRPA.Orchestrator.__Orchestrator__.ProcessorAliasDefUpdate(inGSettings, inDef, inAliasStr)[source]
      -

      Update alias for def (can be used in ActivityItem in field Def)

      +

      Update alias for def (can be used in ActivityItem in field Def). +!WHEN DEF ALIAS IS REQUIRED! - Def alias is required when you try to call Python def from the Orchestrator WEB side (because you can’t transmit Python def object out of the Python environment)

      +
      # USAGE
      +from pyOpenRPA import Orchestrator
      +
      +def TestDef():
      +    pass
      +Orchestrator.ProcessorAliasDefUpdate(
      +    inGSettings = gSettings,
      +    inDef = TestDef,
      +    inAliasStr="TestDefAlias")
      +# Now you can call TestDef by the alias "TestDefAlias" with help of ActivityItem (key Def = "TestDefAlias")
      +
      +
      Parameters
      • inGSettings – Global settings dict (singleton)

      • -
      • inDef

      • -
      • inAliasStr

      • +
      • inDef – Def

      • +
      • inAliasStr – String alias for associated def

      Returns
      -

      str Alias

      +

      str Alias string

      @@ -636,11 +700,23 @@ Create Activity Item for the agent

    • inGSettings – Global settings dict (singleton)

    • inRDPSessionKeyStr

    • inCMDStr

    • -
    • inModeStr

    • +
    • inModeStr – Variants: +“LISTEN” - Get result of the cmd command in result; +“CROSSCHECK” - Check if the command was successufully sent +“RUN” - Run without crosscheck and get clipboard

    Returns
    -

    True - CMD was executed successfully

    +

    +
    # OLD > True - CMD was executed successfully
    +
    {

    “OutStr”: <> # Result string +“IsResponsibleBool”: True|False # Flag is RDP is responsible - works only when inModeStr = CROSSCHECK

    +
    +
    +
    +
    +

    }

    +

    @@ -1080,6 +1156,10 @@ Var 2 (Backward compatibility): inGSettings, inRDPSessionKeyStr, inHostStr, inP
    +
    +
    +

    References

    +

    `Python-sphinx`_

    @@ -1089,8 +1169,8 @@ Var 2 (Backward compatibility): inGSettings, inRDPSessionKeyStr, inHostStr, inP