From 4c9e1bb444208379a5cabf065039eafb515571ad Mon Sep 17 00:00:00 2001 From: "penify-dev[bot]" <146478655+penify-dev[bot]@users.noreply.github.com> Date: Thu, 15 May 2025 08:09:20 +0000 Subject: [PATCH] Add architecture documentation --- docs/html/README_8md.html | 130 + docs/html/annotated.html | 160 + docs/html/annotated_dup.js | 44 + docs/html/api__client_8py.html | 146 + docs/html/api__client_8py.js | 4 + docs/html/auth__commands_8py.html | 150 + docs/html/auth__commands_8py.js | 5 + docs/html/base__analyzer_8py.html | 146 + docs/html/base__analyzer_8py.js | 4 + docs/html/bc_s.png | Bin 0 -> 676 bytes docs/html/bdwn.png | Bin 0 -> 147 bytes docs/html/classException.html | 145 + docs/html/classException__coll__graph.map | 3 + docs/html/classException__coll__graph.md5 | 1 + docs/html/classException__coll__graph.svg | 26 + docs/html/classException__inherit__graph.map | 4 + docs/html/classException__inherit__graph.md5 | 1 + docs/html/classException__inherit__graph.svg | 46 + docs/html/classes.html | 159 + ...k_1_1api__client_1_1APIClient-members.html | 141 + ...ify__hook_1_1api__client_1_1APIClient.html | 468 + ...enify__hook_1_1api__client_1_1APIClient.js | 12 + ...1api__client_1_1APIClient__coll__graph.map | 3 + ...1api__client_1_1APIClient__coll__graph.md5 | 1 + ...1api__client_1_1APIClient__coll__graph.svg | 36 + ...f74798e7d428b4e2f20095287eb2ce_icgraph.map | 4 + ...f74798e7d428b4e2f20095287eb2ce_icgraph.md5 | 1 + ...f74798e7d428b4e2f20095287eb2ce_icgraph.svg | 39 + ...0ada470b897935f9fb372cd0e7e51e3_cgraph.map | 6 + ...0ada470b897935f9fb372cd0e7e51e3_cgraph.md5 | 1 + ...0ada470b897935f9fb372cd0e7e51e3_cgraph.svg | 158 + ...470b897935f9fb372cd0e7e51e3_cgraph_org.svg | 70 + ...ase__analyzer_1_1BaseAnalyzer-members.html | 140 + ...ook_1_1base__analyzer_1_1BaseAnalyzer.html | 308 + ..._hook_1_1base__analyzer_1_1BaseAnalyzer.js | 11 + ..._analyzer_1_1BaseAnalyzer__coll__graph.map | 3 + ..._analyzer_1_1BaseAnalyzer__coll__graph.md5 | 1 + ..._analyzer_1_1BaseAnalyzer__coll__graph.svg | 33 + ...alyzer_1_1BaseAnalyzer__inherit__graph.map | 7 + ...alyzer_1_1BaseAnalyzer__inherit__graph.md5 | 1 + ...alyzer_1_1BaseAnalyzer__inherit__graph.svg | 215 + ...er_1_1BaseAnalyzer__inherit__graph_org.svg | 127 + ..._analyzer_1_1CommitDocGenHook-members.html | 138 + ...1commit__analyzer_1_1CommitDocGenHook.html | 486 + ...1_1commit__analyzer_1_1CommitDocGenHook.js | 9 + ...lyzer_1_1CommitDocGenHook__coll__graph.map | 4 + ...lyzer_1_1CommitDocGenHook__coll__graph.md5 | 1 + ...lyzer_1_1CommitDocGenHook__coll__graph.svg | 57 + ...er_1_1CommitDocGenHook__inherit__graph.map | 4 + ...er_1_1CommitDocGenHook__inherit__graph.md5 | 1 + ...er_1_1CommitDocGenHook__inherit__graph.svg | 57 + ...370a03f7ed9175ef6f81e931a105ea9_cgraph.map | 12 + ...370a03f7ed9175ef6f81e931a105ea9_cgraph.md5 | 1 + ...370a03f7ed9175ef6f81e931a105ea9_cgraph.svg | 268 + ...03f7ed9175ef6f81e931a105ea9_cgraph_org.svg | 180 + ...496194276441fa2eb2fa014eaab9a37_cgraph.map | 5 + ...496194276441fa2eb2fa014eaab9a37_cgraph.md5 | 1 + ...496194276441fa2eb2fa014eaab9a37_cgraph.svg | 142 + ...94276441fa2eb2fa014eaab9a37_cgraph_org.svg | 54 + ...96194276441fa2eb2fa014eaab9a37_icgraph.map | 4 + ...96194276441fa2eb2fa014eaab9a37_icgraph.md5 | 1 + ...96194276441fa2eb2fa014eaab9a37_icgraph.svg | 40 + ...99c5cbc852a7ec3b412ccb43c274ca_icgraph.map | 4 + ...99c5cbc852a7ec3b412ccb43c274ca_icgraph.md5 | 1 + ...99c5cbc852a7ec3b412ccb43c274ca_icgraph.svg | 40 + ...da13cc121d96342476ccf72b63a007f_cgraph.map | 7 + ...da13cc121d96342476ccf72b63a007f_cgraph.md5 | 1 + ...da13cc121d96342476ccf72b63a007f_cgraph.svg | 174 + ...cc121d96342476ccf72b63a007f_cgraph_org.svg | 86 + ...a13cc121d96342476ccf72b63a007f_icgraph.map | 4 + ...a13cc121d96342476ccf72b63a007f_icgraph.md5 | 1 + ...a13cc121d96342476ccf72b63a007f_icgraph.svg | 40 + ...127d86729e226d74dbeb095b008db3e_cgraph.map | 3 + ...127d86729e226d74dbeb095b008db3e_cgraph.md5 | 1 + ...127d86729e226d74dbeb095b008db3e_cgraph.svg | 30 + ...27d86729e226d74dbeb095b008db3e_icgraph.map | 3 + ...27d86729e226d74dbeb095b008db3e_icgraph.md5 | 1 + ...27d86729e226d74dbeb095b008db3e_icgraph.svg | 30 + ...alyzer_1_1FileAnalyzerGenHook-members.html | 137 + ...file__analyzer_1_1FileAnalyzerGenHook.html | 362 + ..._1file__analyzer_1_1FileAnalyzerGenHook.js | 8 + ...er_1_1FileAnalyzerGenHook__coll__graph.map | 4 + ...er_1_1FileAnalyzerGenHook__coll__graph.md5 | 1 + ...er_1_1FileAnalyzerGenHook__coll__graph.svg | 56 + ...1_1FileAnalyzerGenHook__inherit__graph.map | 4 + ...1_1FileAnalyzerGenHook__inherit__graph.md5 | 1 + ...1_1FileAnalyzerGenHook__inherit__graph.svg | 56 + ...cc6c22ef588fccf3eed9bbc57fb6d6e_cgraph.map | 6 + ...cc6c22ef588fccf3eed9bbc57fb6d6e_cgraph.md5 | 1 + ...cc6c22ef588fccf3eed9bbc57fb6d6e_cgraph.svg | 159 + ...22ef588fccf3eed9bbc57fb6d6e_cgraph_org.svg | 71 + ...c6c22ef588fccf3eed9bbc57fb6d6e_icgraph.map | 5 + ...c6c22ef588fccf3eed9bbc57fb6d6e_icgraph.md5 | 1 + ...c6c22ef588fccf3eed9bbc57fb6d6e_icgraph.svg | 55 + ...f4dffbc432fac3e259d957dd1e187f1_cgraph.map | 14 + ...f4dffbc432fac3e259d957dd1e187f1_cgraph.md5 | 1 + ...f4dffbc432fac3e259d957dd1e187f1_cgraph.svg | 292 + ...fbc432fac3e259d957dd1e187f1_cgraph_org.svg | 204 + ...ab39391dfb7686f2a2d21a702dd3073_cgraph.map | 4 + ...ab39391dfb7686f2a2d21a702dd3073_cgraph.md5 | 1 + ...ab39391dfb7686f2a2d21a702dd3073_cgraph.svg | 40 + ...yzer_1_1FolderAnalyzerGenHook-members.html | 136 + ...er__analyzer_1_1FolderAnalyzerGenHook.html | 301 + ...lder__analyzer_1_1FolderAnalyzerGenHook.js | 7 + ..._1_1FolderAnalyzerGenHook__coll__graph.map | 4 + ..._1_1FolderAnalyzerGenHook__coll__graph.md5 | 1 + ..._1_1FolderAnalyzerGenHook__coll__graph.svg | 55 + ...1FolderAnalyzerGenHook__inherit__graph.map | 4 + ...1FolderAnalyzerGenHook__inherit__graph.md5 | 1 + ...1FolderAnalyzerGenHook__inherit__graph.svg | 55 + ...b845318fc7ac3b607daf26378e19ec_icgraph.map | 4 + ...b845318fc7ac3b607daf26378e19ec_icgraph.md5 | 1 + ...b845318fc7ac3b607daf26378e19ec_icgraph.svg | 41 + ...d189d1b8c773bf710a899eb21fd76cc_cgraph.map | 4 + ...d189d1b8c773bf710a899eb21fd76cc_cgraph.md5 | 1 + ...d189d1b8c773bf710a899eb21fd76cc_cgraph.svg | 41 + ...it__analyzer_1_1GitDocGenHook-members.html | 137 + ...ook_1_1git__analyzer_1_1GitDocGenHook.html | 385 + ..._hook_1_1git__analyzer_1_1GitDocGenHook.js | 8 + ...analyzer_1_1GitDocGenHook__coll__graph.map | 4 + ...analyzer_1_1GitDocGenHook__coll__graph.md5 | 1 + ...analyzer_1_1GitDocGenHook__coll__graph.svg | 58 + ...lyzer_1_1GitDocGenHook__inherit__graph.map | 4 + ...lyzer_1_1GitDocGenHook__inherit__graph.md5 | 1 + ...lyzer_1_1GitDocGenHook__inherit__graph.svg | 58 + ...5313caa22b173ce75638f0db08eeb85_cgraph.map | 4 + ...5313caa22b173ce75638f0db08eeb85_cgraph.md5 | 1 + ...5313caa22b173ce75638f0db08eeb85_cgraph.svg | 39 + ...313caa22b173ce75638f0db08eeb85_icgraph.map | 5 + ...313caa22b173ce75638f0db08eeb85_icgraph.md5 | 1 + ...313caa22b173ce75638f0db08eeb85_icgraph.svg | 55 + ...549766100e91eb94b5f1a1d34bf481_icgraph.map | 4 + ...549766100e91eb94b5f1a1d34bf481_icgraph.md5 | 1 + ...549766100e91eb94b5f1a1d34bf481_icgraph.svg | 40 + ...beba14e92d717391a74bb70b1fab0ae_cgraph.map | 18 + ...beba14e92d717391a74bb70b1fab0ae_cgraph.md5 | 1 + ...beba14e92d717391a74bb70b1fab0ae_cgraph.svg | 356 + ...14e92d717391a74bb70b1fab0ae_cgraph_org.svg | 268 + ...2275fddb43dbef6dfdb6c1ed6e96d0c_cgraph.map | 3 + ...2275fddb43dbef6dfdb6c1ed6e96d0c_cgraph.md5 | 1 + ...2275fddb43dbef6dfdb6c1ed6e96d0c_cgraph.svg | 29 + ...275fddb43dbef6dfdb6c1ed6e96d0c_icgraph.map | 3 + ...275fddb43dbef6dfdb6c1ed6e96d0c_icgraph.md5 | 1 + ...275fddb43dbef6dfdb6c1ed6e96d0c_icgraph.svg | 29 + ...4d2f51315ed6a1965a7fd7e2ced0cd_icgraph.map | 6 + ...4d2f51315ed6a1965a7fd7e2ced0cd_icgraph.md5 | 1 + ...4d2f51315ed6a1965a7fd7e2ced0cd_icgraph.svg | 159 + ...51315ed6a1965a7fd7e2ced0cd_icgraph_org.svg | 71 + ...1_1jira__client_1_1JiraClient-members.html | 147 + ...y__hook_1_1jira__client_1_1JiraClient.html | 774 ++ ...ify__hook_1_1jira__client_1_1JiraClient.js | 18 + ...ira__client_1_1JiraClient__coll__graph.map | 3 + ...ira__client_1_1JiraClient__coll__graph.md5 | 1 + ...ira__client_1_1JiraClient__coll__graph.svg | 44 + ...d0f9ae006313a21576362d26ac5ec8_icgraph.map | 10 + ...d0f9ae006313a21576362d26ac5ec8_icgraph.md5 | 1 + ...d0f9ae006313a21576362d26ac5ec8_icgraph.svg | 264 + ...ae006313a21576362d26ac5ec8_icgraph_org.svg | 176 + ...93d6456fe053ef7a7862d5d6851910c_cgraph.map | 5 + ...93d6456fe053ef7a7862d5d6851910c_cgraph.md5 | 1 + ...93d6456fe053ef7a7862d5d6851910c_cgraph.svg | 142 + ...456fe053ef7a7862d5d6851910c_cgraph_org.svg | 54 + ...9ea1149758f7f5212149d357b13cc23_cgraph.map | 6 + ...9ea1149758f7f5212149d357b13cc23_cgraph.md5 | 1 + ...9ea1149758f7f5212149d357b13cc23_cgraph.svg | 166 + ...149758f7f5212149d357b13cc23_cgraph_org.svg | 78 + ...ea1149758f7f5212149d357b13cc23_icgraph.map | 4 + ...ea1149758f7f5212149d357b13cc23_icgraph.md5 | 1 + ...ea1149758f7f5212149d357b13cc23_icgraph.svg | 41 + ...5f6924819084b7c8d268956a784804a_cgraph.map | 4 + ...5f6924819084b7c8d268956a784804a_cgraph.md5 | 1 + ...5f6924819084b7c8d268956a784804a_cgraph.svg | 39 + ...f6924819084b7c8d268956a784804a_icgraph.map | 6 + ...f6924819084b7c8d268956a784804a_icgraph.md5 | 1 + ...f6924819084b7c8d268956a784804a_icgraph.svg | 168 + ...4819084b7c8d268956a784804a_icgraph_org.svg | 80 + ...0d2c5a6432aa6f238da0ff65d49a760_cgraph.map | 9 + ...0d2c5a6432aa6f238da0ff65d49a760_cgraph.md5 | 1 + ...0d2c5a6432aa6f238da0ff65d49a760_cgraph.svg | 241 + ...5a6432aa6f238da0ff65d49a760_cgraph_org.svg | 153 + ...1f374116c64cd5f1492ec7f7e40f9c1_cgraph.map | 4 + ...1f374116c64cd5f1492ec7f7e40f9c1_cgraph.md5 | 1 + ...1f374116c64cd5f1492ec7f7e40f9c1_cgraph.svg | 45 + ...f374116c64cd5f1492ec7f7e40f9c1_icgraph.map | 3 + ...f374116c64cd5f1492ec7f7e40f9c1_icgraph.md5 | 1 + ...f374116c64cd5f1492ec7f7e40f9c1_icgraph.svg | 29 + ...967169a4b7970c67c0947b9ac56f746_cgraph.map | 4 + ...967169a4b7970c67c0947b9ac56f746_cgraph.md5 | 1 + ...967169a4b7970c67c0947b9ac56f746_cgraph.svg | 40 + ...67169a4b7970c67c0947b9ac56f746_icgraph.map | 5 + ...67169a4b7970c67c0947b9ac56f746_icgraph.md5 | 1 + ...67169a4b7970c67c0947b9ac56f746_icgraph.svg | 58 + ...a8837552d37bfd611de23441a240826_cgraph.map | 4 + ...a8837552d37bfd611de23441a240826_cgraph.md5 | 1 + ...a8837552d37bfd611de23441a240826_cgraph.svg | 40 + ...823ad1d3baaedd38039913c3a97fd7_icgraph.map | 5 + ...823ad1d3baaedd38039913c3a97fd7_icgraph.md5 | 1 + ...823ad1d3baaedd38039913c3a97fd7_icgraph.svg | 145 + ...d1d3baaedd38039913c3a97fd7_icgraph_org.svg | 57 + ...b41ce6f13c30b1265d439ddf04bf2cd_cgraph.map | 6 + ...b41ce6f13c30b1265d439ddf04bf2cd_cgraph.md5 | 1 + ...b41ce6f13c30b1265d439ddf04bf2cd_cgraph.svg | 85 + ...41ce6f13c30b1265d439ddf04bf2cd_icgraph.map | 4 + ...41ce6f13c30b1265d439ddf04bf2cd_icgraph.md5 | 1 + ...41ce6f13c30b1265d439ddf04bf2cd_icgraph.svg | 41 + ...k_1_1llm__client_1_1LLMClient-members.html | 137 + ...ify__hook_1_1llm__client_1_1LLMClient.html | 360 + ...enify__hook_1_1llm__client_1_1LLMClient.js | 8 + ...1llm__client_1_1LLMClient__coll__graph.map | 3 + ...1llm__client_1_1LLMClient__coll__graph.md5 | 1 + ...1llm__client_1_1LLMClient__coll__graph.svg | 29 + ...ad3014dac466ee1d8e00306d0cf2000_cgraph.map | 4 + ...ad3014dac466ee1d8e00306d0cf2000_cgraph.md5 | 1 + ...ad3014dac466ee1d8e00306d0cf2000_cgraph.svg | 38 + ...d3014dac466ee1d8e00306d0cf2000_icgraph.map | 4 + ...d3014dac466ee1d8e00306d0cf2000_icgraph.md5 | 1 + ...d3014dac466ee1d8e00306d0cf2000_icgraph.svg | 39 + ...f06658ca922793f879474f2234518e_icgraph.map | 5 + ...f06658ca922793f879474f2234518e_icgraph.md5 | 1 + ...f06658ca922793f879474f2234518e_icgraph.svg | 142 + ...58ca922793f879474f2234518e_icgraph_org.svg | 54 + ...hook_1_1utils_1_1GitRepoNotFoundError.html | 145 + ...s_1_1GitRepoNotFoundError__coll__graph.map | 4 + ...s_1_1GitRepoNotFoundError__coll__graph.md5 | 1 + ...s_1_1GitRepoNotFoundError__coll__graph.svg | 46 + ..._1GitRepoNotFoundError__inherit__graph.map | 4 + ..._1GitRepoNotFoundError__inherit__graph.md5 | 1 + ..._1GitRepoNotFoundError__inherit__graph.svg | 46 + ...ommands_1_1TestCommitCommands-members.html | 144 + ...ommit__commands_1_1TestCommitCommands.html | 791 ++ ..._commit__commands_1_1TestCommitCommands.js | 15 + ...nds_1_1TestCommitCommands__coll__graph.map | 3 + ...nds_1_1TestCommitCommands__coll__graph.md5 | 1 + ...nds_1_1TestCommitCommands__coll__graph.svg | 42 + ...3c2ff3707124aa48e8eb581106b8691_cgraph.map | 11 + ...3c2ff3707124aa48e8eb581106b8691_cgraph.md5 | 1 + ...3c2ff3707124aa48e8eb581106b8691_cgraph.svg | 244 + ...f3707124aa48e8eb581106b8691_cgraph_org.svg | 156 + ...d04b125e102190a768f65f1948f15bc_cgraph.map | 4 + ...d04b125e102190a768f65f1948f15bc_cgraph.md5 | 1 + ...d04b125e102190a768f65f1948f15bc_cgraph.svg | 40 + ...13e368262340af98b30fd8ebdac6597_cgraph.map | 18 + ...13e368262340af98b30fd8ebdac6597_cgraph.md5 | 1 + ...13e368262340af98b30fd8ebdac6597_cgraph.svg | 405 + ...68262340af98b30fd8ebdac6597_cgraph_org.svg | 317 + ...c4b1e4189792a3f7c11d2a745f479c0_cgraph.map | 11 + ...c4b1e4189792a3f7c11d2a745f479c0_cgraph.md5 | 1 + ...c4b1e4189792a3f7c11d2a745f479c0_cgraph.svg | 244 + ...e4189792a3f7c11d2a745f479c0_cgraph_org.svg | 156 + ...ea0d934ee0f2b914b0b893736e8fe4e_cgraph.map | 11 + ...ea0d934ee0f2b914b0b893736e8fe4e_cgraph.md5 | 1 + ...ea0d934ee0f2b914b0b893736e8fe4e_cgraph.svg | 245 + ...934ee0f2b914b0b893736e8fe4e_cgraph_org.svg | 157 + ...9c09013055ec39ddde86b487aefcf8b_cgraph.map | 11 + ...9c09013055ec39ddde86b487aefcf8b_cgraph.md5 | 1 + ...9c09013055ec39ddde86b487aefcf8b_cgraph.svg | 244 + ...013055ec39ddde86b487aefcf8b_cgraph_org.svg | 156 + ...ommands_1_1TestConfigCommands-members.html | 144 + ...onfig__commands_1_1TestConfigCommands.html | 886 ++ ..._config__commands_1_1TestConfigCommands.js | 15 + ...nds_1_1TestConfigCommands__coll__graph.map | 3 + ...nds_1_1TestConfigCommands__coll__graph.md5 | 1 + ...nds_1_1TestConfigCommands__coll__graph.svg | 50 + ...e8162082bcdd5652bb37bdb14cf453a_cgraph.map | 5 + ...e8162082bcdd5652bb37bdb14cf453a_cgraph.md5 | 1 + ...e8162082bcdd5652bb37bdb14cf453a_cgraph.svg | 150 + ...2082bcdd5652bb37bdb14cf453a_cgraph_org.svg | 62 + ...355f7d313bebaa71694387cf2bc5232_cgraph.map | 8 + ...355f7d313bebaa71694387cf2bc5232_cgraph.md5 | 1 + ...355f7d313bebaa71694387cf2bc5232_cgraph.svg | 211 + ...7d313bebaa71694387cf2bc5232_cgraph_org.svg | 123 + ...3d4760eee3b67e1cde3aed755ebb948_cgraph.map | 5 + ...3d4760eee3b67e1cde3aed755ebb948_cgraph.md5 | 1 + ...3d4760eee3b67e1cde3aed755ebb948_cgraph.svg | 150 + ...60eee3b67e1cde3aed755ebb948_cgraph_org.svg | 62 + ...00ca5d9fcdc159714e8df54920f9436_cgraph.map | 8 + ...00ca5d9fcdc159714e8df54920f9436_cgraph.md5 | 1 + ...00ca5d9fcdc159714e8df54920f9436_cgraph.svg | 211 + ...5d9fcdc159714e8df54920f9436_cgraph_org.svg | 123 + ...73984d31452b56acd6ce4011a1248bd_cgraph.map | 7 + ...73984d31452b56acd6ce4011a1248bd_cgraph.md5 | 1 + ...73984d31452b56acd6ce4011a1248bd_cgraph.svg | 189 + ...4d31452b56acd6ce4011a1248bd_cgraph_org.svg | 101 + ...c0207be563c3de59a6d16277805114c_cgraph.map | 8 + ...c0207be563c3de59a6d16277805114c_cgraph.md5 | 1 + ...c0207be563c3de59a6d16277805114c_cgraph.svg | 211 + ...7be563c3de59a6d16277805114c_cgraph_org.svg | 123 + ...3a264dfb21e16003e095b79f6eab2ac_cgraph.map | 5 + ...3a264dfb21e16003e095b79f6eab2ac_cgraph.md5 | 1 + ...3a264dfb21e16003e095b79f6eab2ac_cgraph.svg | 150 + ...4dfb21e16003e095b79f6eab2ac_cgraph_org.svg | 62 + ...d12f028b89aa9cd1152c0b9ece5d3cd_cgraph.map | 7 + ...d12f028b89aa9cd1152c0b9ece5d3cd_cgraph.md5 | 1 + ...d12f028b89aa9cd1152c0b9ece5d3cd_cgraph.svg | 189 + ...028b89aa9cd1152c0b9ece5d3cd_cgraph_org.svg | 101 + ...d8df8219441b9e9871b903a681400d9_cgraph.map | 5 + ...d8df8219441b9e9871b903a681400d9_cgraph.md5 | 1 + ...d8df8219441b9e9871b903a681400d9_cgraph.svg | 150 + ...8219441b9e9871b903a681400d9_cgraph_org.svg | 62 + ...f9f2233a3f4cc5725b9d4f05758b167_cgraph.map | 7 + ...f9f2233a3f4cc5725b9d4f05758b167_cgraph.md5 | 1 + ...f9f2233a3f4cc5725b9d4f05758b167_cgraph.svg | 189 + ...233a3f4cc5725b9d4f05758b167_cgraph_org.svg | 101 + ...e37b97432821d19758c6325d4c74bcf_cgraph.map | 7 + ...e37b97432821d19758c6325d4c74bcf_cgraph.md5 | 1 + ...e37b97432821d19758c6325d4c74bcf_cgraph.svg | 189 + ...97432821d19758c6325d4c74bcf_cgraph_org.svg | 101 + ...8d62310da2d768e21770f8f01ff5375_cgraph.map | 5 + ...8d62310da2d768e21770f8f01ff5375_cgraph.md5 | 1 + ...8d62310da2d768e21770f8f01ff5375_cgraph.svg | 150 + ...310da2d768e21770f8f01ff5375_cgraph_org.svg | 62 + ..._web__config_1_1TestWebConfig-members.html | 134 + ...1_1test__web__config_1_1TestWebConfig.html | 268 + ...s_1_1test__web__config_1_1TestWebConfig.js | 5 + ...__config_1_1TestWebConfig__coll__graph.map | 3 + ...__config_1_1TestWebConfig__coll__graph.md5 | 1 + ...__config_1_1TestWebConfig__coll__graph.svg | 30 + ...6e600222e426b003850509cb1d3190a_cgraph.map | 9 + ...6e600222e426b003850509cb1d3190a_cgraph.md5 | 1 + ...6e600222e426b003850509cb1d3190a_cgraph.svg | 227 + ...0222e426b003850509cb1d3190a_cgraph_org.svg | 139 + ...c6440352201d207ea8b4d26f8ccfa35_cgraph.map | 4 + ...c6440352201d207ea8b4d26f8ccfa35_cgraph.md5 | 1 + ...c6440352201d207ea8b4d26f8ccfa35_cgraph.svg | 40 + docs/html/closed.png | Bin 0 -> 132 bytes docs/html/commit-commands_8md.html | 130 + docs/html/commit__analyzer_8py.html | 146 + docs/html/commit__analyzer_8py.js | 4 + docs/html/commit__commands_8py.html | 152 + docs/html/commit__commands_8py.js | 6 + docs/html/config-commands_8md.html | 130 + docs/html/config__command_8py.html | 148 + docs/html/config__command_8py.js | 5 + docs/html/config__commands_8py.html | 174 + docs/html/config__commands_8py.js | 15 + docs/html/conftest_8py.html | 140 + docs/html/constants_8py.html | 148 + docs/html/constants_8py.js | 5 + docs/html/detailed-usage_8md.html | 130 + .../dir_063e2d5fe58a131099a7fe4200cca78c.html | 152 + .../dir_063e2d5fe58a131099a7fe4200cca78c.js | 9 + ...r_063e2d5fe58a131099a7fe4200cca78c_dep.map | 4 + ...r_063e2d5fe58a131099a7fe4200cca78c_dep.md5 | 1 + ...r_063e2d5fe58a131099a7fe4200cca78c_dep.svg | 30 + .../dir_1648a057408aae8db85b8e3797335623.html | 136 + ...r_1648a057408aae8db85b8e3797335623_dep.map | 4 + ...r_1648a057408aae8db85b8e3797335623_dep.md5 | 1 + ...r_1648a057408aae8db85b8e3797335623_dep.svg | 30 + .../dir_624fa2a8bce97f0444ac5cca335d4e23.html | 152 + .../dir_624fa2a8bce97f0444ac5cca335d4e23.js | 9 + ...r_624fa2a8bce97f0444ac5cca335d4e23_dep.map | 4 + ...r_624fa2a8bce97f0444ac5cca335d4e23_dep.md5 | 1 + ...r_624fa2a8bce97f0444ac5cca335d4e23_dep.svg | 30 + .../dir_b3b22d2ab7966b65f6b237e3231b41be.html | 145 + .../dir_b3b22d2ab7966b65f6b237e3231b41be.js | 7 + .../dir_f88c3381c1861b3f7ca1f3d63cf244b5.html | 175 + .../dir_f88c3381c1861b3f7ca1f3d63cf244b5.js | 19 + ...r_f88c3381c1861b3f7ca1f3d63cf244b5_dep.map | 5 + ...r_f88c3381c1861b3f7ca1f3d63cf244b5_dep.md5 | 1 + ...r_f88c3381c1861b3f7ca1f3d63cf244b5_dep.svg | 42 + docs/html/doc.png | Bin 0 -> 746 bytes docs/html/doc__commands_8md.html | 130 + docs/html/doc__commands_8py.html | 158 + docs/html/doc__commands_8py.js | 7 + docs/html/doxygen-awesome-darkmode-toggle.js | 157 + .../doxygen-awesome-fragment-copy-button.js | 85 + docs/html/doxygen-awesome-interactive-toc.js | 81 + docs/html/doxygen-awesome-paragraph-link.js | 51 + ...n-awesome-sidebar-only-darkmode-toggle.css | 40 + docs/html/doxygen-awesome-sidebar-only.css | 116 + docs/html/doxygen-awesome-tabs.js | 90 + docs/html/doxygen-awesome.css | 2675 +++++ docs/html/doxygen.css | 1841 ++++ docs/html/doxygen.svg | 26 + docs/html/dynsections.js | 121 + docs/html/example-workflows_8md.html | 130 + docs/html/file__analyzer_8py.html | 152 + docs/html/file__analyzer_8py.js | 5 + docs/html/files.html | 166 + docs/html/files_dup.js | 4 + docs/html/folder__analyzer_8py.html | 146 + docs/html/folder__analyzer_8py.js | 4 + docs/html/folderclosed.png | Bin 0 -> 616 bytes docs/html/folderopen.png | Bin 0 -> 597 bytes docs/html/functions.html | 261 + docs/html/functions_func.html | 230 + docs/html/functions_vars.html | 147 + docs/html/git__analyzer_8py.html | 152 + docs/html/git__analyzer_8py.js | 5 + docs/html/graph_legend.html | 189 + docs/html/graph_legend.md5 | 1 + docs/html/graph_legend.svg | 117 + docs/html/hierarchy.html | 148 + docs/html/hierarchy.js | 18 + docs/html/hook__commands_8py.html | 158 + docs/html/hook__commands_8py.js | 7 + docs/html/index.html | 129 + docs/html/inherit_graph_0.map | 4 + docs/html/inherit_graph_0.md5 | 1 + docs/html/inherit_graph_0.svg | 38 + docs/html/inherit_graph_1.map | 3 + docs/html/inherit_graph_1.md5 | 1 + docs/html/inherit_graph_1.svg | 22 + docs/html/inherit_graph_2.map | 7 + docs/html/inherit_graph_2.md5 | 1 + docs/html/inherit_graph_2.svg | 87 + docs/html/inherit_graph_3.map | 3 + docs/html/inherit_graph_3.md5 | 1 + docs/html/inherit_graph_3.svg | 23 + docs/html/inherit_graph_4.map | 3 + docs/html/inherit_graph_4.md5 | 1 + docs/html/inherit_graph_4.svg | 22 + docs/html/inherit_graph_5.map | 3 + docs/html/inherit_graph_5.md5 | 1 + docs/html/inherit_graph_5.svg | 23 + docs/html/inherit_graph_6.map | 3 + docs/html/inherit_graph_6.md5 | 1 + docs/html/inherit_graph_6.svg | 23 + docs/html/inherit_graph_7.map | 3 + docs/html/inherit_graph_7.md5 | 1 + docs/html/inherit_graph_7.svg | 23 + docs/html/inherits.html | 149 + docs/html/jira__client_8py.html | 152 + docs/html/jira__client_8py.js | 5 + docs/html/jquery.js | 35 + docs/html/llm__client_8py.html | 146 + docs/html/llm__client_8py.js | 4 + docs/html/login__command_8py.html | 148 + docs/html/login__command_8py.js | 5 + docs/html/main_8py.html | 146 + docs/html/main_8py.js | 4 + ...nContext_Penify_dev_penify_cli_README.html | 244 + ...y_dev_penify_cli_docs_commit_commands.html | 255 + ...y_dev_penify_cli_docs_config_commands.html | 286 + ...fy_dev_penify_cli_docs_detailed_usage.html | 280 + ...nify_dev_penify_cli_docs_doc_commands.html | 363 + ...dev_penify_cli_docs_example_workflows.html | 239 + docs/html/menu.js | 135 + docs/html/menudata.js | 117 + docs/html/namespacemembers.html | 289 + docs/html/namespacemembers_func.html | 228 + docs/html/namespacemembers_vars.html | 215 + docs/html/namespacepenify__hook.html | 166 + docs/html/namespacepenify__hook.js | 56 + .../namespacepenify__hook_1_1api__client.html | 138 + .../namespacepenify__hook_1_1api__client.js | 4 + ...mespacepenify__hook_1_1base__analyzer.html | 138 + ...namespacepenify__hook_1_1base__analyzer.js | 4 + .../namespacepenify__hook_1_1commands.html | 146 + .../html/namespacepenify__hook_1_1commands.js | 38 + ...y__hook_1_1commands_1_1auth__commands.html | 229 + ...8f375c58bb6f69f98675e6a9ac84655_cgraph.map | 5 + ...8f375c58bb6f69f98675e6a9ac84655_cgraph.md5 | 1 + ...8f375c58bb6f69f98675e6a9ac84655_cgraph.svg | 149 + ...5c58bb6f69f98675e6a9ac84655_cgraph_org.svg | 61 + ...f375c58bb6f69f98675e6a9ac84655_icgraph.map | 5 + ...f375c58bb6f69f98675e6a9ac84655_icgraph.md5 | 1 + ...f375c58bb6f69f98675e6a9ac84655_icgraph.svg | 148 + ...c58bb6f69f98675e6a9ac84655_icgraph_org.svg | 60 + ...3956ca1749d4218ea1dc6e5b6218b24_cgraph.map | 4 + ...3956ca1749d4218ea1dc6e5b6218b24_cgraph.md5 | 1 + ...3956ca1749d4218ea1dc6e5b6218b24_cgraph.svg | 45 + ...956ca1749d4218ea1dc6e5b6218b24_icgraph.map | 6 + ...956ca1749d4218ea1dc6e5b6218b24_icgraph.md5 | 1 + ...956ca1749d4218ea1dc6e5b6218b24_icgraph.svg | 164 + ...a1749d4218ea1dc6e5b6218b24_icgraph_org.svg | 76 + ..._hook_1_1commands_1_1commit__commands.html | 311 + ...2564c4e8ad59fc46d56cb0f9122a71a_cgraph.map | 10 + ...2564c4e8ad59fc46d56cb0f9122a71a_cgraph.md5 | 1 + ...2564c4e8ad59fc46d56cb0f9122a71a_cgraph.svg | 227 + ...c4e8ad59fc46d56cb0f9122a71a_cgraph_org.svg | 139 + ...564c4e8ad59fc46d56cb0f9122a71a_icgraph.map | 10 + ...564c4e8ad59fc46d56cb0f9122a71a_icgraph.md5 | 1 + ...564c4e8ad59fc46d56cb0f9122a71a_icgraph.svg | 234 + ...4e8ad59fc46d56cb0f9122a71a_icgraph_org.svg | 146 + ...27583116eb78e31a4d3cdc16d2f15c_icgraph.map | 5 + ...27583116eb78e31a4d3cdc16d2f15c_icgraph.md5 | 1 + ...27583116eb78e31a4d3cdc16d2f15c_icgraph.svg | 61 + ...4f739f524c38b437e4e47673d683e23_cgraph.map | 17 + ...4f739f524c38b437e4e47673d683e23_cgraph.md5 | 1 + ...4f739f524c38b437e4e47673d683e23_cgraph.svg | 388 + ...9f524c38b437e4e47673d683e23_cgraph_org.svg | 300 + ...f739f524c38b437e4e47673d683e23_icgraph.map | 5 + ...f739f524c38b437e4e47673d683e23_icgraph.md5 | 1 + ...f739f524c38b437e4e47673d683e23_icgraph.svg | 61 + ..._hook_1_1commands_1_1config__commands.html | 567 ++ ...5bf3685c4dcb5c15ba6a4055e484cf2_cgraph.map | 6 + ...5bf3685c4dcb5c15ba6a4055e484cf2_cgraph.md5 | 1 + ...5bf3685c4dcb5c15ba6a4055e484cf2_cgraph.svg | 172 + ...685c4dcb5c15ba6a4055e484cf2_cgraph_org.svg | 84 + ...bf3685c4dcb5c15ba6a4055e484cf2_icgraph.map | 10 + ...bf3685c4dcb5c15ba6a4055e484cf2_icgraph.md5 | 1 + ...bf3685c4dcb5c15ba6a4055e484cf2_icgraph.svg | 237 + ...85c4dcb5c15ba6a4055e484cf2_icgraph_org.svg | 149 + ...5dfc34a655ed80e6c95939b6f3c35c_icgraph.map | 6 + ...5dfc34a655ed80e6c95939b6f3c35c_icgraph.md5 | 1 + ...5dfc34a655ed80e6c95939b6f3c35c_icgraph.svg | 165 + ...34a655ed80e6c95939b6f3c35c_icgraph_org.svg | 77 + ...af2b062dd33b1f1d7ddc7224f0ff87_icgraph.map | 24 + ...af2b062dd33b1f1d7ddc7224f0ff87_icgraph.md5 | 1 + ...af2b062dd33b1f1d7ddc7224f0ff87_icgraph.svg | 486 + ...062dd33b1f1d7ddc7224f0ff87_icgraph_org.svg | 398 + ...617bc5956e502c9555dc0dda0376df4_cgraph.map | 4 + ...617bc5956e502c9555dc0dda0376df4_cgraph.md5 | 1 + ...617bc5956e502c9555dc0dda0376df4_cgraph.svg | 45 + ...17bc5956e502c9555dc0dda0376df4_icgraph.map | 7 + ...17bc5956e502c9555dc0dda0376df4_icgraph.md5 | 1 + ...17bc5956e502c9555dc0dda0376df4_icgraph.svg | 182 + ...5956e502c9555dc0dda0376df4_icgraph_org.svg | 94 + ...503d51c905e2f1b299b12d2a73bd812_cgraph.map | 7 + ...503d51c905e2f1b299b12d2a73bd812_cgraph.md5 | 1 + ...503d51c905e2f1b299b12d2a73bd812_cgraph.svg | 194 + ...51c905e2f1b299b12d2a73bd812_cgraph_org.svg | 106 + ...03d51c905e2f1b299b12d2a73bd812_icgraph.map | 14 + ...03d51c905e2f1b299b12d2a73bd812_icgraph.md5 | 1 + ...03d51c905e2f1b299b12d2a73bd812_icgraph.svg | 302 + ...1c905e2f1b299b12d2a73bd812_icgraph_org.svg | 214 + ...492bc8e7df6e38bb06ad05e572d4cc0_cgraph.map | 6 + ...492bc8e7df6e38bb06ad05e572d4cc0_cgraph.md5 | 1 + ...492bc8e7df6e38bb06ad05e572d4cc0_cgraph.svg | 172 + ...c8e7df6e38bb06ad05e572d4cc0_cgraph_org.svg | 84 + ...92bc8e7df6e38bb06ad05e572d4cc0_icgraph.map | 9 + ...92bc8e7df6e38bb06ad05e572d4cc0_icgraph.md5 | 1 + ...92bc8e7df6e38bb06ad05e572d4cc0_icgraph.svg | 216 + ...8e7df6e38bb06ad05e572d4cc0_icgraph_org.svg | 128 + ...559a82d0bf727703d550d1003d3ed20_cgraph.map | 4 + ...559a82d0bf727703d550d1003d3ed20_cgraph.md5 | 1 + ...559a82d0bf727703d550d1003d3ed20_cgraph.svg | 45 + ...59a82d0bf727703d550d1003d3ed20_icgraph.map | 17 + ...59a82d0bf727703d550d1003d3ed20_icgraph.md5 | 1 + ...59a82d0bf727703d550d1003d3ed20_icgraph.svg | 352 + ...2d0bf727703d550d1003d3ed20_icgraph_org.svg | 264 + ...be277132ce0bc0aacef951cf1dee2ae_cgraph.map | 4 + ...be277132ce0bc0aacef951cf1dee2ae_cgraph.md5 | 1 + ...be277132ce0bc0aacef951cf1dee2ae_cgraph.svg | 51 + ...e277132ce0bc0aacef951cf1dee2ae_icgraph.map | 24 + ...e277132ce0bc0aacef951cf1dee2ae_icgraph.md5 | 1 + ...e277132ce0bc0aacef951cf1dee2ae_icgraph.svg | 491 + ...132ce0bc0aacef951cf1dee2ae_icgraph_org.svg | 403 + ...2486ac2bf16b4a671e49625bfa4f9b4_cgraph.map | 4 + ...2486ac2bf16b4a671e49625bfa4f9b4_cgraph.md5 | 1 + ...2486ac2bf16b4a671e49625bfa4f9b4_cgraph.svg | 45 + ...486ac2bf16b4a671e49625bfa4f9b4_icgraph.map | 8 + ...486ac2bf16b4a671e49625bfa4f9b4_icgraph.md5 | 1 + ...486ac2bf16b4a671e49625bfa4f9b4_icgraph.svg | 204 + ...c2bf16b4a671e49625bfa4f9b4_icgraph_org.svg | 116 + ...115198ea5d6808ccb98733957f50b06_cgraph.map | 8 + ...115198ea5d6808ccb98733957f50b06_cgraph.md5 | 1 + ...115198ea5d6808ccb98733957f50b06_cgraph.svg | 210 + ...98ea5d6808ccb98733957f50b06_cgraph_org.svg | 122 + ...15198ea5d6808ccb98733957f50b06_icgraph.map | 6 + ...15198ea5d6808ccb98733957f50b06_icgraph.md5 | 1 + ...15198ea5d6808ccb98733957f50b06_icgraph.svg | 165 + ...8ea5d6808ccb98733957f50b06_icgraph_org.svg | 77 + ...fy__hook_1_1commands_1_1doc__commands.html | 279 + ...006ab13bff718ef783868a910c0b704_cgraph.map | 11 + ...006ab13bff718ef783868a910c0b704_cgraph.md5 | 1 + ...006ab13bff718ef783868a910c0b704_cgraph.svg | 258 + ...b13bff718ef783868a910c0b704_cgraph_org.svg | 170 + ...06ab13bff718ef783868a910c0b704_icgraph.map | 8 + ...06ab13bff718ef783868a910c0b704_icgraph.md5 | 1 + ...06ab13bff718ef783868a910c0b704_icgraph.svg | 108 + ...aac68bc563432bf25c85dc78081a25_icgraph.map | 15 + ...aac68bc563432bf25c85dc78081a25_icgraph.md5 | 1 + ...aac68bc563432bf25c85dc78081a25_icgraph.svg | 309 + ...8bc563432bf25c85dc78081a25_icgraph_org.svg | 221 + ...7f4ead1b11951d885fa5c151c2cbe0_icgraph.map | 5 + ...7f4ead1b11951d885fa5c151c2cbe0_icgraph.md5 | 1 + ...7f4ead1b11951d885fa5c151c2cbe0_icgraph.svg | 60 + ...y__hook_1_1commands_1_1hook__commands.html | 242 + ...543eb5fa835fd1237f24e8bce6201d_icgraph.map | 9 + ...543eb5fa835fd1237f24e8bce6201d_icgraph.md5 | 1 + ...543eb5fa835fd1237f24e8bce6201d_icgraph.svg | 212 + ...b5fa835fd1237f24e8bce6201d_icgraph_org.svg | 124 + ...f8f5d3bf1c3795974a391ee95b72b2_icgraph.map | 9 + ...f8f5d3bf1c3795974a391ee95b72b2_icgraph.md5 | 1 + ...f8f5d3bf1c3795974a391ee95b72b2_icgraph.svg | 212 + ...d3bf1c3795974a391ee95b72b2_icgraph_org.svg | 124 + ...spacepenify__hook_1_1commit__analyzer.html | 138 + ...mespacepenify__hook_1_1commit__analyzer.js | 4 + ...espacepenify__hook_1_1config__command.html | 205 + ...40e5331681eb574ac319d7458783bde_cgraph.map | 11 + ...40e5331681eb574ac319d7458783bde_cgraph.md5 | 1 + ...40e5331681eb574ac319d7458783bde_cgraph.svg | 270 + ...331681eb574ac319d7458783bde_cgraph_org.svg | 182 + ...0e5331681eb574ac319d7458783bde_icgraph.map | 4 + ...0e5331681eb574ac319d7458783bde_icgraph.md5 | 1 + ...0e5331681eb574ac319d7458783bde_icgraph.svg | 44 + ...3eb92164a69df1446d745f8a09285e_icgraph.map | 4 + ...3eb92164a69df1446d745f8a09285e_icgraph.md5 | 1 + ...3eb92164a69df1446d745f8a09285e_icgraph.svg | 45 + .../namespacepenify__hook_1_1constants.html | 169 + ...mespacepenify__hook_1_1file__analyzer.html | 159 + ...namespacepenify__hook_1_1file__analyzer.js | 5 + ...spacepenify__hook_1_1folder__analyzer.html | 138 + ...mespacepenify__hook_1_1folder__analyzer.js | 4 + ...amespacepenify__hook_1_1git__analyzer.html | 159 + .../namespacepenify__hook_1_1git__analyzer.js | 5 + ...namespacepenify__hook_1_1jira__client.html | 159 + .../namespacepenify__hook_1_1jira__client.js | 5 + .../namespacepenify__hook_1_1llm__client.html | 138 + .../namespacepenify__hook_1_1llm__client.js | 4 + ...mespacepenify__hook_1_1login__command.html | 196 + ...63db4c484797bead34b7d874020c6a_icgraph.map | 4 + ...63db4c484797bead34b7d874020c6a_icgraph.md5 | 1 + ...63db4c484797bead34b7d874020c6a_icgraph.svg | 44 + ...4bf932fbafeff834b0a0c5a37f74ccd_cgraph.map | 6 + ...4bf932fbafeff834b0a0c5a37f74ccd_cgraph.md5 | 1 + ...4bf932fbafeff834b0a0c5a37f74ccd_cgraph.svg | 165 + ...32fbafeff834b0a0c5a37f74ccd_cgraph_org.svg | 77 + ...bf932fbafeff834b0a0c5a37f74ccd_icgraph.map | 4 + ...bf932fbafeff834b0a0c5a37f74ccd_icgraph.md5 | 1 + ...bf932fbafeff834b0a0c5a37f74ccd_icgraph.svg | 44 + docs/html/namespacepenify__hook_1_1main.html | 176 + ...6838b20df4bd14ee4b5e1dd2906738f_cgraph.map | 34 + ...6838b20df4bd14ee4b5e1dd2906738f_cgraph.md5 | 1 + ...6838b20df4bd14ee4b5e1dd2906738f_cgraph.svg | 708 ++ ...b20df4bd14ee4b5e1dd2906738f_cgraph_org.svg | 620 ++ ...838b20df4bd14ee4b5e1dd2906738f_icgraph.map | 3 + ...838b20df4bd14ee4b5e1dd2906738f_icgraph.md5 | 1 + ...838b20df4bd14ee4b5e1dd2906738f_icgraph.svg | 28 + .../namespacepenify__hook_1_1ui__utils.html | 795 ++ ...6fd2613c6fe053b6e4356cd9e5cda2_icgraph.map | 17 + ...6fd2613c6fe053b6e4356cd9e5cda2_icgraph.md5 | 1 + ...6fd2613c6fe053b6e4356cd9e5cda2_icgraph.svg | 347 + ...613c6fe053b6e4356cd9e5cda2_icgraph_org.svg | 259 + ...2b92532b1458af94f3649d411b5505c_cgraph.map | 4 + ...2b92532b1458af94f3649d411b5505c_cgraph.md5 | 1 + ...2b92532b1458af94f3649d411b5505c_cgraph.svg | 38 + ...b92532b1458af94f3649d411b5505c_icgraph.map | 4 + ...b92532b1458af94f3649d411b5505c_icgraph.md5 | 1 + ...b92532b1458af94f3649d411b5505c_icgraph.svg | 39 + ...ffbb9671dbe233770268e2dd66a67fa_cgraph.map | 4 + ...ffbb9671dbe233770268e2dd66a67fa_cgraph.md5 | 1 + ...ffbb9671dbe233770268e2dd66a67fa_cgraph.svg | 39 + ...fbb9671dbe233770268e2dd66a67fa_icgraph.map | 16 + ...fbb9671dbe233770268e2dd66a67fa_icgraph.md5 | 1 + ...fbb9671dbe233770268e2dd66a67fa_icgraph.svg | 331 + ...671dbe233770268e2dd66a67fa_icgraph_org.svg | 243 + ...b16aa6b68a9edea5f29f84f1c4be79a_cgraph.map | 4 + ...b16aa6b68a9edea5f29f84f1c4be79a_cgraph.md5 | 1 + ...b16aa6b68a9edea5f29f84f1c4be79a_cgraph.svg | 39 + ...16aa6b68a9edea5f29f84f1c4be79a_icgraph.map | 6 + ...16aa6b68a9edea5f29f84f1c4be79a_icgraph.md5 | 1 + ...16aa6b68a9edea5f29f84f1c4be79a_icgraph.svg | 71 + ...da02cd1140179a9ce60f62c85fccfef_cgraph.map | 4 + ...da02cd1140179a9ce60f62c85fccfef_cgraph.md5 | 1 + ...da02cd1140179a9ce60f62c85fccfef_cgraph.svg | 38 + ...a02cd1140179a9ce60f62c85fccfef_icgraph.map | 4 + ...a02cd1140179a9ce60f62c85fccfef_icgraph.md5 | 1 + ...a02cd1140179a9ce60f62c85fccfef_icgraph.svg | 39 + ...d934568897433fa73f9cc182ac4a3e_icgraph.map | 12 + ...d934568897433fa73f9cc182ac4a3e_icgraph.md5 | 1 + ...d934568897433fa73f9cc182ac4a3e_icgraph.svg | 266 + ...568897433fa73f9cc182ac4a3e_icgraph_org.svg | 178 + ...2cdb4de7c679ce8b29c3e9116c4776_icgraph.map | 7 + ...2cdb4de7c679ce8b29c3e9116c4776_icgraph.md5 | 1 + ...2cdb4de7c679ce8b29c3e9116c4776_icgraph.svg | 175 + ...4de7c679ce8b29c3e9116c4776_icgraph_org.svg | 87 + ...7340d0fc60fb80f17514d60bf45f1d_icgraph.map | 6 + ...7340d0fc60fb80f17514d60bf45f1d_icgraph.md5 | 1 + ...7340d0fc60fb80f17514d60bf45f1d_icgraph.svg | 165 + ...d0fc60fb80f17514d60bf45f1d_icgraph_org.svg | 77 + ...f0acd7dd91abfe67d0807803bc3b65f_cgraph.map | 4 + ...f0acd7dd91abfe67d0807803bc3b65f_cgraph.md5 | 1 + ...f0acd7dd91abfe67d0807803bc3b65f_cgraph.svg | 39 + ...0acd7dd91abfe67d0807803bc3b65f_icgraph.map | 11 + ...0acd7dd91abfe67d0807803bc3b65f_icgraph.md5 | 1 + ...0acd7dd91abfe67d0807803bc3b65f_icgraph.svg | 250 + ...7dd91abfe67d0807803bc3b65f_icgraph_org.svg | 162 + ...11f0adf6e9bf71510c379b6fa155e44_cgraph.map | 4 + ...11f0adf6e9bf71510c379b6fa155e44_cgraph.md5 | 1 + ...11f0adf6e9bf71510c379b6fa155e44_cgraph.svg | 37 + ...1f0adf6e9bf71510c379b6fa155e44_icgraph.map | 16 + ...1f0adf6e9bf71510c379b6fa155e44_icgraph.md5 | 1 + ...1f0adf6e9bf71510c379b6fa155e44_icgraph.svg | 356 + ...df6e9bf71510c379b6fa155e44_icgraph_org.svg | 268 + ...c3e466d1912058167be2eacf85b9f6_icgraph.map | 20 + ...c3e466d1912058167be2eacf85b9f6_icgraph.md5 | 1 + ...c3e466d1912058167be2eacf85b9f6_icgraph.svg | 425 + ...66d1912058167be2eacf85b9f6_icgraph_org.svg | 337 + ...e684c00e26199440137a87ed9b195c_icgraph.map | 5 + ...e684c00e26199440137a87ed9b195c_icgraph.md5 | 1 + ...e684c00e26199440137a87ed9b195c_icgraph.svg | 55 + ...fcbbfe39029ab6d1dd33e7bf75ae115_cgraph.map | 4 + ...fcbbfe39029ab6d1dd33e7bf75ae115_cgraph.md5 | 1 + ...fcbbfe39029ab6d1dd33e7bf75ae115_cgraph.svg | 39 + ...cbbfe39029ab6d1dd33e7bf75ae115_icgraph.map | 4 + ...cbbfe39029ab6d1dd33e7bf75ae115_icgraph.md5 | 1 + ...cbbfe39029ab6d1dd33e7bf75ae115_icgraph.svg | 39 + ...441fb3c2c3850b8b3b6455a9fdaba4_icgraph.map | 6 + ...441fb3c2c3850b8b3b6455a9fdaba4_icgraph.md5 | 1 + ...441fb3c2c3850b8b3b6455a9fdaba4_icgraph.svg | 160 + ...b3c2c3850b8b3b6455a9fdaba4_icgraph_org.svg | 72 + docs/html/namespacepenify__hook_1_1utils.html | 253 + docs/html/namespacepenify__hook_1_1utils.js | 8 + ...5c3f9c80860d6a2e2d061d2fb660a3f_cgraph.map | 3 + ...5c3f9c80860d6a2e2d061d2fb660a3f_cgraph.md5 | 1 + ...5c3f9c80860d6a2e2d061d2fb660a3f_cgraph.svg | 29 + ...c3f9c80860d6a2e2d061d2fb660a3f_icgraph.map | 41 + ...c3f9c80860d6a2e2d061d2fb660a3f_icgraph.md5 | 1 + ...c3f9c80860d6a2e2d061d2fb660a3f_icgraph.svg | 815 ++ ...c80860d6a2e2d061d2fb660a3f_icgraph_org.svg | 727 ++ docs/html/namespaces.html | 173 + docs/html/namespaces_dup.js | 20 + docs/html/namespacesetup.html | 345 + docs/html/namespacetests.html | 146 + docs/html/namespacetests.js | 20 + docs/html/namespacetests_1_1conftest.html | 130 + ...espacetests_1_1test__commit__commands.html | 138 + ...amespacetests_1_1test__commit__commands.js | 4 + ...espacetests_1_1test__config__commands.html | 138 + ...amespacetests_1_1test__config__commands.js | 4 + ...namespacetests_1_1test__doc__commands.html | 746 ++ ...e74c920f258f442914771164fe26b45_cgraph.map | 4 + ...e74c920f258f442914771164fe26b45_cgraph.md5 | 1 + ...e74c920f258f442914771164fe26b45_cgraph.svg | 39 + ...f27751d0ba2acfe40ef7e85bccf47d7_cgraph.map | 4 + ...f27751d0ba2acfe40ef7e85bccf47d7_cgraph.md5 | 1 + ...f27751d0ba2acfe40ef7e85bccf47d7_cgraph.svg | 39 + ...458af9ad0128c3ca1263b552fd5e482_cgraph.map | 12 + ...458af9ad0128c3ca1263b552fd5e482_cgraph.md5 | 1 + ...458af9ad0128c3ca1263b552fd5e482_cgraph.svg | 274 + ...f9ad0128c3ca1263b552fd5e482_cgraph_org.svg | 186 + ...35e7fd4912192c7276cf31bbebc6eb0_cgraph.map | 4 + ...35e7fd4912192c7276cf31bbebc6eb0_cgraph.md5 | 1 + ...35e7fd4912192c7276cf31bbebc6eb0_cgraph.svg | 39 + ...bb75610e40d94d42bc169b25403c186_cgraph.map | 4 + ...bb75610e40d94d42bc169b25403c186_cgraph.md5 | 1 + ...bb75610e40d94d42bc169b25403c186_cgraph.svg | 39 + ...4165ddfdb3071a88422f080f0e529a3_cgraph.map | 4 + ...4165ddfdb3071a88422f080f0e529a3_cgraph.md5 | 1 + ...4165ddfdb3071a88422f080f0e529a3_cgraph.svg | 40 + ...06110833eb0aad547156faf014b31d8_cgraph.map | 4 + ...06110833eb0aad547156faf014b31d8_cgraph.md5 | 1 + ...06110833eb0aad547156faf014b31d8_cgraph.svg | 39 + ...158ffa48469b6c097a7a55fcb20c21a_cgraph.map | 12 + ...158ffa48469b6c097a7a55fcb20c21a_cgraph.md5 | 1 + ...158ffa48469b6c097a7a55fcb20c21a_cgraph.svg | 274 + ...fa48469b6c097a7a55fcb20c21a_cgraph_org.svg | 186 + ...74688baa8c9b5ba302c2877a9789d05_cgraph.map | 12 + ...74688baa8c9b5ba302c2877a9789d05_cgraph.md5 | 1 + ...74688baa8c9b5ba302c2877a9789d05_cgraph.svg | 274 + ...8baa8c9b5ba302c2877a9789d05_cgraph_org.svg | 186 + ...c76cc25c23476794234cdadbcaef0c0_cgraph.map | 4 + ...c76cc25c23476794234cdadbcaef0c0_cgraph.md5 | 1 + ...c76cc25c23476794234cdadbcaef0c0_cgraph.svg | 39 + ...9b01e5fc89255cac96747fa081c442c_cgraph.map | 12 + ...9b01e5fc89255cac96747fa081c442c_cgraph.md5 | 1 + ...9b01e5fc89255cac96747fa081c442c_cgraph.svg | 274 + ...e5fc89255cac96747fa081c442c_cgraph_org.svg | 186 + .../namespacetests_1_1test__web__config.html | 138 + .../namespacetests_1_1test__web__config.js | 4 + docs/html/nav_f.png | Bin 0 -> 153 bytes docs/html/nav_g.png | Bin 0 -> 95 bytes docs/html/nav_h.png | Bin 0 -> 98 bytes docs/html/navtree.css | 147 + docs/html/navtree.js | 549 + docs/html/navtreedata.js | 241 + docs/html/navtreeindex0.js | 253 + docs/html/navtreeindex1.js | 253 + docs/html/navtreeindex2.js | 90 + docs/html/open.png | Bin 0 -> 123 bytes docs/html/pages.html | 139 + docs/html/penify-cli-documentation_8md.html | 130 + docs/html/penify__hook_2____init_____8py.html | 130 + ...ify__hook_2commands_2____init_____8py.html | 140 + docs/html/resize.js | 150 + docs/html/search/all_0.html | 37 + docs/html/search/all_0.js | 7 + docs/html/search/all_1.html | 37 + docs/html/search/all_1.js | 14 + docs/html/search/all_10.html | 37 + docs/html/search/all_10.js | 16 + docs/html/search/all_11.html | 37 + docs/html/search/all_11.js | 47 + docs/html/search/all_12.html | 37 + docs/html/search/all_12.js | 9 + docs/html/search/all_13.html | 37 + docs/html/search/all_13.js | 4 + docs/html/search/all_14.html | 37 + docs/html/search/all_14.js | 5 + docs/html/search/all_2.html | 37 + docs/html/search/all_2.js | 6 + docs/html/search/all_3.html | 37 + docs/html/search/all_3.js | 18 + docs/html/search/all_4.html | 37 + docs/html/search/all_4.js | 11 + docs/html/search/all_5.html | 37 + docs/html/search/all_5.js | 11 + docs/html/search/all_6.html | 37 + docs/html/search/all_6.js | 17 + docs/html/search/all_7.html | 37 + docs/html/search/all_7.js | 23 + docs/html/search/all_8.html | 37 + docs/html/search/all_8.js | 11 + docs/html/search/all_9.html | 37 + docs/html/search/all_9.js | 7 + docs/html/search/all_a.html | 37 + docs/html/search/all_a.js | 10 + docs/html/search/all_b.html | 37 + docs/html/search/all_b.js | 14 + docs/html/search/all_c.html | 37 + docs/html/search/all_c.js | 12 + docs/html/search/all_d.html | 37 + docs/html/search/all_d.js | 5 + docs/html/search/all_e.html | 37 + docs/html/search/all_e.js | 43 + docs/html/search/all_f.html | 37 + docs/html/search/all_f.js | 10 + docs/html/search/classes_0.html | 37 + docs/html/search/classes_0.js | 4 + docs/html/search/classes_1.html | 37 + docs/html/search/classes_1.js | 4 + docs/html/search/classes_2.html | 37 + docs/html/search/classes_2.js | 4 + docs/html/search/classes_3.html | 37 + docs/html/search/classes_3.js | 4 + docs/html/search/classes_4.html | 37 + docs/html/search/classes_4.js | 5 + docs/html/search/classes_5.html | 37 + docs/html/search/classes_5.js | 5 + docs/html/search/classes_6.html | 37 + docs/html/search/classes_6.js | 4 + docs/html/search/classes_7.html | 37 + docs/html/search/classes_7.js | 4 + docs/html/search/classes_8.html | 37 + docs/html/search/classes_8.js | 6 + docs/html/search/close.svg | 31 + docs/html/search/files_0.html | 37 + docs/html/search/files_0.js | 4 + docs/html/search/files_1.html | 37 + docs/html/search/files_1.js | 5 + docs/html/search/files_10.html | 37 + docs/html/search/files_10.js | 5 + docs/html/search/files_2.html | 37 + docs/html/search/files_2.js | 4 + docs/html/search/files_3.html | 37 + docs/html/search/files_3.js | 11 + docs/html/search/files_4.html | 37 + docs/html/search/files_4.js | 6 + docs/html/search/files_5.html | 37 + docs/html/search/files_5.js | 4 + docs/html/search/files_6.html | 37 + docs/html/search/files_6.js | 5 + docs/html/search/files_7.html | 37 + docs/html/search/files_7.js | 4 + docs/html/search/files_8.html | 37 + docs/html/search/files_8.js | 4 + docs/html/search/files_9.html | 37 + docs/html/search/files_9.js | 4 + docs/html/search/files_a.html | 37 + docs/html/search/files_a.js | 5 + docs/html/search/files_b.html | 37 + docs/html/search/files_b.js | 4 + docs/html/search/files_c.html | 37 + docs/html/search/files_c.js | 4 + docs/html/search/files_d.html | 37 + docs/html/search/files_d.js | 4 + docs/html/search/files_e.html | 37 + docs/html/search/files_e.js | 4 + docs/html/search/files_f.html | 37 + docs/html/search/files_f.js | 7 + docs/html/search/functions_0.html | 37 + docs/html/search/functions_0.js | 5 + docs/html/search/functions_1.html | 37 + docs/html/search/functions_1.js | 4 + docs/html/search/functions_2.html | 37 + docs/html/search/functions_2.js | 8 + docs/html/search/functions_3.html | 37 + docs/html/search/functions_3.js | 6 + docs/html/search/functions_4.html | 37 + docs/html/search/functions_4.js | 11 + docs/html/search/functions_5.html | 37 + docs/html/search/functions_5.js | 20 + docs/html/search/functions_6.html | 37 + docs/html/search/functions_6.js | 7 + docs/html/search/functions_7.html | 37 + docs/html/search/functions_7.js | 5 + docs/html/search/functions_8.html | 37 + docs/html/search/functions_8.js | 7 + docs/html/search/functions_9.html | 37 + docs/html/search/functions_9.js | 10 + docs/html/search/functions_a.html | 37 + docs/html/search/functions_a.js | 11 + docs/html/search/functions_b.html | 37 + docs/html/search/functions_b.js | 5 + docs/html/search/functions_c.html | 37 + docs/html/search/functions_c.js | 11 + docs/html/search/functions_d.html | 37 + docs/html/search/functions_d.js | 34 + docs/html/search/functions_e.html | 37 + docs/html/search/functions_e.js | 6 + docs/html/search/mag_sel.svg | 74 + docs/html/search/namespaces_0.html | 37 + docs/html/search/namespaces_0.js | 24 + docs/html/search/namespaces_1.html | 37 + docs/html/search/namespaces_1.js | 4 + docs/html/search/namespaces_2.html | 37 + docs/html/search/namespaces_2.js | 9 + docs/html/search/nomatches.html | 13 + docs/html/search/pages_0.html | 37 + docs/html/search/pages_0.js | 9 + docs/html/search/search.css | 263 + docs/html/search/search.js | 802 ++ docs/html/search/search_l.png | Bin 0 -> 567 bytes docs/html/search/search_m.png | Bin 0 -> 158 bytes docs/html/search/search_r.png | Bin 0 -> 553 bytes docs/html/search/searchdata.js | 33 + docs/html/search/variables_0.html | 37 + docs/html/search/variables_0.js | 4 + docs/html/search/variables_1.html | 37 + docs/html/search/variables_1.js | 10 + docs/html/search/variables_10.html | 37 + docs/html/search/variables_10.js | 4 + docs/html/search/variables_11.html | 37 + docs/html/search/variables_11.js | 4 + docs/html/search/variables_12.html | 37 + docs/html/search/variables_12.js | 5 + docs/html/search/variables_2.html | 37 + docs/html/search/variables_2.js | 4 + docs/html/search/variables_3.html | 37 + docs/html/search/variables_3.js | 4 + docs/html/search/variables_4.html | 37 + docs/html/search/variables_4.js | 8 + docs/html/search/variables_5.html | 37 + docs/html/search/variables_5.js | 6 + docs/html/search/variables_6.html | 37 + docs/html/search/variables_6.js | 5 + docs/html/search/variables_7.html | 37 + docs/html/search/variables_7.js | 6 + docs/html/search/variables_8.html | 37 + docs/html/search/variables_8.js | 5 + docs/html/search/variables_9.html | 37 + docs/html/search/variables_9.js | 8 + docs/html/search/variables_a.html | 37 + docs/html/search/variables_a.js | 7 + docs/html/search/variables_b.html | 37 + docs/html/search/variables_b.js | 4 + docs/html/search/variables_c.html | 37 + docs/html/search/variables_c.js | 5 + docs/html/search/variables_d.html | 37 + docs/html/search/variables_d.js | 7 + docs/html/search/variables_e.html | 37 + docs/html/search/variables_e.js | 7 + docs/html/search/variables_f.html | 37 + docs/html/search/variables_f.js | 6 + docs/html/setup_8py.html | 168 + docs/html/setup_8py.js | 16 + docs/html/splitbar.png | Bin 0 -> 314 bytes docs/html/svgpan.js | 323 + docs/html/sync_off.png | Bin 0 -> 853 bytes docs/html/sync_on.png | Bin 0 -> 845 bytes docs/html/tab_a.png | Bin 0 -> 142 bytes docs/html/tab_b.png | Bin 0 -> 169 bytes docs/html/tab_h.png | Bin 0 -> 177 bytes docs/html/tab_s.png | Bin 0 -> 184 bytes docs/html/tabs.css | 1 + docs/html/test__commit__commands_8py.html | 146 + docs/html/test__commit__commands_8py.js | 4 + docs/html/test__config__commands_8py.html | 146 + docs/html/test__config__commands_8py.js | 4 + docs/html/test__doc__commands_8py.html | 166 + docs/html/test__doc__commands_8py.js | 14 + docs/html/test__web__config_8py.html | 146 + docs/html/test__web__config_8py.js | 4 + docs/html/tests_2____init_____8py.html | 138 + docs/html/toggle-alternative-theme.js | 11 + docs/html/ui__utils_8py.html | 200 + docs/html/ui__utils_8py.js | 29 + docs/html/utils_8py.html | 162 + docs/html/utils_8py.js | 8 + docs/penify-cli-Penify-dev-g.tar.gz | Bin 0 -> 793800 bytes docs/rtf/classException__coll__graph.md5 | 1 + docs/rtf/classException__coll__graph.svg | 26 + docs/rtf/classException__inherit__graph.md5 | 1 + docs/rtf/classException__inherit__graph.svg | 46 + ...1api__client_1_1APIClient__coll__graph.md5 | 1 + ...1api__client_1_1APIClient__coll__graph.svg | 36 + ...f74798e7d428b4e2f20095287eb2ce_icgraph.md5 | 1 + ...f74798e7d428b4e2f20095287eb2ce_icgraph.svg | 39 + ...0ada470b897935f9fb372cd0e7e51e3_cgraph.md5 | 1 + ...0ada470b897935f9fb372cd0e7e51e3_cgraph.svg | 70 + ..._analyzer_1_1BaseAnalyzer__coll__graph.md5 | 1 + ..._analyzer_1_1BaseAnalyzer__coll__graph.svg | 33 + ...alyzer_1_1BaseAnalyzer__inherit__graph.md5 | 1 + ...alyzer_1_1BaseAnalyzer__inherit__graph.svg | 127 + ...lyzer_1_1CommitDocGenHook__coll__graph.md5 | 1 + ...lyzer_1_1CommitDocGenHook__coll__graph.svg | 57 + ...er_1_1CommitDocGenHook__inherit__graph.md5 | 1 + ...er_1_1CommitDocGenHook__inherit__graph.svg | 57 + ...370a03f7ed9175ef6f81e931a105ea9_cgraph.md5 | 1 + ...370a03f7ed9175ef6f81e931a105ea9_cgraph.svg | 180 + ...496194276441fa2eb2fa014eaab9a37_cgraph.md5 | 1 + ...496194276441fa2eb2fa014eaab9a37_cgraph.svg | 54 + ...96194276441fa2eb2fa014eaab9a37_icgraph.md5 | 1 + ...96194276441fa2eb2fa014eaab9a37_icgraph.svg | 40 + ...99c5cbc852a7ec3b412ccb43c274ca_icgraph.md5 | 1 + ...99c5cbc852a7ec3b412ccb43c274ca_icgraph.svg | 40 + ...da13cc121d96342476ccf72b63a007f_cgraph.md5 | 1 + ...da13cc121d96342476ccf72b63a007f_cgraph.svg | 86 + ...a13cc121d96342476ccf72b63a007f_icgraph.md5 | 1 + ...a13cc121d96342476ccf72b63a007f_icgraph.svg | 40 + ...127d86729e226d74dbeb095b008db3e_cgraph.md5 | 1 + ...127d86729e226d74dbeb095b008db3e_cgraph.svg | 30 + ...27d86729e226d74dbeb095b008db3e_icgraph.md5 | 1 + ...27d86729e226d74dbeb095b008db3e_icgraph.svg | 30 + ...er_1_1FileAnalyzerGenHook__coll__graph.md5 | 1 + ...er_1_1FileAnalyzerGenHook__coll__graph.svg | 56 + ...1_1FileAnalyzerGenHook__inherit__graph.md5 | 1 + ...1_1FileAnalyzerGenHook__inherit__graph.svg | 56 + ...cc6c22ef588fccf3eed9bbc57fb6d6e_cgraph.md5 | 1 + ...cc6c22ef588fccf3eed9bbc57fb6d6e_cgraph.svg | 71 + ...c6c22ef588fccf3eed9bbc57fb6d6e_icgraph.md5 | 1 + ...c6c22ef588fccf3eed9bbc57fb6d6e_icgraph.svg | 55 + ...f4dffbc432fac3e259d957dd1e187f1_cgraph.md5 | 1 + ...f4dffbc432fac3e259d957dd1e187f1_cgraph.svg | 204 + ...ab39391dfb7686f2a2d21a702dd3073_cgraph.md5 | 1 + ...ab39391dfb7686f2a2d21a702dd3073_cgraph.svg | 40 + ..._1_1FolderAnalyzerGenHook__coll__graph.md5 | 1 + ..._1_1FolderAnalyzerGenHook__coll__graph.svg | 55 + ...1FolderAnalyzerGenHook__inherit__graph.md5 | 1 + ...1FolderAnalyzerGenHook__inherit__graph.svg | 55 + ...b845318fc7ac3b607daf26378e19ec_icgraph.md5 | 1 + ...b845318fc7ac3b607daf26378e19ec_icgraph.svg | 41 + ...d189d1b8c773bf710a899eb21fd76cc_cgraph.md5 | 1 + ...d189d1b8c773bf710a899eb21fd76cc_cgraph.svg | 41 + ...analyzer_1_1GitDocGenHook__coll__graph.md5 | 1 + ...analyzer_1_1GitDocGenHook__coll__graph.svg | 58 + ...lyzer_1_1GitDocGenHook__inherit__graph.md5 | 1 + ...lyzer_1_1GitDocGenHook__inherit__graph.svg | 58 + ...5313caa22b173ce75638f0db08eeb85_cgraph.md5 | 1 + ...5313caa22b173ce75638f0db08eeb85_cgraph.svg | 39 + ...313caa22b173ce75638f0db08eeb85_icgraph.md5 | 1 + ...313caa22b173ce75638f0db08eeb85_icgraph.svg | 55 + ...549766100e91eb94b5f1a1d34bf481_icgraph.md5 | 1 + ...549766100e91eb94b5f1a1d34bf481_icgraph.svg | 40 + ...beba14e92d717391a74bb70b1fab0ae_cgraph.md5 | 1 + ...beba14e92d717391a74bb70b1fab0ae_cgraph.svg | 268 + ...2275fddb43dbef6dfdb6c1ed6e96d0c_cgraph.md5 | 1 + ...2275fddb43dbef6dfdb6c1ed6e96d0c_cgraph.svg | 29 + ...275fddb43dbef6dfdb6c1ed6e96d0c_icgraph.md5 | 1 + ...275fddb43dbef6dfdb6c1ed6e96d0c_icgraph.svg | 29 + ...4d2f51315ed6a1965a7fd7e2ced0cd_icgraph.md5 | 1 + ...4d2f51315ed6a1965a7fd7e2ced0cd_icgraph.svg | 71 + ...ira__client_1_1JiraClient__coll__graph.md5 | 1 + ...ira__client_1_1JiraClient__coll__graph.svg | 44 + ...d0f9ae006313a21576362d26ac5ec8_icgraph.md5 | 1 + ...d0f9ae006313a21576362d26ac5ec8_icgraph.svg | 176 + ...93d6456fe053ef7a7862d5d6851910c_cgraph.md5 | 1 + ...93d6456fe053ef7a7862d5d6851910c_cgraph.svg | 54 + ...9ea1149758f7f5212149d357b13cc23_cgraph.md5 | 1 + ...9ea1149758f7f5212149d357b13cc23_cgraph.svg | 78 + ...ea1149758f7f5212149d357b13cc23_icgraph.md5 | 1 + ...ea1149758f7f5212149d357b13cc23_icgraph.svg | 41 + ...5f6924819084b7c8d268956a784804a_cgraph.md5 | 1 + ...5f6924819084b7c8d268956a784804a_cgraph.svg | 39 + ...f6924819084b7c8d268956a784804a_icgraph.md5 | 1 + ...f6924819084b7c8d268956a784804a_icgraph.svg | 80 + ...0d2c5a6432aa6f238da0ff65d49a760_cgraph.md5 | 1 + ...0d2c5a6432aa6f238da0ff65d49a760_cgraph.svg | 153 + ...1f374116c64cd5f1492ec7f7e40f9c1_cgraph.md5 | 1 + ...1f374116c64cd5f1492ec7f7e40f9c1_cgraph.svg | 45 + ...f374116c64cd5f1492ec7f7e40f9c1_icgraph.md5 | 1 + ...f374116c64cd5f1492ec7f7e40f9c1_icgraph.svg | 29 + ...967169a4b7970c67c0947b9ac56f746_cgraph.md5 | 1 + ...967169a4b7970c67c0947b9ac56f746_cgraph.svg | 40 + ...67169a4b7970c67c0947b9ac56f746_icgraph.md5 | 1 + ...67169a4b7970c67c0947b9ac56f746_icgraph.svg | 58 + ...a8837552d37bfd611de23441a240826_cgraph.md5 | 1 + ...a8837552d37bfd611de23441a240826_cgraph.svg | 40 + ...823ad1d3baaedd38039913c3a97fd7_icgraph.md5 | 1 + ...823ad1d3baaedd38039913c3a97fd7_icgraph.svg | 57 + ...b41ce6f13c30b1265d439ddf04bf2cd_cgraph.md5 | 1 + ...b41ce6f13c30b1265d439ddf04bf2cd_cgraph.svg | 85 + ...41ce6f13c30b1265d439ddf04bf2cd_icgraph.md5 | 1 + ...41ce6f13c30b1265d439ddf04bf2cd_icgraph.svg | 41 + ...1llm__client_1_1LLMClient__coll__graph.md5 | 1 + ...1llm__client_1_1LLMClient__coll__graph.svg | 29 + ...ad3014dac466ee1d8e00306d0cf2000_cgraph.md5 | 1 + ...ad3014dac466ee1d8e00306d0cf2000_cgraph.svg | 38 + ...d3014dac466ee1d8e00306d0cf2000_icgraph.md5 | 1 + ...d3014dac466ee1d8e00306d0cf2000_icgraph.svg | 39 + ...f06658ca922793f879474f2234518e_icgraph.md5 | 1 + ...f06658ca922793f879474f2234518e_icgraph.svg | 54 + ...s_1_1GitRepoNotFoundError__coll__graph.md5 | 1 + ...s_1_1GitRepoNotFoundError__coll__graph.svg | 46 + ..._1GitRepoNotFoundError__inherit__graph.md5 | 1 + ..._1GitRepoNotFoundError__inherit__graph.svg | 46 + ...nds_1_1TestCommitCommands__coll__graph.md5 | 1 + ...nds_1_1TestCommitCommands__coll__graph.svg | 42 + ...3c2ff3707124aa48e8eb581106b8691_cgraph.md5 | 1 + ...3c2ff3707124aa48e8eb581106b8691_cgraph.svg | 156 + ...d04b125e102190a768f65f1948f15bc_cgraph.md5 | 1 + ...d04b125e102190a768f65f1948f15bc_cgraph.svg | 40 + ...13e368262340af98b30fd8ebdac6597_cgraph.md5 | 1 + ...13e368262340af98b30fd8ebdac6597_cgraph.svg | 317 + ...c4b1e4189792a3f7c11d2a745f479c0_cgraph.md5 | 1 + ...c4b1e4189792a3f7c11d2a745f479c0_cgraph.svg | 156 + ...ea0d934ee0f2b914b0b893736e8fe4e_cgraph.md5 | 1 + ...ea0d934ee0f2b914b0b893736e8fe4e_cgraph.svg | 157 + ...9c09013055ec39ddde86b487aefcf8b_cgraph.md5 | 1 + ...9c09013055ec39ddde86b487aefcf8b_cgraph.svg | 156 + ...nds_1_1TestConfigCommands__coll__graph.md5 | 1 + ...nds_1_1TestConfigCommands__coll__graph.svg | 50 + ...e8162082bcdd5652bb37bdb14cf453a_cgraph.md5 | 1 + ...e8162082bcdd5652bb37bdb14cf453a_cgraph.svg | 62 + ...355f7d313bebaa71694387cf2bc5232_cgraph.md5 | 1 + ...355f7d313bebaa71694387cf2bc5232_cgraph.svg | 123 + ...3d4760eee3b67e1cde3aed755ebb948_cgraph.md5 | 1 + ...3d4760eee3b67e1cde3aed755ebb948_cgraph.svg | 62 + ...00ca5d9fcdc159714e8df54920f9436_cgraph.md5 | 1 + ...00ca5d9fcdc159714e8df54920f9436_cgraph.svg | 123 + ...73984d31452b56acd6ce4011a1248bd_cgraph.md5 | 1 + ...73984d31452b56acd6ce4011a1248bd_cgraph.svg | 101 + ...c0207be563c3de59a6d16277805114c_cgraph.md5 | 1 + ...c0207be563c3de59a6d16277805114c_cgraph.svg | 123 + ...3a264dfb21e16003e095b79f6eab2ac_cgraph.md5 | 1 + ...3a264dfb21e16003e095b79f6eab2ac_cgraph.svg | 62 + ...d12f028b89aa9cd1152c0b9ece5d3cd_cgraph.md5 | 1 + ...d12f028b89aa9cd1152c0b9ece5d3cd_cgraph.svg | 101 + ...d8df8219441b9e9871b903a681400d9_cgraph.md5 | 1 + ...d8df8219441b9e9871b903a681400d9_cgraph.svg | 62 + ...f9f2233a3f4cc5725b9d4f05758b167_cgraph.md5 | 1 + ...f9f2233a3f4cc5725b9d4f05758b167_cgraph.svg | 101 + ...e37b97432821d19758c6325d4c74bcf_cgraph.md5 | 1 + ...e37b97432821d19758c6325d4c74bcf_cgraph.svg | 101 + ...8d62310da2d768e21770f8f01ff5375_cgraph.md5 | 1 + ...8d62310da2d768e21770f8f01ff5375_cgraph.svg | 62 + ...__config_1_1TestWebConfig__coll__graph.md5 | 1 + ...__config_1_1TestWebConfig__coll__graph.svg | 30 + ...6e600222e426b003850509cb1d3190a_cgraph.md5 | 1 + ...6e600222e426b003850509cb1d3190a_cgraph.svg | 139 + ...c6440352201d207ea8b4d26f8ccfa35_cgraph.md5 | 1 + ...c6440352201d207ea8b4d26f8ccfa35_cgraph.svg | 40 + .../dir_063e2d5fe58a131099a7fe4200cca78c.rtf | 137 + ...r_063e2d5fe58a131099a7fe4200cca78c_dep.md5 | 1 + ...r_063e2d5fe58a131099a7fe4200cca78c_dep.svg | 30 + .../dir_1648a057408aae8db85b8e3797335623.rtf | 119 + ...r_1648a057408aae8db85b8e3797335623_dep.md5 | 1 + ...r_1648a057408aae8db85b8e3797335623_dep.svg | 30 + .../dir_624fa2a8bce97f0444ac5cca335d4e23.rtf | 137 + ...r_624fa2a8bce97f0444ac5cca335d4e23_dep.md5 | 1 + ...r_624fa2a8bce97f0444ac5cca335d4e23_dep.svg | 30 + .../dir_b3b22d2ab7966b65f6b237e3231b41be.rtf | 135 + .../dir_f88c3381c1861b3f7ca1f3d63cf244b5.rtf | 163 + ...r_f88c3381c1861b3f7ca1f3d63cf244b5_dep.md5 | 1 + ...r_f88c3381c1861b3f7ca1f3d63cf244b5_dep.svg | 42 + ...8f375c58bb6f69f98675e6a9ac84655_cgraph.md5 | 1 + ...8f375c58bb6f69f98675e6a9ac84655_cgraph.svg | 61 + ...f375c58bb6f69f98675e6a9ac84655_icgraph.md5 | 1 + ...f375c58bb6f69f98675e6a9ac84655_icgraph.svg | 60 + ...3956ca1749d4218ea1dc6e5b6218b24_cgraph.md5 | 1 + ...3956ca1749d4218ea1dc6e5b6218b24_cgraph.svg | 45 + ...956ca1749d4218ea1dc6e5b6218b24_icgraph.md5 | 1 + ...956ca1749d4218ea1dc6e5b6218b24_icgraph.svg | 76 + ...2564c4e8ad59fc46d56cb0f9122a71a_cgraph.md5 | 1 + ...2564c4e8ad59fc46d56cb0f9122a71a_cgraph.svg | 139 + ...564c4e8ad59fc46d56cb0f9122a71a_icgraph.md5 | 1 + ...564c4e8ad59fc46d56cb0f9122a71a_icgraph.svg | 146 + ...27583116eb78e31a4d3cdc16d2f15c_icgraph.md5 | 1 + ...27583116eb78e31a4d3cdc16d2f15c_icgraph.svg | 61 + ...4f739f524c38b437e4e47673d683e23_cgraph.md5 | 1 + ...4f739f524c38b437e4e47673d683e23_cgraph.svg | 300 + ...f739f524c38b437e4e47673d683e23_icgraph.md5 | 1 + ...f739f524c38b437e4e47673d683e23_icgraph.svg | 61 + ...5bf3685c4dcb5c15ba6a4055e484cf2_cgraph.md5 | 1 + ...5bf3685c4dcb5c15ba6a4055e484cf2_cgraph.svg | 84 + ...bf3685c4dcb5c15ba6a4055e484cf2_icgraph.md5 | 1 + ...bf3685c4dcb5c15ba6a4055e484cf2_icgraph.svg | 149 + ...5dfc34a655ed80e6c95939b6f3c35c_icgraph.md5 | 1 + ...5dfc34a655ed80e6c95939b6f3c35c_icgraph.svg | 77 + ...af2b062dd33b1f1d7ddc7224f0ff87_icgraph.md5 | 1 + ...af2b062dd33b1f1d7ddc7224f0ff87_icgraph.svg | 398 + ...617bc5956e502c9555dc0dda0376df4_cgraph.md5 | 1 + ...617bc5956e502c9555dc0dda0376df4_cgraph.svg | 45 + ...17bc5956e502c9555dc0dda0376df4_icgraph.md5 | 1 + ...17bc5956e502c9555dc0dda0376df4_icgraph.svg | 94 + ...503d51c905e2f1b299b12d2a73bd812_cgraph.md5 | 1 + ...503d51c905e2f1b299b12d2a73bd812_cgraph.svg | 106 + ...03d51c905e2f1b299b12d2a73bd812_icgraph.md5 | 1 + ...03d51c905e2f1b299b12d2a73bd812_icgraph.svg | 214 + ...492bc8e7df6e38bb06ad05e572d4cc0_cgraph.md5 | 1 + ...492bc8e7df6e38bb06ad05e572d4cc0_cgraph.svg | 84 + ...92bc8e7df6e38bb06ad05e572d4cc0_icgraph.md5 | 1 + ...92bc8e7df6e38bb06ad05e572d4cc0_icgraph.svg | 128 + ...559a82d0bf727703d550d1003d3ed20_cgraph.md5 | 1 + ...559a82d0bf727703d550d1003d3ed20_cgraph.svg | 45 + ...59a82d0bf727703d550d1003d3ed20_icgraph.md5 | 1 + ...59a82d0bf727703d550d1003d3ed20_icgraph.svg | 264 + ...be277132ce0bc0aacef951cf1dee2ae_cgraph.md5 | 1 + ...be277132ce0bc0aacef951cf1dee2ae_cgraph.svg | 51 + ...e277132ce0bc0aacef951cf1dee2ae_icgraph.md5 | 1 + ...e277132ce0bc0aacef951cf1dee2ae_icgraph.svg | 403 + ...2486ac2bf16b4a671e49625bfa4f9b4_cgraph.md5 | 1 + ...2486ac2bf16b4a671e49625bfa4f9b4_cgraph.svg | 45 + ...486ac2bf16b4a671e49625bfa4f9b4_icgraph.md5 | 1 + ...486ac2bf16b4a671e49625bfa4f9b4_icgraph.svg | 116 + ...115198ea5d6808ccb98733957f50b06_cgraph.md5 | 1 + ...115198ea5d6808ccb98733957f50b06_cgraph.svg | 122 + ...15198ea5d6808ccb98733957f50b06_icgraph.md5 | 1 + ...15198ea5d6808ccb98733957f50b06_icgraph.svg | 77 + ...006ab13bff718ef783868a910c0b704_cgraph.md5 | 1 + ...006ab13bff718ef783868a910c0b704_cgraph.svg | 170 + ...06ab13bff718ef783868a910c0b704_icgraph.md5 | 1 + ...06ab13bff718ef783868a910c0b704_icgraph.svg | 108 + ...aac68bc563432bf25c85dc78081a25_icgraph.md5 | 1 + ...aac68bc563432bf25c85dc78081a25_icgraph.svg | 221 + ...7f4ead1b11951d885fa5c151c2cbe0_icgraph.md5 | 1 + ...7f4ead1b11951d885fa5c151c2cbe0_icgraph.svg | 60 + ...543eb5fa835fd1237f24e8bce6201d_icgraph.md5 | 1 + ...543eb5fa835fd1237f24e8bce6201d_icgraph.svg | 124 + ...f8f5d3bf1c3795974a391ee95b72b2_icgraph.md5 | 1 + ...f8f5d3bf1c3795974a391ee95b72b2_icgraph.svg | 124 + ...40e5331681eb574ac319d7458783bde_cgraph.md5 | 1 + ...40e5331681eb574ac319d7458783bde_cgraph.svg | 182 + ...0e5331681eb574ac319d7458783bde_icgraph.md5 | 1 + ...0e5331681eb574ac319d7458783bde_icgraph.svg | 44 + ...3eb92164a69df1446d745f8a09285e_icgraph.md5 | 1 + ...3eb92164a69df1446d745f8a09285e_icgraph.svg | 45 + ...63db4c484797bead34b7d874020c6a_icgraph.md5 | 1 + ...63db4c484797bead34b7d874020c6a_icgraph.svg | 44 + ...4bf932fbafeff834b0a0c5a37f74ccd_cgraph.md5 | 1 + ...4bf932fbafeff834b0a0c5a37f74ccd_cgraph.svg | 77 + ...bf932fbafeff834b0a0c5a37f74ccd_icgraph.md5 | 1 + ...bf932fbafeff834b0a0c5a37f74ccd_icgraph.svg | 44 + ...6838b20df4bd14ee4b5e1dd2906738f_cgraph.md5 | 1 + ...6838b20df4bd14ee4b5e1dd2906738f_cgraph.svg | 620 ++ ...838b20df4bd14ee4b5e1dd2906738f_icgraph.md5 | 1 + ...838b20df4bd14ee4b5e1dd2906738f_icgraph.svg | 28 + ...6fd2613c6fe053b6e4356cd9e5cda2_icgraph.md5 | 1 + ...6fd2613c6fe053b6e4356cd9e5cda2_icgraph.svg | 259 + ...2b92532b1458af94f3649d411b5505c_cgraph.md5 | 1 + ...2b92532b1458af94f3649d411b5505c_cgraph.svg | 38 + ...b92532b1458af94f3649d411b5505c_icgraph.md5 | 1 + ...b92532b1458af94f3649d411b5505c_icgraph.svg | 39 + ...ffbb9671dbe233770268e2dd66a67fa_cgraph.md5 | 1 + ...ffbb9671dbe233770268e2dd66a67fa_cgraph.svg | 39 + ...fbb9671dbe233770268e2dd66a67fa_icgraph.md5 | 1 + ...fbb9671dbe233770268e2dd66a67fa_icgraph.svg | 243 + ...b16aa6b68a9edea5f29f84f1c4be79a_cgraph.md5 | 1 + ...b16aa6b68a9edea5f29f84f1c4be79a_cgraph.svg | 39 + ...16aa6b68a9edea5f29f84f1c4be79a_icgraph.md5 | 1 + ...16aa6b68a9edea5f29f84f1c4be79a_icgraph.svg | 71 + ...da02cd1140179a9ce60f62c85fccfef_cgraph.md5 | 1 + ...da02cd1140179a9ce60f62c85fccfef_cgraph.svg | 38 + ...a02cd1140179a9ce60f62c85fccfef_icgraph.md5 | 1 + ...a02cd1140179a9ce60f62c85fccfef_icgraph.svg | 39 + ...d934568897433fa73f9cc182ac4a3e_icgraph.md5 | 1 + ...d934568897433fa73f9cc182ac4a3e_icgraph.svg | 178 + ...2cdb4de7c679ce8b29c3e9116c4776_icgraph.md5 | 1 + ...2cdb4de7c679ce8b29c3e9116c4776_icgraph.svg | 87 + ...7340d0fc60fb80f17514d60bf45f1d_icgraph.md5 | 1 + ...7340d0fc60fb80f17514d60bf45f1d_icgraph.svg | 77 + ...f0acd7dd91abfe67d0807803bc3b65f_cgraph.md5 | 1 + ...f0acd7dd91abfe67d0807803bc3b65f_cgraph.svg | 39 + ...0acd7dd91abfe67d0807803bc3b65f_icgraph.md5 | 1 + ...0acd7dd91abfe67d0807803bc3b65f_icgraph.svg | 162 + ...11f0adf6e9bf71510c379b6fa155e44_cgraph.md5 | 1 + ...11f0adf6e9bf71510c379b6fa155e44_cgraph.svg | 37 + ...1f0adf6e9bf71510c379b6fa155e44_icgraph.md5 | 1 + ...1f0adf6e9bf71510c379b6fa155e44_icgraph.svg | 268 + ...c3e466d1912058167be2eacf85b9f6_icgraph.md5 | 1 + ...c3e466d1912058167be2eacf85b9f6_icgraph.svg | 337 + ...e684c00e26199440137a87ed9b195c_icgraph.md5 | 1 + ...e684c00e26199440137a87ed9b195c_icgraph.svg | 55 + ...fcbbfe39029ab6d1dd33e7bf75ae115_cgraph.md5 | 1 + ...fcbbfe39029ab6d1dd33e7bf75ae115_cgraph.svg | 39 + ...cbbfe39029ab6d1dd33e7bf75ae115_icgraph.md5 | 1 + ...cbbfe39029ab6d1dd33e7bf75ae115_icgraph.svg | 39 + ...441fb3c2c3850b8b3b6455a9fdaba4_icgraph.md5 | 1 + ...441fb3c2c3850b8b3b6455a9fdaba4_icgraph.svg | 72 + ...5c3f9c80860d6a2e2d061d2fb660a3f_cgraph.md5 | 1 + ...5c3f9c80860d6a2e2d061d2fb660a3f_cgraph.svg | 29 + ...c3f9c80860d6a2e2d061d2fb660a3f_icgraph.md5 | 1 + ...c3f9c80860d6a2e2d061d2fb660a3f_icgraph.svg | 727 ++ ...e74c920f258f442914771164fe26b45_cgraph.md5 | 1 + ...e74c920f258f442914771164fe26b45_cgraph.svg | 39 + ...f27751d0ba2acfe40ef7e85bccf47d7_cgraph.md5 | 1 + ...f27751d0ba2acfe40ef7e85bccf47d7_cgraph.svg | 39 + ...458af9ad0128c3ca1263b552fd5e482_cgraph.md5 | 1 + ...458af9ad0128c3ca1263b552fd5e482_cgraph.svg | 186 + ...35e7fd4912192c7276cf31bbebc6eb0_cgraph.md5 | 1 + ...35e7fd4912192c7276cf31bbebc6eb0_cgraph.svg | 39 + ...bb75610e40d94d42bc169b25403c186_cgraph.md5 | 1 + ...bb75610e40d94d42bc169b25403c186_cgraph.svg | 39 + ...4165ddfdb3071a88422f080f0e529a3_cgraph.md5 | 1 + ...4165ddfdb3071a88422f080f0e529a3_cgraph.svg | 40 + ...06110833eb0aad547156faf014b31d8_cgraph.md5 | 1 + ...06110833eb0aad547156faf014b31d8_cgraph.svg | 39 + ...158ffa48469b6c097a7a55fcb20c21a_cgraph.md5 | 1 + ...158ffa48469b6c097a7a55fcb20c21a_cgraph.svg | 186 + ...74688baa8c9b5ba302c2877a9789d05_cgraph.md5 | 1 + ...74688baa8c9b5ba302c2877a9789d05_cgraph.svg | 186 + ...c76cc25c23476794234cdadbcaef0c0_cgraph.md5 | 1 + ...c76cc25c23476794234cdadbcaef0c0_cgraph.svg | 39 + ...9b01e5fc89255cac96747fa081c442c_cgraph.md5 | 1 + ...9b01e5fc89255cac96747fa081c442c_cgraph.svg | 186 + docs/rtf/refman.rtf | 8871 +++++++++++++++++ docs/xml/Doxyfile.xml | 391 + docs/xml/README_8md.xml | 179 + docs/xml/api__client_8py.xml | 127 + docs/xml/auth__commands_8py.xml | 184 + docs/xml/base__analyzer_8py.xml | 36 + docs/xml/classException.xml | 32 + ...nify__hook_1_1api__client_1_1APIClient.xml | 290 + ...hook_1_1base__analyzer_1_1BaseAnalyzer.xml | 211 + ..._1commit__analyzer_1_1CommitDocGenHook.xml | 278 + ...1file__analyzer_1_1FileAnalyzerGenHook.xml | 195 + ...der__analyzer_1_1FolderAnalyzerGenHook.xml | 143 + ...hook_1_1git__analyzer_1_1GitDocGenHook.xml | 209 + ...fy__hook_1_1jira__client_1_1JiraClient.xml | 523 + ...nify__hook_1_1llm__client_1_1LLMClient.xml | 187 + ..._hook_1_1utils_1_1GitRepoNotFoundError.xml | 38 + ...commit__commands_1_1TestCommitCommands.xml | 551 + ...config__commands_1_1TestConfigCommands.xml | 578 ++ ..._1_1test__web__config_1_1TestWebConfig.xml | 112 + docs/xml/combine.xslt | 15 + docs/xml/commit-commands_8md.xml | 174 + docs/xml/commit__analyzer_8py.xml | 188 + docs/xml/commit__commands_8py.xml | 162 + docs/xml/compound.xsd | 1290 +++ docs/xml/config-commands_8md.xml | 179 + docs/xml/config__command_8py.xml | 101 + docs/xml/config__commands_8py.xml | 536 + docs/xml/conftest_8py.xml | 23 + docs/xml/constants_8py.xml | 17 + docs/xml/detailed-usage_8md.xml | 173 + .../dir_063e2d5fe58a131099a7fe4200cca78c.xml | 17 + .../dir_1648a057408aae8db85b8e3797335623.xml | 11 + .../dir_624fa2a8bce97f0444ac5cca335d4e23.xml | 17 + .../dir_b3b22d2ab7966b65f6b237e3231b41be.xml | 15 + .../dir_f88c3381c1861b3f7ca1f3d63cf244b5.xml | 27 + docs/xml/doc__commands_8md.xml | 340 + docs/xml/doc__commands_8py.xml | 152 + docs/xml/doxyfile.xsd | 45 + docs/xml/example-workflows_8md.xml | 156 + docs/xml/file__analyzer_8py.xml | 170 + docs/xml/folder__analyzer_8py.xml | 67 + docs/xml/git__analyzer_8py.xml | 193 + docs/xml/hook__commands_8py.xml | 52 + docs/xml/index.xml | 351 + docs/xml/index.xsd | 71 + docs/xml/jira__client_8py.xml | 438 + docs/xml/llm__client_8py.xml | 189 + docs/xml/login__command_8py.xml | 30 + docs/xml/main_8py.xml | 101 + ...enContext_Penify_dev_penify_cli_README.xml | 163 + ...fy_dev_penify_cli_docs_commit_commands.xml | 172 + ...fy_dev_penify_cli_docs_config_commands.xml | 205 + ...ify_dev_penify_cli_docs_detailed_usage.xml | 197 + ...enify_dev_penify_cli_docs_doc_commands.xml | 317 + ..._dev_penify_cli_docs_example_workflows.xml | 161 + docs/xml/namespacepenify__hook.xml | 26 + .../namespacepenify__hook_1_1api__client.xml | 12 + ...amespacepenify__hook_1_1base__analyzer.xml | 12 + .../xml/namespacepenify__hook_1_1commands.xml | 16 + ...fy__hook_1_1commands_1_1auth__commands.xml | 77 + ...__hook_1_1commands_1_1commit__commands.xml | 154 + ...__hook_1_1commands_1_1config__commands.xml | 323 + ...ify__hook_1_1commands_1_1doc__commands.xml | 134 + ...fy__hook_1_1commands_1_1hook__commands.xml | 94 + ...espacepenify__hook_1_1commit__analyzer.xml | 12 + ...mespacepenify__hook_1_1config__command.xml | 67 + .../namespacepenify__hook_1_1constants.xml | 43 + ...amespacepenify__hook_1_1file__analyzer.xml | 29 + ...espacepenify__hook_1_1folder__analyzer.xml | 12 + ...namespacepenify__hook_1_1git__analyzer.xml | 29 + .../namespacepenify__hook_1_1jira__client.xml | 29 + .../namespacepenify__hook_1_1llm__client.xml | 12 + ...amespacepenify__hook_1_1login__command.xml | 55 + docs/xml/namespacepenify__hook_1_1main.xml | 47 + .../namespacepenify__hook_1_1ui__utils.xml | 529 + docs/xml/namespacepenify__hook_1_1utils.xml | 113 + docs/xml/namespacesetup.xml | 195 + docs/xml/namespacestd.xml | 110 + docs/xml/namespacetests.xml | 16 + docs/xml/namespacetests_1_1conftest.xml | 11 + ...mespacetests_1_1test__commit__commands.xml | 12 + ...mespacetests_1_1test__config__commands.xml | 12 + .../namespacetests_1_1test__doc__commands.xml | 461 + .../namespacetests_1_1test__web__config.xml | 12 + docs/xml/penify-cli-documentation_8md.xml | 220 + docs/xml/penify__hook_2____init_____8py.xml | 13 + ...nify__hook_2commands_2____init_____8py.xml | 16 + docs/xml/setup_8py.xml | 46 + docs/xml/test__commit__commands_8py.xml | 450 + docs/xml/test__config__commands_8py.xml | 465 + docs/xml/test__doc__commands_8py.xml | 372 + docs/xml/test__web__config_8py.xml | 110 + docs/xml/tests_2____init_____8py.xml | 15 + docs/xml/ui__utils_8py.xml | 125 + docs/xml/utils_8py.xml | 116 + docs/xml/xml.xsd | 23 + 1394 files changed, 113532 insertions(+) create mode 100644 docs/html/README_8md.html create mode 100644 docs/html/annotated.html create mode 100644 docs/html/annotated_dup.js create mode 100644 docs/html/api__client_8py.html create mode 100644 docs/html/api__client_8py.js create mode 100644 docs/html/auth__commands_8py.html create mode 100644 docs/html/auth__commands_8py.js create mode 100644 docs/html/base__analyzer_8py.html create mode 100644 docs/html/base__analyzer_8py.js create mode 100644 docs/html/bc_s.png create mode 100644 docs/html/bdwn.png create mode 100644 docs/html/classException.html create mode 100644 docs/html/classException__coll__graph.map create mode 100644 docs/html/classException__coll__graph.md5 create mode 100644 docs/html/classException__coll__graph.svg create mode 100644 docs/html/classException__inherit__graph.map create mode 100644 docs/html/classException__inherit__graph.md5 create mode 100644 docs/html/classException__inherit__graph.svg create mode 100644 docs/html/classes.html create mode 100644 docs/html/classpenify__hook_1_1api__client_1_1APIClient-members.html create mode 100644 docs/html/classpenify__hook_1_1api__client_1_1APIClient.html create mode 100644 docs/html/classpenify__hook_1_1api__client_1_1APIClient.js create mode 100644 docs/html/classpenify__hook_1_1api__client_1_1APIClient__coll__graph.map create mode 100644 docs/html/classpenify__hook_1_1api__client_1_1APIClient__coll__graph.md5 create mode 100644 docs/html/classpenify__hook_1_1api__client_1_1APIClient__coll__graph.svg create mode 100644 docs/html/classpenify__hook_1_1api__client_1_1APIClient_a7ff74798e7d428b4e2f20095287eb2ce_icgraph.map create mode 100644 docs/html/classpenify__hook_1_1api__client_1_1APIClient_a7ff74798e7d428b4e2f20095287eb2ce_icgraph.md5 create mode 100644 docs/html/classpenify__hook_1_1api__client_1_1APIClient_a7ff74798e7d428b4e2f20095287eb2ce_icgraph.svg create mode 100644 docs/html/classpenify__hook_1_1api__client_1_1APIClient_ac0ada470b897935f9fb372cd0e7e51e3_cgraph.map create mode 100644 docs/html/classpenify__hook_1_1api__client_1_1APIClient_ac0ada470b897935f9fb372cd0e7e51e3_cgraph.md5 create mode 100644 docs/html/classpenify__hook_1_1api__client_1_1APIClient_ac0ada470b897935f9fb372cd0e7e51e3_cgraph.svg create mode 100644 docs/html/classpenify__hook_1_1api__client_1_1APIClient_ac0ada470b897935f9fb372cd0e7e51e3_cgraph_org.svg create mode 100644 docs/html/classpenify__hook_1_1base__analyzer_1_1BaseAnalyzer-members.html create mode 100644 docs/html/classpenify__hook_1_1base__analyzer_1_1BaseAnalyzer.html create mode 100644 docs/html/classpenify__hook_1_1base__analyzer_1_1BaseAnalyzer.js create mode 100644 docs/html/classpenify__hook_1_1base__analyzer_1_1BaseAnalyzer__coll__graph.map create mode 100644 docs/html/classpenify__hook_1_1base__analyzer_1_1BaseAnalyzer__coll__graph.md5 create mode 100644 docs/html/classpenify__hook_1_1base__analyzer_1_1BaseAnalyzer__coll__graph.svg create mode 100644 docs/html/classpenify__hook_1_1base__analyzer_1_1BaseAnalyzer__inherit__graph.map create mode 100644 docs/html/classpenify__hook_1_1base__analyzer_1_1BaseAnalyzer__inherit__graph.md5 create mode 100644 docs/html/classpenify__hook_1_1base__analyzer_1_1BaseAnalyzer__inherit__graph.svg create mode 100644 docs/html/classpenify__hook_1_1base__analyzer_1_1BaseAnalyzer__inherit__graph_org.svg create mode 100644 docs/html/classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook-members.html create mode 100644 docs/html/classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook.html create mode 100644 docs/html/classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook.js create mode 100644 docs/html/classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook__coll__graph.map create mode 100644 docs/html/classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook__coll__graph.md5 create mode 100644 docs/html/classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook__coll__graph.svg create mode 100644 docs/html/classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook__inherit__graph.map create mode 100644 docs/html/classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook__inherit__graph.md5 create mode 100644 docs/html/classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook__inherit__graph.svg create mode 100644 docs/html/classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook_a6370a03f7ed9175ef6f81e931a105ea9_cgraph.map create mode 100644 docs/html/classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook_a6370a03f7ed9175ef6f81e931a105ea9_cgraph.md5 create mode 100644 docs/html/classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook_a6370a03f7ed9175ef6f81e931a105ea9_cgraph.svg create mode 100644 docs/html/classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook_a6370a03f7ed9175ef6f81e931a105ea9_cgraph_org.svg create mode 100644 docs/html/classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook_a8496194276441fa2eb2fa014eaab9a37_cgraph.map create mode 100644 docs/html/classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook_a8496194276441fa2eb2fa014eaab9a37_cgraph.md5 create mode 100644 docs/html/classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook_a8496194276441fa2eb2fa014eaab9a37_cgraph.svg create mode 100644 docs/html/classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook_a8496194276441fa2eb2fa014eaab9a37_cgraph_org.svg create mode 100644 docs/html/classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook_a8496194276441fa2eb2fa014eaab9a37_icgraph.map create mode 100644 docs/html/classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook_a8496194276441fa2eb2fa014eaab9a37_icgraph.md5 create mode 100644 docs/html/classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook_a8496194276441fa2eb2fa014eaab9a37_icgraph.svg create mode 100644 docs/html/classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook_ac999c5cbc852a7ec3b412ccb43c274ca_icgraph.map create mode 100644 docs/html/classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook_ac999c5cbc852a7ec3b412ccb43c274ca_icgraph.md5 create mode 100644 docs/html/classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook_ac999c5cbc852a7ec3b412ccb43c274ca_icgraph.svg create mode 100644 docs/html/classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook_adda13cc121d96342476ccf72b63a007f_cgraph.map create mode 100644 docs/html/classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook_adda13cc121d96342476ccf72b63a007f_cgraph.md5 create mode 100644 docs/html/classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook_adda13cc121d96342476ccf72b63a007f_cgraph.svg create mode 100644 docs/html/classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook_adda13cc121d96342476ccf72b63a007f_cgraph_org.svg create mode 100644 docs/html/classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook_adda13cc121d96342476ccf72b63a007f_icgraph.map create mode 100644 docs/html/classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook_adda13cc121d96342476ccf72b63a007f_icgraph.md5 create mode 100644 docs/html/classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook_adda13cc121d96342476ccf72b63a007f_icgraph.svg create mode 100644 docs/html/classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook_af127d86729e226d74dbeb095b008db3e_cgraph.map create mode 100644 docs/html/classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook_af127d86729e226d74dbeb095b008db3e_cgraph.md5 create mode 100644 docs/html/classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook_af127d86729e226d74dbeb095b008db3e_cgraph.svg create mode 100644 docs/html/classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook_af127d86729e226d74dbeb095b008db3e_icgraph.map create mode 100644 docs/html/classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook_af127d86729e226d74dbeb095b008db3e_icgraph.md5 create mode 100644 docs/html/classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook_af127d86729e226d74dbeb095b008db3e_icgraph.svg create mode 100644 docs/html/classpenify__hook_1_1file__analyzer_1_1FileAnalyzerGenHook-members.html create mode 100644 docs/html/classpenify__hook_1_1file__analyzer_1_1FileAnalyzerGenHook.html create mode 100644 docs/html/classpenify__hook_1_1file__analyzer_1_1FileAnalyzerGenHook.js create mode 100644 docs/html/classpenify__hook_1_1file__analyzer_1_1FileAnalyzerGenHook__coll__graph.map create mode 100644 docs/html/classpenify__hook_1_1file__analyzer_1_1FileAnalyzerGenHook__coll__graph.md5 create mode 100644 docs/html/classpenify__hook_1_1file__analyzer_1_1FileAnalyzerGenHook__coll__graph.svg create mode 100644 docs/html/classpenify__hook_1_1file__analyzer_1_1FileAnalyzerGenHook__inherit__graph.map create mode 100644 docs/html/classpenify__hook_1_1file__analyzer_1_1FileAnalyzerGenHook__inherit__graph.md5 create mode 100644 docs/html/classpenify__hook_1_1file__analyzer_1_1FileAnalyzerGenHook__inherit__graph.svg create mode 100644 docs/html/classpenify__hook_1_1file__analyzer_1_1FileAnalyzerGenHook_a2cc6c22ef588fccf3eed9bbc57fb6d6e_cgraph.map create mode 100644 docs/html/classpenify__hook_1_1file__analyzer_1_1FileAnalyzerGenHook_a2cc6c22ef588fccf3eed9bbc57fb6d6e_cgraph.md5 create mode 100644 docs/html/classpenify__hook_1_1file__analyzer_1_1FileAnalyzerGenHook_a2cc6c22ef588fccf3eed9bbc57fb6d6e_cgraph.svg create mode 100644 docs/html/classpenify__hook_1_1file__analyzer_1_1FileAnalyzerGenHook_a2cc6c22ef588fccf3eed9bbc57fb6d6e_cgraph_org.svg create mode 100644 docs/html/classpenify__hook_1_1file__analyzer_1_1FileAnalyzerGenHook_a2cc6c22ef588fccf3eed9bbc57fb6d6e_icgraph.map create mode 100644 docs/html/classpenify__hook_1_1file__analyzer_1_1FileAnalyzerGenHook_a2cc6c22ef588fccf3eed9bbc57fb6d6e_icgraph.md5 create mode 100644 docs/html/classpenify__hook_1_1file__analyzer_1_1FileAnalyzerGenHook_a2cc6c22ef588fccf3eed9bbc57fb6d6e_icgraph.svg create mode 100644 docs/html/classpenify__hook_1_1file__analyzer_1_1FileAnalyzerGenHook_a4f4dffbc432fac3e259d957dd1e187f1_cgraph.map create mode 100644 docs/html/classpenify__hook_1_1file__analyzer_1_1FileAnalyzerGenHook_a4f4dffbc432fac3e259d957dd1e187f1_cgraph.md5 create mode 100644 docs/html/classpenify__hook_1_1file__analyzer_1_1FileAnalyzerGenHook_a4f4dffbc432fac3e259d957dd1e187f1_cgraph.svg create mode 100644 docs/html/classpenify__hook_1_1file__analyzer_1_1FileAnalyzerGenHook_a4f4dffbc432fac3e259d957dd1e187f1_cgraph_org.svg create mode 100644 docs/html/classpenify__hook_1_1file__analyzer_1_1FileAnalyzerGenHook_a6ab39391dfb7686f2a2d21a702dd3073_cgraph.map create mode 100644 docs/html/classpenify__hook_1_1file__analyzer_1_1FileAnalyzerGenHook_a6ab39391dfb7686f2a2d21a702dd3073_cgraph.md5 create mode 100644 docs/html/classpenify__hook_1_1file__analyzer_1_1FileAnalyzerGenHook_a6ab39391dfb7686f2a2d21a702dd3073_cgraph.svg create mode 100644 docs/html/classpenify__hook_1_1folder__analyzer_1_1FolderAnalyzerGenHook-members.html create mode 100644 docs/html/classpenify__hook_1_1folder__analyzer_1_1FolderAnalyzerGenHook.html create mode 100644 docs/html/classpenify__hook_1_1folder__analyzer_1_1FolderAnalyzerGenHook.js create mode 100644 docs/html/classpenify__hook_1_1folder__analyzer_1_1FolderAnalyzerGenHook__coll__graph.map create mode 100644 docs/html/classpenify__hook_1_1folder__analyzer_1_1FolderAnalyzerGenHook__coll__graph.md5 create mode 100644 docs/html/classpenify__hook_1_1folder__analyzer_1_1FolderAnalyzerGenHook__coll__graph.svg create mode 100644 docs/html/classpenify__hook_1_1folder__analyzer_1_1FolderAnalyzerGenHook__inherit__graph.map create mode 100644 docs/html/classpenify__hook_1_1folder__analyzer_1_1FolderAnalyzerGenHook__inherit__graph.md5 create mode 100644 docs/html/classpenify__hook_1_1folder__analyzer_1_1FolderAnalyzerGenHook__inherit__graph.svg create mode 100644 docs/html/classpenify__hook_1_1folder__analyzer_1_1FolderAnalyzerGenHook_a70b845318fc7ac3b607daf26378e19ec_icgraph.map create mode 100644 docs/html/classpenify__hook_1_1folder__analyzer_1_1FolderAnalyzerGenHook_a70b845318fc7ac3b607daf26378e19ec_icgraph.md5 create mode 100644 docs/html/classpenify__hook_1_1folder__analyzer_1_1FolderAnalyzerGenHook_a70b845318fc7ac3b607daf26378e19ec_icgraph.svg create mode 100644 docs/html/classpenify__hook_1_1folder__analyzer_1_1FolderAnalyzerGenHook_afd189d1b8c773bf710a899eb21fd76cc_cgraph.map create mode 100644 docs/html/classpenify__hook_1_1folder__analyzer_1_1FolderAnalyzerGenHook_afd189d1b8c773bf710a899eb21fd76cc_cgraph.md5 create mode 100644 docs/html/classpenify__hook_1_1folder__analyzer_1_1FolderAnalyzerGenHook_afd189d1b8c773bf710a899eb21fd76cc_cgraph.svg create mode 100644 docs/html/classpenify__hook_1_1git__analyzer_1_1GitDocGenHook-members.html create mode 100644 docs/html/classpenify__hook_1_1git__analyzer_1_1GitDocGenHook.html create mode 100644 docs/html/classpenify__hook_1_1git__analyzer_1_1GitDocGenHook.js create mode 100644 docs/html/classpenify__hook_1_1git__analyzer_1_1GitDocGenHook__coll__graph.map create mode 100644 docs/html/classpenify__hook_1_1git__analyzer_1_1GitDocGenHook__coll__graph.md5 create mode 100644 docs/html/classpenify__hook_1_1git__analyzer_1_1GitDocGenHook__coll__graph.svg create mode 100644 docs/html/classpenify__hook_1_1git__analyzer_1_1GitDocGenHook__inherit__graph.map create mode 100644 docs/html/classpenify__hook_1_1git__analyzer_1_1GitDocGenHook__inherit__graph.md5 create mode 100644 docs/html/classpenify__hook_1_1git__analyzer_1_1GitDocGenHook__inherit__graph.svg create mode 100644 docs/html/classpenify__hook_1_1git__analyzer_1_1GitDocGenHook_a05313caa22b173ce75638f0db08eeb85_cgraph.map create mode 100644 docs/html/classpenify__hook_1_1git__analyzer_1_1GitDocGenHook_a05313caa22b173ce75638f0db08eeb85_cgraph.md5 create mode 100644 docs/html/classpenify__hook_1_1git__analyzer_1_1GitDocGenHook_a05313caa22b173ce75638f0db08eeb85_cgraph.svg create mode 100644 docs/html/classpenify__hook_1_1git__analyzer_1_1GitDocGenHook_a05313caa22b173ce75638f0db08eeb85_icgraph.map create mode 100644 docs/html/classpenify__hook_1_1git__analyzer_1_1GitDocGenHook_a05313caa22b173ce75638f0db08eeb85_icgraph.md5 create mode 100644 docs/html/classpenify__hook_1_1git__analyzer_1_1GitDocGenHook_a05313caa22b173ce75638f0db08eeb85_icgraph.svg create mode 100644 docs/html/classpenify__hook_1_1git__analyzer_1_1GitDocGenHook_a17549766100e91eb94b5f1a1d34bf481_icgraph.map create mode 100644 docs/html/classpenify__hook_1_1git__analyzer_1_1GitDocGenHook_a17549766100e91eb94b5f1a1d34bf481_icgraph.md5 create mode 100644 docs/html/classpenify__hook_1_1git__analyzer_1_1GitDocGenHook_a17549766100e91eb94b5f1a1d34bf481_icgraph.svg create mode 100644 docs/html/classpenify__hook_1_1git__analyzer_1_1GitDocGenHook_a3beba14e92d717391a74bb70b1fab0ae_cgraph.map create mode 100644 docs/html/classpenify__hook_1_1git__analyzer_1_1GitDocGenHook_a3beba14e92d717391a74bb70b1fab0ae_cgraph.md5 create mode 100644 docs/html/classpenify__hook_1_1git__analyzer_1_1GitDocGenHook_a3beba14e92d717391a74bb70b1fab0ae_cgraph.svg create mode 100644 docs/html/classpenify__hook_1_1git__analyzer_1_1GitDocGenHook_a3beba14e92d717391a74bb70b1fab0ae_cgraph_org.svg create mode 100644 docs/html/classpenify__hook_1_1git__analyzer_1_1GitDocGenHook_a92275fddb43dbef6dfdb6c1ed6e96d0c_cgraph.map create mode 100644 docs/html/classpenify__hook_1_1git__analyzer_1_1GitDocGenHook_a92275fddb43dbef6dfdb6c1ed6e96d0c_cgraph.md5 create mode 100644 docs/html/classpenify__hook_1_1git__analyzer_1_1GitDocGenHook_a92275fddb43dbef6dfdb6c1ed6e96d0c_cgraph.svg create mode 100644 docs/html/classpenify__hook_1_1git__analyzer_1_1GitDocGenHook_a92275fddb43dbef6dfdb6c1ed6e96d0c_icgraph.map create mode 100644 docs/html/classpenify__hook_1_1git__analyzer_1_1GitDocGenHook_a92275fddb43dbef6dfdb6c1ed6e96d0c_icgraph.md5 create mode 100644 docs/html/classpenify__hook_1_1git__analyzer_1_1GitDocGenHook_a92275fddb43dbef6dfdb6c1ed6e96d0c_icgraph.svg create mode 100644 docs/html/classpenify__hook_1_1git__analyzer_1_1GitDocGenHook_a974d2f51315ed6a1965a7fd7e2ced0cd_icgraph.map create mode 100644 docs/html/classpenify__hook_1_1git__analyzer_1_1GitDocGenHook_a974d2f51315ed6a1965a7fd7e2ced0cd_icgraph.md5 create mode 100644 docs/html/classpenify__hook_1_1git__analyzer_1_1GitDocGenHook_a974d2f51315ed6a1965a7fd7e2ced0cd_icgraph.svg create mode 100644 docs/html/classpenify__hook_1_1git__analyzer_1_1GitDocGenHook_a974d2f51315ed6a1965a7fd7e2ced0cd_icgraph_org.svg create mode 100644 docs/html/classpenify__hook_1_1jira__client_1_1JiraClient-members.html create mode 100644 docs/html/classpenify__hook_1_1jira__client_1_1JiraClient.html create mode 100644 docs/html/classpenify__hook_1_1jira__client_1_1JiraClient.js create mode 100644 docs/html/classpenify__hook_1_1jira__client_1_1JiraClient__coll__graph.map create mode 100644 docs/html/classpenify__hook_1_1jira__client_1_1JiraClient__coll__graph.md5 create mode 100644 docs/html/classpenify__hook_1_1jira__client_1_1JiraClient__coll__graph.svg create mode 100644 docs/html/classpenify__hook_1_1jira__client_1_1JiraClient_a00d0f9ae006313a21576362d26ac5ec8_icgraph.map create mode 100644 docs/html/classpenify__hook_1_1jira__client_1_1JiraClient_a00d0f9ae006313a21576362d26ac5ec8_icgraph.md5 create mode 100644 docs/html/classpenify__hook_1_1jira__client_1_1JiraClient_a00d0f9ae006313a21576362d26ac5ec8_icgraph.svg create mode 100644 docs/html/classpenify__hook_1_1jira__client_1_1JiraClient_a00d0f9ae006313a21576362d26ac5ec8_icgraph_org.svg create mode 100644 docs/html/classpenify__hook_1_1jira__client_1_1JiraClient_a093d6456fe053ef7a7862d5d6851910c_cgraph.map create mode 100644 docs/html/classpenify__hook_1_1jira__client_1_1JiraClient_a093d6456fe053ef7a7862d5d6851910c_cgraph.md5 create mode 100644 docs/html/classpenify__hook_1_1jira__client_1_1JiraClient_a093d6456fe053ef7a7862d5d6851910c_cgraph.svg create mode 100644 docs/html/classpenify__hook_1_1jira__client_1_1JiraClient_a093d6456fe053ef7a7862d5d6851910c_cgraph_org.svg create mode 100644 docs/html/classpenify__hook_1_1jira__client_1_1JiraClient_a49ea1149758f7f5212149d357b13cc23_cgraph.map create mode 100644 docs/html/classpenify__hook_1_1jira__client_1_1JiraClient_a49ea1149758f7f5212149d357b13cc23_cgraph.md5 create mode 100644 docs/html/classpenify__hook_1_1jira__client_1_1JiraClient_a49ea1149758f7f5212149d357b13cc23_cgraph.svg create mode 100644 docs/html/classpenify__hook_1_1jira__client_1_1JiraClient_a49ea1149758f7f5212149d357b13cc23_cgraph_org.svg create mode 100644 docs/html/classpenify__hook_1_1jira__client_1_1JiraClient_a49ea1149758f7f5212149d357b13cc23_icgraph.map create mode 100644 docs/html/classpenify__hook_1_1jira__client_1_1JiraClient_a49ea1149758f7f5212149d357b13cc23_icgraph.md5 create mode 100644 docs/html/classpenify__hook_1_1jira__client_1_1JiraClient_a49ea1149758f7f5212149d357b13cc23_icgraph.svg create mode 100644 docs/html/classpenify__hook_1_1jira__client_1_1JiraClient_a65f6924819084b7c8d268956a784804a_cgraph.map create mode 100644 docs/html/classpenify__hook_1_1jira__client_1_1JiraClient_a65f6924819084b7c8d268956a784804a_cgraph.md5 create mode 100644 docs/html/classpenify__hook_1_1jira__client_1_1JiraClient_a65f6924819084b7c8d268956a784804a_cgraph.svg create mode 100644 docs/html/classpenify__hook_1_1jira__client_1_1JiraClient_a65f6924819084b7c8d268956a784804a_icgraph.map create mode 100644 docs/html/classpenify__hook_1_1jira__client_1_1JiraClient_a65f6924819084b7c8d268956a784804a_icgraph.md5 create mode 100644 docs/html/classpenify__hook_1_1jira__client_1_1JiraClient_a65f6924819084b7c8d268956a784804a_icgraph.svg create mode 100644 docs/html/classpenify__hook_1_1jira__client_1_1JiraClient_a65f6924819084b7c8d268956a784804a_icgraph_org.svg create mode 100644 docs/html/classpenify__hook_1_1jira__client_1_1JiraClient_a70d2c5a6432aa6f238da0ff65d49a760_cgraph.map create mode 100644 docs/html/classpenify__hook_1_1jira__client_1_1JiraClient_a70d2c5a6432aa6f238da0ff65d49a760_cgraph.md5 create mode 100644 docs/html/classpenify__hook_1_1jira__client_1_1JiraClient_a70d2c5a6432aa6f238da0ff65d49a760_cgraph.svg create mode 100644 docs/html/classpenify__hook_1_1jira__client_1_1JiraClient_a70d2c5a6432aa6f238da0ff65d49a760_cgraph_org.svg create mode 100644 docs/html/classpenify__hook_1_1jira__client_1_1JiraClient_aa1f374116c64cd5f1492ec7f7e40f9c1_cgraph.map create mode 100644 docs/html/classpenify__hook_1_1jira__client_1_1JiraClient_aa1f374116c64cd5f1492ec7f7e40f9c1_cgraph.md5 create mode 100644 docs/html/classpenify__hook_1_1jira__client_1_1JiraClient_aa1f374116c64cd5f1492ec7f7e40f9c1_cgraph.svg create mode 100644 docs/html/classpenify__hook_1_1jira__client_1_1JiraClient_aa1f374116c64cd5f1492ec7f7e40f9c1_icgraph.map create mode 100644 docs/html/classpenify__hook_1_1jira__client_1_1JiraClient_aa1f374116c64cd5f1492ec7f7e40f9c1_icgraph.md5 create mode 100644 docs/html/classpenify__hook_1_1jira__client_1_1JiraClient_aa1f374116c64cd5f1492ec7f7e40f9c1_icgraph.svg create mode 100644 docs/html/classpenify__hook_1_1jira__client_1_1JiraClient_aa967169a4b7970c67c0947b9ac56f746_cgraph.map create mode 100644 docs/html/classpenify__hook_1_1jira__client_1_1JiraClient_aa967169a4b7970c67c0947b9ac56f746_cgraph.md5 create mode 100644 docs/html/classpenify__hook_1_1jira__client_1_1JiraClient_aa967169a4b7970c67c0947b9ac56f746_cgraph.svg create mode 100644 docs/html/classpenify__hook_1_1jira__client_1_1JiraClient_aa967169a4b7970c67c0947b9ac56f746_icgraph.map create mode 100644 docs/html/classpenify__hook_1_1jira__client_1_1JiraClient_aa967169a4b7970c67c0947b9ac56f746_icgraph.md5 create mode 100644 docs/html/classpenify__hook_1_1jira__client_1_1JiraClient_aa967169a4b7970c67c0947b9ac56f746_icgraph.svg create mode 100644 docs/html/classpenify__hook_1_1jira__client_1_1JiraClient_aca8837552d37bfd611de23441a240826_cgraph.map create mode 100644 docs/html/classpenify__hook_1_1jira__client_1_1JiraClient_aca8837552d37bfd611de23441a240826_cgraph.md5 create mode 100644 docs/html/classpenify__hook_1_1jira__client_1_1JiraClient_aca8837552d37bfd611de23441a240826_cgraph.svg create mode 100644 docs/html/classpenify__hook_1_1jira__client_1_1JiraClient_ad2823ad1d3baaedd38039913c3a97fd7_icgraph.map create mode 100644 docs/html/classpenify__hook_1_1jira__client_1_1JiraClient_ad2823ad1d3baaedd38039913c3a97fd7_icgraph.md5 create mode 100644 docs/html/classpenify__hook_1_1jira__client_1_1JiraClient_ad2823ad1d3baaedd38039913c3a97fd7_icgraph.svg create mode 100644 docs/html/classpenify__hook_1_1jira__client_1_1JiraClient_ad2823ad1d3baaedd38039913c3a97fd7_icgraph_org.svg create mode 100644 docs/html/classpenify__hook_1_1jira__client_1_1JiraClient_afb41ce6f13c30b1265d439ddf04bf2cd_cgraph.map create mode 100644 docs/html/classpenify__hook_1_1jira__client_1_1JiraClient_afb41ce6f13c30b1265d439ddf04bf2cd_cgraph.md5 create mode 100644 docs/html/classpenify__hook_1_1jira__client_1_1JiraClient_afb41ce6f13c30b1265d439ddf04bf2cd_cgraph.svg create mode 100644 docs/html/classpenify__hook_1_1jira__client_1_1JiraClient_afb41ce6f13c30b1265d439ddf04bf2cd_icgraph.map create mode 100644 docs/html/classpenify__hook_1_1jira__client_1_1JiraClient_afb41ce6f13c30b1265d439ddf04bf2cd_icgraph.md5 create mode 100644 docs/html/classpenify__hook_1_1jira__client_1_1JiraClient_afb41ce6f13c30b1265d439ddf04bf2cd_icgraph.svg create mode 100644 docs/html/classpenify__hook_1_1llm__client_1_1LLMClient-members.html create mode 100644 docs/html/classpenify__hook_1_1llm__client_1_1LLMClient.html create mode 100644 docs/html/classpenify__hook_1_1llm__client_1_1LLMClient.js create mode 100644 docs/html/classpenify__hook_1_1llm__client_1_1LLMClient__coll__graph.map create mode 100644 docs/html/classpenify__hook_1_1llm__client_1_1LLMClient__coll__graph.md5 create mode 100644 docs/html/classpenify__hook_1_1llm__client_1_1LLMClient__coll__graph.svg create mode 100644 docs/html/classpenify__hook_1_1llm__client_1_1LLMClient_a2ad3014dac466ee1d8e00306d0cf2000_cgraph.map create mode 100644 docs/html/classpenify__hook_1_1llm__client_1_1LLMClient_a2ad3014dac466ee1d8e00306d0cf2000_cgraph.md5 create mode 100644 docs/html/classpenify__hook_1_1llm__client_1_1LLMClient_a2ad3014dac466ee1d8e00306d0cf2000_cgraph.svg create mode 100644 docs/html/classpenify__hook_1_1llm__client_1_1LLMClient_a2ad3014dac466ee1d8e00306d0cf2000_icgraph.map create mode 100644 docs/html/classpenify__hook_1_1llm__client_1_1LLMClient_a2ad3014dac466ee1d8e00306d0cf2000_icgraph.md5 create mode 100644 docs/html/classpenify__hook_1_1llm__client_1_1LLMClient_a2ad3014dac466ee1d8e00306d0cf2000_icgraph.svg create mode 100644 docs/html/classpenify__hook_1_1llm__client_1_1LLMClient_ad6f06658ca922793f879474f2234518e_icgraph.map create mode 100644 docs/html/classpenify__hook_1_1llm__client_1_1LLMClient_ad6f06658ca922793f879474f2234518e_icgraph.md5 create mode 100644 docs/html/classpenify__hook_1_1llm__client_1_1LLMClient_ad6f06658ca922793f879474f2234518e_icgraph.svg create mode 100644 docs/html/classpenify__hook_1_1llm__client_1_1LLMClient_ad6f06658ca922793f879474f2234518e_icgraph_org.svg create mode 100644 docs/html/classpenify__hook_1_1utils_1_1GitRepoNotFoundError.html create mode 100644 docs/html/classpenify__hook_1_1utils_1_1GitRepoNotFoundError__coll__graph.map create mode 100644 docs/html/classpenify__hook_1_1utils_1_1GitRepoNotFoundError__coll__graph.md5 create mode 100644 docs/html/classpenify__hook_1_1utils_1_1GitRepoNotFoundError__coll__graph.svg create mode 100644 docs/html/classpenify__hook_1_1utils_1_1GitRepoNotFoundError__inherit__graph.map create mode 100644 docs/html/classpenify__hook_1_1utils_1_1GitRepoNotFoundError__inherit__graph.md5 create mode 100644 docs/html/classpenify__hook_1_1utils_1_1GitRepoNotFoundError__inherit__graph.svg create mode 100644 docs/html/classtests_1_1test__commit__commands_1_1TestCommitCommands-members.html create mode 100644 docs/html/classtests_1_1test__commit__commands_1_1TestCommitCommands.html create mode 100644 docs/html/classtests_1_1test__commit__commands_1_1TestCommitCommands.js create mode 100644 docs/html/classtests_1_1test__commit__commands_1_1TestCommitCommands__coll__graph.map create mode 100644 docs/html/classtests_1_1test__commit__commands_1_1TestCommitCommands__coll__graph.md5 create mode 100644 docs/html/classtests_1_1test__commit__commands_1_1TestCommitCommands__coll__graph.svg create mode 100644 docs/html/classtests_1_1test__commit__commands_1_1TestCommitCommands_a43c2ff3707124aa48e8eb581106b8691_cgraph.map create mode 100644 docs/html/classtests_1_1test__commit__commands_1_1TestCommitCommands_a43c2ff3707124aa48e8eb581106b8691_cgraph.md5 create mode 100644 docs/html/classtests_1_1test__commit__commands_1_1TestCommitCommands_a43c2ff3707124aa48e8eb581106b8691_cgraph.svg create mode 100644 docs/html/classtests_1_1test__commit__commands_1_1TestCommitCommands_a43c2ff3707124aa48e8eb581106b8691_cgraph_org.svg create mode 100644 docs/html/classtests_1_1test__commit__commands_1_1TestCommitCommands_a4d04b125e102190a768f65f1948f15bc_cgraph.map create mode 100644 docs/html/classtests_1_1test__commit__commands_1_1TestCommitCommands_a4d04b125e102190a768f65f1948f15bc_cgraph.md5 create mode 100644 docs/html/classtests_1_1test__commit__commands_1_1TestCommitCommands_a4d04b125e102190a768f65f1948f15bc_cgraph.svg create mode 100644 docs/html/classtests_1_1test__commit__commands_1_1TestCommitCommands_ac13e368262340af98b30fd8ebdac6597_cgraph.map create mode 100644 docs/html/classtests_1_1test__commit__commands_1_1TestCommitCommands_ac13e368262340af98b30fd8ebdac6597_cgraph.md5 create mode 100644 docs/html/classtests_1_1test__commit__commands_1_1TestCommitCommands_ac13e368262340af98b30fd8ebdac6597_cgraph.svg create mode 100644 docs/html/classtests_1_1test__commit__commands_1_1TestCommitCommands_ac13e368262340af98b30fd8ebdac6597_cgraph_org.svg create mode 100644 docs/html/classtests_1_1test__commit__commands_1_1TestCommitCommands_acc4b1e4189792a3f7c11d2a745f479c0_cgraph.map create mode 100644 docs/html/classtests_1_1test__commit__commands_1_1TestCommitCommands_acc4b1e4189792a3f7c11d2a745f479c0_cgraph.md5 create mode 100644 docs/html/classtests_1_1test__commit__commands_1_1TestCommitCommands_acc4b1e4189792a3f7c11d2a745f479c0_cgraph.svg create mode 100644 docs/html/classtests_1_1test__commit__commands_1_1TestCommitCommands_acc4b1e4189792a3f7c11d2a745f479c0_cgraph_org.svg create mode 100644 docs/html/classtests_1_1test__commit__commands_1_1TestCommitCommands_acea0d934ee0f2b914b0b893736e8fe4e_cgraph.map create mode 100644 docs/html/classtests_1_1test__commit__commands_1_1TestCommitCommands_acea0d934ee0f2b914b0b893736e8fe4e_cgraph.md5 create mode 100644 docs/html/classtests_1_1test__commit__commands_1_1TestCommitCommands_acea0d934ee0f2b914b0b893736e8fe4e_cgraph.svg create mode 100644 docs/html/classtests_1_1test__commit__commands_1_1TestCommitCommands_acea0d934ee0f2b914b0b893736e8fe4e_cgraph_org.svg create mode 100644 docs/html/classtests_1_1test__commit__commands_1_1TestCommitCommands_af9c09013055ec39ddde86b487aefcf8b_cgraph.map create mode 100644 docs/html/classtests_1_1test__commit__commands_1_1TestCommitCommands_af9c09013055ec39ddde86b487aefcf8b_cgraph.md5 create mode 100644 docs/html/classtests_1_1test__commit__commands_1_1TestCommitCommands_af9c09013055ec39ddde86b487aefcf8b_cgraph.svg create mode 100644 docs/html/classtests_1_1test__commit__commands_1_1TestCommitCommands_af9c09013055ec39ddde86b487aefcf8b_cgraph_org.svg create mode 100644 docs/html/classtests_1_1test__config__commands_1_1TestConfigCommands-members.html create mode 100644 docs/html/classtests_1_1test__config__commands_1_1TestConfigCommands.html create mode 100644 docs/html/classtests_1_1test__config__commands_1_1TestConfigCommands.js create mode 100644 docs/html/classtests_1_1test__config__commands_1_1TestConfigCommands__coll__graph.map create mode 100644 docs/html/classtests_1_1test__config__commands_1_1TestConfigCommands__coll__graph.md5 create mode 100644 docs/html/classtests_1_1test__config__commands_1_1TestConfigCommands__coll__graph.svg create mode 100644 docs/html/classtests_1_1test__config__commands_1_1TestConfigCommands_a2e8162082bcdd5652bb37bdb14cf453a_cgraph.map create mode 100644 docs/html/classtests_1_1test__config__commands_1_1TestConfigCommands_a2e8162082bcdd5652bb37bdb14cf453a_cgraph.md5 create mode 100644 docs/html/classtests_1_1test__config__commands_1_1TestConfigCommands_a2e8162082bcdd5652bb37bdb14cf453a_cgraph.svg create mode 100644 docs/html/classtests_1_1test__config__commands_1_1TestConfigCommands_a2e8162082bcdd5652bb37bdb14cf453a_cgraph_org.svg create mode 100644 docs/html/classtests_1_1test__config__commands_1_1TestConfigCommands_a3355f7d313bebaa71694387cf2bc5232_cgraph.map create mode 100644 docs/html/classtests_1_1test__config__commands_1_1TestConfigCommands_a3355f7d313bebaa71694387cf2bc5232_cgraph.md5 create mode 100644 docs/html/classtests_1_1test__config__commands_1_1TestConfigCommands_a3355f7d313bebaa71694387cf2bc5232_cgraph.svg create mode 100644 docs/html/classtests_1_1test__config__commands_1_1TestConfigCommands_a3355f7d313bebaa71694387cf2bc5232_cgraph_org.svg create mode 100644 docs/html/classtests_1_1test__config__commands_1_1TestConfigCommands_a33d4760eee3b67e1cde3aed755ebb948_cgraph.map create mode 100644 docs/html/classtests_1_1test__config__commands_1_1TestConfigCommands_a33d4760eee3b67e1cde3aed755ebb948_cgraph.md5 create mode 100644 docs/html/classtests_1_1test__config__commands_1_1TestConfigCommands_a33d4760eee3b67e1cde3aed755ebb948_cgraph.svg create mode 100644 docs/html/classtests_1_1test__config__commands_1_1TestConfigCommands_a33d4760eee3b67e1cde3aed755ebb948_cgraph_org.svg create mode 100644 docs/html/classtests_1_1test__config__commands_1_1TestConfigCommands_a400ca5d9fcdc159714e8df54920f9436_cgraph.map create mode 100644 docs/html/classtests_1_1test__config__commands_1_1TestConfigCommands_a400ca5d9fcdc159714e8df54920f9436_cgraph.md5 create mode 100644 docs/html/classtests_1_1test__config__commands_1_1TestConfigCommands_a400ca5d9fcdc159714e8df54920f9436_cgraph.svg create mode 100644 docs/html/classtests_1_1test__config__commands_1_1TestConfigCommands_a400ca5d9fcdc159714e8df54920f9436_cgraph_org.svg create mode 100644 docs/html/classtests_1_1test__config__commands_1_1TestConfigCommands_a473984d31452b56acd6ce4011a1248bd_cgraph.map create mode 100644 docs/html/classtests_1_1test__config__commands_1_1TestConfigCommands_a473984d31452b56acd6ce4011a1248bd_cgraph.md5 create mode 100644 docs/html/classtests_1_1test__config__commands_1_1TestConfigCommands_a473984d31452b56acd6ce4011a1248bd_cgraph.svg create mode 100644 docs/html/classtests_1_1test__config__commands_1_1TestConfigCommands_a473984d31452b56acd6ce4011a1248bd_cgraph_org.svg create mode 100644 docs/html/classtests_1_1test__config__commands_1_1TestConfigCommands_a6c0207be563c3de59a6d16277805114c_cgraph.map create mode 100644 docs/html/classtests_1_1test__config__commands_1_1TestConfigCommands_a6c0207be563c3de59a6d16277805114c_cgraph.md5 create mode 100644 docs/html/classtests_1_1test__config__commands_1_1TestConfigCommands_a6c0207be563c3de59a6d16277805114c_cgraph.svg create mode 100644 docs/html/classtests_1_1test__config__commands_1_1TestConfigCommands_a6c0207be563c3de59a6d16277805114c_cgraph_org.svg create mode 100644 docs/html/classtests_1_1test__config__commands_1_1TestConfigCommands_a73a264dfb21e16003e095b79f6eab2ac_cgraph.map create mode 100644 docs/html/classtests_1_1test__config__commands_1_1TestConfigCommands_a73a264dfb21e16003e095b79f6eab2ac_cgraph.md5 create mode 100644 docs/html/classtests_1_1test__config__commands_1_1TestConfigCommands_a73a264dfb21e16003e095b79f6eab2ac_cgraph.svg create mode 100644 docs/html/classtests_1_1test__config__commands_1_1TestConfigCommands_a73a264dfb21e16003e095b79f6eab2ac_cgraph_org.svg create mode 100644 docs/html/classtests_1_1test__config__commands_1_1TestConfigCommands_abd12f028b89aa9cd1152c0b9ece5d3cd_cgraph.map create mode 100644 docs/html/classtests_1_1test__config__commands_1_1TestConfigCommands_abd12f028b89aa9cd1152c0b9ece5d3cd_cgraph.md5 create mode 100644 docs/html/classtests_1_1test__config__commands_1_1TestConfigCommands_abd12f028b89aa9cd1152c0b9ece5d3cd_cgraph.svg create mode 100644 docs/html/classtests_1_1test__config__commands_1_1TestConfigCommands_abd12f028b89aa9cd1152c0b9ece5d3cd_cgraph_org.svg create mode 100644 docs/html/classtests_1_1test__config__commands_1_1TestConfigCommands_acd8df8219441b9e9871b903a681400d9_cgraph.map create mode 100644 docs/html/classtests_1_1test__config__commands_1_1TestConfigCommands_acd8df8219441b9e9871b903a681400d9_cgraph.md5 create mode 100644 docs/html/classtests_1_1test__config__commands_1_1TestConfigCommands_acd8df8219441b9e9871b903a681400d9_cgraph.svg create mode 100644 docs/html/classtests_1_1test__config__commands_1_1TestConfigCommands_acd8df8219441b9e9871b903a681400d9_cgraph_org.svg create mode 100644 docs/html/classtests_1_1test__config__commands_1_1TestConfigCommands_adf9f2233a3f4cc5725b9d4f05758b167_cgraph.map create mode 100644 docs/html/classtests_1_1test__config__commands_1_1TestConfigCommands_adf9f2233a3f4cc5725b9d4f05758b167_cgraph.md5 create mode 100644 docs/html/classtests_1_1test__config__commands_1_1TestConfigCommands_adf9f2233a3f4cc5725b9d4f05758b167_cgraph.svg create mode 100644 docs/html/classtests_1_1test__config__commands_1_1TestConfigCommands_adf9f2233a3f4cc5725b9d4f05758b167_cgraph_org.svg create mode 100644 docs/html/classtests_1_1test__config__commands_1_1TestConfigCommands_aee37b97432821d19758c6325d4c74bcf_cgraph.map create mode 100644 docs/html/classtests_1_1test__config__commands_1_1TestConfigCommands_aee37b97432821d19758c6325d4c74bcf_cgraph.md5 create mode 100644 docs/html/classtests_1_1test__config__commands_1_1TestConfigCommands_aee37b97432821d19758c6325d4c74bcf_cgraph.svg create mode 100644 docs/html/classtests_1_1test__config__commands_1_1TestConfigCommands_aee37b97432821d19758c6325d4c74bcf_cgraph_org.svg create mode 100644 docs/html/classtests_1_1test__config__commands_1_1TestConfigCommands_af8d62310da2d768e21770f8f01ff5375_cgraph.map create mode 100644 docs/html/classtests_1_1test__config__commands_1_1TestConfigCommands_af8d62310da2d768e21770f8f01ff5375_cgraph.md5 create mode 100644 docs/html/classtests_1_1test__config__commands_1_1TestConfigCommands_af8d62310da2d768e21770f8f01ff5375_cgraph.svg create mode 100644 docs/html/classtests_1_1test__config__commands_1_1TestConfigCommands_af8d62310da2d768e21770f8f01ff5375_cgraph_org.svg create mode 100644 docs/html/classtests_1_1test__web__config_1_1TestWebConfig-members.html create mode 100644 docs/html/classtests_1_1test__web__config_1_1TestWebConfig.html create mode 100644 docs/html/classtests_1_1test__web__config_1_1TestWebConfig.js create mode 100644 docs/html/classtests_1_1test__web__config_1_1TestWebConfig__coll__graph.map create mode 100644 docs/html/classtests_1_1test__web__config_1_1TestWebConfig__coll__graph.md5 create mode 100644 docs/html/classtests_1_1test__web__config_1_1TestWebConfig__coll__graph.svg create mode 100644 docs/html/classtests_1_1test__web__config_1_1TestWebConfig_a06e600222e426b003850509cb1d3190a_cgraph.map create mode 100644 docs/html/classtests_1_1test__web__config_1_1TestWebConfig_a06e600222e426b003850509cb1d3190a_cgraph.md5 create mode 100644 docs/html/classtests_1_1test__web__config_1_1TestWebConfig_a06e600222e426b003850509cb1d3190a_cgraph.svg create mode 100644 docs/html/classtests_1_1test__web__config_1_1TestWebConfig_a06e600222e426b003850509cb1d3190a_cgraph_org.svg create mode 100644 docs/html/classtests_1_1test__web__config_1_1TestWebConfig_afc6440352201d207ea8b4d26f8ccfa35_cgraph.map create mode 100644 docs/html/classtests_1_1test__web__config_1_1TestWebConfig_afc6440352201d207ea8b4d26f8ccfa35_cgraph.md5 create mode 100644 docs/html/classtests_1_1test__web__config_1_1TestWebConfig_afc6440352201d207ea8b4d26f8ccfa35_cgraph.svg create mode 100644 docs/html/closed.png create mode 100644 docs/html/commit-commands_8md.html create mode 100644 docs/html/commit__analyzer_8py.html create mode 100644 docs/html/commit__analyzer_8py.js create mode 100644 docs/html/commit__commands_8py.html create mode 100644 docs/html/commit__commands_8py.js create mode 100644 docs/html/config-commands_8md.html create mode 100644 docs/html/config__command_8py.html create mode 100644 docs/html/config__command_8py.js create mode 100644 docs/html/config__commands_8py.html create mode 100644 docs/html/config__commands_8py.js create mode 100644 docs/html/conftest_8py.html create mode 100644 docs/html/constants_8py.html create mode 100644 docs/html/constants_8py.js create mode 100644 docs/html/detailed-usage_8md.html create mode 100644 docs/html/dir_063e2d5fe58a131099a7fe4200cca78c.html create mode 100644 docs/html/dir_063e2d5fe58a131099a7fe4200cca78c.js create mode 100644 docs/html/dir_063e2d5fe58a131099a7fe4200cca78c_dep.map create mode 100644 docs/html/dir_063e2d5fe58a131099a7fe4200cca78c_dep.md5 create mode 100644 docs/html/dir_063e2d5fe58a131099a7fe4200cca78c_dep.svg create mode 100644 docs/html/dir_1648a057408aae8db85b8e3797335623.html create mode 100644 docs/html/dir_1648a057408aae8db85b8e3797335623_dep.map create mode 100644 docs/html/dir_1648a057408aae8db85b8e3797335623_dep.md5 create mode 100644 docs/html/dir_1648a057408aae8db85b8e3797335623_dep.svg create mode 100644 docs/html/dir_624fa2a8bce97f0444ac5cca335d4e23.html create mode 100644 docs/html/dir_624fa2a8bce97f0444ac5cca335d4e23.js create mode 100644 docs/html/dir_624fa2a8bce97f0444ac5cca335d4e23_dep.map create mode 100644 docs/html/dir_624fa2a8bce97f0444ac5cca335d4e23_dep.md5 create mode 100644 docs/html/dir_624fa2a8bce97f0444ac5cca335d4e23_dep.svg create mode 100644 docs/html/dir_b3b22d2ab7966b65f6b237e3231b41be.html create mode 100644 docs/html/dir_b3b22d2ab7966b65f6b237e3231b41be.js create mode 100644 docs/html/dir_f88c3381c1861b3f7ca1f3d63cf244b5.html create mode 100644 docs/html/dir_f88c3381c1861b3f7ca1f3d63cf244b5.js create mode 100644 docs/html/dir_f88c3381c1861b3f7ca1f3d63cf244b5_dep.map create mode 100644 docs/html/dir_f88c3381c1861b3f7ca1f3d63cf244b5_dep.md5 create mode 100644 docs/html/dir_f88c3381c1861b3f7ca1f3d63cf244b5_dep.svg create mode 100644 docs/html/doc.png create mode 100644 docs/html/doc__commands_8md.html create mode 100644 docs/html/doc__commands_8py.html create mode 100644 docs/html/doc__commands_8py.js create mode 100644 docs/html/doxygen-awesome-darkmode-toggle.js create mode 100644 docs/html/doxygen-awesome-fragment-copy-button.js create mode 100644 docs/html/doxygen-awesome-interactive-toc.js create mode 100644 docs/html/doxygen-awesome-paragraph-link.js create mode 100644 docs/html/doxygen-awesome-sidebar-only-darkmode-toggle.css create mode 100644 docs/html/doxygen-awesome-sidebar-only.css create mode 100644 docs/html/doxygen-awesome-tabs.js create mode 100644 docs/html/doxygen-awesome.css create mode 100644 docs/html/doxygen.css create mode 100644 docs/html/doxygen.svg create mode 100644 docs/html/dynsections.js create mode 100644 docs/html/example-workflows_8md.html create mode 100644 docs/html/file__analyzer_8py.html create mode 100644 docs/html/file__analyzer_8py.js create mode 100644 docs/html/files.html create mode 100644 docs/html/files_dup.js create mode 100644 docs/html/folder__analyzer_8py.html create mode 100644 docs/html/folder__analyzer_8py.js create mode 100644 docs/html/folderclosed.png create mode 100644 docs/html/folderopen.png create mode 100644 docs/html/functions.html create mode 100644 docs/html/functions_func.html create mode 100644 docs/html/functions_vars.html create mode 100644 docs/html/git__analyzer_8py.html create mode 100644 docs/html/git__analyzer_8py.js create mode 100644 docs/html/graph_legend.html create mode 100644 docs/html/graph_legend.md5 create mode 100644 docs/html/graph_legend.svg create mode 100644 docs/html/hierarchy.html create mode 100644 docs/html/hierarchy.js create mode 100644 docs/html/hook__commands_8py.html create mode 100644 docs/html/hook__commands_8py.js create mode 100644 docs/html/index.html create mode 100644 docs/html/inherit_graph_0.map create mode 100644 docs/html/inherit_graph_0.md5 create mode 100644 docs/html/inherit_graph_0.svg create mode 100644 docs/html/inherit_graph_1.map create mode 100644 docs/html/inherit_graph_1.md5 create mode 100644 docs/html/inherit_graph_1.svg create mode 100644 docs/html/inherit_graph_2.map create mode 100644 docs/html/inherit_graph_2.md5 create mode 100644 docs/html/inherit_graph_2.svg create mode 100644 docs/html/inherit_graph_3.map create mode 100644 docs/html/inherit_graph_3.md5 create mode 100644 docs/html/inherit_graph_3.svg create mode 100644 docs/html/inherit_graph_4.map create mode 100644 docs/html/inherit_graph_4.md5 create mode 100644 docs/html/inherit_graph_4.svg create mode 100644 docs/html/inherit_graph_5.map create mode 100644 docs/html/inherit_graph_5.md5 create mode 100644 docs/html/inherit_graph_5.svg create mode 100644 docs/html/inherit_graph_6.map create mode 100644 docs/html/inherit_graph_6.md5 create mode 100644 docs/html/inherit_graph_6.svg create mode 100644 docs/html/inherit_graph_7.map create mode 100644 docs/html/inherit_graph_7.md5 create mode 100644 docs/html/inherit_graph_7.svg create mode 100644 docs/html/inherits.html create mode 100644 docs/html/jira__client_8py.html create mode 100644 docs/html/jira__client_8py.js create mode 100644 docs/html/jquery.js create mode 100644 docs/html/llm__client_8py.html create mode 100644 docs/html/llm__client_8py.js create mode 100644 docs/html/login__command_8py.html create mode 100644 docs/html/login__command_8py.js create mode 100644 docs/html/main_8py.html create mode 100644 docs/html/main_8py.js create mode 100644 docs/html/md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_README.html create mode 100644 docs/html/md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_commit_commands.html create mode 100644 docs/html/md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_config_commands.html create mode 100644 docs/html/md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_detailed_usage.html create mode 100644 docs/html/md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_doc_commands.html create mode 100644 docs/html/md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_example_workflows.html create mode 100644 docs/html/menu.js create mode 100644 docs/html/menudata.js create mode 100644 docs/html/namespacemembers.html create mode 100644 docs/html/namespacemembers_func.html create mode 100644 docs/html/namespacemembers_vars.html create mode 100644 docs/html/namespacepenify__hook.html create mode 100644 docs/html/namespacepenify__hook.js create mode 100644 docs/html/namespacepenify__hook_1_1api__client.html create mode 100644 docs/html/namespacepenify__hook_1_1api__client.js create mode 100644 docs/html/namespacepenify__hook_1_1base__analyzer.html create mode 100644 docs/html/namespacepenify__hook_1_1base__analyzer.js create mode 100644 docs/html/namespacepenify__hook_1_1commands.html create mode 100644 docs/html/namespacepenify__hook_1_1commands.js create mode 100644 docs/html/namespacepenify__hook_1_1commands_1_1auth__commands.html create mode 100644 docs/html/namespacepenify__hook_1_1commands_1_1auth__commands_a78f375c58bb6f69f98675e6a9ac84655_cgraph.map create mode 100644 docs/html/namespacepenify__hook_1_1commands_1_1auth__commands_a78f375c58bb6f69f98675e6a9ac84655_cgraph.md5 create mode 100644 docs/html/namespacepenify__hook_1_1commands_1_1auth__commands_a78f375c58bb6f69f98675e6a9ac84655_cgraph.svg create mode 100644 docs/html/namespacepenify__hook_1_1commands_1_1auth__commands_a78f375c58bb6f69f98675e6a9ac84655_cgraph_org.svg create mode 100644 docs/html/namespacepenify__hook_1_1commands_1_1auth__commands_a78f375c58bb6f69f98675e6a9ac84655_icgraph.map create mode 100644 docs/html/namespacepenify__hook_1_1commands_1_1auth__commands_a78f375c58bb6f69f98675e6a9ac84655_icgraph.md5 create mode 100644 docs/html/namespacepenify__hook_1_1commands_1_1auth__commands_a78f375c58bb6f69f98675e6a9ac84655_icgraph.svg create mode 100644 docs/html/namespacepenify__hook_1_1commands_1_1auth__commands_a78f375c58bb6f69f98675e6a9ac84655_icgraph_org.svg create mode 100644 docs/html/namespacepenify__hook_1_1commands_1_1auth__commands_aa3956ca1749d4218ea1dc6e5b6218b24_cgraph.map create mode 100644 docs/html/namespacepenify__hook_1_1commands_1_1auth__commands_aa3956ca1749d4218ea1dc6e5b6218b24_cgraph.md5 create mode 100644 docs/html/namespacepenify__hook_1_1commands_1_1auth__commands_aa3956ca1749d4218ea1dc6e5b6218b24_cgraph.svg create mode 100644 docs/html/namespacepenify__hook_1_1commands_1_1auth__commands_aa3956ca1749d4218ea1dc6e5b6218b24_icgraph.map create mode 100644 docs/html/namespacepenify__hook_1_1commands_1_1auth__commands_aa3956ca1749d4218ea1dc6e5b6218b24_icgraph.md5 create mode 100644 docs/html/namespacepenify__hook_1_1commands_1_1auth__commands_aa3956ca1749d4218ea1dc6e5b6218b24_icgraph.svg create mode 100644 docs/html/namespacepenify__hook_1_1commands_1_1auth__commands_aa3956ca1749d4218ea1dc6e5b6218b24_icgraph_org.svg create mode 100644 docs/html/namespacepenify__hook_1_1commands_1_1commit__commands.html create mode 100644 docs/html/namespacepenify__hook_1_1commands_1_1commit__commands_a62564c4e8ad59fc46d56cb0f9122a71a_cgraph.map create mode 100644 docs/html/namespacepenify__hook_1_1commands_1_1commit__commands_a62564c4e8ad59fc46d56cb0f9122a71a_cgraph.md5 create mode 100644 docs/html/namespacepenify__hook_1_1commands_1_1commit__commands_a62564c4e8ad59fc46d56cb0f9122a71a_cgraph.svg create mode 100644 docs/html/namespacepenify__hook_1_1commands_1_1commit__commands_a62564c4e8ad59fc46d56cb0f9122a71a_cgraph_org.svg create mode 100644 docs/html/namespacepenify__hook_1_1commands_1_1commit__commands_a62564c4e8ad59fc46d56cb0f9122a71a_icgraph.map create mode 100644 docs/html/namespacepenify__hook_1_1commands_1_1commit__commands_a62564c4e8ad59fc46d56cb0f9122a71a_icgraph.md5 create mode 100644 docs/html/namespacepenify__hook_1_1commands_1_1commit__commands_a62564c4e8ad59fc46d56cb0f9122a71a_icgraph.svg create mode 100644 docs/html/namespacepenify__hook_1_1commands_1_1commit__commands_a62564c4e8ad59fc46d56cb0f9122a71a_icgraph_org.svg create mode 100644 docs/html/namespacepenify__hook_1_1commands_1_1commit__commands_a8627583116eb78e31a4d3cdc16d2f15c_icgraph.map create mode 100644 docs/html/namespacepenify__hook_1_1commands_1_1commit__commands_a8627583116eb78e31a4d3cdc16d2f15c_icgraph.md5 create mode 100644 docs/html/namespacepenify__hook_1_1commands_1_1commit__commands_a8627583116eb78e31a4d3cdc16d2f15c_icgraph.svg create mode 100644 docs/html/namespacepenify__hook_1_1commands_1_1commit__commands_af4f739f524c38b437e4e47673d683e23_cgraph.map create mode 100644 docs/html/namespacepenify__hook_1_1commands_1_1commit__commands_af4f739f524c38b437e4e47673d683e23_cgraph.md5 create mode 100644 docs/html/namespacepenify__hook_1_1commands_1_1commit__commands_af4f739f524c38b437e4e47673d683e23_cgraph.svg create mode 100644 docs/html/namespacepenify__hook_1_1commands_1_1commit__commands_af4f739f524c38b437e4e47673d683e23_cgraph_org.svg create mode 100644 docs/html/namespacepenify__hook_1_1commands_1_1commit__commands_af4f739f524c38b437e4e47673d683e23_icgraph.map create mode 100644 docs/html/namespacepenify__hook_1_1commands_1_1commit__commands_af4f739f524c38b437e4e47673d683e23_icgraph.md5 create mode 100644 docs/html/namespacepenify__hook_1_1commands_1_1commit__commands_af4f739f524c38b437e4e47673d683e23_icgraph.svg create mode 100644 docs/html/namespacepenify__hook_1_1commands_1_1config__commands.html create mode 100644 docs/html/namespacepenify__hook_1_1commands_1_1config__commands_a15bf3685c4dcb5c15ba6a4055e484cf2_cgraph.map create mode 100644 docs/html/namespacepenify__hook_1_1commands_1_1config__commands_a15bf3685c4dcb5c15ba6a4055e484cf2_cgraph.md5 create mode 100644 docs/html/namespacepenify__hook_1_1commands_1_1config__commands_a15bf3685c4dcb5c15ba6a4055e484cf2_cgraph.svg create mode 100644 docs/html/namespacepenify__hook_1_1commands_1_1config__commands_a15bf3685c4dcb5c15ba6a4055e484cf2_cgraph_org.svg create mode 100644 docs/html/namespacepenify__hook_1_1commands_1_1config__commands_a15bf3685c4dcb5c15ba6a4055e484cf2_icgraph.map create mode 100644 docs/html/namespacepenify__hook_1_1commands_1_1config__commands_a15bf3685c4dcb5c15ba6a4055e484cf2_icgraph.md5 create mode 100644 docs/html/namespacepenify__hook_1_1commands_1_1config__commands_a15bf3685c4dcb5c15ba6a4055e484cf2_icgraph.svg create mode 100644 docs/html/namespacepenify__hook_1_1commands_1_1config__commands_a15bf3685c4dcb5c15ba6a4055e484cf2_icgraph_org.svg create mode 100644 docs/html/namespacepenify__hook_1_1commands_1_1config__commands_a185dfc34a655ed80e6c95939b6f3c35c_icgraph.map create mode 100644 docs/html/namespacepenify__hook_1_1commands_1_1config__commands_a185dfc34a655ed80e6c95939b6f3c35c_icgraph.md5 create mode 100644 docs/html/namespacepenify__hook_1_1commands_1_1config__commands_a185dfc34a655ed80e6c95939b6f3c35c_icgraph.svg create mode 100644 docs/html/namespacepenify__hook_1_1commands_1_1config__commands_a185dfc34a655ed80e6c95939b6f3c35c_icgraph_org.svg create mode 100644 docs/html/namespacepenify__hook_1_1commands_1_1config__commands_a3caf2b062dd33b1f1d7ddc7224f0ff87_icgraph.map create mode 100644 docs/html/namespacepenify__hook_1_1commands_1_1config__commands_a3caf2b062dd33b1f1d7ddc7224f0ff87_icgraph.md5 create mode 100644 docs/html/namespacepenify__hook_1_1commands_1_1config__commands_a3caf2b062dd33b1f1d7ddc7224f0ff87_icgraph.svg create mode 100644 docs/html/namespacepenify__hook_1_1commands_1_1config__commands_a3caf2b062dd33b1f1d7ddc7224f0ff87_icgraph_org.svg create mode 100644 docs/html/namespacepenify__hook_1_1commands_1_1config__commands_a4617bc5956e502c9555dc0dda0376df4_cgraph.map create mode 100644 docs/html/namespacepenify__hook_1_1commands_1_1config__commands_a4617bc5956e502c9555dc0dda0376df4_cgraph.md5 create mode 100644 docs/html/namespacepenify__hook_1_1commands_1_1config__commands_a4617bc5956e502c9555dc0dda0376df4_cgraph.svg create mode 100644 docs/html/namespacepenify__hook_1_1commands_1_1config__commands_a4617bc5956e502c9555dc0dda0376df4_icgraph.map create mode 100644 docs/html/namespacepenify__hook_1_1commands_1_1config__commands_a4617bc5956e502c9555dc0dda0376df4_icgraph.md5 create mode 100644 docs/html/namespacepenify__hook_1_1commands_1_1config__commands_a4617bc5956e502c9555dc0dda0376df4_icgraph.svg create mode 100644 docs/html/namespacepenify__hook_1_1commands_1_1config__commands_a4617bc5956e502c9555dc0dda0376df4_icgraph_org.svg create mode 100644 docs/html/namespacepenify__hook_1_1commands_1_1config__commands_a5503d51c905e2f1b299b12d2a73bd812_cgraph.map create mode 100644 docs/html/namespacepenify__hook_1_1commands_1_1config__commands_a5503d51c905e2f1b299b12d2a73bd812_cgraph.md5 create mode 100644 docs/html/namespacepenify__hook_1_1commands_1_1config__commands_a5503d51c905e2f1b299b12d2a73bd812_cgraph.svg create mode 100644 docs/html/namespacepenify__hook_1_1commands_1_1config__commands_a5503d51c905e2f1b299b12d2a73bd812_cgraph_org.svg create mode 100644 docs/html/namespacepenify__hook_1_1commands_1_1config__commands_a5503d51c905e2f1b299b12d2a73bd812_icgraph.map create mode 100644 docs/html/namespacepenify__hook_1_1commands_1_1config__commands_a5503d51c905e2f1b299b12d2a73bd812_icgraph.md5 create mode 100644 docs/html/namespacepenify__hook_1_1commands_1_1config__commands_a5503d51c905e2f1b299b12d2a73bd812_icgraph.svg create mode 100644 docs/html/namespacepenify__hook_1_1commands_1_1config__commands_a5503d51c905e2f1b299b12d2a73bd812_icgraph_org.svg create mode 100644 docs/html/namespacepenify__hook_1_1commands_1_1config__commands_a6492bc8e7df6e38bb06ad05e572d4cc0_cgraph.map create mode 100644 docs/html/namespacepenify__hook_1_1commands_1_1config__commands_a6492bc8e7df6e38bb06ad05e572d4cc0_cgraph.md5 create mode 100644 docs/html/namespacepenify__hook_1_1commands_1_1config__commands_a6492bc8e7df6e38bb06ad05e572d4cc0_cgraph.svg create mode 100644 docs/html/namespacepenify__hook_1_1commands_1_1config__commands_a6492bc8e7df6e38bb06ad05e572d4cc0_cgraph_org.svg create mode 100644 docs/html/namespacepenify__hook_1_1commands_1_1config__commands_a6492bc8e7df6e38bb06ad05e572d4cc0_icgraph.map create mode 100644 docs/html/namespacepenify__hook_1_1commands_1_1config__commands_a6492bc8e7df6e38bb06ad05e572d4cc0_icgraph.md5 create mode 100644 docs/html/namespacepenify__hook_1_1commands_1_1config__commands_a6492bc8e7df6e38bb06ad05e572d4cc0_icgraph.svg create mode 100644 docs/html/namespacepenify__hook_1_1commands_1_1config__commands_a6492bc8e7df6e38bb06ad05e572d4cc0_icgraph_org.svg create mode 100644 docs/html/namespacepenify__hook_1_1commands_1_1config__commands_a6559a82d0bf727703d550d1003d3ed20_cgraph.map create mode 100644 docs/html/namespacepenify__hook_1_1commands_1_1config__commands_a6559a82d0bf727703d550d1003d3ed20_cgraph.md5 create mode 100644 docs/html/namespacepenify__hook_1_1commands_1_1config__commands_a6559a82d0bf727703d550d1003d3ed20_cgraph.svg create mode 100644 docs/html/namespacepenify__hook_1_1commands_1_1config__commands_a6559a82d0bf727703d550d1003d3ed20_icgraph.map create mode 100644 docs/html/namespacepenify__hook_1_1commands_1_1config__commands_a6559a82d0bf727703d550d1003d3ed20_icgraph.md5 create mode 100644 docs/html/namespacepenify__hook_1_1commands_1_1config__commands_a6559a82d0bf727703d550d1003d3ed20_icgraph.svg create mode 100644 docs/html/namespacepenify__hook_1_1commands_1_1config__commands_a6559a82d0bf727703d550d1003d3ed20_icgraph_org.svg create mode 100644 docs/html/namespacepenify__hook_1_1commands_1_1config__commands_aabe277132ce0bc0aacef951cf1dee2ae_cgraph.map create mode 100644 docs/html/namespacepenify__hook_1_1commands_1_1config__commands_aabe277132ce0bc0aacef951cf1dee2ae_cgraph.md5 create mode 100644 docs/html/namespacepenify__hook_1_1commands_1_1config__commands_aabe277132ce0bc0aacef951cf1dee2ae_cgraph.svg create mode 100644 docs/html/namespacepenify__hook_1_1commands_1_1config__commands_aabe277132ce0bc0aacef951cf1dee2ae_icgraph.map create mode 100644 docs/html/namespacepenify__hook_1_1commands_1_1config__commands_aabe277132ce0bc0aacef951cf1dee2ae_icgraph.md5 create mode 100644 docs/html/namespacepenify__hook_1_1commands_1_1config__commands_aabe277132ce0bc0aacef951cf1dee2ae_icgraph.svg create mode 100644 docs/html/namespacepenify__hook_1_1commands_1_1config__commands_aabe277132ce0bc0aacef951cf1dee2ae_icgraph_org.svg create mode 100644 docs/html/namespacepenify__hook_1_1commands_1_1config__commands_ab2486ac2bf16b4a671e49625bfa4f9b4_cgraph.map create mode 100644 docs/html/namespacepenify__hook_1_1commands_1_1config__commands_ab2486ac2bf16b4a671e49625bfa4f9b4_cgraph.md5 create mode 100644 docs/html/namespacepenify__hook_1_1commands_1_1config__commands_ab2486ac2bf16b4a671e49625bfa4f9b4_cgraph.svg create mode 100644 docs/html/namespacepenify__hook_1_1commands_1_1config__commands_ab2486ac2bf16b4a671e49625bfa4f9b4_icgraph.map create mode 100644 docs/html/namespacepenify__hook_1_1commands_1_1config__commands_ab2486ac2bf16b4a671e49625bfa4f9b4_icgraph.md5 create mode 100644 docs/html/namespacepenify__hook_1_1commands_1_1config__commands_ab2486ac2bf16b4a671e49625bfa4f9b4_icgraph.svg create mode 100644 docs/html/namespacepenify__hook_1_1commands_1_1config__commands_ab2486ac2bf16b4a671e49625bfa4f9b4_icgraph_org.svg create mode 100644 docs/html/namespacepenify__hook_1_1commands_1_1config__commands_af115198ea5d6808ccb98733957f50b06_cgraph.map create mode 100644 docs/html/namespacepenify__hook_1_1commands_1_1config__commands_af115198ea5d6808ccb98733957f50b06_cgraph.md5 create mode 100644 docs/html/namespacepenify__hook_1_1commands_1_1config__commands_af115198ea5d6808ccb98733957f50b06_cgraph.svg create mode 100644 docs/html/namespacepenify__hook_1_1commands_1_1config__commands_af115198ea5d6808ccb98733957f50b06_cgraph_org.svg create mode 100644 docs/html/namespacepenify__hook_1_1commands_1_1config__commands_af115198ea5d6808ccb98733957f50b06_icgraph.map create mode 100644 docs/html/namespacepenify__hook_1_1commands_1_1config__commands_af115198ea5d6808ccb98733957f50b06_icgraph.md5 create mode 100644 docs/html/namespacepenify__hook_1_1commands_1_1config__commands_af115198ea5d6808ccb98733957f50b06_icgraph.svg create mode 100644 docs/html/namespacepenify__hook_1_1commands_1_1config__commands_af115198ea5d6808ccb98733957f50b06_icgraph_org.svg create mode 100644 docs/html/namespacepenify__hook_1_1commands_1_1doc__commands.html create mode 100644 docs/html/namespacepenify__hook_1_1commands_1_1doc__commands_a2006ab13bff718ef783868a910c0b704_cgraph.map create mode 100644 docs/html/namespacepenify__hook_1_1commands_1_1doc__commands_a2006ab13bff718ef783868a910c0b704_cgraph.md5 create mode 100644 docs/html/namespacepenify__hook_1_1commands_1_1doc__commands_a2006ab13bff718ef783868a910c0b704_cgraph.svg create mode 100644 docs/html/namespacepenify__hook_1_1commands_1_1doc__commands_a2006ab13bff718ef783868a910c0b704_cgraph_org.svg create mode 100644 docs/html/namespacepenify__hook_1_1commands_1_1doc__commands_a2006ab13bff718ef783868a910c0b704_icgraph.map create mode 100644 docs/html/namespacepenify__hook_1_1commands_1_1doc__commands_a2006ab13bff718ef783868a910c0b704_icgraph.md5 create mode 100644 docs/html/namespacepenify__hook_1_1commands_1_1doc__commands_a2006ab13bff718ef783868a910c0b704_icgraph.svg create mode 100644 docs/html/namespacepenify__hook_1_1commands_1_1doc__commands_a4daac68bc563432bf25c85dc78081a25_icgraph.map create mode 100644 docs/html/namespacepenify__hook_1_1commands_1_1doc__commands_a4daac68bc563432bf25c85dc78081a25_icgraph.md5 create mode 100644 docs/html/namespacepenify__hook_1_1commands_1_1doc__commands_a4daac68bc563432bf25c85dc78081a25_icgraph.svg create mode 100644 docs/html/namespacepenify__hook_1_1commands_1_1doc__commands_a4daac68bc563432bf25c85dc78081a25_icgraph_org.svg create mode 100644 docs/html/namespacepenify__hook_1_1commands_1_1doc__commands_acc7f4ead1b11951d885fa5c151c2cbe0_icgraph.map create mode 100644 docs/html/namespacepenify__hook_1_1commands_1_1doc__commands_acc7f4ead1b11951d885fa5c151c2cbe0_icgraph.md5 create mode 100644 docs/html/namespacepenify__hook_1_1commands_1_1doc__commands_acc7f4ead1b11951d885fa5c151c2cbe0_icgraph.svg create mode 100644 docs/html/namespacepenify__hook_1_1commands_1_1hook__commands.html create mode 100644 docs/html/namespacepenify__hook_1_1commands_1_1hook__commands_a81543eb5fa835fd1237f24e8bce6201d_icgraph.map create mode 100644 docs/html/namespacepenify__hook_1_1commands_1_1hook__commands_a81543eb5fa835fd1237f24e8bce6201d_icgraph.md5 create mode 100644 docs/html/namespacepenify__hook_1_1commands_1_1hook__commands_a81543eb5fa835fd1237f24e8bce6201d_icgraph.svg create mode 100644 docs/html/namespacepenify__hook_1_1commands_1_1hook__commands_a81543eb5fa835fd1237f24e8bce6201d_icgraph_org.svg create mode 100644 docs/html/namespacepenify__hook_1_1commands_1_1hook__commands_adff8f5d3bf1c3795974a391ee95b72b2_icgraph.map create mode 100644 docs/html/namespacepenify__hook_1_1commands_1_1hook__commands_adff8f5d3bf1c3795974a391ee95b72b2_icgraph.md5 create mode 100644 docs/html/namespacepenify__hook_1_1commands_1_1hook__commands_adff8f5d3bf1c3795974a391ee95b72b2_icgraph.svg create mode 100644 docs/html/namespacepenify__hook_1_1commands_1_1hook__commands_adff8f5d3bf1c3795974a391ee95b72b2_icgraph_org.svg create mode 100644 docs/html/namespacepenify__hook_1_1commit__analyzer.html create mode 100644 docs/html/namespacepenify__hook_1_1commit__analyzer.js create mode 100644 docs/html/namespacepenify__hook_1_1config__command.html create mode 100644 docs/html/namespacepenify__hook_1_1config__command_a240e5331681eb574ac319d7458783bde_cgraph.map create mode 100644 docs/html/namespacepenify__hook_1_1config__command_a240e5331681eb574ac319d7458783bde_cgraph.md5 create mode 100644 docs/html/namespacepenify__hook_1_1config__command_a240e5331681eb574ac319d7458783bde_cgraph.svg create mode 100644 docs/html/namespacepenify__hook_1_1config__command_a240e5331681eb574ac319d7458783bde_cgraph_org.svg create mode 100644 docs/html/namespacepenify__hook_1_1config__command_a240e5331681eb574ac319d7458783bde_icgraph.map create mode 100644 docs/html/namespacepenify__hook_1_1config__command_a240e5331681eb574ac319d7458783bde_icgraph.md5 create mode 100644 docs/html/namespacepenify__hook_1_1config__command_a240e5331681eb574ac319d7458783bde_icgraph.svg create mode 100644 docs/html/namespacepenify__hook_1_1config__command_a4f3eb92164a69df1446d745f8a09285e_icgraph.map create mode 100644 docs/html/namespacepenify__hook_1_1config__command_a4f3eb92164a69df1446d745f8a09285e_icgraph.md5 create mode 100644 docs/html/namespacepenify__hook_1_1config__command_a4f3eb92164a69df1446d745f8a09285e_icgraph.svg create mode 100644 docs/html/namespacepenify__hook_1_1constants.html create mode 100644 docs/html/namespacepenify__hook_1_1file__analyzer.html create mode 100644 docs/html/namespacepenify__hook_1_1file__analyzer.js create mode 100644 docs/html/namespacepenify__hook_1_1folder__analyzer.html create mode 100644 docs/html/namespacepenify__hook_1_1folder__analyzer.js create mode 100644 docs/html/namespacepenify__hook_1_1git__analyzer.html create mode 100644 docs/html/namespacepenify__hook_1_1git__analyzer.js create mode 100644 docs/html/namespacepenify__hook_1_1jira__client.html create mode 100644 docs/html/namespacepenify__hook_1_1jira__client.js create mode 100644 docs/html/namespacepenify__hook_1_1llm__client.html create mode 100644 docs/html/namespacepenify__hook_1_1llm__client.js create mode 100644 docs/html/namespacepenify__hook_1_1login__command.html create mode 100644 docs/html/namespacepenify__hook_1_1login__command_aae63db4c484797bead34b7d874020c6a_icgraph.map create mode 100644 docs/html/namespacepenify__hook_1_1login__command_aae63db4c484797bead34b7d874020c6a_icgraph.md5 create mode 100644 docs/html/namespacepenify__hook_1_1login__command_aae63db4c484797bead34b7d874020c6a_icgraph.svg create mode 100644 docs/html/namespacepenify__hook_1_1login__command_ae4bf932fbafeff834b0a0c5a37f74ccd_cgraph.map create mode 100644 docs/html/namespacepenify__hook_1_1login__command_ae4bf932fbafeff834b0a0c5a37f74ccd_cgraph.md5 create mode 100644 docs/html/namespacepenify__hook_1_1login__command_ae4bf932fbafeff834b0a0c5a37f74ccd_cgraph.svg create mode 100644 docs/html/namespacepenify__hook_1_1login__command_ae4bf932fbafeff834b0a0c5a37f74ccd_cgraph_org.svg create mode 100644 docs/html/namespacepenify__hook_1_1login__command_ae4bf932fbafeff834b0a0c5a37f74ccd_icgraph.map create mode 100644 docs/html/namespacepenify__hook_1_1login__command_ae4bf932fbafeff834b0a0c5a37f74ccd_icgraph.md5 create mode 100644 docs/html/namespacepenify__hook_1_1login__command_ae4bf932fbafeff834b0a0c5a37f74ccd_icgraph.svg create mode 100644 docs/html/namespacepenify__hook_1_1main.html create mode 100644 docs/html/namespacepenify__hook_1_1main_a16838b20df4bd14ee4b5e1dd2906738f_cgraph.map create mode 100644 docs/html/namespacepenify__hook_1_1main_a16838b20df4bd14ee4b5e1dd2906738f_cgraph.md5 create mode 100644 docs/html/namespacepenify__hook_1_1main_a16838b20df4bd14ee4b5e1dd2906738f_cgraph.svg create mode 100644 docs/html/namespacepenify__hook_1_1main_a16838b20df4bd14ee4b5e1dd2906738f_cgraph_org.svg create mode 100644 docs/html/namespacepenify__hook_1_1main_a16838b20df4bd14ee4b5e1dd2906738f_icgraph.map create mode 100644 docs/html/namespacepenify__hook_1_1main_a16838b20df4bd14ee4b5e1dd2906738f_icgraph.md5 create mode 100644 docs/html/namespacepenify__hook_1_1main_a16838b20df4bd14ee4b5e1dd2906738f_icgraph.svg create mode 100644 docs/html/namespacepenify__hook_1_1ui__utils.html create mode 100644 docs/html/namespacepenify__hook_1_1ui__utils_a0a6fd2613c6fe053b6e4356cd9e5cda2_icgraph.map create mode 100644 docs/html/namespacepenify__hook_1_1ui__utils_a0a6fd2613c6fe053b6e4356cd9e5cda2_icgraph.md5 create mode 100644 docs/html/namespacepenify__hook_1_1ui__utils_a0a6fd2613c6fe053b6e4356cd9e5cda2_icgraph.svg create mode 100644 docs/html/namespacepenify__hook_1_1ui__utils_a0a6fd2613c6fe053b6e4356cd9e5cda2_icgraph_org.svg create mode 100644 docs/html/namespacepenify__hook_1_1ui__utils_a12b92532b1458af94f3649d411b5505c_cgraph.map create mode 100644 docs/html/namespacepenify__hook_1_1ui__utils_a12b92532b1458af94f3649d411b5505c_cgraph.md5 create mode 100644 docs/html/namespacepenify__hook_1_1ui__utils_a12b92532b1458af94f3649d411b5505c_cgraph.svg create mode 100644 docs/html/namespacepenify__hook_1_1ui__utils_a12b92532b1458af94f3649d411b5505c_icgraph.map create mode 100644 docs/html/namespacepenify__hook_1_1ui__utils_a12b92532b1458af94f3649d411b5505c_icgraph.md5 create mode 100644 docs/html/namespacepenify__hook_1_1ui__utils_a12b92532b1458af94f3649d411b5505c_icgraph.svg create mode 100644 docs/html/namespacepenify__hook_1_1ui__utils_a1ffbb9671dbe233770268e2dd66a67fa_cgraph.map create mode 100644 docs/html/namespacepenify__hook_1_1ui__utils_a1ffbb9671dbe233770268e2dd66a67fa_cgraph.md5 create mode 100644 docs/html/namespacepenify__hook_1_1ui__utils_a1ffbb9671dbe233770268e2dd66a67fa_cgraph.svg create mode 100644 docs/html/namespacepenify__hook_1_1ui__utils_a1ffbb9671dbe233770268e2dd66a67fa_icgraph.map create mode 100644 docs/html/namespacepenify__hook_1_1ui__utils_a1ffbb9671dbe233770268e2dd66a67fa_icgraph.md5 create mode 100644 docs/html/namespacepenify__hook_1_1ui__utils_a1ffbb9671dbe233770268e2dd66a67fa_icgraph.svg create mode 100644 docs/html/namespacepenify__hook_1_1ui__utils_a1ffbb9671dbe233770268e2dd66a67fa_icgraph_org.svg create mode 100644 docs/html/namespacepenify__hook_1_1ui__utils_a2b16aa6b68a9edea5f29f84f1c4be79a_cgraph.map create mode 100644 docs/html/namespacepenify__hook_1_1ui__utils_a2b16aa6b68a9edea5f29f84f1c4be79a_cgraph.md5 create mode 100644 docs/html/namespacepenify__hook_1_1ui__utils_a2b16aa6b68a9edea5f29f84f1c4be79a_cgraph.svg create mode 100644 docs/html/namespacepenify__hook_1_1ui__utils_a2b16aa6b68a9edea5f29f84f1c4be79a_icgraph.map create mode 100644 docs/html/namespacepenify__hook_1_1ui__utils_a2b16aa6b68a9edea5f29f84f1c4be79a_icgraph.md5 create mode 100644 docs/html/namespacepenify__hook_1_1ui__utils_a2b16aa6b68a9edea5f29f84f1c4be79a_icgraph.svg create mode 100644 docs/html/namespacepenify__hook_1_1ui__utils_a3da02cd1140179a9ce60f62c85fccfef_cgraph.map create mode 100644 docs/html/namespacepenify__hook_1_1ui__utils_a3da02cd1140179a9ce60f62c85fccfef_cgraph.md5 create mode 100644 docs/html/namespacepenify__hook_1_1ui__utils_a3da02cd1140179a9ce60f62c85fccfef_cgraph.svg create mode 100644 docs/html/namespacepenify__hook_1_1ui__utils_a3da02cd1140179a9ce60f62c85fccfef_icgraph.map create mode 100644 docs/html/namespacepenify__hook_1_1ui__utils_a3da02cd1140179a9ce60f62c85fccfef_icgraph.md5 create mode 100644 docs/html/namespacepenify__hook_1_1ui__utils_a3da02cd1140179a9ce60f62c85fccfef_icgraph.svg create mode 100644 docs/html/namespacepenify__hook_1_1ui__utils_a4dd934568897433fa73f9cc182ac4a3e_icgraph.map create mode 100644 docs/html/namespacepenify__hook_1_1ui__utils_a4dd934568897433fa73f9cc182ac4a3e_icgraph.md5 create mode 100644 docs/html/namespacepenify__hook_1_1ui__utils_a4dd934568897433fa73f9cc182ac4a3e_icgraph.svg create mode 100644 docs/html/namespacepenify__hook_1_1ui__utils_a4dd934568897433fa73f9cc182ac4a3e_icgraph_org.svg create mode 100644 docs/html/namespacepenify__hook_1_1ui__utils_a532cdb4de7c679ce8b29c3e9116c4776_icgraph.map create mode 100644 docs/html/namespacepenify__hook_1_1ui__utils_a532cdb4de7c679ce8b29c3e9116c4776_icgraph.md5 create mode 100644 docs/html/namespacepenify__hook_1_1ui__utils_a532cdb4de7c679ce8b29c3e9116c4776_icgraph.svg create mode 100644 docs/html/namespacepenify__hook_1_1ui__utils_a532cdb4de7c679ce8b29c3e9116c4776_icgraph_org.svg create mode 100644 docs/html/namespacepenify__hook_1_1ui__utils_a5a7340d0fc60fb80f17514d60bf45f1d_icgraph.map create mode 100644 docs/html/namespacepenify__hook_1_1ui__utils_a5a7340d0fc60fb80f17514d60bf45f1d_icgraph.md5 create mode 100644 docs/html/namespacepenify__hook_1_1ui__utils_a5a7340d0fc60fb80f17514d60bf45f1d_icgraph.svg create mode 100644 docs/html/namespacepenify__hook_1_1ui__utils_a5a7340d0fc60fb80f17514d60bf45f1d_icgraph_org.svg create mode 100644 docs/html/namespacepenify__hook_1_1ui__utils_a6f0acd7dd91abfe67d0807803bc3b65f_cgraph.map create mode 100644 docs/html/namespacepenify__hook_1_1ui__utils_a6f0acd7dd91abfe67d0807803bc3b65f_cgraph.md5 create mode 100644 docs/html/namespacepenify__hook_1_1ui__utils_a6f0acd7dd91abfe67d0807803bc3b65f_cgraph.svg create mode 100644 docs/html/namespacepenify__hook_1_1ui__utils_a6f0acd7dd91abfe67d0807803bc3b65f_icgraph.map create mode 100644 docs/html/namespacepenify__hook_1_1ui__utils_a6f0acd7dd91abfe67d0807803bc3b65f_icgraph.md5 create mode 100644 docs/html/namespacepenify__hook_1_1ui__utils_a6f0acd7dd91abfe67d0807803bc3b65f_icgraph.svg create mode 100644 docs/html/namespacepenify__hook_1_1ui__utils_a6f0acd7dd91abfe67d0807803bc3b65f_icgraph_org.svg create mode 100644 docs/html/namespacepenify__hook_1_1ui__utils_a811f0adf6e9bf71510c379b6fa155e44_cgraph.map create mode 100644 docs/html/namespacepenify__hook_1_1ui__utils_a811f0adf6e9bf71510c379b6fa155e44_cgraph.md5 create mode 100644 docs/html/namespacepenify__hook_1_1ui__utils_a811f0adf6e9bf71510c379b6fa155e44_cgraph.svg create mode 100644 docs/html/namespacepenify__hook_1_1ui__utils_a811f0adf6e9bf71510c379b6fa155e44_icgraph.map create mode 100644 docs/html/namespacepenify__hook_1_1ui__utils_a811f0adf6e9bf71510c379b6fa155e44_icgraph.md5 create mode 100644 docs/html/namespacepenify__hook_1_1ui__utils_a811f0adf6e9bf71510c379b6fa155e44_icgraph.svg create mode 100644 docs/html/namespacepenify__hook_1_1ui__utils_a811f0adf6e9bf71510c379b6fa155e44_icgraph_org.svg create mode 100644 docs/html/namespacepenify__hook_1_1ui__utils_a92c3e466d1912058167be2eacf85b9f6_icgraph.map create mode 100644 docs/html/namespacepenify__hook_1_1ui__utils_a92c3e466d1912058167be2eacf85b9f6_icgraph.md5 create mode 100644 docs/html/namespacepenify__hook_1_1ui__utils_a92c3e466d1912058167be2eacf85b9f6_icgraph.svg create mode 100644 docs/html/namespacepenify__hook_1_1ui__utils_a92c3e466d1912058167be2eacf85b9f6_icgraph_org.svg create mode 100644 docs/html/namespacepenify__hook_1_1ui__utils_aa6e684c00e26199440137a87ed9b195c_icgraph.map create mode 100644 docs/html/namespacepenify__hook_1_1ui__utils_aa6e684c00e26199440137a87ed9b195c_icgraph.md5 create mode 100644 docs/html/namespacepenify__hook_1_1ui__utils_aa6e684c00e26199440137a87ed9b195c_icgraph.svg create mode 100644 docs/html/namespacepenify__hook_1_1ui__utils_adfcbbfe39029ab6d1dd33e7bf75ae115_cgraph.map create mode 100644 docs/html/namespacepenify__hook_1_1ui__utils_adfcbbfe39029ab6d1dd33e7bf75ae115_cgraph.md5 create mode 100644 docs/html/namespacepenify__hook_1_1ui__utils_adfcbbfe39029ab6d1dd33e7bf75ae115_cgraph.svg create mode 100644 docs/html/namespacepenify__hook_1_1ui__utils_adfcbbfe39029ab6d1dd33e7bf75ae115_icgraph.map create mode 100644 docs/html/namespacepenify__hook_1_1ui__utils_adfcbbfe39029ab6d1dd33e7bf75ae115_icgraph.md5 create mode 100644 docs/html/namespacepenify__hook_1_1ui__utils_adfcbbfe39029ab6d1dd33e7bf75ae115_icgraph.svg create mode 100644 docs/html/namespacepenify__hook_1_1ui__utils_af3441fb3c2c3850b8b3b6455a9fdaba4_icgraph.map create mode 100644 docs/html/namespacepenify__hook_1_1ui__utils_af3441fb3c2c3850b8b3b6455a9fdaba4_icgraph.md5 create mode 100644 docs/html/namespacepenify__hook_1_1ui__utils_af3441fb3c2c3850b8b3b6455a9fdaba4_icgraph.svg create mode 100644 docs/html/namespacepenify__hook_1_1ui__utils_af3441fb3c2c3850b8b3b6455a9fdaba4_icgraph_org.svg create mode 100644 docs/html/namespacepenify__hook_1_1utils.html create mode 100644 docs/html/namespacepenify__hook_1_1utils.js create mode 100644 docs/html/namespacepenify__hook_1_1utils_a95c3f9c80860d6a2e2d061d2fb660a3f_cgraph.map create mode 100644 docs/html/namespacepenify__hook_1_1utils_a95c3f9c80860d6a2e2d061d2fb660a3f_cgraph.md5 create mode 100644 docs/html/namespacepenify__hook_1_1utils_a95c3f9c80860d6a2e2d061d2fb660a3f_cgraph.svg create mode 100644 docs/html/namespacepenify__hook_1_1utils_a95c3f9c80860d6a2e2d061d2fb660a3f_icgraph.map create mode 100644 docs/html/namespacepenify__hook_1_1utils_a95c3f9c80860d6a2e2d061d2fb660a3f_icgraph.md5 create mode 100644 docs/html/namespacepenify__hook_1_1utils_a95c3f9c80860d6a2e2d061d2fb660a3f_icgraph.svg create mode 100644 docs/html/namespacepenify__hook_1_1utils_a95c3f9c80860d6a2e2d061d2fb660a3f_icgraph_org.svg create mode 100644 docs/html/namespaces.html create mode 100644 docs/html/namespaces_dup.js create mode 100644 docs/html/namespacesetup.html create mode 100644 docs/html/namespacetests.html create mode 100644 docs/html/namespacetests.js create mode 100644 docs/html/namespacetests_1_1conftest.html create mode 100644 docs/html/namespacetests_1_1test__commit__commands.html create mode 100644 docs/html/namespacetests_1_1test__commit__commands.js create mode 100644 docs/html/namespacetests_1_1test__config__commands.html create mode 100644 docs/html/namespacetests_1_1test__config__commands.js create mode 100644 docs/html/namespacetests_1_1test__doc__commands.html create mode 100644 docs/html/namespacetests_1_1test__doc__commands_a0e74c920f258f442914771164fe26b45_cgraph.map create mode 100644 docs/html/namespacetests_1_1test__doc__commands_a0e74c920f258f442914771164fe26b45_cgraph.md5 create mode 100644 docs/html/namespacetests_1_1test__doc__commands_a0e74c920f258f442914771164fe26b45_cgraph.svg create mode 100644 docs/html/namespacetests_1_1test__doc__commands_a0f27751d0ba2acfe40ef7e85bccf47d7_cgraph.map create mode 100644 docs/html/namespacetests_1_1test__doc__commands_a0f27751d0ba2acfe40ef7e85bccf47d7_cgraph.md5 create mode 100644 docs/html/namespacetests_1_1test__doc__commands_a0f27751d0ba2acfe40ef7e85bccf47d7_cgraph.svg create mode 100644 docs/html/namespacetests_1_1test__doc__commands_a1458af9ad0128c3ca1263b552fd5e482_cgraph.map create mode 100644 docs/html/namespacetests_1_1test__doc__commands_a1458af9ad0128c3ca1263b552fd5e482_cgraph.md5 create mode 100644 docs/html/namespacetests_1_1test__doc__commands_a1458af9ad0128c3ca1263b552fd5e482_cgraph.svg create mode 100644 docs/html/namespacetests_1_1test__doc__commands_a1458af9ad0128c3ca1263b552fd5e482_cgraph_org.svg create mode 100644 docs/html/namespacetests_1_1test__doc__commands_a335e7fd4912192c7276cf31bbebc6eb0_cgraph.map create mode 100644 docs/html/namespacetests_1_1test__doc__commands_a335e7fd4912192c7276cf31bbebc6eb0_cgraph.md5 create mode 100644 docs/html/namespacetests_1_1test__doc__commands_a335e7fd4912192c7276cf31bbebc6eb0_cgraph.svg create mode 100644 docs/html/namespacetests_1_1test__doc__commands_a4bb75610e40d94d42bc169b25403c186_cgraph.map create mode 100644 docs/html/namespacetests_1_1test__doc__commands_a4bb75610e40d94d42bc169b25403c186_cgraph.md5 create mode 100644 docs/html/namespacetests_1_1test__doc__commands_a4bb75610e40d94d42bc169b25403c186_cgraph.svg create mode 100644 docs/html/namespacetests_1_1test__doc__commands_a64165ddfdb3071a88422f080f0e529a3_cgraph.map create mode 100644 docs/html/namespacetests_1_1test__doc__commands_a64165ddfdb3071a88422f080f0e529a3_cgraph.md5 create mode 100644 docs/html/namespacetests_1_1test__doc__commands_a64165ddfdb3071a88422f080f0e529a3_cgraph.svg create mode 100644 docs/html/namespacetests_1_1test__doc__commands_a806110833eb0aad547156faf014b31d8_cgraph.map create mode 100644 docs/html/namespacetests_1_1test__doc__commands_a806110833eb0aad547156faf014b31d8_cgraph.md5 create mode 100644 docs/html/namespacetests_1_1test__doc__commands_a806110833eb0aad547156faf014b31d8_cgraph.svg create mode 100644 docs/html/namespacetests_1_1test__doc__commands_ab158ffa48469b6c097a7a55fcb20c21a_cgraph.map create mode 100644 docs/html/namespacetests_1_1test__doc__commands_ab158ffa48469b6c097a7a55fcb20c21a_cgraph.md5 create mode 100644 docs/html/namespacetests_1_1test__doc__commands_ab158ffa48469b6c097a7a55fcb20c21a_cgraph.svg create mode 100644 docs/html/namespacetests_1_1test__doc__commands_ab158ffa48469b6c097a7a55fcb20c21a_cgraph_org.svg create mode 100644 docs/html/namespacetests_1_1test__doc__commands_ab74688baa8c9b5ba302c2877a9789d05_cgraph.map create mode 100644 docs/html/namespacetests_1_1test__doc__commands_ab74688baa8c9b5ba302c2877a9789d05_cgraph.md5 create mode 100644 docs/html/namespacetests_1_1test__doc__commands_ab74688baa8c9b5ba302c2877a9789d05_cgraph.svg create mode 100644 docs/html/namespacetests_1_1test__doc__commands_ab74688baa8c9b5ba302c2877a9789d05_cgraph_org.svg create mode 100644 docs/html/namespacetests_1_1test__doc__commands_aec76cc25c23476794234cdadbcaef0c0_cgraph.map create mode 100644 docs/html/namespacetests_1_1test__doc__commands_aec76cc25c23476794234cdadbcaef0c0_cgraph.md5 create mode 100644 docs/html/namespacetests_1_1test__doc__commands_aec76cc25c23476794234cdadbcaef0c0_cgraph.svg create mode 100644 docs/html/namespacetests_1_1test__doc__commands_af9b01e5fc89255cac96747fa081c442c_cgraph.map create mode 100644 docs/html/namespacetests_1_1test__doc__commands_af9b01e5fc89255cac96747fa081c442c_cgraph.md5 create mode 100644 docs/html/namespacetests_1_1test__doc__commands_af9b01e5fc89255cac96747fa081c442c_cgraph.svg create mode 100644 docs/html/namespacetests_1_1test__doc__commands_af9b01e5fc89255cac96747fa081c442c_cgraph_org.svg create mode 100644 docs/html/namespacetests_1_1test__web__config.html create mode 100644 docs/html/namespacetests_1_1test__web__config.js create mode 100644 docs/html/nav_f.png create mode 100644 docs/html/nav_g.png create mode 100644 docs/html/nav_h.png create mode 100644 docs/html/navtree.css create mode 100644 docs/html/navtree.js create mode 100644 docs/html/navtreedata.js create mode 100644 docs/html/navtreeindex0.js create mode 100644 docs/html/navtreeindex1.js create mode 100644 docs/html/navtreeindex2.js create mode 100644 docs/html/open.png create mode 100644 docs/html/pages.html create mode 100644 docs/html/penify-cli-documentation_8md.html create mode 100644 docs/html/penify__hook_2____init_____8py.html create mode 100644 docs/html/penify__hook_2commands_2____init_____8py.html create mode 100644 docs/html/resize.js create mode 100644 docs/html/search/all_0.html create mode 100644 docs/html/search/all_0.js create mode 100644 docs/html/search/all_1.html create mode 100644 docs/html/search/all_1.js create mode 100644 docs/html/search/all_10.html create mode 100644 docs/html/search/all_10.js create mode 100644 docs/html/search/all_11.html create mode 100644 docs/html/search/all_11.js create mode 100644 docs/html/search/all_12.html create mode 100644 docs/html/search/all_12.js create mode 100644 docs/html/search/all_13.html create mode 100644 docs/html/search/all_13.js create mode 100644 docs/html/search/all_14.html create mode 100644 docs/html/search/all_14.js create mode 100644 docs/html/search/all_2.html create mode 100644 docs/html/search/all_2.js create mode 100644 docs/html/search/all_3.html create mode 100644 docs/html/search/all_3.js create mode 100644 docs/html/search/all_4.html create mode 100644 docs/html/search/all_4.js create mode 100644 docs/html/search/all_5.html create mode 100644 docs/html/search/all_5.js create mode 100644 docs/html/search/all_6.html create mode 100644 docs/html/search/all_6.js create mode 100644 docs/html/search/all_7.html create mode 100644 docs/html/search/all_7.js create mode 100644 docs/html/search/all_8.html create mode 100644 docs/html/search/all_8.js create mode 100644 docs/html/search/all_9.html create mode 100644 docs/html/search/all_9.js create mode 100644 docs/html/search/all_a.html create mode 100644 docs/html/search/all_a.js create mode 100644 docs/html/search/all_b.html create mode 100644 docs/html/search/all_b.js create mode 100644 docs/html/search/all_c.html create mode 100644 docs/html/search/all_c.js create mode 100644 docs/html/search/all_d.html create mode 100644 docs/html/search/all_d.js create mode 100644 docs/html/search/all_e.html create mode 100644 docs/html/search/all_e.js create mode 100644 docs/html/search/all_f.html create mode 100644 docs/html/search/all_f.js create mode 100644 docs/html/search/classes_0.html create mode 100644 docs/html/search/classes_0.js create mode 100644 docs/html/search/classes_1.html create mode 100644 docs/html/search/classes_1.js create mode 100644 docs/html/search/classes_2.html create mode 100644 docs/html/search/classes_2.js create mode 100644 docs/html/search/classes_3.html create mode 100644 docs/html/search/classes_3.js create mode 100644 docs/html/search/classes_4.html create mode 100644 docs/html/search/classes_4.js create mode 100644 docs/html/search/classes_5.html create mode 100644 docs/html/search/classes_5.js create mode 100644 docs/html/search/classes_6.html create mode 100644 docs/html/search/classes_6.js create mode 100644 docs/html/search/classes_7.html create mode 100644 docs/html/search/classes_7.js create mode 100644 docs/html/search/classes_8.html create mode 100644 docs/html/search/classes_8.js create mode 100644 docs/html/search/close.svg create mode 100644 docs/html/search/files_0.html create mode 100644 docs/html/search/files_0.js create mode 100644 docs/html/search/files_1.html create mode 100644 docs/html/search/files_1.js create mode 100644 docs/html/search/files_10.html create mode 100644 docs/html/search/files_10.js create mode 100644 docs/html/search/files_2.html create mode 100644 docs/html/search/files_2.js create mode 100644 docs/html/search/files_3.html create mode 100644 docs/html/search/files_3.js create mode 100644 docs/html/search/files_4.html create mode 100644 docs/html/search/files_4.js create mode 100644 docs/html/search/files_5.html create mode 100644 docs/html/search/files_5.js create mode 100644 docs/html/search/files_6.html create mode 100644 docs/html/search/files_6.js create mode 100644 docs/html/search/files_7.html create mode 100644 docs/html/search/files_7.js create mode 100644 docs/html/search/files_8.html create mode 100644 docs/html/search/files_8.js create mode 100644 docs/html/search/files_9.html create mode 100644 docs/html/search/files_9.js create mode 100644 docs/html/search/files_a.html create mode 100644 docs/html/search/files_a.js create mode 100644 docs/html/search/files_b.html create mode 100644 docs/html/search/files_b.js create mode 100644 docs/html/search/files_c.html create mode 100644 docs/html/search/files_c.js create mode 100644 docs/html/search/files_d.html create mode 100644 docs/html/search/files_d.js create mode 100644 docs/html/search/files_e.html create mode 100644 docs/html/search/files_e.js create mode 100644 docs/html/search/files_f.html create mode 100644 docs/html/search/files_f.js create mode 100644 docs/html/search/functions_0.html create mode 100644 docs/html/search/functions_0.js create mode 100644 docs/html/search/functions_1.html create mode 100644 docs/html/search/functions_1.js create mode 100644 docs/html/search/functions_2.html create mode 100644 docs/html/search/functions_2.js create mode 100644 docs/html/search/functions_3.html create mode 100644 docs/html/search/functions_3.js create mode 100644 docs/html/search/functions_4.html create mode 100644 docs/html/search/functions_4.js create mode 100644 docs/html/search/functions_5.html create mode 100644 docs/html/search/functions_5.js create mode 100644 docs/html/search/functions_6.html create mode 100644 docs/html/search/functions_6.js create mode 100644 docs/html/search/functions_7.html create mode 100644 docs/html/search/functions_7.js create mode 100644 docs/html/search/functions_8.html create mode 100644 docs/html/search/functions_8.js create mode 100644 docs/html/search/functions_9.html create mode 100644 docs/html/search/functions_9.js create mode 100644 docs/html/search/functions_a.html create mode 100644 docs/html/search/functions_a.js create mode 100644 docs/html/search/functions_b.html create mode 100644 docs/html/search/functions_b.js create mode 100644 docs/html/search/functions_c.html create mode 100644 docs/html/search/functions_c.js create mode 100644 docs/html/search/functions_d.html create mode 100644 docs/html/search/functions_d.js create mode 100644 docs/html/search/functions_e.html create mode 100644 docs/html/search/functions_e.js create mode 100644 docs/html/search/mag_sel.svg create mode 100644 docs/html/search/namespaces_0.html create mode 100644 docs/html/search/namespaces_0.js create mode 100644 docs/html/search/namespaces_1.html create mode 100644 docs/html/search/namespaces_1.js create mode 100644 docs/html/search/namespaces_2.html create mode 100644 docs/html/search/namespaces_2.js create mode 100644 docs/html/search/nomatches.html create mode 100644 docs/html/search/pages_0.html create mode 100644 docs/html/search/pages_0.js create mode 100644 docs/html/search/search.css create mode 100644 docs/html/search/search.js create mode 100644 docs/html/search/search_l.png create mode 100644 docs/html/search/search_m.png create mode 100644 docs/html/search/search_r.png create mode 100644 docs/html/search/searchdata.js create mode 100644 docs/html/search/variables_0.html create mode 100644 docs/html/search/variables_0.js create mode 100644 docs/html/search/variables_1.html create mode 100644 docs/html/search/variables_1.js create mode 100644 docs/html/search/variables_10.html create mode 100644 docs/html/search/variables_10.js create mode 100644 docs/html/search/variables_11.html create mode 100644 docs/html/search/variables_11.js create mode 100644 docs/html/search/variables_12.html create mode 100644 docs/html/search/variables_12.js create mode 100644 docs/html/search/variables_2.html create mode 100644 docs/html/search/variables_2.js create mode 100644 docs/html/search/variables_3.html create mode 100644 docs/html/search/variables_3.js create mode 100644 docs/html/search/variables_4.html create mode 100644 docs/html/search/variables_4.js create mode 100644 docs/html/search/variables_5.html create mode 100644 docs/html/search/variables_5.js create mode 100644 docs/html/search/variables_6.html create mode 100644 docs/html/search/variables_6.js create mode 100644 docs/html/search/variables_7.html create mode 100644 docs/html/search/variables_7.js create mode 100644 docs/html/search/variables_8.html create mode 100644 docs/html/search/variables_8.js create mode 100644 docs/html/search/variables_9.html create mode 100644 docs/html/search/variables_9.js create mode 100644 docs/html/search/variables_a.html create mode 100644 docs/html/search/variables_a.js create mode 100644 docs/html/search/variables_b.html create mode 100644 docs/html/search/variables_b.js create mode 100644 docs/html/search/variables_c.html create mode 100644 docs/html/search/variables_c.js create mode 100644 docs/html/search/variables_d.html create mode 100644 docs/html/search/variables_d.js create mode 100644 docs/html/search/variables_e.html create mode 100644 docs/html/search/variables_e.js create mode 100644 docs/html/search/variables_f.html create mode 100644 docs/html/search/variables_f.js create mode 100644 docs/html/setup_8py.html create mode 100644 docs/html/setup_8py.js create mode 100644 docs/html/splitbar.png create mode 100644 docs/html/svgpan.js create mode 100644 docs/html/sync_off.png create mode 100644 docs/html/sync_on.png create mode 100644 docs/html/tab_a.png create mode 100644 docs/html/tab_b.png create mode 100644 docs/html/tab_h.png create mode 100644 docs/html/tab_s.png create mode 100644 docs/html/tabs.css create mode 100644 docs/html/test__commit__commands_8py.html create mode 100644 docs/html/test__commit__commands_8py.js create mode 100644 docs/html/test__config__commands_8py.html create mode 100644 docs/html/test__config__commands_8py.js create mode 100644 docs/html/test__doc__commands_8py.html create mode 100644 docs/html/test__doc__commands_8py.js create mode 100644 docs/html/test__web__config_8py.html create mode 100644 docs/html/test__web__config_8py.js create mode 100644 docs/html/tests_2____init_____8py.html create mode 100644 docs/html/toggle-alternative-theme.js create mode 100644 docs/html/ui__utils_8py.html create mode 100644 docs/html/ui__utils_8py.js create mode 100644 docs/html/utils_8py.html create mode 100644 docs/html/utils_8py.js create mode 100644 docs/penify-cli-Penify-dev-g.tar.gz create mode 100644 docs/rtf/classException__coll__graph.md5 create mode 100644 docs/rtf/classException__coll__graph.svg create mode 100644 docs/rtf/classException__inherit__graph.md5 create mode 100644 docs/rtf/classException__inherit__graph.svg create mode 100644 docs/rtf/classpenify__hook_1_1api__client_1_1APIClient__coll__graph.md5 create mode 100644 docs/rtf/classpenify__hook_1_1api__client_1_1APIClient__coll__graph.svg create mode 100644 docs/rtf/classpenify__hook_1_1api__client_1_1APIClient_a7ff74798e7d428b4e2f20095287eb2ce_icgraph.md5 create mode 100644 docs/rtf/classpenify__hook_1_1api__client_1_1APIClient_a7ff74798e7d428b4e2f20095287eb2ce_icgraph.svg create mode 100644 docs/rtf/classpenify__hook_1_1api__client_1_1APIClient_ac0ada470b897935f9fb372cd0e7e51e3_cgraph.md5 create mode 100644 docs/rtf/classpenify__hook_1_1api__client_1_1APIClient_ac0ada470b897935f9fb372cd0e7e51e3_cgraph.svg create mode 100644 docs/rtf/classpenify__hook_1_1base__analyzer_1_1BaseAnalyzer__coll__graph.md5 create mode 100644 docs/rtf/classpenify__hook_1_1base__analyzer_1_1BaseAnalyzer__coll__graph.svg create mode 100644 docs/rtf/classpenify__hook_1_1base__analyzer_1_1BaseAnalyzer__inherit__graph.md5 create mode 100644 docs/rtf/classpenify__hook_1_1base__analyzer_1_1BaseAnalyzer__inherit__graph.svg create mode 100644 docs/rtf/classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook__coll__graph.md5 create mode 100644 docs/rtf/classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook__coll__graph.svg create mode 100644 docs/rtf/classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook__inherit__graph.md5 create mode 100644 docs/rtf/classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook__inherit__graph.svg create mode 100644 docs/rtf/classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook_a6370a03f7ed9175ef6f81e931a105ea9_cgraph.md5 create mode 100644 docs/rtf/classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook_a6370a03f7ed9175ef6f81e931a105ea9_cgraph.svg create mode 100644 docs/rtf/classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook_a8496194276441fa2eb2fa014eaab9a37_cgraph.md5 create mode 100644 docs/rtf/classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook_a8496194276441fa2eb2fa014eaab9a37_cgraph.svg create mode 100644 docs/rtf/classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook_a8496194276441fa2eb2fa014eaab9a37_icgraph.md5 create mode 100644 docs/rtf/classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook_a8496194276441fa2eb2fa014eaab9a37_icgraph.svg create mode 100644 docs/rtf/classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook_ac999c5cbc852a7ec3b412ccb43c274ca_icgraph.md5 create mode 100644 docs/rtf/classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook_ac999c5cbc852a7ec3b412ccb43c274ca_icgraph.svg create mode 100644 docs/rtf/classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook_adda13cc121d96342476ccf72b63a007f_cgraph.md5 create mode 100644 docs/rtf/classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook_adda13cc121d96342476ccf72b63a007f_cgraph.svg create mode 100644 docs/rtf/classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook_adda13cc121d96342476ccf72b63a007f_icgraph.md5 create mode 100644 docs/rtf/classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook_adda13cc121d96342476ccf72b63a007f_icgraph.svg create mode 100644 docs/rtf/classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook_af127d86729e226d74dbeb095b008db3e_cgraph.md5 create mode 100644 docs/rtf/classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook_af127d86729e226d74dbeb095b008db3e_cgraph.svg create mode 100644 docs/rtf/classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook_af127d86729e226d74dbeb095b008db3e_icgraph.md5 create mode 100644 docs/rtf/classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook_af127d86729e226d74dbeb095b008db3e_icgraph.svg create mode 100644 docs/rtf/classpenify__hook_1_1file__analyzer_1_1FileAnalyzerGenHook__coll__graph.md5 create mode 100644 docs/rtf/classpenify__hook_1_1file__analyzer_1_1FileAnalyzerGenHook__coll__graph.svg create mode 100644 docs/rtf/classpenify__hook_1_1file__analyzer_1_1FileAnalyzerGenHook__inherit__graph.md5 create mode 100644 docs/rtf/classpenify__hook_1_1file__analyzer_1_1FileAnalyzerGenHook__inherit__graph.svg create mode 100644 docs/rtf/classpenify__hook_1_1file__analyzer_1_1FileAnalyzerGenHook_a2cc6c22ef588fccf3eed9bbc57fb6d6e_cgraph.md5 create mode 100644 docs/rtf/classpenify__hook_1_1file__analyzer_1_1FileAnalyzerGenHook_a2cc6c22ef588fccf3eed9bbc57fb6d6e_cgraph.svg create mode 100644 docs/rtf/classpenify__hook_1_1file__analyzer_1_1FileAnalyzerGenHook_a2cc6c22ef588fccf3eed9bbc57fb6d6e_icgraph.md5 create mode 100644 docs/rtf/classpenify__hook_1_1file__analyzer_1_1FileAnalyzerGenHook_a2cc6c22ef588fccf3eed9bbc57fb6d6e_icgraph.svg create mode 100644 docs/rtf/classpenify__hook_1_1file__analyzer_1_1FileAnalyzerGenHook_a4f4dffbc432fac3e259d957dd1e187f1_cgraph.md5 create mode 100644 docs/rtf/classpenify__hook_1_1file__analyzer_1_1FileAnalyzerGenHook_a4f4dffbc432fac3e259d957dd1e187f1_cgraph.svg create mode 100644 docs/rtf/classpenify__hook_1_1file__analyzer_1_1FileAnalyzerGenHook_a6ab39391dfb7686f2a2d21a702dd3073_cgraph.md5 create mode 100644 docs/rtf/classpenify__hook_1_1file__analyzer_1_1FileAnalyzerGenHook_a6ab39391dfb7686f2a2d21a702dd3073_cgraph.svg create mode 100644 docs/rtf/classpenify__hook_1_1folder__analyzer_1_1FolderAnalyzerGenHook__coll__graph.md5 create mode 100644 docs/rtf/classpenify__hook_1_1folder__analyzer_1_1FolderAnalyzerGenHook__coll__graph.svg create mode 100644 docs/rtf/classpenify__hook_1_1folder__analyzer_1_1FolderAnalyzerGenHook__inherit__graph.md5 create mode 100644 docs/rtf/classpenify__hook_1_1folder__analyzer_1_1FolderAnalyzerGenHook__inherit__graph.svg create mode 100644 docs/rtf/classpenify__hook_1_1folder__analyzer_1_1FolderAnalyzerGenHook_a70b845318fc7ac3b607daf26378e19ec_icgraph.md5 create mode 100644 docs/rtf/classpenify__hook_1_1folder__analyzer_1_1FolderAnalyzerGenHook_a70b845318fc7ac3b607daf26378e19ec_icgraph.svg create mode 100644 docs/rtf/classpenify__hook_1_1folder__analyzer_1_1FolderAnalyzerGenHook_afd189d1b8c773bf710a899eb21fd76cc_cgraph.md5 create mode 100644 docs/rtf/classpenify__hook_1_1folder__analyzer_1_1FolderAnalyzerGenHook_afd189d1b8c773bf710a899eb21fd76cc_cgraph.svg create mode 100644 docs/rtf/classpenify__hook_1_1git__analyzer_1_1GitDocGenHook__coll__graph.md5 create mode 100644 docs/rtf/classpenify__hook_1_1git__analyzer_1_1GitDocGenHook__coll__graph.svg create mode 100644 docs/rtf/classpenify__hook_1_1git__analyzer_1_1GitDocGenHook__inherit__graph.md5 create mode 100644 docs/rtf/classpenify__hook_1_1git__analyzer_1_1GitDocGenHook__inherit__graph.svg create mode 100644 docs/rtf/classpenify__hook_1_1git__analyzer_1_1GitDocGenHook_a05313caa22b173ce75638f0db08eeb85_cgraph.md5 create mode 100644 docs/rtf/classpenify__hook_1_1git__analyzer_1_1GitDocGenHook_a05313caa22b173ce75638f0db08eeb85_cgraph.svg create mode 100644 docs/rtf/classpenify__hook_1_1git__analyzer_1_1GitDocGenHook_a05313caa22b173ce75638f0db08eeb85_icgraph.md5 create mode 100644 docs/rtf/classpenify__hook_1_1git__analyzer_1_1GitDocGenHook_a05313caa22b173ce75638f0db08eeb85_icgraph.svg create mode 100644 docs/rtf/classpenify__hook_1_1git__analyzer_1_1GitDocGenHook_a17549766100e91eb94b5f1a1d34bf481_icgraph.md5 create mode 100644 docs/rtf/classpenify__hook_1_1git__analyzer_1_1GitDocGenHook_a17549766100e91eb94b5f1a1d34bf481_icgraph.svg create mode 100644 docs/rtf/classpenify__hook_1_1git__analyzer_1_1GitDocGenHook_a3beba14e92d717391a74bb70b1fab0ae_cgraph.md5 create mode 100644 docs/rtf/classpenify__hook_1_1git__analyzer_1_1GitDocGenHook_a3beba14e92d717391a74bb70b1fab0ae_cgraph.svg create mode 100644 docs/rtf/classpenify__hook_1_1git__analyzer_1_1GitDocGenHook_a92275fddb43dbef6dfdb6c1ed6e96d0c_cgraph.md5 create mode 100644 docs/rtf/classpenify__hook_1_1git__analyzer_1_1GitDocGenHook_a92275fddb43dbef6dfdb6c1ed6e96d0c_cgraph.svg create mode 100644 docs/rtf/classpenify__hook_1_1git__analyzer_1_1GitDocGenHook_a92275fddb43dbef6dfdb6c1ed6e96d0c_icgraph.md5 create mode 100644 docs/rtf/classpenify__hook_1_1git__analyzer_1_1GitDocGenHook_a92275fddb43dbef6dfdb6c1ed6e96d0c_icgraph.svg create mode 100644 docs/rtf/classpenify__hook_1_1git__analyzer_1_1GitDocGenHook_a974d2f51315ed6a1965a7fd7e2ced0cd_icgraph.md5 create mode 100644 docs/rtf/classpenify__hook_1_1git__analyzer_1_1GitDocGenHook_a974d2f51315ed6a1965a7fd7e2ced0cd_icgraph.svg create mode 100644 docs/rtf/classpenify__hook_1_1jira__client_1_1JiraClient__coll__graph.md5 create mode 100644 docs/rtf/classpenify__hook_1_1jira__client_1_1JiraClient__coll__graph.svg create mode 100644 docs/rtf/classpenify__hook_1_1jira__client_1_1JiraClient_a00d0f9ae006313a21576362d26ac5ec8_icgraph.md5 create mode 100644 docs/rtf/classpenify__hook_1_1jira__client_1_1JiraClient_a00d0f9ae006313a21576362d26ac5ec8_icgraph.svg create mode 100644 docs/rtf/classpenify__hook_1_1jira__client_1_1JiraClient_a093d6456fe053ef7a7862d5d6851910c_cgraph.md5 create mode 100644 docs/rtf/classpenify__hook_1_1jira__client_1_1JiraClient_a093d6456fe053ef7a7862d5d6851910c_cgraph.svg create mode 100644 docs/rtf/classpenify__hook_1_1jira__client_1_1JiraClient_a49ea1149758f7f5212149d357b13cc23_cgraph.md5 create mode 100644 docs/rtf/classpenify__hook_1_1jira__client_1_1JiraClient_a49ea1149758f7f5212149d357b13cc23_cgraph.svg create mode 100644 docs/rtf/classpenify__hook_1_1jira__client_1_1JiraClient_a49ea1149758f7f5212149d357b13cc23_icgraph.md5 create mode 100644 docs/rtf/classpenify__hook_1_1jira__client_1_1JiraClient_a49ea1149758f7f5212149d357b13cc23_icgraph.svg create mode 100644 docs/rtf/classpenify__hook_1_1jira__client_1_1JiraClient_a65f6924819084b7c8d268956a784804a_cgraph.md5 create mode 100644 docs/rtf/classpenify__hook_1_1jira__client_1_1JiraClient_a65f6924819084b7c8d268956a784804a_cgraph.svg create mode 100644 docs/rtf/classpenify__hook_1_1jira__client_1_1JiraClient_a65f6924819084b7c8d268956a784804a_icgraph.md5 create mode 100644 docs/rtf/classpenify__hook_1_1jira__client_1_1JiraClient_a65f6924819084b7c8d268956a784804a_icgraph.svg create mode 100644 docs/rtf/classpenify__hook_1_1jira__client_1_1JiraClient_a70d2c5a6432aa6f238da0ff65d49a760_cgraph.md5 create mode 100644 docs/rtf/classpenify__hook_1_1jira__client_1_1JiraClient_a70d2c5a6432aa6f238da0ff65d49a760_cgraph.svg create mode 100644 docs/rtf/classpenify__hook_1_1jira__client_1_1JiraClient_aa1f374116c64cd5f1492ec7f7e40f9c1_cgraph.md5 create mode 100644 docs/rtf/classpenify__hook_1_1jira__client_1_1JiraClient_aa1f374116c64cd5f1492ec7f7e40f9c1_cgraph.svg create mode 100644 docs/rtf/classpenify__hook_1_1jira__client_1_1JiraClient_aa1f374116c64cd5f1492ec7f7e40f9c1_icgraph.md5 create mode 100644 docs/rtf/classpenify__hook_1_1jira__client_1_1JiraClient_aa1f374116c64cd5f1492ec7f7e40f9c1_icgraph.svg create mode 100644 docs/rtf/classpenify__hook_1_1jira__client_1_1JiraClient_aa967169a4b7970c67c0947b9ac56f746_cgraph.md5 create mode 100644 docs/rtf/classpenify__hook_1_1jira__client_1_1JiraClient_aa967169a4b7970c67c0947b9ac56f746_cgraph.svg create mode 100644 docs/rtf/classpenify__hook_1_1jira__client_1_1JiraClient_aa967169a4b7970c67c0947b9ac56f746_icgraph.md5 create mode 100644 docs/rtf/classpenify__hook_1_1jira__client_1_1JiraClient_aa967169a4b7970c67c0947b9ac56f746_icgraph.svg create mode 100644 docs/rtf/classpenify__hook_1_1jira__client_1_1JiraClient_aca8837552d37bfd611de23441a240826_cgraph.md5 create mode 100644 docs/rtf/classpenify__hook_1_1jira__client_1_1JiraClient_aca8837552d37bfd611de23441a240826_cgraph.svg create mode 100644 docs/rtf/classpenify__hook_1_1jira__client_1_1JiraClient_ad2823ad1d3baaedd38039913c3a97fd7_icgraph.md5 create mode 100644 docs/rtf/classpenify__hook_1_1jira__client_1_1JiraClient_ad2823ad1d3baaedd38039913c3a97fd7_icgraph.svg create mode 100644 docs/rtf/classpenify__hook_1_1jira__client_1_1JiraClient_afb41ce6f13c30b1265d439ddf04bf2cd_cgraph.md5 create mode 100644 docs/rtf/classpenify__hook_1_1jira__client_1_1JiraClient_afb41ce6f13c30b1265d439ddf04bf2cd_cgraph.svg create mode 100644 docs/rtf/classpenify__hook_1_1jira__client_1_1JiraClient_afb41ce6f13c30b1265d439ddf04bf2cd_icgraph.md5 create mode 100644 docs/rtf/classpenify__hook_1_1jira__client_1_1JiraClient_afb41ce6f13c30b1265d439ddf04bf2cd_icgraph.svg create mode 100644 docs/rtf/classpenify__hook_1_1llm__client_1_1LLMClient__coll__graph.md5 create mode 100644 docs/rtf/classpenify__hook_1_1llm__client_1_1LLMClient__coll__graph.svg create mode 100644 docs/rtf/classpenify__hook_1_1llm__client_1_1LLMClient_a2ad3014dac466ee1d8e00306d0cf2000_cgraph.md5 create mode 100644 docs/rtf/classpenify__hook_1_1llm__client_1_1LLMClient_a2ad3014dac466ee1d8e00306d0cf2000_cgraph.svg create mode 100644 docs/rtf/classpenify__hook_1_1llm__client_1_1LLMClient_a2ad3014dac466ee1d8e00306d0cf2000_icgraph.md5 create mode 100644 docs/rtf/classpenify__hook_1_1llm__client_1_1LLMClient_a2ad3014dac466ee1d8e00306d0cf2000_icgraph.svg create mode 100644 docs/rtf/classpenify__hook_1_1llm__client_1_1LLMClient_ad6f06658ca922793f879474f2234518e_icgraph.md5 create mode 100644 docs/rtf/classpenify__hook_1_1llm__client_1_1LLMClient_ad6f06658ca922793f879474f2234518e_icgraph.svg create mode 100644 docs/rtf/classpenify__hook_1_1utils_1_1GitRepoNotFoundError__coll__graph.md5 create mode 100644 docs/rtf/classpenify__hook_1_1utils_1_1GitRepoNotFoundError__coll__graph.svg create mode 100644 docs/rtf/classpenify__hook_1_1utils_1_1GitRepoNotFoundError__inherit__graph.md5 create mode 100644 docs/rtf/classpenify__hook_1_1utils_1_1GitRepoNotFoundError__inherit__graph.svg create mode 100644 docs/rtf/classtests_1_1test__commit__commands_1_1TestCommitCommands__coll__graph.md5 create mode 100644 docs/rtf/classtests_1_1test__commit__commands_1_1TestCommitCommands__coll__graph.svg create mode 100644 docs/rtf/classtests_1_1test__commit__commands_1_1TestCommitCommands_a43c2ff3707124aa48e8eb581106b8691_cgraph.md5 create mode 100644 docs/rtf/classtests_1_1test__commit__commands_1_1TestCommitCommands_a43c2ff3707124aa48e8eb581106b8691_cgraph.svg create mode 100644 docs/rtf/classtests_1_1test__commit__commands_1_1TestCommitCommands_a4d04b125e102190a768f65f1948f15bc_cgraph.md5 create mode 100644 docs/rtf/classtests_1_1test__commit__commands_1_1TestCommitCommands_a4d04b125e102190a768f65f1948f15bc_cgraph.svg create mode 100644 docs/rtf/classtests_1_1test__commit__commands_1_1TestCommitCommands_ac13e368262340af98b30fd8ebdac6597_cgraph.md5 create mode 100644 docs/rtf/classtests_1_1test__commit__commands_1_1TestCommitCommands_ac13e368262340af98b30fd8ebdac6597_cgraph.svg create mode 100644 docs/rtf/classtests_1_1test__commit__commands_1_1TestCommitCommands_acc4b1e4189792a3f7c11d2a745f479c0_cgraph.md5 create mode 100644 docs/rtf/classtests_1_1test__commit__commands_1_1TestCommitCommands_acc4b1e4189792a3f7c11d2a745f479c0_cgraph.svg create mode 100644 docs/rtf/classtests_1_1test__commit__commands_1_1TestCommitCommands_acea0d934ee0f2b914b0b893736e8fe4e_cgraph.md5 create mode 100644 docs/rtf/classtests_1_1test__commit__commands_1_1TestCommitCommands_acea0d934ee0f2b914b0b893736e8fe4e_cgraph.svg create mode 100644 docs/rtf/classtests_1_1test__commit__commands_1_1TestCommitCommands_af9c09013055ec39ddde86b487aefcf8b_cgraph.md5 create mode 100644 docs/rtf/classtests_1_1test__commit__commands_1_1TestCommitCommands_af9c09013055ec39ddde86b487aefcf8b_cgraph.svg create mode 100644 docs/rtf/classtests_1_1test__config__commands_1_1TestConfigCommands__coll__graph.md5 create mode 100644 docs/rtf/classtests_1_1test__config__commands_1_1TestConfigCommands__coll__graph.svg create mode 100644 docs/rtf/classtests_1_1test__config__commands_1_1TestConfigCommands_a2e8162082bcdd5652bb37bdb14cf453a_cgraph.md5 create mode 100644 docs/rtf/classtests_1_1test__config__commands_1_1TestConfigCommands_a2e8162082bcdd5652bb37bdb14cf453a_cgraph.svg create mode 100644 docs/rtf/classtests_1_1test__config__commands_1_1TestConfigCommands_a3355f7d313bebaa71694387cf2bc5232_cgraph.md5 create mode 100644 docs/rtf/classtests_1_1test__config__commands_1_1TestConfigCommands_a3355f7d313bebaa71694387cf2bc5232_cgraph.svg create mode 100644 docs/rtf/classtests_1_1test__config__commands_1_1TestConfigCommands_a33d4760eee3b67e1cde3aed755ebb948_cgraph.md5 create mode 100644 docs/rtf/classtests_1_1test__config__commands_1_1TestConfigCommands_a33d4760eee3b67e1cde3aed755ebb948_cgraph.svg create mode 100644 docs/rtf/classtests_1_1test__config__commands_1_1TestConfigCommands_a400ca5d9fcdc159714e8df54920f9436_cgraph.md5 create mode 100644 docs/rtf/classtests_1_1test__config__commands_1_1TestConfigCommands_a400ca5d9fcdc159714e8df54920f9436_cgraph.svg create mode 100644 docs/rtf/classtests_1_1test__config__commands_1_1TestConfigCommands_a473984d31452b56acd6ce4011a1248bd_cgraph.md5 create mode 100644 docs/rtf/classtests_1_1test__config__commands_1_1TestConfigCommands_a473984d31452b56acd6ce4011a1248bd_cgraph.svg create mode 100644 docs/rtf/classtests_1_1test__config__commands_1_1TestConfigCommands_a6c0207be563c3de59a6d16277805114c_cgraph.md5 create mode 100644 docs/rtf/classtests_1_1test__config__commands_1_1TestConfigCommands_a6c0207be563c3de59a6d16277805114c_cgraph.svg create mode 100644 docs/rtf/classtests_1_1test__config__commands_1_1TestConfigCommands_a73a264dfb21e16003e095b79f6eab2ac_cgraph.md5 create mode 100644 docs/rtf/classtests_1_1test__config__commands_1_1TestConfigCommands_a73a264dfb21e16003e095b79f6eab2ac_cgraph.svg create mode 100644 docs/rtf/classtests_1_1test__config__commands_1_1TestConfigCommands_abd12f028b89aa9cd1152c0b9ece5d3cd_cgraph.md5 create mode 100644 docs/rtf/classtests_1_1test__config__commands_1_1TestConfigCommands_abd12f028b89aa9cd1152c0b9ece5d3cd_cgraph.svg create mode 100644 docs/rtf/classtests_1_1test__config__commands_1_1TestConfigCommands_acd8df8219441b9e9871b903a681400d9_cgraph.md5 create mode 100644 docs/rtf/classtests_1_1test__config__commands_1_1TestConfigCommands_acd8df8219441b9e9871b903a681400d9_cgraph.svg create mode 100644 docs/rtf/classtests_1_1test__config__commands_1_1TestConfigCommands_adf9f2233a3f4cc5725b9d4f05758b167_cgraph.md5 create mode 100644 docs/rtf/classtests_1_1test__config__commands_1_1TestConfigCommands_adf9f2233a3f4cc5725b9d4f05758b167_cgraph.svg create mode 100644 docs/rtf/classtests_1_1test__config__commands_1_1TestConfigCommands_aee37b97432821d19758c6325d4c74bcf_cgraph.md5 create mode 100644 docs/rtf/classtests_1_1test__config__commands_1_1TestConfigCommands_aee37b97432821d19758c6325d4c74bcf_cgraph.svg create mode 100644 docs/rtf/classtests_1_1test__config__commands_1_1TestConfigCommands_af8d62310da2d768e21770f8f01ff5375_cgraph.md5 create mode 100644 docs/rtf/classtests_1_1test__config__commands_1_1TestConfigCommands_af8d62310da2d768e21770f8f01ff5375_cgraph.svg create mode 100644 docs/rtf/classtests_1_1test__web__config_1_1TestWebConfig__coll__graph.md5 create mode 100644 docs/rtf/classtests_1_1test__web__config_1_1TestWebConfig__coll__graph.svg create mode 100644 docs/rtf/classtests_1_1test__web__config_1_1TestWebConfig_a06e600222e426b003850509cb1d3190a_cgraph.md5 create mode 100644 docs/rtf/classtests_1_1test__web__config_1_1TestWebConfig_a06e600222e426b003850509cb1d3190a_cgraph.svg create mode 100644 docs/rtf/classtests_1_1test__web__config_1_1TestWebConfig_afc6440352201d207ea8b4d26f8ccfa35_cgraph.md5 create mode 100644 docs/rtf/classtests_1_1test__web__config_1_1TestWebConfig_afc6440352201d207ea8b4d26f8ccfa35_cgraph.svg create mode 100644 docs/rtf/dir_063e2d5fe58a131099a7fe4200cca78c.rtf create mode 100644 docs/rtf/dir_063e2d5fe58a131099a7fe4200cca78c_dep.md5 create mode 100644 docs/rtf/dir_063e2d5fe58a131099a7fe4200cca78c_dep.svg create mode 100644 docs/rtf/dir_1648a057408aae8db85b8e3797335623.rtf create mode 100644 docs/rtf/dir_1648a057408aae8db85b8e3797335623_dep.md5 create mode 100644 docs/rtf/dir_1648a057408aae8db85b8e3797335623_dep.svg create mode 100644 docs/rtf/dir_624fa2a8bce97f0444ac5cca335d4e23.rtf create mode 100644 docs/rtf/dir_624fa2a8bce97f0444ac5cca335d4e23_dep.md5 create mode 100644 docs/rtf/dir_624fa2a8bce97f0444ac5cca335d4e23_dep.svg create mode 100644 docs/rtf/dir_b3b22d2ab7966b65f6b237e3231b41be.rtf create mode 100644 docs/rtf/dir_f88c3381c1861b3f7ca1f3d63cf244b5.rtf create mode 100644 docs/rtf/dir_f88c3381c1861b3f7ca1f3d63cf244b5_dep.md5 create mode 100644 docs/rtf/dir_f88c3381c1861b3f7ca1f3d63cf244b5_dep.svg create mode 100644 docs/rtf/namespacepenify__hook_1_1commands_1_1auth__commands_a78f375c58bb6f69f98675e6a9ac84655_cgraph.md5 create mode 100644 docs/rtf/namespacepenify__hook_1_1commands_1_1auth__commands_a78f375c58bb6f69f98675e6a9ac84655_cgraph.svg create mode 100644 docs/rtf/namespacepenify__hook_1_1commands_1_1auth__commands_a78f375c58bb6f69f98675e6a9ac84655_icgraph.md5 create mode 100644 docs/rtf/namespacepenify__hook_1_1commands_1_1auth__commands_a78f375c58bb6f69f98675e6a9ac84655_icgraph.svg create mode 100644 docs/rtf/namespacepenify__hook_1_1commands_1_1auth__commands_aa3956ca1749d4218ea1dc6e5b6218b24_cgraph.md5 create mode 100644 docs/rtf/namespacepenify__hook_1_1commands_1_1auth__commands_aa3956ca1749d4218ea1dc6e5b6218b24_cgraph.svg create mode 100644 docs/rtf/namespacepenify__hook_1_1commands_1_1auth__commands_aa3956ca1749d4218ea1dc6e5b6218b24_icgraph.md5 create mode 100644 docs/rtf/namespacepenify__hook_1_1commands_1_1auth__commands_aa3956ca1749d4218ea1dc6e5b6218b24_icgraph.svg create mode 100644 docs/rtf/namespacepenify__hook_1_1commands_1_1commit__commands_a62564c4e8ad59fc46d56cb0f9122a71a_cgraph.md5 create mode 100644 docs/rtf/namespacepenify__hook_1_1commands_1_1commit__commands_a62564c4e8ad59fc46d56cb0f9122a71a_cgraph.svg create mode 100644 docs/rtf/namespacepenify__hook_1_1commands_1_1commit__commands_a62564c4e8ad59fc46d56cb0f9122a71a_icgraph.md5 create mode 100644 docs/rtf/namespacepenify__hook_1_1commands_1_1commit__commands_a62564c4e8ad59fc46d56cb0f9122a71a_icgraph.svg create mode 100644 docs/rtf/namespacepenify__hook_1_1commands_1_1commit__commands_a8627583116eb78e31a4d3cdc16d2f15c_icgraph.md5 create mode 100644 docs/rtf/namespacepenify__hook_1_1commands_1_1commit__commands_a8627583116eb78e31a4d3cdc16d2f15c_icgraph.svg create mode 100644 docs/rtf/namespacepenify__hook_1_1commands_1_1commit__commands_af4f739f524c38b437e4e47673d683e23_cgraph.md5 create mode 100644 docs/rtf/namespacepenify__hook_1_1commands_1_1commit__commands_af4f739f524c38b437e4e47673d683e23_cgraph.svg create mode 100644 docs/rtf/namespacepenify__hook_1_1commands_1_1commit__commands_af4f739f524c38b437e4e47673d683e23_icgraph.md5 create mode 100644 docs/rtf/namespacepenify__hook_1_1commands_1_1commit__commands_af4f739f524c38b437e4e47673d683e23_icgraph.svg create mode 100644 docs/rtf/namespacepenify__hook_1_1commands_1_1config__commands_a15bf3685c4dcb5c15ba6a4055e484cf2_cgraph.md5 create mode 100644 docs/rtf/namespacepenify__hook_1_1commands_1_1config__commands_a15bf3685c4dcb5c15ba6a4055e484cf2_cgraph.svg create mode 100644 docs/rtf/namespacepenify__hook_1_1commands_1_1config__commands_a15bf3685c4dcb5c15ba6a4055e484cf2_icgraph.md5 create mode 100644 docs/rtf/namespacepenify__hook_1_1commands_1_1config__commands_a15bf3685c4dcb5c15ba6a4055e484cf2_icgraph.svg create mode 100644 docs/rtf/namespacepenify__hook_1_1commands_1_1config__commands_a185dfc34a655ed80e6c95939b6f3c35c_icgraph.md5 create mode 100644 docs/rtf/namespacepenify__hook_1_1commands_1_1config__commands_a185dfc34a655ed80e6c95939b6f3c35c_icgraph.svg create mode 100644 docs/rtf/namespacepenify__hook_1_1commands_1_1config__commands_a3caf2b062dd33b1f1d7ddc7224f0ff87_icgraph.md5 create mode 100644 docs/rtf/namespacepenify__hook_1_1commands_1_1config__commands_a3caf2b062dd33b1f1d7ddc7224f0ff87_icgraph.svg create mode 100644 docs/rtf/namespacepenify__hook_1_1commands_1_1config__commands_a4617bc5956e502c9555dc0dda0376df4_cgraph.md5 create mode 100644 docs/rtf/namespacepenify__hook_1_1commands_1_1config__commands_a4617bc5956e502c9555dc0dda0376df4_cgraph.svg create mode 100644 docs/rtf/namespacepenify__hook_1_1commands_1_1config__commands_a4617bc5956e502c9555dc0dda0376df4_icgraph.md5 create mode 100644 docs/rtf/namespacepenify__hook_1_1commands_1_1config__commands_a4617bc5956e502c9555dc0dda0376df4_icgraph.svg create mode 100644 docs/rtf/namespacepenify__hook_1_1commands_1_1config__commands_a5503d51c905e2f1b299b12d2a73bd812_cgraph.md5 create mode 100644 docs/rtf/namespacepenify__hook_1_1commands_1_1config__commands_a5503d51c905e2f1b299b12d2a73bd812_cgraph.svg create mode 100644 docs/rtf/namespacepenify__hook_1_1commands_1_1config__commands_a5503d51c905e2f1b299b12d2a73bd812_icgraph.md5 create mode 100644 docs/rtf/namespacepenify__hook_1_1commands_1_1config__commands_a5503d51c905e2f1b299b12d2a73bd812_icgraph.svg create mode 100644 docs/rtf/namespacepenify__hook_1_1commands_1_1config__commands_a6492bc8e7df6e38bb06ad05e572d4cc0_cgraph.md5 create mode 100644 docs/rtf/namespacepenify__hook_1_1commands_1_1config__commands_a6492bc8e7df6e38bb06ad05e572d4cc0_cgraph.svg create mode 100644 docs/rtf/namespacepenify__hook_1_1commands_1_1config__commands_a6492bc8e7df6e38bb06ad05e572d4cc0_icgraph.md5 create mode 100644 docs/rtf/namespacepenify__hook_1_1commands_1_1config__commands_a6492bc8e7df6e38bb06ad05e572d4cc0_icgraph.svg create mode 100644 docs/rtf/namespacepenify__hook_1_1commands_1_1config__commands_a6559a82d0bf727703d550d1003d3ed20_cgraph.md5 create mode 100644 docs/rtf/namespacepenify__hook_1_1commands_1_1config__commands_a6559a82d0bf727703d550d1003d3ed20_cgraph.svg create mode 100644 docs/rtf/namespacepenify__hook_1_1commands_1_1config__commands_a6559a82d0bf727703d550d1003d3ed20_icgraph.md5 create mode 100644 docs/rtf/namespacepenify__hook_1_1commands_1_1config__commands_a6559a82d0bf727703d550d1003d3ed20_icgraph.svg create mode 100644 docs/rtf/namespacepenify__hook_1_1commands_1_1config__commands_aabe277132ce0bc0aacef951cf1dee2ae_cgraph.md5 create mode 100644 docs/rtf/namespacepenify__hook_1_1commands_1_1config__commands_aabe277132ce0bc0aacef951cf1dee2ae_cgraph.svg create mode 100644 docs/rtf/namespacepenify__hook_1_1commands_1_1config__commands_aabe277132ce0bc0aacef951cf1dee2ae_icgraph.md5 create mode 100644 docs/rtf/namespacepenify__hook_1_1commands_1_1config__commands_aabe277132ce0bc0aacef951cf1dee2ae_icgraph.svg create mode 100644 docs/rtf/namespacepenify__hook_1_1commands_1_1config__commands_ab2486ac2bf16b4a671e49625bfa4f9b4_cgraph.md5 create mode 100644 docs/rtf/namespacepenify__hook_1_1commands_1_1config__commands_ab2486ac2bf16b4a671e49625bfa4f9b4_cgraph.svg create mode 100644 docs/rtf/namespacepenify__hook_1_1commands_1_1config__commands_ab2486ac2bf16b4a671e49625bfa4f9b4_icgraph.md5 create mode 100644 docs/rtf/namespacepenify__hook_1_1commands_1_1config__commands_ab2486ac2bf16b4a671e49625bfa4f9b4_icgraph.svg create mode 100644 docs/rtf/namespacepenify__hook_1_1commands_1_1config__commands_af115198ea5d6808ccb98733957f50b06_cgraph.md5 create mode 100644 docs/rtf/namespacepenify__hook_1_1commands_1_1config__commands_af115198ea5d6808ccb98733957f50b06_cgraph.svg create mode 100644 docs/rtf/namespacepenify__hook_1_1commands_1_1config__commands_af115198ea5d6808ccb98733957f50b06_icgraph.md5 create mode 100644 docs/rtf/namespacepenify__hook_1_1commands_1_1config__commands_af115198ea5d6808ccb98733957f50b06_icgraph.svg create mode 100644 docs/rtf/namespacepenify__hook_1_1commands_1_1doc__commands_a2006ab13bff718ef783868a910c0b704_cgraph.md5 create mode 100644 docs/rtf/namespacepenify__hook_1_1commands_1_1doc__commands_a2006ab13bff718ef783868a910c0b704_cgraph.svg create mode 100644 docs/rtf/namespacepenify__hook_1_1commands_1_1doc__commands_a2006ab13bff718ef783868a910c0b704_icgraph.md5 create mode 100644 docs/rtf/namespacepenify__hook_1_1commands_1_1doc__commands_a2006ab13bff718ef783868a910c0b704_icgraph.svg create mode 100644 docs/rtf/namespacepenify__hook_1_1commands_1_1doc__commands_a4daac68bc563432bf25c85dc78081a25_icgraph.md5 create mode 100644 docs/rtf/namespacepenify__hook_1_1commands_1_1doc__commands_a4daac68bc563432bf25c85dc78081a25_icgraph.svg create mode 100644 docs/rtf/namespacepenify__hook_1_1commands_1_1doc__commands_acc7f4ead1b11951d885fa5c151c2cbe0_icgraph.md5 create mode 100644 docs/rtf/namespacepenify__hook_1_1commands_1_1doc__commands_acc7f4ead1b11951d885fa5c151c2cbe0_icgraph.svg create mode 100644 docs/rtf/namespacepenify__hook_1_1commands_1_1hook__commands_a81543eb5fa835fd1237f24e8bce6201d_icgraph.md5 create mode 100644 docs/rtf/namespacepenify__hook_1_1commands_1_1hook__commands_a81543eb5fa835fd1237f24e8bce6201d_icgraph.svg create mode 100644 docs/rtf/namespacepenify__hook_1_1commands_1_1hook__commands_adff8f5d3bf1c3795974a391ee95b72b2_icgraph.md5 create mode 100644 docs/rtf/namespacepenify__hook_1_1commands_1_1hook__commands_adff8f5d3bf1c3795974a391ee95b72b2_icgraph.svg create mode 100644 docs/rtf/namespacepenify__hook_1_1config__command_a240e5331681eb574ac319d7458783bde_cgraph.md5 create mode 100644 docs/rtf/namespacepenify__hook_1_1config__command_a240e5331681eb574ac319d7458783bde_cgraph.svg create mode 100644 docs/rtf/namespacepenify__hook_1_1config__command_a240e5331681eb574ac319d7458783bde_icgraph.md5 create mode 100644 docs/rtf/namespacepenify__hook_1_1config__command_a240e5331681eb574ac319d7458783bde_icgraph.svg create mode 100644 docs/rtf/namespacepenify__hook_1_1config__command_a4f3eb92164a69df1446d745f8a09285e_icgraph.md5 create mode 100644 docs/rtf/namespacepenify__hook_1_1config__command_a4f3eb92164a69df1446d745f8a09285e_icgraph.svg create mode 100644 docs/rtf/namespacepenify__hook_1_1login__command_aae63db4c484797bead34b7d874020c6a_icgraph.md5 create mode 100644 docs/rtf/namespacepenify__hook_1_1login__command_aae63db4c484797bead34b7d874020c6a_icgraph.svg create mode 100644 docs/rtf/namespacepenify__hook_1_1login__command_ae4bf932fbafeff834b0a0c5a37f74ccd_cgraph.md5 create mode 100644 docs/rtf/namespacepenify__hook_1_1login__command_ae4bf932fbafeff834b0a0c5a37f74ccd_cgraph.svg create mode 100644 docs/rtf/namespacepenify__hook_1_1login__command_ae4bf932fbafeff834b0a0c5a37f74ccd_icgraph.md5 create mode 100644 docs/rtf/namespacepenify__hook_1_1login__command_ae4bf932fbafeff834b0a0c5a37f74ccd_icgraph.svg create mode 100644 docs/rtf/namespacepenify__hook_1_1main_a16838b20df4bd14ee4b5e1dd2906738f_cgraph.md5 create mode 100644 docs/rtf/namespacepenify__hook_1_1main_a16838b20df4bd14ee4b5e1dd2906738f_cgraph.svg create mode 100644 docs/rtf/namespacepenify__hook_1_1main_a16838b20df4bd14ee4b5e1dd2906738f_icgraph.md5 create mode 100644 docs/rtf/namespacepenify__hook_1_1main_a16838b20df4bd14ee4b5e1dd2906738f_icgraph.svg create mode 100644 docs/rtf/namespacepenify__hook_1_1ui__utils_a0a6fd2613c6fe053b6e4356cd9e5cda2_icgraph.md5 create mode 100644 docs/rtf/namespacepenify__hook_1_1ui__utils_a0a6fd2613c6fe053b6e4356cd9e5cda2_icgraph.svg create mode 100644 docs/rtf/namespacepenify__hook_1_1ui__utils_a12b92532b1458af94f3649d411b5505c_cgraph.md5 create mode 100644 docs/rtf/namespacepenify__hook_1_1ui__utils_a12b92532b1458af94f3649d411b5505c_cgraph.svg create mode 100644 docs/rtf/namespacepenify__hook_1_1ui__utils_a12b92532b1458af94f3649d411b5505c_icgraph.md5 create mode 100644 docs/rtf/namespacepenify__hook_1_1ui__utils_a12b92532b1458af94f3649d411b5505c_icgraph.svg create mode 100644 docs/rtf/namespacepenify__hook_1_1ui__utils_a1ffbb9671dbe233770268e2dd66a67fa_cgraph.md5 create mode 100644 docs/rtf/namespacepenify__hook_1_1ui__utils_a1ffbb9671dbe233770268e2dd66a67fa_cgraph.svg create mode 100644 docs/rtf/namespacepenify__hook_1_1ui__utils_a1ffbb9671dbe233770268e2dd66a67fa_icgraph.md5 create mode 100644 docs/rtf/namespacepenify__hook_1_1ui__utils_a1ffbb9671dbe233770268e2dd66a67fa_icgraph.svg create mode 100644 docs/rtf/namespacepenify__hook_1_1ui__utils_a2b16aa6b68a9edea5f29f84f1c4be79a_cgraph.md5 create mode 100644 docs/rtf/namespacepenify__hook_1_1ui__utils_a2b16aa6b68a9edea5f29f84f1c4be79a_cgraph.svg create mode 100644 docs/rtf/namespacepenify__hook_1_1ui__utils_a2b16aa6b68a9edea5f29f84f1c4be79a_icgraph.md5 create mode 100644 docs/rtf/namespacepenify__hook_1_1ui__utils_a2b16aa6b68a9edea5f29f84f1c4be79a_icgraph.svg create mode 100644 docs/rtf/namespacepenify__hook_1_1ui__utils_a3da02cd1140179a9ce60f62c85fccfef_cgraph.md5 create mode 100644 docs/rtf/namespacepenify__hook_1_1ui__utils_a3da02cd1140179a9ce60f62c85fccfef_cgraph.svg create mode 100644 docs/rtf/namespacepenify__hook_1_1ui__utils_a3da02cd1140179a9ce60f62c85fccfef_icgraph.md5 create mode 100644 docs/rtf/namespacepenify__hook_1_1ui__utils_a3da02cd1140179a9ce60f62c85fccfef_icgraph.svg create mode 100644 docs/rtf/namespacepenify__hook_1_1ui__utils_a4dd934568897433fa73f9cc182ac4a3e_icgraph.md5 create mode 100644 docs/rtf/namespacepenify__hook_1_1ui__utils_a4dd934568897433fa73f9cc182ac4a3e_icgraph.svg create mode 100644 docs/rtf/namespacepenify__hook_1_1ui__utils_a532cdb4de7c679ce8b29c3e9116c4776_icgraph.md5 create mode 100644 docs/rtf/namespacepenify__hook_1_1ui__utils_a532cdb4de7c679ce8b29c3e9116c4776_icgraph.svg create mode 100644 docs/rtf/namespacepenify__hook_1_1ui__utils_a5a7340d0fc60fb80f17514d60bf45f1d_icgraph.md5 create mode 100644 docs/rtf/namespacepenify__hook_1_1ui__utils_a5a7340d0fc60fb80f17514d60bf45f1d_icgraph.svg create mode 100644 docs/rtf/namespacepenify__hook_1_1ui__utils_a6f0acd7dd91abfe67d0807803bc3b65f_cgraph.md5 create mode 100644 docs/rtf/namespacepenify__hook_1_1ui__utils_a6f0acd7dd91abfe67d0807803bc3b65f_cgraph.svg create mode 100644 docs/rtf/namespacepenify__hook_1_1ui__utils_a6f0acd7dd91abfe67d0807803bc3b65f_icgraph.md5 create mode 100644 docs/rtf/namespacepenify__hook_1_1ui__utils_a6f0acd7dd91abfe67d0807803bc3b65f_icgraph.svg create mode 100644 docs/rtf/namespacepenify__hook_1_1ui__utils_a811f0adf6e9bf71510c379b6fa155e44_cgraph.md5 create mode 100644 docs/rtf/namespacepenify__hook_1_1ui__utils_a811f0adf6e9bf71510c379b6fa155e44_cgraph.svg create mode 100644 docs/rtf/namespacepenify__hook_1_1ui__utils_a811f0adf6e9bf71510c379b6fa155e44_icgraph.md5 create mode 100644 docs/rtf/namespacepenify__hook_1_1ui__utils_a811f0adf6e9bf71510c379b6fa155e44_icgraph.svg create mode 100644 docs/rtf/namespacepenify__hook_1_1ui__utils_a92c3e466d1912058167be2eacf85b9f6_icgraph.md5 create mode 100644 docs/rtf/namespacepenify__hook_1_1ui__utils_a92c3e466d1912058167be2eacf85b9f6_icgraph.svg create mode 100644 docs/rtf/namespacepenify__hook_1_1ui__utils_aa6e684c00e26199440137a87ed9b195c_icgraph.md5 create mode 100644 docs/rtf/namespacepenify__hook_1_1ui__utils_aa6e684c00e26199440137a87ed9b195c_icgraph.svg create mode 100644 docs/rtf/namespacepenify__hook_1_1ui__utils_adfcbbfe39029ab6d1dd33e7bf75ae115_cgraph.md5 create mode 100644 docs/rtf/namespacepenify__hook_1_1ui__utils_adfcbbfe39029ab6d1dd33e7bf75ae115_cgraph.svg create mode 100644 docs/rtf/namespacepenify__hook_1_1ui__utils_adfcbbfe39029ab6d1dd33e7bf75ae115_icgraph.md5 create mode 100644 docs/rtf/namespacepenify__hook_1_1ui__utils_adfcbbfe39029ab6d1dd33e7bf75ae115_icgraph.svg create mode 100644 docs/rtf/namespacepenify__hook_1_1ui__utils_af3441fb3c2c3850b8b3b6455a9fdaba4_icgraph.md5 create mode 100644 docs/rtf/namespacepenify__hook_1_1ui__utils_af3441fb3c2c3850b8b3b6455a9fdaba4_icgraph.svg create mode 100644 docs/rtf/namespacepenify__hook_1_1utils_a95c3f9c80860d6a2e2d061d2fb660a3f_cgraph.md5 create mode 100644 docs/rtf/namespacepenify__hook_1_1utils_a95c3f9c80860d6a2e2d061d2fb660a3f_cgraph.svg create mode 100644 docs/rtf/namespacepenify__hook_1_1utils_a95c3f9c80860d6a2e2d061d2fb660a3f_icgraph.md5 create mode 100644 docs/rtf/namespacepenify__hook_1_1utils_a95c3f9c80860d6a2e2d061d2fb660a3f_icgraph.svg create mode 100644 docs/rtf/namespacetests_1_1test__doc__commands_a0e74c920f258f442914771164fe26b45_cgraph.md5 create mode 100644 docs/rtf/namespacetests_1_1test__doc__commands_a0e74c920f258f442914771164fe26b45_cgraph.svg create mode 100644 docs/rtf/namespacetests_1_1test__doc__commands_a0f27751d0ba2acfe40ef7e85bccf47d7_cgraph.md5 create mode 100644 docs/rtf/namespacetests_1_1test__doc__commands_a0f27751d0ba2acfe40ef7e85bccf47d7_cgraph.svg create mode 100644 docs/rtf/namespacetests_1_1test__doc__commands_a1458af9ad0128c3ca1263b552fd5e482_cgraph.md5 create mode 100644 docs/rtf/namespacetests_1_1test__doc__commands_a1458af9ad0128c3ca1263b552fd5e482_cgraph.svg create mode 100644 docs/rtf/namespacetests_1_1test__doc__commands_a335e7fd4912192c7276cf31bbebc6eb0_cgraph.md5 create mode 100644 docs/rtf/namespacetests_1_1test__doc__commands_a335e7fd4912192c7276cf31bbebc6eb0_cgraph.svg create mode 100644 docs/rtf/namespacetests_1_1test__doc__commands_a4bb75610e40d94d42bc169b25403c186_cgraph.md5 create mode 100644 docs/rtf/namespacetests_1_1test__doc__commands_a4bb75610e40d94d42bc169b25403c186_cgraph.svg create mode 100644 docs/rtf/namespacetests_1_1test__doc__commands_a64165ddfdb3071a88422f080f0e529a3_cgraph.md5 create mode 100644 docs/rtf/namespacetests_1_1test__doc__commands_a64165ddfdb3071a88422f080f0e529a3_cgraph.svg create mode 100644 docs/rtf/namespacetests_1_1test__doc__commands_a806110833eb0aad547156faf014b31d8_cgraph.md5 create mode 100644 docs/rtf/namespacetests_1_1test__doc__commands_a806110833eb0aad547156faf014b31d8_cgraph.svg create mode 100644 docs/rtf/namespacetests_1_1test__doc__commands_ab158ffa48469b6c097a7a55fcb20c21a_cgraph.md5 create mode 100644 docs/rtf/namespacetests_1_1test__doc__commands_ab158ffa48469b6c097a7a55fcb20c21a_cgraph.svg create mode 100644 docs/rtf/namespacetests_1_1test__doc__commands_ab74688baa8c9b5ba302c2877a9789d05_cgraph.md5 create mode 100644 docs/rtf/namespacetests_1_1test__doc__commands_ab74688baa8c9b5ba302c2877a9789d05_cgraph.svg create mode 100644 docs/rtf/namespacetests_1_1test__doc__commands_aec76cc25c23476794234cdadbcaef0c0_cgraph.md5 create mode 100644 docs/rtf/namespacetests_1_1test__doc__commands_aec76cc25c23476794234cdadbcaef0c0_cgraph.svg create mode 100644 docs/rtf/namespacetests_1_1test__doc__commands_af9b01e5fc89255cac96747fa081c442c_cgraph.md5 create mode 100644 docs/rtf/namespacetests_1_1test__doc__commands_af9b01e5fc89255cac96747fa081c442c_cgraph.svg create mode 100644 docs/rtf/refman.rtf create mode 100644 docs/xml/Doxyfile.xml create mode 100644 docs/xml/README_8md.xml create mode 100644 docs/xml/api__client_8py.xml create mode 100644 docs/xml/auth__commands_8py.xml create mode 100644 docs/xml/base__analyzer_8py.xml create mode 100644 docs/xml/classException.xml create mode 100644 docs/xml/classpenify__hook_1_1api__client_1_1APIClient.xml create mode 100644 docs/xml/classpenify__hook_1_1base__analyzer_1_1BaseAnalyzer.xml create mode 100644 docs/xml/classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook.xml create mode 100644 docs/xml/classpenify__hook_1_1file__analyzer_1_1FileAnalyzerGenHook.xml create mode 100644 docs/xml/classpenify__hook_1_1folder__analyzer_1_1FolderAnalyzerGenHook.xml create mode 100644 docs/xml/classpenify__hook_1_1git__analyzer_1_1GitDocGenHook.xml create mode 100644 docs/xml/classpenify__hook_1_1jira__client_1_1JiraClient.xml create mode 100644 docs/xml/classpenify__hook_1_1llm__client_1_1LLMClient.xml create mode 100644 docs/xml/classpenify__hook_1_1utils_1_1GitRepoNotFoundError.xml create mode 100644 docs/xml/classtests_1_1test__commit__commands_1_1TestCommitCommands.xml create mode 100644 docs/xml/classtests_1_1test__config__commands_1_1TestConfigCommands.xml create mode 100644 docs/xml/classtests_1_1test__web__config_1_1TestWebConfig.xml create mode 100644 docs/xml/combine.xslt create mode 100644 docs/xml/commit-commands_8md.xml create mode 100644 docs/xml/commit__analyzer_8py.xml create mode 100644 docs/xml/commit__commands_8py.xml create mode 100644 docs/xml/compound.xsd create mode 100644 docs/xml/config-commands_8md.xml create mode 100644 docs/xml/config__command_8py.xml create mode 100644 docs/xml/config__commands_8py.xml create mode 100644 docs/xml/conftest_8py.xml create mode 100644 docs/xml/constants_8py.xml create mode 100644 docs/xml/detailed-usage_8md.xml create mode 100644 docs/xml/dir_063e2d5fe58a131099a7fe4200cca78c.xml create mode 100644 docs/xml/dir_1648a057408aae8db85b8e3797335623.xml create mode 100644 docs/xml/dir_624fa2a8bce97f0444ac5cca335d4e23.xml create mode 100644 docs/xml/dir_b3b22d2ab7966b65f6b237e3231b41be.xml create mode 100644 docs/xml/dir_f88c3381c1861b3f7ca1f3d63cf244b5.xml create mode 100644 docs/xml/doc__commands_8md.xml create mode 100644 docs/xml/doc__commands_8py.xml create mode 100644 docs/xml/doxyfile.xsd create mode 100644 docs/xml/example-workflows_8md.xml create mode 100644 docs/xml/file__analyzer_8py.xml create mode 100644 docs/xml/folder__analyzer_8py.xml create mode 100644 docs/xml/git__analyzer_8py.xml create mode 100644 docs/xml/hook__commands_8py.xml create mode 100644 docs/xml/index.xml create mode 100644 docs/xml/index.xsd create mode 100644 docs/xml/jira__client_8py.xml create mode 100644 docs/xml/llm__client_8py.xml create mode 100644 docs/xml/login__command_8py.xml create mode 100644 docs/xml/main_8py.xml create mode 100644 docs/xml/md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_README.xml create mode 100644 docs/xml/md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_commit_commands.xml create mode 100644 docs/xml/md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_config_commands.xml create mode 100644 docs/xml/md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_detailed_usage.xml create mode 100644 docs/xml/md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_doc_commands.xml create mode 100644 docs/xml/md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_example_workflows.xml create mode 100644 docs/xml/namespacepenify__hook.xml create mode 100644 docs/xml/namespacepenify__hook_1_1api__client.xml create mode 100644 docs/xml/namespacepenify__hook_1_1base__analyzer.xml create mode 100644 docs/xml/namespacepenify__hook_1_1commands.xml create mode 100644 docs/xml/namespacepenify__hook_1_1commands_1_1auth__commands.xml create mode 100644 docs/xml/namespacepenify__hook_1_1commands_1_1commit__commands.xml create mode 100644 docs/xml/namespacepenify__hook_1_1commands_1_1config__commands.xml create mode 100644 docs/xml/namespacepenify__hook_1_1commands_1_1doc__commands.xml create mode 100644 docs/xml/namespacepenify__hook_1_1commands_1_1hook__commands.xml create mode 100644 docs/xml/namespacepenify__hook_1_1commit__analyzer.xml create mode 100644 docs/xml/namespacepenify__hook_1_1config__command.xml create mode 100644 docs/xml/namespacepenify__hook_1_1constants.xml create mode 100644 docs/xml/namespacepenify__hook_1_1file__analyzer.xml create mode 100644 docs/xml/namespacepenify__hook_1_1folder__analyzer.xml create mode 100644 docs/xml/namespacepenify__hook_1_1git__analyzer.xml create mode 100644 docs/xml/namespacepenify__hook_1_1jira__client.xml create mode 100644 docs/xml/namespacepenify__hook_1_1llm__client.xml create mode 100644 docs/xml/namespacepenify__hook_1_1login__command.xml create mode 100644 docs/xml/namespacepenify__hook_1_1main.xml create mode 100644 docs/xml/namespacepenify__hook_1_1ui__utils.xml create mode 100644 docs/xml/namespacepenify__hook_1_1utils.xml create mode 100644 docs/xml/namespacesetup.xml create mode 100644 docs/xml/namespacestd.xml create mode 100644 docs/xml/namespacetests.xml create mode 100644 docs/xml/namespacetests_1_1conftest.xml create mode 100644 docs/xml/namespacetests_1_1test__commit__commands.xml create mode 100644 docs/xml/namespacetests_1_1test__config__commands.xml create mode 100644 docs/xml/namespacetests_1_1test__doc__commands.xml create mode 100644 docs/xml/namespacetests_1_1test__web__config.xml create mode 100644 docs/xml/penify-cli-documentation_8md.xml create mode 100644 docs/xml/penify__hook_2____init_____8py.xml create mode 100644 docs/xml/penify__hook_2commands_2____init_____8py.xml create mode 100644 docs/xml/setup_8py.xml create mode 100644 docs/xml/test__commit__commands_8py.xml create mode 100644 docs/xml/test__config__commands_8py.xml create mode 100644 docs/xml/test__doc__commands_8py.xml create mode 100644 docs/xml/test__web__config_8py.xml create mode 100644 docs/xml/tests_2____init_____8py.xml create mode 100644 docs/xml/ui__utils_8py.xml create mode 100644 docs/xml/utils_8py.xml create mode 100644 docs/xml/xml.xsd diff --git a/docs/html/README_8md.html b/docs/html/README_8md.html new file mode 100644 index 0000000..8d1a4ce --- /dev/null +++ b/docs/html/README_8md.html @@ -0,0 +1,130 @@ + + + + + + + + + + + + + + + + + + +penify-cli: /tmp/github_reposRepoArchDocGenContext/Penify-dev/penify-cli/README.md File Reference + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
penify-cli +
+
+
+ + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
/tmp/github_reposRepoArchDocGenContext/Penify-dev/penify-cli/README.md File Reference
+
+
+
+
+ + + + + diff --git a/docs/html/annotated.html b/docs/html/annotated.html new file mode 100644 index 0000000..2516a25 --- /dev/null +++ b/docs/html/annotated.html @@ -0,0 +1,160 @@ + + + + + + + + + + + + + + + + + + +penify-cli: Class List + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
penify-cli +
+
+
+ + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
Class List
+
+
+
Here are the classes, structs, unions and interfaces with brief descriptions:
+
+
+ + + + + diff --git a/docs/html/annotated_dup.js b/docs/html/annotated_dup.js new file mode 100644 index 0000000..e374ec6 --- /dev/null +++ b/docs/html/annotated_dup.js @@ -0,0 +1,44 @@ +var annotated_dup = +[ + [ "penify_hook", "namespacepenify__hook.html", [ + [ "api_client", "namespacepenify__hook_1_1api__client.html", [ + [ "APIClient", "classpenify__hook_1_1api__client_1_1APIClient.html", "classpenify__hook_1_1api__client_1_1APIClient" ] + ] ], + [ "base_analyzer", "namespacepenify__hook_1_1base__analyzer.html", [ + [ "BaseAnalyzer", "classpenify__hook_1_1base__analyzer_1_1BaseAnalyzer.html", "classpenify__hook_1_1base__analyzer_1_1BaseAnalyzer" ] + ] ], + [ "commit_analyzer", "namespacepenify__hook_1_1commit__analyzer.html", [ + [ "CommitDocGenHook", "classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook.html", "classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook" ] + ] ], + [ "file_analyzer", "namespacepenify__hook_1_1file__analyzer.html", [ + [ "FileAnalyzerGenHook", "classpenify__hook_1_1file__analyzer_1_1FileAnalyzerGenHook.html", "classpenify__hook_1_1file__analyzer_1_1FileAnalyzerGenHook" ] + ] ], + [ "folder_analyzer", "namespacepenify__hook_1_1folder__analyzer.html", [ + [ "FolderAnalyzerGenHook", "classpenify__hook_1_1folder__analyzer_1_1FolderAnalyzerGenHook.html", "classpenify__hook_1_1folder__analyzer_1_1FolderAnalyzerGenHook" ] + ] ], + [ "git_analyzer", "namespacepenify__hook_1_1git__analyzer.html", [ + [ "GitDocGenHook", "classpenify__hook_1_1git__analyzer_1_1GitDocGenHook.html", "classpenify__hook_1_1git__analyzer_1_1GitDocGenHook" ] + ] ], + [ "jira_client", "namespacepenify__hook_1_1jira__client.html", [ + [ "JiraClient", "classpenify__hook_1_1jira__client_1_1JiraClient.html", "classpenify__hook_1_1jira__client_1_1JiraClient" ] + ] ], + [ "llm_client", "namespacepenify__hook_1_1llm__client.html", [ + [ "LLMClient", "classpenify__hook_1_1llm__client_1_1LLMClient.html", "classpenify__hook_1_1llm__client_1_1LLMClient" ] + ] ], + [ "utils", "namespacepenify__hook_1_1utils.html", [ + [ "GitRepoNotFoundError", "classpenify__hook_1_1utils_1_1GitRepoNotFoundError.html", null ] + ] ] + ] ], + [ "tests", "namespacetests.html", [ + [ "test_commit_commands", "namespacetests_1_1test__commit__commands.html", [ + [ "TestCommitCommands", "classtests_1_1test__commit__commands_1_1TestCommitCommands.html", "classtests_1_1test__commit__commands_1_1TestCommitCommands" ] + ] ], + [ "test_config_commands", "namespacetests_1_1test__config__commands.html", [ + [ "TestConfigCommands", "classtests_1_1test__config__commands_1_1TestConfigCommands.html", "classtests_1_1test__config__commands_1_1TestConfigCommands" ] + ] ], + [ "test_web_config", "namespacetests_1_1test__web__config.html", [ + [ "TestWebConfig", "classtests_1_1test__web__config_1_1TestWebConfig.html", "classtests_1_1test__web__config_1_1TestWebConfig" ] + ] ] + ] ], + [ "Exception", "classException.html", null ] +]; \ No newline at end of file diff --git a/docs/html/api__client_8py.html b/docs/html/api__client_8py.html new file mode 100644 index 0000000..aba572c --- /dev/null +++ b/docs/html/api__client_8py.html @@ -0,0 +1,146 @@ + + + + + + + + + + + + + + + + + + +penify-cli: /tmp/github_reposRepoArchDocGenContext/Penify-dev/penify-cli/penify_hook/api_client.py File Reference + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
penify-cli +
+
+
+ + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+ +
api_client.py File Reference
+
+
+ + + + +

+Classes

class  penify_hook.api_client.APIClient
 
+ + + + + +

+Namespaces

namespace  penify_hook
 
namespace  penify_hook.api_client
 
+
+
+ + + + + diff --git a/docs/html/api__client_8py.js b/docs/html/api__client_8py.js new file mode 100644 index 0000000..a3575a0 --- /dev/null +++ b/docs/html/api__client_8py.js @@ -0,0 +1,4 @@ +var api__client_8py = +[ + [ "penify_hook.api_client.APIClient", "classpenify__hook_1_1api__client_1_1APIClient.html", "classpenify__hook_1_1api__client_1_1APIClient" ] +]; \ No newline at end of file diff --git a/docs/html/auth__commands_8py.html b/docs/html/auth__commands_8py.html new file mode 100644 index 0000000..b74e967 --- /dev/null +++ b/docs/html/auth__commands_8py.html @@ -0,0 +1,150 @@ + + + + + + + + + + + + + + + + + + +penify-cli: /tmp/github_reposRepoArchDocGenContext/Penify-dev/penify-cli/penify_hook/commands/auth_commands.py File Reference + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
penify-cli +
+
+
+ + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+ +
auth_commands.py File Reference
+
+
+ + + + + + + + +

+Namespaces

namespace  penify_hook
 
namespace  penify_hook.commands
 
namespace  penify_hook.commands.auth_commands
 
+ + + + + +

+Functions

def penify_hook.commands.auth_commands.save_credentials (api_key)
 
def penify_hook.commands.auth_commands.login (api_url, dashboard_url)
 
+
+
+ + + + + diff --git a/docs/html/auth__commands_8py.js b/docs/html/auth__commands_8py.js new file mode 100644 index 0000000..3e747e3 --- /dev/null +++ b/docs/html/auth__commands_8py.js @@ -0,0 +1,5 @@ +var auth__commands_8py = +[ + [ "login", "auth__commands_8py.html#a78f375c58bb6f69f98675e6a9ac84655", null ], + [ "save_credentials", "auth__commands_8py.html#aa3956ca1749d4218ea1dc6e5b6218b24", null ] +]; \ No newline at end of file diff --git a/docs/html/base__analyzer_8py.html b/docs/html/base__analyzer_8py.html new file mode 100644 index 0000000..c6f2dbd --- /dev/null +++ b/docs/html/base__analyzer_8py.html @@ -0,0 +1,146 @@ + + + + + + + + + + + + + + + + + + +penify-cli: /tmp/github_reposRepoArchDocGenContext/Penify-dev/penify-cli/penify_hook/base_analyzer.py File Reference + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
penify-cli +
+
+
+ + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+ +
base_analyzer.py File Reference
+
+
+ + + + +

+Classes

class  penify_hook.base_analyzer.BaseAnalyzer
 
+ + + + + +

+Namespaces

namespace  penify_hook
 
namespace  penify_hook.base_analyzer
 
+
+
+ + + + + diff --git a/docs/html/base__analyzer_8py.js b/docs/html/base__analyzer_8py.js new file mode 100644 index 0000000..0d5c745 --- /dev/null +++ b/docs/html/base__analyzer_8py.js @@ -0,0 +1,4 @@ +var base__analyzer_8py = +[ + [ "penify_hook.base_analyzer.BaseAnalyzer", "classpenify__hook_1_1base__analyzer_1_1BaseAnalyzer.html", "classpenify__hook_1_1base__analyzer_1_1BaseAnalyzer" ] +]; \ No newline at end of file diff --git a/docs/html/bc_s.png b/docs/html/bc_s.png new file mode 100644 index 0000000000000000000000000000000000000000..224b29aa9847d5a4b3902efd602b7ddf7d33e6c2 GIT binary patch literal 676 zcmV;V0$crwP)y__>=_9%My z{n931IS})GlGUF8K#6VIbs%684A^L3@%PlP2>_sk`UWPq@f;rU*V%rPy_ekbhXT&s z(GN{DxFv}*vZp`F>S!r||M`I*nOwwKX+BC~3P5N3-)Y{65c;ywYiAh-1*hZcToLHK ztpl1xomJ+Yb}K(cfbJr2=GNOnT!UFA7Vy~fBz8?J>XHsbZoDad^8PxfSa0GDgENZS zuLCEqzb*xWX2CG*b&5IiO#NzrW*;`VC9455M`o1NBh+(k8~`XCEEoC1Ybwf;vr4K3 zg|EB<07?SOqHp9DhLpS&bzgo70I+ghB_#)K7H%AMU3v}xuyQq9&Bm~++VYhF09a+U zl7>n7Jjm$K#b*FONz~fj;I->Bf;ule1prFN9FovcDGBkpg>)O*-}eLnC{6oZHZ$o% zXKW$;0_{8hxHQ>l;_*HATI(`7t#^{$(zLe}h*mqwOc*nRY9=?Sx4OOeVIfI|0V(V2 zBrW#G7Ss9wvzr@>H*`r>zE z+e8bOBgqIgldUJlG(YUDviMB`9+DH8n-s9SXRLyJHO1!=wY^79WYZMTa(wiZ!zP66 zA~!21vmF3H2{ngD;+`6j#~6j;$*f*G_2ZD1E;9(yaw7d-QnSCpK(cR1zU3qU0000< KMNUMnLSTYoA~SLT literal 0 HcmV?d00001 diff --git a/docs/html/bdwn.png b/docs/html/bdwn.png new file mode 100644 index 0000000000000000000000000000000000000000..940a0b950443a0bb1b216ac03c45b8a16c955452 GIT binary patch literal 147 zcmeAS@N?(olHy`uVBq!ia0vp^>_E)H!3HEvS)PKZC{Gv1kP61Pb5HX&C2wk~_T + + + + + + + + + + + + + + + + + +penify-cli: Exception Class Reference + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
penify-cli +
+
+
+ + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
Exception Class Reference
+
+
+
+Inheritance diagram for Exception:
+
+
+
+
+
+Collaboration diagram for Exception:
+
+
+
+
+
The documentation for this class was generated from the following file:
    +
  • /tmp/github_reposRepoArchDocGenContext/Penify-dev/penify-cli/penify_hook/utils.py
  • +
+
+
+ + + + + diff --git a/docs/html/classException__coll__graph.map b/docs/html/classException__coll__graph.map new file mode 100644 index 0000000..9036a49 --- /dev/null +++ b/docs/html/classException__coll__graph.map @@ -0,0 +1,3 @@ + + + diff --git a/docs/html/classException__coll__graph.md5 b/docs/html/classException__coll__graph.md5 new file mode 100644 index 0000000..38ed226 --- /dev/null +++ b/docs/html/classException__coll__graph.md5 @@ -0,0 +1 @@ +8bfc7cbaf3c53c3b1288446104b2c7ee \ No newline at end of file diff --git a/docs/html/classException__coll__graph.svg b/docs/html/classException__coll__graph.svg new file mode 100644 index 0000000..d2d4076 --- /dev/null +++ b/docs/html/classException__coll__graph.svg @@ -0,0 +1,26 @@ + + + + + + +Exception + + + +Node1 + + +Exception + + + + + + + + + diff --git a/docs/html/classException__inherit__graph.map b/docs/html/classException__inherit__graph.map new file mode 100644 index 0000000..02cc09e --- /dev/null +++ b/docs/html/classException__inherit__graph.map @@ -0,0 +1,4 @@ + + + + diff --git a/docs/html/classException__inherit__graph.md5 b/docs/html/classException__inherit__graph.md5 new file mode 100644 index 0000000..f7c5b12 --- /dev/null +++ b/docs/html/classException__inherit__graph.md5 @@ -0,0 +1 @@ +02df0cdd064aa2dca59b7424cdd2be62 \ No newline at end of file diff --git a/docs/html/classException__inherit__graph.svg b/docs/html/classException__inherit__graph.svg new file mode 100644 index 0000000..33700b9 --- /dev/null +++ b/docs/html/classException__inherit__graph.svg @@ -0,0 +1,46 @@ + + + + + + +Exception + + + +Node1 + + +Exception + + + + + + + + + +Node2 + + +penify_hook.utils.GitRepo +NotFoundError + + + + + + + + + +Node1->Node2 + + + + + diff --git a/docs/html/classes.html b/docs/html/classes.html new file mode 100644 index 0000000..660c826 --- /dev/null +++ b/docs/html/classes.html @@ -0,0 +1,159 @@ + + + + + + + + + + + + + + + + + + +penify-cli: Class Index + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
penify-cli +
+
+
+ + + + + + +
+
+ +
+
+
+ + + + + + + diff --git a/docs/html/classpenify__hook_1_1api__client_1_1APIClient-members.html b/docs/html/classpenify__hook_1_1api__client_1_1APIClient-members.html new file mode 100644 index 0000000..ede5070 --- /dev/null +++ b/docs/html/classpenify__hook_1_1api__client_1_1APIClient-members.html @@ -0,0 +1,141 @@ + + + + + + + + + + + + + + + + + + +penify-cli: Member List + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
penify-cli +
+
+
+ + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
penify_hook.api_client.APIClient Member List
+
+
+ +

This is the complete list of members for penify_hook.api_client.APIClient, including all inherited members.

+ + + + + + + + + + +
__init__(self, api_url, str api_token=None, str bearer_token=None)penify_hook.api_client.APIClient
api_urlpenify_hook.api_client.APIClient
AUTH_TOKENpenify_hook.api_client.APIClient
BEARER_TOKENpenify_hook.api_client.APIClient
generate_commit_summary(self, git_diff, str instruction="", repo_details=None, dict jira_context=None)penify_hook.api_client.APIClient
generate_commit_summary_with_llm(self, diff, message, bool generate_description, repo_details, LLMClient llm_client, jira_context=None)penify_hook.api_client.APIClient
get_api_key(self)penify_hook.api_client.APIClient
get_supported_file_types(self)penify_hook.api_client.APIClient
send_file_for_docstring_generation(self, file_name, content, line_numbers, repo_details=None)penify_hook.api_client.APIClient
+
+ + + + + diff --git a/docs/html/classpenify__hook_1_1api__client_1_1APIClient.html b/docs/html/classpenify__hook_1_1api__client_1_1APIClient.html new file mode 100644 index 0000000..960eec6 --- /dev/null +++ b/docs/html/classpenify__hook_1_1api__client_1_1APIClient.html @@ -0,0 +1,468 @@ + + + + + + + + + + + + + + + + + + +penify-cli: penify_hook.api_client.APIClient Class Reference + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
penify-cli +
+
+
+ + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+ +
penify_hook.api_client.APIClient Class Reference
+
+
+
+Collaboration diagram for penify_hook.api_client.APIClient:
+
+
+
+
+ + + + + + + + + + + + + + +

+Public Member Functions

def __init__ (self, api_url, str api_token=None, str bearer_token=None)
 
def send_file_for_docstring_generation (self, file_name, content, line_numbers, repo_details=None)
 
def generate_commit_summary (self, git_diff, str instruction="", repo_details=None, dict jira_context=None)
 
list[str] get_supported_file_types (self)
 
def generate_commit_summary_with_llm (self, diff, message, bool generate_description, repo_details, LLMClient llm_client, jira_context=None)
 
def get_api_key (self)
 
+ + + + + + + +

+Public Attributes

 api_url
 
 AUTH_TOKEN
 
 BEARER_TOKEN
 
+

Constructor & Destructor Documentation

+ +

◆ __init__()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
def penify_hook.api_client.APIClient.__init__ ( self,
 api_url,
str  api_token = None,
str  bearer_token = None 
)
+
+ +
+
+

Member Function Documentation

+ +

◆ generate_commit_summary()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
def penify_hook.api_client.APIClient.generate_commit_summary ( self,
 git_diff,
str  instruction = "",
 repo_details = None,
dict  jira_context = None 
)
+
+
Generates a commit summary by sending a POST request to the API endpoint.
+
+This function constructs a payload containing the git diff and any additional
+instructions provided. It then sends this payload to a specified API endpoint
+to generate a summary of the commit. If the request is successful, it returns
+the response from the API; otherwise, it returns None. The function also
+handles optional repository details and JIRA context if they are provided.
+
+Args:
+    git_diff (str): The git diff of the commit.
+    instruction (str): Additional instruction for the commit. Defaults to "".
+    repo_details (dict): Details of the git repository. Defaults to None.
+    jira_context (dict): JIRA issue details to enhance the commit summary. Defaults to None.
+
+Returns:
+    dict: The response from the API if the request is successful, None otherwise.
+
+Here is the caller graph for this function:
+
+
+
+
+ +
+
+ +

◆ generate_commit_summary_with_llm()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
def penify_hook.api_client.APIClient.generate_commit_summary_with_llm ( self,
 diff,
 message,
bool generate_description,
 repo_details,
LLMClient llm_client,
 jira_context = None 
)
+
+
Generates a commit summary using a local LLM client; falls back to API on
+error.
+Here is the call graph for this function:
+
+
+
+
+ +
+
+ +

◆ get_api_key()

+ +
+
+ + + + + + + + +
def penify_hook.api_client.APIClient.get_api_key ( self)
+
+
Fetch an API key from a specified URL using a Bearer token.
+
+
+ +

◆ get_supported_file_types()

+ +
+
+ + + + + + + + +
list[str] penify_hook.api_client.APIClient.get_supported_file_types ( self)
+
+
Retrieve supported file types from the API or return a default list.
+
+
+ +

◆ send_file_for_docstring_generation()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
def penify_hook.api_client.APIClient.send_file_for_docstring_generation ( self,
 file_name,
 content,
 line_numbers,
 repo_details = None 
)
+
+
Send file content and modified lines to the API and return modified content.
+
+
+

Member Data Documentation

+ +

◆ api_url

+ +
+
+ + + + +
penify_hook.api_client.APIClient.api_url
+
+ +
+
+ +

◆ AUTH_TOKEN

+ +
+
+ + + + +
penify_hook.api_client.APIClient.AUTH_TOKEN
+
+ +
+
+ +

◆ BEARER_TOKEN

+ +
+
+ + + + +
penify_hook.api_client.APIClient.BEARER_TOKEN
+
+ +
+
+
The documentation for this class was generated from the following file:
    +
  • /tmp/github_reposRepoArchDocGenContext/Penify-dev/penify-cli/penify_hook/api_client.py
  • +
+
+
+ + + + + diff --git a/docs/html/classpenify__hook_1_1api__client_1_1APIClient.js b/docs/html/classpenify__hook_1_1api__client_1_1APIClient.js new file mode 100644 index 0000000..be81d43 --- /dev/null +++ b/docs/html/classpenify__hook_1_1api__client_1_1APIClient.js @@ -0,0 +1,12 @@ +var classpenify__hook_1_1api__client_1_1APIClient = +[ + [ "__init__", "classpenify__hook_1_1api__client_1_1APIClient.html#ad9cb741a8baf2d13f845e25a36311086", null ], + [ "generate_commit_summary", "classpenify__hook_1_1api__client_1_1APIClient.html#a7ff74798e7d428b4e2f20095287eb2ce", null ], + [ "generate_commit_summary_with_llm", "classpenify__hook_1_1api__client_1_1APIClient.html#ac0ada470b897935f9fb372cd0e7e51e3", null ], + [ "get_api_key", "classpenify__hook_1_1api__client_1_1APIClient.html#ad15b790608e703c8c122aa2ead7dfa99", null ], + [ "get_supported_file_types", "classpenify__hook_1_1api__client_1_1APIClient.html#a5d2b4a26b24352d951ea79ecc4ff3402", null ], + [ "send_file_for_docstring_generation", "classpenify__hook_1_1api__client_1_1APIClient.html#ac5aad61508c2cafdf6e88e6c7d6c82b3", null ], + [ "api_url", "classpenify__hook_1_1api__client_1_1APIClient.html#a130cf688ed35dc0e8cbd8320b6b2d872", null ], + [ "AUTH_TOKEN", "classpenify__hook_1_1api__client_1_1APIClient.html#a5bb502603717946ad710b49ad9d95237", null ], + [ "BEARER_TOKEN", "classpenify__hook_1_1api__client_1_1APIClient.html#a7d7e2cf42c54eb4f25adee96a09ee7b0", null ] +]; \ No newline at end of file diff --git a/docs/html/classpenify__hook_1_1api__client_1_1APIClient__coll__graph.map b/docs/html/classpenify__hook_1_1api__client_1_1APIClient__coll__graph.map new file mode 100644 index 0000000..05e004c --- /dev/null +++ b/docs/html/classpenify__hook_1_1api__client_1_1APIClient__coll__graph.map @@ -0,0 +1,3 @@ + + + diff --git a/docs/html/classpenify__hook_1_1api__client_1_1APIClient__coll__graph.md5 b/docs/html/classpenify__hook_1_1api__client_1_1APIClient__coll__graph.md5 new file mode 100644 index 0000000..2c7b583 --- /dev/null +++ b/docs/html/classpenify__hook_1_1api__client_1_1APIClient__coll__graph.md5 @@ -0,0 +1 @@ +92a3e9cee2cd5e4975e6a42b548f0d62 \ No newline at end of file diff --git a/docs/html/classpenify__hook_1_1api__client_1_1APIClient__coll__graph.svg b/docs/html/classpenify__hook_1_1api__client_1_1APIClient__coll__graph.svg new file mode 100644 index 0000000..fe24d95 --- /dev/null +++ b/docs/html/classpenify__hook_1_1api__client_1_1APIClient__coll__graph.svg @@ -0,0 +1,36 @@ + + + + + + +penify_hook.api_client.APIClient + + + +Node1 + + +penify_hook.api_client.APIClient + ++ api_url ++ AUTH_TOKEN ++ BEARER_TOKEN + ++ __init__() ++ send_file_for_docstring +_generation() ++ generate_commit_summary() ++ get_supported_file +_types() ++ generate_commit_summary +_with_llm() ++ get_api_key() + + + + + diff --git a/docs/html/classpenify__hook_1_1api__client_1_1APIClient_a7ff74798e7d428b4e2f20095287eb2ce_icgraph.map b/docs/html/classpenify__hook_1_1api__client_1_1APIClient_a7ff74798e7d428b4e2f20095287eb2ce_icgraph.map new file mode 100644 index 0000000..86604e3 --- /dev/null +++ b/docs/html/classpenify__hook_1_1api__client_1_1APIClient_a7ff74798e7d428b4e2f20095287eb2ce_icgraph.map @@ -0,0 +1,4 @@ + + + + diff --git a/docs/html/classpenify__hook_1_1api__client_1_1APIClient_a7ff74798e7d428b4e2f20095287eb2ce_icgraph.md5 b/docs/html/classpenify__hook_1_1api__client_1_1APIClient_a7ff74798e7d428b4e2f20095287eb2ce_icgraph.md5 new file mode 100644 index 0000000..b12cf91 --- /dev/null +++ b/docs/html/classpenify__hook_1_1api__client_1_1APIClient_a7ff74798e7d428b4e2f20095287eb2ce_icgraph.md5 @@ -0,0 +1 @@ +ea70dd7bbb840c4828c970ec1a8f5446 \ No newline at end of file diff --git a/docs/html/classpenify__hook_1_1api__client_1_1APIClient_a7ff74798e7d428b4e2f20095287eb2ce_icgraph.svg b/docs/html/classpenify__hook_1_1api__client_1_1APIClient_a7ff74798e7d428b4e2f20095287eb2ce_icgraph.svg new file mode 100644 index 0000000..b3f0027 --- /dev/null +++ b/docs/html/classpenify__hook_1_1api__client_1_1APIClient_a7ff74798e7d428b4e2f20095287eb2ce_icgraph.svg @@ -0,0 +1,39 @@ + + + + + + +penify_hook.api_client.APIClient.generate_commit_summary + + + +Node1 + + +penify_hook.api_client.APIClient.generate +_commit_summary + + + + + +Node2 + + +penify_hook.api_client.APIClient.generate +_commit_summary_with_llm + + + + + +Node1->Node2 + + + + + diff --git a/docs/html/classpenify__hook_1_1api__client_1_1APIClient_ac0ada470b897935f9fb372cd0e7e51e3_cgraph.map b/docs/html/classpenify__hook_1_1api__client_1_1APIClient_ac0ada470b897935f9fb372cd0e7e51e3_cgraph.map new file mode 100644 index 0000000..fa6ff5d --- /dev/null +++ b/docs/html/classpenify__hook_1_1api__client_1_1APIClient_ac0ada470b897935f9fb372cd0e7e51e3_cgraph.map @@ -0,0 +1,6 @@ + + + + + + diff --git a/docs/html/classpenify__hook_1_1api__client_1_1APIClient_ac0ada470b897935f9fb372cd0e7e51e3_cgraph.md5 b/docs/html/classpenify__hook_1_1api__client_1_1APIClient_ac0ada470b897935f9fb372cd0e7e51e3_cgraph.md5 new file mode 100644 index 0000000..186981a --- /dev/null +++ b/docs/html/classpenify__hook_1_1api__client_1_1APIClient_ac0ada470b897935f9fb372cd0e7e51e3_cgraph.md5 @@ -0,0 +1 @@ +6b1ca4842de706fb2f00719bcb509a8b \ No newline at end of file diff --git a/docs/html/classpenify__hook_1_1api__client_1_1APIClient_ac0ada470b897935f9fb372cd0e7e51e3_cgraph.svg b/docs/html/classpenify__hook_1_1api__client_1_1APIClient_ac0ada470b897935f9fb372cd0e7e51e3_cgraph.svg new file mode 100644 index 0000000..7970d85 --- /dev/null +++ b/docs/html/classpenify__hook_1_1api__client_1_1APIClient_ac0ada470b897935f9fb372cd0e7e51e3_cgraph.svg @@ -0,0 +1,158 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +penify_hook.api_client.APIClient.generate_commit_summary_with_llm + + + +Node1 + + +penify_hook.api_client.APIClient.generate +_commit_summary_with_llm + + + + + +Node2 + + +penify_hook.api_client.APIClient.generate +_commit_summary + + + + + +Node1->Node2 + + + + + +Node3 + + +penify_hook.llm_client.LLMClient.generate +_commit_summary + + + + + +Node1->Node3 + + + + + +Node4 + + +penify_hook.llm_client.LLMClient.litellm + + + + + +Node3->Node4 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/html/classpenify__hook_1_1api__client_1_1APIClient_ac0ada470b897935f9fb372cd0e7e51e3_cgraph_org.svg b/docs/html/classpenify__hook_1_1api__client_1_1APIClient_ac0ada470b897935f9fb372cd0e7e51e3_cgraph_org.svg new file mode 100644 index 0000000..8567a2c --- /dev/null +++ b/docs/html/classpenify__hook_1_1api__client_1_1APIClient_ac0ada470b897935f9fb372cd0e7e51e3_cgraph_org.svg @@ -0,0 +1,70 @@ + + + + + + +penify_hook.api_client.APIClient.generate_commit_summary_with_llm + + + +Node1 + + +penify_hook.api_client.APIClient.generate +_commit_summary_with_llm + + + + + +Node2 + + +penify_hook.api_client.APIClient.generate +_commit_summary + + + + + +Node1->Node2 + + + + + +Node3 + + +penify_hook.llm_client.LLMClient.generate +_commit_summary + + + + + +Node1->Node3 + + + + + +Node4 + + +penify_hook.llm_client.LLMClient.litellm + + + + + +Node3->Node4 + + + + + diff --git a/docs/html/classpenify__hook_1_1base__analyzer_1_1BaseAnalyzer-members.html b/docs/html/classpenify__hook_1_1base__analyzer_1_1BaseAnalyzer-members.html new file mode 100644 index 0000000..1b3f834 --- /dev/null +++ b/docs/html/classpenify__hook_1_1base__analyzer_1_1BaseAnalyzer-members.html @@ -0,0 +1,140 @@ + + + + + + + + + + + + + + + + + + +penify-cli: Member List + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
penify-cli +
+
+
+ + + + + + +
+
+ +
+
+
+ + + + + + + diff --git a/docs/html/classpenify__hook_1_1base__analyzer_1_1BaseAnalyzer.html b/docs/html/classpenify__hook_1_1base__analyzer_1_1BaseAnalyzer.html new file mode 100644 index 0000000..fe96757 --- /dev/null +++ b/docs/html/classpenify__hook_1_1base__analyzer_1_1BaseAnalyzer.html @@ -0,0 +1,308 @@ + + + + + + + + + + + + + + + + + + +penify-cli: penify_hook.base_analyzer.BaseAnalyzer Class Reference + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
penify-cli +
+
+
+ + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+ +
penify_hook.base_analyzer.BaseAnalyzer Class Reference
+
+
+
+Inheritance diagram for penify_hook.base_analyzer.BaseAnalyzer:
+
+
+
+
+
+Collaboration diagram for penify_hook.base_analyzer.BaseAnalyzer:
+
+
+
+
+ + + + +

+Public Member Functions

def __init__ (self, str folder_path, APIClient api_client)
 
+ + + + + + + + + + + + + + + +

+Public Attributes

 folder_path
 
 repo_path
 
 repo
 
 repo_details
 
 relative_file_path
 
 api_client
 
 supported_file_types
 
+

Constructor & Destructor Documentation

+ +

◆ __init__()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
def penify_hook.base_analyzer.BaseAnalyzer.__init__ ( self,
str folder_path,
APIClient api_client 
)
+
+
+

Member Data Documentation

+ +

◆ api_client

+ +
+
+ + + + +
penify_hook.base_analyzer.BaseAnalyzer.api_client
+
+ +
+
+ +

◆ folder_path

+ +
+
+ + + + +
penify_hook.base_analyzer.BaseAnalyzer.folder_path
+
+ +
+
+ +

◆ relative_file_path

+ +
+
+ + + + +
penify_hook.base_analyzer.BaseAnalyzer.relative_file_path
+
+ +
+
+ +

◆ repo

+ +
+
+ + + + +
penify_hook.base_analyzer.BaseAnalyzer.repo
+
+ +
+
+ +

◆ repo_details

+ +
+
+ + + + +
penify_hook.base_analyzer.BaseAnalyzer.repo_details
+
+ +
+
+ +

◆ repo_path

+ +
+
+ + + + +
penify_hook.base_analyzer.BaseAnalyzer.repo_path
+
+ +
+
+ +

◆ supported_file_types

+ +
+
+ + + + +
penify_hook.base_analyzer.BaseAnalyzer.supported_file_types
+
+ +
+
+
The documentation for this class was generated from the following file:
    +
  • /tmp/github_reposRepoArchDocGenContext/Penify-dev/penify-cli/penify_hook/base_analyzer.py
  • +
+
+
+ + + + + diff --git a/docs/html/classpenify__hook_1_1base__analyzer_1_1BaseAnalyzer.js b/docs/html/classpenify__hook_1_1base__analyzer_1_1BaseAnalyzer.js new file mode 100644 index 0000000..026bd02 --- /dev/null +++ b/docs/html/classpenify__hook_1_1base__analyzer_1_1BaseAnalyzer.js @@ -0,0 +1,11 @@ +var classpenify__hook_1_1base__analyzer_1_1BaseAnalyzer = +[ + [ "__init__", "classpenify__hook_1_1base__analyzer_1_1BaseAnalyzer.html#ab1296a3d1e9070d891801876b66f7344", null ], + [ "api_client", "classpenify__hook_1_1base__analyzer_1_1BaseAnalyzer.html#a81e9c55709205aaf4ebbe2b41683baf2", null ], + [ "folder_path", "classpenify__hook_1_1base__analyzer_1_1BaseAnalyzer.html#aa67c06dd12b1bafaeaee81c41dcb7e25", null ], + [ "relative_file_path", "classpenify__hook_1_1base__analyzer_1_1BaseAnalyzer.html#ab702c0c3ba81d159d7c3bcd7ea2abba4", null ], + [ "repo", "classpenify__hook_1_1base__analyzer_1_1BaseAnalyzer.html#a3a9ddfa1dfba81fe21214fe486389369", null ], + [ "repo_details", "classpenify__hook_1_1base__analyzer_1_1BaseAnalyzer.html#a9cca3465b0cc00d78324b0a9eac1d7f5", null ], + [ "repo_path", "classpenify__hook_1_1base__analyzer_1_1BaseAnalyzer.html#a957e81a1ab561f6cecfbe999e7b85499", null ], + [ "supported_file_types", "classpenify__hook_1_1base__analyzer_1_1BaseAnalyzer.html#a0cac0310ec635aa64a34857cf30ce1eb", null ] +]; \ No newline at end of file diff --git a/docs/html/classpenify__hook_1_1base__analyzer_1_1BaseAnalyzer__coll__graph.map b/docs/html/classpenify__hook_1_1base__analyzer_1_1BaseAnalyzer__coll__graph.map new file mode 100644 index 0000000..da4b46d --- /dev/null +++ b/docs/html/classpenify__hook_1_1base__analyzer_1_1BaseAnalyzer__coll__graph.map @@ -0,0 +1,3 @@ + + + diff --git a/docs/html/classpenify__hook_1_1base__analyzer_1_1BaseAnalyzer__coll__graph.md5 b/docs/html/classpenify__hook_1_1base__analyzer_1_1BaseAnalyzer__coll__graph.md5 new file mode 100644 index 0000000..8f67765 --- /dev/null +++ b/docs/html/classpenify__hook_1_1base__analyzer_1_1BaseAnalyzer__coll__graph.md5 @@ -0,0 +1 @@ +ba0c3a1d5b95dea65df70168e43976e0 \ No newline at end of file diff --git a/docs/html/classpenify__hook_1_1base__analyzer_1_1BaseAnalyzer__coll__graph.svg b/docs/html/classpenify__hook_1_1base__analyzer_1_1BaseAnalyzer__coll__graph.svg new file mode 100644 index 0000000..c7b4e4a --- /dev/null +++ b/docs/html/classpenify__hook_1_1base__analyzer_1_1BaseAnalyzer__coll__graph.svg @@ -0,0 +1,33 @@ + + + + + + +penify_hook.base_analyzer.BaseAnalyzer + + + +Node1 + + +penify_hook.base_analyzer. +BaseAnalyzer + ++ folder_path ++ repo_path ++ repo ++ repo_details ++ relative_file_path ++ api_client ++ supported_file_types + ++ __init__() + + + + + diff --git a/docs/html/classpenify__hook_1_1base__analyzer_1_1BaseAnalyzer__inherit__graph.map b/docs/html/classpenify__hook_1_1base__analyzer_1_1BaseAnalyzer__inherit__graph.map new file mode 100644 index 0000000..a407121 --- /dev/null +++ b/docs/html/classpenify__hook_1_1base__analyzer_1_1BaseAnalyzer__inherit__graph.map @@ -0,0 +1,7 @@ + + + + + + + diff --git a/docs/html/classpenify__hook_1_1base__analyzer_1_1BaseAnalyzer__inherit__graph.md5 b/docs/html/classpenify__hook_1_1base__analyzer_1_1BaseAnalyzer__inherit__graph.md5 new file mode 100644 index 0000000..cb38209 --- /dev/null +++ b/docs/html/classpenify__hook_1_1base__analyzer_1_1BaseAnalyzer__inherit__graph.md5 @@ -0,0 +1 @@ +63e8393eea1557a855929943cd8aca92 \ No newline at end of file diff --git a/docs/html/classpenify__hook_1_1base__analyzer_1_1BaseAnalyzer__inherit__graph.svg b/docs/html/classpenify__hook_1_1base__analyzer_1_1BaseAnalyzer__inherit__graph.svg new file mode 100644 index 0000000..7dc042a --- /dev/null +++ b/docs/html/classpenify__hook_1_1base__analyzer_1_1BaseAnalyzer__inherit__graph.svg @@ -0,0 +1,215 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +penify_hook.base_analyzer.BaseAnalyzer + + + +Node1 + + +penify_hook.base_analyzer. +BaseAnalyzer + ++ folder_path ++ repo_path ++ repo ++ repo_details ++ relative_file_path ++ api_client ++ supported_file_types + ++ __init__() + + + + + +Node2 + + +penify_hook.commit +_analyzer.CommitDocGenHook + ++ llm_client + ++ __init__() ++ get_summary() ++ run() ++ process_jira_integration() +- _amend_commit() + + + + + +Node1->Node2 + + + + + +Node3 + + +penify_hook.file_analyzer. +FileAnalyzerGenHook + ++ file_path + ++ __init__() ++ process_file() ++ print_processing() ++ run() + + + + + +Node1->Node3 + + + + + +Node4 + + +penify_hook.folder +_analyzer.FolderAnalyzerGenHook + ++ dir_path + ++ __init__() ++ list_all_files_in_dir() ++ run() + + + + + +Node1->Node4 + + + + + +Node5 + + +penify_hook.git_analyzer. +GitDocGenHook + + + ++ __init__() ++ get_modified_files +_in_last_commit() ++ get_modified_lines() ++ process_file() ++ run() + + + + + +Node1->Node5 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/html/classpenify__hook_1_1base__analyzer_1_1BaseAnalyzer__inherit__graph_org.svg b/docs/html/classpenify__hook_1_1base__analyzer_1_1BaseAnalyzer__inherit__graph_org.svg new file mode 100644 index 0000000..0ec411d --- /dev/null +++ b/docs/html/classpenify__hook_1_1base__analyzer_1_1BaseAnalyzer__inherit__graph_org.svg @@ -0,0 +1,127 @@ + + + + + + +penify_hook.base_analyzer.BaseAnalyzer + + + +Node1 + + +penify_hook.base_analyzer. +BaseAnalyzer + ++ folder_path ++ repo_path ++ repo ++ repo_details ++ relative_file_path ++ api_client ++ supported_file_types + ++ __init__() + + + + + +Node2 + + +penify_hook.commit +_analyzer.CommitDocGenHook + ++ llm_client + ++ __init__() ++ get_summary() ++ run() ++ process_jira_integration() +- _amend_commit() + + + + + +Node1->Node2 + + + + + +Node3 + + +penify_hook.file_analyzer. +FileAnalyzerGenHook + ++ file_path + ++ __init__() ++ process_file() ++ print_processing() ++ run() + + + + + +Node1->Node3 + + + + + +Node4 + + +penify_hook.folder +_analyzer.FolderAnalyzerGenHook + ++ dir_path + ++ __init__() ++ list_all_files_in_dir() ++ run() + + + + + +Node1->Node4 + + + + + +Node5 + + +penify_hook.git_analyzer. +GitDocGenHook + + + ++ __init__() ++ get_modified_files +_in_last_commit() ++ get_modified_lines() ++ process_file() ++ run() + + + + + +Node1->Node5 + + + + + diff --git a/docs/html/classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook-members.html b/docs/html/classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook-members.html new file mode 100644 index 0000000..f77adca --- /dev/null +++ b/docs/html/classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook-members.html @@ -0,0 +1,138 @@ + + + + + + + + + + + + + + + + + + +penify-cli: Member List + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
penify-cli +
+
+
+ + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
penify_hook.commit_analyzer.CommitDocGenHook Member List
+
+
+ +

This is the complete list of members for penify_hook.commit_analyzer.CommitDocGenHook, including all inherited members.

+ + + + + + + +
__init__(self, str repo_path, APIClient api_client, llm_client=None, jira_client=None)penify_hook.commit_analyzer.CommitDocGenHook
_amend_commit(self)penify_hook.commit_analyzer.CommitDocGenHookprivate
get_summary(self, str instruction, bool generate_description)penify_hook.commit_analyzer.CommitDocGenHook
llm_clientpenify_hook.commit_analyzer.CommitDocGenHook
process_jira_integration(self, str title, str description, str msg)penify_hook.commit_analyzer.CommitDocGenHook
run(self, Optional[str] msg, bool edit_commit_message, bool generate_description)penify_hook.commit_analyzer.CommitDocGenHook
+
+ + + + + diff --git a/docs/html/classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook.html b/docs/html/classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook.html new file mode 100644 index 0000000..415cd76 --- /dev/null +++ b/docs/html/classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook.html @@ -0,0 +1,486 @@ + + + + + + + + + + + + + + + + + + +penify-cli: penify_hook.commit_analyzer.CommitDocGenHook Class Reference + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
penify-cli +
+
+
+ + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+ +
penify_hook.commit_analyzer.CommitDocGenHook Class Reference
+
+
+
+Inheritance diagram for penify_hook.commit_analyzer.CommitDocGenHook:
+
+
+
+
+
+Collaboration diagram for penify_hook.commit_analyzer.CommitDocGenHook:
+
+
+
+
+ + + + + + + + + + + + +

+Public Member Functions

def __init__ (self, str repo_path, APIClient api_client, llm_client=None, jira_client=None)
 
dict get_summary (self, str instruction, bool generate_description)
 
def run (self, Optional[str] msg, bool edit_commit_message, bool generate_description)
 
tuple process_jira_integration (self, str title, str description, str msg)
 
def __init__ (self, str folder_path, APIClient api_client)
 
+ + + + + + + + + + + + + + + + + + +

+Public Attributes

 llm_client
 
- Public Attributes inherited from penify_hook.base_analyzer.BaseAnalyzer
 folder_path
 
 repo_path
 
 repo
 
 repo_details
 
 relative_file_path
 
 api_client
 
 supported_file_types
 
+ + + +

+Private Member Functions

def _amend_commit (self)
 
+

Constructor & Destructor Documentation

+ +

◆ __init__()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
def penify_hook.commit_analyzer.CommitDocGenHook.__init__ ( self,
str repo_path,
APIClient api_client,
 llm_client = None,
 jira_client = None 
)
+
+ +

Reimplemented from penify_hook.base_analyzer.BaseAnalyzer.

+
+Here is the call graph for this function:
+
+
+
+
+
+Here is the caller graph for this function:
+
+
+
+
+ +
+
+

Member Function Documentation

+ +

◆ _amend_commit()

+ +
+
+ + + + + +
+ + + + + + + + +
def penify_hook.commit_analyzer.CommitDocGenHook._amend_commit ( self)
+
+private
+
+
Amends the last commit message in the repository.
+Here is the caller graph for this function:
+
+
+
+
+ +
+
+ +

◆ get_summary()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
dict penify_hook.commit_analyzer.CommitDocGenHook.get_summary ( self,
str instruction,
bool generate_description 
)
+
+
Generate a summary for the commit based on the staged changes.
+
+This function retrieves the differences of the staged changes in the repository
+and generates a commit summary using the provided instruction. If there are no
+changes staged for commit, an exception is raised. If a JIRA client is
+connected, it will attempt to extract issue keys from the current branch and
+use them to fetch context. The summary can be generated either with a Language
+Model (LLM) client or through the API client.
+
+Args:
+    instruction (str): A string containing instructions for generating the commit summary.
+    generate_description (bool): Whether to include detailed descriptions in the summary.
+
+Raises:
+    ValueError: If there are no changes staged for commit.
+
+Here is the call graph for this function:
+
+
+
+
+
+Here is the caller graph for this function:
+
+
+
+
+ +
+
+ +

◆ process_jira_integration()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
tuple penify_hook.commit_analyzer.CommitDocGenHook.process_jira_integration ( self,
str title,
str description,
str msg 
)
+
+
Process JIRA integration by extracting issue keys from commit message
+components and branch name.
+
+This function looks for JIRA issue keys in the provided commit title,
+description, original user message, and the active branch name. It uses these
+keys to update the commit message with JIRA information and adds comments to
+the corresponding JIRA issues. If no keys are found, it logs a warning.
+
+Args:
+    title (str): The generated commit title.
+    description (str): The generated commit description.
+    msg (str): The original user message that might contain JIRA references.
+
+Returns:
+    tuple: A tuple containing the updated commit title and description with included JIRA
+        information.
+
+Here is the call graph for this function:
+
+
+
+
+
+Here is the caller graph for this function:
+
+
+
+
+ +
+
+ +

◆ run()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
def penify_hook.commit_analyzer.CommitDocGenHook.run ( self,
Optional[str] msg,
bool edit_commit_message,
bool generate_description 
)
+
+
Run the post-commit hook.
+
+This method processes the modified files from the last commit, stages them, and
+creates an auto-commit with an optional message. It also handles JIRA
+integration if available. If there is an error generating the commit summary,
+an exception is raised.
+
+Args:
+    msg (Optional[str]): An optional message to include in the commit.
+    edit_commit_message (bool): A flag indicating whether to open the git commit
+        edit terminal after committing.
+    generate_description (bool): A flag indicating whether to include a description
+        in the commit message.
+
+Here is the call graph for this function:
+
+
+
+
+ +
+
+

Member Data Documentation

+ +

◆ llm_client

+ +
+
+ + + + +
penify_hook.commit_analyzer.CommitDocGenHook.llm_client
+
+ +
+
+
The documentation for this class was generated from the following file:
    +
  • /tmp/github_reposRepoArchDocGenContext/Penify-dev/penify-cli/penify_hook/commit_analyzer.py
  • +
+
+
+ + + + + diff --git a/docs/html/classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook.js b/docs/html/classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook.js new file mode 100644 index 0000000..77da79e --- /dev/null +++ b/docs/html/classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook.js @@ -0,0 +1,9 @@ +var classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook = +[ + [ "__init__", "classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook.html#af127d86729e226d74dbeb095b008db3e", null ], + [ "_amend_commit", "classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook.html#ac999c5cbc852a7ec3b412ccb43c274ca", null ], + [ "get_summary", "classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook.html#a8496194276441fa2eb2fa014eaab9a37", null ], + [ "process_jira_integration", "classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook.html#adda13cc121d96342476ccf72b63a007f", null ], + [ "run", "classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook.html#a6370a03f7ed9175ef6f81e931a105ea9", null ], + [ "llm_client", "classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook.html#ad93360e31f2ec58a0d7c9f08b219028a", null ] +]; \ No newline at end of file diff --git a/docs/html/classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook__coll__graph.map b/docs/html/classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook__coll__graph.map new file mode 100644 index 0000000..a1bbcad --- /dev/null +++ b/docs/html/classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook__coll__graph.map @@ -0,0 +1,4 @@ + + + + diff --git a/docs/html/classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook__coll__graph.md5 b/docs/html/classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook__coll__graph.md5 new file mode 100644 index 0000000..4d6e419 --- /dev/null +++ b/docs/html/classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook__coll__graph.md5 @@ -0,0 +1 @@ +7b0dd63703399513e2ba32399fe691fd \ No newline at end of file diff --git a/docs/html/classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook__coll__graph.svg b/docs/html/classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook__coll__graph.svg new file mode 100644 index 0000000..5f8fd2c --- /dev/null +++ b/docs/html/classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook__coll__graph.svg @@ -0,0 +1,57 @@ + + + + + + +penify_hook.commit_analyzer.CommitDocGenHook + + + +Node1 + + +penify_hook.commit +_analyzer.CommitDocGenHook + ++ llm_client + ++ __init__() ++ get_summary() ++ run() ++ process_jira_integration() +- _amend_commit() + + + + + +Node2 + + +penify_hook.base_analyzer. +BaseAnalyzer + ++ folder_path ++ repo_path ++ repo ++ repo_details ++ relative_file_path ++ api_client ++ supported_file_types + ++ __init__() + + + + + +Node2->Node1 + + + + + diff --git a/docs/html/classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook__inherit__graph.map b/docs/html/classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook__inherit__graph.map new file mode 100644 index 0000000..a1bbcad --- /dev/null +++ b/docs/html/classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook__inherit__graph.map @@ -0,0 +1,4 @@ + + + + diff --git a/docs/html/classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook__inherit__graph.md5 b/docs/html/classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook__inherit__graph.md5 new file mode 100644 index 0000000..4d6e419 --- /dev/null +++ b/docs/html/classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook__inherit__graph.md5 @@ -0,0 +1 @@ +7b0dd63703399513e2ba32399fe691fd \ No newline at end of file diff --git a/docs/html/classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook__inherit__graph.svg b/docs/html/classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook__inherit__graph.svg new file mode 100644 index 0000000..5f8fd2c --- /dev/null +++ b/docs/html/classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook__inherit__graph.svg @@ -0,0 +1,57 @@ + + + + + + +penify_hook.commit_analyzer.CommitDocGenHook + + + +Node1 + + +penify_hook.commit +_analyzer.CommitDocGenHook + ++ llm_client + ++ __init__() ++ get_summary() ++ run() ++ process_jira_integration() +- _amend_commit() + + + + + +Node2 + + +penify_hook.base_analyzer. +BaseAnalyzer + ++ folder_path ++ repo_path ++ repo ++ repo_details ++ relative_file_path ++ api_client ++ supported_file_types + ++ __init__() + + + + + +Node2->Node1 + + + + + diff --git a/docs/html/classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook_a6370a03f7ed9175ef6f81e931a105ea9_cgraph.map b/docs/html/classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook_a6370a03f7ed9175ef6f81e931a105ea9_cgraph.map new file mode 100644 index 0000000..c4c0415 --- /dev/null +++ b/docs/html/classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook_a6370a03f7ed9175ef6f81e931a105ea9_cgraph.map @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/docs/html/classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook_a6370a03f7ed9175ef6f81e931a105ea9_cgraph.md5 b/docs/html/classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook_a6370a03f7ed9175ef6f81e931a105ea9_cgraph.md5 new file mode 100644 index 0000000..d530502 --- /dev/null +++ b/docs/html/classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook_a6370a03f7ed9175ef6f81e931a105ea9_cgraph.md5 @@ -0,0 +1 @@ +503804b19fd6263bc4d634da365fcb38 \ No newline at end of file diff --git a/docs/html/classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook_a6370a03f7ed9175ef6f81e931a105ea9_cgraph.svg b/docs/html/classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook_a6370a03f7ed9175ef6f81e931a105ea9_cgraph.svg new file mode 100644 index 0000000..876ec67 --- /dev/null +++ b/docs/html/classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook_a6370a03f7ed9175ef6f81e931a105ea9_cgraph.svg @@ -0,0 +1,268 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +penify_hook.commit_analyzer.CommitDocGenHook.run + + + +Node1 + + +penify_hook.commit +_analyzer.CommitDocGenHook.run + + + + + +Node2 + + +penify_hook.commit +_analyzer.CommitDocGenHook. +_amend_commit + + + + + +Node1->Node2 + + + + + +Node3 + + +penify_hook.commit +_analyzer.CommitDocGenHook.get +_summary + + + + + +Node1->Node3 + + + + + +Node4 + + +penify_hook.ui_utils.print_info + + + + + +Node1->Node4 + + + + + +Node6 + + +penify_hook.ui_utils.print +_success + + + + + +Node1->Node6 + + + + + +Node8 + + +penify_hook.commit +_analyzer.CommitDocGenHook.process +_jira_integration + + + + + +Node1->Node8 + + + + + +Node3->Node4 + + + + + +Node5 + + +penify_hook.ui_utils.format_info + + + + + +Node4->Node5 + + + + + +Node7 + + +penify_hook.ui_utils.format +_success + + + + + +Node6->Node7 + + + + + +Node8->Node4 + + + + + +Node9 + + +penify_hook.ui_utils.print +_warning + + + + + +Node8->Node9 + + + + + +Node10 + + +penify_hook.ui_utils.format +_warning + + + + + +Node9->Node10 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/html/classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook_a6370a03f7ed9175ef6f81e931a105ea9_cgraph_org.svg b/docs/html/classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook_a6370a03f7ed9175ef6f81e931a105ea9_cgraph_org.svg new file mode 100644 index 0000000..4cb8182 --- /dev/null +++ b/docs/html/classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook_a6370a03f7ed9175ef6f81e931a105ea9_cgraph_org.svg @@ -0,0 +1,180 @@ + + + + + + +penify_hook.commit_analyzer.CommitDocGenHook.run + + + +Node1 + + +penify_hook.commit +_analyzer.CommitDocGenHook.run + + + + + +Node2 + + +penify_hook.commit +_analyzer.CommitDocGenHook. +_amend_commit + + + + + +Node1->Node2 + + + + + +Node3 + + +penify_hook.commit +_analyzer.CommitDocGenHook.get +_summary + + + + + +Node1->Node3 + + + + + +Node4 + + +penify_hook.ui_utils.print_info + + + + + +Node1->Node4 + + + + + +Node6 + + +penify_hook.ui_utils.print +_success + + + + + +Node1->Node6 + + + + + +Node8 + + +penify_hook.commit +_analyzer.CommitDocGenHook.process +_jira_integration + + + + + +Node1->Node8 + + + + + +Node3->Node4 + + + + + +Node5 + + +penify_hook.ui_utils.format_info + + + + + +Node4->Node5 + + + + + +Node7 + + +penify_hook.ui_utils.format +_success + + + + + +Node6->Node7 + + + + + +Node8->Node4 + + + + + +Node9 + + +penify_hook.ui_utils.print +_warning + + + + + +Node8->Node9 + + + + + +Node10 + + +penify_hook.ui_utils.format +_warning + + + + + +Node9->Node10 + + + + + diff --git a/docs/html/classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook_a8496194276441fa2eb2fa014eaab9a37_cgraph.map b/docs/html/classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook_a8496194276441fa2eb2fa014eaab9a37_cgraph.map new file mode 100644 index 0000000..45b7af5 --- /dev/null +++ b/docs/html/classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook_a8496194276441fa2eb2fa014eaab9a37_cgraph.map @@ -0,0 +1,5 @@ + + + + + diff --git a/docs/html/classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook_a8496194276441fa2eb2fa014eaab9a37_cgraph.md5 b/docs/html/classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook_a8496194276441fa2eb2fa014eaab9a37_cgraph.md5 new file mode 100644 index 0000000..96b4195 --- /dev/null +++ b/docs/html/classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook_a8496194276441fa2eb2fa014eaab9a37_cgraph.md5 @@ -0,0 +1 @@ +ad1182651b0cfe9906faf8af31cf667d \ No newline at end of file diff --git a/docs/html/classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook_a8496194276441fa2eb2fa014eaab9a37_cgraph.svg b/docs/html/classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook_a8496194276441fa2eb2fa014eaab9a37_cgraph.svg new file mode 100644 index 0000000..72f52e3 --- /dev/null +++ b/docs/html/classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook_a8496194276441fa2eb2fa014eaab9a37_cgraph.svg @@ -0,0 +1,142 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +penify_hook.commit_analyzer.CommitDocGenHook.get_summary + + + +Node1 + + +penify_hook.commit +_analyzer.CommitDocGenHook.get +_summary + + + + + +Node2 + + +penify_hook.ui_utils.print_info + + + + + +Node1->Node2 + + + + + +Node3 + + +penify_hook.ui_utils.format_info + + + + + +Node2->Node3 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/html/classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook_a8496194276441fa2eb2fa014eaab9a37_cgraph_org.svg b/docs/html/classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook_a8496194276441fa2eb2fa014eaab9a37_cgraph_org.svg new file mode 100644 index 0000000..2e46cc5 --- /dev/null +++ b/docs/html/classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook_a8496194276441fa2eb2fa014eaab9a37_cgraph_org.svg @@ -0,0 +1,54 @@ + + + + + + +penify_hook.commit_analyzer.CommitDocGenHook.get_summary + + + +Node1 + + +penify_hook.commit +_analyzer.CommitDocGenHook.get +_summary + + + + + +Node2 + + +penify_hook.ui_utils.print_info + + + + + +Node1->Node2 + + + + + +Node3 + + +penify_hook.ui_utils.format_info + + + + + +Node2->Node3 + + + + + diff --git a/docs/html/classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook_a8496194276441fa2eb2fa014eaab9a37_icgraph.map b/docs/html/classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook_a8496194276441fa2eb2fa014eaab9a37_icgraph.map new file mode 100644 index 0000000..bced407 --- /dev/null +++ b/docs/html/classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook_a8496194276441fa2eb2fa014eaab9a37_icgraph.map @@ -0,0 +1,4 @@ + + + + diff --git a/docs/html/classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook_a8496194276441fa2eb2fa014eaab9a37_icgraph.md5 b/docs/html/classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook_a8496194276441fa2eb2fa014eaab9a37_icgraph.md5 new file mode 100644 index 0000000..fffc366 --- /dev/null +++ b/docs/html/classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook_a8496194276441fa2eb2fa014eaab9a37_icgraph.md5 @@ -0,0 +1 @@ +086b563bbc1068f3e0325d4a68d5bd17 \ No newline at end of file diff --git a/docs/html/classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook_a8496194276441fa2eb2fa014eaab9a37_icgraph.svg b/docs/html/classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook_a8496194276441fa2eb2fa014eaab9a37_icgraph.svg new file mode 100644 index 0000000..1a0196d --- /dev/null +++ b/docs/html/classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook_a8496194276441fa2eb2fa014eaab9a37_icgraph.svg @@ -0,0 +1,40 @@ + + + + + + +penify_hook.commit_analyzer.CommitDocGenHook.get_summary + + + +Node1 + + +penify_hook.commit +_analyzer.CommitDocGenHook.get +_summary + + + + + +Node2 + + +penify_hook.commit +_analyzer.CommitDocGenHook.run + + + + + +Node1->Node2 + + + + + diff --git a/docs/html/classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook_ac999c5cbc852a7ec3b412ccb43c274ca_icgraph.map b/docs/html/classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook_ac999c5cbc852a7ec3b412ccb43c274ca_icgraph.map new file mode 100644 index 0000000..d518791 --- /dev/null +++ b/docs/html/classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook_ac999c5cbc852a7ec3b412ccb43c274ca_icgraph.map @@ -0,0 +1,4 @@ + + + + diff --git a/docs/html/classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook_ac999c5cbc852a7ec3b412ccb43c274ca_icgraph.md5 b/docs/html/classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook_ac999c5cbc852a7ec3b412ccb43c274ca_icgraph.md5 new file mode 100644 index 0000000..0536af9 --- /dev/null +++ b/docs/html/classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook_ac999c5cbc852a7ec3b412ccb43c274ca_icgraph.md5 @@ -0,0 +1 @@ +fb0bae9cf2f7e07ac778eed1297c327b \ No newline at end of file diff --git a/docs/html/classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook_ac999c5cbc852a7ec3b412ccb43c274ca_icgraph.svg b/docs/html/classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook_ac999c5cbc852a7ec3b412ccb43c274ca_icgraph.svg new file mode 100644 index 0000000..eb672c4 --- /dev/null +++ b/docs/html/classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook_ac999c5cbc852a7ec3b412ccb43c274ca_icgraph.svg @@ -0,0 +1,40 @@ + + + + + + +penify_hook.commit_analyzer.CommitDocGenHook._amend_commit + + + +Node1 + + +penify_hook.commit +_analyzer.CommitDocGenHook. +_amend_commit + + + + + +Node2 + + +penify_hook.commit +_analyzer.CommitDocGenHook.run + + + + + +Node1->Node2 + + + + + diff --git a/docs/html/classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook_adda13cc121d96342476ccf72b63a007f_cgraph.map b/docs/html/classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook_adda13cc121d96342476ccf72b63a007f_cgraph.map new file mode 100644 index 0000000..5f79a9a --- /dev/null +++ b/docs/html/classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook_adda13cc121d96342476ccf72b63a007f_cgraph.map @@ -0,0 +1,7 @@ + + + + + + + diff --git a/docs/html/classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook_adda13cc121d96342476ccf72b63a007f_cgraph.md5 b/docs/html/classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook_adda13cc121d96342476ccf72b63a007f_cgraph.md5 new file mode 100644 index 0000000..76d8830 --- /dev/null +++ b/docs/html/classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook_adda13cc121d96342476ccf72b63a007f_cgraph.md5 @@ -0,0 +1 @@ +4cfab920326b3a6b29c805803ac72558 \ No newline at end of file diff --git a/docs/html/classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook_adda13cc121d96342476ccf72b63a007f_cgraph.svg b/docs/html/classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook_adda13cc121d96342476ccf72b63a007f_cgraph.svg new file mode 100644 index 0000000..fbb1bd6 --- /dev/null +++ b/docs/html/classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook_adda13cc121d96342476ccf72b63a007f_cgraph.svg @@ -0,0 +1,174 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +penify_hook.commit_analyzer.CommitDocGenHook.process_jira_integration + + + +Node1 + + +penify_hook.commit +_analyzer.CommitDocGenHook.process +_jira_integration + + + + + +Node2 + + +penify_hook.ui_utils.print_info + + + + + +Node1->Node2 + + + + + +Node4 + + +penify_hook.ui_utils.print +_warning + + + + + +Node1->Node4 + + + + + +Node3 + + +penify_hook.ui_utils.format_info + + + + + +Node2->Node3 + + + + + +Node5 + + +penify_hook.ui_utils.format +_warning + + + + + +Node4->Node5 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/html/classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook_adda13cc121d96342476ccf72b63a007f_cgraph_org.svg b/docs/html/classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook_adda13cc121d96342476ccf72b63a007f_cgraph_org.svg new file mode 100644 index 0000000..28c33ca --- /dev/null +++ b/docs/html/classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook_adda13cc121d96342476ccf72b63a007f_cgraph_org.svg @@ -0,0 +1,86 @@ + + + + + + +penify_hook.commit_analyzer.CommitDocGenHook.process_jira_integration + + + +Node1 + + +penify_hook.commit +_analyzer.CommitDocGenHook.process +_jira_integration + + + + + +Node2 + + +penify_hook.ui_utils.print_info + + + + + +Node1->Node2 + + + + + +Node4 + + +penify_hook.ui_utils.print +_warning + + + + + +Node1->Node4 + + + + + +Node3 + + +penify_hook.ui_utils.format_info + + + + + +Node2->Node3 + + + + + +Node5 + + +penify_hook.ui_utils.format +_warning + + + + + +Node4->Node5 + + + + + diff --git a/docs/html/classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook_adda13cc121d96342476ccf72b63a007f_icgraph.map b/docs/html/classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook_adda13cc121d96342476ccf72b63a007f_icgraph.map new file mode 100644 index 0000000..81bb08e --- /dev/null +++ b/docs/html/classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook_adda13cc121d96342476ccf72b63a007f_icgraph.map @@ -0,0 +1,4 @@ + + + + diff --git a/docs/html/classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook_adda13cc121d96342476ccf72b63a007f_icgraph.md5 b/docs/html/classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook_adda13cc121d96342476ccf72b63a007f_icgraph.md5 new file mode 100644 index 0000000..cf1b6d3 --- /dev/null +++ b/docs/html/classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook_adda13cc121d96342476ccf72b63a007f_icgraph.md5 @@ -0,0 +1 @@ +3cd15e6828a60d49cece5c87177581df \ No newline at end of file diff --git a/docs/html/classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook_adda13cc121d96342476ccf72b63a007f_icgraph.svg b/docs/html/classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook_adda13cc121d96342476ccf72b63a007f_icgraph.svg new file mode 100644 index 0000000..f2f541f --- /dev/null +++ b/docs/html/classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook_adda13cc121d96342476ccf72b63a007f_icgraph.svg @@ -0,0 +1,40 @@ + + + + + + +penify_hook.commit_analyzer.CommitDocGenHook.process_jira_integration + + + +Node1 + + +penify_hook.commit +_analyzer.CommitDocGenHook.process +_jira_integration + + + + + +Node2 + + +penify_hook.commit +_analyzer.CommitDocGenHook.run + + + + + +Node1->Node2 + + + + + diff --git a/docs/html/classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook_af127d86729e226d74dbeb095b008db3e_cgraph.map b/docs/html/classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook_af127d86729e226d74dbeb095b008db3e_cgraph.map new file mode 100644 index 0000000..abfc766 --- /dev/null +++ b/docs/html/classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook_af127d86729e226d74dbeb095b008db3e_cgraph.map @@ -0,0 +1,3 @@ + + + diff --git a/docs/html/classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook_af127d86729e226d74dbeb095b008db3e_cgraph.md5 b/docs/html/classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook_af127d86729e226d74dbeb095b008db3e_cgraph.md5 new file mode 100644 index 0000000..5f2103d --- /dev/null +++ b/docs/html/classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook_af127d86729e226d74dbeb095b008db3e_cgraph.md5 @@ -0,0 +1 @@ +95c682625e7209c65fce50a4bb060a81 \ No newline at end of file diff --git a/docs/html/classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook_af127d86729e226d74dbeb095b008db3e_cgraph.svg b/docs/html/classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook_af127d86729e226d74dbeb095b008db3e_cgraph.svg new file mode 100644 index 0000000..d985a2a --- /dev/null +++ b/docs/html/classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook_af127d86729e226d74dbeb095b008db3e_cgraph.svg @@ -0,0 +1,30 @@ + + + + + + +penify_hook.commit_analyzer.CommitDocGenHook.__init__ + + + +Node1 + + +penify_hook.commit +_analyzer.CommitDocGenHook. +__init__ + + + + + +Node1->Node1 + + + + + diff --git a/docs/html/classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook_af127d86729e226d74dbeb095b008db3e_icgraph.map b/docs/html/classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook_af127d86729e226d74dbeb095b008db3e_icgraph.map new file mode 100644 index 0000000..abfc766 --- /dev/null +++ b/docs/html/classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook_af127d86729e226d74dbeb095b008db3e_icgraph.map @@ -0,0 +1,3 @@ + + + diff --git a/docs/html/classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook_af127d86729e226d74dbeb095b008db3e_icgraph.md5 b/docs/html/classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook_af127d86729e226d74dbeb095b008db3e_icgraph.md5 new file mode 100644 index 0000000..39adea9 --- /dev/null +++ b/docs/html/classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook_af127d86729e226d74dbeb095b008db3e_icgraph.md5 @@ -0,0 +1 @@ +534bd5898147e11eac4c0e46a39c7860 \ No newline at end of file diff --git a/docs/html/classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook_af127d86729e226d74dbeb095b008db3e_icgraph.svg b/docs/html/classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook_af127d86729e226d74dbeb095b008db3e_icgraph.svg new file mode 100644 index 0000000..8cebb40 --- /dev/null +++ b/docs/html/classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook_af127d86729e226d74dbeb095b008db3e_icgraph.svg @@ -0,0 +1,30 @@ + + + + + + +penify_hook.commit_analyzer.CommitDocGenHook.__init__ + + + +Node1 + + +penify_hook.commit +_analyzer.CommitDocGenHook. +__init__ + + + + + +Node1->Node1 + + + + + diff --git a/docs/html/classpenify__hook_1_1file__analyzer_1_1FileAnalyzerGenHook-members.html b/docs/html/classpenify__hook_1_1file__analyzer_1_1FileAnalyzerGenHook-members.html new file mode 100644 index 0000000..94937a2 --- /dev/null +++ b/docs/html/classpenify__hook_1_1file__analyzer_1_1FileAnalyzerGenHook-members.html @@ -0,0 +1,137 @@ + + + + + + + + + + + + + + + + + + +penify-cli: Member List + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
penify-cli +
+
+
+ + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
penify_hook.file_analyzer.FileAnalyzerGenHook Member List
+
+ +
+ + + + + diff --git a/docs/html/classpenify__hook_1_1file__analyzer_1_1FileAnalyzerGenHook.html b/docs/html/classpenify__hook_1_1file__analyzer_1_1FileAnalyzerGenHook.html new file mode 100644 index 0000000..049b9a9 --- /dev/null +++ b/docs/html/classpenify__hook_1_1file__analyzer_1_1FileAnalyzerGenHook.html @@ -0,0 +1,362 @@ + + + + + + + + + + + + + + + + + + +penify-cli: penify_hook.file_analyzer.FileAnalyzerGenHook Class Reference + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
penify-cli +
+
+
+ + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+ +
penify_hook.file_analyzer.FileAnalyzerGenHook Class Reference
+
+
+
+Inheritance diagram for penify_hook.file_analyzer.FileAnalyzerGenHook:
+
+
+
+
+
+Collaboration diagram for penify_hook.file_analyzer.FileAnalyzerGenHook:
+
+
+
+
+ + + + + + + + + + + + +

+Public Member Functions

def __init__ (self, str file_path, APIClient api_client)
 
def process_file (self, file_path, pbar, str new_param="")
 
def print_processing (self, file_path)
 
def run (self)
 
def __init__ (self, str folder_path, APIClient api_client)
 
+ + + + + + + + + + + + + + + + + + +

+Public Attributes

 file_path
 
- Public Attributes inherited from penify_hook.base_analyzer.BaseAnalyzer
 folder_path
 
 repo_path
 
 repo
 
 repo_details
 
 relative_file_path
 
 api_client
 
 supported_file_types
 
+

Constructor & Destructor Documentation

+ +

◆ __init__()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
def penify_hook.file_analyzer.FileAnalyzerGenHook.__init__ ( self,
str file_path,
APIClient api_client 
)
+
+ +

Reimplemented from penify_hook.base_analyzer.BaseAnalyzer.

+ +
+
+

Member Function Documentation

+ +

◆ print_processing()

+ +
+
+ + + + + + + + + + + + + + + + + + +
def penify_hook.file_analyzer.FileAnalyzerGenHook.print_processing ( self,
 file_path 
)
+
+
Prints a message indicating that a file is being processed.
+Here is the call graph for this function:
+
+
+
+
+ +
+
+ +

◆ process_file()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
def penify_hook.file_analyzer.FileAnalyzerGenHook.process_file ( self,
 file_path,
 pbar,
str  new_param = "" 
)
+
+
Processes a file by validating its extension, reading content,
+generating documentation, and writing changes back to the file.  The function
+performs several stages of processing: 1. Validates the file's extension to
+ensure it is supported. 2. Reads the content of the file. 3. Sends the file
+content for documentation generation. 4. Writes the generated documentation
+back to the file if there are changes.
+
+Args:
+    file_path (str): The path of the file to be processed.
+    pbar (tqdm.tqdm): A progress bar object to update the status of processing stages.
+    new_param (str?): An additional parameter for future use. Defaults to an empty string.
+Here is the call graph for this function:
+
+
+
+
+
+Here is the caller graph for this function:
+
+
+
+
+ +
+
+ +

◆ run()

+ +
+
+ + + + + + + + +
def penify_hook.file_analyzer.FileAnalyzerGenHook.run ( self)
+
+
Runs the documentation process with a progress bar.
+
+This method orchestrates the documentation process by creating a progress bar,
+processing the file, and handling exceptions to ensure the progress bar
+completes properly. It updates the progress bar through various stages and
+provides feedback based on the result of the file processing.
+
+Here is the call graph for this function:
+
+
+
+
+ +
+
+

Member Data Documentation

+ +

◆ file_path

+ +
+
+ + + + +
penify_hook.file_analyzer.FileAnalyzerGenHook.file_path
+
+ +
+
+
The documentation for this class was generated from the following file:
    +
  • /tmp/github_reposRepoArchDocGenContext/Penify-dev/penify-cli/penify_hook/file_analyzer.py
  • +
+
+
+ + + + + diff --git a/docs/html/classpenify__hook_1_1file__analyzer_1_1FileAnalyzerGenHook.js b/docs/html/classpenify__hook_1_1file__analyzer_1_1FileAnalyzerGenHook.js new file mode 100644 index 0000000..56b1d3a --- /dev/null +++ b/docs/html/classpenify__hook_1_1file__analyzer_1_1FileAnalyzerGenHook.js @@ -0,0 +1,8 @@ +var classpenify__hook_1_1file__analyzer_1_1FileAnalyzerGenHook = +[ + [ "__init__", "classpenify__hook_1_1file__analyzer_1_1FileAnalyzerGenHook.html#a190c473090b2a07e7cb43073a3211c4b", null ], + [ "print_processing", "classpenify__hook_1_1file__analyzer_1_1FileAnalyzerGenHook.html#a6ab39391dfb7686f2a2d21a702dd3073", null ], + [ "process_file", "classpenify__hook_1_1file__analyzer_1_1FileAnalyzerGenHook.html#a2cc6c22ef588fccf3eed9bbc57fb6d6e", null ], + [ "run", "classpenify__hook_1_1file__analyzer_1_1FileAnalyzerGenHook.html#a4f4dffbc432fac3e259d957dd1e187f1", null ], + [ "file_path", "classpenify__hook_1_1file__analyzer_1_1FileAnalyzerGenHook.html#a9b03b88a9ce1b9af945279375048dc32", null ] +]; \ No newline at end of file diff --git a/docs/html/classpenify__hook_1_1file__analyzer_1_1FileAnalyzerGenHook__coll__graph.map b/docs/html/classpenify__hook_1_1file__analyzer_1_1FileAnalyzerGenHook__coll__graph.map new file mode 100644 index 0000000..e20b867 --- /dev/null +++ b/docs/html/classpenify__hook_1_1file__analyzer_1_1FileAnalyzerGenHook__coll__graph.map @@ -0,0 +1,4 @@ + + + + diff --git a/docs/html/classpenify__hook_1_1file__analyzer_1_1FileAnalyzerGenHook__coll__graph.md5 b/docs/html/classpenify__hook_1_1file__analyzer_1_1FileAnalyzerGenHook__coll__graph.md5 new file mode 100644 index 0000000..b6c2c1c --- /dev/null +++ b/docs/html/classpenify__hook_1_1file__analyzer_1_1FileAnalyzerGenHook__coll__graph.md5 @@ -0,0 +1 @@ +98c7ce96bb60ecdbb8c57ef7c2bc6d59 \ No newline at end of file diff --git a/docs/html/classpenify__hook_1_1file__analyzer_1_1FileAnalyzerGenHook__coll__graph.svg b/docs/html/classpenify__hook_1_1file__analyzer_1_1FileAnalyzerGenHook__coll__graph.svg new file mode 100644 index 0000000..1907db9 --- /dev/null +++ b/docs/html/classpenify__hook_1_1file__analyzer_1_1FileAnalyzerGenHook__coll__graph.svg @@ -0,0 +1,56 @@ + + + + + + +penify_hook.file_analyzer.FileAnalyzerGenHook + + + +Node1 + + +penify_hook.file_analyzer. +FileAnalyzerGenHook + ++ file_path + ++ __init__() ++ process_file() ++ print_processing() ++ run() + + + + + +Node2 + + +penify_hook.base_analyzer. +BaseAnalyzer + ++ folder_path ++ repo_path ++ repo ++ repo_details ++ relative_file_path ++ api_client ++ supported_file_types + ++ __init__() + + + + + +Node2->Node1 + + + + + diff --git a/docs/html/classpenify__hook_1_1file__analyzer_1_1FileAnalyzerGenHook__inherit__graph.map b/docs/html/classpenify__hook_1_1file__analyzer_1_1FileAnalyzerGenHook__inherit__graph.map new file mode 100644 index 0000000..e20b867 --- /dev/null +++ b/docs/html/classpenify__hook_1_1file__analyzer_1_1FileAnalyzerGenHook__inherit__graph.map @@ -0,0 +1,4 @@ + + + + diff --git a/docs/html/classpenify__hook_1_1file__analyzer_1_1FileAnalyzerGenHook__inherit__graph.md5 b/docs/html/classpenify__hook_1_1file__analyzer_1_1FileAnalyzerGenHook__inherit__graph.md5 new file mode 100644 index 0000000..b6c2c1c --- /dev/null +++ b/docs/html/classpenify__hook_1_1file__analyzer_1_1FileAnalyzerGenHook__inherit__graph.md5 @@ -0,0 +1 @@ +98c7ce96bb60ecdbb8c57ef7c2bc6d59 \ No newline at end of file diff --git a/docs/html/classpenify__hook_1_1file__analyzer_1_1FileAnalyzerGenHook__inherit__graph.svg b/docs/html/classpenify__hook_1_1file__analyzer_1_1FileAnalyzerGenHook__inherit__graph.svg new file mode 100644 index 0000000..1907db9 --- /dev/null +++ b/docs/html/classpenify__hook_1_1file__analyzer_1_1FileAnalyzerGenHook__inherit__graph.svg @@ -0,0 +1,56 @@ + + + + + + +penify_hook.file_analyzer.FileAnalyzerGenHook + + + +Node1 + + +penify_hook.file_analyzer. +FileAnalyzerGenHook + ++ file_path + ++ __init__() ++ process_file() ++ print_processing() ++ run() + + + + + +Node2 + + +penify_hook.base_analyzer. +BaseAnalyzer + ++ folder_path ++ repo_path ++ repo ++ repo_details ++ relative_file_path ++ api_client ++ supported_file_types + ++ __init__() + + + + + +Node2->Node1 + + + + + diff --git a/docs/html/classpenify__hook_1_1file__analyzer_1_1FileAnalyzerGenHook_a2cc6c22ef588fccf3eed9bbc57fb6d6e_cgraph.map b/docs/html/classpenify__hook_1_1file__analyzer_1_1FileAnalyzerGenHook_a2cc6c22ef588fccf3eed9bbc57fb6d6e_cgraph.map new file mode 100644 index 0000000..c05e761 --- /dev/null +++ b/docs/html/classpenify__hook_1_1file__analyzer_1_1FileAnalyzerGenHook_a2cc6c22ef588fccf3eed9bbc57fb6d6e_cgraph.map @@ -0,0 +1,6 @@ + + + + + + diff --git a/docs/html/classpenify__hook_1_1file__analyzer_1_1FileAnalyzerGenHook_a2cc6c22ef588fccf3eed9bbc57fb6d6e_cgraph.md5 b/docs/html/classpenify__hook_1_1file__analyzer_1_1FileAnalyzerGenHook_a2cc6c22ef588fccf3eed9bbc57fb6d6e_cgraph.md5 new file mode 100644 index 0000000..416cd78 --- /dev/null +++ b/docs/html/classpenify__hook_1_1file__analyzer_1_1FileAnalyzerGenHook_a2cc6c22ef588fccf3eed9bbc57fb6d6e_cgraph.md5 @@ -0,0 +1 @@ +dd6dbfdde640f0bc6f1c0cc995a9b4fb \ No newline at end of file diff --git a/docs/html/classpenify__hook_1_1file__analyzer_1_1FileAnalyzerGenHook_a2cc6c22ef588fccf3eed9bbc57fb6d6e_cgraph.svg b/docs/html/classpenify__hook_1_1file__analyzer_1_1FileAnalyzerGenHook_a2cc6c22ef588fccf3eed9bbc57fb6d6e_cgraph.svg new file mode 100644 index 0000000..ebc39ac --- /dev/null +++ b/docs/html/classpenify__hook_1_1file__analyzer_1_1FileAnalyzerGenHook_a2cc6c22ef588fccf3eed9bbc57fb6d6e_cgraph.svg @@ -0,0 +1,159 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +penify_hook.file_analyzer.FileAnalyzerGenHook.process_file + + + +Node1 + + +penify_hook.file_analyzer. +FileAnalyzerGenHook.process_file + + + + + +Node2 + + +penify_hook.ui_utils.print +_warning + + + + + +Node1->Node2 + + + + + +Node4 + + +penify_hook.ui_utils.update +_stage + + + + + +Node1->Node4 + + + + + +Node3 + + +penify_hook.ui_utils.format +_warning + + + + + +Node2->Node3 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/html/classpenify__hook_1_1file__analyzer_1_1FileAnalyzerGenHook_a2cc6c22ef588fccf3eed9bbc57fb6d6e_cgraph_org.svg b/docs/html/classpenify__hook_1_1file__analyzer_1_1FileAnalyzerGenHook_a2cc6c22ef588fccf3eed9bbc57fb6d6e_cgraph_org.svg new file mode 100644 index 0000000..e169853 --- /dev/null +++ b/docs/html/classpenify__hook_1_1file__analyzer_1_1FileAnalyzerGenHook_a2cc6c22ef588fccf3eed9bbc57fb6d6e_cgraph_org.svg @@ -0,0 +1,71 @@ + + + + + + +penify_hook.file_analyzer.FileAnalyzerGenHook.process_file + + + +Node1 + + +penify_hook.file_analyzer. +FileAnalyzerGenHook.process_file + + + + + +Node2 + + +penify_hook.ui_utils.print +_warning + + + + + +Node1->Node2 + + + + + +Node4 + + +penify_hook.ui_utils.update +_stage + + + + + +Node1->Node4 + + + + + +Node3 + + +penify_hook.ui_utils.format +_warning + + + + + +Node2->Node3 + + + + + diff --git a/docs/html/classpenify__hook_1_1file__analyzer_1_1FileAnalyzerGenHook_a2cc6c22ef588fccf3eed9bbc57fb6d6e_icgraph.map b/docs/html/classpenify__hook_1_1file__analyzer_1_1FileAnalyzerGenHook_a2cc6c22ef588fccf3eed9bbc57fb6d6e_icgraph.map new file mode 100644 index 0000000..b1658b2 --- /dev/null +++ b/docs/html/classpenify__hook_1_1file__analyzer_1_1FileAnalyzerGenHook_a2cc6c22ef588fccf3eed9bbc57fb6d6e_icgraph.map @@ -0,0 +1,5 @@ + + + + + diff --git a/docs/html/classpenify__hook_1_1file__analyzer_1_1FileAnalyzerGenHook_a2cc6c22ef588fccf3eed9bbc57fb6d6e_icgraph.md5 b/docs/html/classpenify__hook_1_1file__analyzer_1_1FileAnalyzerGenHook_a2cc6c22ef588fccf3eed9bbc57fb6d6e_icgraph.md5 new file mode 100644 index 0000000..8da8816 --- /dev/null +++ b/docs/html/classpenify__hook_1_1file__analyzer_1_1FileAnalyzerGenHook_a2cc6c22ef588fccf3eed9bbc57fb6d6e_icgraph.md5 @@ -0,0 +1 @@ +dce29e772ed93d06e90894791ddc50ca \ No newline at end of file diff --git a/docs/html/classpenify__hook_1_1file__analyzer_1_1FileAnalyzerGenHook_a2cc6c22ef588fccf3eed9bbc57fb6d6e_icgraph.svg b/docs/html/classpenify__hook_1_1file__analyzer_1_1FileAnalyzerGenHook_a2cc6c22ef588fccf3eed9bbc57fb6d6e_icgraph.svg new file mode 100644 index 0000000..5462f2d --- /dev/null +++ b/docs/html/classpenify__hook_1_1file__analyzer_1_1FileAnalyzerGenHook_a2cc6c22ef588fccf3eed9bbc57fb6d6e_icgraph.svg @@ -0,0 +1,55 @@ + + + + + + +penify_hook.file_analyzer.FileAnalyzerGenHook.process_file + + + +Node1 + + +penify_hook.file_analyzer. +FileAnalyzerGenHook.process_file + + + + + +Node2 + + +penify_hook.file_analyzer. +FileAnalyzerGenHook.run + + + + + +Node1->Node2 + + + + + +Node3 + + +penify_hook.git_analyzer. +GitDocGenHook.run + + + + + +Node1->Node3 + + + + + diff --git a/docs/html/classpenify__hook_1_1file__analyzer_1_1FileAnalyzerGenHook_a4f4dffbc432fac3e259d957dd1e187f1_cgraph.map b/docs/html/classpenify__hook_1_1file__analyzer_1_1FileAnalyzerGenHook_a4f4dffbc432fac3e259d957dd1e187f1_cgraph.map new file mode 100644 index 0000000..d166069 --- /dev/null +++ b/docs/html/classpenify__hook_1_1file__analyzer_1_1FileAnalyzerGenHook_a4f4dffbc432fac3e259d957dd1e187f1_cgraph.map @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/docs/html/classpenify__hook_1_1file__analyzer_1_1FileAnalyzerGenHook_a4f4dffbc432fac3e259d957dd1e187f1_cgraph.md5 b/docs/html/classpenify__hook_1_1file__analyzer_1_1FileAnalyzerGenHook_a4f4dffbc432fac3e259d957dd1e187f1_cgraph.md5 new file mode 100644 index 0000000..f40daaf --- /dev/null +++ b/docs/html/classpenify__hook_1_1file__analyzer_1_1FileAnalyzerGenHook_a4f4dffbc432fac3e259d957dd1e187f1_cgraph.md5 @@ -0,0 +1 @@ +5c58a576c4056ea132d5a9cca6880cb6 \ No newline at end of file diff --git a/docs/html/classpenify__hook_1_1file__analyzer_1_1FileAnalyzerGenHook_a4f4dffbc432fac3e259d957dd1e187f1_cgraph.svg b/docs/html/classpenify__hook_1_1file__analyzer_1_1FileAnalyzerGenHook_a4f4dffbc432fac3e259d957dd1e187f1_cgraph.svg new file mode 100644 index 0000000..d480dca --- /dev/null +++ b/docs/html/classpenify__hook_1_1file__analyzer_1_1FileAnalyzerGenHook_a4f4dffbc432fac3e259d957dd1e187f1_cgraph.svg @@ -0,0 +1,292 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +penify_hook.file_analyzer.FileAnalyzerGenHook.run + + + +Node1 + + +penify_hook.file_analyzer. +FileAnalyzerGenHook.run + + + + + +Node2 + + +penify_hook.ui_utils.create +_stage_progress_bar + + + + + +Node1->Node2 + + + + + +Node4 + + +penify_hook.ui_utils.print +_status + + + + + +Node1->Node4 + + + + + +Node5 + + +penify_hook.ui_utils.print +_success + + + + + +Node1->Node5 + + + + + +Node7 + + +penify_hook.git_analyzer. +GitDocGenHook.process_file + + + + + +Node1->Node7 + + + + + +Node9 + + +penify_hook.file_analyzer. +FileAnalyzerGenHook.process_file + + + + + +Node1->Node9 + + + + + +Node12 + + +penify_hook.ui_utils.update +_stage + + + + + +Node1->Node12 + + + + + +Node3 + + +penify_hook.ui_utils.format_info + + + + + +Node2->Node3 + + + + + +Node6 + + +penify_hook.ui_utils.format +_success + + + + + +Node5->Node6 + + + + + +Node8 + + +penify_hook.git_analyzer. +GitDocGenHook.get_modified_lines + + + + + +Node7->Node8 + + + + + +Node10 + + +penify_hook.ui_utils.print +_warning + + + + + +Node9->Node10 + + + + + +Node9->Node12 + + + + + +Node11 + + +penify_hook.ui_utils.format +_warning + + + + + +Node10->Node11 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/html/classpenify__hook_1_1file__analyzer_1_1FileAnalyzerGenHook_a4f4dffbc432fac3e259d957dd1e187f1_cgraph_org.svg b/docs/html/classpenify__hook_1_1file__analyzer_1_1FileAnalyzerGenHook_a4f4dffbc432fac3e259d957dd1e187f1_cgraph_org.svg new file mode 100644 index 0000000..68f9912 --- /dev/null +++ b/docs/html/classpenify__hook_1_1file__analyzer_1_1FileAnalyzerGenHook_a4f4dffbc432fac3e259d957dd1e187f1_cgraph_org.svg @@ -0,0 +1,204 @@ + + + + + + +penify_hook.file_analyzer.FileAnalyzerGenHook.run + + + +Node1 + + +penify_hook.file_analyzer. +FileAnalyzerGenHook.run + + + + + +Node2 + + +penify_hook.ui_utils.create +_stage_progress_bar + + + + + +Node1->Node2 + + + + + +Node4 + + +penify_hook.ui_utils.print +_status + + + + + +Node1->Node4 + + + + + +Node5 + + +penify_hook.ui_utils.print +_success + + + + + +Node1->Node5 + + + + + +Node7 + + +penify_hook.git_analyzer. +GitDocGenHook.process_file + + + + + +Node1->Node7 + + + + + +Node9 + + +penify_hook.file_analyzer. +FileAnalyzerGenHook.process_file + + + + + +Node1->Node9 + + + + + +Node12 + + +penify_hook.ui_utils.update +_stage + + + + + +Node1->Node12 + + + + + +Node3 + + +penify_hook.ui_utils.format_info + + + + + +Node2->Node3 + + + + + +Node6 + + +penify_hook.ui_utils.format +_success + + + + + +Node5->Node6 + + + + + +Node8 + + +penify_hook.git_analyzer. +GitDocGenHook.get_modified_lines + + + + + +Node7->Node8 + + + + + +Node10 + + +penify_hook.ui_utils.print +_warning + + + + + +Node9->Node10 + + + + + +Node9->Node12 + + + + + +Node11 + + +penify_hook.ui_utils.format +_warning + + + + + +Node10->Node11 + + + + + diff --git a/docs/html/classpenify__hook_1_1file__analyzer_1_1FileAnalyzerGenHook_a6ab39391dfb7686f2a2d21a702dd3073_cgraph.map b/docs/html/classpenify__hook_1_1file__analyzer_1_1FileAnalyzerGenHook_a6ab39391dfb7686f2a2d21a702dd3073_cgraph.map new file mode 100644 index 0000000..9da4fb2 --- /dev/null +++ b/docs/html/classpenify__hook_1_1file__analyzer_1_1FileAnalyzerGenHook_a6ab39391dfb7686f2a2d21a702dd3073_cgraph.map @@ -0,0 +1,4 @@ + + + + diff --git a/docs/html/classpenify__hook_1_1file__analyzer_1_1FileAnalyzerGenHook_a6ab39391dfb7686f2a2d21a702dd3073_cgraph.md5 b/docs/html/classpenify__hook_1_1file__analyzer_1_1FileAnalyzerGenHook_a6ab39391dfb7686f2a2d21a702dd3073_cgraph.md5 new file mode 100644 index 0000000..a24f9ee --- /dev/null +++ b/docs/html/classpenify__hook_1_1file__analyzer_1_1FileAnalyzerGenHook_a6ab39391dfb7686f2a2d21a702dd3073_cgraph.md5 @@ -0,0 +1 @@ +e106885ca4b06113170f86da8447c21c \ No newline at end of file diff --git a/docs/html/classpenify__hook_1_1file__analyzer_1_1FileAnalyzerGenHook_a6ab39391dfb7686f2a2d21a702dd3073_cgraph.svg b/docs/html/classpenify__hook_1_1file__analyzer_1_1FileAnalyzerGenHook_a6ab39391dfb7686f2a2d21a702dd3073_cgraph.svg new file mode 100644 index 0000000..af5e14f --- /dev/null +++ b/docs/html/classpenify__hook_1_1file__analyzer_1_1FileAnalyzerGenHook_a6ab39391dfb7686f2a2d21a702dd3073_cgraph.svg @@ -0,0 +1,40 @@ + + + + + + +penify_hook.file_analyzer.FileAnalyzerGenHook.print_processing + + + +Node1 + + +penify_hook.file_analyzer. +FileAnalyzerGenHook.print +_processing + + + + + +Node2 + + +penify_hook.ui_utils.format +_file_path + + + + + +Node1->Node2 + + + + + diff --git a/docs/html/classpenify__hook_1_1folder__analyzer_1_1FolderAnalyzerGenHook-members.html b/docs/html/classpenify__hook_1_1folder__analyzer_1_1FolderAnalyzerGenHook-members.html new file mode 100644 index 0000000..d404bfd --- /dev/null +++ b/docs/html/classpenify__hook_1_1folder__analyzer_1_1FolderAnalyzerGenHook-members.html @@ -0,0 +1,136 @@ + + + + + + + + + + + + + + + + + + +penify-cli: Member List + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
penify-cli +
+
+
+ + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
penify_hook.folder_analyzer.FolderAnalyzerGenHook Member List
+
+ +
+ + + + + diff --git a/docs/html/classpenify__hook_1_1folder__analyzer_1_1FolderAnalyzerGenHook.html b/docs/html/classpenify__hook_1_1folder__analyzer_1_1FolderAnalyzerGenHook.html new file mode 100644 index 0000000..17fe6c1 --- /dev/null +++ b/docs/html/classpenify__hook_1_1folder__analyzer_1_1FolderAnalyzerGenHook.html @@ -0,0 +1,301 @@ + + + + + + + + + + + + + + + + + + +penify-cli: penify_hook.folder_analyzer.FolderAnalyzerGenHook Class Reference + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
penify-cli +
+
+
+ + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+ +
penify_hook.folder_analyzer.FolderAnalyzerGenHook Class Reference
+
+
+
+Inheritance diagram for penify_hook.folder_analyzer.FolderAnalyzerGenHook:
+
+
+
+
+
+Collaboration diagram for penify_hook.folder_analyzer.FolderAnalyzerGenHook:
+
+
+
+
+ + + + + + + + + + +

+Public Member Functions

def __init__ (self, str dir_path, APIClient api_client)
 
def list_all_files_in_dir (self, str dir_path)
 
def run (self)
 
def __init__ (self, str folder_path, APIClient api_client)
 
+ + + + + + + + + + + + + + + + + + +

+Public Attributes

 dir_path
 
- Public Attributes inherited from penify_hook.base_analyzer.BaseAnalyzer
 folder_path
 
 repo_path
 
 repo
 
 repo_details
 
 relative_file_path
 
 api_client
 
 supported_file_types
 
+

Constructor & Destructor Documentation

+ +

◆ __init__()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
def penify_hook.folder_analyzer.FolderAnalyzerGenHook.__init__ ( self,
str dir_path,
APIClient api_client 
)
+
+ +

Reimplemented from penify_hook.base_analyzer.BaseAnalyzer.

+ +
+
+

Member Function Documentation

+ +

◆ list_all_files_in_dir()

+ +
+
+ + + + + + + + + + + + + + + + + + +
def penify_hook.folder_analyzer.FolderAnalyzerGenHook.list_all_files_in_dir ( self,
str dir_path 
)
+
+
List all non-hidden files in a directory and its subdirectories.
+
+This function recursively traverses the specified directory and its
+subdirectories, collecting paths of all non-hidden files. It filters out hidden
+directories and files (those starting with a dot) to ensure only visible files
+are returned.
+
+Args:
+    dir_path (str): The path to the directory whose files and subdirectory files need to be listed.
+
+Here is the caller graph for this function:
+
+
+
+
+ +
+
+ +

◆ run()

+ +
+
+ + + + + + + + +
def penify_hook.folder_analyzer.FolderAnalyzerGenHook.run ( self)
+
+
Run the post-commit hook and process files with a progress bar.
+Here is the call graph for this function:
+
+
+
+
+ +
+
+

Member Data Documentation

+ +

◆ dir_path

+ +
+
+ + + + +
penify_hook.folder_analyzer.FolderAnalyzerGenHook.dir_path
+
+ +
+
+
The documentation for this class was generated from the following file:
    +
  • /tmp/github_reposRepoArchDocGenContext/Penify-dev/penify-cli/penify_hook/folder_analyzer.py
  • +
+
+
+ + + + + diff --git a/docs/html/classpenify__hook_1_1folder__analyzer_1_1FolderAnalyzerGenHook.js b/docs/html/classpenify__hook_1_1folder__analyzer_1_1FolderAnalyzerGenHook.js new file mode 100644 index 0000000..5b2a45e --- /dev/null +++ b/docs/html/classpenify__hook_1_1folder__analyzer_1_1FolderAnalyzerGenHook.js @@ -0,0 +1,7 @@ +var classpenify__hook_1_1folder__analyzer_1_1FolderAnalyzerGenHook = +[ + [ "__init__", "classpenify__hook_1_1folder__analyzer_1_1FolderAnalyzerGenHook.html#a1bb0358140931d82c7616f12efe31821", null ], + [ "list_all_files_in_dir", "classpenify__hook_1_1folder__analyzer_1_1FolderAnalyzerGenHook.html#a70b845318fc7ac3b607daf26378e19ec", null ], + [ "run", "classpenify__hook_1_1folder__analyzer_1_1FolderAnalyzerGenHook.html#afd189d1b8c773bf710a899eb21fd76cc", null ], + [ "dir_path", "classpenify__hook_1_1folder__analyzer_1_1FolderAnalyzerGenHook.html#a53f73d69cc0f00763ee4830e4f0f7393", null ] +]; \ No newline at end of file diff --git a/docs/html/classpenify__hook_1_1folder__analyzer_1_1FolderAnalyzerGenHook__coll__graph.map b/docs/html/classpenify__hook_1_1folder__analyzer_1_1FolderAnalyzerGenHook__coll__graph.map new file mode 100644 index 0000000..1d2849e --- /dev/null +++ b/docs/html/classpenify__hook_1_1folder__analyzer_1_1FolderAnalyzerGenHook__coll__graph.map @@ -0,0 +1,4 @@ + + + + diff --git a/docs/html/classpenify__hook_1_1folder__analyzer_1_1FolderAnalyzerGenHook__coll__graph.md5 b/docs/html/classpenify__hook_1_1folder__analyzer_1_1FolderAnalyzerGenHook__coll__graph.md5 new file mode 100644 index 0000000..320340b --- /dev/null +++ b/docs/html/classpenify__hook_1_1folder__analyzer_1_1FolderAnalyzerGenHook__coll__graph.md5 @@ -0,0 +1 @@ +2ce8b70614e0bc292a08fd5461334e23 \ No newline at end of file diff --git a/docs/html/classpenify__hook_1_1folder__analyzer_1_1FolderAnalyzerGenHook__coll__graph.svg b/docs/html/classpenify__hook_1_1folder__analyzer_1_1FolderAnalyzerGenHook__coll__graph.svg new file mode 100644 index 0000000..7cce745 --- /dev/null +++ b/docs/html/classpenify__hook_1_1folder__analyzer_1_1FolderAnalyzerGenHook__coll__graph.svg @@ -0,0 +1,55 @@ + + + + + + +penify_hook.folder_analyzer.FolderAnalyzerGenHook + + + +Node1 + + +penify_hook.folder +_analyzer.FolderAnalyzerGenHook + ++ dir_path + ++ __init__() ++ list_all_files_in_dir() ++ run() + + + + + +Node2 + + +penify_hook.base_analyzer. +BaseAnalyzer + ++ folder_path ++ repo_path ++ repo ++ repo_details ++ relative_file_path ++ api_client ++ supported_file_types + ++ __init__() + + + + + +Node2->Node1 + + + + + diff --git a/docs/html/classpenify__hook_1_1folder__analyzer_1_1FolderAnalyzerGenHook__inherit__graph.map b/docs/html/classpenify__hook_1_1folder__analyzer_1_1FolderAnalyzerGenHook__inherit__graph.map new file mode 100644 index 0000000..1d2849e --- /dev/null +++ b/docs/html/classpenify__hook_1_1folder__analyzer_1_1FolderAnalyzerGenHook__inherit__graph.map @@ -0,0 +1,4 @@ + + + + diff --git a/docs/html/classpenify__hook_1_1folder__analyzer_1_1FolderAnalyzerGenHook__inherit__graph.md5 b/docs/html/classpenify__hook_1_1folder__analyzer_1_1FolderAnalyzerGenHook__inherit__graph.md5 new file mode 100644 index 0000000..320340b --- /dev/null +++ b/docs/html/classpenify__hook_1_1folder__analyzer_1_1FolderAnalyzerGenHook__inherit__graph.md5 @@ -0,0 +1 @@ +2ce8b70614e0bc292a08fd5461334e23 \ No newline at end of file diff --git a/docs/html/classpenify__hook_1_1folder__analyzer_1_1FolderAnalyzerGenHook__inherit__graph.svg b/docs/html/classpenify__hook_1_1folder__analyzer_1_1FolderAnalyzerGenHook__inherit__graph.svg new file mode 100644 index 0000000..7cce745 --- /dev/null +++ b/docs/html/classpenify__hook_1_1folder__analyzer_1_1FolderAnalyzerGenHook__inherit__graph.svg @@ -0,0 +1,55 @@ + + + + + + +penify_hook.folder_analyzer.FolderAnalyzerGenHook + + + +Node1 + + +penify_hook.folder +_analyzer.FolderAnalyzerGenHook + ++ dir_path + ++ __init__() ++ list_all_files_in_dir() ++ run() + + + + + +Node2 + + +penify_hook.base_analyzer. +BaseAnalyzer + ++ folder_path ++ repo_path ++ repo ++ repo_details ++ relative_file_path ++ api_client ++ supported_file_types + ++ __init__() + + + + + +Node2->Node1 + + + + + diff --git a/docs/html/classpenify__hook_1_1folder__analyzer_1_1FolderAnalyzerGenHook_a70b845318fc7ac3b607daf26378e19ec_icgraph.map b/docs/html/classpenify__hook_1_1folder__analyzer_1_1FolderAnalyzerGenHook_a70b845318fc7ac3b607daf26378e19ec_icgraph.map new file mode 100644 index 0000000..b96ef6a --- /dev/null +++ b/docs/html/classpenify__hook_1_1folder__analyzer_1_1FolderAnalyzerGenHook_a70b845318fc7ac3b607daf26378e19ec_icgraph.map @@ -0,0 +1,4 @@ + + + + diff --git a/docs/html/classpenify__hook_1_1folder__analyzer_1_1FolderAnalyzerGenHook_a70b845318fc7ac3b607daf26378e19ec_icgraph.md5 b/docs/html/classpenify__hook_1_1folder__analyzer_1_1FolderAnalyzerGenHook_a70b845318fc7ac3b607daf26378e19ec_icgraph.md5 new file mode 100644 index 0000000..4aed41f --- /dev/null +++ b/docs/html/classpenify__hook_1_1folder__analyzer_1_1FolderAnalyzerGenHook_a70b845318fc7ac3b607daf26378e19ec_icgraph.md5 @@ -0,0 +1 @@ +e2a0ef57ef0713a63ba1c8ee5591e9f5 \ No newline at end of file diff --git a/docs/html/classpenify__hook_1_1folder__analyzer_1_1FolderAnalyzerGenHook_a70b845318fc7ac3b607daf26378e19ec_icgraph.svg b/docs/html/classpenify__hook_1_1folder__analyzer_1_1FolderAnalyzerGenHook_a70b845318fc7ac3b607daf26378e19ec_icgraph.svg new file mode 100644 index 0000000..dd93702 --- /dev/null +++ b/docs/html/classpenify__hook_1_1folder__analyzer_1_1FolderAnalyzerGenHook_a70b845318fc7ac3b607daf26378e19ec_icgraph.svg @@ -0,0 +1,41 @@ + + + + + + +penify_hook.folder_analyzer.FolderAnalyzerGenHook.list_all_files_in_dir + + + +Node1 + + +penify_hook.folder +_analyzer.FolderAnalyzerGen +Hook.list_all_files_in_dir + + + + + +Node2 + + +penify_hook.folder +_analyzer.FolderAnalyzerGen +Hook.run + + + + + +Node1->Node2 + + + + + diff --git a/docs/html/classpenify__hook_1_1folder__analyzer_1_1FolderAnalyzerGenHook_afd189d1b8c773bf710a899eb21fd76cc_cgraph.map b/docs/html/classpenify__hook_1_1folder__analyzer_1_1FolderAnalyzerGenHook_afd189d1b8c773bf710a899eb21fd76cc_cgraph.map new file mode 100644 index 0000000..fb5d687 --- /dev/null +++ b/docs/html/classpenify__hook_1_1folder__analyzer_1_1FolderAnalyzerGenHook_afd189d1b8c773bf710a899eb21fd76cc_cgraph.map @@ -0,0 +1,4 @@ + + + + diff --git a/docs/html/classpenify__hook_1_1folder__analyzer_1_1FolderAnalyzerGenHook_afd189d1b8c773bf710a899eb21fd76cc_cgraph.md5 b/docs/html/classpenify__hook_1_1folder__analyzer_1_1FolderAnalyzerGenHook_afd189d1b8c773bf710a899eb21fd76cc_cgraph.md5 new file mode 100644 index 0000000..88516d8 --- /dev/null +++ b/docs/html/classpenify__hook_1_1folder__analyzer_1_1FolderAnalyzerGenHook_afd189d1b8c773bf710a899eb21fd76cc_cgraph.md5 @@ -0,0 +1 @@ +a3c6817cbc08f61a1a5f2b81334ae3dc \ No newline at end of file diff --git a/docs/html/classpenify__hook_1_1folder__analyzer_1_1FolderAnalyzerGenHook_afd189d1b8c773bf710a899eb21fd76cc_cgraph.svg b/docs/html/classpenify__hook_1_1folder__analyzer_1_1FolderAnalyzerGenHook_afd189d1b8c773bf710a899eb21fd76cc_cgraph.svg new file mode 100644 index 0000000..3e978da --- /dev/null +++ b/docs/html/classpenify__hook_1_1folder__analyzer_1_1FolderAnalyzerGenHook_afd189d1b8c773bf710a899eb21fd76cc_cgraph.svg @@ -0,0 +1,41 @@ + + + + + + +penify_hook.folder_analyzer.FolderAnalyzerGenHook.run + + + +Node1 + + +penify_hook.folder +_analyzer.FolderAnalyzerGen +Hook.run + + + + + +Node2 + + +penify_hook.folder +_analyzer.FolderAnalyzerGen +Hook.list_all_files_in_dir + + + + + +Node1->Node2 + + + + + diff --git a/docs/html/classpenify__hook_1_1git__analyzer_1_1GitDocGenHook-members.html b/docs/html/classpenify__hook_1_1git__analyzer_1_1GitDocGenHook-members.html new file mode 100644 index 0000000..437d527 --- /dev/null +++ b/docs/html/classpenify__hook_1_1git__analyzer_1_1GitDocGenHook-members.html @@ -0,0 +1,137 @@ + + + + + + + + + + + + + + + + + + +penify-cli: Member List + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
penify-cli +
+
+
+ + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
penify_hook.git_analyzer.GitDocGenHook Member List
+
+ +
+ + + + + diff --git a/docs/html/classpenify__hook_1_1git__analyzer_1_1GitDocGenHook.html b/docs/html/classpenify__hook_1_1git__analyzer_1_1GitDocGenHook.html new file mode 100644 index 0000000..3d85618 --- /dev/null +++ b/docs/html/classpenify__hook_1_1git__analyzer_1_1GitDocGenHook.html @@ -0,0 +1,385 @@ + + + + + + + + + + + + + + + + + + +penify-cli: penify_hook.git_analyzer.GitDocGenHook Class Reference + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
penify-cli +
+
+
+ + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+ +
penify_hook.git_analyzer.GitDocGenHook Class Reference
+
+
+
+Inheritance diagram for penify_hook.git_analyzer.GitDocGenHook:
+
+
+
+
+
+Collaboration diagram for penify_hook.git_analyzer.GitDocGenHook:
+
+
+
+
+ + + + + + + + + + + + + + +

+Public Member Functions

def __init__ (self, str repo_path, APIClient api_client)
 
def get_modified_files_in_last_commit (self)
 
def get_modified_lines (self, diff_text)
 
def process_file (self, file_path)
 
def run (self)
 
def __init__ (self, str folder_path, APIClient api_client)
 
+ + + + + + + + + + + + + + + + +

+Additional Inherited Members

- Public Attributes inherited from penify_hook.base_analyzer.BaseAnalyzer
 folder_path
 
 repo_path
 
 repo
 
 repo_details
 
 relative_file_path
 
 api_client
 
 supported_file_types
 
+

Constructor & Destructor Documentation

+ +

◆ __init__()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
def penify_hook.git_analyzer.GitDocGenHook.__init__ ( self,
str repo_path,
APIClient api_client 
)
+
+ +

Reimplemented from penify_hook.base_analyzer.BaseAnalyzer.

+
+Here is the call graph for this function:
+
+
+
+
+
+Here is the caller graph for this function:
+
+
+
+
+ +
+
+

Member Function Documentation

+ +

◆ get_modified_files_in_last_commit()

+ +
+
+ + + + + + + + +
def penify_hook.git_analyzer.GitDocGenHook.get_modified_files_in_last_commit ( self)
+
+
Get the list of files modified in the last commit.
+Here is the caller graph for this function:
+
+
+
+
+ +
+
+ +

◆ get_modified_lines()

+ +
+
+ + + + + + + + + + + + + + + + + + +
def penify_hook.git_analyzer.GitDocGenHook.get_modified_lines ( self,
 diff_text 
)
+
+
Extract modified line numbers from a diff text.
+
+This function processes a diff text to identify and extract the line numbers
+that have been modified. It distinguishes between added and deleted lines and
+keeps track of the current line number as it parses through the diff. The
+function handles hunk headers and ensures that any deletions at the end of the
+file are also captured.
+
+Args:
+    diff_text (str): A string containing the diff text to be processed.
+
+Here is the caller graph for this function:
+
+
+
+
+ +
+
+ +

◆ process_file()

+ +
+
+ + + + + + + + + + + + + + + + + + +
def penify_hook.git_analyzer.GitDocGenHook.process_file ( self,
 file_path 
)
+
+
Processes a file by checking its type, reading its content, and sending it to
+an API.
+
+This method constructs the absolute path of the specified file and verifies if
+the file has a valid extension. If the file type is supported, it reads the
+content of the file and retrieves the differences from the last commit in the
+repository. If changes are detected, it sends the file content along with the
+modified lines to an API for further processing. If the API response indicates
+no changes, the original file will not be overwritten.
+
+Args:
+    file_path (str): The relative path to the file to be processed.
+
+Here is the call graph for this function:
+
+
+
+
+
+Here is the caller graph for this function:
+
+
+
+
+ +
+
+ +

◆ run()

+ +
+
+ + + + + + + + +
def penify_hook.git_analyzer.GitDocGenHook.run ( self)
+
+
Run the post-commit hook.
+
+This method retrieves the list of modified files from the last commit and
+processes each file. It stages any files that have been modified during
+processing and creates an auto-commit if changes were made. A progress bar is
+displayed to indicate the processing status of each file. The method handles
+any exceptions that occur during file processing, printing an error message for
+each file that fails to process. If any modifications are made to the files, an
+auto-commit is created to save those changes.
+
+Here is the call graph for this function:
+
+
+
+
+ +
+
+
The documentation for this class was generated from the following file:
    +
  • /tmp/github_reposRepoArchDocGenContext/Penify-dev/penify-cli/penify_hook/git_analyzer.py
  • +
+
+
+ + + + + diff --git a/docs/html/classpenify__hook_1_1git__analyzer_1_1GitDocGenHook.js b/docs/html/classpenify__hook_1_1git__analyzer_1_1GitDocGenHook.js new file mode 100644 index 0000000..553f118 --- /dev/null +++ b/docs/html/classpenify__hook_1_1git__analyzer_1_1GitDocGenHook.js @@ -0,0 +1,8 @@ +var classpenify__hook_1_1git__analyzer_1_1GitDocGenHook = +[ + [ "__init__", "classpenify__hook_1_1git__analyzer_1_1GitDocGenHook.html#a92275fddb43dbef6dfdb6c1ed6e96d0c", null ], + [ "get_modified_files_in_last_commit", "classpenify__hook_1_1git__analyzer_1_1GitDocGenHook.html#a17549766100e91eb94b5f1a1d34bf481", null ], + [ "get_modified_lines", "classpenify__hook_1_1git__analyzer_1_1GitDocGenHook.html#a974d2f51315ed6a1965a7fd7e2ced0cd", null ], + [ "process_file", "classpenify__hook_1_1git__analyzer_1_1GitDocGenHook.html#a05313caa22b173ce75638f0db08eeb85", null ], + [ "run", "classpenify__hook_1_1git__analyzer_1_1GitDocGenHook.html#a3beba14e92d717391a74bb70b1fab0ae", null ] +]; \ No newline at end of file diff --git a/docs/html/classpenify__hook_1_1git__analyzer_1_1GitDocGenHook__coll__graph.map b/docs/html/classpenify__hook_1_1git__analyzer_1_1GitDocGenHook__coll__graph.map new file mode 100644 index 0000000..4f48f5f --- /dev/null +++ b/docs/html/classpenify__hook_1_1git__analyzer_1_1GitDocGenHook__coll__graph.map @@ -0,0 +1,4 @@ + + + + diff --git a/docs/html/classpenify__hook_1_1git__analyzer_1_1GitDocGenHook__coll__graph.md5 b/docs/html/classpenify__hook_1_1git__analyzer_1_1GitDocGenHook__coll__graph.md5 new file mode 100644 index 0000000..8b8aff5 --- /dev/null +++ b/docs/html/classpenify__hook_1_1git__analyzer_1_1GitDocGenHook__coll__graph.md5 @@ -0,0 +1 @@ +d285fcb980d93312bfad049f92895ba8 \ No newline at end of file diff --git a/docs/html/classpenify__hook_1_1git__analyzer_1_1GitDocGenHook__coll__graph.svg b/docs/html/classpenify__hook_1_1git__analyzer_1_1GitDocGenHook__coll__graph.svg new file mode 100644 index 0000000..cae0b9c --- /dev/null +++ b/docs/html/classpenify__hook_1_1git__analyzer_1_1GitDocGenHook__coll__graph.svg @@ -0,0 +1,58 @@ + + + + + + +penify_hook.git_analyzer.GitDocGenHook + + + +Node1 + + +penify_hook.git_analyzer. +GitDocGenHook + + + ++ __init__() ++ get_modified_files +_in_last_commit() ++ get_modified_lines() ++ process_file() ++ run() + + + + + +Node2 + + +penify_hook.base_analyzer. +BaseAnalyzer + ++ folder_path ++ repo_path ++ repo ++ repo_details ++ relative_file_path ++ api_client ++ supported_file_types + ++ __init__() + + + + + +Node2->Node1 + + + + + diff --git a/docs/html/classpenify__hook_1_1git__analyzer_1_1GitDocGenHook__inherit__graph.map b/docs/html/classpenify__hook_1_1git__analyzer_1_1GitDocGenHook__inherit__graph.map new file mode 100644 index 0000000..4f48f5f --- /dev/null +++ b/docs/html/classpenify__hook_1_1git__analyzer_1_1GitDocGenHook__inherit__graph.map @@ -0,0 +1,4 @@ + + + + diff --git a/docs/html/classpenify__hook_1_1git__analyzer_1_1GitDocGenHook__inherit__graph.md5 b/docs/html/classpenify__hook_1_1git__analyzer_1_1GitDocGenHook__inherit__graph.md5 new file mode 100644 index 0000000..8b8aff5 --- /dev/null +++ b/docs/html/classpenify__hook_1_1git__analyzer_1_1GitDocGenHook__inherit__graph.md5 @@ -0,0 +1 @@ +d285fcb980d93312bfad049f92895ba8 \ No newline at end of file diff --git a/docs/html/classpenify__hook_1_1git__analyzer_1_1GitDocGenHook__inherit__graph.svg b/docs/html/classpenify__hook_1_1git__analyzer_1_1GitDocGenHook__inherit__graph.svg new file mode 100644 index 0000000..cae0b9c --- /dev/null +++ b/docs/html/classpenify__hook_1_1git__analyzer_1_1GitDocGenHook__inherit__graph.svg @@ -0,0 +1,58 @@ + + + + + + +penify_hook.git_analyzer.GitDocGenHook + + + +Node1 + + +penify_hook.git_analyzer. +GitDocGenHook + + + ++ __init__() ++ get_modified_files +_in_last_commit() ++ get_modified_lines() ++ process_file() ++ run() + + + + + +Node2 + + +penify_hook.base_analyzer. +BaseAnalyzer + ++ folder_path ++ repo_path ++ repo ++ repo_details ++ relative_file_path ++ api_client ++ supported_file_types + ++ __init__() + + + + + +Node2->Node1 + + + + + diff --git a/docs/html/classpenify__hook_1_1git__analyzer_1_1GitDocGenHook_a05313caa22b173ce75638f0db08eeb85_cgraph.map b/docs/html/classpenify__hook_1_1git__analyzer_1_1GitDocGenHook_a05313caa22b173ce75638f0db08eeb85_cgraph.map new file mode 100644 index 0000000..f66377c --- /dev/null +++ b/docs/html/classpenify__hook_1_1git__analyzer_1_1GitDocGenHook_a05313caa22b173ce75638f0db08eeb85_cgraph.map @@ -0,0 +1,4 @@ + + + + diff --git a/docs/html/classpenify__hook_1_1git__analyzer_1_1GitDocGenHook_a05313caa22b173ce75638f0db08eeb85_cgraph.md5 b/docs/html/classpenify__hook_1_1git__analyzer_1_1GitDocGenHook_a05313caa22b173ce75638f0db08eeb85_cgraph.md5 new file mode 100644 index 0000000..bfda978 --- /dev/null +++ b/docs/html/classpenify__hook_1_1git__analyzer_1_1GitDocGenHook_a05313caa22b173ce75638f0db08eeb85_cgraph.md5 @@ -0,0 +1 @@ +d30b2fe6c8ef2ddf32a8fa6ab13a25f2 \ No newline at end of file diff --git a/docs/html/classpenify__hook_1_1git__analyzer_1_1GitDocGenHook_a05313caa22b173ce75638f0db08eeb85_cgraph.svg b/docs/html/classpenify__hook_1_1git__analyzer_1_1GitDocGenHook_a05313caa22b173ce75638f0db08eeb85_cgraph.svg new file mode 100644 index 0000000..78f9802 --- /dev/null +++ b/docs/html/classpenify__hook_1_1git__analyzer_1_1GitDocGenHook_a05313caa22b173ce75638f0db08eeb85_cgraph.svg @@ -0,0 +1,39 @@ + + + + + + +penify_hook.git_analyzer.GitDocGenHook.process_file + + + +Node1 + + +penify_hook.git_analyzer. +GitDocGenHook.process_file + + + + + +Node2 + + +penify_hook.git_analyzer. +GitDocGenHook.get_modified_lines + + + + + +Node1->Node2 + + + + + diff --git a/docs/html/classpenify__hook_1_1git__analyzer_1_1GitDocGenHook_a05313caa22b173ce75638f0db08eeb85_icgraph.map b/docs/html/classpenify__hook_1_1git__analyzer_1_1GitDocGenHook_a05313caa22b173ce75638f0db08eeb85_icgraph.map new file mode 100644 index 0000000..7d6cbb4 --- /dev/null +++ b/docs/html/classpenify__hook_1_1git__analyzer_1_1GitDocGenHook_a05313caa22b173ce75638f0db08eeb85_icgraph.map @@ -0,0 +1,5 @@ + + + + + diff --git a/docs/html/classpenify__hook_1_1git__analyzer_1_1GitDocGenHook_a05313caa22b173ce75638f0db08eeb85_icgraph.md5 b/docs/html/classpenify__hook_1_1git__analyzer_1_1GitDocGenHook_a05313caa22b173ce75638f0db08eeb85_icgraph.md5 new file mode 100644 index 0000000..519d9fc --- /dev/null +++ b/docs/html/classpenify__hook_1_1git__analyzer_1_1GitDocGenHook_a05313caa22b173ce75638f0db08eeb85_icgraph.md5 @@ -0,0 +1 @@ +4e6accfb0097a03bb56e2f390d46b980 \ No newline at end of file diff --git a/docs/html/classpenify__hook_1_1git__analyzer_1_1GitDocGenHook_a05313caa22b173ce75638f0db08eeb85_icgraph.svg b/docs/html/classpenify__hook_1_1git__analyzer_1_1GitDocGenHook_a05313caa22b173ce75638f0db08eeb85_icgraph.svg new file mode 100644 index 0000000..41b0db0 --- /dev/null +++ b/docs/html/classpenify__hook_1_1git__analyzer_1_1GitDocGenHook_a05313caa22b173ce75638f0db08eeb85_icgraph.svg @@ -0,0 +1,55 @@ + + + + + + +penify_hook.git_analyzer.GitDocGenHook.process_file + + + +Node1 + + +penify_hook.git_analyzer. +GitDocGenHook.process_file + + + + + +Node2 + + +penify_hook.file_analyzer. +FileAnalyzerGenHook.run + + + + + +Node1->Node2 + + + + + +Node3 + + +penify_hook.git_analyzer. +GitDocGenHook.run + + + + + +Node1->Node3 + + + + + diff --git a/docs/html/classpenify__hook_1_1git__analyzer_1_1GitDocGenHook_a17549766100e91eb94b5f1a1d34bf481_icgraph.map b/docs/html/classpenify__hook_1_1git__analyzer_1_1GitDocGenHook_a17549766100e91eb94b5f1a1d34bf481_icgraph.map new file mode 100644 index 0000000..7d6a6aa --- /dev/null +++ b/docs/html/classpenify__hook_1_1git__analyzer_1_1GitDocGenHook_a17549766100e91eb94b5f1a1d34bf481_icgraph.map @@ -0,0 +1,4 @@ + + + + diff --git a/docs/html/classpenify__hook_1_1git__analyzer_1_1GitDocGenHook_a17549766100e91eb94b5f1a1d34bf481_icgraph.md5 b/docs/html/classpenify__hook_1_1git__analyzer_1_1GitDocGenHook_a17549766100e91eb94b5f1a1d34bf481_icgraph.md5 new file mode 100644 index 0000000..e94ad2c --- /dev/null +++ b/docs/html/classpenify__hook_1_1git__analyzer_1_1GitDocGenHook_a17549766100e91eb94b5f1a1d34bf481_icgraph.md5 @@ -0,0 +1 @@ +c545389fcb803268668d7fa34c6d8fd9 \ No newline at end of file diff --git a/docs/html/classpenify__hook_1_1git__analyzer_1_1GitDocGenHook_a17549766100e91eb94b5f1a1d34bf481_icgraph.svg b/docs/html/classpenify__hook_1_1git__analyzer_1_1GitDocGenHook_a17549766100e91eb94b5f1a1d34bf481_icgraph.svg new file mode 100644 index 0000000..0c109b8 --- /dev/null +++ b/docs/html/classpenify__hook_1_1git__analyzer_1_1GitDocGenHook_a17549766100e91eb94b5f1a1d34bf481_icgraph.svg @@ -0,0 +1,40 @@ + + + + + + +penify_hook.git_analyzer.GitDocGenHook.get_modified_files_in_last_commit + + + +Node1 + + +penify_hook.git_analyzer. +GitDocGenHook.get_modified +_files_in_last_commit + + + + + +Node2 + + +penify_hook.git_analyzer. +GitDocGenHook.run + + + + + +Node1->Node2 + + + + + diff --git a/docs/html/classpenify__hook_1_1git__analyzer_1_1GitDocGenHook_a3beba14e92d717391a74bb70b1fab0ae_cgraph.map b/docs/html/classpenify__hook_1_1git__analyzer_1_1GitDocGenHook_a3beba14e92d717391a74bb70b1fab0ae_cgraph.map new file mode 100644 index 0000000..2bd16a0 --- /dev/null +++ b/docs/html/classpenify__hook_1_1git__analyzer_1_1GitDocGenHook_a3beba14e92d717391a74bb70b1fab0ae_cgraph.map @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/docs/html/classpenify__hook_1_1git__analyzer_1_1GitDocGenHook_a3beba14e92d717391a74bb70b1fab0ae_cgraph.md5 b/docs/html/classpenify__hook_1_1git__analyzer_1_1GitDocGenHook_a3beba14e92d717391a74bb70b1fab0ae_cgraph.md5 new file mode 100644 index 0000000..cda212c --- /dev/null +++ b/docs/html/classpenify__hook_1_1git__analyzer_1_1GitDocGenHook_a3beba14e92d717391a74bb70b1fab0ae_cgraph.md5 @@ -0,0 +1 @@ +4498c89a026edc471fa55e435c85053e \ No newline at end of file diff --git a/docs/html/classpenify__hook_1_1git__analyzer_1_1GitDocGenHook_a3beba14e92d717391a74bb70b1fab0ae_cgraph.svg b/docs/html/classpenify__hook_1_1git__analyzer_1_1GitDocGenHook_a3beba14e92d717391a74bb70b1fab0ae_cgraph.svg new file mode 100644 index 0000000..684d392 --- /dev/null +++ b/docs/html/classpenify__hook_1_1git__analyzer_1_1GitDocGenHook_a3beba14e92d717391a74bb70b1fab0ae_cgraph.svg @@ -0,0 +1,356 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +penify_hook.git_analyzer.GitDocGenHook.run + + + +Node1 + + +penify_hook.git_analyzer. +GitDocGenHook.run + + + + + +Node2 + + +penify_hook.ui_utils.create +_progress_bar + + + + + +Node1->Node2 + + + + + +Node4 + + +penify_hook.git_analyzer. +GitDocGenHook.get_modified +_files_in_last_commit + + + + + +Node1->Node4 + + + + + +Node5 + + +penify_hook.ui_utils.print_info + + + + + +Node1->Node5 + + + + + +Node6 + + +penify_hook.ui_utils.print +_processing + + + + + +Node1->Node6 + + + + + +Node8 + + +penify_hook.ui_utils.print +_status + + + + + +Node1->Node8 + + + + + +Node9 + + +penify_hook.ui_utils.print +_success + + + + + +Node1->Node9 + + + + + +Node11 + + +penify_hook.git_analyzer. +GitDocGenHook.process_file + + + + + +Node1->Node11 + + + + + +Node13 + + +penify_hook.file_analyzer. +FileAnalyzerGenHook.process_file + + + + + +Node1->Node13 + + + + + +Node3 + + +penify_hook.ui_utils.format_info + + + + + +Node2->Node3 + + + + + +Node5->Node3 + + + + + +Node7 + + +penify_hook.ui_utils.format +_file_path + + + + + +Node6->Node7 + + + + + +Node10 + + +penify_hook.ui_utils.format +_success + + + + + +Node9->Node10 + + + + + +Node12 + + +penify_hook.git_analyzer. +GitDocGenHook.get_modified_lines + + + + + +Node11->Node12 + + + + + +Node14 + + +penify_hook.ui_utils.print +_warning + + + + + +Node13->Node14 + + + + + +Node16 + + +penify_hook.ui_utils.update +_stage + + + + + +Node13->Node16 + + + + + +Node15 + + +penify_hook.ui_utils.format +_warning + + + + + +Node14->Node15 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/html/classpenify__hook_1_1git__analyzer_1_1GitDocGenHook_a3beba14e92d717391a74bb70b1fab0ae_cgraph_org.svg b/docs/html/classpenify__hook_1_1git__analyzer_1_1GitDocGenHook_a3beba14e92d717391a74bb70b1fab0ae_cgraph_org.svg new file mode 100644 index 0000000..91ef970 --- /dev/null +++ b/docs/html/classpenify__hook_1_1git__analyzer_1_1GitDocGenHook_a3beba14e92d717391a74bb70b1fab0ae_cgraph_org.svg @@ -0,0 +1,268 @@ + + + + + + +penify_hook.git_analyzer.GitDocGenHook.run + + + +Node1 + + +penify_hook.git_analyzer. +GitDocGenHook.run + + + + + +Node2 + + +penify_hook.ui_utils.create +_progress_bar + + + + + +Node1->Node2 + + + + + +Node4 + + +penify_hook.git_analyzer. +GitDocGenHook.get_modified +_files_in_last_commit + + + + + +Node1->Node4 + + + + + +Node5 + + +penify_hook.ui_utils.print_info + + + + + +Node1->Node5 + + + + + +Node6 + + +penify_hook.ui_utils.print +_processing + + + + + +Node1->Node6 + + + + + +Node8 + + +penify_hook.ui_utils.print +_status + + + + + +Node1->Node8 + + + + + +Node9 + + +penify_hook.ui_utils.print +_success + + + + + +Node1->Node9 + + + + + +Node11 + + +penify_hook.git_analyzer. +GitDocGenHook.process_file + + + + + +Node1->Node11 + + + + + +Node13 + + +penify_hook.file_analyzer. +FileAnalyzerGenHook.process_file + + + + + +Node1->Node13 + + + + + +Node3 + + +penify_hook.ui_utils.format_info + + + + + +Node2->Node3 + + + + + +Node5->Node3 + + + + + +Node7 + + +penify_hook.ui_utils.format +_file_path + + + + + +Node6->Node7 + + + + + +Node10 + + +penify_hook.ui_utils.format +_success + + + + + +Node9->Node10 + + + + + +Node12 + + +penify_hook.git_analyzer. +GitDocGenHook.get_modified_lines + + + + + +Node11->Node12 + + + + + +Node14 + + +penify_hook.ui_utils.print +_warning + + + + + +Node13->Node14 + + + + + +Node16 + + +penify_hook.ui_utils.update +_stage + + + + + +Node13->Node16 + + + + + +Node15 + + +penify_hook.ui_utils.format +_warning + + + + + +Node14->Node15 + + + + + diff --git a/docs/html/classpenify__hook_1_1git__analyzer_1_1GitDocGenHook_a92275fddb43dbef6dfdb6c1ed6e96d0c_cgraph.map b/docs/html/classpenify__hook_1_1git__analyzer_1_1GitDocGenHook_a92275fddb43dbef6dfdb6c1ed6e96d0c_cgraph.map new file mode 100644 index 0000000..64415d0 --- /dev/null +++ b/docs/html/classpenify__hook_1_1git__analyzer_1_1GitDocGenHook_a92275fddb43dbef6dfdb6c1ed6e96d0c_cgraph.map @@ -0,0 +1,3 @@ + + + diff --git a/docs/html/classpenify__hook_1_1git__analyzer_1_1GitDocGenHook_a92275fddb43dbef6dfdb6c1ed6e96d0c_cgraph.md5 b/docs/html/classpenify__hook_1_1git__analyzer_1_1GitDocGenHook_a92275fddb43dbef6dfdb6c1ed6e96d0c_cgraph.md5 new file mode 100644 index 0000000..4c4eb97 --- /dev/null +++ b/docs/html/classpenify__hook_1_1git__analyzer_1_1GitDocGenHook_a92275fddb43dbef6dfdb6c1ed6e96d0c_cgraph.md5 @@ -0,0 +1 @@ +eb87828bf186415180fe0c4a9a69bffa \ No newline at end of file diff --git a/docs/html/classpenify__hook_1_1git__analyzer_1_1GitDocGenHook_a92275fddb43dbef6dfdb6c1ed6e96d0c_cgraph.svg b/docs/html/classpenify__hook_1_1git__analyzer_1_1GitDocGenHook_a92275fddb43dbef6dfdb6c1ed6e96d0c_cgraph.svg new file mode 100644 index 0000000..cec3173 --- /dev/null +++ b/docs/html/classpenify__hook_1_1git__analyzer_1_1GitDocGenHook_a92275fddb43dbef6dfdb6c1ed6e96d0c_cgraph.svg @@ -0,0 +1,29 @@ + + + + + + +penify_hook.git_analyzer.GitDocGenHook.__init__ + + + +Node1 + + +penify_hook.git_analyzer. +GitDocGenHook.__init__ + + + + + +Node1->Node1 + + + + + diff --git a/docs/html/classpenify__hook_1_1git__analyzer_1_1GitDocGenHook_a92275fddb43dbef6dfdb6c1ed6e96d0c_icgraph.map b/docs/html/classpenify__hook_1_1git__analyzer_1_1GitDocGenHook_a92275fddb43dbef6dfdb6c1ed6e96d0c_icgraph.map new file mode 100644 index 0000000..64415d0 --- /dev/null +++ b/docs/html/classpenify__hook_1_1git__analyzer_1_1GitDocGenHook_a92275fddb43dbef6dfdb6c1ed6e96d0c_icgraph.map @@ -0,0 +1,3 @@ + + + diff --git a/docs/html/classpenify__hook_1_1git__analyzer_1_1GitDocGenHook_a92275fddb43dbef6dfdb6c1ed6e96d0c_icgraph.md5 b/docs/html/classpenify__hook_1_1git__analyzer_1_1GitDocGenHook_a92275fddb43dbef6dfdb6c1ed6e96d0c_icgraph.md5 new file mode 100644 index 0000000..756ea69 --- /dev/null +++ b/docs/html/classpenify__hook_1_1git__analyzer_1_1GitDocGenHook_a92275fddb43dbef6dfdb6c1ed6e96d0c_icgraph.md5 @@ -0,0 +1 @@ +3a80069fcc09aa58b795925a04c3a1a9 \ No newline at end of file diff --git a/docs/html/classpenify__hook_1_1git__analyzer_1_1GitDocGenHook_a92275fddb43dbef6dfdb6c1ed6e96d0c_icgraph.svg b/docs/html/classpenify__hook_1_1git__analyzer_1_1GitDocGenHook_a92275fddb43dbef6dfdb6c1ed6e96d0c_icgraph.svg new file mode 100644 index 0000000..caf1235 --- /dev/null +++ b/docs/html/classpenify__hook_1_1git__analyzer_1_1GitDocGenHook_a92275fddb43dbef6dfdb6c1ed6e96d0c_icgraph.svg @@ -0,0 +1,29 @@ + + + + + + +penify_hook.git_analyzer.GitDocGenHook.__init__ + + + +Node1 + + +penify_hook.git_analyzer. +GitDocGenHook.__init__ + + + + + +Node1->Node1 + + + + + diff --git a/docs/html/classpenify__hook_1_1git__analyzer_1_1GitDocGenHook_a974d2f51315ed6a1965a7fd7e2ced0cd_icgraph.map b/docs/html/classpenify__hook_1_1git__analyzer_1_1GitDocGenHook_a974d2f51315ed6a1965a7fd7e2ced0cd_icgraph.map new file mode 100644 index 0000000..10ddcfb --- /dev/null +++ b/docs/html/classpenify__hook_1_1git__analyzer_1_1GitDocGenHook_a974d2f51315ed6a1965a7fd7e2ced0cd_icgraph.map @@ -0,0 +1,6 @@ + + + + + + diff --git a/docs/html/classpenify__hook_1_1git__analyzer_1_1GitDocGenHook_a974d2f51315ed6a1965a7fd7e2ced0cd_icgraph.md5 b/docs/html/classpenify__hook_1_1git__analyzer_1_1GitDocGenHook_a974d2f51315ed6a1965a7fd7e2ced0cd_icgraph.md5 new file mode 100644 index 0000000..5dc8e1b --- /dev/null +++ b/docs/html/classpenify__hook_1_1git__analyzer_1_1GitDocGenHook_a974d2f51315ed6a1965a7fd7e2ced0cd_icgraph.md5 @@ -0,0 +1 @@ +1071229abc0a24fe1359fe7763b4c8d0 \ No newline at end of file diff --git a/docs/html/classpenify__hook_1_1git__analyzer_1_1GitDocGenHook_a974d2f51315ed6a1965a7fd7e2ced0cd_icgraph.svg b/docs/html/classpenify__hook_1_1git__analyzer_1_1GitDocGenHook_a974d2f51315ed6a1965a7fd7e2ced0cd_icgraph.svg new file mode 100644 index 0000000..c278664 --- /dev/null +++ b/docs/html/classpenify__hook_1_1git__analyzer_1_1GitDocGenHook_a974d2f51315ed6a1965a7fd7e2ced0cd_icgraph.svg @@ -0,0 +1,159 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +penify_hook.git_analyzer.GitDocGenHook.get_modified_lines + + + +Node1 + + +penify_hook.git_analyzer. +GitDocGenHook.get_modified_lines + + + + + +Node2 + + +penify_hook.git_analyzer. +GitDocGenHook.process_file + + + + + +Node1->Node2 + + + + + +Node3 + + +penify_hook.file_analyzer. +FileAnalyzerGenHook.run + + + + + +Node2->Node3 + + + + + +Node4 + + +penify_hook.git_analyzer. +GitDocGenHook.run + + + + + +Node2->Node4 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/html/classpenify__hook_1_1git__analyzer_1_1GitDocGenHook_a974d2f51315ed6a1965a7fd7e2ced0cd_icgraph_org.svg b/docs/html/classpenify__hook_1_1git__analyzer_1_1GitDocGenHook_a974d2f51315ed6a1965a7fd7e2ced0cd_icgraph_org.svg new file mode 100644 index 0000000..b1e00b5 --- /dev/null +++ b/docs/html/classpenify__hook_1_1git__analyzer_1_1GitDocGenHook_a974d2f51315ed6a1965a7fd7e2ced0cd_icgraph_org.svg @@ -0,0 +1,71 @@ + + + + + + +penify_hook.git_analyzer.GitDocGenHook.get_modified_lines + + + +Node1 + + +penify_hook.git_analyzer. +GitDocGenHook.get_modified_lines + + + + + +Node2 + + +penify_hook.git_analyzer. +GitDocGenHook.process_file + + + + + +Node1->Node2 + + + + + +Node3 + + +penify_hook.file_analyzer. +FileAnalyzerGenHook.run + + + + + +Node2->Node3 + + + + + +Node4 + + +penify_hook.git_analyzer. +GitDocGenHook.run + + + + + +Node2->Node4 + + + + + diff --git a/docs/html/classpenify__hook_1_1jira__client_1_1JiraClient-members.html b/docs/html/classpenify__hook_1_1jira__client_1_1JiraClient-members.html new file mode 100644 index 0000000..f41c70b --- /dev/null +++ b/docs/html/classpenify__hook_1_1jira__client_1_1JiraClient-members.html @@ -0,0 +1,147 @@ + + + + + + + + + + + + + + + + + + +penify-cli: Member List + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
penify-cli +
+
+
+ + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
penify_hook.jira_client.JiraClient Member List
+
+ +
+ + + + + diff --git a/docs/html/classpenify__hook_1_1jira__client_1_1JiraClient.html b/docs/html/classpenify__hook_1_1jira__client_1_1JiraClient.html new file mode 100644 index 0000000..1a49e61 --- /dev/null +++ b/docs/html/classpenify__hook_1_1jira__client_1_1JiraClient.html @@ -0,0 +1,774 @@ + + + + + + + + + + + + + + + + + + +penify-cli: penify_hook.jira_client.JiraClient Class Reference + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
penify-cli +
+
+
+ + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+ +
penify_hook.jira_client.JiraClient Class Reference
+
+
+
+Collaboration diagram for penify_hook.jira_client.JiraClient:
+
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

def __init__ (self, str jira_url=None, str jira_user=None, str jira_api_token=None)
 
bool is_connected (self)
 
List[str] extract_issue_keys_from_branch (self, str branch_name)
 
List[str] extract_issue_keys (self, str text)
 
Optional[Dict[str, Any]] get_issue_details (self, str issue_key)
 
bool add_comment (self, str issue_key, str comment)
 
bool update_issue_status (self, str issue_key, str transition_name)
 
tuple format_commit_message_with_jira_info (self, str commit_title, str commit_description, List[str] issue_keys=None)
 
Dict[str, Any] get_detailed_issue_context (self, str issue_key)
 
Dict[str, Any] get_commit_context_from_issues (self, List[str] issue_keys)
 
tuple enhance_commit_message (self, str title, str description, List[str] issue_keys)
 
+ + + + + + + + + +

+Public Attributes

 jira_url
 
 jira_user
 
 jira_api_token
 
 jira_client
 
+

Detailed Description

+
Client for interacting with JIRA API
+

Constructor & Destructor Documentation

+ +

◆ __init__()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
def penify_hook.jira_client.JiraClient.__init__ ( self,
str  jira_url = None,
str  jira_user = None,
str  jira_api_token = None 
)
+
+
Initialize the JIRA client.
+
+Args:
+    jira_url: Base URL for JIRA instance (e.g., "https://your-domain.atlassian.net")
+    jira_user: JIRA username or email
+    jira_api_token: JIRA API token
+
+
+
+

Member Function Documentation

+ +

◆ add_comment()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
bool penify_hook.jira_client.JiraClient.add_comment ( self,
str issue_key,
str comment 
)
+
+
Adds a comment to a JIRA issue.
+Here is the call graph for this function:
+
+
+
+
+
+Here is the caller graph for this function:
+
+
+
+
+ +
+
+ +

◆ enhance_commit_message()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
tuple penify_hook.jira_client.JiraClient.enhance_commit_message ( self,
str title,
str description,
List[str] issue_keys 
)
+
+
Enhance a commit message with business and technical context from JIRA issues.
+
+This function first checks if the list of issue keys is empty or if there is no
+connection. If so, it returns the original title and description without
+modification. It then retrieves context information from the specified JIRA
+issues. If the primary issue is missing, it formats the commit message with
+basic JIRA info.  The function enhances the commit title by prefixing it with
+the primary issue key if not already included. It appends a business context
+section to the description, including details like issue type, status,
+priority, sprint, acceptance criteria, and a condensed issue description. If
+comments are available, they are added as technical notes. Finally, related
+issues are listed.
+
+Args:
+    title (str): Original commit title.
+    description (str): Original commit description.
+    issue_keys (List[str]): List of JIRA issue keys to include in the enhanced commit message.
+
+Returns:
+    tuple: A tuple containing the enhanced commit title and description with added
+        context from JIRA issues.
+
+Here is the call graph for this function:
+
+
+
+
+ +
+
+ +

◆ extract_issue_keys()

+ +
+
+ + + + + + + + + + + + + + + + + + +
List[str] penify_hook.jira_client.JiraClient.extract_issue_keys ( self,
str text 
)
+
+
Extract unique JIRA issue keys from the given text.
+Here is the caller graph for this function:
+
+
+
+
+ +
+
+ +

◆ extract_issue_keys_from_branch()

+ +
+
+ + + + + + + + + + + + + + + + + + +
List[str] penify_hook.jira_client.JiraClient.extract_issue_keys_from_branch ( self,
str branch_name 
)
+
+
Extracts unique JIRA issue keys from a branch name.
+Here is the call graph for this function:
+
+
+
+
+ +
+
+ +

◆ format_commit_message_with_jira_info()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
tuple penify_hook.jira_client.JiraClient.format_commit_message_with_jira_info ( self,
str commit_title,
str commit_description,
List[str]  issue_keys = None 
)
+
+
Format commit message with JIRA issue information.
+
+This function updates the provided commit title and description by
+incorporating JIRA issue keys. If no issue keys are supplied, it extracts them
+from the commit title and description. It then formats the commit title to
+include the first issue key if not already present and appends detailed
+information about each issue to the commit description.
+
+Args:
+    commit_title (str): The original commit title.
+    commit_description (str): The original commit description.
+    issue_keys (List[str]?): A list of JIRA issue keys to include in the commit message. If not
+        provided, issue keys will be extracted from both the title and the description.
+
+Returns:
+    tuple: A tuple containing the updated commit title and description with JIRA
+        information included.
+
+Here is the call graph for this function:
+
+
+
+
+
+Here is the caller graph for this function:
+
+
+
+
+ +
+
+ +

◆ get_commit_context_from_issues()

+ +
+
+ + + + + + + + + + + + + + + + + + +
Dict[str, Any] penify_hook.jira_client.JiraClient.get_commit_context_from_issues ( self,
List[str] issue_keys 
)
+
+
Gather contextual information from JIRA issues to improve commit messages.
+
+This function processes a list of JIRA issue keys, retrieves detailed context
+for each issue, and aggregates it into a dictionary that can be used to enhance
+commit messages. It first retrieves the primary issue (the first key in the
+list) and then gathers basic details for any related issues. The resulting
+context includes information from both the primary and related issues, along
+with all issue keys.
+
+Args:
+    issue_keys: List of JIRA issue keys to gather information from
+
+Returns:
+    Dict containing business and technical context from the issues
+
+Here is the call graph for this function:
+
+
+
+
+
+Here is the caller graph for this function:
+
+
+
+
+ +
+
+ +

◆ get_detailed_issue_context()

+ +
+
+ + + + + + + + + + + + + + + + + + +
Dict[str, Any] penify_hook.jira_client.JiraClient.get_detailed_issue_context ( self,
str issue_key 
)
+
+
Retrieve comprehensive details about a JIRA issue including context for better
+commit messages.
+
+This function fetches detailed information from a specified JIRA issue and
+constructs a dictionary containing various context fields such as the issue
+summary, description, type, status, priority, comments, URL, and additional
+custom fields like acceptance criteria and sprint information. It handles
+errors by logging appropriate warnings or errors.
+
+Args:
+    issue_key (str): The JIRA issue key (e.g., "PROJECT-123").
+
+Returns:
+    Dict[str, Any]: A dictionary containing business and technical context from the issue.
+
+Here is the call graph for this function:
+
+
+
+
+
+Here is the caller graph for this function:
+
+
+
+
+ +
+
+ +

◆ get_issue_details()

+ +
+
+ + + + + + + + + + + + + + + + + + +
Optional[Dict[str, Any]] penify_hook.jira_client.JiraClient.get_issue_details ( self,
str issue_key 
)
+
+
Retrieve details of a JIRA issue based on its key.
+
+This function fetches detailed information about a specified JIRA issue using
+the provided issue key. It first checks if the JIRA client is connected; if
+not, it logs a warning and returns `None`. If connected, it attempts to
+retrieve the issue from the JIRA server. On success, it constructs and returns
+a dictionary containing various details such as the issue's key, summary,
+status, description, assignee, reporter, type, priority, and URL. Errors during
+this process are logged, and `None` is returned.
+
+Args:
+    issue_key (str): The JIRA issue key (e.g., "PROJECT-123").
+
+Here is the call graph for this function:
+
+
+
+
+
+Here is the caller graph for this function:
+
+
+
+
+ +
+
+ +

◆ is_connected()

+ +
+
+ + + + + + + + +
bool penify_hook.jira_client.JiraClient.is_connected ( self)
+
+
Check if the JIRA client is connected.
+Here is the caller graph for this function:
+
+
+
+
+ +
+
+ +

◆ update_issue_status()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
bool penify_hook.jira_client.JiraClient.update_issue_status ( self,
str issue_key,
str transition_name 
)
+
+
Update the status of a JIRA issue.
+
+This method checks if the JIRA client is connected, retrieves available
+transitions for the given issue, finds the transition ID by name, and updates
+the issue's status accordingly. If any step fails or the specified transition
+is not found, appropriate logs are generated, and False is returned.
+
+Args:
+    issue_key (str): The key of the JIRA issue to be updated.
+    transition_name (str): The name of the desired transition.
+
+Returns:
+    bool: True if the status was successfully updated, False otherwise.
+
+Here is the call graph for this function:
+
+
+
+
+ +
+
+

Member Data Documentation

+ +

◆ jira_api_token

+ +
+
+ + + + +
penify_hook.jira_client.JiraClient.jira_api_token
+
+ +
+
+ +

◆ jira_client

+ +
+
+ + + + +
penify_hook.jira_client.JiraClient.jira_client
+
+ +
+
+ +

◆ jira_url

+ +
+
+ + + + +
penify_hook.jira_client.JiraClient.jira_url
+
+ +
+
+ +

◆ jira_user

+ +
+
+ + + + +
penify_hook.jira_client.JiraClient.jira_user
+
+ +
+
+
The documentation for this class was generated from the following file:
    +
  • /tmp/github_reposRepoArchDocGenContext/Penify-dev/penify-cli/penify_hook/jira_client.py
  • +
+
+
+ + + + + diff --git a/docs/html/classpenify__hook_1_1jira__client_1_1JiraClient.js b/docs/html/classpenify__hook_1_1jira__client_1_1JiraClient.js new file mode 100644 index 0000000..f68eed5 --- /dev/null +++ b/docs/html/classpenify__hook_1_1jira__client_1_1JiraClient.js @@ -0,0 +1,18 @@ +var classpenify__hook_1_1jira__client_1_1JiraClient = +[ + [ "__init__", "classpenify__hook_1_1jira__client_1_1JiraClient.html#a47efc1ec07389c960f2dfb37ba8c09f5", null ], + [ "add_comment", "classpenify__hook_1_1jira__client_1_1JiraClient.html#aa1f374116c64cd5f1492ec7f7e40f9c1", null ], + [ "enhance_commit_message", "classpenify__hook_1_1jira__client_1_1JiraClient.html#a70d2c5a6432aa6f238da0ff65d49a760", null ], + [ "extract_issue_keys", "classpenify__hook_1_1jira__client_1_1JiraClient.html#ad2823ad1d3baaedd38039913c3a97fd7", null ], + [ "extract_issue_keys_from_branch", "classpenify__hook_1_1jira__client_1_1JiraClient.html#a093d6456fe053ef7a7862d5d6851910c", null ], + [ "format_commit_message_with_jira_info", "classpenify__hook_1_1jira__client_1_1JiraClient.html#a49ea1149758f7f5212149d357b13cc23", null ], + [ "get_commit_context_from_issues", "classpenify__hook_1_1jira__client_1_1JiraClient.html#afb41ce6f13c30b1265d439ddf04bf2cd", null ], + [ "get_detailed_issue_context", "classpenify__hook_1_1jira__client_1_1JiraClient.html#aa967169a4b7970c67c0947b9ac56f746", null ], + [ "get_issue_details", "classpenify__hook_1_1jira__client_1_1JiraClient.html#a65f6924819084b7c8d268956a784804a", null ], + [ "is_connected", "classpenify__hook_1_1jira__client_1_1JiraClient.html#a00d0f9ae006313a21576362d26ac5ec8", null ], + [ "update_issue_status", "classpenify__hook_1_1jira__client_1_1JiraClient.html#aca8837552d37bfd611de23441a240826", null ], + [ "jira_api_token", "classpenify__hook_1_1jira__client_1_1JiraClient.html#afc5c90e53b702f9fc27e2ee7d3f991b9", null ], + [ "jira_client", "classpenify__hook_1_1jira__client_1_1JiraClient.html#aefb3f96c79358cf3a95d96d3747235b6", null ], + [ "jira_url", "classpenify__hook_1_1jira__client_1_1JiraClient.html#a3c0cfecff02a75cb7001509a595b8197", null ], + [ "jira_user", "classpenify__hook_1_1jira__client_1_1JiraClient.html#ae56104d5aa7bda7bb26d169c4b46038c", null ] +]; \ No newline at end of file diff --git a/docs/html/classpenify__hook_1_1jira__client_1_1JiraClient__coll__graph.map b/docs/html/classpenify__hook_1_1jira__client_1_1JiraClient__coll__graph.map new file mode 100644 index 0000000..2bc82ba --- /dev/null +++ b/docs/html/classpenify__hook_1_1jira__client_1_1JiraClient__coll__graph.map @@ -0,0 +1,3 @@ + + + diff --git a/docs/html/classpenify__hook_1_1jira__client_1_1JiraClient__coll__graph.md5 b/docs/html/classpenify__hook_1_1jira__client_1_1JiraClient__coll__graph.md5 new file mode 100644 index 0000000..fd79a8c --- /dev/null +++ b/docs/html/classpenify__hook_1_1jira__client_1_1JiraClient__coll__graph.md5 @@ -0,0 +1 @@ +6c94c8bb54063a87c9a021e499d2535a \ No newline at end of file diff --git a/docs/html/classpenify__hook_1_1jira__client_1_1JiraClient__coll__graph.svg b/docs/html/classpenify__hook_1_1jira__client_1_1JiraClient__coll__graph.svg new file mode 100644 index 0000000..9d17916 --- /dev/null +++ b/docs/html/classpenify__hook_1_1jira__client_1_1JiraClient__coll__graph.svg @@ -0,0 +1,44 @@ + + + + + + +penify_hook.jira_client.JiraClient + + + +Node1 + + +penify_hook.jira_client. +JiraClient + ++ jira_url ++ jira_user ++ jira_api_token ++ jira_client + ++ __init__() ++ is_connected() ++ extract_issue_keys +_from_branch() ++ extract_issue_keys() ++ get_issue_details() ++ add_comment() ++ update_issue_status() ++ format_commit_message +_with_jira_info() ++ get_detailed_issue +_context() ++ get_commit_context +_from_issues() ++ enhance_commit_message() + + + + + diff --git a/docs/html/classpenify__hook_1_1jira__client_1_1JiraClient_a00d0f9ae006313a21576362d26ac5ec8_icgraph.map b/docs/html/classpenify__hook_1_1jira__client_1_1JiraClient_a00d0f9ae006313a21576362d26ac5ec8_icgraph.map new file mode 100644 index 0000000..0aabfe7 --- /dev/null +++ b/docs/html/classpenify__hook_1_1jira__client_1_1JiraClient_a00d0f9ae006313a21576362d26ac5ec8_icgraph.map @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/docs/html/classpenify__hook_1_1jira__client_1_1JiraClient_a00d0f9ae006313a21576362d26ac5ec8_icgraph.md5 b/docs/html/classpenify__hook_1_1jira__client_1_1JiraClient_a00d0f9ae006313a21576362d26ac5ec8_icgraph.md5 new file mode 100644 index 0000000..15413c7 --- /dev/null +++ b/docs/html/classpenify__hook_1_1jira__client_1_1JiraClient_a00d0f9ae006313a21576362d26ac5ec8_icgraph.md5 @@ -0,0 +1 @@ +e49f7a18c7f7394bc3ba168c4b7dfcbf \ No newline at end of file diff --git a/docs/html/classpenify__hook_1_1jira__client_1_1JiraClient_a00d0f9ae006313a21576362d26ac5ec8_icgraph.svg b/docs/html/classpenify__hook_1_1jira__client_1_1JiraClient_a00d0f9ae006313a21576362d26ac5ec8_icgraph.svg new file mode 100644 index 0000000..8976bbb --- /dev/null +++ b/docs/html/classpenify__hook_1_1jira__client_1_1JiraClient_a00d0f9ae006313a21576362d26ac5ec8_icgraph.svg @@ -0,0 +1,264 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +penify_hook.jira_client.JiraClient.is_connected + + + +Node1 + + +penify_hook.jira_client. +JiraClient.is_connected + + + + + +Node2 + + +penify_hook.jira_client. +JiraClient.add_comment + + + + + +Node1->Node2 + + + + + +Node3 + + +penify_hook.jira_client. +JiraClient.enhance_commit +_message + + + + + +Node1->Node3 + + + + + +Node4 + + +penify_hook.jira_client. +JiraClient.format_commit +_message_with_jira_info + + + + + +Node1->Node4 + + + + + +Node5 + + +penify_hook.jira_client. +JiraClient.get_commit +_context_from_issues + + + + + +Node1->Node5 + + + + + +Node6 + + +penify_hook.jira_client. +JiraClient.get_detailed +_issue_context + + + + + +Node1->Node6 + + + + + +Node7 + + +penify_hook.jira_client. +JiraClient.get_issue_details + + + + + +Node1->Node7 + + + + + +Node8 + + +penify_hook.jira_client. +JiraClient.update_issue +_status + + + + + +Node1->Node8 + + + + + +Node2->Node2 + + + + + +Node4->Node3 + + + + + +Node5->Node3 + + + + + +Node6->Node5 + + + + + +Node7->Node4 + + + + + +Node7->Node5 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/html/classpenify__hook_1_1jira__client_1_1JiraClient_a00d0f9ae006313a21576362d26ac5ec8_icgraph_org.svg b/docs/html/classpenify__hook_1_1jira__client_1_1JiraClient_a00d0f9ae006313a21576362d26ac5ec8_icgraph_org.svg new file mode 100644 index 0000000..3d42518 --- /dev/null +++ b/docs/html/classpenify__hook_1_1jira__client_1_1JiraClient_a00d0f9ae006313a21576362d26ac5ec8_icgraph_org.svg @@ -0,0 +1,176 @@ + + + + + + +penify_hook.jira_client.JiraClient.is_connected + + + +Node1 + + +penify_hook.jira_client. +JiraClient.is_connected + + + + + +Node2 + + +penify_hook.jira_client. +JiraClient.add_comment + + + + + +Node1->Node2 + + + + + +Node3 + + +penify_hook.jira_client. +JiraClient.enhance_commit +_message + + + + + +Node1->Node3 + + + + + +Node4 + + +penify_hook.jira_client. +JiraClient.format_commit +_message_with_jira_info + + + + + +Node1->Node4 + + + + + +Node5 + + +penify_hook.jira_client. +JiraClient.get_commit +_context_from_issues + + + + + +Node1->Node5 + + + + + +Node6 + + +penify_hook.jira_client. +JiraClient.get_detailed +_issue_context + + + + + +Node1->Node6 + + + + + +Node7 + + +penify_hook.jira_client. +JiraClient.get_issue_details + + + + + +Node1->Node7 + + + + + +Node8 + + +penify_hook.jira_client. +JiraClient.update_issue +_status + + + + + +Node1->Node8 + + + + + +Node2->Node2 + + + + + +Node4->Node3 + + + + + +Node5->Node3 + + + + + +Node6->Node5 + + + + + +Node7->Node4 + + + + + +Node7->Node5 + + + + + diff --git a/docs/html/classpenify__hook_1_1jira__client_1_1JiraClient_a093d6456fe053ef7a7862d5d6851910c_cgraph.map b/docs/html/classpenify__hook_1_1jira__client_1_1JiraClient_a093d6456fe053ef7a7862d5d6851910c_cgraph.map new file mode 100644 index 0000000..d9cf631 --- /dev/null +++ b/docs/html/classpenify__hook_1_1jira__client_1_1JiraClient_a093d6456fe053ef7a7862d5d6851910c_cgraph.map @@ -0,0 +1,5 @@ + + + + + diff --git a/docs/html/classpenify__hook_1_1jira__client_1_1JiraClient_a093d6456fe053ef7a7862d5d6851910c_cgraph.md5 b/docs/html/classpenify__hook_1_1jira__client_1_1JiraClient_a093d6456fe053ef7a7862d5d6851910c_cgraph.md5 new file mode 100644 index 0000000..bf358a8 --- /dev/null +++ b/docs/html/classpenify__hook_1_1jira__client_1_1JiraClient_a093d6456fe053ef7a7862d5d6851910c_cgraph.md5 @@ -0,0 +1 @@ +c2b8f7eecd95ef8d0186d7f206ad610c \ No newline at end of file diff --git a/docs/html/classpenify__hook_1_1jira__client_1_1JiraClient_a093d6456fe053ef7a7862d5d6851910c_cgraph.svg b/docs/html/classpenify__hook_1_1jira__client_1_1JiraClient_a093d6456fe053ef7a7862d5d6851910c_cgraph.svg new file mode 100644 index 0000000..8f34c4a --- /dev/null +++ b/docs/html/classpenify__hook_1_1jira__client_1_1JiraClient_a093d6456fe053ef7a7862d5d6851910c_cgraph.svg @@ -0,0 +1,142 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +penify_hook.jira_client.JiraClient.extract_issue_keys_from_branch + + + +Node1 + + +penify_hook.jira_client. +JiraClient.extract_issue +_keys_from_branch + + + + + +Node2 + + +penify_hook.ui_utils.print_info + + + + + +Node1->Node2 + + + + + +Node3 + + +penify_hook.ui_utils.format_info + + + + + +Node2->Node3 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/html/classpenify__hook_1_1jira__client_1_1JiraClient_a093d6456fe053ef7a7862d5d6851910c_cgraph_org.svg b/docs/html/classpenify__hook_1_1jira__client_1_1JiraClient_a093d6456fe053ef7a7862d5d6851910c_cgraph_org.svg new file mode 100644 index 0000000..b16e395 --- /dev/null +++ b/docs/html/classpenify__hook_1_1jira__client_1_1JiraClient_a093d6456fe053ef7a7862d5d6851910c_cgraph_org.svg @@ -0,0 +1,54 @@ + + + + + + +penify_hook.jira_client.JiraClient.extract_issue_keys_from_branch + + + +Node1 + + +penify_hook.jira_client. +JiraClient.extract_issue +_keys_from_branch + + + + + +Node2 + + +penify_hook.ui_utils.print_info + + + + + +Node1->Node2 + + + + + +Node3 + + +penify_hook.ui_utils.format_info + + + + + +Node2->Node3 + + + + + diff --git a/docs/html/classpenify__hook_1_1jira__client_1_1JiraClient_a49ea1149758f7f5212149d357b13cc23_cgraph.map b/docs/html/classpenify__hook_1_1jira__client_1_1JiraClient_a49ea1149758f7f5212149d357b13cc23_cgraph.map new file mode 100644 index 0000000..18d2610 --- /dev/null +++ b/docs/html/classpenify__hook_1_1jira__client_1_1JiraClient_a49ea1149758f7f5212149d357b13cc23_cgraph.map @@ -0,0 +1,6 @@ + + + + + + diff --git a/docs/html/classpenify__hook_1_1jira__client_1_1JiraClient_a49ea1149758f7f5212149d357b13cc23_cgraph.md5 b/docs/html/classpenify__hook_1_1jira__client_1_1JiraClient_a49ea1149758f7f5212149d357b13cc23_cgraph.md5 new file mode 100644 index 0000000..c70fc7f --- /dev/null +++ b/docs/html/classpenify__hook_1_1jira__client_1_1JiraClient_a49ea1149758f7f5212149d357b13cc23_cgraph.md5 @@ -0,0 +1 @@ +3fdd0ff288b79c613c0ccbdde81f6b44 \ No newline at end of file diff --git a/docs/html/classpenify__hook_1_1jira__client_1_1JiraClient_a49ea1149758f7f5212149d357b13cc23_cgraph.svg b/docs/html/classpenify__hook_1_1jira__client_1_1JiraClient_a49ea1149758f7f5212149d357b13cc23_cgraph.svg new file mode 100644 index 0000000..da43481 --- /dev/null +++ b/docs/html/classpenify__hook_1_1jira__client_1_1JiraClient_a49ea1149758f7f5212149d357b13cc23_cgraph.svg @@ -0,0 +1,166 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +penify_hook.jira_client.JiraClient.format_commit_message_with_jira_info + + + +Node1 + + +penify_hook.jira_client. +JiraClient.format_commit +_message_with_jira_info + + + + + +Node2 + + +penify_hook.jira_client. +JiraClient.extract_issue_keys + + + + + +Node1->Node2 + + + + + +Node3 + + +penify_hook.jira_client. +JiraClient.get_issue_details + + + + + +Node1->Node3 + + + + + +Node4 + + +penify_hook.jira_client. +JiraClient.is_connected + + + + + +Node1->Node4 + + + + + +Node3->Node4 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/html/classpenify__hook_1_1jira__client_1_1JiraClient_a49ea1149758f7f5212149d357b13cc23_cgraph_org.svg b/docs/html/classpenify__hook_1_1jira__client_1_1JiraClient_a49ea1149758f7f5212149d357b13cc23_cgraph_org.svg new file mode 100644 index 0000000..d90f209 --- /dev/null +++ b/docs/html/classpenify__hook_1_1jira__client_1_1JiraClient_a49ea1149758f7f5212149d357b13cc23_cgraph_org.svg @@ -0,0 +1,78 @@ + + + + + + +penify_hook.jira_client.JiraClient.format_commit_message_with_jira_info + + + +Node1 + + +penify_hook.jira_client. +JiraClient.format_commit +_message_with_jira_info + + + + + +Node2 + + +penify_hook.jira_client. +JiraClient.extract_issue_keys + + + + + +Node1->Node2 + + + + + +Node3 + + +penify_hook.jira_client. +JiraClient.get_issue_details + + + + + +Node1->Node3 + + + + + +Node4 + + +penify_hook.jira_client. +JiraClient.is_connected + + + + + +Node1->Node4 + + + + + +Node3->Node4 + + + + + diff --git a/docs/html/classpenify__hook_1_1jira__client_1_1JiraClient_a49ea1149758f7f5212149d357b13cc23_icgraph.map b/docs/html/classpenify__hook_1_1jira__client_1_1JiraClient_a49ea1149758f7f5212149d357b13cc23_icgraph.map new file mode 100644 index 0000000..9762fa4 --- /dev/null +++ b/docs/html/classpenify__hook_1_1jira__client_1_1JiraClient_a49ea1149758f7f5212149d357b13cc23_icgraph.map @@ -0,0 +1,4 @@ + + + + diff --git a/docs/html/classpenify__hook_1_1jira__client_1_1JiraClient_a49ea1149758f7f5212149d357b13cc23_icgraph.md5 b/docs/html/classpenify__hook_1_1jira__client_1_1JiraClient_a49ea1149758f7f5212149d357b13cc23_icgraph.md5 new file mode 100644 index 0000000..58d4f7d --- /dev/null +++ b/docs/html/classpenify__hook_1_1jira__client_1_1JiraClient_a49ea1149758f7f5212149d357b13cc23_icgraph.md5 @@ -0,0 +1 @@ +e64b34f639342bc29f69697ff85b6115 \ No newline at end of file diff --git a/docs/html/classpenify__hook_1_1jira__client_1_1JiraClient_a49ea1149758f7f5212149d357b13cc23_icgraph.svg b/docs/html/classpenify__hook_1_1jira__client_1_1JiraClient_a49ea1149758f7f5212149d357b13cc23_icgraph.svg new file mode 100644 index 0000000..bff31d2 --- /dev/null +++ b/docs/html/classpenify__hook_1_1jira__client_1_1JiraClient_a49ea1149758f7f5212149d357b13cc23_icgraph.svg @@ -0,0 +1,41 @@ + + + + + + +penify_hook.jira_client.JiraClient.format_commit_message_with_jira_info + + + +Node1 + + +penify_hook.jira_client. +JiraClient.format_commit +_message_with_jira_info + + + + + +Node2 + + +penify_hook.jira_client. +JiraClient.enhance_commit +_message + + + + + +Node1->Node2 + + + + + diff --git a/docs/html/classpenify__hook_1_1jira__client_1_1JiraClient_a65f6924819084b7c8d268956a784804a_cgraph.map b/docs/html/classpenify__hook_1_1jira__client_1_1JiraClient_a65f6924819084b7c8d268956a784804a_cgraph.map new file mode 100644 index 0000000..3b9c39b --- /dev/null +++ b/docs/html/classpenify__hook_1_1jira__client_1_1JiraClient_a65f6924819084b7c8d268956a784804a_cgraph.map @@ -0,0 +1,4 @@ + + + + diff --git a/docs/html/classpenify__hook_1_1jira__client_1_1JiraClient_a65f6924819084b7c8d268956a784804a_cgraph.md5 b/docs/html/classpenify__hook_1_1jira__client_1_1JiraClient_a65f6924819084b7c8d268956a784804a_cgraph.md5 new file mode 100644 index 0000000..e84f7d7 --- /dev/null +++ b/docs/html/classpenify__hook_1_1jira__client_1_1JiraClient_a65f6924819084b7c8d268956a784804a_cgraph.md5 @@ -0,0 +1 @@ +ce0d7d39675e66eb580380759195be0e \ No newline at end of file diff --git a/docs/html/classpenify__hook_1_1jira__client_1_1JiraClient_a65f6924819084b7c8d268956a784804a_cgraph.svg b/docs/html/classpenify__hook_1_1jira__client_1_1JiraClient_a65f6924819084b7c8d268956a784804a_cgraph.svg new file mode 100644 index 0000000..4ad6e4c --- /dev/null +++ b/docs/html/classpenify__hook_1_1jira__client_1_1JiraClient_a65f6924819084b7c8d268956a784804a_cgraph.svg @@ -0,0 +1,39 @@ + + + + + + +penify_hook.jira_client.JiraClient.get_issue_details + + + +Node1 + + +penify_hook.jira_client. +JiraClient.get_issue_details + + + + + +Node2 + + +penify_hook.jira_client. +JiraClient.is_connected + + + + + +Node1->Node2 + + + + + diff --git a/docs/html/classpenify__hook_1_1jira__client_1_1JiraClient_a65f6924819084b7c8d268956a784804a_icgraph.map b/docs/html/classpenify__hook_1_1jira__client_1_1JiraClient_a65f6924819084b7c8d268956a784804a_icgraph.map new file mode 100644 index 0000000..7074523 --- /dev/null +++ b/docs/html/classpenify__hook_1_1jira__client_1_1JiraClient_a65f6924819084b7c8d268956a784804a_icgraph.map @@ -0,0 +1,6 @@ + + + + + + diff --git a/docs/html/classpenify__hook_1_1jira__client_1_1JiraClient_a65f6924819084b7c8d268956a784804a_icgraph.md5 b/docs/html/classpenify__hook_1_1jira__client_1_1JiraClient_a65f6924819084b7c8d268956a784804a_icgraph.md5 new file mode 100644 index 0000000..584c012 --- /dev/null +++ b/docs/html/classpenify__hook_1_1jira__client_1_1JiraClient_a65f6924819084b7c8d268956a784804a_icgraph.md5 @@ -0,0 +1 @@ +b4d0f6392752d140ca4858cea5527f74 \ No newline at end of file diff --git a/docs/html/classpenify__hook_1_1jira__client_1_1JiraClient_a65f6924819084b7c8d268956a784804a_icgraph.svg b/docs/html/classpenify__hook_1_1jira__client_1_1JiraClient_a65f6924819084b7c8d268956a784804a_icgraph.svg new file mode 100644 index 0000000..0945c22 --- /dev/null +++ b/docs/html/classpenify__hook_1_1jira__client_1_1JiraClient_a65f6924819084b7c8d268956a784804a_icgraph.svg @@ -0,0 +1,168 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +penify_hook.jira_client.JiraClient.get_issue_details + + + +Node1 + + +penify_hook.jira_client. +JiraClient.get_issue_details + + + + + +Node2 + + +penify_hook.jira_client. +JiraClient.format_commit +_message_with_jira_info + + + + + +Node1->Node2 + + + + + +Node4 + + +penify_hook.jira_client. +JiraClient.get_commit +_context_from_issues + + + + + +Node1->Node4 + + + + + +Node3 + + +penify_hook.jira_client. +JiraClient.enhance_commit +_message + + + + + +Node2->Node3 + + + + + +Node4->Node3 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/html/classpenify__hook_1_1jira__client_1_1JiraClient_a65f6924819084b7c8d268956a784804a_icgraph_org.svg b/docs/html/classpenify__hook_1_1jira__client_1_1JiraClient_a65f6924819084b7c8d268956a784804a_icgraph_org.svg new file mode 100644 index 0000000..6d9824e --- /dev/null +++ b/docs/html/classpenify__hook_1_1jira__client_1_1JiraClient_a65f6924819084b7c8d268956a784804a_icgraph_org.svg @@ -0,0 +1,80 @@ + + + + + + +penify_hook.jira_client.JiraClient.get_issue_details + + + +Node1 + + +penify_hook.jira_client. +JiraClient.get_issue_details + + + + + +Node2 + + +penify_hook.jira_client. +JiraClient.format_commit +_message_with_jira_info + + + + + +Node1->Node2 + + + + + +Node4 + + +penify_hook.jira_client. +JiraClient.get_commit +_context_from_issues + + + + + +Node1->Node4 + + + + + +Node3 + + +penify_hook.jira_client. +JiraClient.enhance_commit +_message + + + + + +Node2->Node3 + + + + + +Node4->Node3 + + + + + diff --git a/docs/html/classpenify__hook_1_1jira__client_1_1JiraClient_a70d2c5a6432aa6f238da0ff65d49a760_cgraph.map b/docs/html/classpenify__hook_1_1jira__client_1_1JiraClient_a70d2c5a6432aa6f238da0ff65d49a760_cgraph.map new file mode 100644 index 0000000..9fb10de --- /dev/null +++ b/docs/html/classpenify__hook_1_1jira__client_1_1JiraClient_a70d2c5a6432aa6f238da0ff65d49a760_cgraph.map @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/docs/html/classpenify__hook_1_1jira__client_1_1JiraClient_a70d2c5a6432aa6f238da0ff65d49a760_cgraph.md5 b/docs/html/classpenify__hook_1_1jira__client_1_1JiraClient_a70d2c5a6432aa6f238da0ff65d49a760_cgraph.md5 new file mode 100644 index 0000000..d953518 --- /dev/null +++ b/docs/html/classpenify__hook_1_1jira__client_1_1JiraClient_a70d2c5a6432aa6f238da0ff65d49a760_cgraph.md5 @@ -0,0 +1 @@ +9194291c6b536fb2aa39473066ce3d57 \ No newline at end of file diff --git a/docs/html/classpenify__hook_1_1jira__client_1_1JiraClient_a70d2c5a6432aa6f238da0ff65d49a760_cgraph.svg b/docs/html/classpenify__hook_1_1jira__client_1_1JiraClient_a70d2c5a6432aa6f238da0ff65d49a760_cgraph.svg new file mode 100644 index 0000000..036f520 --- /dev/null +++ b/docs/html/classpenify__hook_1_1jira__client_1_1JiraClient_a70d2c5a6432aa6f238da0ff65d49a760_cgraph.svg @@ -0,0 +1,241 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +penify_hook.jira_client.JiraClient.enhance_commit_message + + + +Node1 + + +penify_hook.jira_client. +JiraClient.enhance_commit +_message + + + + + +Node2 + + +penify_hook.jira_client. +JiraClient.format_commit +_message_with_jira_info + + + + + +Node1->Node2 + + + + + +Node5 + + +penify_hook.jira_client. +JiraClient.is_connected + + + + + +Node1->Node5 + + + + + +Node6 + + +penify_hook.jira_client. +JiraClient.get_commit +_context_from_issues + + + + + +Node1->Node6 + + + + + +Node3 + + +penify_hook.jira_client. +JiraClient.extract_issue_keys + + + + + +Node2->Node3 + + + + + +Node4 + + +penify_hook.jira_client. +JiraClient.get_issue_details + + + + + +Node2->Node4 + + + + + +Node2->Node5 + + + + + +Node4->Node5 + + + + + +Node6->Node4 + + + + + +Node6->Node5 + + + + + +Node7 + + +penify_hook.jira_client. +JiraClient.get_detailed +_issue_context + + + + + +Node6->Node7 + + + + + +Node7->Node5 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/html/classpenify__hook_1_1jira__client_1_1JiraClient_a70d2c5a6432aa6f238da0ff65d49a760_cgraph_org.svg b/docs/html/classpenify__hook_1_1jira__client_1_1JiraClient_a70d2c5a6432aa6f238da0ff65d49a760_cgraph_org.svg new file mode 100644 index 0000000..9f7cbe1 --- /dev/null +++ b/docs/html/classpenify__hook_1_1jira__client_1_1JiraClient_a70d2c5a6432aa6f238da0ff65d49a760_cgraph_org.svg @@ -0,0 +1,153 @@ + + + + + + +penify_hook.jira_client.JiraClient.enhance_commit_message + + + +Node1 + + +penify_hook.jira_client. +JiraClient.enhance_commit +_message + + + + + +Node2 + + +penify_hook.jira_client. +JiraClient.format_commit +_message_with_jira_info + + + + + +Node1->Node2 + + + + + +Node5 + + +penify_hook.jira_client. +JiraClient.is_connected + + + + + +Node1->Node5 + + + + + +Node6 + + +penify_hook.jira_client. +JiraClient.get_commit +_context_from_issues + + + + + +Node1->Node6 + + + + + +Node3 + + +penify_hook.jira_client. +JiraClient.extract_issue_keys + + + + + +Node2->Node3 + + + + + +Node4 + + +penify_hook.jira_client. +JiraClient.get_issue_details + + + + + +Node2->Node4 + + + + + +Node2->Node5 + + + + + +Node4->Node5 + + + + + +Node6->Node4 + + + + + +Node6->Node5 + + + + + +Node7 + + +penify_hook.jira_client. +JiraClient.get_detailed +_issue_context + + + + + +Node6->Node7 + + + + + +Node7->Node5 + + + + + diff --git a/docs/html/classpenify__hook_1_1jira__client_1_1JiraClient_aa1f374116c64cd5f1492ec7f7e40f9c1_cgraph.map b/docs/html/classpenify__hook_1_1jira__client_1_1JiraClient_aa1f374116c64cd5f1492ec7f7e40f9c1_cgraph.map new file mode 100644 index 0000000..f7e25fe --- /dev/null +++ b/docs/html/classpenify__hook_1_1jira__client_1_1JiraClient_aa1f374116c64cd5f1492ec7f7e40f9c1_cgraph.map @@ -0,0 +1,4 @@ + + + + diff --git a/docs/html/classpenify__hook_1_1jira__client_1_1JiraClient_aa1f374116c64cd5f1492ec7f7e40f9c1_cgraph.md5 b/docs/html/classpenify__hook_1_1jira__client_1_1JiraClient_aa1f374116c64cd5f1492ec7f7e40f9c1_cgraph.md5 new file mode 100644 index 0000000..ea4f60f --- /dev/null +++ b/docs/html/classpenify__hook_1_1jira__client_1_1JiraClient_aa1f374116c64cd5f1492ec7f7e40f9c1_cgraph.md5 @@ -0,0 +1 @@ +01a09828002214953a0e4ce5a004f82b \ No newline at end of file diff --git a/docs/html/classpenify__hook_1_1jira__client_1_1JiraClient_aa1f374116c64cd5f1492ec7f7e40f9c1_cgraph.svg b/docs/html/classpenify__hook_1_1jira__client_1_1JiraClient_aa1f374116c64cd5f1492ec7f7e40f9c1_cgraph.svg new file mode 100644 index 0000000..6bfdd52 --- /dev/null +++ b/docs/html/classpenify__hook_1_1jira__client_1_1JiraClient_aa1f374116c64cd5f1492ec7f7e40f9c1_cgraph.svg @@ -0,0 +1,45 @@ + + + + + + +penify_hook.jira_client.JiraClient.add_comment + + + +Node1 + + +penify_hook.jira_client. +JiraClient.add_comment + + + + + +Node1->Node1 + + + + + +Node2 + + +penify_hook.jira_client. +JiraClient.is_connected + + + + + +Node1->Node2 + + + + + diff --git a/docs/html/classpenify__hook_1_1jira__client_1_1JiraClient_aa1f374116c64cd5f1492ec7f7e40f9c1_icgraph.map b/docs/html/classpenify__hook_1_1jira__client_1_1JiraClient_aa1f374116c64cd5f1492ec7f7e40f9c1_icgraph.map new file mode 100644 index 0000000..a54aa35 --- /dev/null +++ b/docs/html/classpenify__hook_1_1jira__client_1_1JiraClient_aa1f374116c64cd5f1492ec7f7e40f9c1_icgraph.map @@ -0,0 +1,3 @@ + + + diff --git a/docs/html/classpenify__hook_1_1jira__client_1_1JiraClient_aa1f374116c64cd5f1492ec7f7e40f9c1_icgraph.md5 b/docs/html/classpenify__hook_1_1jira__client_1_1JiraClient_aa1f374116c64cd5f1492ec7f7e40f9c1_icgraph.md5 new file mode 100644 index 0000000..8cce519 --- /dev/null +++ b/docs/html/classpenify__hook_1_1jira__client_1_1JiraClient_aa1f374116c64cd5f1492ec7f7e40f9c1_icgraph.md5 @@ -0,0 +1 @@ +be0799c63ed63825acfa4aefd053a607 \ No newline at end of file diff --git a/docs/html/classpenify__hook_1_1jira__client_1_1JiraClient_aa1f374116c64cd5f1492ec7f7e40f9c1_icgraph.svg b/docs/html/classpenify__hook_1_1jira__client_1_1JiraClient_aa1f374116c64cd5f1492ec7f7e40f9c1_icgraph.svg new file mode 100644 index 0000000..dcc9f2d --- /dev/null +++ b/docs/html/classpenify__hook_1_1jira__client_1_1JiraClient_aa1f374116c64cd5f1492ec7f7e40f9c1_icgraph.svg @@ -0,0 +1,29 @@ + + + + + + +penify_hook.jira_client.JiraClient.add_comment + + + +Node1 + + +penify_hook.jira_client. +JiraClient.add_comment + + + + + +Node1->Node1 + + + + + diff --git a/docs/html/classpenify__hook_1_1jira__client_1_1JiraClient_aa967169a4b7970c67c0947b9ac56f746_cgraph.map b/docs/html/classpenify__hook_1_1jira__client_1_1JiraClient_aa967169a4b7970c67c0947b9ac56f746_cgraph.map new file mode 100644 index 0000000..2e5bc9c --- /dev/null +++ b/docs/html/classpenify__hook_1_1jira__client_1_1JiraClient_aa967169a4b7970c67c0947b9ac56f746_cgraph.map @@ -0,0 +1,4 @@ + + + + diff --git a/docs/html/classpenify__hook_1_1jira__client_1_1JiraClient_aa967169a4b7970c67c0947b9ac56f746_cgraph.md5 b/docs/html/classpenify__hook_1_1jira__client_1_1JiraClient_aa967169a4b7970c67c0947b9ac56f746_cgraph.md5 new file mode 100644 index 0000000..562794f --- /dev/null +++ b/docs/html/classpenify__hook_1_1jira__client_1_1JiraClient_aa967169a4b7970c67c0947b9ac56f746_cgraph.md5 @@ -0,0 +1 @@ +de5b0ac337604f2c79dc74aaee0a1763 \ No newline at end of file diff --git a/docs/html/classpenify__hook_1_1jira__client_1_1JiraClient_aa967169a4b7970c67c0947b9ac56f746_cgraph.svg b/docs/html/classpenify__hook_1_1jira__client_1_1JiraClient_aa967169a4b7970c67c0947b9ac56f746_cgraph.svg new file mode 100644 index 0000000..d83a7d1 --- /dev/null +++ b/docs/html/classpenify__hook_1_1jira__client_1_1JiraClient_aa967169a4b7970c67c0947b9ac56f746_cgraph.svg @@ -0,0 +1,40 @@ + + + + + + +penify_hook.jira_client.JiraClient.get_detailed_issue_context + + + +Node1 + + +penify_hook.jira_client. +JiraClient.get_detailed +_issue_context + + + + + +Node2 + + +penify_hook.jira_client. +JiraClient.is_connected + + + + + +Node1->Node2 + + + + + diff --git a/docs/html/classpenify__hook_1_1jira__client_1_1JiraClient_aa967169a4b7970c67c0947b9ac56f746_icgraph.map b/docs/html/classpenify__hook_1_1jira__client_1_1JiraClient_aa967169a4b7970c67c0947b9ac56f746_icgraph.map new file mode 100644 index 0000000..7028556 --- /dev/null +++ b/docs/html/classpenify__hook_1_1jira__client_1_1JiraClient_aa967169a4b7970c67c0947b9ac56f746_icgraph.map @@ -0,0 +1,5 @@ + + + + + diff --git a/docs/html/classpenify__hook_1_1jira__client_1_1JiraClient_aa967169a4b7970c67c0947b9ac56f746_icgraph.md5 b/docs/html/classpenify__hook_1_1jira__client_1_1JiraClient_aa967169a4b7970c67c0947b9ac56f746_icgraph.md5 new file mode 100644 index 0000000..cc19180 --- /dev/null +++ b/docs/html/classpenify__hook_1_1jira__client_1_1JiraClient_aa967169a4b7970c67c0947b9ac56f746_icgraph.md5 @@ -0,0 +1 @@ +8ed68fcd41631bf9876f85ae6b4b3de2 \ No newline at end of file diff --git a/docs/html/classpenify__hook_1_1jira__client_1_1JiraClient_aa967169a4b7970c67c0947b9ac56f746_icgraph.svg b/docs/html/classpenify__hook_1_1jira__client_1_1JiraClient_aa967169a4b7970c67c0947b9ac56f746_icgraph.svg new file mode 100644 index 0000000..06c5c4d --- /dev/null +++ b/docs/html/classpenify__hook_1_1jira__client_1_1JiraClient_aa967169a4b7970c67c0947b9ac56f746_icgraph.svg @@ -0,0 +1,58 @@ + + + + + + +penify_hook.jira_client.JiraClient.get_detailed_issue_context + + + +Node1 + + +penify_hook.jira_client. +JiraClient.get_detailed +_issue_context + + + + + +Node2 + + +penify_hook.jira_client. +JiraClient.get_commit +_context_from_issues + + + + + +Node1->Node2 + + + + + +Node3 + + +penify_hook.jira_client. +JiraClient.enhance_commit +_message + + + + + +Node2->Node3 + + + + + diff --git a/docs/html/classpenify__hook_1_1jira__client_1_1JiraClient_aca8837552d37bfd611de23441a240826_cgraph.map b/docs/html/classpenify__hook_1_1jira__client_1_1JiraClient_aca8837552d37bfd611de23441a240826_cgraph.map new file mode 100644 index 0000000..75c520f --- /dev/null +++ b/docs/html/classpenify__hook_1_1jira__client_1_1JiraClient_aca8837552d37bfd611de23441a240826_cgraph.map @@ -0,0 +1,4 @@ + + + + diff --git a/docs/html/classpenify__hook_1_1jira__client_1_1JiraClient_aca8837552d37bfd611de23441a240826_cgraph.md5 b/docs/html/classpenify__hook_1_1jira__client_1_1JiraClient_aca8837552d37bfd611de23441a240826_cgraph.md5 new file mode 100644 index 0000000..b855a20 --- /dev/null +++ b/docs/html/classpenify__hook_1_1jira__client_1_1JiraClient_aca8837552d37bfd611de23441a240826_cgraph.md5 @@ -0,0 +1 @@ +2e42fe22a9070fc3f543991e99faf205 \ No newline at end of file diff --git a/docs/html/classpenify__hook_1_1jira__client_1_1JiraClient_aca8837552d37bfd611de23441a240826_cgraph.svg b/docs/html/classpenify__hook_1_1jira__client_1_1JiraClient_aca8837552d37bfd611de23441a240826_cgraph.svg new file mode 100644 index 0000000..e1b859e --- /dev/null +++ b/docs/html/classpenify__hook_1_1jira__client_1_1JiraClient_aca8837552d37bfd611de23441a240826_cgraph.svg @@ -0,0 +1,40 @@ + + + + + + +penify_hook.jira_client.JiraClient.update_issue_status + + + +Node1 + + +penify_hook.jira_client. +JiraClient.update_issue +_status + + + + + +Node2 + + +penify_hook.jira_client. +JiraClient.is_connected + + + + + +Node1->Node2 + + + + + diff --git a/docs/html/classpenify__hook_1_1jira__client_1_1JiraClient_ad2823ad1d3baaedd38039913c3a97fd7_icgraph.map b/docs/html/classpenify__hook_1_1jira__client_1_1JiraClient_ad2823ad1d3baaedd38039913c3a97fd7_icgraph.map new file mode 100644 index 0000000..3722ccb --- /dev/null +++ b/docs/html/classpenify__hook_1_1jira__client_1_1JiraClient_ad2823ad1d3baaedd38039913c3a97fd7_icgraph.map @@ -0,0 +1,5 @@ + + + + + diff --git a/docs/html/classpenify__hook_1_1jira__client_1_1JiraClient_ad2823ad1d3baaedd38039913c3a97fd7_icgraph.md5 b/docs/html/classpenify__hook_1_1jira__client_1_1JiraClient_ad2823ad1d3baaedd38039913c3a97fd7_icgraph.md5 new file mode 100644 index 0000000..f452c00 --- /dev/null +++ b/docs/html/classpenify__hook_1_1jira__client_1_1JiraClient_ad2823ad1d3baaedd38039913c3a97fd7_icgraph.md5 @@ -0,0 +1 @@ +f5fed9d6bb8f646e32b31343d031871d \ No newline at end of file diff --git a/docs/html/classpenify__hook_1_1jira__client_1_1JiraClient_ad2823ad1d3baaedd38039913c3a97fd7_icgraph.svg b/docs/html/classpenify__hook_1_1jira__client_1_1JiraClient_ad2823ad1d3baaedd38039913c3a97fd7_icgraph.svg new file mode 100644 index 0000000..b80a9d9 --- /dev/null +++ b/docs/html/classpenify__hook_1_1jira__client_1_1JiraClient_ad2823ad1d3baaedd38039913c3a97fd7_icgraph.svg @@ -0,0 +1,145 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +penify_hook.jira_client.JiraClient.extract_issue_keys + + + +Node1 + + +penify_hook.jira_client. +JiraClient.extract_issue_keys + + + + + +Node2 + + +penify_hook.jira_client. +JiraClient.format_commit +_message_with_jira_info + + + + + +Node1->Node2 + + + + + +Node3 + + +penify_hook.jira_client. +JiraClient.enhance_commit +_message + + + + + +Node2->Node3 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/html/classpenify__hook_1_1jira__client_1_1JiraClient_ad2823ad1d3baaedd38039913c3a97fd7_icgraph_org.svg b/docs/html/classpenify__hook_1_1jira__client_1_1JiraClient_ad2823ad1d3baaedd38039913c3a97fd7_icgraph_org.svg new file mode 100644 index 0000000..1e3bc11 --- /dev/null +++ b/docs/html/classpenify__hook_1_1jira__client_1_1JiraClient_ad2823ad1d3baaedd38039913c3a97fd7_icgraph_org.svg @@ -0,0 +1,57 @@ + + + + + + +penify_hook.jira_client.JiraClient.extract_issue_keys + + + +Node1 + + +penify_hook.jira_client. +JiraClient.extract_issue_keys + + + + + +Node2 + + +penify_hook.jira_client. +JiraClient.format_commit +_message_with_jira_info + + + + + +Node1->Node2 + + + + + +Node3 + + +penify_hook.jira_client. +JiraClient.enhance_commit +_message + + + + + +Node2->Node3 + + + + + diff --git a/docs/html/classpenify__hook_1_1jira__client_1_1JiraClient_afb41ce6f13c30b1265d439ddf04bf2cd_cgraph.map b/docs/html/classpenify__hook_1_1jira__client_1_1JiraClient_afb41ce6f13c30b1265d439ddf04bf2cd_cgraph.map new file mode 100644 index 0000000..b89125f --- /dev/null +++ b/docs/html/classpenify__hook_1_1jira__client_1_1JiraClient_afb41ce6f13c30b1265d439ddf04bf2cd_cgraph.map @@ -0,0 +1,6 @@ + + + + + + diff --git a/docs/html/classpenify__hook_1_1jira__client_1_1JiraClient_afb41ce6f13c30b1265d439ddf04bf2cd_cgraph.md5 b/docs/html/classpenify__hook_1_1jira__client_1_1JiraClient_afb41ce6f13c30b1265d439ddf04bf2cd_cgraph.md5 new file mode 100644 index 0000000..990f237 --- /dev/null +++ b/docs/html/classpenify__hook_1_1jira__client_1_1JiraClient_afb41ce6f13c30b1265d439ddf04bf2cd_cgraph.md5 @@ -0,0 +1 @@ +e8676c5f3006c0807c1fe30ed75a7701 \ No newline at end of file diff --git a/docs/html/classpenify__hook_1_1jira__client_1_1JiraClient_afb41ce6f13c30b1265d439ddf04bf2cd_cgraph.svg b/docs/html/classpenify__hook_1_1jira__client_1_1JiraClient_afb41ce6f13c30b1265d439ddf04bf2cd_cgraph.svg new file mode 100644 index 0000000..0587bf7 --- /dev/null +++ b/docs/html/classpenify__hook_1_1jira__client_1_1JiraClient_afb41ce6f13c30b1265d439ddf04bf2cd_cgraph.svg @@ -0,0 +1,85 @@ + + + + + + +penify_hook.jira_client.JiraClient.get_commit_context_from_issues + + + +Node1 + + +penify_hook.jira_client. +JiraClient.get_commit +_context_from_issues + + + + + +Node2 + + +penify_hook.jira_client. +JiraClient.get_detailed +_issue_context + + + + + +Node1->Node2 + + + + + +Node3 + + +penify_hook.jira_client. +JiraClient.is_connected + + + + + +Node1->Node3 + + + + + +Node4 + + +penify_hook.jira_client. +JiraClient.get_issue_details + + + + + +Node1->Node4 + + + + + +Node2->Node3 + + + + + +Node4->Node3 + + + + + diff --git a/docs/html/classpenify__hook_1_1jira__client_1_1JiraClient_afb41ce6f13c30b1265d439ddf04bf2cd_icgraph.map b/docs/html/classpenify__hook_1_1jira__client_1_1JiraClient_afb41ce6f13c30b1265d439ddf04bf2cd_icgraph.map new file mode 100644 index 0000000..5f09a4a --- /dev/null +++ b/docs/html/classpenify__hook_1_1jira__client_1_1JiraClient_afb41ce6f13c30b1265d439ddf04bf2cd_icgraph.map @@ -0,0 +1,4 @@ + + + + diff --git a/docs/html/classpenify__hook_1_1jira__client_1_1JiraClient_afb41ce6f13c30b1265d439ddf04bf2cd_icgraph.md5 b/docs/html/classpenify__hook_1_1jira__client_1_1JiraClient_afb41ce6f13c30b1265d439ddf04bf2cd_icgraph.md5 new file mode 100644 index 0000000..3221326 --- /dev/null +++ b/docs/html/classpenify__hook_1_1jira__client_1_1JiraClient_afb41ce6f13c30b1265d439ddf04bf2cd_icgraph.md5 @@ -0,0 +1 @@ +8e9085e7e96a72eae434ab3b9bb34f71 \ No newline at end of file diff --git a/docs/html/classpenify__hook_1_1jira__client_1_1JiraClient_afb41ce6f13c30b1265d439ddf04bf2cd_icgraph.svg b/docs/html/classpenify__hook_1_1jira__client_1_1JiraClient_afb41ce6f13c30b1265d439ddf04bf2cd_icgraph.svg new file mode 100644 index 0000000..bd95f00 --- /dev/null +++ b/docs/html/classpenify__hook_1_1jira__client_1_1JiraClient_afb41ce6f13c30b1265d439ddf04bf2cd_icgraph.svg @@ -0,0 +1,41 @@ + + + + + + +penify_hook.jira_client.JiraClient.get_commit_context_from_issues + + + +Node1 + + +penify_hook.jira_client. +JiraClient.get_commit +_context_from_issues + + + + + +Node2 + + +penify_hook.jira_client. +JiraClient.enhance_commit +_message + + + + + +Node1->Node2 + + + + + diff --git a/docs/html/classpenify__hook_1_1llm__client_1_1LLMClient-members.html b/docs/html/classpenify__hook_1_1llm__client_1_1LLMClient-members.html new file mode 100644 index 0000000..de4243c --- /dev/null +++ b/docs/html/classpenify__hook_1_1llm__client_1_1LLMClient-members.html @@ -0,0 +1,137 @@ + + + + + + + + + + + + + + + + + + +penify-cli: Member List + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
penify-cli +
+
+
+ + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
penify_hook.llm_client.LLMClient Member List
+
+
+ +

This is the complete list of members for penify_hook.llm_client.LLMClient, including all inherited members.

+ + + + + + +
__init__(self, str model=None, str api_base=None, str api_key=None)penify_hook.llm_client.LLMClient
_litellmpenify_hook.llm_client.LLMClientprivate
generate_commit_summary(self, str diff, str message, bool generate_description, Dict repo_details, Dict jira_context=None)penify_hook.llm_client.LLMClient
litellm(self)penify_hook.llm_client.LLMClient
modelpenify_hook.llm_client.LLMClient
+
+ + + + + diff --git a/docs/html/classpenify__hook_1_1llm__client_1_1LLMClient.html b/docs/html/classpenify__hook_1_1llm__client_1_1LLMClient.html new file mode 100644 index 0000000..43d18ed --- /dev/null +++ b/docs/html/classpenify__hook_1_1llm__client_1_1LLMClient.html @@ -0,0 +1,360 @@ + + + + + + + + + + + + + + + + + + +penify-cli: penify_hook.llm_client.LLMClient Class Reference + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
penify-cli +
+
+
+ + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+ +
penify_hook.llm_client.LLMClient Class Reference
+
+
+
+Collaboration diagram for penify_hook.llm_client.LLMClient:
+
+
+
+
+ + + + + + + + +

+Public Member Functions

def __init__ (self, str model=None, str api_base=None, str api_key=None)
 
def litellm (self)
 
Dict generate_commit_summary (self, str diff, str message, bool generate_description, Dict repo_details, Dict jira_context=None)
 
+ + + +

+Public Attributes

 model
 
+ + + +

+Private Attributes

 _litellm
 
+

Detailed Description

+
Client for interacting with LLM models using LiteLLM.
+

Constructor & Destructor Documentation

+ +

◆ __init__()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
def penify_hook.llm_client.LLMClient.__init__ ( self,
str  model = None,
str  api_base = None,
str  api_key = None 
)
+
+
Initialize the LLM client.
+
+Args:
+    model: LLM model to use (e.g., "gpt-4", "ollama/llama2", etc.)
+    api_base: Base URL for API requests (e.g., "http://localhost:11434" for Ollama)
+    api_key: API key for the LLM service
+
+
+
+

Member Function Documentation

+ +

◆ generate_commit_summary()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Dict penify_hook.llm_client.LLMClient.generate_commit_summary ( self,
str diff,
str message,
bool generate_description,
Dict repo_details,
Dict  jira_context = None 
)
+
+
Generate a concise and descriptive commit summary based on Git diff, user
+instructions, repository details, and optional JIRA context.
+
+This function constructs a prompt for an LLM to produce a commit title and, if
+requested, a detailed description. The summary adheres to Semantic Commit
+Messages guidelines. If JIRA context is provided, it enriches the prompt with
+relevant issue information.
+
+Args:
+    diff (str): Git diff of changes.
+    message (str): User-provided commit message or instructions.
+    generate_description (bool): Flag indicating whether to include a detailed description in the summary.
+    repo_details (Dict): Details about the repository.
+    jira_context (Dict?): Optional JIRA issue context to enhance the summary.
+
+Returns:
+    Dict: A dictionary containing the title and description for the commit. If
+        `generate_description` is False, the 'description' key may be absent.
+
+Raises:
+    ValueError: If the LLM model is not configured.
+
+Here is the call graph for this function:
+
+
+
+
+
+Here is the caller graph for this function:
+
+
+
+
+ +
+
+ +

◆ litellm()

+ +
+
+ + + + + + + + +
def penify_hook.llm_client.LLMClient.litellm ( self)
+
+
Returns the litellm module, loading it if necessary.
+Here is the caller graph for this function:
+
+
+
+
+ +
+
+

Member Data Documentation

+ +

◆ _litellm

+ +
+
+ + + + + +
+ + + + +
penify_hook.llm_client.LLMClient._litellm
+
+private
+
+ +
+
+ +

◆ model

+ +
+
+ + + + +
penify_hook.llm_client.LLMClient.model
+
+ +
+
+
The documentation for this class was generated from the following file:
    +
  • /tmp/github_reposRepoArchDocGenContext/Penify-dev/penify-cli/penify_hook/llm_client.py
  • +
+
+
+ + + + + diff --git a/docs/html/classpenify__hook_1_1llm__client_1_1LLMClient.js b/docs/html/classpenify__hook_1_1llm__client_1_1LLMClient.js new file mode 100644 index 0000000..719b127 --- /dev/null +++ b/docs/html/classpenify__hook_1_1llm__client_1_1LLMClient.js @@ -0,0 +1,8 @@ +var classpenify__hook_1_1llm__client_1_1LLMClient = +[ + [ "__init__", "classpenify__hook_1_1llm__client_1_1LLMClient.html#a76d92354f585ab4bb291169f9f530764", null ], + [ "generate_commit_summary", "classpenify__hook_1_1llm__client_1_1LLMClient.html#a2ad3014dac466ee1d8e00306d0cf2000", null ], + [ "litellm", "classpenify__hook_1_1llm__client_1_1LLMClient.html#ad6f06658ca922793f879474f2234518e", null ], + [ "_litellm", "classpenify__hook_1_1llm__client_1_1LLMClient.html#a76c2e9805f805624ab9c55a9f1f8d362", null ], + [ "model", "classpenify__hook_1_1llm__client_1_1LLMClient.html#abc2cb6b1d6d9b5dc16401ca078ec8c10", null ] +]; \ No newline at end of file diff --git a/docs/html/classpenify__hook_1_1llm__client_1_1LLMClient__coll__graph.map b/docs/html/classpenify__hook_1_1llm__client_1_1LLMClient__coll__graph.map new file mode 100644 index 0000000..dcac6b2 --- /dev/null +++ b/docs/html/classpenify__hook_1_1llm__client_1_1LLMClient__coll__graph.map @@ -0,0 +1,3 @@ + + + diff --git a/docs/html/classpenify__hook_1_1llm__client_1_1LLMClient__coll__graph.md5 b/docs/html/classpenify__hook_1_1llm__client_1_1LLMClient__coll__graph.md5 new file mode 100644 index 0000000..6db17d2 --- /dev/null +++ b/docs/html/classpenify__hook_1_1llm__client_1_1LLMClient__coll__graph.md5 @@ -0,0 +1 @@ +98e4897c5b45a162671e50e760d299ce \ No newline at end of file diff --git a/docs/html/classpenify__hook_1_1llm__client_1_1LLMClient__coll__graph.svg b/docs/html/classpenify__hook_1_1llm__client_1_1LLMClient__coll__graph.svg new file mode 100644 index 0000000..40f016c --- /dev/null +++ b/docs/html/classpenify__hook_1_1llm__client_1_1LLMClient__coll__graph.svg @@ -0,0 +1,29 @@ + + + + + + +penify_hook.llm_client.LLMClient + + + +Node1 + + +penify_hook.llm_client.LLMClient + ++ model +- _litellm + ++ __init__() ++ litellm() ++ generate_commit_summary() + + + + + diff --git a/docs/html/classpenify__hook_1_1llm__client_1_1LLMClient_a2ad3014dac466ee1d8e00306d0cf2000_cgraph.map b/docs/html/classpenify__hook_1_1llm__client_1_1LLMClient_a2ad3014dac466ee1d8e00306d0cf2000_cgraph.map new file mode 100644 index 0000000..5d480bd --- /dev/null +++ b/docs/html/classpenify__hook_1_1llm__client_1_1LLMClient_a2ad3014dac466ee1d8e00306d0cf2000_cgraph.map @@ -0,0 +1,4 @@ + + + + diff --git a/docs/html/classpenify__hook_1_1llm__client_1_1LLMClient_a2ad3014dac466ee1d8e00306d0cf2000_cgraph.md5 b/docs/html/classpenify__hook_1_1llm__client_1_1LLMClient_a2ad3014dac466ee1d8e00306d0cf2000_cgraph.md5 new file mode 100644 index 0000000..5ae4b79 --- /dev/null +++ b/docs/html/classpenify__hook_1_1llm__client_1_1LLMClient_a2ad3014dac466ee1d8e00306d0cf2000_cgraph.md5 @@ -0,0 +1 @@ +3a38b34ed8236aa424f3ba243fba3cf0 \ No newline at end of file diff --git a/docs/html/classpenify__hook_1_1llm__client_1_1LLMClient_a2ad3014dac466ee1d8e00306d0cf2000_cgraph.svg b/docs/html/classpenify__hook_1_1llm__client_1_1LLMClient_a2ad3014dac466ee1d8e00306d0cf2000_cgraph.svg new file mode 100644 index 0000000..047611c --- /dev/null +++ b/docs/html/classpenify__hook_1_1llm__client_1_1LLMClient_a2ad3014dac466ee1d8e00306d0cf2000_cgraph.svg @@ -0,0 +1,38 @@ + + + + + + +penify_hook.llm_client.LLMClient.generate_commit_summary + + + +Node1 + + +penify_hook.llm_client.LLMClient.generate +_commit_summary + + + + + +Node2 + + +penify_hook.llm_client.LLMClient.litellm + + + + + +Node1->Node2 + + + + + diff --git a/docs/html/classpenify__hook_1_1llm__client_1_1LLMClient_a2ad3014dac466ee1d8e00306d0cf2000_icgraph.map b/docs/html/classpenify__hook_1_1llm__client_1_1LLMClient_a2ad3014dac466ee1d8e00306d0cf2000_icgraph.map new file mode 100644 index 0000000..4094a12 --- /dev/null +++ b/docs/html/classpenify__hook_1_1llm__client_1_1LLMClient_a2ad3014dac466ee1d8e00306d0cf2000_icgraph.map @@ -0,0 +1,4 @@ + + + + diff --git a/docs/html/classpenify__hook_1_1llm__client_1_1LLMClient_a2ad3014dac466ee1d8e00306d0cf2000_icgraph.md5 b/docs/html/classpenify__hook_1_1llm__client_1_1LLMClient_a2ad3014dac466ee1d8e00306d0cf2000_icgraph.md5 new file mode 100644 index 0000000..6c5244f --- /dev/null +++ b/docs/html/classpenify__hook_1_1llm__client_1_1LLMClient_a2ad3014dac466ee1d8e00306d0cf2000_icgraph.md5 @@ -0,0 +1 @@ +2232db7a39aade439b305a1e3373c005 \ No newline at end of file diff --git a/docs/html/classpenify__hook_1_1llm__client_1_1LLMClient_a2ad3014dac466ee1d8e00306d0cf2000_icgraph.svg b/docs/html/classpenify__hook_1_1llm__client_1_1LLMClient_a2ad3014dac466ee1d8e00306d0cf2000_icgraph.svg new file mode 100644 index 0000000..212c293 --- /dev/null +++ b/docs/html/classpenify__hook_1_1llm__client_1_1LLMClient_a2ad3014dac466ee1d8e00306d0cf2000_icgraph.svg @@ -0,0 +1,39 @@ + + + + + + +penify_hook.llm_client.LLMClient.generate_commit_summary + + + +Node1 + + +penify_hook.llm_client.LLMClient.generate +_commit_summary + + + + + +Node2 + + +penify_hook.api_client.APIClient.generate +_commit_summary_with_llm + + + + + +Node1->Node2 + + + + + diff --git a/docs/html/classpenify__hook_1_1llm__client_1_1LLMClient_ad6f06658ca922793f879474f2234518e_icgraph.map b/docs/html/classpenify__hook_1_1llm__client_1_1LLMClient_ad6f06658ca922793f879474f2234518e_icgraph.map new file mode 100644 index 0000000..12bd8c0 --- /dev/null +++ b/docs/html/classpenify__hook_1_1llm__client_1_1LLMClient_ad6f06658ca922793f879474f2234518e_icgraph.map @@ -0,0 +1,5 @@ + + + + + diff --git a/docs/html/classpenify__hook_1_1llm__client_1_1LLMClient_ad6f06658ca922793f879474f2234518e_icgraph.md5 b/docs/html/classpenify__hook_1_1llm__client_1_1LLMClient_ad6f06658ca922793f879474f2234518e_icgraph.md5 new file mode 100644 index 0000000..22a2946 --- /dev/null +++ b/docs/html/classpenify__hook_1_1llm__client_1_1LLMClient_ad6f06658ca922793f879474f2234518e_icgraph.md5 @@ -0,0 +1 @@ +3dd9f4364bc4c50da31157ac03a3e97f \ No newline at end of file diff --git a/docs/html/classpenify__hook_1_1llm__client_1_1LLMClient_ad6f06658ca922793f879474f2234518e_icgraph.svg b/docs/html/classpenify__hook_1_1llm__client_1_1LLMClient_ad6f06658ca922793f879474f2234518e_icgraph.svg new file mode 100644 index 0000000..1a42767 --- /dev/null +++ b/docs/html/classpenify__hook_1_1llm__client_1_1LLMClient_ad6f06658ca922793f879474f2234518e_icgraph.svg @@ -0,0 +1,142 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +penify_hook.llm_client.LLMClient.litellm + + + +Node1 + + +penify_hook.llm_client.LLMClient.litellm + + + + + +Node2 + + +penify_hook.llm_client.LLMClient.generate +_commit_summary + + + + + +Node1->Node2 + + + + + +Node3 + + +penify_hook.api_client.APIClient.generate +_commit_summary_with_llm + + + + + +Node2->Node3 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/html/classpenify__hook_1_1llm__client_1_1LLMClient_ad6f06658ca922793f879474f2234518e_icgraph_org.svg b/docs/html/classpenify__hook_1_1llm__client_1_1LLMClient_ad6f06658ca922793f879474f2234518e_icgraph_org.svg new file mode 100644 index 0000000..13d364a --- /dev/null +++ b/docs/html/classpenify__hook_1_1llm__client_1_1LLMClient_ad6f06658ca922793f879474f2234518e_icgraph_org.svg @@ -0,0 +1,54 @@ + + + + + + +penify_hook.llm_client.LLMClient.litellm + + + +Node1 + + +penify_hook.llm_client.LLMClient.litellm + + + + + +Node2 + + +penify_hook.llm_client.LLMClient.generate +_commit_summary + + + + + +Node1->Node2 + + + + + +Node3 + + +penify_hook.api_client.APIClient.generate +_commit_summary_with_llm + + + + + +Node2->Node3 + + + + + diff --git a/docs/html/classpenify__hook_1_1utils_1_1GitRepoNotFoundError.html b/docs/html/classpenify__hook_1_1utils_1_1GitRepoNotFoundError.html new file mode 100644 index 0000000..865e220 --- /dev/null +++ b/docs/html/classpenify__hook_1_1utils_1_1GitRepoNotFoundError.html @@ -0,0 +1,145 @@ + + + + + + + + + + + + + + + + + + +penify-cli: penify_hook.utils.GitRepoNotFoundError Class Reference + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
penify-cli +
+
+
+ + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
penify_hook.utils.GitRepoNotFoundError Class Reference
+
+
+
+Inheritance diagram for penify_hook.utils.GitRepoNotFoundError:
+
+
+
+
+
+Collaboration diagram for penify_hook.utils.GitRepoNotFoundError:
+
+
+
+
+
The documentation for this class was generated from the following file:
    +
  • /tmp/github_reposRepoArchDocGenContext/Penify-dev/penify-cli/penify_hook/utils.py
  • +
+
+
+ + + + + diff --git a/docs/html/classpenify__hook_1_1utils_1_1GitRepoNotFoundError__coll__graph.map b/docs/html/classpenify__hook_1_1utils_1_1GitRepoNotFoundError__coll__graph.map new file mode 100644 index 0000000..5f3516c --- /dev/null +++ b/docs/html/classpenify__hook_1_1utils_1_1GitRepoNotFoundError__coll__graph.map @@ -0,0 +1,4 @@ + + + + diff --git a/docs/html/classpenify__hook_1_1utils_1_1GitRepoNotFoundError__coll__graph.md5 b/docs/html/classpenify__hook_1_1utils_1_1GitRepoNotFoundError__coll__graph.md5 new file mode 100644 index 0000000..2e3ae13 --- /dev/null +++ b/docs/html/classpenify__hook_1_1utils_1_1GitRepoNotFoundError__coll__graph.md5 @@ -0,0 +1 @@ +ae33ddd5f5a4f2a38ac959e4302206a1 \ No newline at end of file diff --git a/docs/html/classpenify__hook_1_1utils_1_1GitRepoNotFoundError__coll__graph.svg b/docs/html/classpenify__hook_1_1utils_1_1GitRepoNotFoundError__coll__graph.svg new file mode 100644 index 0000000..1ca9a11 --- /dev/null +++ b/docs/html/classpenify__hook_1_1utils_1_1GitRepoNotFoundError__coll__graph.svg @@ -0,0 +1,46 @@ + + + + + + +penify_hook.utils.GitRepoNotFoundError + + + +Node1 + + +penify_hook.utils.GitRepo +NotFoundError + + + + + + + + + +Node2 + + +Exception + + + + + + + + + +Node2->Node1 + + + + + diff --git a/docs/html/classpenify__hook_1_1utils_1_1GitRepoNotFoundError__inherit__graph.map b/docs/html/classpenify__hook_1_1utils_1_1GitRepoNotFoundError__inherit__graph.map new file mode 100644 index 0000000..5f3516c --- /dev/null +++ b/docs/html/classpenify__hook_1_1utils_1_1GitRepoNotFoundError__inherit__graph.map @@ -0,0 +1,4 @@ + + + + diff --git a/docs/html/classpenify__hook_1_1utils_1_1GitRepoNotFoundError__inherit__graph.md5 b/docs/html/classpenify__hook_1_1utils_1_1GitRepoNotFoundError__inherit__graph.md5 new file mode 100644 index 0000000..2e3ae13 --- /dev/null +++ b/docs/html/classpenify__hook_1_1utils_1_1GitRepoNotFoundError__inherit__graph.md5 @@ -0,0 +1 @@ +ae33ddd5f5a4f2a38ac959e4302206a1 \ No newline at end of file diff --git a/docs/html/classpenify__hook_1_1utils_1_1GitRepoNotFoundError__inherit__graph.svg b/docs/html/classpenify__hook_1_1utils_1_1GitRepoNotFoundError__inherit__graph.svg new file mode 100644 index 0000000..1ca9a11 --- /dev/null +++ b/docs/html/classpenify__hook_1_1utils_1_1GitRepoNotFoundError__inherit__graph.svg @@ -0,0 +1,46 @@ + + + + + + +penify_hook.utils.GitRepoNotFoundError + + + +Node1 + + +penify_hook.utils.GitRepo +NotFoundError + + + + + + + + + +Node2 + + +Exception + + + + + + + + + +Node2->Node1 + + + + + diff --git a/docs/html/classtests_1_1test__commit__commands_1_1TestCommitCommands-members.html b/docs/html/classtests_1_1test__commit__commands_1_1TestCommitCommands-members.html new file mode 100644 index 0000000..1bf98a0 --- /dev/null +++ b/docs/html/classtests_1_1test__commit__commands_1_1TestCommitCommands-members.html @@ -0,0 +1,144 @@ + + + + + + + + + + + + + + + + + + +penify-cli: Member List + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
penify-cli +
+
+
+ + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
tests.test_commit_commands.TestCommitCommands Member List
+
+
+ +

This is the complete list of members for tests.test_commit_commands.TestCommitCommands, including all inherited members.

+ + + + + + + + + + + + + +
mock_api_client(self)tests.test_commit_commands.TestCommitCommands
mock_commit_doc_gen(self)tests.test_commit_commands.TestCommitCommands
mock_git_folder_search(self)tests.test_commit_commands.TestCommitCommands
mock_jira_client(self)tests.test_commit_commands.TestCommitCommands
mock_llm_client(self)tests.test_commit_commands.TestCommitCommands
mock_print_functions(self)tests.test_commit_commands.TestCommitCommands
test_commit_code_error_handling(self, mock_print, mock_exit, mock_git_folder_search, mock_doc_gen, mock_api_client)tests.test_commit_commands.TestCommitCommands
test_commit_code_with_jira_client(self, mock_error, mock_warning, mock_info, mock_git_folder_search, mock_doc_gen, mock_jira_client, mock_llm_client, mock_api_client)tests.test_commit_commands.TestCommitCommands
test_commit_code_with_jira_connection_failure(self, mock_error, mock_warning, mock_info, mock_git_folder_search, mock_doc_gen, mock_jira_client, mock_api_client)tests.test_commit_commands.TestCommitCommands
test_commit_code_with_llm_client(self, mock_error, mock_warning, mock_info, mock_git_folder_search, mock_doc_gen, mock_llm_client, mock_api_client)tests.test_commit_commands.TestCommitCommands
test_handle_commit(self, mock_print_info, mock_commit_code, mock_get_token, mock_get_llm_config, mock_get_jira_config)tests.test_commit_commands.TestCommitCommands
test_setup_commit_parser(self)tests.test_commit_commands.TestCommitCommands
+
+ + + + + diff --git a/docs/html/classtests_1_1test__commit__commands_1_1TestCommitCommands.html b/docs/html/classtests_1_1test__commit__commands_1_1TestCommitCommands.html new file mode 100644 index 0000000..5f9543d --- /dev/null +++ b/docs/html/classtests_1_1test__commit__commands_1_1TestCommitCommands.html @@ -0,0 +1,791 @@ + + + + + + + + + + + + + + + + + + +penify-cli: tests.test_commit_commands.TestCommitCommands Class Reference + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
penify-cli +
+
+
+ + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+ +
tests.test_commit_commands.TestCommitCommands Class Reference
+
+
+
+Collaboration diagram for tests.test_commit_commands.TestCommitCommands:
+
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

def mock_api_client (self)
 
def mock_llm_client (self)
 
def mock_jira_client (self)
 
def mock_commit_doc_gen (self)
 
def mock_git_folder_search (self)
 
def mock_print_functions (self)
 
def test_commit_code_with_llm_client (self, mock_error, mock_warning, mock_info, mock_git_folder_search, mock_doc_gen, mock_llm_client, mock_api_client)
 
def test_commit_code_with_jira_client (self, mock_error, mock_warning, mock_info, mock_git_folder_search, mock_doc_gen, mock_jira_client, mock_llm_client, mock_api_client)
 
def test_commit_code_with_jira_connection_failure (self, mock_error, mock_warning, mock_info, mock_git_folder_search, mock_doc_gen, mock_jira_client, mock_api_client)
 
def test_commit_code_error_handling (self, mock_print, mock_exit, mock_git_folder_search, mock_doc_gen, mock_api_client)
 
def test_setup_commit_parser (self)
 
def test_handle_commit (self, mock_print_info, mock_commit_code, mock_get_token, mock_get_llm_config, mock_get_jira_config)
 
+

Member Function Documentation

+ +

◆ mock_api_client()

+ +
+
+ + + + + + + + +
def tests.test_commit_commands.TestCommitCommands.mock_api_client ( self)
+
+
Mocks an instance of APIClient using unittest.mock.
+
+This function creates a mock object for APIClient and yields it along
+with the mocked instance. It is useful for testing purposes where real
+API calls should be avoided.
+
+Yields:
+    tuple: A tuple containing the mock of APIClient and the mocked instance of
+        APIClient.
+
+
+
+ +

◆ mock_commit_doc_gen()

+ +
+
+ + + + + + + + +
def tests.test_commit_commands.TestCommitCommands.mock_commit_doc_gen ( self)
+
+
Mocks the CommitDocGenHook class and returns a MagicMock instance.
+
+This function uses the `patch` decorator from the `unittest.mock` module
+to create a mock of the `CommitDocGenHook` class. It then sets up this
+mock to return a new `MagicMock` instance when invoked. The function
+yields both the mock object and the mocked instance, allowing for easy
+testing of functions that rely on `CommitDocGenHook`.
+
+Returns:
+    tuple: A tuple containing two elements:
+        - mock (patch): The patch object used to mock the `CommitDocGenHook`
+        class.
+        - doc_gen_instance (MagicMock): The mocked instance of
+        `CommitDocGenHook`.
+
+
+
+ +

◆ mock_git_folder_search()

+ +
+
+ + + + + + + + +
def tests.test_commit_commands.TestCommitCommands.mock_git_folder_search ( self)
+
+
Mock the `recursive_search_git_folder` function to return a predefined
+git folder path.
+
+This function uses the `patch` decorator from the `unittest.mock` module
+to intercept calls to `penify_hook.utils.recursive_search_git_folder`.
+When called, it will return '/mock/git/folder' instead of performing an
+actual search. This is useful for testing purposes where you need a
+consistent response without interacting with the file system.
+
+Yields:
+    MagicMock: A mock object that simulates the `recursive_search_git_folder` function.
+
+
+
+ +

◆ mock_jira_client()

+ +
+
+ + + + + + + + +
def tests.test_commit_commands.TestCommitCommands.mock_jira_client ( self)
+
+
Create a mock JIRA client for testing purposes.
+
+This function yields a tuple containing a mock JIRA client instance and
+its `is_connected` method. The mock client is configured to simulate an
+active connection. This is useful for unit tests that require
+interaction with a JIRA client without making actual network calls.
+
+Yields:
+    tuple: A tuple containing the mocked JIRA client instance and its
+        `is_connected` method.
+
+
+
+ +

◆ mock_llm_client()

+ +
+
+ + + + + + + + +
def tests.test_commit_commands.TestCommitCommands.mock_llm_client ( self)
+
+
Mock an instance of LLMClient for testing purposes.
+
+This function yields a mock object representing an instance of
+LLMClient, which can be used to simulate interactions with a language
+model during testing. The mock is patched to replace the actual
+LLMClient class from the penify_hook module.
+
+Yields:
+    tuple: A tuple containing two elements:
+        - mock (MagicMock): The mock object for LLMClient.
+        - llm_client_instance (MagicMock): An instance of the mocked LLMClient.
+
+
+
+ +

◆ mock_print_functions()

+ +
+
+ + + + + + + + +
def tests.test_commit_commands.TestCommitCommands.mock_print_functions ( self)
+
+
Mocks the print functions from `penify_hook.ui_utils` for testing
+purposes.
+
+This function uses Python's `unittest.mock.patch` to replace the actual
+print functions (`print`, `print_warning`, and `print_error`) with mock
+objects. These mock objects can be used in tests to capture calls made
+to these print functions without actually printing anything.
+
+Yields:
+    tuple: A tuple containing three mock objects corresponding to `print_info`,
+        `print_warning`,
+        and `print_error`.
+
+
+
+ +

◆ test_commit_code_error_handling()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
def tests.test_commit_commands.TestCommitCommands.test_commit_code_error_handling ( self,
 mock_print,
 mock_exit,
 mock_git_folder_search,
 mock_doc_gen,
 mock_api_client 
)
+
+
Test the error handling in the test_commit_code function.
+
+This function sets up mocks to simulate exceptions and test the error
+handling of the commit_code function. It verifies that the function
+correctly prints an error message and exits with a status code of 1 when
+an exception occurs during documentation generation.
+
+Args:
+    mock_print (MagicMock): Mock for the print function, used to verify error message output.
+    mock_exit (MagicMock): Mock for the sys.exit function, used to verify exit behavior.
+    mock_git_folder_search (MagicMock): Mock for the git_folder_search function, returning a mock Git folder
+        path.
+    mock_doc_gen (MagicMock): Mock for the doc_gen function, simulating an exception during
+        documentation generation.
+    mock_api_client (MagicMock): Mock for the API client class, not directly used but referenced in the
+        function signature.
+
+Here is the call graph for this function:
+
+
+
+
+ +
+
+ +

◆ test_commit_code_with_jira_client()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
def tests.test_commit_commands.TestCommitCommands.test_commit_code_with_jira_client ( self,
 mock_error,
 mock_warning,
 mock_info,
 mock_git_folder_search,
 mock_doc_gen,
 mock_jira_client,
 mock_llm_client,
 mock_api_client 
)
+
+
Test committing code using a JIRA client.
+
+This function tests the commit_code function with various parameters,
+including API and JIRA credentials. It sets up mock objects for
+dependencies such as the JIRA client, LLM client, and doc generator to
+simulate the behavior of the real classes. The function then calls
+commit_code and verifies that the JIRA client and doc generator are
+called with the correct parameters.
+
+Args:
+    mock_error (MagicMock): A MagicMock object for simulating error logging.
+    mock_warning (MagicMock): A MagicMock object for simulating warning logging.
+    mock_info (MagicMock): A MagicMock object for simulating info logging.
+    mock_git_folder_search (MagicMock): A MagicMock object for simulating the git folder search function.
+    mock_doc_gen (MagicMock): A MagicMock object for simulating the doc generator function.
+    mock_jira_client (MagicMock): A MagicMock object for simulating the JIRA client class.
+    mock_llm_client (MagicMock): A MagicMock object for simulating the LLM client class.
+    mock_api_client (MagicMock): A MagicMock object for simulating the API client class.
+
+Here is the call graph for this function:
+
+
+
+
+ +
+
+ +

◆ test_commit_code_with_jira_connection_failure()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
def tests.test_commit_commands.TestCommitCommands.test_commit_code_with_jira_connection_failure ( self,
 mock_error,
 mock_warning,
 mock_info,
 mock_git_folder_search,
 mock_doc_gen,
 mock_jira_client,
 mock_api_client 
)
+
+
Test the commit_code function when JIRA connection fails.
+
+This function tests the scenario where the JIRA connection fails during
+a code commit. It sets up various mocks to simulate different components
+of the system and then calls the `commit_code` function with specific
+parameters. The function is expected to handle the JIRA connection
+failure gracefully by logging an appropriate warning.
+
+Args:
+    mock_error (MagicMock): Mock for error logging.
+    mock_warning (MagicMock): Mock for warning logging.
+    mock_info (MagicMock): Mock for info logging.
+    mock_git_folder_search (MagicMock): Mock for searching the Git folder.
+    mock_doc_gen (MagicMock): Mock for generating documentation.
+    mock_jira_client (MagicMock): Mock for creating a JIRA client.
+    mock_api_client (MagicMock): Mock for creating an API client.
+
+Here is the call graph for this function:
+
+
+
+
+ +
+
+ +

◆ test_commit_code_with_llm_client()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
def tests.test_commit_commands.TestCommitCommands.test_commit_code_with_llm_client ( self,
 mock_error,
 mock_warning,
 mock_info,
 mock_git_folder_search,
 mock_doc_gen,
 mock_llm_client,
 mock_api_client 
)
+
+
Test committing code using an LLM client.
+
+This function sets up mock objects for various components and then calls
+the `commit_code` function with specified parameters. It verifies that
+the correct mocks are created and called with the appropriate arguments.
+
+Args:
+    mock_error (MagicMock): Mock object for error handling.
+    mock_warning (MagicMock): Mock object for warning logging.
+    mock_info (MagicMock): Mock object for info logging.
+    mock_git_folder_search (MagicMock): Mock object to simulate git folder search.
+    mock_doc_gen (MagicMock): Mock object for document generation.
+    mock_llm_client (MagicMock): Mock object for LLM client interaction.
+    mock_api_client (MagicMock): Mock object for API client interaction.
+
+Here is the call graph for this function:
+
+
+
+
+ +
+
+ +

◆ test_handle_commit()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
def tests.test_commit_commands.TestCommitCommands.test_handle_commit ( self,
 mock_print_info,
 mock_commit_code,
 mock_get_token,
 mock_get_llm_config,
 mock_get_jira_config 
)
+
+
Test the handle_commit function with various mock objects.
+
+This function sets up mocks for retrieving LLM configuration, JIRA
+configuration, and commit code. It then creates an argument object and
+calls the handle_commit function. Finally, it verifies that the mock
+functions were called with the expected arguments.
+
+Args:
+    mock_print_info (MagicMock): Mock object for printing information.
+    mock_commit_code (MagicMock): Mock object for committing code.
+    mock_get_token (MagicMock): Mock object for retrieving API token.
+    mock_get_llm_config (MagicMock): Mock object for retrieving LLM configuration.
+    mock_get_jira_config (MagicMock): Mock object for retrieving JIRA configuration.
+
+Here is the call graph for this function:
+
+
+
+
+ +
+
+ +

◆ test_setup_commit_parser()

+ +
+
+ + + + + + + + +
def tests.test_commit_commands.TestCommitCommands.test_setup_commit_parser ( self)
+
+
Set up the argument parser for the commit command.
+
+This function configures an argument parser to handle various options
+for committing changes. It adds three arguments: - '-m' or '--message':
+An optional argument to specify a contextual commit message with a
+default value of "N/A". - '-e' or '--terminal': A boolean flag to open
+an edit terminal before committing. - '-d' or '--description': A boolean
+flag that, when set to False, indicates the generation of a commit
+message with title and description.
+
+Args:
+    parser (MagicMock): The argument parser to be configured.
+
+Here is the call graph for this function:
+
+
+
+
+ +
+
+
The documentation for this class was generated from the following file: +
+
+ + + + + diff --git a/docs/html/classtests_1_1test__commit__commands_1_1TestCommitCommands.js b/docs/html/classtests_1_1test__commit__commands_1_1TestCommitCommands.js new file mode 100644 index 0000000..46b59e3 --- /dev/null +++ b/docs/html/classtests_1_1test__commit__commands_1_1TestCommitCommands.js @@ -0,0 +1,15 @@ +var classtests_1_1test__commit__commands_1_1TestCommitCommands = +[ + [ "mock_api_client", "classtests_1_1test__commit__commands_1_1TestCommitCommands.html#abcd2354a2af4afe19e57877628d3acc2", null ], + [ "mock_commit_doc_gen", "classtests_1_1test__commit__commands_1_1TestCommitCommands.html#aa9b25a4bf692b8736164695072a398f6", null ], + [ "mock_git_folder_search", "classtests_1_1test__commit__commands_1_1TestCommitCommands.html#a2842f456a8c0f1bf0f4def17c183c04e", null ], + [ "mock_jira_client", "classtests_1_1test__commit__commands_1_1TestCommitCommands.html#a05adaa9a713ff1be657455d0667bc6be", null ], + [ "mock_llm_client", "classtests_1_1test__commit__commands_1_1TestCommitCommands.html#a20e78370ff5bd6223cc1dd4323a86ea4", null ], + [ "mock_print_functions", "classtests_1_1test__commit__commands_1_1TestCommitCommands.html#afafbae3c9aeb0e50a75996256c02c8be", null ], + [ "test_commit_code_error_handling", "classtests_1_1test__commit__commands_1_1TestCommitCommands.html#a43c2ff3707124aa48e8eb581106b8691", null ], + [ "test_commit_code_with_jira_client", "classtests_1_1test__commit__commands_1_1TestCommitCommands.html#af9c09013055ec39ddde86b487aefcf8b", null ], + [ "test_commit_code_with_jira_connection_failure", "classtests_1_1test__commit__commands_1_1TestCommitCommands.html#acea0d934ee0f2b914b0b893736e8fe4e", null ], + [ "test_commit_code_with_llm_client", "classtests_1_1test__commit__commands_1_1TestCommitCommands.html#acc4b1e4189792a3f7c11d2a745f479c0", null ], + [ "test_handle_commit", "classtests_1_1test__commit__commands_1_1TestCommitCommands.html#ac13e368262340af98b30fd8ebdac6597", null ], + [ "test_setup_commit_parser", "classtests_1_1test__commit__commands_1_1TestCommitCommands.html#a4d04b125e102190a768f65f1948f15bc", null ] +]; \ No newline at end of file diff --git a/docs/html/classtests_1_1test__commit__commands_1_1TestCommitCommands__coll__graph.map b/docs/html/classtests_1_1test__commit__commands_1_1TestCommitCommands__coll__graph.map new file mode 100644 index 0000000..c06dd4a --- /dev/null +++ b/docs/html/classtests_1_1test__commit__commands_1_1TestCommitCommands__coll__graph.map @@ -0,0 +1,3 @@ + + + diff --git a/docs/html/classtests_1_1test__commit__commands_1_1TestCommitCommands__coll__graph.md5 b/docs/html/classtests_1_1test__commit__commands_1_1TestCommitCommands__coll__graph.md5 new file mode 100644 index 0000000..9d383d8 --- /dev/null +++ b/docs/html/classtests_1_1test__commit__commands_1_1TestCommitCommands__coll__graph.md5 @@ -0,0 +1 @@ +01c384c51b9b9d20ecd5af3519740055 \ No newline at end of file diff --git a/docs/html/classtests_1_1test__commit__commands_1_1TestCommitCommands__coll__graph.svg b/docs/html/classtests_1_1test__commit__commands_1_1TestCommitCommands__coll__graph.svg new file mode 100644 index 0000000..71f1b91 --- /dev/null +++ b/docs/html/classtests_1_1test__commit__commands_1_1TestCommitCommands__coll__graph.svg @@ -0,0 +1,42 @@ + + + + + + +tests.test_commit_commands.TestCommitCommands + + + +Node1 + + +tests.test_commit_commands. +TestCommitCommands + + + ++ mock_api_client() ++ mock_llm_client() ++ mock_jira_client() ++ mock_commit_doc_gen() ++ mock_git_folder_search() ++ mock_print_functions() ++ test_commit_code_with +_llm_client() ++ test_commit_code_with +_jira_client() ++ test_commit_code_with +_jira_connection_failure() ++ test_commit_code_error +_handling() ++ test_setup_commit_parser() ++ test_handle_commit() + + + + + diff --git a/docs/html/classtests_1_1test__commit__commands_1_1TestCommitCommands_a43c2ff3707124aa48e8eb581106b8691_cgraph.map b/docs/html/classtests_1_1test__commit__commands_1_1TestCommitCommands_a43c2ff3707124aa48e8eb581106b8691_cgraph.map new file mode 100644 index 0000000..cb1751e --- /dev/null +++ b/docs/html/classtests_1_1test__commit__commands_1_1TestCommitCommands_a43c2ff3707124aa48e8eb581106b8691_cgraph.map @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/docs/html/classtests_1_1test__commit__commands_1_1TestCommitCommands_a43c2ff3707124aa48e8eb581106b8691_cgraph.md5 b/docs/html/classtests_1_1test__commit__commands_1_1TestCommitCommands_a43c2ff3707124aa48e8eb581106b8691_cgraph.md5 new file mode 100644 index 0000000..f317412 --- /dev/null +++ b/docs/html/classtests_1_1test__commit__commands_1_1TestCommitCommands_a43c2ff3707124aa48e8eb581106b8691_cgraph.md5 @@ -0,0 +1 @@ +fac6736890d3e6569a3e562221e2e80c \ No newline at end of file diff --git a/docs/html/classtests_1_1test__commit__commands_1_1TestCommitCommands_a43c2ff3707124aa48e8eb581106b8691_cgraph.svg b/docs/html/classtests_1_1test__commit__commands_1_1TestCommitCommands_a43c2ff3707124aa48e8eb581106b8691_cgraph.svg new file mode 100644 index 0000000..9da54b6 --- /dev/null +++ b/docs/html/classtests_1_1test__commit__commands_1_1TestCommitCommands_a43c2ff3707124aa48e8eb581106b8691_cgraph.svg @@ -0,0 +1,244 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +tests.test_commit_commands.TestCommitCommands.test_commit_code_error_handling + + + +Node1 + + +tests.test_commit_commands. +TestCommitCommands.test +_commit_code_error_handling + + + + + +Node2 + + +penify_hook.commands.commit +_commands.commit_code + + + + + +Node1->Node2 + + + + + +Node3 + + +penify_hook.ui_utils.print +_error + + + + + +Node2->Node3 + + + + + +Node5 + + +penify_hook.ui_utils.print_info + + + + + +Node2->Node5 + + + + + +Node7 + + +penify_hook.ui_utils.print +_warning + + + + + +Node2->Node7 + + + + + +Node9 + + +penify_hook.utils.recursive +_search_git_folder + + + + + +Node2->Node9 + + + + + +Node4 + + +penify_hook.ui_utils.format +_error + + + + + +Node3->Node4 + + + + + +Node6 + + +penify_hook.ui_utils.format_info + + + + + +Node5->Node6 + + + + + +Node8 + + +penify_hook.ui_utils.format +_warning + + + + + +Node7->Node8 + + + + + +Node9->Node9 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/html/classtests_1_1test__commit__commands_1_1TestCommitCommands_a43c2ff3707124aa48e8eb581106b8691_cgraph_org.svg b/docs/html/classtests_1_1test__commit__commands_1_1TestCommitCommands_a43c2ff3707124aa48e8eb581106b8691_cgraph_org.svg new file mode 100644 index 0000000..add0cc8 --- /dev/null +++ b/docs/html/classtests_1_1test__commit__commands_1_1TestCommitCommands_a43c2ff3707124aa48e8eb581106b8691_cgraph_org.svg @@ -0,0 +1,156 @@ + + + + + + +tests.test_commit_commands.TestCommitCommands.test_commit_code_error_handling + + + +Node1 + + +tests.test_commit_commands. +TestCommitCommands.test +_commit_code_error_handling + + + + + +Node2 + + +penify_hook.commands.commit +_commands.commit_code + + + + + +Node1->Node2 + + + + + +Node3 + + +penify_hook.ui_utils.print +_error + + + + + +Node2->Node3 + + + + + +Node5 + + +penify_hook.ui_utils.print_info + + + + + +Node2->Node5 + + + + + +Node7 + + +penify_hook.ui_utils.print +_warning + + + + + +Node2->Node7 + + + + + +Node9 + + +penify_hook.utils.recursive +_search_git_folder + + + + + +Node2->Node9 + + + + + +Node4 + + +penify_hook.ui_utils.format +_error + + + + + +Node3->Node4 + + + + + +Node6 + + +penify_hook.ui_utils.format_info + + + + + +Node5->Node6 + + + + + +Node8 + + +penify_hook.ui_utils.format +_warning + + + + + +Node7->Node8 + + + + + +Node9->Node9 + + + + + diff --git a/docs/html/classtests_1_1test__commit__commands_1_1TestCommitCommands_a4d04b125e102190a768f65f1948f15bc_cgraph.map b/docs/html/classtests_1_1test__commit__commands_1_1TestCommitCommands_a4d04b125e102190a768f65f1948f15bc_cgraph.map new file mode 100644 index 0000000..889f430 --- /dev/null +++ b/docs/html/classtests_1_1test__commit__commands_1_1TestCommitCommands_a4d04b125e102190a768f65f1948f15bc_cgraph.map @@ -0,0 +1,4 @@ + + + + diff --git a/docs/html/classtests_1_1test__commit__commands_1_1TestCommitCommands_a4d04b125e102190a768f65f1948f15bc_cgraph.md5 b/docs/html/classtests_1_1test__commit__commands_1_1TestCommitCommands_a4d04b125e102190a768f65f1948f15bc_cgraph.md5 new file mode 100644 index 0000000..6ec9086 --- /dev/null +++ b/docs/html/classtests_1_1test__commit__commands_1_1TestCommitCommands_a4d04b125e102190a768f65f1948f15bc_cgraph.md5 @@ -0,0 +1 @@ +cae6ed50d17895098d586359b58517cc \ No newline at end of file diff --git a/docs/html/classtests_1_1test__commit__commands_1_1TestCommitCommands_a4d04b125e102190a768f65f1948f15bc_cgraph.svg b/docs/html/classtests_1_1test__commit__commands_1_1TestCommitCommands_a4d04b125e102190a768f65f1948f15bc_cgraph.svg new file mode 100644 index 0000000..390efd9 --- /dev/null +++ b/docs/html/classtests_1_1test__commit__commands_1_1TestCommitCommands_a4d04b125e102190a768f65f1948f15bc_cgraph.svg @@ -0,0 +1,40 @@ + + + + + + +tests.test_commit_commands.TestCommitCommands.test_setup_commit_parser + + + +Node1 + + +tests.test_commit_commands. +TestCommitCommands.test +_setup_commit_parser + + + + + +Node2 + + +penify_hook.commands.commit +_commands.setup_commit_parser + + + + + +Node1->Node2 + + + + + diff --git a/docs/html/classtests_1_1test__commit__commands_1_1TestCommitCommands_ac13e368262340af98b30fd8ebdac6597_cgraph.map b/docs/html/classtests_1_1test__commit__commands_1_1TestCommitCommands_ac13e368262340af98b30fd8ebdac6597_cgraph.map new file mode 100644 index 0000000..ae0be27 --- /dev/null +++ b/docs/html/classtests_1_1test__commit__commands_1_1TestCommitCommands_ac13e368262340af98b30fd8ebdac6597_cgraph.map @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/docs/html/classtests_1_1test__commit__commands_1_1TestCommitCommands_ac13e368262340af98b30fd8ebdac6597_cgraph.md5 b/docs/html/classtests_1_1test__commit__commands_1_1TestCommitCommands_ac13e368262340af98b30fd8ebdac6597_cgraph.md5 new file mode 100644 index 0000000..332ac4f --- /dev/null +++ b/docs/html/classtests_1_1test__commit__commands_1_1TestCommitCommands_ac13e368262340af98b30fd8ebdac6597_cgraph.md5 @@ -0,0 +1 @@ +ef8182faf1bcd63d3487614530947b10 \ No newline at end of file diff --git a/docs/html/classtests_1_1test__commit__commands_1_1TestCommitCommands_ac13e368262340af98b30fd8ebdac6597_cgraph.svg b/docs/html/classtests_1_1test__commit__commands_1_1TestCommitCommands_ac13e368262340af98b30fd8ebdac6597_cgraph.svg new file mode 100644 index 0000000..cd07d25 --- /dev/null +++ b/docs/html/classtests_1_1test__commit__commands_1_1TestCommitCommands_ac13e368262340af98b30fd8ebdac6597_cgraph.svg @@ -0,0 +1,405 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +tests.test_commit_commands.TestCommitCommands.test_handle_commit + + + +Node1 + + +tests.test_commit_commands. +TestCommitCommands.test +_handle_commit + + + + + +Node2 + + +penify_hook.commands.commit +_commands.handle_commit + + + + + +Node1->Node2 + + + + + +Node3 + + +penify_hook.commands.commit +_commands.commit_code + + + + + +Node2->Node3 + + + + + +Node6 + + +penify_hook.ui_utils.print_info + + + + + +Node2->Node6 + + + + + +Node11 + + +penify_hook.commands.config +_commands.get_jira_config + + + + + +Node2->Node11 + + + + + +Node14 + + +penify_hook.commands.config +_commands.get_llm_config + + + + + +Node2->Node14 + + + + + +Node15 + + +penify_hook.commands.config +_commands.get_token + + + + + +Node2->Node15 + + + + + +Node4 + + +penify_hook.ui_utils.print +_error + + + + + +Node3->Node4 + + + + + +Node3->Node6 + + + + + +Node8 + + +penify_hook.ui_utils.print +_warning + + + + + +Node3->Node8 + + + + + +Node10 + + +penify_hook.utils.recursive +_search_git_folder + + + + + +Node3->Node10 + + + + + +Node5 + + +penify_hook.ui_utils.format +_error + + + + + +Node4->Node5 + + + + + +Node7 + + +penify_hook.ui_utils.format_info + + + + + +Node6->Node7 + + + + + +Node9 + + +penify_hook.ui_utils.format +_warning + + + + + +Node8->Node9 + + + + + +Node10->Node10 + + + + + +Node12 + + +penify_hook.commands.config +_commands.get_env_var_or +_default + + + + + +Node11->Node12 + + + + + +Node13 + + +penify_hook.commands.config +_commands.load_env_files + + + + + +Node11->Node13 + + + + + +Node13->Node10 + + + + + +Node13->Node13 + + + + + +Node14->Node12 + + + + + +Node14->Node13 + + + + + +Node15->Node12 + + + + + +Node15->Node13 + + + + + +Node16 + + +penify_hook.commands.config +_commands.get_penify_config + + + + + +Node15->Node16 + + + + + +Node16->Node10 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/html/classtests_1_1test__commit__commands_1_1TestCommitCommands_ac13e368262340af98b30fd8ebdac6597_cgraph_org.svg b/docs/html/classtests_1_1test__commit__commands_1_1TestCommitCommands_ac13e368262340af98b30fd8ebdac6597_cgraph_org.svg new file mode 100644 index 0000000..90c6c04 --- /dev/null +++ b/docs/html/classtests_1_1test__commit__commands_1_1TestCommitCommands_ac13e368262340af98b30fd8ebdac6597_cgraph_org.svg @@ -0,0 +1,317 @@ + + + + + + +tests.test_commit_commands.TestCommitCommands.test_handle_commit + + + +Node1 + + +tests.test_commit_commands. +TestCommitCommands.test +_handle_commit + + + + + +Node2 + + +penify_hook.commands.commit +_commands.handle_commit + + + + + +Node1->Node2 + + + + + +Node3 + + +penify_hook.commands.commit +_commands.commit_code + + + + + +Node2->Node3 + + + + + +Node6 + + +penify_hook.ui_utils.print_info + + + + + +Node2->Node6 + + + + + +Node11 + + +penify_hook.commands.config +_commands.get_jira_config + + + + + +Node2->Node11 + + + + + +Node14 + + +penify_hook.commands.config +_commands.get_llm_config + + + + + +Node2->Node14 + + + + + +Node15 + + +penify_hook.commands.config +_commands.get_token + + + + + +Node2->Node15 + + + + + +Node4 + + +penify_hook.ui_utils.print +_error + + + + + +Node3->Node4 + + + + + +Node3->Node6 + + + + + +Node8 + + +penify_hook.ui_utils.print +_warning + + + + + +Node3->Node8 + + + + + +Node10 + + +penify_hook.utils.recursive +_search_git_folder + + + + + +Node3->Node10 + + + + + +Node5 + + +penify_hook.ui_utils.format +_error + + + + + +Node4->Node5 + + + + + +Node7 + + +penify_hook.ui_utils.format_info + + + + + +Node6->Node7 + + + + + +Node9 + + +penify_hook.ui_utils.format +_warning + + + + + +Node8->Node9 + + + + + +Node10->Node10 + + + + + +Node12 + + +penify_hook.commands.config +_commands.get_env_var_or +_default + + + + + +Node11->Node12 + + + + + +Node13 + + +penify_hook.commands.config +_commands.load_env_files + + + + + +Node11->Node13 + + + + + +Node13->Node10 + + + + + +Node13->Node13 + + + + + +Node14->Node12 + + + + + +Node14->Node13 + + + + + +Node15->Node12 + + + + + +Node15->Node13 + + + + + +Node16 + + +penify_hook.commands.config +_commands.get_penify_config + + + + + +Node15->Node16 + + + + + +Node16->Node10 + + + + + diff --git a/docs/html/classtests_1_1test__commit__commands_1_1TestCommitCommands_acc4b1e4189792a3f7c11d2a745f479c0_cgraph.map b/docs/html/classtests_1_1test__commit__commands_1_1TestCommitCommands_acc4b1e4189792a3f7c11d2a745f479c0_cgraph.map new file mode 100644 index 0000000..24ac63a --- /dev/null +++ b/docs/html/classtests_1_1test__commit__commands_1_1TestCommitCommands_acc4b1e4189792a3f7c11d2a745f479c0_cgraph.map @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/docs/html/classtests_1_1test__commit__commands_1_1TestCommitCommands_acc4b1e4189792a3f7c11d2a745f479c0_cgraph.md5 b/docs/html/classtests_1_1test__commit__commands_1_1TestCommitCommands_acc4b1e4189792a3f7c11d2a745f479c0_cgraph.md5 new file mode 100644 index 0000000..9c174cc --- /dev/null +++ b/docs/html/classtests_1_1test__commit__commands_1_1TestCommitCommands_acc4b1e4189792a3f7c11d2a745f479c0_cgraph.md5 @@ -0,0 +1 @@ +acd28568eb3edcfc33ca2521297fd075 \ No newline at end of file diff --git a/docs/html/classtests_1_1test__commit__commands_1_1TestCommitCommands_acc4b1e4189792a3f7c11d2a745f479c0_cgraph.svg b/docs/html/classtests_1_1test__commit__commands_1_1TestCommitCommands_acc4b1e4189792a3f7c11d2a745f479c0_cgraph.svg new file mode 100644 index 0000000..59cb486 --- /dev/null +++ b/docs/html/classtests_1_1test__commit__commands_1_1TestCommitCommands_acc4b1e4189792a3f7c11d2a745f479c0_cgraph.svg @@ -0,0 +1,244 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +tests.test_commit_commands.TestCommitCommands.test_commit_code_with_llm_client + + + +Node1 + + +tests.test_commit_commands. +TestCommitCommands.test +_commit_code_with_llm_client + + + + + +Node2 + + +penify_hook.commands.commit +_commands.commit_code + + + + + +Node1->Node2 + + + + + +Node3 + + +penify_hook.ui_utils.print +_error + + + + + +Node2->Node3 + + + + + +Node5 + + +penify_hook.ui_utils.print_info + + + + + +Node2->Node5 + + + + + +Node7 + + +penify_hook.ui_utils.print +_warning + + + + + +Node2->Node7 + + + + + +Node9 + + +penify_hook.utils.recursive +_search_git_folder + + + + + +Node2->Node9 + + + + + +Node4 + + +penify_hook.ui_utils.format +_error + + + + + +Node3->Node4 + + + + + +Node6 + + +penify_hook.ui_utils.format_info + + + + + +Node5->Node6 + + + + + +Node8 + + +penify_hook.ui_utils.format +_warning + + + + + +Node7->Node8 + + + + + +Node9->Node9 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/html/classtests_1_1test__commit__commands_1_1TestCommitCommands_acc4b1e4189792a3f7c11d2a745f479c0_cgraph_org.svg b/docs/html/classtests_1_1test__commit__commands_1_1TestCommitCommands_acc4b1e4189792a3f7c11d2a745f479c0_cgraph_org.svg new file mode 100644 index 0000000..853b56c --- /dev/null +++ b/docs/html/classtests_1_1test__commit__commands_1_1TestCommitCommands_acc4b1e4189792a3f7c11d2a745f479c0_cgraph_org.svg @@ -0,0 +1,156 @@ + + + + + + +tests.test_commit_commands.TestCommitCommands.test_commit_code_with_llm_client + + + +Node1 + + +tests.test_commit_commands. +TestCommitCommands.test +_commit_code_with_llm_client + + + + + +Node2 + + +penify_hook.commands.commit +_commands.commit_code + + + + + +Node1->Node2 + + + + + +Node3 + + +penify_hook.ui_utils.print +_error + + + + + +Node2->Node3 + + + + + +Node5 + + +penify_hook.ui_utils.print_info + + + + + +Node2->Node5 + + + + + +Node7 + + +penify_hook.ui_utils.print +_warning + + + + + +Node2->Node7 + + + + + +Node9 + + +penify_hook.utils.recursive +_search_git_folder + + + + + +Node2->Node9 + + + + + +Node4 + + +penify_hook.ui_utils.format +_error + + + + + +Node3->Node4 + + + + + +Node6 + + +penify_hook.ui_utils.format_info + + + + + +Node5->Node6 + + + + + +Node8 + + +penify_hook.ui_utils.format +_warning + + + + + +Node7->Node8 + + + + + +Node9->Node9 + + + + + diff --git a/docs/html/classtests_1_1test__commit__commands_1_1TestCommitCommands_acea0d934ee0f2b914b0b893736e8fe4e_cgraph.map b/docs/html/classtests_1_1test__commit__commands_1_1TestCommitCommands_acea0d934ee0f2b914b0b893736e8fe4e_cgraph.map new file mode 100644 index 0000000..9780c3f --- /dev/null +++ b/docs/html/classtests_1_1test__commit__commands_1_1TestCommitCommands_acea0d934ee0f2b914b0b893736e8fe4e_cgraph.map @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/docs/html/classtests_1_1test__commit__commands_1_1TestCommitCommands_acea0d934ee0f2b914b0b893736e8fe4e_cgraph.md5 b/docs/html/classtests_1_1test__commit__commands_1_1TestCommitCommands_acea0d934ee0f2b914b0b893736e8fe4e_cgraph.md5 new file mode 100644 index 0000000..080d356 --- /dev/null +++ b/docs/html/classtests_1_1test__commit__commands_1_1TestCommitCommands_acea0d934ee0f2b914b0b893736e8fe4e_cgraph.md5 @@ -0,0 +1 @@ +8bc1cc2849f225faaeab1719b6c0a3d6 \ No newline at end of file diff --git a/docs/html/classtests_1_1test__commit__commands_1_1TestCommitCommands_acea0d934ee0f2b914b0b893736e8fe4e_cgraph.svg b/docs/html/classtests_1_1test__commit__commands_1_1TestCommitCommands_acea0d934ee0f2b914b0b893736e8fe4e_cgraph.svg new file mode 100644 index 0000000..786afd0 --- /dev/null +++ b/docs/html/classtests_1_1test__commit__commands_1_1TestCommitCommands_acea0d934ee0f2b914b0b893736e8fe4e_cgraph.svg @@ -0,0 +1,245 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +tests.test_commit_commands.TestCommitCommands.test_commit_code_with_jira_connection_failure + + + +Node1 + + +tests.test_commit_commands. +TestCommitCommands.test +_commit_code_with_jira_connection +_failure + + + + + +Node2 + + +penify_hook.commands.commit +_commands.commit_code + + + + + +Node1->Node2 + + + + + +Node3 + + +penify_hook.ui_utils.print +_error + + + + + +Node2->Node3 + + + + + +Node5 + + +penify_hook.ui_utils.print_info + + + + + +Node2->Node5 + + + + + +Node7 + + +penify_hook.ui_utils.print +_warning + + + + + +Node2->Node7 + + + + + +Node9 + + +penify_hook.utils.recursive +_search_git_folder + + + + + +Node2->Node9 + + + + + +Node4 + + +penify_hook.ui_utils.format +_error + + + + + +Node3->Node4 + + + + + +Node6 + + +penify_hook.ui_utils.format_info + + + + + +Node5->Node6 + + + + + +Node8 + + +penify_hook.ui_utils.format +_warning + + + + + +Node7->Node8 + + + + + +Node9->Node9 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/html/classtests_1_1test__commit__commands_1_1TestCommitCommands_acea0d934ee0f2b914b0b893736e8fe4e_cgraph_org.svg b/docs/html/classtests_1_1test__commit__commands_1_1TestCommitCommands_acea0d934ee0f2b914b0b893736e8fe4e_cgraph_org.svg new file mode 100644 index 0000000..4b43aba --- /dev/null +++ b/docs/html/classtests_1_1test__commit__commands_1_1TestCommitCommands_acea0d934ee0f2b914b0b893736e8fe4e_cgraph_org.svg @@ -0,0 +1,157 @@ + + + + + + +tests.test_commit_commands.TestCommitCommands.test_commit_code_with_jira_connection_failure + + + +Node1 + + +tests.test_commit_commands. +TestCommitCommands.test +_commit_code_with_jira_connection +_failure + + + + + +Node2 + + +penify_hook.commands.commit +_commands.commit_code + + + + + +Node1->Node2 + + + + + +Node3 + + +penify_hook.ui_utils.print +_error + + + + + +Node2->Node3 + + + + + +Node5 + + +penify_hook.ui_utils.print_info + + + + + +Node2->Node5 + + + + + +Node7 + + +penify_hook.ui_utils.print +_warning + + + + + +Node2->Node7 + + + + + +Node9 + + +penify_hook.utils.recursive +_search_git_folder + + + + + +Node2->Node9 + + + + + +Node4 + + +penify_hook.ui_utils.format +_error + + + + + +Node3->Node4 + + + + + +Node6 + + +penify_hook.ui_utils.format_info + + + + + +Node5->Node6 + + + + + +Node8 + + +penify_hook.ui_utils.format +_warning + + + + + +Node7->Node8 + + + + + +Node9->Node9 + + + + + diff --git a/docs/html/classtests_1_1test__commit__commands_1_1TestCommitCommands_af9c09013055ec39ddde86b487aefcf8b_cgraph.map b/docs/html/classtests_1_1test__commit__commands_1_1TestCommitCommands_af9c09013055ec39ddde86b487aefcf8b_cgraph.map new file mode 100644 index 0000000..2c56c22 --- /dev/null +++ b/docs/html/classtests_1_1test__commit__commands_1_1TestCommitCommands_af9c09013055ec39ddde86b487aefcf8b_cgraph.map @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/docs/html/classtests_1_1test__commit__commands_1_1TestCommitCommands_af9c09013055ec39ddde86b487aefcf8b_cgraph.md5 b/docs/html/classtests_1_1test__commit__commands_1_1TestCommitCommands_af9c09013055ec39ddde86b487aefcf8b_cgraph.md5 new file mode 100644 index 0000000..a77222b --- /dev/null +++ b/docs/html/classtests_1_1test__commit__commands_1_1TestCommitCommands_af9c09013055ec39ddde86b487aefcf8b_cgraph.md5 @@ -0,0 +1 @@ +2b4709da9a40be7a45efe895e73cc31f \ No newline at end of file diff --git a/docs/html/classtests_1_1test__commit__commands_1_1TestCommitCommands_af9c09013055ec39ddde86b487aefcf8b_cgraph.svg b/docs/html/classtests_1_1test__commit__commands_1_1TestCommitCommands_af9c09013055ec39ddde86b487aefcf8b_cgraph.svg new file mode 100644 index 0000000..1ed6c1b --- /dev/null +++ b/docs/html/classtests_1_1test__commit__commands_1_1TestCommitCommands_af9c09013055ec39ddde86b487aefcf8b_cgraph.svg @@ -0,0 +1,244 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +tests.test_commit_commands.TestCommitCommands.test_commit_code_with_jira_client + + + +Node1 + + +tests.test_commit_commands. +TestCommitCommands.test +_commit_code_with_jira_client + + + + + +Node2 + + +penify_hook.commands.commit +_commands.commit_code + + + + + +Node1->Node2 + + + + + +Node3 + + +penify_hook.ui_utils.print +_error + + + + + +Node2->Node3 + + + + + +Node5 + + +penify_hook.ui_utils.print_info + + + + + +Node2->Node5 + + + + + +Node7 + + +penify_hook.ui_utils.print +_warning + + + + + +Node2->Node7 + + + + + +Node9 + + +penify_hook.utils.recursive +_search_git_folder + + + + + +Node2->Node9 + + + + + +Node4 + + +penify_hook.ui_utils.format +_error + + + + + +Node3->Node4 + + + + + +Node6 + + +penify_hook.ui_utils.format_info + + + + + +Node5->Node6 + + + + + +Node8 + + +penify_hook.ui_utils.format +_warning + + + + + +Node7->Node8 + + + + + +Node9->Node9 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/html/classtests_1_1test__commit__commands_1_1TestCommitCommands_af9c09013055ec39ddde86b487aefcf8b_cgraph_org.svg b/docs/html/classtests_1_1test__commit__commands_1_1TestCommitCommands_af9c09013055ec39ddde86b487aefcf8b_cgraph_org.svg new file mode 100644 index 0000000..b3aa423 --- /dev/null +++ b/docs/html/classtests_1_1test__commit__commands_1_1TestCommitCommands_af9c09013055ec39ddde86b487aefcf8b_cgraph_org.svg @@ -0,0 +1,156 @@ + + + + + + +tests.test_commit_commands.TestCommitCommands.test_commit_code_with_jira_client + + + +Node1 + + +tests.test_commit_commands. +TestCommitCommands.test +_commit_code_with_jira_client + + + + + +Node2 + + +penify_hook.commands.commit +_commands.commit_code + + + + + +Node1->Node2 + + + + + +Node3 + + +penify_hook.ui_utils.print +_error + + + + + +Node2->Node3 + + + + + +Node5 + + +penify_hook.ui_utils.print_info + + + + + +Node2->Node5 + + + + + +Node7 + + +penify_hook.ui_utils.print +_warning + + + + + +Node2->Node7 + + + + + +Node9 + + +penify_hook.utils.recursive +_search_git_folder + + + + + +Node2->Node9 + + + + + +Node4 + + +penify_hook.ui_utils.format +_error + + + + + +Node3->Node4 + + + + + +Node6 + + +penify_hook.ui_utils.format_info + + + + + +Node5->Node6 + + + + + +Node8 + + +penify_hook.ui_utils.format +_warning + + + + + +Node7->Node8 + + + + + +Node9->Node9 + + + + + diff --git a/docs/html/classtests_1_1test__config__commands_1_1TestConfigCommands-members.html b/docs/html/classtests_1_1test__config__commands_1_1TestConfigCommands-members.html new file mode 100644 index 0000000..b860c42 --- /dev/null +++ b/docs/html/classtests_1_1test__config__commands_1_1TestConfigCommands-members.html @@ -0,0 +1,144 @@ + + + + + + + + + + + + + + + + + + +penify-cli: Member List + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
penify-cli +
+
+
+ + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
tests.test_config_commands.TestConfigCommands Member List
+
+
+ +

This is the complete list of members for tests.test_config_commands.TestConfigCommands, including all inherited members.

+ + + + + + + + + + + + + +
test_get_jira_config_exists(self, mock_file_open, mock_get_config)tests.test_config_commands.TestConfigCommands
test_get_llm_config_empty(self, mock_file_open, mock_get_config)tests.test_config_commands.TestConfigCommands
test_get_llm_config_exists(self, mock_file_open, mock_get_config)tests.test_config_commands.TestConfigCommands
test_get_llm_config_invalid_json(self, mock_print, mock_file_open, mock_get_config)tests.test_config_commands.TestConfigCommands
test_get_penify_config_existing_dir(self, mock_file_open, mock_makedirs, mock_path, mock_git_folder)tests.test_config_commands.TestConfigCommands
test_get_penify_config_new_dir(self, mock_file_open, mock_makedirs, mock_path, mock_git_folder)tests.test_config_commands.TestConfigCommands
test_get_token_from_config(self, mock_file_open, mock_path, mock_getenv)tests.test_config_commands.TestConfigCommands
test_get_token_from_env(self, mock_file_open, mock_path, mock_getenv)tests.test_config_commands.TestConfigCommands
test_get_token_not_found(self, mock_file_open, mock_path, mock_getenv)tests.test_config_commands.TestConfigCommands
test_save_jira_config_success(self, mock_print, mock_json_dump, mock_file_open, mock_path)tests.test_config_commands.TestConfigCommands
test_save_llm_config_failure(self, mock_print, mock_file_open, mock_get_config)tests.test_config_commands.TestConfigCommands
test_save_llm_config_success(self, mock_print, mock_json_dump, mock_file_open, mock_get_config)tests.test_config_commands.TestConfigCommands
+
+ + + + + diff --git a/docs/html/classtests_1_1test__config__commands_1_1TestConfigCommands.html b/docs/html/classtests_1_1test__config__commands_1_1TestConfigCommands.html new file mode 100644 index 0000000..0c69f21 --- /dev/null +++ b/docs/html/classtests_1_1test__config__commands_1_1TestConfigCommands.html @@ -0,0 +1,886 @@ + + + + + + + + + + + + + + + + + + +penify-cli: tests.test_config_commands.TestConfigCommands Class Reference + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
penify-cli +
+
+
+ + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+ +
tests.test_config_commands.TestConfigCommands Class Reference
+
+
+
+Collaboration diagram for tests.test_config_commands.TestConfigCommands:
+
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

def test_get_penify_config_existing_dir (self, mock_file_open, mock_makedirs, mock_path, mock_git_folder)
 
def test_get_penify_config_new_dir (self, mock_file_open, mock_makedirs, mock_path, mock_git_folder)
 
def test_get_llm_config_exists (self, mock_file_open, mock_get_config)
 
def test_get_llm_config_empty (self, mock_file_open, mock_get_config)
 
def test_get_llm_config_invalid_json (self, mock_print, mock_file_open, mock_get_config)
 
def test_get_jira_config_exists (self, mock_file_open, mock_get_config)
 
def test_save_llm_config_success (self, mock_print, mock_json_dump, mock_file_open, mock_get_config)
 
def test_save_llm_config_failure (self, mock_print, mock_file_open, mock_get_config)
 
def test_save_jira_config_success (self, mock_print, mock_json_dump, mock_file_open, mock_path)
 
def test_get_token_from_env (self, mock_file_open, mock_path, mock_getenv)
 
def test_get_token_from_config (self, mock_file_open, mock_path, mock_getenv)
 
def test_get_token_not_found (self, mock_file_open, mock_path, mock_getenv)
 
+

Member Function Documentation

+ +

◆ test_get_jira_config_exists()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
def tests.test_config_commands.TestConfigCommands.test_get_jira_config_exists ( self,
 mock_file_open,
 mock_get_config 
)
+
+
Test that get_jira_config returns the correct JIRA configuration when
+the configuration file exists.
+
+It sets up a mock for the configuration file to simulate its existence
+and verifies that the function reads from the correct file and returns
+the expected JIRA configuration dictionary. Additionally, it checks that
+the mock file open is called with the appropriate arguments.
+
+Args:
+    mock_file_open (MagicMock): A mock for the `open` function.
+    mock_get_config (MagicMock): A mock for the `get_config` function, which is expected to return a mock
+        configuration file object.
+
+Returns:
+    None: This test function does not explicitly return anything. Its assertions
+        serve as the verification of its correctness.
+
+Here is the call graph for this function:
+
+
+
+
+ +
+
+ +

◆ test_get_llm_config_empty()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
def tests.test_config_commands.TestConfigCommands.test_get_llm_config_empty ( self,
 mock_file_open,
 mock_get_config 
)
+
+
Test the behavior of get_llm_config when called with an empty
+configuration file.
+
+This function sets up a mock configuration file that exists but returns
+no content. It then calls the `get_llm_config` function and asserts that
+it returns an empty dictionary and that the file open method was called
+exactly once with the correct arguments.
+
+Args:
+    mock_file_open (MagicMock): A MagicMock object simulating the built-in open function.
+    mock_get_config (MagicMock): A MagicMock object simulating the get_config function.
+
+Here is the call graph for this function:
+
+
+
+
+ +
+
+ +

◆ test_get_llm_config_exists()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
def tests.test_config_commands.TestConfigCommands.test_get_llm_config_exists ( self,
 mock_file_open,
 mock_get_config 
)
+
+
Test the get_llm_config function when the configuration file exists.
+
+This function sets up a mock configuration file that exists and returns
+it when called. It then calls the get_llm_config function and asserts
+that it returns the correct configuration dictionary. Additionally, it
+checks that the mock_file_open function was called with the correct
+arguments.
+
+Args:
+    mock_file_open (MagicMock): A mock for the open() function.
+    mock_get_config (MagicMock): A mock for the get_config() function.
+
+Here is the call graph for this function:
+
+
+
+
+ +
+
+ +

◆ test_get_llm_config_invalid_json()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
def tests.test_config_commands.TestConfigCommands.test_get_llm_config_invalid_json ( self,
 mock_print,
 mock_file_open,
 mock_get_config 
)
+
+
Test function to verify the behavior of get_llm_config when reading an
+invalid JSON file.
+
+It sets up a mock configuration file that exists but contains invalid
+JSON. The function is expected to handle this gracefully by printing an
+error message and returning an empty dictionary.
+
+Args:
+    mock_print (MagicMock): Mock for the print function.
+    mock_file_open (MagicMock): Mock for the open function.
+    mock_get_config (MagicMock): Mock for the get_config function, which returns the mock configuration
+        file.
+
+Here is the call graph for this function:
+
+
+
+
+ +
+
+ +

◆ test_get_penify_config_existing_dir()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
def tests.test_config_commands.TestConfigCommands.test_get_penify_config_existing_dir ( self,
 mock_file_open,
 mock_makedirs,
 mock_path,
 mock_git_folder 
)
+
+
Test the get_penify_config function when the .penify config directory
+exists.
+
+It should not create a new directory and assert that all mocked
+functions were called correctly.
+
+Args:
+    mock_file_open (MagicMock): A MagicMock object simulating the open() function.
+    mock_makedirs (MagicMock): A MagicMock object simulating the os.makedirs() function.
+    mock_path (MagicMock): A MagicMock object simulating the Path class from pathlib module.
+    mock_git_folder (MagicMock): A MagicMock object simulating the git_folder_search() function.
+
+Here is the call graph for this function:
+
+
+
+
+ +
+
+ +

◆ test_get_penify_config_new_dir()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
def tests.test_config_commands.TestConfigCommands.test_get_penify_config_new_dir ( self,
 mock_file_open,
 mock_makedirs,
 mock_path,
 mock_git_folder 
)
+
+
Test the behavior of get_penify_config when the .penify directory does
+not exist.
+
+This function mocks various system calls to simulate a scenario where
+the .penify directory is not present. It then asserts that the
+appropriate actions are taken to create the directory and write an empty
+JSON file.
+
+Args:
+    mock_file_open (MagicMock): A MagicMock object simulating the `open` function.
+    mock_makedirs (MagicMock): A MagicMock object simulating the `os.makedirs` function.
+    mock_path (MagicMock): A MagicMock object simulating the `Path` class from `pathlib`.
+    mock_git_folder (MagicMock): A MagicMock object simulating a git folder search function.
+
+Here is the call graph for this function:
+
+
+
+
+ +
+
+ +

◆ test_get_token_from_config()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
def tests.test_config_commands.TestConfigCommands.test_get_token_from_config ( self,
 mock_file_open,
 mock_path,
 mock_getenv 
)
+
+
Test retrieving a token from the configuration.
+
+This function sets up mocks for environment variables and configuration
+files, calls the `get_token` function, and asserts its behavior. It
+verifies that when the environment variable is not found, the function
+reads a token from a configuration file located in the user's home
+directory.
+
+Args:
+    mock_file_open (MagicMock): A mock for the `open` function.
+    mock_path (MagicMock): A mock for the `pathlib.Path` class.
+    mock_getenv (MagicMock): A mock for the `os.getenv` function.
+
+Here is the call graph for this function:
+
+
+
+
+ +
+
+ +

◆ test_get_token_from_env()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
def tests.test_config_commands.TestConfigCommands.test_get_token_from_env ( self,
 mock_file_open,
 mock_path,
 mock_getenv 
)
+
+
Test retrieving a token from the environment variable.
+
+This function tests the behavior of `get_token` when an environment
+variable is set. It verifies that if the 'PENIFY_API_TOKEN' environment
+variable exists, the function returns its value without attempting to
+read a file.
+
+Args:
+    mock_file_open (MagicMock): A MagicMock object for simulating file operations.
+    mock_path (MagicMock): A MagicMock object for simulating path operations.
+    mock_getenv (MagicMock): A MagicMock object for simulating environment variable retrieval.
+
+Here is the call graph for this function:
+
+
+
+
+ +
+
+ +

◆ test_get_token_not_found()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
def tests.test_config_commands.TestConfigCommands.test_get_token_not_found ( self,
 mock_file_open,
 mock_path,
 mock_getenv 
)
+
+
Test the get_token function when the API token environment variable is
+not found.
+
+This function tests the scenario where the `PENIFY_API_TOKEN`
+environment variable is not set. It mocks the environment variable to
+return `None`, and verifies that the function returns `None`. The test
+also checks that the environment variable is accessed once and that a
+file open operation is attempted on a configuration file located in the
+user's home directory.
+
+Args:
+    mock_file_open (MagicMock): Mock for the built-in `open` function.
+    mock_path (MagicMock): Mock for the `pathlib.Path` module.
+    mock_getenv (MagicMock): Mock for the `os.getenv` function.
+
+Returns:
+    None: The function does not return anything; it asserts conditions to verify
+        correctness.
+
+Here is the call graph for this function:
+
+
+
+
+ +
+
+ +

◆ test_save_jira_config_success()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
def tests.test_config_commands.TestConfigCommands.test_save_jira_config_success ( self,
 mock_print,
 mock_json_dump,
 mock_file_open,
 mock_path 
)
+
+
Test the save_jira_config function to ensure it saves JIRA configuration
+successfully.
+
+This function sets up mocks for various dependencies and tests the
+functionality of saving a JIRA configuration. It asserts that the
+function returns `True`, the JSON dump is called with the correct
+configuration, and the print statement contains the expected message.
+
+Args:
+    mock_print (MagicMock): Mock for the print function.
+    mock_json_dump (MagicMock): Mock for the json.dump function.
+    mock_file_open (MagicMock): Mock for the open function.
+    mock_path (MagicMock): Mock for the path module.
+
+Here is the call graph for this function:
+
+
+
+
+ +
+
+ +

◆ test_save_llm_config_failure()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
def tests.test_config_commands.TestConfigCommands.test_save_llm_config_failure ( self,
 mock_print,
 mock_file_open,
 mock_get_config 
)
+
+
Test function to verify that the save_llm_config function returns False
+and prints an error message when it fails to save the LLM configuration
+due to a permission error.
+
+It sets up a mock configuration file that exists and calls the
+save_llm_config function with valid parameters. The function is expected
+to return False and print "Error saving LLM configuration: Permission
+denied" in case of a failure.
+
+Args:
+    self (TestLLMConfig): An instance of the test class.
+    mock_print (MagicMock): A MagicMock object representing the print function, which will be used
+        to assert that it was called with the expected error message.
+    mock_file_open (MagicMock): A MagicMock object representing the open function, which is not used in
+        this test but is included as a parameter for completeness.
+    mock_get_config (MagicMock): A MagicMock object representing the get_config function, which will be
+        used to return the mock configuration file.
+
+Here is the call graph for this function:
+
+
+
+
+ +
+
+ +

◆ test_save_llm_config_success()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
def tests.test_config_commands.TestConfigCommands.test_save_llm_config_success ( self,
 mock_print,
 mock_json_dump,
 mock_file_open,
 mock_get_config 
)
+
+
Test the save_llm_config function successfully.
+
+This function tests that the save_llm_config function correctly saves an
+LLM configuration and handles various mock objects and side effects. It
+ensures that the function returns True upon successful execution, writes
+the expected configuration to a file, and prints a confirmation message.
+
+Args:
+    mock_print (MagicMock): A mock object for the print function.
+    mock_json_dump (MagicMock): A mock object for json.dump.
+    mock_file_open (MagicMock): A mock object for file opening.
+    mock_get_config (MagicMock): A mock object to return a configuration file mock.
+
+Here is the call graph for this function:
+
+
+
+
+ +
+
+
The documentation for this class was generated from the following file: +
+
+ + + + + diff --git a/docs/html/classtests_1_1test__config__commands_1_1TestConfigCommands.js b/docs/html/classtests_1_1test__config__commands_1_1TestConfigCommands.js new file mode 100644 index 0000000..88e855a --- /dev/null +++ b/docs/html/classtests_1_1test__config__commands_1_1TestConfigCommands.js @@ -0,0 +1,15 @@ +var classtests_1_1test__config__commands_1_1TestConfigCommands = +[ + [ "test_get_jira_config_exists", "classtests_1_1test__config__commands_1_1TestConfigCommands.html#aee37b97432821d19758c6325d4c74bcf", null ], + [ "test_get_llm_config_empty", "classtests_1_1test__config__commands_1_1TestConfigCommands.html#abd12f028b89aa9cd1152c0b9ece5d3cd", null ], + [ "test_get_llm_config_exists", "classtests_1_1test__config__commands_1_1TestConfigCommands.html#adf9f2233a3f4cc5725b9d4f05758b167", null ], + [ "test_get_llm_config_invalid_json", "classtests_1_1test__config__commands_1_1TestConfigCommands.html#a473984d31452b56acd6ce4011a1248bd", null ], + [ "test_get_penify_config_existing_dir", "classtests_1_1test__config__commands_1_1TestConfigCommands.html#a2e8162082bcdd5652bb37bdb14cf453a", null ], + [ "test_get_penify_config_new_dir", "classtests_1_1test__config__commands_1_1TestConfigCommands.html#a33d4760eee3b67e1cde3aed755ebb948", null ], + [ "test_get_token_from_config", "classtests_1_1test__config__commands_1_1TestConfigCommands.html#a6c0207be563c3de59a6d16277805114c", null ], + [ "test_get_token_from_env", "classtests_1_1test__config__commands_1_1TestConfigCommands.html#a3355f7d313bebaa71694387cf2bc5232", null ], + [ "test_get_token_not_found", "classtests_1_1test__config__commands_1_1TestConfigCommands.html#a400ca5d9fcdc159714e8df54920f9436", null ], + [ "test_save_jira_config_success", "classtests_1_1test__config__commands_1_1TestConfigCommands.html#af8d62310da2d768e21770f8f01ff5375", null ], + [ "test_save_llm_config_failure", "classtests_1_1test__config__commands_1_1TestConfigCommands.html#a73a264dfb21e16003e095b79f6eab2ac", null ], + [ "test_save_llm_config_success", "classtests_1_1test__config__commands_1_1TestConfigCommands.html#acd8df8219441b9e9871b903a681400d9", null ] +]; \ No newline at end of file diff --git a/docs/html/classtests_1_1test__config__commands_1_1TestConfigCommands__coll__graph.map b/docs/html/classtests_1_1test__config__commands_1_1TestConfigCommands__coll__graph.map new file mode 100644 index 0000000..b44b108 --- /dev/null +++ b/docs/html/classtests_1_1test__config__commands_1_1TestConfigCommands__coll__graph.map @@ -0,0 +1,3 @@ + + + diff --git a/docs/html/classtests_1_1test__config__commands_1_1TestConfigCommands__coll__graph.md5 b/docs/html/classtests_1_1test__config__commands_1_1TestConfigCommands__coll__graph.md5 new file mode 100644 index 0000000..eb46690 --- /dev/null +++ b/docs/html/classtests_1_1test__config__commands_1_1TestConfigCommands__coll__graph.md5 @@ -0,0 +1 @@ +2db6cf58d997b43a776fb21752d4aa29 \ No newline at end of file diff --git a/docs/html/classtests_1_1test__config__commands_1_1TestConfigCommands__coll__graph.svg b/docs/html/classtests_1_1test__config__commands_1_1TestConfigCommands__coll__graph.svg new file mode 100644 index 0000000..9daa237 --- /dev/null +++ b/docs/html/classtests_1_1test__config__commands_1_1TestConfigCommands__coll__graph.svg @@ -0,0 +1,50 @@ + + + + + + +tests.test_config_commands.TestConfigCommands + + + +Node1 + + +tests.test_config_commands. +TestConfigCommands + + + ++ test_get_penify_config +_existing_dir() ++ test_get_penify_config +_new_dir() ++ test_get_llm_config +_exists() ++ test_get_llm_config +_empty() ++ test_get_llm_config +_invalid_json() ++ test_get_jira_config +_exists() ++ test_save_llm_config +_success() ++ test_save_llm_config +_failure() ++ test_save_jira_config +_success() ++ test_get_token_from +_env() ++ test_get_token_from +_config() ++ test_get_token_not +_found() + + + + + diff --git a/docs/html/classtests_1_1test__config__commands_1_1TestConfigCommands_a2e8162082bcdd5652bb37bdb14cf453a_cgraph.map b/docs/html/classtests_1_1test__config__commands_1_1TestConfigCommands_a2e8162082bcdd5652bb37bdb14cf453a_cgraph.map new file mode 100644 index 0000000..078fe57 --- /dev/null +++ b/docs/html/classtests_1_1test__config__commands_1_1TestConfigCommands_a2e8162082bcdd5652bb37bdb14cf453a_cgraph.map @@ -0,0 +1,5 @@ + + + + + diff --git a/docs/html/classtests_1_1test__config__commands_1_1TestConfigCommands_a2e8162082bcdd5652bb37bdb14cf453a_cgraph.md5 b/docs/html/classtests_1_1test__config__commands_1_1TestConfigCommands_a2e8162082bcdd5652bb37bdb14cf453a_cgraph.md5 new file mode 100644 index 0000000..9e0bad2 --- /dev/null +++ b/docs/html/classtests_1_1test__config__commands_1_1TestConfigCommands_a2e8162082bcdd5652bb37bdb14cf453a_cgraph.md5 @@ -0,0 +1 @@ +fe055e22847261fb4e8e965247fa63e4 \ No newline at end of file diff --git a/docs/html/classtests_1_1test__config__commands_1_1TestConfigCommands_a2e8162082bcdd5652bb37bdb14cf453a_cgraph.svg b/docs/html/classtests_1_1test__config__commands_1_1TestConfigCommands_a2e8162082bcdd5652bb37bdb14cf453a_cgraph.svg new file mode 100644 index 0000000..f4a0db4 --- /dev/null +++ b/docs/html/classtests_1_1test__config__commands_1_1TestConfigCommands_a2e8162082bcdd5652bb37bdb14cf453a_cgraph.svg @@ -0,0 +1,150 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +tests.test_config_commands.TestConfigCommands.test_get_penify_config_existing_dir + + + +Node1 + + +tests.test_config_commands. +TestConfigCommands.test +_get_penify_config_existing_dir + + + + + +Node2 + + +penify_hook.commands.config +_commands.get_penify_config + + + + + +Node1->Node2 + + + + + +Node3 + + +penify_hook.utils.recursive +_search_git_folder + + + + + +Node2->Node3 + + + + + +Node3->Node3 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/html/classtests_1_1test__config__commands_1_1TestConfigCommands_a2e8162082bcdd5652bb37bdb14cf453a_cgraph_org.svg b/docs/html/classtests_1_1test__config__commands_1_1TestConfigCommands_a2e8162082bcdd5652bb37bdb14cf453a_cgraph_org.svg new file mode 100644 index 0000000..223d6fc --- /dev/null +++ b/docs/html/classtests_1_1test__config__commands_1_1TestConfigCommands_a2e8162082bcdd5652bb37bdb14cf453a_cgraph_org.svg @@ -0,0 +1,62 @@ + + + + + + +tests.test_config_commands.TestConfigCommands.test_get_penify_config_existing_dir + + + +Node1 + + +tests.test_config_commands. +TestConfigCommands.test +_get_penify_config_existing_dir + + + + + +Node2 + + +penify_hook.commands.config +_commands.get_penify_config + + + + + +Node1->Node2 + + + + + +Node3 + + +penify_hook.utils.recursive +_search_git_folder + + + + + +Node2->Node3 + + + + + +Node3->Node3 + + + + + diff --git a/docs/html/classtests_1_1test__config__commands_1_1TestConfigCommands_a3355f7d313bebaa71694387cf2bc5232_cgraph.map b/docs/html/classtests_1_1test__config__commands_1_1TestConfigCommands_a3355f7d313bebaa71694387cf2bc5232_cgraph.map new file mode 100644 index 0000000..eda7789 --- /dev/null +++ b/docs/html/classtests_1_1test__config__commands_1_1TestConfigCommands_a3355f7d313bebaa71694387cf2bc5232_cgraph.map @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/docs/html/classtests_1_1test__config__commands_1_1TestConfigCommands_a3355f7d313bebaa71694387cf2bc5232_cgraph.md5 b/docs/html/classtests_1_1test__config__commands_1_1TestConfigCommands_a3355f7d313bebaa71694387cf2bc5232_cgraph.md5 new file mode 100644 index 0000000..9cef76a --- /dev/null +++ b/docs/html/classtests_1_1test__config__commands_1_1TestConfigCommands_a3355f7d313bebaa71694387cf2bc5232_cgraph.md5 @@ -0,0 +1 @@ +28bc7f826bf5c37f1e543c6a2217c011 \ No newline at end of file diff --git a/docs/html/classtests_1_1test__config__commands_1_1TestConfigCommands_a3355f7d313bebaa71694387cf2bc5232_cgraph.svg b/docs/html/classtests_1_1test__config__commands_1_1TestConfigCommands_a3355f7d313bebaa71694387cf2bc5232_cgraph.svg new file mode 100644 index 0000000..b978430 --- /dev/null +++ b/docs/html/classtests_1_1test__config__commands_1_1TestConfigCommands_a3355f7d313bebaa71694387cf2bc5232_cgraph.svg @@ -0,0 +1,211 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +tests.test_config_commands.TestConfigCommands.test_get_token_from_env + + + +Node1 + + +tests.test_config_commands. +TestConfigCommands.test +_get_token_from_env + + + + + +Node2 + + +penify_hook.commands.config +_commands.get_token + + + + + +Node1->Node2 + + + + + +Node3 + + +penify_hook.commands.config +_commands.get_env_var_or +_default + + + + + +Node2->Node3 + + + + + +Node4 + + +penify_hook.commands.config +_commands.get_penify_config + + + + + +Node2->Node4 + + + + + +Node6 + + +penify_hook.commands.config +_commands.load_env_files + + + + + +Node2->Node6 + + + + + +Node5 + + +penify_hook.utils.recursive +_search_git_folder + + + + + +Node4->Node5 + + + + + +Node5->Node5 + + + + + +Node6->Node5 + + + + + +Node6->Node6 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/html/classtests_1_1test__config__commands_1_1TestConfigCommands_a3355f7d313bebaa71694387cf2bc5232_cgraph_org.svg b/docs/html/classtests_1_1test__config__commands_1_1TestConfigCommands_a3355f7d313bebaa71694387cf2bc5232_cgraph_org.svg new file mode 100644 index 0000000..c5e3f5e --- /dev/null +++ b/docs/html/classtests_1_1test__config__commands_1_1TestConfigCommands_a3355f7d313bebaa71694387cf2bc5232_cgraph_org.svg @@ -0,0 +1,123 @@ + + + + + + +tests.test_config_commands.TestConfigCommands.test_get_token_from_env + + + +Node1 + + +tests.test_config_commands. +TestConfigCommands.test +_get_token_from_env + + + + + +Node2 + + +penify_hook.commands.config +_commands.get_token + + + + + +Node1->Node2 + + + + + +Node3 + + +penify_hook.commands.config +_commands.get_env_var_or +_default + + + + + +Node2->Node3 + + + + + +Node4 + + +penify_hook.commands.config +_commands.get_penify_config + + + + + +Node2->Node4 + + + + + +Node6 + + +penify_hook.commands.config +_commands.load_env_files + + + + + +Node2->Node6 + + + + + +Node5 + + +penify_hook.utils.recursive +_search_git_folder + + + + + +Node4->Node5 + + + + + +Node5->Node5 + + + + + +Node6->Node5 + + + + + +Node6->Node6 + + + + + diff --git a/docs/html/classtests_1_1test__config__commands_1_1TestConfigCommands_a33d4760eee3b67e1cde3aed755ebb948_cgraph.map b/docs/html/classtests_1_1test__config__commands_1_1TestConfigCommands_a33d4760eee3b67e1cde3aed755ebb948_cgraph.map new file mode 100644 index 0000000..b8a69cd --- /dev/null +++ b/docs/html/classtests_1_1test__config__commands_1_1TestConfigCommands_a33d4760eee3b67e1cde3aed755ebb948_cgraph.map @@ -0,0 +1,5 @@ + + + + + diff --git a/docs/html/classtests_1_1test__config__commands_1_1TestConfigCommands_a33d4760eee3b67e1cde3aed755ebb948_cgraph.md5 b/docs/html/classtests_1_1test__config__commands_1_1TestConfigCommands_a33d4760eee3b67e1cde3aed755ebb948_cgraph.md5 new file mode 100644 index 0000000..179211c --- /dev/null +++ b/docs/html/classtests_1_1test__config__commands_1_1TestConfigCommands_a33d4760eee3b67e1cde3aed755ebb948_cgraph.md5 @@ -0,0 +1 @@ +66249d926cb6fd81bdf9ba46dc56d466 \ No newline at end of file diff --git a/docs/html/classtests_1_1test__config__commands_1_1TestConfigCommands_a33d4760eee3b67e1cde3aed755ebb948_cgraph.svg b/docs/html/classtests_1_1test__config__commands_1_1TestConfigCommands_a33d4760eee3b67e1cde3aed755ebb948_cgraph.svg new file mode 100644 index 0000000..3c9de34 --- /dev/null +++ b/docs/html/classtests_1_1test__config__commands_1_1TestConfigCommands_a33d4760eee3b67e1cde3aed755ebb948_cgraph.svg @@ -0,0 +1,150 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +tests.test_config_commands.TestConfigCommands.test_get_penify_config_new_dir + + + +Node1 + + +tests.test_config_commands. +TestConfigCommands.test +_get_penify_config_new_dir + + + + + +Node2 + + +penify_hook.commands.config +_commands.get_penify_config + + + + + +Node1->Node2 + + + + + +Node3 + + +penify_hook.utils.recursive +_search_git_folder + + + + + +Node2->Node3 + + + + + +Node3->Node3 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/html/classtests_1_1test__config__commands_1_1TestConfigCommands_a33d4760eee3b67e1cde3aed755ebb948_cgraph_org.svg b/docs/html/classtests_1_1test__config__commands_1_1TestConfigCommands_a33d4760eee3b67e1cde3aed755ebb948_cgraph_org.svg new file mode 100644 index 0000000..3b4f6d8 --- /dev/null +++ b/docs/html/classtests_1_1test__config__commands_1_1TestConfigCommands_a33d4760eee3b67e1cde3aed755ebb948_cgraph_org.svg @@ -0,0 +1,62 @@ + + + + + + +tests.test_config_commands.TestConfigCommands.test_get_penify_config_new_dir + + + +Node1 + + +tests.test_config_commands. +TestConfigCommands.test +_get_penify_config_new_dir + + + + + +Node2 + + +penify_hook.commands.config +_commands.get_penify_config + + + + + +Node1->Node2 + + + + + +Node3 + + +penify_hook.utils.recursive +_search_git_folder + + + + + +Node2->Node3 + + + + + +Node3->Node3 + + + + + diff --git a/docs/html/classtests_1_1test__config__commands_1_1TestConfigCommands_a400ca5d9fcdc159714e8df54920f9436_cgraph.map b/docs/html/classtests_1_1test__config__commands_1_1TestConfigCommands_a400ca5d9fcdc159714e8df54920f9436_cgraph.map new file mode 100644 index 0000000..9ca3973 --- /dev/null +++ b/docs/html/classtests_1_1test__config__commands_1_1TestConfigCommands_a400ca5d9fcdc159714e8df54920f9436_cgraph.map @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/docs/html/classtests_1_1test__config__commands_1_1TestConfigCommands_a400ca5d9fcdc159714e8df54920f9436_cgraph.md5 b/docs/html/classtests_1_1test__config__commands_1_1TestConfigCommands_a400ca5d9fcdc159714e8df54920f9436_cgraph.md5 new file mode 100644 index 0000000..494b2db --- /dev/null +++ b/docs/html/classtests_1_1test__config__commands_1_1TestConfigCommands_a400ca5d9fcdc159714e8df54920f9436_cgraph.md5 @@ -0,0 +1 @@ +fe3072609a9a0bf3d14e3143add0e6da \ No newline at end of file diff --git a/docs/html/classtests_1_1test__config__commands_1_1TestConfigCommands_a400ca5d9fcdc159714e8df54920f9436_cgraph.svg b/docs/html/classtests_1_1test__config__commands_1_1TestConfigCommands_a400ca5d9fcdc159714e8df54920f9436_cgraph.svg new file mode 100644 index 0000000..dd9b3ef --- /dev/null +++ b/docs/html/classtests_1_1test__config__commands_1_1TestConfigCommands_a400ca5d9fcdc159714e8df54920f9436_cgraph.svg @@ -0,0 +1,211 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +tests.test_config_commands.TestConfigCommands.test_get_token_not_found + + + +Node1 + + +tests.test_config_commands. +TestConfigCommands.test +_get_token_not_found + + + + + +Node2 + + +penify_hook.commands.config +_commands.get_token + + + + + +Node1->Node2 + + + + + +Node3 + + +penify_hook.commands.config +_commands.get_env_var_or +_default + + + + + +Node2->Node3 + + + + + +Node4 + + +penify_hook.commands.config +_commands.get_penify_config + + + + + +Node2->Node4 + + + + + +Node6 + + +penify_hook.commands.config +_commands.load_env_files + + + + + +Node2->Node6 + + + + + +Node5 + + +penify_hook.utils.recursive +_search_git_folder + + + + + +Node4->Node5 + + + + + +Node5->Node5 + + + + + +Node6->Node5 + + + + + +Node6->Node6 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/html/classtests_1_1test__config__commands_1_1TestConfigCommands_a400ca5d9fcdc159714e8df54920f9436_cgraph_org.svg b/docs/html/classtests_1_1test__config__commands_1_1TestConfigCommands_a400ca5d9fcdc159714e8df54920f9436_cgraph_org.svg new file mode 100644 index 0000000..65b3e03 --- /dev/null +++ b/docs/html/classtests_1_1test__config__commands_1_1TestConfigCommands_a400ca5d9fcdc159714e8df54920f9436_cgraph_org.svg @@ -0,0 +1,123 @@ + + + + + + +tests.test_config_commands.TestConfigCommands.test_get_token_not_found + + + +Node1 + + +tests.test_config_commands. +TestConfigCommands.test +_get_token_not_found + + + + + +Node2 + + +penify_hook.commands.config +_commands.get_token + + + + + +Node1->Node2 + + + + + +Node3 + + +penify_hook.commands.config +_commands.get_env_var_or +_default + + + + + +Node2->Node3 + + + + + +Node4 + + +penify_hook.commands.config +_commands.get_penify_config + + + + + +Node2->Node4 + + + + + +Node6 + + +penify_hook.commands.config +_commands.load_env_files + + + + + +Node2->Node6 + + + + + +Node5 + + +penify_hook.utils.recursive +_search_git_folder + + + + + +Node4->Node5 + + + + + +Node5->Node5 + + + + + +Node6->Node5 + + + + + +Node6->Node6 + + + + + diff --git a/docs/html/classtests_1_1test__config__commands_1_1TestConfigCommands_a473984d31452b56acd6ce4011a1248bd_cgraph.map b/docs/html/classtests_1_1test__config__commands_1_1TestConfigCommands_a473984d31452b56acd6ce4011a1248bd_cgraph.map new file mode 100644 index 0000000..bdcc413 --- /dev/null +++ b/docs/html/classtests_1_1test__config__commands_1_1TestConfigCommands_a473984d31452b56acd6ce4011a1248bd_cgraph.map @@ -0,0 +1,7 @@ + + + + + + + diff --git a/docs/html/classtests_1_1test__config__commands_1_1TestConfigCommands_a473984d31452b56acd6ce4011a1248bd_cgraph.md5 b/docs/html/classtests_1_1test__config__commands_1_1TestConfigCommands_a473984d31452b56acd6ce4011a1248bd_cgraph.md5 new file mode 100644 index 0000000..bdddb02 --- /dev/null +++ b/docs/html/classtests_1_1test__config__commands_1_1TestConfigCommands_a473984d31452b56acd6ce4011a1248bd_cgraph.md5 @@ -0,0 +1 @@ +6604e171883373f917ba1e50c7dcf2a8 \ No newline at end of file diff --git a/docs/html/classtests_1_1test__config__commands_1_1TestConfigCommands_a473984d31452b56acd6ce4011a1248bd_cgraph.svg b/docs/html/classtests_1_1test__config__commands_1_1TestConfigCommands_a473984d31452b56acd6ce4011a1248bd_cgraph.svg new file mode 100644 index 0000000..803f331 --- /dev/null +++ b/docs/html/classtests_1_1test__config__commands_1_1TestConfigCommands_a473984d31452b56acd6ce4011a1248bd_cgraph.svg @@ -0,0 +1,189 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +tests.test_config_commands.TestConfigCommands.test_get_llm_config_invalid_json + + + +Node1 + + +tests.test_config_commands. +TestConfigCommands.test +_get_llm_config_invalid_json + + + + + +Node2 + + +penify_hook.commands.config +_commands.get_llm_config + + + + + +Node1->Node2 + + + + + +Node3 + + +penify_hook.commands.config +_commands.get_env_var_or +_default + + + + + +Node2->Node3 + + + + + +Node4 + + +penify_hook.commands.config +_commands.load_env_files + + + + + +Node2->Node4 + + + + + +Node4->Node4 + + + + + +Node5 + + +penify_hook.utils.recursive +_search_git_folder + + + + + +Node4->Node5 + + + + + +Node5->Node5 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/html/classtests_1_1test__config__commands_1_1TestConfigCommands_a473984d31452b56acd6ce4011a1248bd_cgraph_org.svg b/docs/html/classtests_1_1test__config__commands_1_1TestConfigCommands_a473984d31452b56acd6ce4011a1248bd_cgraph_org.svg new file mode 100644 index 0000000..4b1b7ba --- /dev/null +++ b/docs/html/classtests_1_1test__config__commands_1_1TestConfigCommands_a473984d31452b56acd6ce4011a1248bd_cgraph_org.svg @@ -0,0 +1,101 @@ + + + + + + +tests.test_config_commands.TestConfigCommands.test_get_llm_config_invalid_json + + + +Node1 + + +tests.test_config_commands. +TestConfigCommands.test +_get_llm_config_invalid_json + + + + + +Node2 + + +penify_hook.commands.config +_commands.get_llm_config + + + + + +Node1->Node2 + + + + + +Node3 + + +penify_hook.commands.config +_commands.get_env_var_or +_default + + + + + +Node2->Node3 + + + + + +Node4 + + +penify_hook.commands.config +_commands.load_env_files + + + + + +Node2->Node4 + + + + + +Node4->Node4 + + + + + +Node5 + + +penify_hook.utils.recursive +_search_git_folder + + + + + +Node4->Node5 + + + + + +Node5->Node5 + + + + + diff --git a/docs/html/classtests_1_1test__config__commands_1_1TestConfigCommands_a6c0207be563c3de59a6d16277805114c_cgraph.map b/docs/html/classtests_1_1test__config__commands_1_1TestConfigCommands_a6c0207be563c3de59a6d16277805114c_cgraph.map new file mode 100644 index 0000000..8da2d5a --- /dev/null +++ b/docs/html/classtests_1_1test__config__commands_1_1TestConfigCommands_a6c0207be563c3de59a6d16277805114c_cgraph.map @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/docs/html/classtests_1_1test__config__commands_1_1TestConfigCommands_a6c0207be563c3de59a6d16277805114c_cgraph.md5 b/docs/html/classtests_1_1test__config__commands_1_1TestConfigCommands_a6c0207be563c3de59a6d16277805114c_cgraph.md5 new file mode 100644 index 0000000..49db9b2 --- /dev/null +++ b/docs/html/classtests_1_1test__config__commands_1_1TestConfigCommands_a6c0207be563c3de59a6d16277805114c_cgraph.md5 @@ -0,0 +1 @@ +18a45266c6274df8d06c6771aea4d3ce \ No newline at end of file diff --git a/docs/html/classtests_1_1test__config__commands_1_1TestConfigCommands_a6c0207be563c3de59a6d16277805114c_cgraph.svg b/docs/html/classtests_1_1test__config__commands_1_1TestConfigCommands_a6c0207be563c3de59a6d16277805114c_cgraph.svg new file mode 100644 index 0000000..d4ab491 --- /dev/null +++ b/docs/html/classtests_1_1test__config__commands_1_1TestConfigCommands_a6c0207be563c3de59a6d16277805114c_cgraph.svg @@ -0,0 +1,211 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +tests.test_config_commands.TestConfigCommands.test_get_token_from_config + + + +Node1 + + +tests.test_config_commands. +TestConfigCommands.test +_get_token_from_config + + + + + +Node2 + + +penify_hook.commands.config +_commands.get_token + + + + + +Node1->Node2 + + + + + +Node3 + + +penify_hook.commands.config +_commands.get_env_var_or +_default + + + + + +Node2->Node3 + + + + + +Node4 + + +penify_hook.commands.config +_commands.get_penify_config + + + + + +Node2->Node4 + + + + + +Node6 + + +penify_hook.commands.config +_commands.load_env_files + + + + + +Node2->Node6 + + + + + +Node5 + + +penify_hook.utils.recursive +_search_git_folder + + + + + +Node4->Node5 + + + + + +Node5->Node5 + + + + + +Node6->Node5 + + + + + +Node6->Node6 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/html/classtests_1_1test__config__commands_1_1TestConfigCommands_a6c0207be563c3de59a6d16277805114c_cgraph_org.svg b/docs/html/classtests_1_1test__config__commands_1_1TestConfigCommands_a6c0207be563c3de59a6d16277805114c_cgraph_org.svg new file mode 100644 index 0000000..9a84079 --- /dev/null +++ b/docs/html/classtests_1_1test__config__commands_1_1TestConfigCommands_a6c0207be563c3de59a6d16277805114c_cgraph_org.svg @@ -0,0 +1,123 @@ + + + + + + +tests.test_config_commands.TestConfigCommands.test_get_token_from_config + + + +Node1 + + +tests.test_config_commands. +TestConfigCommands.test +_get_token_from_config + + + + + +Node2 + + +penify_hook.commands.config +_commands.get_token + + + + + +Node1->Node2 + + + + + +Node3 + + +penify_hook.commands.config +_commands.get_env_var_or +_default + + + + + +Node2->Node3 + + + + + +Node4 + + +penify_hook.commands.config +_commands.get_penify_config + + + + + +Node2->Node4 + + + + + +Node6 + + +penify_hook.commands.config +_commands.load_env_files + + + + + +Node2->Node6 + + + + + +Node5 + + +penify_hook.utils.recursive +_search_git_folder + + + + + +Node4->Node5 + + + + + +Node5->Node5 + + + + + +Node6->Node5 + + + + + +Node6->Node6 + + + + + diff --git a/docs/html/classtests_1_1test__config__commands_1_1TestConfigCommands_a73a264dfb21e16003e095b79f6eab2ac_cgraph.map b/docs/html/classtests_1_1test__config__commands_1_1TestConfigCommands_a73a264dfb21e16003e095b79f6eab2ac_cgraph.map new file mode 100644 index 0000000..27f9795 --- /dev/null +++ b/docs/html/classtests_1_1test__config__commands_1_1TestConfigCommands_a73a264dfb21e16003e095b79f6eab2ac_cgraph.map @@ -0,0 +1,5 @@ + + + + + diff --git a/docs/html/classtests_1_1test__config__commands_1_1TestConfigCommands_a73a264dfb21e16003e095b79f6eab2ac_cgraph.md5 b/docs/html/classtests_1_1test__config__commands_1_1TestConfigCommands_a73a264dfb21e16003e095b79f6eab2ac_cgraph.md5 new file mode 100644 index 0000000..d5a551d --- /dev/null +++ b/docs/html/classtests_1_1test__config__commands_1_1TestConfigCommands_a73a264dfb21e16003e095b79f6eab2ac_cgraph.md5 @@ -0,0 +1 @@ +2efae0628f3580e167ff4e2e9744ff76 \ No newline at end of file diff --git a/docs/html/classtests_1_1test__config__commands_1_1TestConfigCommands_a73a264dfb21e16003e095b79f6eab2ac_cgraph.svg b/docs/html/classtests_1_1test__config__commands_1_1TestConfigCommands_a73a264dfb21e16003e095b79f6eab2ac_cgraph.svg new file mode 100644 index 0000000..48f17d2 --- /dev/null +++ b/docs/html/classtests_1_1test__config__commands_1_1TestConfigCommands_a73a264dfb21e16003e095b79f6eab2ac_cgraph.svg @@ -0,0 +1,150 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +tests.test_config_commands.TestConfigCommands.test_save_llm_config_failure + + + +Node1 + + +tests.test_config_commands. +TestConfigCommands.test +_save_llm_config_failure + + + + + +Node2 + + +penify_hook.commands.config +_commands.save_llm_config + + + + + +Node1->Node2 + + + + + +Node3 + + +penify_hook.utils.recursive +_search_git_folder + + + + + +Node2->Node3 + + + + + +Node3->Node3 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/html/classtests_1_1test__config__commands_1_1TestConfigCommands_a73a264dfb21e16003e095b79f6eab2ac_cgraph_org.svg b/docs/html/classtests_1_1test__config__commands_1_1TestConfigCommands_a73a264dfb21e16003e095b79f6eab2ac_cgraph_org.svg new file mode 100644 index 0000000..f52311f --- /dev/null +++ b/docs/html/classtests_1_1test__config__commands_1_1TestConfigCommands_a73a264dfb21e16003e095b79f6eab2ac_cgraph_org.svg @@ -0,0 +1,62 @@ + + + + + + +tests.test_config_commands.TestConfigCommands.test_save_llm_config_failure + + + +Node1 + + +tests.test_config_commands. +TestConfigCommands.test +_save_llm_config_failure + + + + + +Node2 + + +penify_hook.commands.config +_commands.save_llm_config + + + + + +Node1->Node2 + + + + + +Node3 + + +penify_hook.utils.recursive +_search_git_folder + + + + + +Node2->Node3 + + + + + +Node3->Node3 + + + + + diff --git a/docs/html/classtests_1_1test__config__commands_1_1TestConfigCommands_abd12f028b89aa9cd1152c0b9ece5d3cd_cgraph.map b/docs/html/classtests_1_1test__config__commands_1_1TestConfigCommands_abd12f028b89aa9cd1152c0b9ece5d3cd_cgraph.map new file mode 100644 index 0000000..9e0e801 --- /dev/null +++ b/docs/html/classtests_1_1test__config__commands_1_1TestConfigCommands_abd12f028b89aa9cd1152c0b9ece5d3cd_cgraph.map @@ -0,0 +1,7 @@ + + + + + + + diff --git a/docs/html/classtests_1_1test__config__commands_1_1TestConfigCommands_abd12f028b89aa9cd1152c0b9ece5d3cd_cgraph.md5 b/docs/html/classtests_1_1test__config__commands_1_1TestConfigCommands_abd12f028b89aa9cd1152c0b9ece5d3cd_cgraph.md5 new file mode 100644 index 0000000..b6d0832 --- /dev/null +++ b/docs/html/classtests_1_1test__config__commands_1_1TestConfigCommands_abd12f028b89aa9cd1152c0b9ece5d3cd_cgraph.md5 @@ -0,0 +1 @@ +ccb36b28b36810b7debb14198aa8c840 \ No newline at end of file diff --git a/docs/html/classtests_1_1test__config__commands_1_1TestConfigCommands_abd12f028b89aa9cd1152c0b9ece5d3cd_cgraph.svg b/docs/html/classtests_1_1test__config__commands_1_1TestConfigCommands_abd12f028b89aa9cd1152c0b9ece5d3cd_cgraph.svg new file mode 100644 index 0000000..8e3f6ab --- /dev/null +++ b/docs/html/classtests_1_1test__config__commands_1_1TestConfigCommands_abd12f028b89aa9cd1152c0b9ece5d3cd_cgraph.svg @@ -0,0 +1,189 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +tests.test_config_commands.TestConfigCommands.test_get_llm_config_empty + + + +Node1 + + +tests.test_config_commands. +TestConfigCommands.test +_get_llm_config_empty + + + + + +Node2 + + +penify_hook.commands.config +_commands.get_llm_config + + + + + +Node1->Node2 + + + + + +Node3 + + +penify_hook.commands.config +_commands.get_env_var_or +_default + + + + + +Node2->Node3 + + + + + +Node4 + + +penify_hook.commands.config +_commands.load_env_files + + + + + +Node2->Node4 + + + + + +Node4->Node4 + + + + + +Node5 + + +penify_hook.utils.recursive +_search_git_folder + + + + + +Node4->Node5 + + + + + +Node5->Node5 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/html/classtests_1_1test__config__commands_1_1TestConfigCommands_abd12f028b89aa9cd1152c0b9ece5d3cd_cgraph_org.svg b/docs/html/classtests_1_1test__config__commands_1_1TestConfigCommands_abd12f028b89aa9cd1152c0b9ece5d3cd_cgraph_org.svg new file mode 100644 index 0000000..325a4d7 --- /dev/null +++ b/docs/html/classtests_1_1test__config__commands_1_1TestConfigCommands_abd12f028b89aa9cd1152c0b9ece5d3cd_cgraph_org.svg @@ -0,0 +1,101 @@ + + + + + + +tests.test_config_commands.TestConfigCommands.test_get_llm_config_empty + + + +Node1 + + +tests.test_config_commands. +TestConfigCommands.test +_get_llm_config_empty + + + + + +Node2 + + +penify_hook.commands.config +_commands.get_llm_config + + + + + +Node1->Node2 + + + + + +Node3 + + +penify_hook.commands.config +_commands.get_env_var_or +_default + + + + + +Node2->Node3 + + + + + +Node4 + + +penify_hook.commands.config +_commands.load_env_files + + + + + +Node2->Node4 + + + + + +Node4->Node4 + + + + + +Node5 + + +penify_hook.utils.recursive +_search_git_folder + + + + + +Node4->Node5 + + + + + +Node5->Node5 + + + + + diff --git a/docs/html/classtests_1_1test__config__commands_1_1TestConfigCommands_acd8df8219441b9e9871b903a681400d9_cgraph.map b/docs/html/classtests_1_1test__config__commands_1_1TestConfigCommands_acd8df8219441b9e9871b903a681400d9_cgraph.map new file mode 100644 index 0000000..cb3426e --- /dev/null +++ b/docs/html/classtests_1_1test__config__commands_1_1TestConfigCommands_acd8df8219441b9e9871b903a681400d9_cgraph.map @@ -0,0 +1,5 @@ + + + + + diff --git a/docs/html/classtests_1_1test__config__commands_1_1TestConfigCommands_acd8df8219441b9e9871b903a681400d9_cgraph.md5 b/docs/html/classtests_1_1test__config__commands_1_1TestConfigCommands_acd8df8219441b9e9871b903a681400d9_cgraph.md5 new file mode 100644 index 0000000..616400e --- /dev/null +++ b/docs/html/classtests_1_1test__config__commands_1_1TestConfigCommands_acd8df8219441b9e9871b903a681400d9_cgraph.md5 @@ -0,0 +1 @@ +2dda560e911927ca62424d428f826e98 \ No newline at end of file diff --git a/docs/html/classtests_1_1test__config__commands_1_1TestConfigCommands_acd8df8219441b9e9871b903a681400d9_cgraph.svg b/docs/html/classtests_1_1test__config__commands_1_1TestConfigCommands_acd8df8219441b9e9871b903a681400d9_cgraph.svg new file mode 100644 index 0000000..657b852 --- /dev/null +++ b/docs/html/classtests_1_1test__config__commands_1_1TestConfigCommands_acd8df8219441b9e9871b903a681400d9_cgraph.svg @@ -0,0 +1,150 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +tests.test_config_commands.TestConfigCommands.test_save_llm_config_success + + + +Node1 + + +tests.test_config_commands. +TestConfigCommands.test +_save_llm_config_success + + + + + +Node2 + + +penify_hook.commands.config +_commands.save_llm_config + + + + + +Node1->Node2 + + + + + +Node3 + + +penify_hook.utils.recursive +_search_git_folder + + + + + +Node2->Node3 + + + + + +Node3->Node3 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/html/classtests_1_1test__config__commands_1_1TestConfigCommands_acd8df8219441b9e9871b903a681400d9_cgraph_org.svg b/docs/html/classtests_1_1test__config__commands_1_1TestConfigCommands_acd8df8219441b9e9871b903a681400d9_cgraph_org.svg new file mode 100644 index 0000000..cf3f2f3 --- /dev/null +++ b/docs/html/classtests_1_1test__config__commands_1_1TestConfigCommands_acd8df8219441b9e9871b903a681400d9_cgraph_org.svg @@ -0,0 +1,62 @@ + + + + + + +tests.test_config_commands.TestConfigCommands.test_save_llm_config_success + + + +Node1 + + +tests.test_config_commands. +TestConfigCommands.test +_save_llm_config_success + + + + + +Node2 + + +penify_hook.commands.config +_commands.save_llm_config + + + + + +Node1->Node2 + + + + + +Node3 + + +penify_hook.utils.recursive +_search_git_folder + + + + + +Node2->Node3 + + + + + +Node3->Node3 + + + + + diff --git a/docs/html/classtests_1_1test__config__commands_1_1TestConfigCommands_adf9f2233a3f4cc5725b9d4f05758b167_cgraph.map b/docs/html/classtests_1_1test__config__commands_1_1TestConfigCommands_adf9f2233a3f4cc5725b9d4f05758b167_cgraph.map new file mode 100644 index 0000000..98b03e3 --- /dev/null +++ b/docs/html/classtests_1_1test__config__commands_1_1TestConfigCommands_adf9f2233a3f4cc5725b9d4f05758b167_cgraph.map @@ -0,0 +1,7 @@ + + + + + + + diff --git a/docs/html/classtests_1_1test__config__commands_1_1TestConfigCommands_adf9f2233a3f4cc5725b9d4f05758b167_cgraph.md5 b/docs/html/classtests_1_1test__config__commands_1_1TestConfigCommands_adf9f2233a3f4cc5725b9d4f05758b167_cgraph.md5 new file mode 100644 index 0000000..5292fed --- /dev/null +++ b/docs/html/classtests_1_1test__config__commands_1_1TestConfigCommands_adf9f2233a3f4cc5725b9d4f05758b167_cgraph.md5 @@ -0,0 +1 @@ +8a521fb6ddaca64c6678d226bec595a0 \ No newline at end of file diff --git a/docs/html/classtests_1_1test__config__commands_1_1TestConfigCommands_adf9f2233a3f4cc5725b9d4f05758b167_cgraph.svg b/docs/html/classtests_1_1test__config__commands_1_1TestConfigCommands_adf9f2233a3f4cc5725b9d4f05758b167_cgraph.svg new file mode 100644 index 0000000..6c791c9 --- /dev/null +++ b/docs/html/classtests_1_1test__config__commands_1_1TestConfigCommands_adf9f2233a3f4cc5725b9d4f05758b167_cgraph.svg @@ -0,0 +1,189 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +tests.test_config_commands.TestConfigCommands.test_get_llm_config_exists + + + +Node1 + + +tests.test_config_commands. +TestConfigCommands.test +_get_llm_config_exists + + + + + +Node2 + + +penify_hook.commands.config +_commands.get_llm_config + + + + + +Node1->Node2 + + + + + +Node3 + + +penify_hook.commands.config +_commands.get_env_var_or +_default + + + + + +Node2->Node3 + + + + + +Node4 + + +penify_hook.commands.config +_commands.load_env_files + + + + + +Node2->Node4 + + + + + +Node4->Node4 + + + + + +Node5 + + +penify_hook.utils.recursive +_search_git_folder + + + + + +Node4->Node5 + + + + + +Node5->Node5 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/html/classtests_1_1test__config__commands_1_1TestConfigCommands_adf9f2233a3f4cc5725b9d4f05758b167_cgraph_org.svg b/docs/html/classtests_1_1test__config__commands_1_1TestConfigCommands_adf9f2233a3f4cc5725b9d4f05758b167_cgraph_org.svg new file mode 100644 index 0000000..9c3f7c4 --- /dev/null +++ b/docs/html/classtests_1_1test__config__commands_1_1TestConfigCommands_adf9f2233a3f4cc5725b9d4f05758b167_cgraph_org.svg @@ -0,0 +1,101 @@ + + + + + + +tests.test_config_commands.TestConfigCommands.test_get_llm_config_exists + + + +Node1 + + +tests.test_config_commands. +TestConfigCommands.test +_get_llm_config_exists + + + + + +Node2 + + +penify_hook.commands.config +_commands.get_llm_config + + + + + +Node1->Node2 + + + + + +Node3 + + +penify_hook.commands.config +_commands.get_env_var_or +_default + + + + + +Node2->Node3 + + + + + +Node4 + + +penify_hook.commands.config +_commands.load_env_files + + + + + +Node2->Node4 + + + + + +Node4->Node4 + + + + + +Node5 + + +penify_hook.utils.recursive +_search_git_folder + + + + + +Node4->Node5 + + + + + +Node5->Node5 + + + + + diff --git a/docs/html/classtests_1_1test__config__commands_1_1TestConfigCommands_aee37b97432821d19758c6325d4c74bcf_cgraph.map b/docs/html/classtests_1_1test__config__commands_1_1TestConfigCommands_aee37b97432821d19758c6325d4c74bcf_cgraph.map new file mode 100644 index 0000000..d0930f3 --- /dev/null +++ b/docs/html/classtests_1_1test__config__commands_1_1TestConfigCommands_aee37b97432821d19758c6325d4c74bcf_cgraph.map @@ -0,0 +1,7 @@ + + + + + + + diff --git a/docs/html/classtests_1_1test__config__commands_1_1TestConfigCommands_aee37b97432821d19758c6325d4c74bcf_cgraph.md5 b/docs/html/classtests_1_1test__config__commands_1_1TestConfigCommands_aee37b97432821d19758c6325d4c74bcf_cgraph.md5 new file mode 100644 index 0000000..904ab8d --- /dev/null +++ b/docs/html/classtests_1_1test__config__commands_1_1TestConfigCommands_aee37b97432821d19758c6325d4c74bcf_cgraph.md5 @@ -0,0 +1 @@ +6fbf377ddd24e2b0afa956a95f55e6c5 \ No newline at end of file diff --git a/docs/html/classtests_1_1test__config__commands_1_1TestConfigCommands_aee37b97432821d19758c6325d4c74bcf_cgraph.svg b/docs/html/classtests_1_1test__config__commands_1_1TestConfigCommands_aee37b97432821d19758c6325d4c74bcf_cgraph.svg new file mode 100644 index 0000000..e31aeb0 --- /dev/null +++ b/docs/html/classtests_1_1test__config__commands_1_1TestConfigCommands_aee37b97432821d19758c6325d4c74bcf_cgraph.svg @@ -0,0 +1,189 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +tests.test_config_commands.TestConfigCommands.test_get_jira_config_exists + + + +Node1 + + +tests.test_config_commands. +TestConfigCommands.test +_get_jira_config_exists + + + + + +Node2 + + +penify_hook.commands.config +_commands.get_jira_config + + + + + +Node1->Node2 + + + + + +Node3 + + +penify_hook.commands.config +_commands.get_env_var_or +_default + + + + + +Node2->Node3 + + + + + +Node4 + + +penify_hook.commands.config +_commands.load_env_files + + + + + +Node2->Node4 + + + + + +Node4->Node4 + + + + + +Node5 + + +penify_hook.utils.recursive +_search_git_folder + + + + + +Node4->Node5 + + + + + +Node5->Node5 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/html/classtests_1_1test__config__commands_1_1TestConfigCommands_aee37b97432821d19758c6325d4c74bcf_cgraph_org.svg b/docs/html/classtests_1_1test__config__commands_1_1TestConfigCommands_aee37b97432821d19758c6325d4c74bcf_cgraph_org.svg new file mode 100644 index 0000000..19057f1 --- /dev/null +++ b/docs/html/classtests_1_1test__config__commands_1_1TestConfigCommands_aee37b97432821d19758c6325d4c74bcf_cgraph_org.svg @@ -0,0 +1,101 @@ + + + + + + +tests.test_config_commands.TestConfigCommands.test_get_jira_config_exists + + + +Node1 + + +tests.test_config_commands. +TestConfigCommands.test +_get_jira_config_exists + + + + + +Node2 + + +penify_hook.commands.config +_commands.get_jira_config + + + + + +Node1->Node2 + + + + + +Node3 + + +penify_hook.commands.config +_commands.get_env_var_or +_default + + + + + +Node2->Node3 + + + + + +Node4 + + +penify_hook.commands.config +_commands.load_env_files + + + + + +Node2->Node4 + + + + + +Node4->Node4 + + + + + +Node5 + + +penify_hook.utils.recursive +_search_git_folder + + + + + +Node4->Node5 + + + + + +Node5->Node5 + + + + + diff --git a/docs/html/classtests_1_1test__config__commands_1_1TestConfigCommands_af8d62310da2d768e21770f8f01ff5375_cgraph.map b/docs/html/classtests_1_1test__config__commands_1_1TestConfigCommands_af8d62310da2d768e21770f8f01ff5375_cgraph.map new file mode 100644 index 0000000..7a6d255 --- /dev/null +++ b/docs/html/classtests_1_1test__config__commands_1_1TestConfigCommands_af8d62310da2d768e21770f8f01ff5375_cgraph.map @@ -0,0 +1,5 @@ + + + + + diff --git a/docs/html/classtests_1_1test__config__commands_1_1TestConfigCommands_af8d62310da2d768e21770f8f01ff5375_cgraph.md5 b/docs/html/classtests_1_1test__config__commands_1_1TestConfigCommands_af8d62310da2d768e21770f8f01ff5375_cgraph.md5 new file mode 100644 index 0000000..68d6c1c --- /dev/null +++ b/docs/html/classtests_1_1test__config__commands_1_1TestConfigCommands_af8d62310da2d768e21770f8f01ff5375_cgraph.md5 @@ -0,0 +1 @@ +2e054bb79c0b6f45c4788678aac6e514 \ No newline at end of file diff --git a/docs/html/classtests_1_1test__config__commands_1_1TestConfigCommands_af8d62310da2d768e21770f8f01ff5375_cgraph.svg b/docs/html/classtests_1_1test__config__commands_1_1TestConfigCommands_af8d62310da2d768e21770f8f01ff5375_cgraph.svg new file mode 100644 index 0000000..e18fa25 --- /dev/null +++ b/docs/html/classtests_1_1test__config__commands_1_1TestConfigCommands_af8d62310da2d768e21770f8f01ff5375_cgraph.svg @@ -0,0 +1,150 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +tests.test_config_commands.TestConfigCommands.test_save_jira_config_success + + + +Node1 + + +tests.test_config_commands. +TestConfigCommands.test +_save_jira_config_success + + + + + +Node2 + + +penify_hook.commands.config +_commands.save_jira_config + + + + + +Node1->Node2 + + + + + +Node3 + + +penify_hook.utils.recursive +_search_git_folder + + + + + +Node2->Node3 + + + + + +Node3->Node3 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/html/classtests_1_1test__config__commands_1_1TestConfigCommands_af8d62310da2d768e21770f8f01ff5375_cgraph_org.svg b/docs/html/classtests_1_1test__config__commands_1_1TestConfigCommands_af8d62310da2d768e21770f8f01ff5375_cgraph_org.svg new file mode 100644 index 0000000..eaa2159 --- /dev/null +++ b/docs/html/classtests_1_1test__config__commands_1_1TestConfigCommands_af8d62310da2d768e21770f8f01ff5375_cgraph_org.svg @@ -0,0 +1,62 @@ + + + + + + +tests.test_config_commands.TestConfigCommands.test_save_jira_config_success + + + +Node1 + + +tests.test_config_commands. +TestConfigCommands.test +_save_jira_config_success + + + + + +Node2 + + +penify_hook.commands.config +_commands.save_jira_config + + + + + +Node1->Node2 + + + + + +Node3 + + +penify_hook.utils.recursive +_search_git_folder + + + + + +Node2->Node3 + + + + + +Node3->Node3 + + + + + diff --git a/docs/html/classtests_1_1test__web__config_1_1TestWebConfig-members.html b/docs/html/classtests_1_1test__web__config_1_1TestWebConfig-members.html new file mode 100644 index 0000000..1eccc51 --- /dev/null +++ b/docs/html/classtests_1_1test__web__config_1_1TestWebConfig-members.html @@ -0,0 +1,134 @@ + + + + + + + + + + + + + + + + + + +penify-cli: Member List + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
penify-cli +
+
+
+ + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
tests.test_web_config.TestWebConfig Member List
+
+
+ +

This is the complete list of members for tests.test_web_config.TestWebConfig, including all inherited members.

+ + + +
test_config_jira_web_server_setup(self, mock_resource_filename, mock_server, mock_webbrowser)tests.test_web_config.TestWebConfig
test_config_llm_web_server_setup(self, mock_resource_filename, mock_server, mock_webbrowser)tests.test_web_config.TestWebConfig
+
+ + + + + diff --git a/docs/html/classtests_1_1test__web__config_1_1TestWebConfig.html b/docs/html/classtests_1_1test__web__config_1_1TestWebConfig.html new file mode 100644 index 0000000..9aeae37 --- /dev/null +++ b/docs/html/classtests_1_1test__web__config_1_1TestWebConfig.html @@ -0,0 +1,268 @@ + + + + + + + + + + + + + + + + + + +penify-cli: tests.test_web_config.TestWebConfig Class Reference + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
penify-cli +
+
+
+ + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+ +
tests.test_web_config.TestWebConfig Class Reference
+
+
+
+Collaboration diagram for tests.test_web_config.TestWebConfig:
+
+
+
+
+ + + + + + +

+Public Member Functions

def test_config_llm_web_server_setup (self, mock_resource_filename, mock_server, mock_webbrowser)
 
def test_config_jira_web_server_setup (self, mock_resource_filename, mock_server, mock_webbrowser)
 
+

Member Function Documentation

+ +

◆ test_config_jira_web_server_setup()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
def tests.test_web_config.TestWebConfig.test_config_jira_web_server_setup ( self,
 mock_resource_filename,
 mock_server,
 mock_webbrowser 
)
+
+
Test the configuration and setup of a JIRA web server.
+
+This function tests the entire process of setting up a JIRA web server,
+including mocking necessary resources, configuring the server to shut
+down after handling one request, and verifying that the web browser is
+opened with the correct URL. The function uses several mocks to simulate
+external dependencies such as resource files, servers, and web browsers.
+
+Args:
+    mock_resource_filename (MagicMock): A MagicMock object for simulating the `resource_filename` function.
+    mock_server (MagicMock): A MagicMock object for simulating the server setup.
+    mock_webbrowser (MagicMock): A MagicMock object for simulating the web browser opening.
+
+Here is the call graph for this function:
+
+
+
+
+ +
+
+ +

◆ test_config_llm_web_server_setup()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
def tests.test_web_config.TestWebConfig.test_config_llm_web_server_setup ( self,
 mock_resource_filename,
 mock_server,
 mock_webbrowser 
)
+
+
Set up and test the web server configuration for an LLM (Large Language
+Model) web interface.
+
+This function configures a mock web server for testing purposes,
+including setting up resource filenames, mocking server behavior, and
+verifying that the web browser is opened and the server starts
+correctly. The function uses various mocks to simulate external
+dependencies such as `resource_filename` and `server`.
+
+Args:
+    mock_resource_filename (MagicMock): A MagicMock object simulating the `resource_filename` function.
+    mock_server (MagicMock): A MagicMock object simulating the context manager for the web server.
+    mock_webbrowser (MagicMock): A MagicMock object simulating the `webbrowser` module.
+
+Here is the call graph for this function:
+
+
+
+
+ +
+
+
The documentation for this class was generated from the following file: +
+
+ + + + + diff --git a/docs/html/classtests_1_1test__web__config_1_1TestWebConfig.js b/docs/html/classtests_1_1test__web__config_1_1TestWebConfig.js new file mode 100644 index 0000000..64ea648 --- /dev/null +++ b/docs/html/classtests_1_1test__web__config_1_1TestWebConfig.js @@ -0,0 +1,5 @@ +var classtests_1_1test__web__config_1_1TestWebConfig = +[ + [ "test_config_jira_web_server_setup", "classtests_1_1test__web__config_1_1TestWebConfig.html#a06e600222e426b003850509cb1d3190a", null ], + [ "test_config_llm_web_server_setup", "classtests_1_1test__web__config_1_1TestWebConfig.html#afc6440352201d207ea8b4d26f8ccfa35", null ] +]; \ No newline at end of file diff --git a/docs/html/classtests_1_1test__web__config_1_1TestWebConfig__coll__graph.map b/docs/html/classtests_1_1test__web__config_1_1TestWebConfig__coll__graph.map new file mode 100644 index 0000000..77d4a58 --- /dev/null +++ b/docs/html/classtests_1_1test__web__config_1_1TestWebConfig__coll__graph.map @@ -0,0 +1,3 @@ + + + diff --git a/docs/html/classtests_1_1test__web__config_1_1TestWebConfig__coll__graph.md5 b/docs/html/classtests_1_1test__web__config_1_1TestWebConfig__coll__graph.md5 new file mode 100644 index 0000000..f0a528b --- /dev/null +++ b/docs/html/classtests_1_1test__web__config_1_1TestWebConfig__coll__graph.md5 @@ -0,0 +1 @@ +ab8cbd57a4ebb302c58c19a4efbc1c6e \ No newline at end of file diff --git a/docs/html/classtests_1_1test__web__config_1_1TestWebConfig__coll__graph.svg b/docs/html/classtests_1_1test__web__config_1_1TestWebConfig__coll__graph.svg new file mode 100644 index 0000000..acbac22 --- /dev/null +++ b/docs/html/classtests_1_1test__web__config_1_1TestWebConfig__coll__graph.svg @@ -0,0 +1,30 @@ + + + + + + +tests.test_web_config.TestWebConfig + + + +Node1 + + +tests.test_web_config.Test +WebConfig + + + ++ test_config_llm_web +_server_setup() ++ test_config_jira_web +_server_setup() + + + + + diff --git a/docs/html/classtests_1_1test__web__config_1_1TestWebConfig_a06e600222e426b003850509cb1d3190a_cgraph.map b/docs/html/classtests_1_1test__web__config_1_1TestWebConfig_a06e600222e426b003850509cb1d3190a_cgraph.map new file mode 100644 index 0000000..249e111 --- /dev/null +++ b/docs/html/classtests_1_1test__web__config_1_1TestWebConfig_a06e600222e426b003850509cb1d3190a_cgraph.map @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/docs/html/classtests_1_1test__web__config_1_1TestWebConfig_a06e600222e426b003850509cb1d3190a_cgraph.md5 b/docs/html/classtests_1_1test__web__config_1_1TestWebConfig_a06e600222e426b003850509cb1d3190a_cgraph.md5 new file mode 100644 index 0000000..064b512 --- /dev/null +++ b/docs/html/classtests_1_1test__web__config_1_1TestWebConfig_a06e600222e426b003850509cb1d3190a_cgraph.md5 @@ -0,0 +1 @@ +40be6a2b68a00531af40fd3546a6f158 \ No newline at end of file diff --git a/docs/html/classtests_1_1test__web__config_1_1TestWebConfig_a06e600222e426b003850509cb1d3190a_cgraph.svg b/docs/html/classtests_1_1test__web__config_1_1TestWebConfig_a06e600222e426b003850509cb1d3190a_cgraph.svg new file mode 100644 index 0000000..ba12fb0 --- /dev/null +++ b/docs/html/classtests_1_1test__web__config_1_1TestWebConfig_a06e600222e426b003850509cb1d3190a_cgraph.svg @@ -0,0 +1,227 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +tests.test_web_config.TestWebConfig.test_config_jira_web_server_setup + + + +Node1 + + +tests.test_web_config.Test +WebConfig.test_config_jira +_web_server_setup + + + + + +Node2 + + +penify_hook.commands.config +_commands.config_jira_web + + + + + +Node1->Node2 + + + + + +Node3 + + +penify_hook.commands.config +_commands.get_jira_config + + + + + +Node2->Node3 + + + + + +Node7 + + +penify_hook.commands.config +_commands.save_jira_config + + + + + +Node2->Node7 + + + + + +Node4 + + +penify_hook.commands.config +_commands.get_env_var_or +_default + + + + + +Node3->Node4 + + + + + +Node5 + + +penify_hook.commands.config +_commands.load_env_files + + + + + +Node3->Node5 + + + + + +Node5->Node5 + + + + + +Node6 + + +penify_hook.utils.recursive +_search_git_folder + + + + + +Node5->Node6 + + + + + +Node6->Node6 + + + + + +Node7->Node6 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/html/classtests_1_1test__web__config_1_1TestWebConfig_a06e600222e426b003850509cb1d3190a_cgraph_org.svg b/docs/html/classtests_1_1test__web__config_1_1TestWebConfig_a06e600222e426b003850509cb1d3190a_cgraph_org.svg new file mode 100644 index 0000000..6325fbe --- /dev/null +++ b/docs/html/classtests_1_1test__web__config_1_1TestWebConfig_a06e600222e426b003850509cb1d3190a_cgraph_org.svg @@ -0,0 +1,139 @@ + + + + + + +tests.test_web_config.TestWebConfig.test_config_jira_web_server_setup + + + +Node1 + + +tests.test_web_config.Test +WebConfig.test_config_jira +_web_server_setup + + + + + +Node2 + + +penify_hook.commands.config +_commands.config_jira_web + + + + + +Node1->Node2 + + + + + +Node3 + + +penify_hook.commands.config +_commands.get_jira_config + + + + + +Node2->Node3 + + + + + +Node7 + + +penify_hook.commands.config +_commands.save_jira_config + + + + + +Node2->Node7 + + + + + +Node4 + + +penify_hook.commands.config +_commands.get_env_var_or +_default + + + + + +Node3->Node4 + + + + + +Node5 + + +penify_hook.commands.config +_commands.load_env_files + + + + + +Node3->Node5 + + + + + +Node5->Node5 + + + + + +Node6 + + +penify_hook.utils.recursive +_search_git_folder + + + + + +Node5->Node6 + + + + + +Node6->Node6 + + + + + +Node7->Node6 + + + + + diff --git a/docs/html/classtests_1_1test__web__config_1_1TestWebConfig_afc6440352201d207ea8b4d26f8ccfa35_cgraph.map b/docs/html/classtests_1_1test__web__config_1_1TestWebConfig_afc6440352201d207ea8b4d26f8ccfa35_cgraph.map new file mode 100644 index 0000000..0befd5a --- /dev/null +++ b/docs/html/classtests_1_1test__web__config_1_1TestWebConfig_afc6440352201d207ea8b4d26f8ccfa35_cgraph.map @@ -0,0 +1,4 @@ + + + + diff --git a/docs/html/classtests_1_1test__web__config_1_1TestWebConfig_afc6440352201d207ea8b4d26f8ccfa35_cgraph.md5 b/docs/html/classtests_1_1test__web__config_1_1TestWebConfig_afc6440352201d207ea8b4d26f8ccfa35_cgraph.md5 new file mode 100644 index 0000000..2632d9a --- /dev/null +++ b/docs/html/classtests_1_1test__web__config_1_1TestWebConfig_afc6440352201d207ea8b4d26f8ccfa35_cgraph.md5 @@ -0,0 +1 @@ +5ca25c9e4be6eb96370b0328e2a5e679 \ No newline at end of file diff --git a/docs/html/classtests_1_1test__web__config_1_1TestWebConfig_afc6440352201d207ea8b4d26f8ccfa35_cgraph.svg b/docs/html/classtests_1_1test__web__config_1_1TestWebConfig_afc6440352201d207ea8b4d26f8ccfa35_cgraph.svg new file mode 100644 index 0000000..a5b8af9 --- /dev/null +++ b/docs/html/classtests_1_1test__web__config_1_1TestWebConfig_afc6440352201d207ea8b4d26f8ccfa35_cgraph.svg @@ -0,0 +1,40 @@ + + + + + + +tests.test_web_config.TestWebConfig.test_config_llm_web_server_setup + + + +Node1 + + +tests.test_web_config.Test +WebConfig.test_config_llm +_web_server_setup + + + + + +Node2 + + +penify_hook.commands.config +_commands.config_llm_web + + + + + +Node1->Node2 + + + + + diff --git a/docs/html/closed.png b/docs/html/closed.png new file mode 100644 index 0000000000000000000000000000000000000000..98cc2c909da37a6df914fbf67780eebd99c597f5 GIT binary patch literal 132 zcmeAS@N?(olHy`uVBq!ia0vp^oFL4>1|%O$WD@{V-kvUwAr*{o@8{^CZMh(5KoB^r_<4^zF@3)Cp&&t3hdujKf f*?bjBoY!V+E))@{xMcbjXe@)LtDnm{r-UW|*e5JT literal 0 HcmV?d00001 diff --git a/docs/html/commit-commands_8md.html b/docs/html/commit-commands_8md.html new file mode 100644 index 0000000..e4db4ba --- /dev/null +++ b/docs/html/commit-commands_8md.html @@ -0,0 +1,130 @@ + + + + + + + + + + + + + + + + + + +penify-cli: /tmp/github_reposRepoArchDocGenContext/Penify-dev/penify-cli/docs/commit-commands.md File Reference + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
penify-cli +
+
+
+ + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
/tmp/github_reposRepoArchDocGenContext/Penify-dev/penify-cli/docs/commit-commands.md File Reference
+
+
+
+
+ + + + + diff --git a/docs/html/commit__analyzer_8py.html b/docs/html/commit__analyzer_8py.html new file mode 100644 index 0000000..ab7e416 --- /dev/null +++ b/docs/html/commit__analyzer_8py.html @@ -0,0 +1,146 @@ + + + + + + + + + + + + + + + + + + +penify-cli: /tmp/github_reposRepoArchDocGenContext/Penify-dev/penify-cli/penify_hook/commit_analyzer.py File Reference + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
penify-cli +
+
+
+ + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+ +
commit_analyzer.py File Reference
+
+
+ + + + +

+Classes

class  penify_hook.commit_analyzer.CommitDocGenHook
 
+ + + + + +

+Namespaces

namespace  penify_hook
 
namespace  penify_hook.commit_analyzer
 
+
+
+ + + + + diff --git a/docs/html/commit__analyzer_8py.js b/docs/html/commit__analyzer_8py.js new file mode 100644 index 0000000..d7c51ca --- /dev/null +++ b/docs/html/commit__analyzer_8py.js @@ -0,0 +1,4 @@ +var commit__analyzer_8py = +[ + [ "penify_hook.commit_analyzer.CommitDocGenHook", "classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook.html", "classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook" ] +]; \ No newline at end of file diff --git a/docs/html/commit__commands_8py.html b/docs/html/commit__commands_8py.html new file mode 100644 index 0000000..222282f --- /dev/null +++ b/docs/html/commit__commands_8py.html @@ -0,0 +1,152 @@ + + + + + + + + + + + + + + + + + + +penify-cli: /tmp/github_reposRepoArchDocGenContext/Penify-dev/penify-cli/penify_hook/commands/commit_commands.py File Reference + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
penify-cli +
+
+
+ + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+ +
commit_commands.py File Reference
+
+
+ + + + + + + + +

+Namespaces

namespace  penify_hook
 
namespace  penify_hook.commands
 
namespace  penify_hook.commands.commit_commands
 
+ + + + + + + +

+Functions

def penify_hook.commands.commit_commands.commit_code (api_url, token, message, open_terminal, generate_description, llm_model=None, llm_api_base=None, llm_api_key=None, jira_url=None, jira_user=None, jira_api_token=None)
 
def penify_hook.commands.commit_commands.setup_commit_parser (parser)
 
def penify_hook.commands.commit_commands.handle_commit (args)
 
+
+
+ + + + + diff --git a/docs/html/commit__commands_8py.js b/docs/html/commit__commands_8py.js new file mode 100644 index 0000000..823f902 --- /dev/null +++ b/docs/html/commit__commands_8py.js @@ -0,0 +1,6 @@ +var commit__commands_8py = +[ + [ "commit_code", "commit__commands_8py.html#a62564c4e8ad59fc46d56cb0f9122a71a", null ], + [ "handle_commit", "commit__commands_8py.html#af4f739f524c38b437e4e47673d683e23", null ], + [ "setup_commit_parser", "commit__commands_8py.html#a8627583116eb78e31a4d3cdc16d2f15c", null ] +]; \ No newline at end of file diff --git a/docs/html/config-commands_8md.html b/docs/html/config-commands_8md.html new file mode 100644 index 0000000..a53b6bc --- /dev/null +++ b/docs/html/config-commands_8md.html @@ -0,0 +1,130 @@ + + + + + + + + + + + + + + + + + + +penify-cli: /tmp/github_reposRepoArchDocGenContext/Penify-dev/penify-cli/docs/config-commands.md File Reference + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
penify-cli +
+
+
+ + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
/tmp/github_reposRepoArchDocGenContext/Penify-dev/penify-cli/docs/config-commands.md File Reference
+
+
+
+
+ + + + + diff --git a/docs/html/config__command_8py.html b/docs/html/config__command_8py.html new file mode 100644 index 0000000..7acbdf8 --- /dev/null +++ b/docs/html/config__command_8py.html @@ -0,0 +1,148 @@ + + + + + + + + + + + + + + + + + + +penify-cli: /tmp/github_reposRepoArchDocGenContext/Penify-dev/penify-cli/penify_hook/config_command.py File Reference + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
penify-cli +
+
+
+ + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+ +
config_command.py File Reference
+
+
+ + + + + + +

+Namespaces

namespace  penify_hook
 
namespace  penify_hook.config_command
 
+ + + + + +

+Functions

def penify_hook.config_command.setup_config_parser (parent_parser)
 
def penify_hook.config_command.handle_config (args)
 
+
+
+ + + + + diff --git a/docs/html/config__command_8py.js b/docs/html/config__command_8py.js new file mode 100644 index 0000000..7d1ed0a --- /dev/null +++ b/docs/html/config__command_8py.js @@ -0,0 +1,5 @@ +var config__command_8py = +[ + [ "handle_config", "config__command_8py.html#a240e5331681eb574ac319d7458783bde", null ], + [ "setup_config_parser", "config__command_8py.html#a4f3eb92164a69df1446d745f8a09285e", null ] +]; \ No newline at end of file diff --git a/docs/html/config__commands_8py.html b/docs/html/config__commands_8py.html new file mode 100644 index 0000000..ea0f102 --- /dev/null +++ b/docs/html/config__commands_8py.html @@ -0,0 +1,174 @@ + + + + + + + + + + + + + + + + + + +penify-cli: /tmp/github_reposRepoArchDocGenContext/Penify-dev/penify-cli/penify_hook/commands/config_commands.py File Reference + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
penify-cli +
+
+
+ + + + + + +
+
+ +
+
+
+ + + + + + + diff --git a/docs/html/config__commands_8py.js b/docs/html/config__commands_8py.js new file mode 100644 index 0000000..395f3fb --- /dev/null +++ b/docs/html/config__commands_8py.js @@ -0,0 +1,15 @@ +var config__commands_8py = +[ + [ "config_jira_web", "config__commands_8py.html#af115198ea5d6808ccb98733957f50b06", null ], + [ "config_llm_web", "config__commands_8py.html#a185dfc34a655ed80e6c95939b6f3c35c", null ], + [ "get_env_var_or_default", "config__commands_8py.html#a3caf2b062dd33b1f1d7ddc7224f0ff87", null ], + [ "get_jira_config", "config__commands_8py.html#a15bf3685c4dcb5c15ba6a4055e484cf2", null ], + [ "get_llm_config", "config__commands_8py.html#a6492bc8e7df6e38bb06ad05e572d4cc0", null ], + [ "get_penify_config", "config__commands_8py.html#a6559a82d0bf727703d550d1003d3ed20", null ], + [ "get_token", "config__commands_8py.html#a5503d51c905e2f1b299b12d2a73bd812", null ], + [ "load_env_files", "config__commands_8py.html#aabe277132ce0bc0aacef951cf1dee2ae", null ], + [ "save_jira_config", "config__commands_8py.html#ab2486ac2bf16b4a671e49625bfa4f9b4", null ], + [ "save_llm_config", "config__commands_8py.html#a4617bc5956e502c9555dc0dda0376df4", null ], + [ "DOTENV_AVAILABLE", "config__commands_8py.html#a152642ab83cf6219b604bda6122aba67", null ], + [ "path", "config__commands_8py.html#a4b202072a3a3b8515c9c254622e9c880", null ] +]; \ No newline at end of file diff --git a/docs/html/conftest_8py.html b/docs/html/conftest_8py.html new file mode 100644 index 0000000..481610c --- /dev/null +++ b/docs/html/conftest_8py.html @@ -0,0 +1,140 @@ + + + + + + + + + + + + + + + + + + +penify-cli: /tmp/github_reposRepoArchDocGenContext/Penify-dev/penify-cli/tests/conftest.py File Reference + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
penify-cli +
+
+
+ + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+ +
conftest.py File Reference
+
+
+ + + + + + +

+Namespaces

namespace  tests
 
namespace  tests.conftest
 
+
+
+ + + + + diff --git a/docs/html/constants_8py.html b/docs/html/constants_8py.html new file mode 100644 index 0000000..dcc0b47 --- /dev/null +++ b/docs/html/constants_8py.html @@ -0,0 +1,148 @@ + + + + + + + + + + + + + + + + + + +penify-cli: /tmp/github_reposRepoArchDocGenContext/Penify-dev/penify-cli/penify_hook/constants.py File Reference + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
penify-cli +
+
+
+ + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+ +
constants.py File Reference
+
+
+ + + + + + +

+Namespaces

namespace  penify_hook
 
namespace  penify_hook.constants
 
+ + + + + +

+Variables

string penify_hook.constants.API_URL = 'http://localhost:8000/api'
 
string penify_hook.constants.DASHBOARD_URL = "https://dashboard.penify.dev/auth/localhost/login"
 
+
+
+ + + + + diff --git a/docs/html/constants_8py.js b/docs/html/constants_8py.js new file mode 100644 index 0000000..adbd23d --- /dev/null +++ b/docs/html/constants_8py.js @@ -0,0 +1,5 @@ +var constants_8py = +[ + [ "API_URL", "constants_8py.html#af198b5d1fc2f44657a2061aa324af3e0", null ], + [ "DASHBOARD_URL", "constants_8py.html#a316c5a606e4440fb8224c6544c3a15f0", null ] +]; \ No newline at end of file diff --git a/docs/html/detailed-usage_8md.html b/docs/html/detailed-usage_8md.html new file mode 100644 index 0000000..9f0bf55 --- /dev/null +++ b/docs/html/detailed-usage_8md.html @@ -0,0 +1,130 @@ + + + + + + + + + + + + + + + + + + +penify-cli: /tmp/github_reposRepoArchDocGenContext/Penify-dev/penify-cli/docs/detailed-usage.md File Reference + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
penify-cli +
+
+
+ + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
/tmp/github_reposRepoArchDocGenContext/Penify-dev/penify-cli/docs/detailed-usage.md File Reference
+
+
+
+
+ + + + + diff --git a/docs/html/dir_063e2d5fe58a131099a7fe4200cca78c.html b/docs/html/dir_063e2d5fe58a131099a7fe4200cca78c.html new file mode 100644 index 0000000..fd1fd50 --- /dev/null +++ b/docs/html/dir_063e2d5fe58a131099a7fe4200cca78c.html @@ -0,0 +1,152 @@ + + + + + + + + + + + + + + + + + + +penify-cli: /tmp/github_reposRepoArchDocGenContext/Penify-dev/penify-cli/tests Directory Reference + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
penify-cli +
+
+
+ + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
tests Directory Reference
+
+
+
+Directory dependency graph for tests:
+
+
+
+
+ + + + + + + + + + + + + + +

+Files

file  __init__.py
 
file  conftest.py
 
file  test_commit_commands.py
 
file  test_config_commands.py
 
file  test_doc_commands.py
 
file  test_web_config.py
 
+
+
+ + + + + diff --git a/docs/html/dir_063e2d5fe58a131099a7fe4200cca78c.js b/docs/html/dir_063e2d5fe58a131099a7fe4200cca78c.js new file mode 100644 index 0000000..176f804 --- /dev/null +++ b/docs/html/dir_063e2d5fe58a131099a7fe4200cca78c.js @@ -0,0 +1,9 @@ +var dir_063e2d5fe58a131099a7fe4200cca78c = +[ + [ "__init__.py", "tests_2____init_____8py.html", null ], + [ "conftest.py", "conftest_8py.html", null ], + [ "test_commit_commands.py", "test__commit__commands_8py.html", "test__commit__commands_8py" ], + [ "test_config_commands.py", "test__config__commands_8py.html", "test__config__commands_8py" ], + [ "test_doc_commands.py", "test__doc__commands_8py.html", "test__doc__commands_8py" ], + [ "test_web_config.py", "test__web__config_8py.html", "test__web__config_8py" ] +]; \ No newline at end of file diff --git a/docs/html/dir_063e2d5fe58a131099a7fe4200cca78c_dep.map b/docs/html/dir_063e2d5fe58a131099a7fe4200cca78c_dep.map new file mode 100644 index 0000000..599c63c --- /dev/null +++ b/docs/html/dir_063e2d5fe58a131099a7fe4200cca78c_dep.map @@ -0,0 +1,4 @@ + + + + diff --git a/docs/html/dir_063e2d5fe58a131099a7fe4200cca78c_dep.md5 b/docs/html/dir_063e2d5fe58a131099a7fe4200cca78c_dep.md5 new file mode 100644 index 0000000..afb9081 --- /dev/null +++ b/docs/html/dir_063e2d5fe58a131099a7fe4200cca78c_dep.md5 @@ -0,0 +1 @@ +fdbdbdbe253c547a3b41063e5036418d \ No newline at end of file diff --git a/docs/html/dir_063e2d5fe58a131099a7fe4200cca78c_dep.svg b/docs/html/dir_063e2d5fe58a131099a7fe4200cca78c_dep.svg new file mode 100644 index 0000000..08fb018 --- /dev/null +++ b/docs/html/dir_063e2d5fe58a131099a7fe4200cca78c_dep.svg @@ -0,0 +1,30 @@ + + + + + + +/tmp/github_reposRepoArchDocGenContext/Penify-dev/penify-cli/tests + + +clusterdir_b3b22d2ab7966b65f6b237e3231b41be + + +penify-cli + + + + + +dir_063e2d5fe58a131099a7fe4200cca78c + + +tests + + + + + diff --git a/docs/html/dir_1648a057408aae8db85b8e3797335623.html b/docs/html/dir_1648a057408aae8db85b8e3797335623.html new file mode 100644 index 0000000..a58abd3 --- /dev/null +++ b/docs/html/dir_1648a057408aae8db85b8e3797335623.html @@ -0,0 +1,136 @@ + + + + + + + + + + + + + + + + + + +penify-cli: /tmp/github_reposRepoArchDocGenContext/Penify-dev/penify-cli/docs Directory Reference + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
penify-cli +
+
+
+ + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
docs Directory Reference
+
+
+
+Directory dependency graph for docs:
+
+
+
+
+
+
+ + + + + diff --git a/docs/html/dir_1648a057408aae8db85b8e3797335623_dep.map b/docs/html/dir_1648a057408aae8db85b8e3797335623_dep.map new file mode 100644 index 0000000..0f23bcc --- /dev/null +++ b/docs/html/dir_1648a057408aae8db85b8e3797335623_dep.map @@ -0,0 +1,4 @@ + + + + diff --git a/docs/html/dir_1648a057408aae8db85b8e3797335623_dep.md5 b/docs/html/dir_1648a057408aae8db85b8e3797335623_dep.md5 new file mode 100644 index 0000000..2214ec5 --- /dev/null +++ b/docs/html/dir_1648a057408aae8db85b8e3797335623_dep.md5 @@ -0,0 +1 @@ +103c12b563793db32ed50b111f45bada \ No newline at end of file diff --git a/docs/html/dir_1648a057408aae8db85b8e3797335623_dep.svg b/docs/html/dir_1648a057408aae8db85b8e3797335623_dep.svg new file mode 100644 index 0000000..10a902d --- /dev/null +++ b/docs/html/dir_1648a057408aae8db85b8e3797335623_dep.svg @@ -0,0 +1,30 @@ + + + + + + +/tmp/github_reposRepoArchDocGenContext/Penify-dev/penify-cli/docs + + +clusterdir_b3b22d2ab7966b65f6b237e3231b41be + + +penify-cli + + + + + +dir_1648a057408aae8db85b8e3797335623 + + +docs + + + + + diff --git a/docs/html/dir_624fa2a8bce97f0444ac5cca335d4e23.html b/docs/html/dir_624fa2a8bce97f0444ac5cca335d4e23.html new file mode 100644 index 0000000..bd99cd0 --- /dev/null +++ b/docs/html/dir_624fa2a8bce97f0444ac5cca335d4e23.html @@ -0,0 +1,152 @@ + + + + + + + + + + + + + + + + + + +penify-cli: /tmp/github_reposRepoArchDocGenContext/Penify-dev/penify-cli/penify_hook/commands Directory Reference + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
penify-cli +
+
+
+ + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
commands Directory Reference
+
+
+
+Directory dependency graph for commands:
+
+
+
+
+ + + + + + + + + + + + + + +

+Files

file  __init__.py
 
file  auth_commands.py
 
file  commit_commands.py
 
file  config_commands.py
 
file  doc_commands.py
 
file  hook_commands.py
 
+
+
+ + + + + diff --git a/docs/html/dir_624fa2a8bce97f0444ac5cca335d4e23.js b/docs/html/dir_624fa2a8bce97f0444ac5cca335d4e23.js new file mode 100644 index 0000000..94925e7 --- /dev/null +++ b/docs/html/dir_624fa2a8bce97f0444ac5cca335d4e23.js @@ -0,0 +1,9 @@ +var dir_624fa2a8bce97f0444ac5cca335d4e23 = +[ + [ "__init__.py", "penify__hook_2commands_2____init_____8py.html", null ], + [ "auth_commands.py", "auth__commands_8py.html", "auth__commands_8py" ], + [ "commit_commands.py", "commit__commands_8py.html", "commit__commands_8py" ], + [ "config_commands.py", "config__commands_8py.html", "config__commands_8py" ], + [ "doc_commands.py", "doc__commands_8py.html", "doc__commands_8py" ], + [ "hook_commands.py", "hook__commands_8py.html", "hook__commands_8py" ] +]; \ No newline at end of file diff --git a/docs/html/dir_624fa2a8bce97f0444ac5cca335d4e23_dep.map b/docs/html/dir_624fa2a8bce97f0444ac5cca335d4e23_dep.map new file mode 100644 index 0000000..34cf9f2 --- /dev/null +++ b/docs/html/dir_624fa2a8bce97f0444ac5cca335d4e23_dep.map @@ -0,0 +1,4 @@ + + + + diff --git a/docs/html/dir_624fa2a8bce97f0444ac5cca335d4e23_dep.md5 b/docs/html/dir_624fa2a8bce97f0444ac5cca335d4e23_dep.md5 new file mode 100644 index 0000000..597f466 --- /dev/null +++ b/docs/html/dir_624fa2a8bce97f0444ac5cca335d4e23_dep.md5 @@ -0,0 +1 @@ +1c8b9302d49050442030c2a1fe004137 \ No newline at end of file diff --git a/docs/html/dir_624fa2a8bce97f0444ac5cca335d4e23_dep.svg b/docs/html/dir_624fa2a8bce97f0444ac5cca335d4e23_dep.svg new file mode 100644 index 0000000..866d63c --- /dev/null +++ b/docs/html/dir_624fa2a8bce97f0444ac5cca335d4e23_dep.svg @@ -0,0 +1,30 @@ + + + + + + +/tmp/github_reposRepoArchDocGenContext/Penify-dev/penify-cli/penify_hook/commands + + +clusterdir_f88c3381c1861b3f7ca1f3d63cf244b5 + + +penify_hook + + + + + +dir_624fa2a8bce97f0444ac5cca335d4e23 + + +commands + + + + + diff --git a/docs/html/dir_b3b22d2ab7966b65f6b237e3231b41be.html b/docs/html/dir_b3b22d2ab7966b65f6b237e3231b41be.html new file mode 100644 index 0000000..27ffd30 --- /dev/null +++ b/docs/html/dir_b3b22d2ab7966b65f6b237e3231b41be.html @@ -0,0 +1,145 @@ + + + + + + + + + + + + + + + + + + +penify-cli: /tmp/github_reposRepoArchDocGenContext/Penify-dev/penify-cli Directory Reference + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
penify-cli +
+
+
+ + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
penify-cli Directory Reference
+
+
+ + + + + + + + +

+Directories

directory  docs
 
directory  penify_hook
 
directory  tests
 
+ + + +

+Files

file  setup.py
 
+
+
+ + + + + diff --git a/docs/html/dir_b3b22d2ab7966b65f6b237e3231b41be.js b/docs/html/dir_b3b22d2ab7966b65f6b237e3231b41be.js new file mode 100644 index 0000000..f7aa196 --- /dev/null +++ b/docs/html/dir_b3b22d2ab7966b65f6b237e3231b41be.js @@ -0,0 +1,7 @@ +var dir_b3b22d2ab7966b65f6b237e3231b41be = +[ + [ "docs", "dir_1648a057408aae8db85b8e3797335623.html", null ], + [ "penify_hook", "dir_f88c3381c1861b3f7ca1f3d63cf244b5.html", "dir_f88c3381c1861b3f7ca1f3d63cf244b5" ], + [ "tests", "dir_063e2d5fe58a131099a7fe4200cca78c.html", "dir_063e2d5fe58a131099a7fe4200cca78c" ], + [ "setup.py", "setup_8py.html", "setup_8py" ] +]; \ No newline at end of file diff --git a/docs/html/dir_f88c3381c1861b3f7ca1f3d63cf244b5.html b/docs/html/dir_f88c3381c1861b3f7ca1f3d63cf244b5.html new file mode 100644 index 0000000..0251097 --- /dev/null +++ b/docs/html/dir_f88c3381c1861b3f7ca1f3d63cf244b5.html @@ -0,0 +1,175 @@ + + + + + + + + + + + + + + + + + + +penify-cli: /tmp/github_reposRepoArchDocGenContext/Penify-dev/penify-cli/penify_hook Directory Reference + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
penify-cli +
+
+
+ + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
penify_hook Directory Reference
+
+
+
+Directory dependency graph for penify_hook:
+
+
+
+
+ + + + +

+Directories

directory  commands
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Files

file  __init__.py
 
file  api_client.py
 
file  base_analyzer.py
 
file  commit_analyzer.py
 
file  config_command.py
 
file  constants.py
 
file  file_analyzer.py
 
file  folder_analyzer.py
 
file  git_analyzer.py
 
file  jira_client.py
 
file  llm_client.py
 
file  login_command.py
 
file  main.py
 
file  ui_utils.py
 
file  utils.py
 
+
+
+ + + + + diff --git a/docs/html/dir_f88c3381c1861b3f7ca1f3d63cf244b5.js b/docs/html/dir_f88c3381c1861b3f7ca1f3d63cf244b5.js new file mode 100644 index 0000000..1be563a --- /dev/null +++ b/docs/html/dir_f88c3381c1861b3f7ca1f3d63cf244b5.js @@ -0,0 +1,19 @@ +var dir_f88c3381c1861b3f7ca1f3d63cf244b5 = +[ + [ "commands", "dir_624fa2a8bce97f0444ac5cca335d4e23.html", "dir_624fa2a8bce97f0444ac5cca335d4e23" ], + [ "__init__.py", "penify__hook_2____init_____8py.html", null ], + [ "api_client.py", "api__client_8py.html", "api__client_8py" ], + [ "base_analyzer.py", "base__analyzer_8py.html", "base__analyzer_8py" ], + [ "commit_analyzer.py", "commit__analyzer_8py.html", "commit__analyzer_8py" ], + [ "config_command.py", "config__command_8py.html", "config__command_8py" ], + [ "constants.py", "constants_8py.html", "constants_8py" ], + [ "file_analyzer.py", "file__analyzer_8py.html", "file__analyzer_8py" ], + [ "folder_analyzer.py", "folder__analyzer_8py.html", "folder__analyzer_8py" ], + [ "git_analyzer.py", "git__analyzer_8py.html", "git__analyzer_8py" ], + [ "jira_client.py", "jira__client_8py.html", "jira__client_8py" ], + [ "llm_client.py", "llm__client_8py.html", "llm__client_8py" ], + [ "login_command.py", "login__command_8py.html", "login__command_8py" ], + [ "main.py", "main_8py.html", "main_8py" ], + [ "ui_utils.py", "ui__utils_8py.html", "ui__utils_8py" ], + [ "utils.py", "utils_8py.html", "utils_8py" ] +]; \ No newline at end of file diff --git a/docs/html/dir_f88c3381c1861b3f7ca1f3d63cf244b5_dep.map b/docs/html/dir_f88c3381c1861b3f7ca1f3d63cf244b5_dep.map new file mode 100644 index 0000000..769a769 --- /dev/null +++ b/docs/html/dir_f88c3381c1861b3f7ca1f3d63cf244b5_dep.map @@ -0,0 +1,5 @@ + + + + + diff --git a/docs/html/dir_f88c3381c1861b3f7ca1f3d63cf244b5_dep.md5 b/docs/html/dir_f88c3381c1861b3f7ca1f3d63cf244b5_dep.md5 new file mode 100644 index 0000000..577134d --- /dev/null +++ b/docs/html/dir_f88c3381c1861b3f7ca1f3d63cf244b5_dep.md5 @@ -0,0 +1 @@ +81055f3442546e3f091686cb9eef1bc5 \ No newline at end of file diff --git a/docs/html/dir_f88c3381c1861b3f7ca1f3d63cf244b5_dep.svg b/docs/html/dir_f88c3381c1861b3f7ca1f3d63cf244b5_dep.svg new file mode 100644 index 0000000..9c6c5d0 --- /dev/null +++ b/docs/html/dir_f88c3381c1861b3f7ca1f3d63cf244b5_dep.svg @@ -0,0 +1,42 @@ + + + + + + +/tmp/github_reposRepoArchDocGenContext/Penify-dev/penify-cli/penify_hook + + +clusterdir_b3b22d2ab7966b65f6b237e3231b41be + + +penify-cli + + + + +clusterdir_f88c3381c1861b3f7ca1f3d63cf244b5 + + + + + + + +dir_f88c3381c1861b3f7ca1f3d63cf244b5 +penify_hook + + + +dir_624fa2a8bce97f0444ac5cca335d4e23 + + +commands + + + + + diff --git a/docs/html/doc.png b/docs/html/doc.png new file mode 100644 index 0000000000000000000000000000000000000000..17edabff95f7b8da13c9516a04efe05493c29501 GIT binary patch literal 746 zcmV7=@pnbNXRFEm&G8P!&WHG=d)>K?YZ1bzou)2{$)) zumDct!>4SyxL;zgaG>wy`^Hv*+}0kUfCrz~BCOViSb$_*&;{TGGn2^x9K*!Sf0=lV zpP=7O;GA0*Jm*tTYj$IoXvimpnV4S1Z5f$p*f$Db2iq2zrVGQUz~yq`ahn7ck(|CE z7Gz;%OP~J6)tEZWDzjhL9h2hdfoU2)Nd%T<5Kt;Y0XLt&<@6pQx!nw*5`@bq#?l*?3z{Hlzoc=Pr>oB5(9i6~_&-}A(4{Q$>c>%rV&E|a(r&;?i5cQB=} zYSDU5nXG)NS4HEs0it2AHe2>shCyr7`6@4*6{r@8fXRbTA?=IFVWAQJL&H5H{)DpM#{W(GL+Idzf^)uRV@oB8u$ z8v{MfJbTiiRg4bza<41NAzrl{=3fl_D+$t+^!xlQ8S}{UtY`e z;;&9UhyZqQRN%2pot{*Ei0*4~hSF_3AH2@fKU!$NSflS>{@tZpDT4`M2WRTTVH+D? z)GFlEGGHe?koB}i|1w45!BF}N_q&^HJ&-tyR{(afC6H7|aml|tBBbv}55C5DNP8p3 z)~jLEO4Z&2hZmP^i-e%(@d!(E|KRafiU8Q5u(wU((j8un3OR*Hvj+t literal 0 HcmV?d00001 diff --git a/docs/html/doc__commands_8md.html b/docs/html/doc__commands_8md.html new file mode 100644 index 0000000..ada445c --- /dev/null +++ b/docs/html/doc__commands_8md.html @@ -0,0 +1,130 @@ + + + + + + + + + + + + + + + + + + +penify-cli: /tmp/github_reposRepoArchDocGenContext/Penify-dev/penify-cli/docs/doc_commands.md File Reference + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
penify-cli +
+
+
+ + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
/tmp/github_reposRepoArchDocGenContext/Penify-dev/penify-cli/docs/doc_commands.md File Reference
+
+
+
+
+ + + + + diff --git a/docs/html/doc__commands_8py.html b/docs/html/doc__commands_8py.html new file mode 100644 index 0000000..5608574 --- /dev/null +++ b/docs/html/doc__commands_8py.html @@ -0,0 +1,158 @@ + + + + + + + + + + + + + + + + + + +penify-cli: /tmp/github_reposRepoArchDocGenContext/Penify-dev/penify-cli/penify_hook/commands/doc_commands.py File Reference + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
penify-cli +
+
+
+ + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+ +
doc_commands.py File Reference
+
+
+ + + + + + + + +

+Namespaces

namespace  penify_hook
 
namespace  penify_hook.commands
 
namespace  penify_hook.commands.doc_commands
 
+ + + + + + + +

+Functions

def penify_hook.commands.doc_commands.generate_doc (api_url, token, location=None)
 
def penify_hook.commands.doc_commands.setup_docgen_parser (parser)
 
def penify_hook.commands.doc_commands.handle_docgen (args)
 
+ + + +

+Variables

string penify_hook.commands.doc_commands.docgen_description
 
+
+
+ + + + + diff --git a/docs/html/doc__commands_8py.js b/docs/html/doc__commands_8py.js new file mode 100644 index 0000000..4bb5a06 --- /dev/null +++ b/docs/html/doc__commands_8py.js @@ -0,0 +1,7 @@ +var doc__commands_8py = +[ + [ "generate_doc", "doc__commands_8py.html#a4daac68bc563432bf25c85dc78081a25", null ], + [ "handle_docgen", "doc__commands_8py.html#a2006ab13bff718ef783868a910c0b704", null ], + [ "setup_docgen_parser", "doc__commands_8py.html#acc7f4ead1b11951d885fa5c151c2cbe0", null ], + [ "docgen_description", "doc__commands_8py.html#a3e42540047da37565afffeaf106cb948", null ] +]; \ No newline at end of file diff --git a/docs/html/doxygen-awesome-darkmode-toggle.js b/docs/html/doxygen-awesome-darkmode-toggle.js new file mode 100644 index 0000000..40fe2d3 --- /dev/null +++ b/docs/html/doxygen-awesome-darkmode-toggle.js @@ -0,0 +1,157 @@ +/** + +Doxygen Awesome +https://github.com/jothepro/doxygen-awesome-css + +MIT License + +Copyright (c) 2021 - 2023 jothepro + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +*/ + +class DoxygenAwesomeDarkModeToggle extends HTMLElement { + // SVG icons from https://fonts.google.com/icons + // Licensed under the Apache 2.0 license: + // https://www.apache.org/licenses/LICENSE-2.0.html + static lightModeIcon = `` + static darkModeIcon = `` + static title = "Toggle Light/Dark Mode" + + static prefersLightModeInDarkModeKey = "prefers-light-mode-in-dark-mode" + static prefersDarkModeInLightModeKey = "prefers-dark-mode-in-light-mode" + + static _staticConstructor = function() { + DoxygenAwesomeDarkModeToggle.enableDarkMode(DoxygenAwesomeDarkModeToggle.userPreference) + // Update the color scheme when the browsers preference changes + // without user interaction on the website. + window.matchMedia('(prefers-color-scheme: dark)').addEventListener('change', event => { + DoxygenAwesomeDarkModeToggle.onSystemPreferenceChanged() + }) + // Update the color scheme when the tab is made visible again. + // It is possible that the appearance was changed in another tab + // while this tab was in the background. + document.addEventListener("visibilitychange", visibilityState => { + if (document.visibilityState === 'visible') { + DoxygenAwesomeDarkModeToggle.onSystemPreferenceChanged() + } + }); + }() + + static init() { + $(function() { + $(document).ready(function() { + const toggleButton = document.createElement('doxygen-awesome-dark-mode-toggle') + toggleButton.title = DoxygenAwesomeDarkModeToggle.title + toggleButton.updateIcon() + + window.matchMedia('(prefers-color-scheme: dark)').addEventListener('change', event => { + toggleButton.updateIcon() + }) + document.addEventListener("visibilitychange", visibilityState => { + if (document.visibilityState === 'visible') { + toggleButton.updateIcon() + } + }); + + $(document).ready(function(){ + document.getElementById("MSearchBox").parentNode.appendChild(toggleButton) + }) + $(window).resize(function(){ + document.getElementById("MSearchBox").parentNode.appendChild(toggleButton) + }) + }) + }) + } + + constructor() { + super(); + this.onclick=this.toggleDarkMode + } + + /** + * @returns `true` for dark-mode, `false` for light-mode system preference + */ + static get systemPreference() { + return window.matchMedia('(prefers-color-scheme: dark)').matches + } + + /** + * @returns `true` for dark-mode, `false` for light-mode user preference + */ + static get userPreference() { + return (!DoxygenAwesomeDarkModeToggle.systemPreference && localStorage.getItem(DoxygenAwesomeDarkModeToggle.prefersDarkModeInLightModeKey)) || + (DoxygenAwesomeDarkModeToggle.systemPreference && !localStorage.getItem(DoxygenAwesomeDarkModeToggle.prefersLightModeInDarkModeKey)) + } + + static set userPreference(userPreference) { + DoxygenAwesomeDarkModeToggle.darkModeEnabled = userPreference + if(!userPreference) { + if(DoxygenAwesomeDarkModeToggle.systemPreference) { + localStorage.setItem(DoxygenAwesomeDarkModeToggle.prefersLightModeInDarkModeKey, true) + } else { + localStorage.removeItem(DoxygenAwesomeDarkModeToggle.prefersDarkModeInLightModeKey) + } + } else { + if(!DoxygenAwesomeDarkModeToggle.systemPreference) { + localStorage.setItem(DoxygenAwesomeDarkModeToggle.prefersDarkModeInLightModeKey, true) + } else { + localStorage.removeItem(DoxygenAwesomeDarkModeToggle.prefersLightModeInDarkModeKey) + } + } + DoxygenAwesomeDarkModeToggle.onUserPreferenceChanged() + } + + static enableDarkMode(enable) { + if(enable) { + DoxygenAwesomeDarkModeToggle.darkModeEnabled = true + document.documentElement.classList.add("dark-mode") + document.documentElement.classList.remove("light-mode") + } else { + DoxygenAwesomeDarkModeToggle.darkModeEnabled = false + document.documentElement.classList.remove("dark-mode") + document.documentElement.classList.add("light-mode") + } + } + + static onSystemPreferenceChanged() { + DoxygenAwesomeDarkModeToggle.darkModeEnabled = DoxygenAwesomeDarkModeToggle.userPreference + DoxygenAwesomeDarkModeToggle.enableDarkMode(DoxygenAwesomeDarkModeToggle.darkModeEnabled) + } + + static onUserPreferenceChanged() { + DoxygenAwesomeDarkModeToggle.enableDarkMode(DoxygenAwesomeDarkModeToggle.darkModeEnabled) + } + + toggleDarkMode() { + DoxygenAwesomeDarkModeToggle.userPreference = !DoxygenAwesomeDarkModeToggle.userPreference + this.updateIcon() + } + + updateIcon() { + if(DoxygenAwesomeDarkModeToggle.darkModeEnabled) { + this.innerHTML = DoxygenAwesomeDarkModeToggle.darkModeIcon + } else { + this.innerHTML = DoxygenAwesomeDarkModeToggle.lightModeIcon + } + } +} + +customElements.define("doxygen-awesome-dark-mode-toggle", DoxygenAwesomeDarkModeToggle); diff --git a/docs/html/doxygen-awesome-fragment-copy-button.js b/docs/html/doxygen-awesome-fragment-copy-button.js new file mode 100644 index 0000000..86c16fd --- /dev/null +++ b/docs/html/doxygen-awesome-fragment-copy-button.js @@ -0,0 +1,85 @@ +/** + +Doxygen Awesome +https://github.com/jothepro/doxygen-awesome-css + +MIT License + +Copyright (c) 2022 - 2023 jothepro + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +*/ + +class DoxygenAwesomeFragmentCopyButton extends HTMLElement { + constructor() { + super(); + this.onclick=this.copyContent + } + static title = "Copy to clipboard" + static copyIcon = `` + static successIcon = `` + static successDuration = 980 + static init() { + $(function() { + $(document).ready(function() { + if(navigator.clipboard) { + const fragments = document.getElementsByClassName("fragment") + for(const fragment of fragments) { + const fragmentWrapper = document.createElement("div") + fragmentWrapper.className = "doxygen-awesome-fragment-wrapper" + const fragmentCopyButton = document.createElement("doxygen-awesome-fragment-copy-button") + fragmentCopyButton.innerHTML = DoxygenAwesomeFragmentCopyButton.copyIcon + fragmentCopyButton.title = DoxygenAwesomeFragmentCopyButton.title + + fragment.parentNode.replaceChild(fragmentWrapper, fragment) + fragmentWrapper.appendChild(fragment) + fragmentWrapper.appendChild(fragmentCopyButton) + + } + } + }) + }) + } + + + copyContent() { + const content = this.previousSibling.cloneNode(true) + // filter out line number from file listings + content.querySelectorAll(".lineno, .ttc").forEach((node) => { + node.remove() + }) + let textContent = content.textContent + // remove trailing newlines that appear in file listings + let numberOfTrailingNewlines = 0 + while(textContent.charAt(textContent.length - (numberOfTrailingNewlines + 1)) == '\n') { + numberOfTrailingNewlines++; + } + textContent = textContent.substring(0, textContent.length - numberOfTrailingNewlines) + navigator.clipboard.writeText(textContent); + this.classList.add("success") + this.innerHTML = DoxygenAwesomeFragmentCopyButton.successIcon + window.setTimeout(() => { + this.classList.remove("success") + this.innerHTML = DoxygenAwesomeFragmentCopyButton.copyIcon + }, DoxygenAwesomeFragmentCopyButton.successDuration); + } +} + +customElements.define("doxygen-awesome-fragment-copy-button", DoxygenAwesomeFragmentCopyButton) diff --git a/docs/html/doxygen-awesome-interactive-toc.js b/docs/html/doxygen-awesome-interactive-toc.js new file mode 100644 index 0000000..20a9669 --- /dev/null +++ b/docs/html/doxygen-awesome-interactive-toc.js @@ -0,0 +1,81 @@ +/** + +Doxygen Awesome +https://github.com/jothepro/doxygen-awesome-css + +MIT License + +Copyright (c) 2022 - 2023 jothepro + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +*/ + +class DoxygenAwesomeInteractiveToc { + static topOffset = 38 + static hideMobileMenu = true + static headers = [] + + static init() { + window.addEventListener("load", () => { + let toc = document.querySelector(".contents > .toc") + if(toc) { + toc.classList.add("interactive") + if(!DoxygenAwesomeInteractiveToc.hideMobileMenu) { + toc.classList.add("open") + } + document.querySelector(".contents > .toc > h3")?.addEventListener("click", () => { + if(toc.classList.contains("open")) { + toc.classList.remove("open") + } else { + toc.classList.add("open") + } + }) + + document.querySelectorAll(".contents > .toc > ul a").forEach((node) => { + let id = node.getAttribute("href").substring(1) + DoxygenAwesomeInteractiveToc.headers.push({ + node: node, + headerNode: document.getElementById(id) + }) + + document.getElementById("doc-content")?.addEventListener("scroll", () => { + DoxygenAwesomeInteractiveToc.update() + }) + }) + DoxygenAwesomeInteractiveToc.update() + } + }) + } + + static update() { + let active = DoxygenAwesomeInteractiveToc.headers[0]?.node + DoxygenAwesomeInteractiveToc.headers.forEach((header) => { + let position = header.headerNode.getBoundingClientRect().top + header.node.classList.remove("active") + header.node.classList.remove("aboveActive") + if(position < DoxygenAwesomeInteractiveToc.topOffset) { + active = header.node + active?.classList.add("aboveActive") + } + }) + active?.classList.add("active") + active?.classList.remove("aboveActive") + } +} \ No newline at end of file diff --git a/docs/html/doxygen-awesome-paragraph-link.js b/docs/html/doxygen-awesome-paragraph-link.js new file mode 100644 index 0000000..e53d132 --- /dev/null +++ b/docs/html/doxygen-awesome-paragraph-link.js @@ -0,0 +1,51 @@ +/** + +Doxygen Awesome +https://github.com/jothepro/doxygen-awesome-css + +MIT License + +Copyright (c) 2022 - 2023 jothepro + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +*/ + +class DoxygenAwesomeParagraphLink { + // Icon from https://fonts.google.com/icons + // Licensed under the Apache 2.0 license: + // https://www.apache.org/licenses/LICENSE-2.0.html + static icon = `` + static title = "Permanent Link" + static init() { + $(function() { + $(document).ready(function() { + document.querySelectorAll(".contents a.anchor[id], .contents .groupheader > a[id]").forEach((node) => { + let anchorlink = document.createElement("a") + anchorlink.setAttribute("href", `#${node.getAttribute("id")}`) + anchorlink.setAttribute("title", DoxygenAwesomeParagraphLink.title) + anchorlink.classList.add("anchorlink") + node.classList.add("anchor") + anchorlink.innerHTML = DoxygenAwesomeParagraphLink.icon + node.parentElement.appendChild(anchorlink) + }) + }) + }) + } +} diff --git a/docs/html/doxygen-awesome-sidebar-only-darkmode-toggle.css b/docs/html/doxygen-awesome-sidebar-only-darkmode-toggle.css new file mode 100644 index 0000000..d207446 --- /dev/null +++ b/docs/html/doxygen-awesome-sidebar-only-darkmode-toggle.css @@ -0,0 +1,40 @@ + +/** + +Doxygen Awesome +https://github.com/jothepro/doxygen-awesome-css + +MIT License + +Copyright (c) 2021 - 2023 jothepro + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +*/ + +@media screen and (min-width: 768px) { + + #MSearchBox { + width: calc(var(--side-nav-fixed-width) - calc(2 * var(--spacing-medium)) - var(--searchbar-height) - 1px); + } + + #MSearchField { + width: calc(var(--side-nav-fixed-width) - calc(2 * var(--spacing-medium)) - 66px - var(--searchbar-height)); + } +} diff --git a/docs/html/doxygen-awesome-sidebar-only.css b/docs/html/doxygen-awesome-sidebar-only.css new file mode 100644 index 0000000..853f6d6 --- /dev/null +++ b/docs/html/doxygen-awesome-sidebar-only.css @@ -0,0 +1,116 @@ +/** + +Doxygen Awesome +https://github.com/jothepro/doxygen-awesome-css + +MIT License + +Copyright (c) 2021 - 2023 jothepro + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + */ + +html { + /* side nav width. MUST be = `TREEVIEW_WIDTH`. + * Make sure it is wide enough to contain the page title (logo + title + version) + */ + --side-nav-fixed-width: 335px; + --menu-display: none; + + --top-height: 120px; + --toc-sticky-top: -25px; + --toc-max-height: calc(100vh - 2 * var(--spacing-medium) - 25px); +} + +#projectname { + white-space: nowrap; +} + + +@media screen and (min-width: 768px) { + html { + --searchbar-background: var(--page-background-color); + } + + #side-nav { + min-width: var(--side-nav-fixed-width); + max-width: var(--side-nav-fixed-width); + top: var(--top-height); + overflow: visible; + } + + #nav-tree, #side-nav { + height: calc(100vh - var(--top-height)) !important; + } + + #nav-tree { + padding: 0; + } + + #top { + display: block; + border-bottom: none; + height: var(--top-height); + margin-bottom: calc(0px - var(--top-height)); + max-width: var(--side-nav-fixed-width); + overflow: hidden; + background: var(--side-nav-background); + } + #main-nav { + float: left; + padding-right: 0; + } + + .ui-resizable-handle { + cursor: default; + width: 1px !important; + background: var(--separator-color); + box-shadow: 0 calc(-2 * var(--top-height)) 0 0 var(--separator-color); + } + + #nav-path { + position: fixed; + right: 0; + left: var(--side-nav-fixed-width); + bottom: 0; + width: auto; + } + + #doc-content { + height: calc(100vh - 31px) !important; + padding-bottom: calc(3 * var(--spacing-large)); + padding-top: calc(var(--top-height) - 80px); + box-sizing: border-box; + margin-left: var(--side-nav-fixed-width) !important; + } + + #MSearchBox { + width: calc(var(--side-nav-fixed-width) - calc(2 * var(--spacing-medium))); + } + + #MSearchField { + width: calc(var(--side-nav-fixed-width) - calc(2 * var(--spacing-medium)) - 65px); + } + + #MSearchResultsWindow { + left: var(--spacing-medium) !important; + right: auto; + } +} diff --git a/docs/html/doxygen-awesome-tabs.js b/docs/html/doxygen-awesome-tabs.js new file mode 100644 index 0000000..06dfd3d --- /dev/null +++ b/docs/html/doxygen-awesome-tabs.js @@ -0,0 +1,90 @@ +/** + +Doxygen Awesome +https://github.com/jothepro/doxygen-awesome-css + +MIT License + +Copyright (c) 2023 jothepro + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +*/ + +class DoxygenAwesomeTabs { + + static init() { + window.addEventListener("load", () => { + document.querySelectorAll(".tabbed:not(:empty)").forEach((tabbed, tabbedIndex) => { + let tabLinkList = [] + tabbed.querySelectorAll(":scope > ul > li").forEach((tab, tabIndex) => { + tab.id = "tab_" + tabbedIndex + "_" + tabIndex + let header = tab.querySelector(".tab-title") + let tabLink = document.createElement("button") + tabLink.classList.add("tab-button") + tabLink.appendChild(header) + header.title = header.textContent + tabLink.addEventListener("click", () => { + tabbed.querySelectorAll(":scope > ul > li").forEach((tab) => { + tab.classList.remove("selected") + }) + tabLinkList.forEach((tabLink) => { + tabLink.classList.remove("active") + }) + tab.classList.add("selected") + tabLink.classList.add("active") + }) + tabLinkList.push(tabLink) + if(tabIndex == 0) { + tab.classList.add("selected") + tabLink.classList.add("active") + } + }) + let tabsOverview = document.createElement("div") + tabsOverview.classList.add("tabs-overview") + let tabsOverviewContainer = document.createElement("div") + tabsOverviewContainer.classList.add("tabs-overview-container") + tabLinkList.forEach((tabLink) => { + tabsOverview.appendChild(tabLink) + }) + tabsOverviewContainer.appendChild(tabsOverview) + tabbed.before(tabsOverviewContainer) + + function resize() { + let maxTabHeight = 0 + tabbed.querySelectorAll(":scope > ul > li").forEach((tab, tabIndex) => { + let visibility = tab.style.display + tab.style.display = "block" + maxTabHeight = Math.max(tab.offsetHeight, maxTabHeight) + tab.style.display = visibility + }) + tabbed.style.height = `${maxTabHeight + 10}px` + } + + resize() + new ResizeObserver(resize).observe(tabbed) + }) + }) + + } + + static resize(tabbed) { + + } +} \ No newline at end of file diff --git a/docs/html/doxygen-awesome.css b/docs/html/doxygen-awesome.css new file mode 100644 index 0000000..a44945b --- /dev/null +++ b/docs/html/doxygen-awesome.css @@ -0,0 +1,2675 @@ +/** + +Doxygen Awesome +https://github.com/jothepro/doxygen-awesome-css + +MIT License + +Copyright (c) 2021 - 2023 jothepro + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +*/ + +html { + /* primary theme color. This will affect the entire websites color scheme: links, arrows, labels, ... */ + --primary-color: #1779c4; + --primary-dark-color: #335c80; + --primary-light-color: #70b1e9; + + /* page base colors */ + --page-background-color: #ffffff; + --page-foreground-color: #2f4153; + --page-secondary-foreground-color: #6f7e8e; + + /* color for all separators on the website: hr, borders, ... */ + --separator-color: #dedede; + + /* border radius for all rounded components. Will affect many components, like dropdowns, memitems, codeblocks, ... */ + --border-radius-large: 8px; + --border-radius-small: 4px; + --border-radius-medium: 6px; + + /* default spacings. Most components reference these values for spacing, to provide uniform spacing on the page. */ + --spacing-small: 5px; + --spacing-medium: 10px; + --spacing-large: 16px; + + /* default box shadow used for raising an element above the normal content. Used in dropdowns, search result, ... */ + --box-shadow: 0 2px 8px 0 rgba(0,0,0,.075); + + --odd-color: rgba(0,0,0,.028); + + /* font-families. will affect all text on the website + * font-family: the normal font for text, headlines, menus + * font-family-monospace: used for preformatted text in memtitle, code, fragments + */ + --font-family: -apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,Ubuntu,Cantarell,Fira Sans,Droid Sans,Helvetica Neue,sans-serif; + --font-family-monospace: ui-monospace,SFMono-Regular,SF Mono,Menlo,Consolas,Liberation Mono,monospace; + + /* font sizes */ + --page-font-size: 15.6px; + --navigation-font-size: 14.4px; + --toc-font-size: 13.4px; + --code-font-size: 14px; /* affects code, fragment */ + --title-font-size: 22px; + + /* content text properties. These only affect the page content, not the navigation or any other ui elements */ + --content-line-height: 27px; + /* The content is centered and constraint in it's width. To make the content fill the whole page, set the variable to auto.*/ + --content-maxwidth: 1050px; + --table-line-height: 24px; + --toc-sticky-top: var(--spacing-medium); + --toc-width: 200px; + --toc-max-height: calc(100vh - 2 * var(--spacing-medium) - 85px); + + /* colors for various content boxes: @warning, @note, @deprecated @bug */ + --warning-color: #faf3d8; + --warning-color-dark: #f3a600; + --warning-color-darker: #5f4204; + --note-color: #e4f3ff; + --note-color-dark: #1879C4; + --note-color-darker: #274a5c; + --todo-color: #e4dafd; + --todo-color-dark: #5b2bdd; + --todo-color-darker: #2a0d72; + --deprecated-color: #ecf0f3; + --deprecated-color-dark: #5b6269; + --deprecated-color-darker: #43454a; + --bug-color: #f8d1cc; + --bug-color-dark: #b61825; + --bug-color-darker: #75070f; + --invariant-color: #d8f1e3; + --invariant-color-dark: #44b86f; + --invariant-color-darker: #265532; + + /* blockquote colors */ + --blockquote-background: #f8f9fa; + --blockquote-foreground: #636568; + + /* table colors */ + --tablehead-background: #f1f1f1; + --tablehead-foreground: var(--page-foreground-color); + + /* menu-display: block | none + * Visibility of the top navigation on screens >= 768px. On smaller screen the menu is always visible. + * `GENERATE_TREEVIEW` MUST be enabled! + */ + --menu-display: block; + + --menu-focus-foreground: var(--page-background-color); + --menu-focus-background: var(--primary-color); + --menu-selected-background: rgba(0,0,0,.05); + + + --header-background: var(--page-background-color); + --header-foreground: var(--page-foreground-color); + + /* searchbar colors */ + --searchbar-background: var(--side-nav-background); + --searchbar-foreground: var(--page-foreground-color); + + /* searchbar size + * (`searchbar-width` is only applied on screens >= 768px. + * on smaller screens the searchbar will always fill the entire screen width) */ + --searchbar-height: 33px; + --searchbar-width: 210px; + --searchbar-border-radius: var(--searchbar-height); + + /* code block colors */ + --code-background: #f5f5f5; + --code-foreground: var(--page-foreground-color); + + /* fragment colors */ + --fragment-background: #F8F9FA; + --fragment-foreground: #37474F; + --fragment-keyword: #bb6bb2; + --fragment-keywordtype: #8258b3; + --fragment-keywordflow: #d67c3b; + --fragment-token: #438a59; + --fragment-comment: #969696; + --fragment-link: #5383d6; + --fragment-preprocessor: #46aaa5; + --fragment-linenumber-color: #797979; + --fragment-linenumber-background: #f4f4f5; + --fragment-linenumber-border: #e3e5e7; + --fragment-lineheight: 20px; + + /* sidebar navigation (treeview) colors */ + --side-nav-background: #fbfbfb; + --side-nav-foreground: var(--page-foreground-color); + --side-nav-arrow-opacity: 0; + --side-nav-arrow-hover-opacity: 0.9; + + --toc-background: var(--side-nav-background); + --toc-foreground: var(--side-nav-foreground); + + /* height of an item in any tree / collapsible table */ + --tree-item-height: 30px; + + --memname-font-size: var(--code-font-size); + --memtitle-font-size: 18px; + + --webkit-scrollbar-size: 7px; + --webkit-scrollbar-padding: 4px; + --webkit-scrollbar-color: var(--separator-color); + + --animation-duration: .12s +} + +@media screen and (max-width: 767px) { + html { + --page-font-size: 16px; + --navigation-font-size: 16px; + --toc-font-size: 15px; + --code-font-size: 15px; /* affects code, fragment */ + --title-font-size: 22px; + } +} + +@media (prefers-color-scheme: dark) { + html:not(.light-mode) { + color-scheme: dark; + + --primary-color: #1982d2; + --primary-dark-color: #86a9c4; + --primary-light-color: #4779ac; + + --box-shadow: 0 2px 8px 0 rgba(0,0,0,.35); + + --odd-color: rgba(100,100,100,.06); + + --menu-selected-background: rgba(0,0,0,.4); + + --page-background-color: #1C1D1F; + --page-foreground-color: #d2dbde; + --page-secondary-foreground-color: #859399; + --separator-color: #38393b; + --side-nav-background: #252628; + + --code-background: #2a2c2f; + + --tablehead-background: #2a2c2f; + + --blockquote-background: #222325; + --blockquote-foreground: #7e8c92; + + --warning-color: #3b2e04; + --warning-color-dark: #f1b602; + --warning-color-darker: #ceb670; + --note-color: #163750; + --note-color-dark: #1982D2; + --note-color-darker: #dcf0fa; + --todo-color: #2a2536; + --todo-color-dark: #7661b3; + --todo-color-darker: #ae9ed6; + --deprecated-color: #2e323b; + --deprecated-color-dark: #738396; + --deprecated-color-darker: #abb0bd; + --bug-color: #2e1917; + --bug-color-dark: #ad2617; + --bug-color-darker: #f5b1aa; + --invariant-color: #303a35; + --invariant-color-dark: #76ce96; + --invariant-color-darker: #cceed5; + + --fragment-background: #282c34; + --fragment-foreground: #dbe4eb; + --fragment-keyword: #cc99cd; + --fragment-keywordtype: #ab99cd; + --fragment-keywordflow: #e08000; + --fragment-token: #7ec699; + --fragment-comment: #999999; + --fragment-link: #98c0e3; + --fragment-preprocessor: #65cabe; + --fragment-linenumber-color: #cccccc; + --fragment-linenumber-background: #35393c; + --fragment-linenumber-border: #1f1f1f; + } +} + +/* dark mode variables are defined twice, to support both the dark-mode without and with doxygen-awesome-darkmode-toggle.js */ +html.dark-mode { + color-scheme: dark; + + --primary-color: #1982d2; + --primary-dark-color: #86a9c4; + --primary-light-color: #4779ac; + + --box-shadow: 0 2px 8px 0 rgba(0,0,0,.30); + + --odd-color: rgba(100,100,100,.06); + + --menu-selected-background: rgba(0,0,0,.4); + + --page-background-color: #1C1D1F; + --page-foreground-color: #d2dbde; + --page-secondary-foreground-color: #859399; + --separator-color: #38393b; + --side-nav-background: #252628; + + --code-background: #2a2c2f; + + --tablehead-background: #2a2c2f; + + --blockquote-background: #222325; + --blockquote-foreground: #7e8c92; + + --warning-color: #3b2e04; + --warning-color-dark: #f1b602; + --warning-color-darker: #ceb670; + --note-color: #163750; + --note-color-dark: #1982D2; + --note-color-darker: #dcf0fa; + --todo-color: #2a2536; + --todo-color-dark: #7661b3; + --todo-color-darker: #ae9ed6; + --deprecated-color: #2e323b; + --deprecated-color-dark: #738396; + --deprecated-color-darker: #abb0bd; + --bug-color: #2e1917; + --bug-color-dark: #ad2617; + --bug-color-darker: #f5b1aa; + --invariant-color: #303a35; + --invariant-color-dark: #76ce96; + --invariant-color-darker: #cceed5; + + --fragment-background: #282c34; + --fragment-foreground: #dbe4eb; + --fragment-keyword: #cc99cd; + --fragment-keywordtype: #ab99cd; + --fragment-keywordflow: #e08000; + --fragment-token: #7ec699; + --fragment-comment: #999999; + --fragment-link: #98c0e3; + --fragment-preprocessor: #65cabe; + --fragment-linenumber-color: #cccccc; + --fragment-linenumber-background: #35393c; + --fragment-linenumber-border: #1f1f1f; +} + +body { + color: var(--page-foreground-color); + background-color: var(--page-background-color); + font-size: var(--page-font-size); +} + +body, table, div, p, dl, #nav-tree .label, .title, +.sm-dox a, .sm-dox a:hover, .sm-dox a:focus, #projectname, +.SelectItem, #MSearchField, .navpath li.navelem a, +.navpath li.navelem a:hover, p.reference, p.definition, div.toc li, div.toc h3 { + font-family: var(--font-family); +} + +h1, h2, h3, h4, h5 { + margin-top: 1em; + font-weight: 600; + line-height: initial; +} + +p, div, table, dl, p.reference, p.definition { + font-size: var(--page-font-size); +} + +p.reference, p.definition { + color: var(--page-secondary-foreground-color); +} + +a:link, a:visited, a:hover, a:focus, a:active { + color: var(--primary-color) !important; + font-weight: 500; + background: none; +} + +a.anchor { + scroll-margin-top: var(--spacing-large); + display: block; +} + +/* + Title and top navigation + */ + +#top { + background: var(--header-background); + border-bottom: 1px solid var(--separator-color); +} + +@media screen and (min-width: 768px) { + #top { + display: flex; + flex-wrap: wrap; + justify-content: space-between; + align-items: center; + } +} + +#main-nav { + flex-grow: 5; + padding: var(--spacing-small) var(--spacing-medium); +} + +#titlearea { + width: auto; + padding: var(--spacing-medium) var(--spacing-large); + background: none; + color: var(--header-foreground); + border-bottom: none; +} + +@media screen and (max-width: 767px) { + #titlearea { + padding-bottom: var(--spacing-small); + } +} + +#titlearea table tbody tr { + height: auto !important; +} + +#projectname { + font-size: var(--title-font-size); + font-weight: 600; +} + +#projectnumber { + font-family: inherit; + font-size: 60%; +} + +#projectbrief { + font-family: inherit; + font-size: 80%; +} + +#projectlogo { + vertical-align: middle; +} + +#projectlogo img { + max-height: calc(var(--title-font-size) * 2); + margin-right: var(--spacing-small); +} + +.sm-dox, .tabs, .tabs2, .tabs3 { + background: none; + padding: 0; +} + +.tabs, .tabs2, .tabs3 { + border-bottom: 1px solid var(--separator-color); + margin-bottom: -1px; +} + +.main-menu-btn-icon, .main-menu-btn-icon:before, .main-menu-btn-icon:after { + background: var(--page-secondary-foreground-color); +} + +@media screen and (max-width: 767px) { + .sm-dox a span.sub-arrow { + background: var(--code-background); + } + + #main-menu a.has-submenu span.sub-arrow { + color: var(--page-secondary-foreground-color); + border-radius: var(--border-radius-medium); + } + + #main-menu a.has-submenu:hover span.sub-arrow { + color: var(--page-foreground-color); + } +} + +@media screen and (min-width: 768px) { + .sm-dox li, .tablist li { + display: var(--menu-display); + } + + .sm-dox a span.sub-arrow { + border-color: var(--header-foreground) transparent transparent transparent; + } + + .sm-dox a:hover span.sub-arrow { + border-color: var(--menu-focus-foreground) transparent transparent transparent; + } + + .sm-dox ul a span.sub-arrow { + border-color: transparent transparent transparent var(--page-foreground-color); + } + + .sm-dox ul a:hover span.sub-arrow { + border-color: transparent transparent transparent var(--menu-focus-foreground); + } +} + +.sm-dox ul { + background: var(--page-background-color); + box-shadow: var(--box-shadow); + border: 1px solid var(--separator-color); + border-radius: var(--border-radius-medium) !important; + padding: var(--spacing-small); + animation: ease-out 150ms slideInMenu; +} + +@keyframes slideInMenu { + from { + opacity: 0; + transform: translate(0px, -2px); + } + + to { + opacity: 1; + transform: translate(0px, 0px); + } +} + +.sm-dox ul a { + color: var(--page-foreground-color) !important; + background: var(--page-background-color); + font-size: var(--navigation-font-size); +} + +.sm-dox>li>ul:after { + border-bottom-color: var(--page-background-color) !important; +} + +.sm-dox>li>ul:before { + border-bottom-color: var(--separator-color) !important; +} + +.sm-dox ul a:hover, .sm-dox ul a:active, .sm-dox ul a:focus { + font-size: var(--navigation-font-size) !important; + color: var(--menu-focus-foreground) !important; + text-shadow: none; + background-color: var(--menu-focus-background); + border-radius: var(--border-radius-small) !important; +} + +.sm-dox a, .sm-dox a:focus, .tablist li, .tablist li a, .tablist li.current a { + text-shadow: none; + background: transparent; + background-image: none !important; + color: var(--header-foreground) !important; + font-weight: normal; + font-size: var(--navigation-font-size); + border-radius: var(--border-radius-small) !important; +} + +.sm-dox a:focus { + outline: auto; +} + +.sm-dox a:hover, .sm-dox a:active, .tablist li a:hover { + text-shadow: none; + font-weight: normal; + background: var(--menu-focus-background); + color: var(--menu-focus-foreground) !important; + border-radius: var(--border-radius-small) !important; + font-size: var(--navigation-font-size); +} + +.tablist li.current { + border-radius: var(--border-radius-small); + background: var(--menu-selected-background); +} + +.tablist li { + margin: var(--spacing-small) 0 var(--spacing-small) var(--spacing-small); +} + +.tablist a { + padding: 0 var(--spacing-large); +} + + +/* + Search box + */ + +#MSearchBox { + height: var(--searchbar-height); + background: var(--searchbar-background); + border-radius: var(--searchbar-border-radius); + border: 1px solid var(--separator-color); + overflow: hidden; + width: var(--searchbar-width); + position: relative; + box-shadow: none; + display: block; + margin-top: 0; +} + +/* until Doxygen 1.9.4 */ +.left img#MSearchSelect { + left: 0; + user-select: none; + padding-left: 8px; +} + +/* Doxygen 1.9.5 */ +.left span#MSearchSelect { + left: 0; + user-select: none; + margin-left: 8px; + padding: 0; +} + +.left #MSearchSelect[src$=".png"] { + padding-left: 0 +} + +.SelectionMark { + user-select: none; +} + +.tabs .left #MSearchSelect { + padding-left: 0; +} + +.tabs #MSearchBox { + position: absolute; + right: var(--spacing-medium); +} + +@media screen and (max-width: 767px) { + .tabs #MSearchBox { + position: relative; + right: 0; + margin-left: var(--spacing-medium); + margin-top: 0; + } +} + +#MSearchSelectWindow, #MSearchResultsWindow { + z-index: 9999; +} + +#MSearchBox.MSearchBoxActive { + border-color: var(--primary-color); + box-shadow: inset 0 0 0 1px var(--primary-color); +} + +#main-menu > li:last-child { + margin-right: 0; +} + +@media screen and (max-width: 767px) { + #main-menu > li:last-child { + height: 50px; + } +} + +#MSearchField { + font-size: var(--navigation-font-size); + height: calc(var(--searchbar-height) - 2px); + background: transparent; + width: calc(var(--searchbar-width) - 64px); +} + +.MSearchBoxActive #MSearchField { + color: var(--searchbar-foreground); +} + +#MSearchSelect { + top: calc(calc(var(--searchbar-height) / 2) - 11px); +} + +#MSearchBox span.left, #MSearchBox span.right { + background: none; + background-image: none; +} + +#MSearchBox span.right { + padding-top: calc(calc(var(--searchbar-height) / 2) - 12px); + position: absolute; + right: var(--spacing-small); +} + +.tabs #MSearchBox span.right { + top: calc(calc(var(--searchbar-height) / 2) - 12px); +} + +@keyframes slideInSearchResults { + from { + opacity: 0; + transform: translate(0, 15px); + } + + to { + opacity: 1; + transform: translate(0, 20px); + } +} + +#MSearchResultsWindow { + left: auto !important; + right: var(--spacing-medium); + border-radius: var(--border-radius-large); + border: 1px solid var(--separator-color); + transform: translate(0, 20px); + box-shadow: var(--box-shadow); + animation: ease-out 280ms slideInSearchResults; + background: var(--page-background-color); +} + +iframe#MSearchResults { + margin: 4px; +} + +iframe { + color-scheme: normal; +} + +@media (prefers-color-scheme: dark) { + html:not(.light-mode) iframe#MSearchResults { + filter: invert() hue-rotate(180deg); + } +} + +html.dark-mode iframe#MSearchResults { + filter: invert() hue-rotate(180deg); +} + +#MSearchResults .SRPage { + background-color: transparent; +} + +#MSearchResults .SRPage .SREntry { + font-size: 10pt; + padding: var(--spacing-small) var(--spacing-medium); +} + +#MSearchSelectWindow { + border: 1px solid var(--separator-color); + border-radius: var(--border-radius-medium); + box-shadow: var(--box-shadow); + background: var(--page-background-color); + padding-top: var(--spacing-small); + padding-bottom: var(--spacing-small); +} + +#MSearchSelectWindow a.SelectItem { + font-size: var(--navigation-font-size); + line-height: var(--content-line-height); + margin: 0 var(--spacing-small); + border-radius: var(--border-radius-small); + color: var(--page-foreground-color) !important; + font-weight: normal; +} + +#MSearchSelectWindow a.SelectItem:hover { + background: var(--menu-focus-background); + color: var(--menu-focus-foreground) !important; +} + +@media screen and (max-width: 767px) { + #MSearchBox { + margin-top: var(--spacing-medium); + margin-bottom: var(--spacing-medium); + width: calc(100vw - 30px); + } + + #main-menu > li:last-child { + float: none !important; + } + + #MSearchField { + width: calc(100vw - 110px); + } + + @keyframes slideInSearchResultsMobile { + from { + opacity: 0; + transform: translate(0, 15px); + } + + to { + opacity: 1; + transform: translate(0, 20px); + } + } + + #MSearchResultsWindow { + left: var(--spacing-medium) !important; + right: var(--spacing-medium); + overflow: auto; + transform: translate(0, 20px); + animation: ease-out 280ms slideInSearchResultsMobile; + width: auto !important; + } + + /* + * Overwrites for fixing the searchbox on mobile in doxygen 1.9.2 + */ + label.main-menu-btn ~ #searchBoxPos1 { + top: 3px !important; + right: 6px !important; + left: 45px; + display: flex; + } + + label.main-menu-btn ~ #searchBoxPos1 > #MSearchBox { + margin-top: 0; + margin-bottom: 0; + flex-grow: 2; + float: left; + } +} + +/* + Tree view + */ + +#side-nav { + padding: 0 !important; + background: var(--side-nav-background); + min-width: 8px; + max-width: 50vw; +} + +@media screen and (max-width: 767px) { + #side-nav { + display: none; + } + + #doc-content { + margin-left: 0 !important; + } +} + +#nav-tree { + background: transparent; + margin-right: 1px; +} + +#nav-tree .label { + font-size: var(--navigation-font-size); +} + +#nav-tree .item { + height: var(--tree-item-height); + line-height: var(--tree-item-height); +} + +#nav-tree .item > a:focus { + outline: none; +} + +#nav-sync { + bottom: 12px; + right: 12px; + top: auto !important; + user-select: none; +} + +#nav-tree .selected { + text-shadow: none; + background-image: none; + background-color: transparent; + position: relative; +} + +#nav-tree .selected::after { + content: ""; + position: absolute; + top: 1px; + bottom: 1px; + left: 0; + width: 4px; + border-radius: 0 var(--border-radius-small) var(--border-radius-small) 0; + background: var(--primary-color); +} + + +#nav-tree a { + color: var(--side-nav-foreground) !important; + font-weight: normal; +} + +#nav-tree a:focus { + outline-style: auto; +} + +#nav-tree .arrow { + opacity: var(--side-nav-arrow-opacity); + background: none; +} + +.arrow { + color: inherit; + cursor: pointer; + font-size: 45%; + vertical-align: middle; + margin-right: 2px; + font-family: serif; + height: auto; + text-align: right; +} + +#nav-tree div.item:hover .arrow, #nav-tree a:focus .arrow { + opacity: var(--side-nav-arrow-hover-opacity); +} + +#nav-tree .selected a { + color: var(--primary-color) !important; + font-weight: bolder; + font-weight: 600; +} + +.ui-resizable-e { + width: 4px; + background: transparent; + box-shadow: inset -1px 0 0 0 var(--separator-color); +} + +/* + Contents + */ + +div.header { + border-bottom: 1px solid var(--separator-color); + background-color: var(--page-background-color); + background-image: none; +} + +@media screen and (min-width: 1000px) { + #doc-content > div > div.contents, + .PageDoc > div.contents { + display: flex; + flex-direction: row-reverse; + flex-wrap: nowrap; + align-items: flex-start; + } + + div.contents .textblock { + min-width: 200px; + flex-grow: 1; + } +} + +div.contents, div.header .title, div.header .summary { + max-width: var(--content-maxwidth); +} + +div.contents, div.header .title { + line-height: initial; + margin: calc(var(--spacing-medium) + .2em) auto var(--spacing-medium) auto; +} + +div.header .summary { + margin: var(--spacing-medium) auto 0 auto; +} + +div.headertitle { + padding: 0; +} + +div.header .title { + font-weight: 600; + font-size: 225%; + padding: var(--spacing-medium) var(--spacing-large); + word-break: break-word; +} + +div.header .summary { + width: auto; + display: block; + float: none; + padding: 0 var(--spacing-large); +} + +td.memSeparator { + border-color: var(--separator-color); +} + +span.mlabel { + background: var(--primary-color); + border: none; + padding: 4px 9px; + border-radius: 12px; + margin-right: var(--spacing-medium); +} + +span.mlabel:last-of-type { + margin-right: 2px; +} + +div.contents { + padding: 0 var(--spacing-large); +} + +div.contents p, div.contents li { + line-height: var(--content-line-height); +} + +div.contents div.dyncontent { + margin: var(--spacing-medium) 0; +} + +@media (prefers-color-scheme: dark) { + html:not(.light-mode) div.contents div.dyncontent img, + html:not(.light-mode) div.contents center img, + html:not(.light-mode) div.contents > table img, + html:not(.light-mode) div.contents div.dyncontent iframe, + html:not(.light-mode) div.contents center iframe, + html:not(.light-mode) div.contents table iframe, + html:not(.light-mode) div.contents .dotgraph iframe { + filter: brightness(89%) hue-rotate(180deg) invert(); + } +} + +html.dark-mode div.contents div.dyncontent img, +html.dark-mode div.contents center img, +html.dark-mode div.contents > table img, +html.dark-mode div.contents div.dyncontent iframe, +html.dark-mode div.contents center iframe, +html.dark-mode div.contents table iframe, +html.dark-mode div.contents .dotgraph iframe + { + filter: brightness(89%) hue-rotate(180deg) invert(); +} + +h2.groupheader { + border-bottom: 0px; + color: var(--page-foreground-color); + box-shadow: + 100px 0 var(--page-background-color), + -100px 0 var(--page-background-color), + 100px 0.75px var(--separator-color), + -100px 0.75px var(--separator-color), + 500px 0 var(--page-background-color), + -500px 0 var(--page-background-color), + 500px 0.75px var(--separator-color), + -500px 0.75px var(--separator-color), + 900px 0 var(--page-background-color), + -900px 0 var(--page-background-color), + 900px 0.75px var(--separator-color), + -900px 0.75px var(--separator-color), + 1400px 0 var(--page-background-color), + -1400px 0 var(--page-background-color), + 1400px 0.75px var(--separator-color), + -1400px 0.75px var(--separator-color), + 1900px 0 var(--page-background-color), + -1900px 0 var(--page-background-color), + 1900px 0.75px var(--separator-color), + -1900px 0.75px var(--separator-color); +} + +blockquote { + margin: 0 var(--spacing-medium) 0 var(--spacing-medium); + padding: var(--spacing-small) var(--spacing-large); + background: var(--blockquote-background); + color: var(--blockquote-foreground); + border-left: 0; + overflow: visible; + border-radius: var(--border-radius-medium); + overflow: visible; + position: relative; +} + +blockquote::before, blockquote::after { + font-weight: bold; + font-family: serif; + font-size: 360%; + opacity: .15; + position: absolute; +} + +blockquote::before { + content: "“"; + left: -10px; + top: 4px; +} + +blockquote::after { + content: "”"; + right: -8px; + bottom: -25px; +} + +blockquote p { + margin: var(--spacing-small) 0 var(--spacing-medium) 0; +} +.paramname { + font-weight: 600; + color: var(--primary-dark-color); +} + +.paramname > code { + border: 0; +} + +table.params .paramname { + font-weight: 600; + font-family: var(--font-family-monospace); + font-size: var(--code-font-size); + padding-right: var(--spacing-small); + line-height: var(--table-line-height); +} + +h1.glow, h2.glow, h3.glow, h4.glow, h5.glow, h6.glow { + text-shadow: 0 0 15px var(--primary-light-color); +} + +.alphachar a { + color: var(--page-foreground-color); +} + +.dotgraph { + max-width: 100%; + overflow-x: scroll; +} + +.dotgraph .caption { + position: sticky; + left: 0; +} + +/* Wrap Graphviz graphs with the `interactive_dotgraph` class if `INTERACTIVE_SVG = YES` */ +.interactive_dotgraph .dotgraph iframe { + max-width: 100%; +} + +/* + Table of Contents + */ + +div.contents .toc { + max-height: var(--toc-max-height); + min-width: var(--toc-width); + border: 0; + border-left: 1px solid var(--separator-color); + border-radius: 0; + background-color: transparent; + box-shadow: none; + position: sticky; + top: var(--toc-sticky-top); + padding: 0 var(--spacing-large); + margin: var(--spacing-small) 0 var(--spacing-large) var(--spacing-large); +} + +div.toc h3 { + color: var(--toc-foreground); + font-size: var(--navigation-font-size); + margin: var(--spacing-large) 0 var(--spacing-medium) 0; +} + +div.toc li { + padding: 0; + background: none; + line-height: var(--toc-font-size); + margin: var(--toc-font-size) 0 0 0; +} + +div.toc li::before { + display: none; +} + +div.toc ul { + margin-top: 0 +} + +div.toc li a { + font-size: var(--toc-font-size); + color: var(--page-foreground-color) !important; + text-decoration: none; +} + +div.toc li a:hover, div.toc li a.active { + color: var(--primary-color) !important; +} + +div.toc li a.aboveActive { + color: var(--page-secondary-foreground-color) !important; +} + + +@media screen and (max-width: 999px) { + div.contents .toc { + max-height: 45vh; + float: none; + width: auto; + margin: 0 0 var(--spacing-medium) 0; + position: relative; + top: 0; + position: relative; + border: 1px solid var(--separator-color); + border-radius: var(--border-radius-medium); + background-color: var(--toc-background); + box-shadow: var(--box-shadow); + } + + div.contents .toc.interactive { + max-height: calc(var(--navigation-font-size) + 2 * var(--spacing-large)); + overflow: hidden; + } + + div.contents .toc > h3 { + -webkit-tap-highlight-color: transparent; + cursor: pointer; + position: sticky; + top: 0; + background-color: var(--toc-background); + margin: 0; + padding: var(--spacing-large) 0; + display: block; + } + + div.contents .toc.interactive > h3::before { + content: ""; + width: 0; + height: 0; + border-left: 4px solid transparent; + border-right: 4px solid transparent; + border-top: 5px solid var(--primary-color); + display: inline-block; + margin-right: var(--spacing-small); + margin-bottom: calc(var(--navigation-font-size) / 4); + transform: rotate(-90deg); + transition: transform var(--animation-duration) ease-out; + } + + div.contents .toc.interactive.open > h3::before { + transform: rotate(0deg); + } + + div.contents .toc.interactive.open { + max-height: 45vh; + overflow: auto; + transition: max-height 0.2s ease-in-out; + } + + div.contents .toc a, div.contents .toc a.active { + color: var(--primary-color) !important; + } + + div.contents .toc a:hover { + text-decoration: underline; + } +} + +/* + Code & Fragments + */ + +code, div.fragment, pre.fragment { + border-radius: var(--border-radius-small); + border: 1px solid var(--separator-color); + overflow: hidden; +} + +code { + display: inline; + background: var(--code-background); + color: var(--code-foreground); + padding: 2px 6px; +} + +div.fragment, pre.fragment { + margin: var(--spacing-medium) 0; + padding: calc(var(--spacing-large) - (var(--spacing-large) / 6)) var(--spacing-large); + background: var(--fragment-background); + color: var(--fragment-foreground); + overflow-x: auto; +} + +@media screen and (max-width: 767px) { + div.fragment, pre.fragment { + border-top-right-radius: 0; + border-bottom-right-radius: 0; + border-right: 0; + } + + .contents > div.fragment, + .textblock > div.fragment, + .textblock > pre.fragment, + .textblock > .tabbed > ul > li > div.fragment, + .textblock > .tabbed > ul > li > pre.fragment, + .contents > .doxygen-awesome-fragment-wrapper > div.fragment, + .textblock > .doxygen-awesome-fragment-wrapper > div.fragment, + .textblock > .doxygen-awesome-fragment-wrapper > pre.fragment, + .textblock > .tabbed > ul > li > .doxygen-awesome-fragment-wrapper > div.fragment, + .textblock > .tabbed > ul > li > .doxygen-awesome-fragment-wrapper > pre.fragment { + margin: var(--spacing-medium) calc(0px - var(--spacing-large)); + border-radius: 0; + border-left: 0; + } + + .textblock li > .fragment, + .textblock li > .doxygen-awesome-fragment-wrapper > .fragment { + margin: var(--spacing-medium) calc(0px - var(--spacing-large)); + } + + .memdoc li > .fragment, + .memdoc li > .doxygen-awesome-fragment-wrapper > .fragment { + margin: var(--spacing-medium) calc(0px - var(--spacing-medium)); + } + + .textblock ul, .memdoc ul { + overflow: initial; + } + + .memdoc > div.fragment, + .memdoc > pre.fragment, + dl dd > div.fragment, + dl dd pre.fragment, + .memdoc > .doxygen-awesome-fragment-wrapper > div.fragment, + .memdoc > .doxygen-awesome-fragment-wrapper > pre.fragment, + dl dd > .doxygen-awesome-fragment-wrapper > div.fragment, + dl dd .doxygen-awesome-fragment-wrapper > pre.fragment { + margin: var(--spacing-medium) calc(0px - var(--spacing-medium)); + border-radius: 0; + border-left: 0; + } +} + +code, code a, pre.fragment, div.fragment, div.fragment .line, div.fragment span, div.fragment .line a, div.fragment .line span { + font-family: var(--font-family-monospace); + font-size: var(--code-font-size) !important; +} + +div.line:after { + margin-right: var(--spacing-medium); +} + +div.fragment .line, pre.fragment { + white-space: pre; + word-wrap: initial; + line-height: var(--fragment-lineheight); +} + +div.fragment span.keyword { + color: var(--fragment-keyword); +} + +div.fragment span.keywordtype { + color: var(--fragment-keywordtype); +} + +div.fragment span.keywordflow { + color: var(--fragment-keywordflow); +} + +div.fragment span.stringliteral { + color: var(--fragment-token) +} + +div.fragment span.comment { + color: var(--fragment-comment); +} + +div.fragment a.code { + color: var(--fragment-link) !important; +} + +div.fragment span.preprocessor { + color: var(--fragment-preprocessor); +} + +div.fragment span.lineno { + display: inline-block; + width: 27px; + border-right: none; + background: var(--fragment-linenumber-background); + color: var(--fragment-linenumber-color); +} + +div.fragment span.lineno a { + background: none; + color: var(--fragment-link) !important; +} + +div.fragment > .line:first-child .lineno { + box-shadow: -999999px 0px 0 999999px var(--fragment-linenumber-background), -999998px 0px 0 999999px var(--fragment-linenumber-border); + background-color: var(--fragment-linenumber-background) !important; +} + +div.line { + border-radius: var(--border-radius-small); +} + +div.line.glow { + background-color: var(--primary-light-color); + box-shadow: none; +} + +/* + dl warning, attention, note, deprecated, bug, ... + */ + +dl.bug dt a, dl.deprecated dt a, dl.todo dt a { + font-weight: bold !important; +} + +dl.warning, dl.attention, dl.note, dl.deprecated, dl.bug, dl.invariant, dl.pre, dl.post, dl.todo, dl.remark { + padding: var(--spacing-medium); + margin: var(--spacing-medium) 0; + color: var(--page-background-color); + overflow: hidden; + margin-left: 0; + border-radius: var(--border-radius-small); +} + +dl.section dd { + margin-bottom: 2px; +} + +dl.warning, dl.attention { + background: var(--warning-color); + border-left: 8px solid var(--warning-color-dark); + color: var(--warning-color-darker); +} + +dl.warning dt, dl.attention dt { + color: var(--warning-color-dark); +} + +dl.note, dl.remark { + background: var(--note-color); + border-left: 8px solid var(--note-color-dark); + color: var(--note-color-darker); +} + +dl.note dt, dl.remark dt { + color: var(--note-color-dark); +} + +dl.todo { + background: var(--todo-color); + border-left: 8px solid var(--todo-color-dark); + color: var(--todo-color-darker); +} + +dl.todo dt a { + color: var(--todo-color-dark) !important; +} + +dl.bug dt a { + color: var(--todo-color-dark) !important; +} + +dl.bug { + background: var(--bug-color); + border-left: 8px solid var(--bug-color-dark); + color: var(--bug-color-darker); +} + +dl.bug dt a { + color: var(--bug-color-dark) !important; +} + +dl.deprecated { + background: var(--deprecated-color); + border-left: 8px solid var(--deprecated-color-dark); + color: var(--deprecated-color-darker); +} + +dl.deprecated dt a { + color: var(--deprecated-color-dark) !important; +} + +dl.section dd, dl.bug dd, dl.deprecated dd, dl.todo dd { + margin-inline-start: 0px; +} + +dl.invariant, dl.pre, dl.post { + background: var(--invariant-color); + border-left: 8px solid var(--invariant-color-dark); + color: var(--invariant-color-darker); +} + +dl.invariant dt, dl.pre dt, dl.post dt { + color: var(--invariant-color-dark); +} + +/* + memitem + */ + +div.memdoc, div.memproto, h2.memtitle { + box-shadow: none; + background-image: none; + border: none; +} + +div.memdoc { + padding: 0 var(--spacing-medium); + background: var(--page-background-color); +} + +h2.memtitle, div.memitem { + border: 1px solid var(--separator-color); + box-shadow: var(--box-shadow); +} + +h2.memtitle { + box-shadow: 0px var(--spacing-medium) 0 -1px var(--fragment-background), var(--box-shadow); +} + +div.memitem { + transition: none; +} + +div.memproto, h2.memtitle { + background: var(--fragment-background); +} + +h2.memtitle { + font-weight: 500; + font-size: var(--memtitle-font-size); + font-family: var(--font-family-monospace); + border-bottom: none; + border-top-left-radius: var(--border-radius-medium); + border-top-right-radius: var(--border-radius-medium); + word-break: break-all; + position: relative; +} + +h2.memtitle:after { + content: ""; + display: block; + background: var(--fragment-background); + height: var(--spacing-medium); + bottom: calc(0px - var(--spacing-medium)); + left: 0; + right: -14px; + position: absolute; + border-top-right-radius: var(--border-radius-medium); +} + +h2.memtitle > span.permalink { + font-size: inherit; +} + +h2.memtitle > span.permalink > a { + text-decoration: none; + padding-left: 3px; + margin-right: -4px; + user-select: none; + display: inline-block; + margin-top: -6px; +} + +h2.memtitle > span.permalink > a:hover { + color: var(--primary-dark-color) !important; +} + +a:target + h2.memtitle, a:target + h2.memtitle + div.memitem { + border-color: var(--primary-light-color); +} + +div.memitem { + border-top-right-radius: var(--border-radius-medium); + border-bottom-right-radius: var(--border-radius-medium); + border-bottom-left-radius: var(--border-radius-medium); + overflow: hidden; + display: block !important; +} + +div.memdoc { + border-radius: 0; +} + +div.memproto { + border-radius: 0 var(--border-radius-small) 0 0; + overflow: auto; + border-bottom: 1px solid var(--separator-color); + padding: var(--spacing-medium); + margin-bottom: -1px; +} + +div.memtitle { + border-top-right-radius: var(--border-radius-medium); + border-top-left-radius: var(--border-radius-medium); +} + +div.memproto table.memname { + font-family: var(--font-family-monospace); + color: var(--page-foreground-color); + font-size: var(--memname-font-size); + text-shadow: none; +} + +div.memproto div.memtemplate { + font-family: var(--font-family-monospace); + color: var(--primary-dark-color); + font-size: var(--memname-font-size); + margin-left: 2px; + text-shadow: none; +} + +table.mlabels, table.mlabels > tbody { + display: block; +} + +td.mlabels-left { + width: auto; +} + +td.mlabels-right { + margin-top: 3px; + position: sticky; + left: 0; +} + +table.mlabels > tbody > tr:first-child { + display: flex; + justify-content: space-between; + flex-wrap: wrap; +} + +.memname, .memitem span.mlabels { + margin: 0 +} + +/* + reflist + */ + +dl.reflist { + box-shadow: var(--box-shadow); + border-radius: var(--border-radius-medium); + border: 1px solid var(--separator-color); + overflow: hidden; + padding: 0; +} + + +dl.reflist dt, dl.reflist dd { + box-shadow: none; + text-shadow: none; + background-image: none; + border: none; + padding: 12px; +} + + +dl.reflist dt { + font-weight: 500; + border-radius: 0; + background: var(--code-background); + border-bottom: 1px solid var(--separator-color); + color: var(--page-foreground-color) +} + + +dl.reflist dd { + background: none; +} + +/* + Table + */ + +.contents table:not(.memberdecls):not(.mlabels):not(.fieldtable):not(.memname), +.contents table:not(.memberdecls):not(.mlabels):not(.fieldtable):not(.memname) tbody { + display: inline-block; + max-width: 100%; +} + +.contents > table:not(.memberdecls):not(.mlabels):not(.fieldtable):not(.memname):not(.classindex) { + margin-left: calc(0px - var(--spacing-large)); + margin-right: calc(0px - var(--spacing-large)); + max-width: calc(100% + 2 * var(--spacing-large)); +} + +table.fieldtable, +table.markdownTable tbody, +table.doxtable tbody { + border: none; + margin: var(--spacing-medium) 0; + box-shadow: 0 0 0 1px var(--separator-color); + border-radius: var(--border-radius-small); +} + +table.markdownTable, table.doxtable, table.fieldtable { + padding: 1px; +} + +table.doxtable caption { + display: block; +} + +table.fieldtable { + border-collapse: collapse; + width: 100%; +} + +th.markdownTableHeadLeft, +th.markdownTableHeadRight, +th.markdownTableHeadCenter, +th.markdownTableHeadNone, +table.doxtable th { + background: var(--tablehead-background); + color: var(--tablehead-foreground); + font-weight: 600; + font-size: var(--page-font-size); +} + +th.markdownTableHeadLeft:first-child, +th.markdownTableHeadRight:first-child, +th.markdownTableHeadCenter:first-child, +th.markdownTableHeadNone:first-child, +table.doxtable tr th:first-child { + border-top-left-radius: var(--border-radius-small); +} + +th.markdownTableHeadLeft:last-child, +th.markdownTableHeadRight:last-child, +th.markdownTableHeadCenter:last-child, +th.markdownTableHeadNone:last-child, +table.doxtable tr th:last-child { + border-top-right-radius: var(--border-radius-small); +} + +table.markdownTable td, +table.markdownTable th, +table.fieldtable td, +table.fieldtable th, +table.doxtable td, +table.doxtable th { + border: 1px solid var(--separator-color); + padding: var(--spacing-small) var(--spacing-medium); +} + +table.markdownTable td:last-child, +table.markdownTable th:last-child, +table.fieldtable td:last-child, +table.fieldtable th:last-child, +table.doxtable td:last-child, +table.doxtable th:last-child { + border-right: none; +} + +table.markdownTable td:first-child, +table.markdownTable th:first-child, +table.fieldtable td:first-child, +table.fieldtable th:first-child, +table.doxtable td:first-child, +table.doxtable th:first-child { + border-left: none; +} + +table.markdownTable tr:first-child td, +table.markdownTable tr:first-child th, +table.fieldtable tr:first-child td, +table.fieldtable tr:first-child th, +table.doxtable tr:first-child td, +table.doxtable tr:first-child th { + border-top: none; +} + +table.markdownTable tr:last-child td, +table.markdownTable tr:last-child th, +table.fieldtable tr:last-child td, +table.fieldtable tr:last-child th, +table.doxtable tr:last-child td, +table.doxtable tr:last-child th { + border-bottom: none; +} + +table.markdownTable tr, table.doxtable tr { + border-bottom: 1px solid var(--separator-color); +} + +table.markdownTable tr:last-child, table.doxtable tr:last-child { + border-bottom: none; +} + +.full_width_table table:not(.memberdecls):not(.mlabels):not(.fieldtable):not(.memname) { + display: block; +} + +.full_width_table table:not(.memberdecls):not(.mlabels):not(.fieldtable):not(.memname) tbody { + display: table; + width: 100%; +} + +table.fieldtable th { + font-size: var(--page-font-size); + font-weight: 600; + background-image: none; + background-color: var(--tablehead-background); + color: var(--tablehead-foreground); +} + +table.fieldtable td.fieldtype, .fieldtable td.fieldname, .fieldtable td.fielddoc, .fieldtable th { + border-bottom: 1px solid var(--separator-color); + border-right: 1px solid var(--separator-color); +} + +table.fieldtable tr:last-child td:first-child { + border-bottom-left-radius: var(--border-radius-small); +} + +table.fieldtable tr:last-child td:last-child { + border-bottom-right-radius: var(--border-radius-small); +} + +.memberdecls td.glow, .fieldtable tr.glow { + background-color: var(--primary-light-color); + box-shadow: none; +} + +table.memberdecls { + display: block; + -webkit-tap-highlight-color: transparent; +} + +table.memberdecls tr[class^='memitem'] { + font-family: var(--font-family-monospace); + font-size: var(--code-font-size); +} + +table.memberdecls tr[class^='memitem'] .memTemplParams { + font-family: var(--font-family-monospace); + font-size: var(--code-font-size); + color: var(--primary-dark-color); + white-space: normal; +} + +table.memberdecls .memItemLeft, +table.memberdecls .memItemRight, +table.memberdecls .memTemplItemLeft, +table.memberdecls .memTemplItemRight, +table.memberdecls .memTemplParams { + transition: none; + padding-top: var(--spacing-small); + padding-bottom: var(--spacing-small); + border-top: 1px solid var(--separator-color); + border-bottom: 1px solid var(--separator-color); + background-color: var(--fragment-background); +} + +table.memberdecls .memTemplItemLeft, +table.memberdecls .memTemplItemRight { + padding-top: 2px; +} + +table.memberdecls .memTemplParams { + border-bottom: 0; + border-left: 1px solid var(--separator-color); + border-right: 1px solid var(--separator-color); + border-radius: var(--border-radius-small) var(--border-radius-small) 0 0; + padding-bottom: var(--spacing-small); +} + +table.memberdecls .memTemplItemLeft { + border-radius: 0 0 0 var(--border-radius-small); + border-left: 1px solid var(--separator-color); + border-top: 0; +} + +table.memberdecls .memTemplItemRight { + border-radius: 0 0 var(--border-radius-small) 0; + border-right: 1px solid var(--separator-color); + padding-left: 0; + border-top: 0; +} + +table.memberdecls .memItemLeft { + border-radius: var(--border-radius-small) 0 0 var(--border-radius-small); + border-left: 1px solid var(--separator-color); + padding-left: var(--spacing-medium); + padding-right: 0; +} + +table.memberdecls .memItemRight { + border-radius: 0 var(--border-radius-small) var(--border-radius-small) 0; + border-right: 1px solid var(--separator-color); + padding-right: var(--spacing-medium); + padding-left: 0; + +} + +table.memberdecls .mdescLeft, table.memberdecls .mdescRight { + background: none; + color: var(--page-foreground-color); + padding: var(--spacing-small) 0; +} + +table.memberdecls .memItemLeft, +table.memberdecls .memTemplItemLeft { + padding-right: var(--spacing-medium); +} + +table.memberdecls .memSeparator { + background: var(--page-background-color); + height: var(--spacing-large); + border: 0; + transition: none; +} + +table.memberdecls .groupheader { + margin-bottom: var(--spacing-large); +} + +table.memberdecls .inherit_header td { + padding: 0 0 var(--spacing-medium) 0; + text-indent: -12px; + color: var(--page-secondary-foreground-color); +} + +table.memberdecls img[src="closed.png"], +table.memberdecls img[src="open.png"], +div.dynheader img[src="open.png"], +div.dynheader img[src="closed.png"] { + width: 0; + height: 0; + border-left: 4px solid transparent; + border-right: 4px solid transparent; + border-top: 5px solid var(--primary-color); + margin-top: 8px; + display: block; + float: left; + margin-left: -10px; + transition: transform var(--animation-duration) ease-out; +} + +table.memberdecls img { + margin-right: 10px; +} + +table.memberdecls img[src="closed.png"], +div.dynheader img[src="closed.png"] { + transform: rotate(-90deg); + +} + +.compoundTemplParams { + font-family: var(--font-family-monospace); + color: var(--primary-dark-color); + font-size: var(--code-font-size); +} + +@media screen and (max-width: 767px) { + + table.memberdecls .memItemLeft, + table.memberdecls .memItemRight, + table.memberdecls .mdescLeft, + table.memberdecls .mdescRight, + table.memberdecls .memTemplItemLeft, + table.memberdecls .memTemplItemRight, + table.memberdecls .memTemplParams { + display: block; + text-align: left; + padding-left: var(--spacing-large); + margin: 0 calc(0px - var(--spacing-large)) 0 calc(0px - var(--spacing-large)); + border-right: none; + border-left: none; + border-radius: 0; + white-space: normal; + } + + table.memberdecls .memItemLeft, + table.memberdecls .mdescLeft, + table.memberdecls .memTemplItemLeft { + border-bottom: 0; + padding-bottom: 0; + } + + table.memberdecls .memTemplItemLeft { + padding-top: 0; + } + + table.memberdecls .mdescLeft { + margin-bottom: calc(0px - var(--page-font-size)); + } + + table.memberdecls .memItemRight, + table.memberdecls .mdescRight, + table.memberdecls .memTemplItemRight { + border-top: 0; + padding-top: 0; + padding-right: var(--spacing-large); + overflow-x: auto; + } + + table.memberdecls tr[class^='memitem']:not(.inherit) { + display: block; + width: calc(100vw - 2 * var(--spacing-large)); + } + + table.memberdecls .mdescRight { + color: var(--page-foreground-color); + } + + table.memberdecls tr.inherit { + visibility: hidden; + } + + table.memberdecls tr[style="display: table-row;"] { + display: block !important; + visibility: visible; + width: calc(100vw - 2 * var(--spacing-large)); + animation: fade .5s; + } + + @keyframes fade { + 0% { + opacity: 0; + max-height: 0; + } + + 100% { + opacity: 1; + max-height: 200px; + } + } +} + + +/* + Horizontal Rule + */ + +hr { + margin-top: var(--spacing-large); + margin-bottom: var(--spacing-large); + height: 1px; + background-color: var(--separator-color); + border: 0; +} + +.contents hr { + box-shadow: 100px 0 0 var(--separator-color), + -100px 0 0 var(--separator-color), + 500px 0 0 var(--separator-color), + -500px 0 0 var(--separator-color), + 1500px 0 0 var(--separator-color), + -1500px 0 0 var(--separator-color), + 2000px 0 0 var(--separator-color), + -2000px 0 0 var(--separator-color); +} + +.contents img, .contents .center, .contents center, .contents div.image object { + max-width: 100%; + overflow: auto; +} + +@media screen and (max-width: 767px) { + .contents .dyncontent > .center, .contents > center { + margin-left: calc(0px - var(--spacing-large)); + margin-right: calc(0px - var(--spacing-large)); + max-width: calc(100% + 2 * var(--spacing-large)); + } +} + +/* + Directories + */ +div.directory { + border-top: 1px solid var(--separator-color); + border-bottom: 1px solid var(--separator-color); + width: auto; +} + +table.directory { + font-family: var(--font-family); + font-size: var(--page-font-size); + font-weight: normal; + width: 100%; +} + +table.directory td.entry, table.directory td.desc { + padding: calc(var(--spacing-small) / 2) var(--spacing-small); + line-height: var(--table-line-height); +} + +table.directory tr.even td:last-child { + border-radius: 0 var(--border-radius-small) var(--border-radius-small) 0; +} + +table.directory tr.even td:first-child { + border-radius: var(--border-radius-small) 0 0 var(--border-radius-small); +} + +table.directory tr.even:last-child td:last-child { + border-radius: 0 var(--border-radius-small) 0 0; +} + +table.directory tr.even:last-child td:first-child { + border-radius: var(--border-radius-small) 0 0 0; +} + +table.directory td.desc { + min-width: 250px; +} + +table.directory tr.even { + background-color: var(--odd-color); +} + +table.directory tr.odd { + background-color: transparent; +} + +.icona { + width: auto; + height: auto; + margin: 0 var(--spacing-small); +} + +.icon { + background: var(--primary-color); + border-radius: var(--border-radius-small); + font-size: var(--page-font-size); + padding: calc(var(--page-font-size) / 5); + line-height: var(--page-font-size); + transform: scale(0.8); + height: auto; + width: var(--page-font-size); + user-select: none; +} + +.iconfopen, .icondoc, .iconfclosed { + background-position: center; + margin-bottom: 0; + height: var(--table-line-height); +} + +.icondoc { + filter: saturate(0.2); +} + +@media screen and (max-width: 767px) { + div.directory { + margin-left: calc(0px - var(--spacing-large)); + margin-right: calc(0px - var(--spacing-large)); + } +} + +@media (prefers-color-scheme: dark) { + html:not(.light-mode) .iconfopen, html:not(.light-mode) .iconfclosed { + filter: hue-rotate(180deg) invert(); + } +} + +html.dark-mode .iconfopen, html.dark-mode .iconfclosed { + filter: hue-rotate(180deg) invert(); +} + +/* + Class list + */ + +.classindex dl.odd { + background: var(--odd-color); + border-radius: var(--border-radius-small); +} + +.classindex dl.even { + background-color: transparent; +} + +/* + Class Index Doxygen 1.8 +*/ + +table.classindex { + margin-left: 0; + margin-right: 0; + width: 100%; +} + +table.classindex table div.ah { + background-image: none; + background-color: initial; + border-color: var(--separator-color); + color: var(--page-foreground-color); + box-shadow: var(--box-shadow); + border-radius: var(--border-radius-large); + padding: var(--spacing-small); +} + +div.qindex { + background-color: var(--odd-color); + border-radius: var(--border-radius-small); + border: 1px solid var(--separator-color); + padding: var(--spacing-small) 0; +} + +/* + Footer and nav-path + */ + +#nav-path { + width: 100%; +} + +#nav-path ul { + background-image: none; + background: var(--page-background-color); + border: none; + border-top: 1px solid var(--separator-color); + border-bottom: 1px solid var(--separator-color); + border-bottom: 0; + box-shadow: 0 0.75px 0 var(--separator-color); + font-size: var(--navigation-font-size); +} + +img.footer { + width: 60px; +} + +.navpath li.footer { + color: var(--page-secondary-foreground-color); +} + +address.footer { + color: var(--page-secondary-foreground-color); + margin-bottom: var(--spacing-large); +} + +#nav-path li.navelem { + background-image: none; + display: flex; + align-items: center; +} + +.navpath li.navelem a { + text-shadow: none; + display: inline-block; + color: var(--primary-color) !important; +} + +.navpath li.navelem b { + color: var(--primary-dark-color); + font-weight: 500; +} + +li.navelem { + padding: 0; + margin-left: -8px; +} + +li.navelem:first-child { + margin-left: var(--spacing-large); +} + +li.navelem:first-child:before { + display: none; +} + +#nav-path li.navelem:after { + content: ''; + border: 5px solid var(--page-background-color); + border-bottom-color: transparent; + border-right-color: transparent; + border-top-color: transparent; + transform: translateY(-1px) scaleY(4.2); + z-index: 10; + margin-left: 6px; +} + +#nav-path li.navelem:before { + content: ''; + border: 5px solid var(--separator-color); + border-bottom-color: transparent; + border-right-color: transparent; + border-top-color: transparent; + transform: translateY(-1px) scaleY(3.2); + margin-right: var(--spacing-small); +} + +.navpath li.navelem a:hover { + color: var(--primary-color); +} + +/* + Scrollbars for Webkit +*/ + +#nav-tree::-webkit-scrollbar, +div.fragment::-webkit-scrollbar, +pre.fragment::-webkit-scrollbar, +div.memproto::-webkit-scrollbar, +.contents center::-webkit-scrollbar, +.contents .center::-webkit-scrollbar, +.contents table:not(.memberdecls):not(.mlabels):not(.fieldtable):not(.memname) tbody::-webkit-scrollbar, +div.contents .toc::-webkit-scrollbar, +.contents .dotgraph::-webkit-scrollbar, +.contents .tabs-overview-container::-webkit-scrollbar { + background: transparent; + width: calc(var(--webkit-scrollbar-size) + var(--webkit-scrollbar-padding) + var(--webkit-scrollbar-padding)); + height: calc(var(--webkit-scrollbar-size) + var(--webkit-scrollbar-padding) + var(--webkit-scrollbar-padding)); +} + +#nav-tree::-webkit-scrollbar-thumb, +div.fragment::-webkit-scrollbar-thumb, +pre.fragment::-webkit-scrollbar-thumb, +div.memproto::-webkit-scrollbar-thumb, +.contents center::-webkit-scrollbar-thumb, +.contents .center::-webkit-scrollbar-thumb, +.contents table:not(.memberdecls):not(.mlabels):not(.fieldtable):not(.memname) tbody::-webkit-scrollbar-thumb, +div.contents .toc::-webkit-scrollbar-thumb, +.contents .dotgraph::-webkit-scrollbar-thumb, +.contents .tabs-overview-container::-webkit-scrollbar-thumb { + background-color: transparent; + border: var(--webkit-scrollbar-padding) solid transparent; + border-radius: calc(var(--webkit-scrollbar-padding) + var(--webkit-scrollbar-padding)); + background-clip: padding-box; +} + +#nav-tree:hover::-webkit-scrollbar-thumb, +div.fragment:hover::-webkit-scrollbar-thumb, +pre.fragment:hover::-webkit-scrollbar-thumb, +div.memproto:hover::-webkit-scrollbar-thumb, +.contents center:hover::-webkit-scrollbar-thumb, +.contents .center:hover::-webkit-scrollbar-thumb, +.contents table:not(.memberdecls):not(.mlabels):not(.fieldtable):not(.memname) tbody:hover::-webkit-scrollbar-thumb, +div.contents .toc:hover::-webkit-scrollbar-thumb, +.contents .dotgraph:hover::-webkit-scrollbar-thumb, +.contents .tabs-overview-container:hover::-webkit-scrollbar-thumb { + background-color: var(--webkit-scrollbar-color); +} + +#nav-tree::-webkit-scrollbar-track, +div.fragment::-webkit-scrollbar-track, +pre.fragment::-webkit-scrollbar-track, +div.memproto::-webkit-scrollbar-track, +.contents center::-webkit-scrollbar-track, +.contents .center::-webkit-scrollbar-track, +.contents table:not(.memberdecls):not(.mlabels):not(.fieldtable):not(.memname) tbody::-webkit-scrollbar-track, +div.contents .toc::-webkit-scrollbar-track, +.contents .dotgraph::-webkit-scrollbar-track, +.contents .tabs-overview-container::-webkit-scrollbar-track { + background: transparent; +} + +#nav-tree::-webkit-scrollbar-corner { + background-color: var(--side-nav-background); +} + +#nav-tree, +div.fragment, +pre.fragment, +div.memproto, +.contents center, +.contents .center, +.contents table:not(.memberdecls):not(.mlabels):not(.fieldtable):not(.memname) tbody, +div.contents .toc { + overflow-x: auto; + overflow-x: overlay; +} + +#nav-tree { + overflow-x: auto; + overflow-y: auto; + overflow-y: overlay; +} + +/* + Scrollbars for Firefox +*/ + +#nav-tree, +div.fragment, +pre.fragment, +div.memproto, +.contents center, +.contents .center, +.contents table:not(.memberdecls):not(.mlabels):not(.fieldtable):not(.memname) tbody, +div.contents .toc, +.contents .dotgraph, +.contents .tabs-overview-container { + scrollbar-width: thin; +} + +/* + Optional Dark mode toggle button +*/ + +doxygen-awesome-dark-mode-toggle { + display: inline-block; + margin: 0 0 0 var(--spacing-small); + padding: 0; + width: var(--searchbar-height); + height: var(--searchbar-height); + background: none; + border: none; + border-radius: var(--searchbar-height); + vertical-align: middle; + text-align: center; + line-height: var(--searchbar-height); + font-size: 22px; + display: flex; + align-items: center; + justify-content: center; + user-select: none; + cursor: pointer; +} + +doxygen-awesome-dark-mode-toggle > svg { + transition: transform var(--animation-duration) ease-in-out; +} + +doxygen-awesome-dark-mode-toggle:active > svg { + transform: scale(.5); +} + +doxygen-awesome-dark-mode-toggle:hover { + background-color: rgba(0,0,0,.03); +} + +html.dark-mode doxygen-awesome-dark-mode-toggle:hover { + background-color: rgba(0,0,0,.18); +} + +/* + Optional fragment copy button +*/ +.doxygen-awesome-fragment-wrapper { + position: relative; +} + +doxygen-awesome-fragment-copy-button { + opacity: 0; + background: var(--fragment-background); + width: 28px; + height: 28px; + position: absolute; + right: calc(var(--spacing-large) - (var(--spacing-large) / 2.5)); + top: calc(var(--spacing-large) - (var(--spacing-large) / 2.5)); + border: 1px solid var(--fragment-foreground); + cursor: pointer; + border-radius: var(--border-radius-small); + display: flex; + justify-content: center; + align-items: center; +} + +.doxygen-awesome-fragment-wrapper:hover doxygen-awesome-fragment-copy-button, doxygen-awesome-fragment-copy-button.success { + opacity: .28; +} + +doxygen-awesome-fragment-copy-button:hover, doxygen-awesome-fragment-copy-button.success { + opacity: 1 !important; +} + +doxygen-awesome-fragment-copy-button:active:not([class~=success]) svg { + transform: scale(.91); +} + +doxygen-awesome-fragment-copy-button svg { + fill: var(--fragment-foreground); + width: 18px; + height: 18px; +} + +doxygen-awesome-fragment-copy-button.success svg { + fill: rgb(14, 168, 14); +} + +doxygen-awesome-fragment-copy-button.success { + border-color: rgb(14, 168, 14); +} + +@media screen and (max-width: 767px) { + .textblock > .doxygen-awesome-fragment-wrapper > doxygen-awesome-fragment-copy-button, + .textblock li > .doxygen-awesome-fragment-wrapper > doxygen-awesome-fragment-copy-button, + .memdoc li > .doxygen-awesome-fragment-wrapper > doxygen-awesome-fragment-copy-button, + .memdoc > .doxygen-awesome-fragment-wrapper > doxygen-awesome-fragment-copy-button, + dl dd > .doxygen-awesome-fragment-wrapper > doxygen-awesome-fragment-copy-button { + right: 0; + } +} + +/* + Optional paragraph link button +*/ + +a.anchorlink { + font-size: 90%; + margin-left: var(--spacing-small); + color: var(--page-foreground-color) !important; + text-decoration: none; + opacity: .15; + display: none; + transition: opacity var(--animation-duration) ease-in-out, color var(--animation-duration) ease-in-out; +} + +a.anchorlink svg { + fill: var(--page-foreground-color); +} + +h3 a.anchorlink svg, h4 a.anchorlink svg { + margin-bottom: -3px; + margin-top: -4px; +} + +a.anchorlink:hover { + opacity: .45; +} + +h2:hover a.anchorlink, h1:hover a.anchorlink, h3:hover a.anchorlink, h4:hover a.anchorlink { + display: inline-block; +} + +/* + Optional tab feature +*/ + +.tabbed > ul { + padding-inline-start: 0px; + margin: 0; + padding: var(--spacing-small) 0; +} + +.tabbed > ul > li { + display: none; +} + +.tabbed > ul > li.selected { + display: block; +} + +.tabs-overview-container { + overflow-x: auto; + display: block; + overflow-y: visible; +} + +.tabs-overview { + border-bottom: 1px solid var(--separator-color); + display: flex; + flex-direction: row; +} + +@media screen and (max-width: 767px) { + .tabs-overview-container { + margin: 0 calc(0px - var(--spacing-large)); + } + .tabs-overview { + padding: 0 var(--spacing-large) + } +} + +.tabs-overview button.tab-button { + color: var(--page-foreground-color); + margin: 0; + border: none; + background: transparent; + padding: calc(var(--spacing-large) / 2) 0; + display: inline-block; + font-size: var(--page-font-size); + cursor: pointer; + box-shadow: 0 1px 0 0 var(--separator-color); + position: relative; + + -webkit-tap-highlight-color: transparent; +} + +.tabs-overview button.tab-button .tab-title::before { + display: block; + content: attr(title); + font-weight: 600; + height: 0; + overflow: hidden; + visibility: hidden; +} + +.tabs-overview button.tab-button .tab-title { + float: left; + white-space: nowrap; + font-weight: normal; + padding: calc(var(--spacing-large) / 2) var(--spacing-large); + border-radius: var(--border-radius-medium); + transition: background-color var(--animation-duration) ease-in-out, font-weight var(--animation-duration) ease-in-out; +} + +.tabs-overview button.tab-button:not(:last-child) .tab-title { + box-shadow: 8px 0 0 -7px var(--separator-color); +} + +.tabs-overview button.tab-button:hover .tab-title { + background: var(--separator-color); + box-shadow: none; +} + +.tabs-overview button.tab-button.active .tab-title { + font-weight: 600; +} + +.tabs-overview button.tab-button::after { + content: ''; + display: block; + position: absolute; + left: 0; + bottom: 0; + right: 0; + height: 0; + width: 0%; + margin: 0 auto; + border-radius: var(--border-radius-small) var(--border-radius-small) 0 0; + background-color: var(--primary-color); + transition: width var(--animation-duration) ease-in-out, height var(--animation-duration) ease-in-out; +} + +.tabs-overview button.tab-button.active::after { + width: 100%; + box-sizing: border-box; + height: 3px; +} + + +/* + Navigation Buttons +*/ + +.section_buttons:not(:empty) { + margin-top: calc(var(--spacing-large) * 3); +} + +.section_buttons table.markdownTable { + display: block; + width: 100%; +} + +.section_buttons table.markdownTable tbody { + display: table !important; + width: 100%; + box-shadow: none; + border-spacing: 10px; +} + +.section_buttons table.markdownTable td { + padding: 0; +} + +.section_buttons table.markdownTable th { + display: none; +} + +.section_buttons table.markdownTable tr.markdownTableHead { + border: none; +} + +.section_buttons tr th, .section_buttons tr td { + background: none; + border: none; + padding: var(--spacing-large) 0 var(--spacing-small); +} + +.section_buttons a { + display: inline-block; + border: 1px solid var(--separator-color); + border-radius: var(--border-radius-medium); + color: var(--page-secondary-foreground-color) !important; + text-decoration: none; + transition: color var(--animation-duration) ease-in-out, background-color var(--animation-duration) ease-in-out; +} + +.section_buttons a:hover { + color: var(--page-foreground-color) !important; + background-color: var(--odd-color); +} + +.section_buttons tr td.markdownTableBodyLeft a { + padding: var(--spacing-medium) var(--spacing-large) var(--spacing-medium) calc(var(--spacing-large) / 2); +} + +.section_buttons tr td.markdownTableBodyRight a { + padding: var(--spacing-medium) calc(var(--spacing-large) / 2) var(--spacing-medium) var(--spacing-large); +} + +.section_buttons tr td.markdownTableBodyLeft a::before, +.section_buttons tr td.markdownTableBodyRight a::after { + color: var(--page-secondary-foreground-color) !important; + display: inline-block; + transition: color .08s ease-in-out, transform .09s ease-in-out; +} + +.section_buttons tr td.markdownTableBodyLeft a::before { + content: '〈'; + padding-right: var(--spacing-large); +} + + +.section_buttons tr td.markdownTableBodyRight a::after { + content: '〉'; + padding-left: var(--spacing-large); +} + + +.section_buttons tr td.markdownTableBodyLeft a:hover::before { + color: var(--page-foreground-color) !important; + transform: translateX(-3px); +} + +.section_buttons tr td.markdownTableBodyRight a:hover::after { + color: var(--page-foreground-color) !important; + transform: translateX(3px); +} + +@media screen and (max-width: 450px) { + .section_buttons a { + width: 100%; + box-sizing: border-box; + } + + .section_buttons tr td:nth-of-type(1).markdownTableBodyLeft a { + border-radius: var(--border-radius-medium) 0 0 var(--border-radius-medium); + border-right: none; + } + + .section_buttons tr td:nth-of-type(2).markdownTableBodyRight a { + border-radius: 0 var(--border-radius-medium) var(--border-radius-medium) 0; + } +} diff --git a/docs/html/doxygen.css b/docs/html/doxygen.css new file mode 100644 index 0000000..2010785 --- /dev/null +++ b/docs/html/doxygen.css @@ -0,0 +1,1841 @@ +/* The standard CSS for doxygen 1.9.4 */ + +body, table, div, p, dl { + font: 400 14px/22px Roboto,sans-serif; +} + +p.reference, p.definition { + font: 400 14px/22px Roboto,sans-serif; +} + +/* @group Heading Levels */ + +h1.groupheader { + font-size: 150%; +} + +.title { + font: 400 14px/28px Roboto,sans-serif; + font-size: 150%; + font-weight: bold; + margin: 10px 2px; +} + +h2.groupheader { + border-bottom: 1px solid #879ECB; + color: #354C7B; + font-size: 150%; + font-weight: normal; + margin-top: 1.75em; + padding-top: 8px; + padding-bottom: 4px; + width: 100%; +} + +h3.groupheader { + font-size: 100%; +} + +h1, h2, h3, h4, h5, h6 { + -webkit-transition: text-shadow 0.5s linear; + -moz-transition: text-shadow 0.5s linear; + -ms-transition: text-shadow 0.5s linear; + -o-transition: text-shadow 0.5s linear; + transition: text-shadow 0.5s linear; + margin-right: 15px; +} + +h1.glow, h2.glow, h3.glow, h4.glow, h5.glow, h6.glow { + text-shadow: 0 0 15px cyan; +} + +dt { + font-weight: bold; +} + +ul.multicol { + -moz-column-gap: 1em; + -webkit-column-gap: 1em; + column-gap: 1em; + -moz-column-count: 3; + -webkit-column-count: 3; + column-count: 3; +} + +p.startli, p.startdd { + margin-top: 2px; +} + +th p.starttd, th p.intertd, th p.endtd { + font-size: 100%; + font-weight: 700; +} + +p.starttd { + margin-top: 0px; +} + +p.endli { + margin-bottom: 0px; +} + +p.enddd { + margin-bottom: 4px; +} + +p.endtd { + margin-bottom: 2px; +} + +p.interli { +} + +p.interdd { +} + +p.intertd { +} + +/* @end */ + +caption { + font-weight: bold; +} + +span.legend { + font-size: 70%; + text-align: center; +} + +h3.version { + font-size: 90%; + text-align: center; +} + +div.navtab { + border-right: 1px solid #A3B4D7; + padding-right: 15px; + text-align: right; + line-height: 110%; +} + +div.navtab table { + border-spacing: 0; +} + +td.navtab { + padding-right: 6px; + padding-left: 6px; +} +td.navtabHL { + background-image: url('tab_a.png'); + background-repeat:repeat-x; + padding-right: 6px; + padding-left: 6px; +} + +td.navtabHL a, td.navtabHL a:visited { + color: #fff; + text-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); +} + +a.navtab { + font-weight: bold; +} + +div.qindex{ + text-align: center; + width: 100%; + line-height: 140%; + font-size: 130%; + color: #A0A0A0; +} + +dt.alphachar{ + font-size: 180%; + font-weight: bold; +} + +.alphachar a{ + color: black; +} + +.alphachar a:hover, .alphachar a:visited{ + text-decoration: none; +} + +.classindex dl { + padding: 25px; + column-count:1 +} + +.classindex dd { + display:inline-block; + margin-left: 50px; + width: 90%; + line-height: 1.15em; +} + +.classindex dl.odd { + background-color: #F8F9FC; +} + +@media(min-width: 1120px) { + .classindex dl { + column-count:2 + } +} + +@media(min-width: 1320px) { + .classindex dl { + column-count:3 + } +} + + +/* @group Link Styling */ + +a { + color: #3D578C; + font-weight: normal; + text-decoration: none; +} + +.contents a:visited { + color: #4665A2; +} + +a:hover { + text-decoration: underline; +} + +.contents a.qindexHL:visited { + color: #FFFFFF; +} + +a.el { + font-weight: bold; +} + +a.elRef { +} + +a.code, a.code:visited, a.line, a.line:visited { + color: #4665A2; +} + +a.codeRef, a.codeRef:visited, a.lineRef, a.lineRef:visited { + color: #4665A2; +} + +a.code.hl_class { /* style for links to class names in code snippets */ } +a.code.hl_struct { /* style for links to struct names in code snippets */ } +a.code.hl_union { /* style for links to union names in code snippets */ } +a.code.hl_interface { /* style for links to interface names in code snippets */ } +a.code.hl_protocol { /* style for links to protocol names in code snippets */ } +a.code.hl_category { /* style for links to category names in code snippets */ } +a.code.hl_exception { /* style for links to exception names in code snippets */ } +a.code.hl_service { /* style for links to service names in code snippets */ } +a.code.hl_singleton { /* style for links to singleton names in code snippets */ } +a.code.hl_concept { /* style for links to concept names in code snippets */ } +a.code.hl_namespace { /* style for links to namespace names in code snippets */ } +a.code.hl_package { /* style for links to package names in code snippets */ } +a.code.hl_define { /* style for links to macro names in code snippets */ } +a.code.hl_function { /* style for links to function names in code snippets */ } +a.code.hl_variable { /* style for links to variable names in code snippets */ } +a.code.hl_typedef { /* style for links to typedef names in code snippets */ } +a.code.hl_enumvalue { /* style for links to enum value names in code snippets */ } +a.code.hl_enumeration { /* style for links to enumeration names in code snippets */ } +a.code.hl_signal { /* style for links to Qt signal names in code snippets */ } +a.code.hl_slot { /* style for links to Qt slot names in code snippets */ } +a.code.hl_friend { /* style for links to friend names in code snippets */ } +a.code.hl_dcop { /* style for links to KDE3 DCOP names in code snippets */ } +a.code.hl_property { /* style for links to property names in code snippets */ } +a.code.hl_event { /* style for links to event names in code snippets */ } +a.code.hl_sequence { /* style for links to sequence names in code snippets */ } +a.code.hl_dictionary { /* style for links to dictionary names in code snippets */ } + +/* @end */ + +dl.el { + margin-left: -1cm; +} + +ul { + overflow: visible; +} + +#side-nav ul { + overflow: visible; /* reset ul rule for scroll bar in GENERATE_TREEVIEW window */ +} + +#main-nav ul { + overflow: visible; /* reset ul rule for the navigation bar drop down lists */ +} + +.fragment { + text-align: left; + direction: ltr; + overflow-x: auto; /*Fixed: fragment lines overlap floating elements*/ + overflow-y: hidden; +} + +pre.fragment { + border: 1px solid #C4CFE5; + background-color: #FBFCFD; + padding: 4px 6px; + margin: 4px 8px 4px 2px; + overflow: auto; + word-wrap: break-word; + font-size: 9pt; + line-height: 125%; + font-family: monospace, fixed; + font-size: 105%; +} + +div.fragment { + padding: 0 0 1px 0; /*Fixed: last line underline overlap border*/ + margin: 4px 8px 4px 2px; + background-color: #FBFCFD; + border: 1px solid #C4CFE5; +} + +div.line { + font-family: monospace, fixed; + font-size: 13px; + min-height: 13px; + line-height: 1.0; + text-wrap: unrestricted; + white-space: -moz-pre-wrap; /* Moz */ + white-space: -pre-wrap; /* Opera 4-6 */ + white-space: -o-pre-wrap; /* Opera 7 */ + white-space: pre-wrap; /* CSS3 */ + word-wrap: break-word; /* IE 5.5+ */ + text-indent: -53px; + padding-left: 53px; + padding-bottom: 0px; + margin: 0px; + -webkit-transition-property: background-color, box-shadow; + -webkit-transition-duration: 0.5s; + -moz-transition-property: background-color, box-shadow; + -moz-transition-duration: 0.5s; + -ms-transition-property: background-color, box-shadow; + -ms-transition-duration: 0.5s; + -o-transition-property: background-color, box-shadow; + -o-transition-duration: 0.5s; + transition-property: background-color, box-shadow; + transition-duration: 0.5s; +} + +div.line:after { + content:"\000A"; + white-space: pre; +} + +div.line.glow { + background-color: cyan; + box-shadow: 0 0 10px cyan; +} + + +span.lineno { + padding-right: 4px; + margin-right: 9px; + text-align: right; + border-right: 2px solid #0F0; + background-color: #E8E8E8; + white-space: pre; +} +span.lineno a { + background-color: #D8D8D8; +} + +span.lineno a:hover { + background-color: #C8C8C8; +} + +.lineno { + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +div.ah, span.ah { + background-color: black; + font-weight: bold; + color: #FFFFFF; + margin-bottom: 3px; + margin-top: 3px; + padding: 0.2em; + border: solid thin #333; + border-radius: 0.5em; + -webkit-border-radius: .5em; + -moz-border-radius: .5em; + box-shadow: 2px 2px 3px #999; + -webkit-box-shadow: 2px 2px 3px #999; + -moz-box-shadow: rgba(0, 0, 0, 0.15) 2px 2px 2px; + background-image: -webkit-gradient(linear, left top, left bottom, from(#eee), to(#000),color-stop(0.3, #444)); + background-image: -moz-linear-gradient(center top, #eee 0%, #444 40%, #000 110%); +} + +div.classindex ul { + list-style: none; + padding-left: 0; +} + +div.classindex span.ai { + display: inline-block; +} + +div.groupHeader { + margin-left: 16px; + margin-top: 12px; + font-weight: bold; +} + +div.groupText { + margin-left: 16px; + font-style: italic; +} + +body { + background-color: white; + color: black; + margin: 0; +} + +div.contents { + margin-top: 10px; + margin-left: 12px; + margin-right: 8px; +} + +td.indexkey { + background-color: #EBEFF6; + font-weight: bold; + border: 1px solid #C4CFE5; + margin: 2px 0px 2px 0; + padding: 2px 10px; + white-space: nowrap; + vertical-align: top; +} + +td.indexvalue { + background-color: #EBEFF6; + border: 1px solid #C4CFE5; + padding: 2px 10px; + margin: 2px 0px; +} + +tr.memlist { + background-color: #EEF1F7; +} + +p.formulaDsp { + text-align: center; +} + +img.formulaDsp { + +} + +img.formulaInl, img.inline { + vertical-align: middle; +} + +div.center { + text-align: center; + margin-top: 0px; + margin-bottom: 0px; + padding: 0px; +} + +div.center img { + border: 0px; +} + +address.footer { + text-align: right; + padding-right: 12px; +} + +img.footer { + border: 0px; + vertical-align: middle; +} + +.compoundTemplParams { + color: #4665A2; + font-size: 80%; + line-height: 120%; +} + +/* @group Code Colorization */ + +span.keyword { + color: #008000 +} + +span.keywordtype { + color: #604020 +} + +span.keywordflow { + color: #e08000 +} + +span.comment { + color: #800000 +} + +span.preprocessor { + color: #806020 +} + +span.stringliteral { + color: #002080 +} + +span.charliteral { + color: #008080 +} + +span.vhdldigit { + color: #ff00ff +} + +span.vhdlchar { + color: #000000 +} + +span.vhdlkeyword { + color: #700070 +} + +span.vhdllogic { + color: #ff0000 +} + +blockquote { + background-color: #F7F8FB; + border-left: 2px solid #9CAFD4; + margin: 0 24px 0 4px; + padding: 0 12px 0 16px; +} + +blockquote.DocNodeRTL { + border-left: 0; + border-right: 2px solid #9CAFD4; + margin: 0 4px 0 24px; + padding: 0 16px 0 12px; +} + +/* @end */ + +/* +.search { + color: #003399; + font-weight: bold; +} + +form.search { + margin-bottom: 0px; + margin-top: 0px; +} + +input.search { + font-size: 75%; + color: #000080; + font-weight: normal; + background-color: #e8eef2; +} +*/ + +td.tiny { + font-size: 75%; +} + +.dirtab { + padding: 4px; + border-collapse: collapse; + border: 1px solid #A3B4D7; +} + +th.dirtab { + background: #EBEFF6; + font-weight: bold; +} + +hr { + height: 0px; + border: none; + border-top: 1px solid #4A6AAA; +} + +hr.footer { + height: 1px; +} + +/* @group Member Descriptions */ + +table.memberdecls { + border-spacing: 0px; + padding: 0px; +} + +.memberdecls td, .fieldtable tr { + -webkit-transition-property: background-color, box-shadow; + -webkit-transition-duration: 0.5s; + -moz-transition-property: background-color, box-shadow; + -moz-transition-duration: 0.5s; + -ms-transition-property: background-color, box-shadow; + -ms-transition-duration: 0.5s; + -o-transition-property: background-color, box-shadow; + -o-transition-duration: 0.5s; + transition-property: background-color, box-shadow; + transition-duration: 0.5s; +} + +.memberdecls td.glow, .fieldtable tr.glow { + background-color: cyan; + box-shadow: 0 0 15px cyan; +} + +.mdescLeft, .mdescRight, +.memItemLeft, .memItemRight, +.memTemplItemLeft, .memTemplItemRight, .memTemplParams { + background-color: #F9FAFC; + border: none; + margin: 4px; + padding: 1px 0 0 8px; +} + +.mdescLeft, .mdescRight { + padding: 0px 8px 4px 8px; + color: #555; +} + +.memSeparator { + border-bottom: 1px solid #DEE4F0; + line-height: 1px; + margin: 0px; + padding: 0px; +} + +.memItemLeft, .memTemplItemLeft { + white-space: nowrap; +} + +.memItemRight, .memTemplItemRight { + width: 100%; +} + +.memTemplParams { + color: #4665A2; + white-space: nowrap; + font-size: 80%; +} + +/* @end */ + +/* @group Member Details */ + +/* Styles for detailed member documentation */ + +.memtitle { + padding: 8px; + border-top: 1px solid #A8B8D9; + border-left: 1px solid #A8B8D9; + border-right: 1px solid #A8B8D9; + border-top-right-radius: 4px; + border-top-left-radius: 4px; + margin-bottom: -1px; + background-image: url('nav_f.png'); + background-repeat: repeat-x; + background-color: #E2E8F2; + line-height: 1.25; + font-weight: 300; + float:left; +} + +.permalink +{ + font-size: 65%; + display: inline-block; + vertical-align: middle; +} + +.memtemplate { + font-size: 80%; + color: #4665A2; + font-weight: normal; + margin-left: 9px; +} + +.memnav { + background-color: #EBEFF6; + border: 1px solid #A3B4D7; + text-align: center; + margin: 2px; + margin-right: 15px; + padding: 2px; +} + +.mempage { + width: 100%; +} + +.memitem { + padding: 0; + margin-bottom: 10px; + margin-right: 5px; + -webkit-transition: box-shadow 0.5s linear; + -moz-transition: box-shadow 0.5s linear; + -ms-transition: box-shadow 0.5s linear; + -o-transition: box-shadow 0.5s linear; + transition: box-shadow 0.5s linear; + display: table !important; + width: 100%; +} + +.memitem.glow { + box-shadow: 0 0 15px cyan; +} + +.memname { + font-weight: 400; + margin-left: 6px; +} + +.memname td { + vertical-align: bottom; +} + +.memproto, dl.reflist dt { + border-top: 1px solid #A8B8D9; + border-left: 1px solid #A8B8D9; + border-right: 1px solid #A8B8D9; + padding: 6px 0px 6px 0px; + color: #253555; + font-weight: bold; + text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); + background-color: #DFE5F1; + /* opera specific markup */ + box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + border-top-right-radius: 4px; + /* firefox specific markup */ + -moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px; + -moz-border-radius-topright: 4px; + /* webkit specific markup */ + -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + -webkit-border-top-right-radius: 4px; + +} + +.overload { + font-family: "courier new",courier,monospace; + font-size: 65%; +} + +.memdoc, dl.reflist dd { + border-bottom: 1px solid #A8B8D9; + border-left: 1px solid #A8B8D9; + border-right: 1px solid #A8B8D9; + padding: 6px 10px 2px 10px; + background-color: #FBFCFD; + border-top-width: 0; + background-image:url('nav_g.png'); + background-repeat:repeat-x; + background-color: #FFFFFF; + /* opera specific markup */ + border-bottom-left-radius: 4px; + border-bottom-right-radius: 4px; + box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + /* firefox specific markup */ + -moz-border-radius-bottomleft: 4px; + -moz-border-radius-bottomright: 4px; + -moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px; + /* webkit specific markup */ + -webkit-border-bottom-left-radius: 4px; + -webkit-border-bottom-right-radius: 4px; + -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); +} + +dl.reflist dt { + padding: 5px; +} + +dl.reflist dd { + margin: 0px 0px 10px 0px; + padding: 5px; +} + +.paramkey { + text-align: right; +} + +.paramtype { + white-space: nowrap; +} + +.paramname { + color: #602020; + white-space: nowrap; +} +.paramname em { + font-style: normal; +} +.paramname code { + line-height: 14px; +} + +.params, .retval, .exception, .tparams { + margin-left: 0px; + padding-left: 0px; +} + +.params .paramname, .retval .paramname, .tparams .paramname, .exception .paramname { + font-weight: bold; + vertical-align: top; +} + +.params .paramtype, .tparams .paramtype { + font-style: italic; + vertical-align: top; +} + +.params .paramdir, .tparams .paramdir { + font-family: "courier new",courier,monospace; + vertical-align: top; +} + +table.mlabels { + border-spacing: 0px; +} + +td.mlabels-left { + width: 100%; + padding: 0px; +} + +td.mlabels-right { + vertical-align: bottom; + padding: 0px; + white-space: nowrap; +} + +span.mlabels { + margin-left: 8px; +} + +span.mlabel { + background-color: #728DC1; + border-top:1px solid #5373B4; + border-left:1px solid #5373B4; + border-right:1px solid #C4CFE5; + border-bottom:1px solid #C4CFE5; + text-shadow: none; + color: white; + margin-right: 4px; + padding: 2px 3px; + border-radius: 3px; + font-size: 7pt; + white-space: nowrap; + vertical-align: middle; +} + + + +/* @end */ + +/* these are for tree view inside a (index) page */ + +div.directory { + margin: 10px 0px; + border-top: 1px solid #9CAFD4; + border-bottom: 1px solid #9CAFD4; + width: 100%; +} + +.directory table { + border-collapse:collapse; +} + +.directory td { + margin: 0px; + padding: 0px; + vertical-align: top; +} + +.directory td.entry { + white-space: nowrap; + padding-right: 6px; + padding-top: 3px; +} + +.directory td.entry a { + outline:none; +} + +.directory td.entry a img { + border: none; +} + +.directory td.desc { + width: 100%; + padding-left: 6px; + padding-right: 6px; + padding-top: 3px; + border-left: 1px solid rgba(0,0,0,0.05); +} + +.directory tr.even { + padding-left: 6px; + background-color: #F7F8FB; +} + +.directory img { + vertical-align: -30%; +} + +.directory .levels { + white-space: nowrap; + width: 100%; + text-align: right; + font-size: 9pt; +} + +.directory .levels span { + cursor: pointer; + padding-left: 2px; + padding-right: 2px; + color: #3D578C; +} + +.arrow { + color: #9CAFD4; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + cursor: pointer; + font-size: 80%; + display: inline-block; + width: 16px; + height: 22px; +} + +.icon { + font-family: Arial, Helvetica; + font-weight: bold; + font-size: 12px; + height: 14px; + width: 16px; + display: inline-block; + background-color: #728DC1; + color: white; + text-align: center; + border-radius: 4px; + margin-left: 2px; + margin-right: 2px; +} + +.icona { + width: 24px; + height: 22px; + display: inline-block; +} + +.iconfopen { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:url('folderopen.png'); + background-position: 0px -4px; + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +.iconfclosed { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:url('folderclosed.png'); + background-position: 0px -4px; + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +.icondoc { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:url('doc.png'); + background-position: 0px -4px; + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +table.directory { + font: 400 14px Roboto,sans-serif; +} + +/* @end */ + +div.dynheader { + margin-top: 8px; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +address { + font-style: normal; + color: #2A3D61; +} + +table.doxtable caption { + caption-side: top; +} + +table.doxtable { + border-collapse:collapse; + margin-top: 4px; + margin-bottom: 4px; +} + +table.doxtable td, table.doxtable th { + border: 1px solid #2D4068; + padding: 3px 7px 2px; +} + +table.doxtable th { + background-color: #374F7F; + color: #FFFFFF; + font-size: 110%; + padding-bottom: 4px; + padding-top: 5px; +} + +table.fieldtable { + /*width: 100%;*/ + margin-bottom: 10px; + border: 1px solid #A8B8D9; + border-spacing: 0px; + -moz-border-radius: 4px; + -webkit-border-radius: 4px; + border-radius: 4px; + -moz-box-shadow: rgba(0, 0, 0, 0.15) 2px 2px 2px; + -webkit-box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.15); + box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.15); +} + +.fieldtable td, .fieldtable th { + padding: 3px 7px 2px; +} + +.fieldtable td.fieldtype, .fieldtable td.fieldname { + white-space: nowrap; + border-right: 1px solid #A8B8D9; + border-bottom: 1px solid #A8B8D9; + vertical-align: top; +} + +.fieldtable td.fieldname { + padding-top: 3px; +} + +.fieldtable td.fielddoc { + border-bottom: 1px solid #A8B8D9; + /*width: 100%;*/ +} + +.fieldtable td.fielddoc p:first-child { + margin-top: 0px; +} + +.fieldtable td.fielddoc p:last-child { + margin-bottom: 2px; +} + +.fieldtable tr:last-child td { + border-bottom: none; +} + +.fieldtable th { + background-image:url('nav_f.png'); + background-repeat:repeat-x; + background-color: #E2E8F2; + font-size: 90%; + color: #253555; + padding-bottom: 4px; + padding-top: 5px; + text-align:left; + font-weight: 400; + -moz-border-radius-topleft: 4px; + -moz-border-radius-topright: 4px; + -webkit-border-top-left-radius: 4px; + -webkit-border-top-right-radius: 4px; + border-top-left-radius: 4px; + border-top-right-radius: 4px; + border-bottom: 1px solid #A8B8D9; +} + + +.tabsearch { + top: 0px; + left: 10px; + height: 36px; + background-image: url('tab_b.png'); + z-index: 101; + overflow: hidden; + font-size: 13px; +} + +.navpath ul +{ + font-size: 11px; + background-image:url('tab_b.png'); + background-repeat:repeat-x; + background-position: 0 -5px; + height:30px; + line-height:30px; + color:#8AA0CC; + border:solid 1px #C2CDE4; + overflow:hidden; + margin:0px; + padding:0px; +} + +.navpath li +{ + list-style-type:none; + float:left; + padding-left:10px; + padding-right:15px; + background-image:url('bc_s.png'); + background-repeat:no-repeat; + background-position:right; + color:#364D7C; +} + +.navpath li.navelem a +{ + height:32px; + display:block; + text-decoration: none; + outline: none; + color: #283A5D; + font-family: 'Lucida Grande',Geneva,Helvetica,Arial,sans-serif; + text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); + text-decoration: none; +} + +.navpath li.navelem a:hover +{ + color:#6884BD; +} + +.navpath li.footer +{ + list-style-type:none; + float:right; + padding-left:10px; + padding-right:15px; + background-image:none; + background-repeat:no-repeat; + background-position:right; + color:#364D7C; + font-size: 8pt; +} + + +div.summary +{ + float: right; + font-size: 8pt; + padding-right: 5px; + width: 50%; + text-align: right; +} + +div.summary a +{ + white-space: nowrap; +} + +table.classindex +{ + margin: 10px; + white-space: nowrap; + margin-left: 3%; + margin-right: 3%; + width: 94%; + border: 0; + border-spacing: 0; + padding: 0; +} + +div.ingroups +{ + font-size: 8pt; + width: 50%; + text-align: left; +} + +div.ingroups a +{ + white-space: nowrap; +} + +div.header +{ + background-image:url('nav_h.png'); + background-repeat:repeat-x; + background-color: #F9FAFC; + margin: 0px; + border-bottom: 1px solid #C4CFE5; +} + +div.headertitle +{ + padding: 5px 5px 5px 10px; +} + +.PageDocRTL-title div.headertitle { + text-align: right; + direction: rtl; +} + +dl { + padding: 0 0 0 0; +} + +/* dl.note, dl.warning, dl.attention, dl.pre, dl.post, dl.invariant, dl.deprecated, dl.todo, dl.test, dl.bug, dl.examples */ +dl.section { + margin-left: 0px; + padding-left: 0px; +} + +dl.section.DocNodeRTL { + margin-right: 0px; + padding-right: 0px; +} + +dl.note { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #D0C000; +} + +dl.note.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #D0C000; +} + +dl.warning, dl.attention { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #FF0000; +} + +dl.warning.DocNodeRTL, dl.attention.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #FF0000; +} + +dl.pre, dl.post, dl.invariant { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #00D000; +} + +dl.pre.DocNodeRTL, dl.post.DocNodeRTL, dl.invariant.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #00D000; +} + +dl.deprecated { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #505050; +} + +dl.deprecated.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #505050; +} + +dl.todo { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #00C0E0; +} + +dl.todo.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #00C0E0; +} + +dl.test { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #3030E0; +} + +dl.test.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #3030E0; +} + +dl.bug { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #C08050; +} + +dl.bug.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #C08050; +} + +dl.section dd { + margin-bottom: 6px; +} + + +#projectrow +{ + height: 56px; +} + +#projectlogo +{ + text-align: center; + vertical-align: bottom; + border-collapse: separate; +} + +#projectlogo img +{ + border: 0px none; +} + +#projectalign +{ + vertical-align: middle; + padding-left: 0.5em; +} + +#projectname +{ + font: 200% Tahoma, Arial,sans-serif; + margin: 0px; + padding: 2px 0px; +} + +#projectbrief +{ + font: 90% Tahoma, Arial,sans-serif; + margin: 0px; + padding: 0px; +} + +#projectnumber +{ + font: 50% Tahoma, Arial,sans-serif; + margin: 0px; + padding: 0px; +} + +#titlearea +{ + padding: 0px; + margin: 0px; + width: 100%; + border-bottom: 1px solid #5373B4; +} + +.image +{ + text-align: center; +} + +.dotgraph +{ + text-align: center; +} + +.mscgraph +{ + text-align: center; +} + +.plantumlgraph +{ + text-align: center; +} + +.diagraph +{ + text-align: center; +} + +.caption +{ + font-weight: bold; +} + +div.zoom +{ + border: 1px solid #90A5CE; +} + +dl.citelist { + margin-bottom:50px; +} + +dl.citelist dt { + color:#334975; + float:left; + font-weight:bold; + margin-right:10px; + padding:5px; + text-align:right; + width:52px; +} + +dl.citelist dd { + margin:2px 0 2px 72px; + padding:5px 0; +} + +div.toc { + padding: 14px 25px; + background-color: #F4F6FA; + border: 1px solid #D8DFEE; + border-radius: 7px 7px 7px 7px; + float: right; + height: auto; + margin: 0 8px 10px 10px; + width: 200px; +} + +.PageDocRTL-title div.toc { + float: left !important; + text-align: right; +} + +div.toc li { + background: url("bdwn.png") no-repeat scroll 0 5px transparent; + font: 10px/1.2 Verdana,DejaVu Sans,Geneva,sans-serif; + margin-top: 5px; + padding-left: 10px; + padding-top: 2px; +} + +.PageDocRTL-title div.toc li { + background-position-x: right !important; + padding-left: 0 !important; + padding-right: 10px; +} + +div.toc h3 { + font: bold 12px/1.2 Arial,FreeSans,sans-serif; + color: #4665A2; + border-bottom: 0 none; + margin: 0; +} + +div.toc ul { + list-style: none outside none; + border: medium none; + padding: 0px; +} + +div.toc li.level1 { + margin-left: 0px; +} + +div.toc li.level2 { + margin-left: 15px; +} + +div.toc li.level3 { + margin-left: 30px; +} + +div.toc li.level4 { + margin-left: 45px; +} + +span.emoji { + /* font family used at the site: https://unicode.org/emoji/charts/full-emoji-list.html + * font-family: "Noto Color Emoji", "Apple Color Emoji", "Segoe UI Emoji", Times, Symbola, Aegyptus, Code2000, Code2001, Code2002, Musica, serif, LastResort; + */ +} + +span.obfuscator { + display: none; +} + +.PageDocRTL-title div.toc li.level1 { + margin-left: 0 !important; + margin-right: 0; +} + +.PageDocRTL-title div.toc li.level2 { + margin-left: 0 !important; + margin-right: 15px; +} + +.PageDocRTL-title div.toc li.level3 { + margin-left: 0 !important; + margin-right: 30px; +} + +.PageDocRTL-title div.toc li.level4 { + margin-left: 0 !important; + margin-right: 45px; +} + +.inherit_header { + font-weight: bold; + color: gray; + cursor: pointer; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +.inherit_header td { + padding: 6px 0px 2px 5px; +} + +.inherit { + display: none; +} + +tr.heading h2 { + margin-top: 12px; + margin-bottom: 4px; +} + +/* tooltip related style info */ + +.ttc { + position: absolute; + display: none; +} + +#powerTip { + cursor: default; + /*white-space: nowrap;*/ + background-color: white; + border: 1px solid gray; + border-radius: 4px 4px 4px 4px; + box-shadow: 1px 1px 7px gray; + display: none; + font-size: smaller; + max-width: 80%; + opacity: 0.9; + padding: 1ex 1em 1em; + position: absolute; + z-index: 2147483647; +} + +#powerTip div.ttdoc { + color: grey; + font-style: italic; +} + +#powerTip div.ttname a { + font-weight: bold; +} + +#powerTip div.ttname { + font-weight: bold; +} + +#powerTip div.ttdeci { + color: #006318; +} + +#powerTip div { + margin: 0px; + padding: 0px; + font: 12px/16px Roboto,sans-serif; +} + +#powerTip:before, #powerTip:after { + content: ""; + position: absolute; + margin: 0px; +} + +#powerTip.n:after, #powerTip.n:before, +#powerTip.s:after, #powerTip.s:before, +#powerTip.w:after, #powerTip.w:before, +#powerTip.e:after, #powerTip.e:before, +#powerTip.ne:after, #powerTip.ne:before, +#powerTip.se:after, #powerTip.se:before, +#powerTip.nw:after, #powerTip.nw:before, +#powerTip.sw:after, #powerTip.sw:before { + border: solid transparent; + content: " "; + height: 0; + width: 0; + position: absolute; +} + +#powerTip.n:after, #powerTip.s:after, +#powerTip.w:after, #powerTip.e:after, +#powerTip.nw:after, #powerTip.ne:after, +#powerTip.sw:after, #powerTip.se:after { + border-color: rgba(255, 255, 255, 0); +} + +#powerTip.n:before, #powerTip.s:before, +#powerTip.w:before, #powerTip.e:before, +#powerTip.nw:before, #powerTip.ne:before, +#powerTip.sw:before, #powerTip.se:before { + border-color: rgba(128, 128, 128, 0); +} + +#powerTip.n:after, #powerTip.n:before, +#powerTip.ne:after, #powerTip.ne:before, +#powerTip.nw:after, #powerTip.nw:before { + top: 100%; +} + +#powerTip.n:after, #powerTip.ne:after, #powerTip.nw:after { + border-top-color: #FFFFFF; + border-width: 10px; + margin: 0px -10px; +} +#powerTip.n:before { + border-top-color: #808080; + border-width: 11px; + margin: 0px -11px; +} +#powerTip.n:after, #powerTip.n:before { + left: 50%; +} + +#powerTip.nw:after, #powerTip.nw:before { + right: 14px; +} + +#powerTip.ne:after, #powerTip.ne:before { + left: 14px; +} + +#powerTip.s:after, #powerTip.s:before, +#powerTip.se:after, #powerTip.se:before, +#powerTip.sw:after, #powerTip.sw:before { + bottom: 100%; +} + +#powerTip.s:after, #powerTip.se:after, #powerTip.sw:after { + border-bottom-color: #FFFFFF; + border-width: 10px; + margin: 0px -10px; +} + +#powerTip.s:before, #powerTip.se:before, #powerTip.sw:before { + border-bottom-color: #808080; + border-width: 11px; + margin: 0px -11px; +} + +#powerTip.s:after, #powerTip.s:before { + left: 50%; +} + +#powerTip.sw:after, #powerTip.sw:before { + right: 14px; +} + +#powerTip.se:after, #powerTip.se:before { + left: 14px; +} + +#powerTip.e:after, #powerTip.e:before { + left: 100%; +} +#powerTip.e:after { + border-left-color: #FFFFFF; + border-width: 10px; + top: 50%; + margin-top: -10px; +} +#powerTip.e:before { + border-left-color: #808080; + border-width: 11px; + top: 50%; + margin-top: -11px; +} + +#powerTip.w:after, #powerTip.w:before { + right: 100%; +} +#powerTip.w:after { + border-right-color: #FFFFFF; + border-width: 10px; + top: 50%; + margin-top: -10px; +} +#powerTip.w:before { + border-right-color: #808080; + border-width: 11px; + top: 50%; + margin-top: -11px; +} + +@media print +{ + #top { display: none; } + #side-nav { display: none; } + #nav-path { display: none; } + body { overflow:visible; } + h1, h2, h3, h4, h5, h6 { page-break-after: avoid; } + .summary { display: none; } + .memitem { page-break-inside: avoid; } + #doc-content + { + margin-left:0 !important; + height:auto !important; + width:auto !important; + overflow:inherit; + display:inline; + } +} + +/* @group Markdown */ + +table.markdownTable { + border-collapse:collapse; + margin-top: 4px; + margin-bottom: 4px; +} + +table.markdownTable td, table.markdownTable th { + border: 1px solid #2D4068; + padding: 3px 7px 2px; +} + +table.markdownTable tr { +} + +th.markdownTableHeadLeft, th.markdownTableHeadRight, th.markdownTableHeadCenter, th.markdownTableHeadNone { + background-color: #374F7F; + color: #FFFFFF; + font-size: 110%; + padding-bottom: 4px; + padding-top: 5px; +} + +th.markdownTableHeadLeft, td.markdownTableBodyLeft { + text-align: left +} + +th.markdownTableHeadRight, td.markdownTableBodyRight { + text-align: right +} + +th.markdownTableHeadCenter, td.markdownTableBodyCenter { + text-align: center +} + +.DocNodeRTL { + text-align: right; + direction: rtl; +} + +.DocNodeLTR { + text-align: left; + direction: ltr; +} + +table.DocNodeRTL { + width: auto; + margin-right: 0; + margin-left: auto; +} + +table.DocNodeLTR { + width: auto; + margin-right: auto; + margin-left: 0; +} + +code.JavaDocCode { + direction:ltr; +} + +tt, code, kbd, samp +{ + display: inline-block; + direction:ltr; +} +/* @end */ + +u { + text-decoration: underline; +} + diff --git a/docs/html/doxygen.svg b/docs/html/doxygen.svg new file mode 100644 index 0000000..d42dad5 --- /dev/null +++ b/docs/html/doxygen.svg @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/html/dynsections.js b/docs/html/dynsections.js new file mode 100644 index 0000000..3174bd7 --- /dev/null +++ b/docs/html/dynsections.js @@ -0,0 +1,121 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file + */ +function toggleVisibility(linkObj) +{ + var base = $(linkObj).attr('id'); + var summary = $('#'+base+'-summary'); + var content = $('#'+base+'-content'); + var trigger = $('#'+base+'-trigger'); + var src=$(trigger).attr('src'); + if (content.is(':visible')===true) { + content.hide(); + summary.show(); + $(linkObj).addClass('closed').removeClass('opened'); + $(trigger).attr('src',src.substring(0,src.length-8)+'closed.png'); + } else { + content.show(); + summary.hide(); + $(linkObj).removeClass('closed').addClass('opened'); + $(trigger).attr('src',src.substring(0,src.length-10)+'open.png'); + } + return false; +} + +function updateStripes() +{ + $('table.directory tr'). + removeClass('even').filter(':visible:even').addClass('even'); +} + +function toggleLevel(level) +{ + $('table.directory tr').each(function() { + var l = this.id.split('_').length-1; + var i = $('#img'+this.id.substring(3)); + var a = $('#arr'+this.id.substring(3)); + if (l + + + + + + + + + + + + + + + + + +penify-cli: /tmp/github_reposRepoArchDocGenContext/Penify-dev/penify-cli/docs/example-workflows.md File Reference + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
penify-cli +
+
+
+ + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
/tmp/github_reposRepoArchDocGenContext/Penify-dev/penify-cli/docs/example-workflows.md File Reference
+
+
+
+
+ + + + + diff --git a/docs/html/file__analyzer_8py.html b/docs/html/file__analyzer_8py.html new file mode 100644 index 0000000..3919693 --- /dev/null +++ b/docs/html/file__analyzer_8py.html @@ -0,0 +1,152 @@ + + + + + + + + + + + + + + + + + + +penify-cli: /tmp/github_reposRepoArchDocGenContext/Penify-dev/penify-cli/penify_hook/file_analyzer.py File Reference + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
penify-cli +
+
+
+ + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+ +
file_analyzer.py File Reference
+
+
+ + + + +

+Classes

class  penify_hook.file_analyzer.FileAnalyzerGenHook
 
+ + + + + +

+Namespaces

namespace  penify_hook
 
namespace  penify_hook.file_analyzer
 
+ + + +

+Variables

 penify_hook.file_analyzer.logger = logging.getLogger(__name__)
 
+
+
+ + + + + diff --git a/docs/html/file__analyzer_8py.js b/docs/html/file__analyzer_8py.js new file mode 100644 index 0000000..a650b8a --- /dev/null +++ b/docs/html/file__analyzer_8py.js @@ -0,0 +1,5 @@ +var file__analyzer_8py = +[ + [ "penify_hook.file_analyzer.FileAnalyzerGenHook", "classpenify__hook_1_1file__analyzer_1_1FileAnalyzerGenHook.html", "classpenify__hook_1_1file__analyzer_1_1FileAnalyzerGenHook" ], + [ "logger", "file__analyzer_8py.html#af419a4965f079d58cac5a5281ddb1828", null ] +]; \ No newline at end of file diff --git a/docs/html/files.html b/docs/html/files.html new file mode 100644 index 0000000..b80e1fa --- /dev/null +++ b/docs/html/files.html @@ -0,0 +1,166 @@ + + + + + + + + + + + + + + + + + + +penify-cli: File List + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
penify-cli +
+
+
+ + + + + + +
+
+ +
+
+
+ + + + + + + diff --git a/docs/html/files_dup.js b/docs/html/files_dup.js new file mode 100644 index 0000000..dd5a1a9 --- /dev/null +++ b/docs/html/files_dup.js @@ -0,0 +1,4 @@ +var files_dup = +[ + [ "penify-cli", "dir_b3b22d2ab7966b65f6b237e3231b41be.html", "dir_b3b22d2ab7966b65f6b237e3231b41be" ] +]; \ No newline at end of file diff --git a/docs/html/folder__analyzer_8py.html b/docs/html/folder__analyzer_8py.html new file mode 100644 index 0000000..91313d7 --- /dev/null +++ b/docs/html/folder__analyzer_8py.html @@ -0,0 +1,146 @@ + + + + + + + + + + + + + + + + + + +penify-cli: /tmp/github_reposRepoArchDocGenContext/Penify-dev/penify-cli/penify_hook/folder_analyzer.py File Reference + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
penify-cli +
+
+
+ + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+ +
folder_analyzer.py File Reference
+
+
+ + + + +

+Classes

class  penify_hook.folder_analyzer.FolderAnalyzerGenHook
 
+ + + + + +

+Namespaces

namespace  penify_hook
 
namespace  penify_hook.folder_analyzer
 
+
+
+ + + + + diff --git a/docs/html/folder__analyzer_8py.js b/docs/html/folder__analyzer_8py.js new file mode 100644 index 0000000..f51e8e5 --- /dev/null +++ b/docs/html/folder__analyzer_8py.js @@ -0,0 +1,4 @@ +var folder__analyzer_8py = +[ + [ "penify_hook.folder_analyzer.FolderAnalyzerGenHook", "classpenify__hook_1_1folder__analyzer_1_1FolderAnalyzerGenHook.html", "classpenify__hook_1_1folder__analyzer_1_1FolderAnalyzerGenHook" ] +]; \ No newline at end of file diff --git a/docs/html/folderclosed.png b/docs/html/folderclosed.png new file mode 100644 index 0000000000000000000000000000000000000000..bb8ab35edce8e97554e360005ee9fc5bffb36e66 GIT binary patch literal 616 zcmV-u0+;=XP)a9#ETzayK)T~Jw&MMH>OIr#&;dC}is*2Mqdf&akCc=O@`qC+4i z5Iu3w#1M@KqXCz8TIZd1wli&kkl2HVcAiZ8PUn5z_kG@-y;?yK06=cA0U%H0PH+kU zl6dp}OR(|r8-RG+YLu`zbI}5TlOU6ToR41{9=uz^?dGTNL;wIMf|V3`d1Wj3y!#6` zBLZ?xpKR~^2x}?~zA(_NUu3IaDB$tKma*XUdOZN~c=dLt_h_k!dbxm_*ibDM zlFX`g{k$X}yIe%$N)cn1LNu=q9_CS)*>A zsX_mM4L@`(cSNQKMFc$RtYbx{79#j-J7hk*>*+ZZhM4Hw?I?rsXCi#mRWJ=-0LGV5a-WR0Qgt<|Nqf)C-@80`5gIz45^_20000IqP)X=#(TiCT&PiIIVc55T}TU}EUh*{q$|`3@{d>{Tc9Bo>e= zfmF3!f>fbI9#GoEHh0f`i5)wkLpva0ztf%HpZneK?w-7AK@b4Itw{y|Zd3k!fH?q2 zlhckHd_V2M_X7+)U&_Xcfvtw60l;--DgZmLSw-Y?S>)zIqMyJ1#FwLU*%bl38ok+! zh78H87n`ZTS;uhzAR$M`zZ`bVhq=+%u9^$5jDplgxd44}9;IRqUH1YHH|@6oFe%z( zo4)_>E$F&^P-f(#)>(TrnbE>Pefs9~@iN=|)Rz|V`sGfHNrJ)0gJb8xx+SBmRf@1l zvuzt=vGfI)<-F9!o&3l?>9~0QbUDT(wFdnQPv%xdD)m*g%!20>Bc9iYmGAp<9YAa( z0QgYgTWqf1qN++Gqp z8@AYPTB3E|6s=WLG?xw0tm|U!o=&zd+H0oRYE;Dbx+Na9s^STqX|Gnq%H8s(nGDGJ j8vwW|`Ts`)fSK|Kx=IK@RG@g200000NkvXXu0mjfauFEA literal 0 HcmV?d00001 diff --git a/docs/html/functions.html b/docs/html/functions.html new file mode 100644 index 0000000..e76e75c --- /dev/null +++ b/docs/html/functions.html @@ -0,0 +1,261 @@ + + + + + + + + + + + + + + + + + + +penify-cli: Class Members + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
penify-cli +
+
+
+ + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
Here is a list of all class members with links to the classes they belong to:
+ +

- _ -

+ + +

- a -

+ + +

- b -

+ + +

- d -

+ + +

- e -

+ + +

- f -

+ + +

- g -

+ + +

- i -

+ + +

- j -

+ + +

- l -

+ + +

- m -

+ + +

- p -

+ + +

- r -

+ + +

- s -

+ + +

- t -

+ + +

- u -

+
+
+ + + + + diff --git a/docs/html/functions_func.html b/docs/html/functions_func.html new file mode 100644 index 0000000..66ec0c1 --- /dev/null +++ b/docs/html/functions_func.html @@ -0,0 +1,230 @@ + + + + + + + + + + + + + + + + + + +penify-cli: Class Members - Functions + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
penify-cli +
+
+
+ + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+  + +

- _ -

+ + +

- a -

+ + +

- e -

+ + +

- f -

+ + +

- g -

+ + +

- i -

+ + +

- l -

+ + +

- m -

+ + +

- p -

+ + +

- r -

+ + +

- s -

+ + +

- t -

+ + +

- u -

+
+
+ + + + + diff --git a/docs/html/functions_vars.html b/docs/html/functions_vars.html new file mode 100644 index 0000000..7562110 --- /dev/null +++ b/docs/html/functions_vars.html @@ -0,0 +1,147 @@ + + + + + + + + + + + + + + + + + + +penify-cli: Class Members - Variables + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
penify-cli +
+
+
+ + + + + + +
+
+ +
+
+
+ + + + + + + diff --git a/docs/html/git__analyzer_8py.html b/docs/html/git__analyzer_8py.html new file mode 100644 index 0000000..d40bd0b --- /dev/null +++ b/docs/html/git__analyzer_8py.html @@ -0,0 +1,152 @@ + + + + + + + + + + + + + + + + + + +penify-cli: /tmp/github_reposRepoArchDocGenContext/Penify-dev/penify-cli/penify_hook/git_analyzer.py File Reference + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
penify-cli +
+
+
+ + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+ +
git_analyzer.py File Reference
+
+
+ + + + +

+Classes

class  penify_hook.git_analyzer.GitDocGenHook
 
+ + + + + +

+Namespaces

namespace  penify_hook
 
namespace  penify_hook.git_analyzer
 
+ + + +

+Variables

 penify_hook.git_analyzer.logger = logging.getLogger(__name__)
 
+
+
+ + + + + diff --git a/docs/html/git__analyzer_8py.js b/docs/html/git__analyzer_8py.js new file mode 100644 index 0000000..f8197a4 --- /dev/null +++ b/docs/html/git__analyzer_8py.js @@ -0,0 +1,5 @@ +var git__analyzer_8py = +[ + [ "penify_hook.git_analyzer.GitDocGenHook", "classpenify__hook_1_1git__analyzer_1_1GitDocGenHook.html", "classpenify__hook_1_1git__analyzer_1_1GitDocGenHook" ], + [ "logger", "git__analyzer_8py.html#ac4ce143fdca789a79c66852c37d7363a", null ] +]; \ No newline at end of file diff --git a/docs/html/graph_legend.html b/docs/html/graph_legend.html new file mode 100644 index 0000000..6b68c3d --- /dev/null +++ b/docs/html/graph_legend.html @@ -0,0 +1,189 @@ + + + + + + + + + + + + + + + + + + +penify-cli: Graph Legend + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
penify-cli +
+
+
+ + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
Graph Legend
+
+
+

This page explains how to interpret the graphs that are generated by doxygen.

+

Consider the following example:

/*! Invisible class because of truncation */
+
class Invisible { };
+
+
/*! Truncated class, inheritance relation is hidden */
+
class Truncated : public Invisible { };
+
+
/* Class not documented with doxygen comments */
+
class Undocumented { };
+
+
/*! Class that is inherited using public inheritance */
+
class PublicBase : public Truncated { };
+
+
/*! A template class */
+
template<class T> class Templ { };
+
+
/*! Class that is inherited using protected inheritance */
+
class ProtectedBase { };
+
+
/*! Class that is inherited using private inheritance */
+
class PrivateBase { };
+
+
/*! Class that is used by the Inherited class */
+
class Used { };
+
+
/*! Super class that inherits a number of other classes */
+
class Inherited : public PublicBase,
+
protected ProtectedBase,
+
private PrivateBase,
+
public Undocumented,
+
public Templ<int>
+
{
+
private:
+
Used *m_usedClass;
+
};
+

This will result in the following graph:

+

The boxes in the above graph have the following meaning:

+
    +
  • +A filled gray box represents the struct or class for which the graph is generated.
  • +
  • +A box with a black border denotes a documented struct or class.
  • +
  • +A box with a gray border denotes an undocumented struct or class.
  • +
  • +A box with a red border denotes a documented struct or class forwhich not all inheritance/containment relations are shown. A graph is truncated if it does not fit within the specified boundaries.
  • +
+

The arrows have the following meaning:

+
    +
  • +A dark blue arrow is used to visualize a public inheritance relation between two classes.
  • +
  • +A dark green arrow is used for protected inheritance.
  • +
  • +A dark red arrow is used for private inheritance.
  • +
  • +A purple dashed arrow is used if a class is contained or used by another class. The arrow is labelled with the variable(s) through which the pointed class or struct is accessible.
  • +
  • +A yellow dashed arrow denotes a relation between a template instance and the template class it was instantiated from. The arrow is labelled with the template parameters of the instance.
  • +
+
+
+ + + + + diff --git a/docs/html/graph_legend.md5 b/docs/html/graph_legend.md5 new file mode 100644 index 0000000..5543aee --- /dev/null +++ b/docs/html/graph_legend.md5 @@ -0,0 +1 @@ +2949d8d683b49299ad5e82dbf5d1be6c \ No newline at end of file diff --git a/docs/html/graph_legend.svg b/docs/html/graph_legend.svg new file mode 100644 index 0000000..5c7a71a --- /dev/null +++ b/docs/html/graph_legend.svg @@ -0,0 +1,117 @@ + + + + + + +Graph Legend + + + +Node9 + +Inherited + + + +Node10 + +PublicBase + + + +Node10->Node9 + + + + + +Node11 + +Truncated + + + +Node11->Node10 + + + + + +Node13 + +ProtectedBase + + + +Node13->Node9 + + + + + +Node14 + +PrivateBase + + + +Node14->Node9 + + + + + +Node15 + +Undocumented + + + +Node15->Node9 + + + + + +Node16 + +Templ< int > + + + +Node16->Node9 + + + + + +Node17 + +Templ< T > + + + +Node17->Node16 + + +< int > + + + +Node18 + +Used + + + +Node18->Node9 + + +m_usedClass + + + diff --git a/docs/html/hierarchy.html b/docs/html/hierarchy.html new file mode 100644 index 0000000..5652a89 --- /dev/null +++ b/docs/html/hierarchy.html @@ -0,0 +1,148 @@ + + + + + + + + + + + + + + + + + + +penify-cli: Class Hierarchy + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
penify-cli +
+
+
+ + + + + + +
+
+ +
+
+
+ + + + + + + diff --git a/docs/html/hierarchy.js b/docs/html/hierarchy.js new file mode 100644 index 0000000..6af7a4f --- /dev/null +++ b/docs/html/hierarchy.js @@ -0,0 +1,18 @@ +var hierarchy = +[ + [ "penify_hook.api_client.APIClient", "classpenify__hook_1_1api__client_1_1APIClient.html", null ], + [ "penify_hook.base_analyzer.BaseAnalyzer", "classpenify__hook_1_1base__analyzer_1_1BaseAnalyzer.html", [ + [ "penify_hook.commit_analyzer.CommitDocGenHook", "classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook.html", null ], + [ "penify_hook.file_analyzer.FileAnalyzerGenHook", "classpenify__hook_1_1file__analyzer_1_1FileAnalyzerGenHook.html", null ], + [ "penify_hook.folder_analyzer.FolderAnalyzerGenHook", "classpenify__hook_1_1folder__analyzer_1_1FolderAnalyzerGenHook.html", null ], + [ "penify_hook.git_analyzer.GitDocGenHook", "classpenify__hook_1_1git__analyzer_1_1GitDocGenHook.html", null ] + ] ], + [ "Exception", "classException.html", [ + [ "penify_hook.utils.GitRepoNotFoundError", "classpenify__hook_1_1utils_1_1GitRepoNotFoundError.html", null ] + ] ], + [ "penify_hook.jira_client.JiraClient", "classpenify__hook_1_1jira__client_1_1JiraClient.html", null ], + [ "penify_hook.llm_client.LLMClient", "classpenify__hook_1_1llm__client_1_1LLMClient.html", null ], + [ "tests.test_commit_commands.TestCommitCommands", "classtests_1_1test__commit__commands_1_1TestCommitCommands.html", null ], + [ "tests.test_config_commands.TestConfigCommands", "classtests_1_1test__config__commands_1_1TestConfigCommands.html", null ], + [ "tests.test_web_config.TestWebConfig", "classtests_1_1test__web__config_1_1TestWebConfig.html", null ] +]; \ No newline at end of file diff --git a/docs/html/hook__commands_8py.html b/docs/html/hook__commands_8py.html new file mode 100644 index 0000000..765f70a --- /dev/null +++ b/docs/html/hook__commands_8py.html @@ -0,0 +1,158 @@ + + + + + + + + + + + + + + + + + + +penify-cli: /tmp/github_reposRepoArchDocGenContext/Penify-dev/penify-cli/penify_hook/commands/hook_commands.py File Reference + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
penify-cli +
+
+
+ + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+ +
hook_commands.py File Reference
+
+
+ + + + + + + + +

+Namespaces

namespace  penify_hook
 
namespace  penify_hook.commands
 
namespace  penify_hook.commands.hook_commands
 
+ + + + + +

+Functions

def penify_hook.commands.hook_commands.install_git_hook (location, token)
 
def penify_hook.commands.hook_commands.uninstall_git_hook (location)
 
+ + + + + +

+Variables

string penify_hook.commands.hook_commands.HOOK_FILENAME = "post-commit"
 
string penify_hook.commands.hook_commands.HOOK_TEMPLATE
 
+
+
+ + + + + diff --git a/docs/html/hook__commands_8py.js b/docs/html/hook__commands_8py.js new file mode 100644 index 0000000..7868841 --- /dev/null +++ b/docs/html/hook__commands_8py.js @@ -0,0 +1,7 @@ +var hook__commands_8py = +[ + [ "install_git_hook", "hook__commands_8py.html#adff8f5d3bf1c3795974a391ee95b72b2", null ], + [ "uninstall_git_hook", "hook__commands_8py.html#a81543eb5fa835fd1237f24e8bce6201d", null ], + [ "HOOK_FILENAME", "hook__commands_8py.html#ae82fd46e5a9219da1478b0476b8214b1", null ], + [ "HOOK_TEMPLATE", "hook__commands_8py.html#a6a45aad71c8d32ce11a6dff8cee8bee7", null ] +]; \ No newline at end of file diff --git a/docs/html/index.html b/docs/html/index.html new file mode 100644 index 0000000..5364245 --- /dev/null +++ b/docs/html/index.html @@ -0,0 +1,129 @@ + + + + + + + + + + + + + + + + + + +penify-cli: Main Page + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
penify-cli +
+
+
+ + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
penify-cli Documentation
+
+
+
+
+ + + + + diff --git a/docs/html/inherit_graph_0.map b/docs/html/inherit_graph_0.map new file mode 100644 index 0000000..4d4472c --- /dev/null +++ b/docs/html/inherit_graph_0.map @@ -0,0 +1,4 @@ + + + + diff --git a/docs/html/inherit_graph_0.md5 b/docs/html/inherit_graph_0.md5 new file mode 100644 index 0000000..927ae02 --- /dev/null +++ b/docs/html/inherit_graph_0.md5 @@ -0,0 +1 @@ +fbdbe5195fd7acea201510f0e9bb231e \ No newline at end of file diff --git a/docs/html/inherit_graph_0.svg b/docs/html/inherit_graph_0.svg new file mode 100644 index 0000000..af8bbff --- /dev/null +++ b/docs/html/inherit_graph_0.svg @@ -0,0 +1,38 @@ + + + + + + +Graphical Class Hierarchy + + + +Node0 + + +Exception + + + + + +Node1 + + +penify_hook.utils.GitRepo +NotFoundError + + + + + +Node0->Node1 + + + + + diff --git a/docs/html/inherit_graph_1.map b/docs/html/inherit_graph_1.map new file mode 100644 index 0000000..e29f764 --- /dev/null +++ b/docs/html/inherit_graph_1.map @@ -0,0 +1,3 @@ + + + diff --git a/docs/html/inherit_graph_1.md5 b/docs/html/inherit_graph_1.md5 new file mode 100644 index 0000000..ea3634a --- /dev/null +++ b/docs/html/inherit_graph_1.md5 @@ -0,0 +1 @@ +61b97d863a0d1fddd4dbd69906ebc213 \ No newline at end of file diff --git a/docs/html/inherit_graph_1.svg b/docs/html/inherit_graph_1.svg new file mode 100644 index 0000000..31bd0a8 --- /dev/null +++ b/docs/html/inherit_graph_1.svg @@ -0,0 +1,22 @@ + + + + + + +Graphical Class Hierarchy + + + +Node0 + + +penify_hook.api_client.APIClient + + + + + diff --git a/docs/html/inherit_graph_2.map b/docs/html/inherit_graph_2.map new file mode 100644 index 0000000..799bfbb --- /dev/null +++ b/docs/html/inherit_graph_2.map @@ -0,0 +1,7 @@ + + + + + + + diff --git a/docs/html/inherit_graph_2.md5 b/docs/html/inherit_graph_2.md5 new file mode 100644 index 0000000..4b44272 --- /dev/null +++ b/docs/html/inherit_graph_2.md5 @@ -0,0 +1 @@ +75e192bb568d3adda84eea21391817f9 \ No newline at end of file diff --git a/docs/html/inherit_graph_2.svg b/docs/html/inherit_graph_2.svg new file mode 100644 index 0000000..2677d68 --- /dev/null +++ b/docs/html/inherit_graph_2.svg @@ -0,0 +1,87 @@ + + + + + + +Graphical Class Hierarchy + + + +Node0 + + +penify_hook.base_analyzer. +BaseAnalyzer + + + + + +Node1 + + +penify_hook.commit +_analyzer.CommitDocGenHook + + + + + +Node0->Node1 + + + + + +Node2 + + +penify_hook.file_analyzer. +FileAnalyzerGenHook + + + + + +Node0->Node2 + + + + + +Node3 + + +penify_hook.folder +_analyzer.FolderAnalyzerGenHook + + + + + +Node0->Node3 + + + + + +Node4 + + +penify_hook.git_analyzer. +GitDocGenHook + + + + + +Node0->Node4 + + + + + diff --git a/docs/html/inherit_graph_3.map b/docs/html/inherit_graph_3.map new file mode 100644 index 0000000..697011d --- /dev/null +++ b/docs/html/inherit_graph_3.map @@ -0,0 +1,3 @@ + + + diff --git a/docs/html/inherit_graph_3.md5 b/docs/html/inherit_graph_3.md5 new file mode 100644 index 0000000..dc81dee --- /dev/null +++ b/docs/html/inherit_graph_3.md5 @@ -0,0 +1 @@ +fceca40b7ed3dc42e967f284c6fcc468 \ No newline at end of file diff --git a/docs/html/inherit_graph_3.svg b/docs/html/inherit_graph_3.svg new file mode 100644 index 0000000..8d32efa --- /dev/null +++ b/docs/html/inherit_graph_3.svg @@ -0,0 +1,23 @@ + + + + + + +Graphical Class Hierarchy + + + +Node0 + + +penify_hook.jira_client. +JiraClient + + + + + diff --git a/docs/html/inherit_graph_4.map b/docs/html/inherit_graph_4.map new file mode 100644 index 0000000..8833eec --- /dev/null +++ b/docs/html/inherit_graph_4.map @@ -0,0 +1,3 @@ + + + diff --git a/docs/html/inherit_graph_4.md5 b/docs/html/inherit_graph_4.md5 new file mode 100644 index 0000000..7b024dc --- /dev/null +++ b/docs/html/inherit_graph_4.md5 @@ -0,0 +1 @@ +78a208cc7ff8d5e3d76f7fe246474324 \ No newline at end of file diff --git a/docs/html/inherit_graph_4.svg b/docs/html/inherit_graph_4.svg new file mode 100644 index 0000000..f51c5c8 --- /dev/null +++ b/docs/html/inherit_graph_4.svg @@ -0,0 +1,22 @@ + + + + + + +Graphical Class Hierarchy + + + +Node0 + + +penify_hook.llm_client.LLMClient + + + + + diff --git a/docs/html/inherit_graph_5.map b/docs/html/inherit_graph_5.map new file mode 100644 index 0000000..340884d --- /dev/null +++ b/docs/html/inherit_graph_5.map @@ -0,0 +1,3 @@ + + + diff --git a/docs/html/inherit_graph_5.md5 b/docs/html/inherit_graph_5.md5 new file mode 100644 index 0000000..a572e33 --- /dev/null +++ b/docs/html/inherit_graph_5.md5 @@ -0,0 +1 @@ +07fe5f1877ad04afe232476f3697a187 \ No newline at end of file diff --git a/docs/html/inherit_graph_5.svg b/docs/html/inherit_graph_5.svg new file mode 100644 index 0000000..d1eb1ca --- /dev/null +++ b/docs/html/inherit_graph_5.svg @@ -0,0 +1,23 @@ + + + + + + +Graphical Class Hierarchy + + + +Node0 + + +tests.test_commit_commands. +TestCommitCommands + + + + + diff --git a/docs/html/inherit_graph_6.map b/docs/html/inherit_graph_6.map new file mode 100644 index 0000000..093c227 --- /dev/null +++ b/docs/html/inherit_graph_6.map @@ -0,0 +1,3 @@ + + + diff --git a/docs/html/inherit_graph_6.md5 b/docs/html/inherit_graph_6.md5 new file mode 100644 index 0000000..37adffc --- /dev/null +++ b/docs/html/inherit_graph_6.md5 @@ -0,0 +1 @@ +df59af5d6cbe4d3df1d1ec09b3fe3a88 \ No newline at end of file diff --git a/docs/html/inherit_graph_6.svg b/docs/html/inherit_graph_6.svg new file mode 100644 index 0000000..6156f4f --- /dev/null +++ b/docs/html/inherit_graph_6.svg @@ -0,0 +1,23 @@ + + + + + + +Graphical Class Hierarchy + + + +Node0 + + +tests.test_config_commands. +TestConfigCommands + + + + + diff --git a/docs/html/inherit_graph_7.map b/docs/html/inherit_graph_7.map new file mode 100644 index 0000000..f1fc41d --- /dev/null +++ b/docs/html/inherit_graph_7.map @@ -0,0 +1,3 @@ + + + diff --git a/docs/html/inherit_graph_7.md5 b/docs/html/inherit_graph_7.md5 new file mode 100644 index 0000000..474c162 --- /dev/null +++ b/docs/html/inherit_graph_7.md5 @@ -0,0 +1 @@ +0da5838f91ae0c3b8f7bfe23d4aad90f \ No newline at end of file diff --git a/docs/html/inherit_graph_7.svg b/docs/html/inherit_graph_7.svg new file mode 100644 index 0000000..a9bcadf --- /dev/null +++ b/docs/html/inherit_graph_7.svg @@ -0,0 +1,23 @@ + + + + + + +Graphical Class Hierarchy + + + +Node0 + + +tests.test_web_config.Test +WebConfig + + + + + diff --git a/docs/html/inherits.html b/docs/html/inherits.html new file mode 100644 index 0000000..d665463 --- /dev/null +++ b/docs/html/inherits.html @@ -0,0 +1,149 @@ + + + + + + + + + + + + + + + + + + +penify-cli: Class Hierarchy + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
penify-cli +
+
+
+ + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
Class Hierarchy
+
+
+ + + + + + + + + +
+
+
+
+
+
+
+
+
+
+
+ + + + + diff --git a/docs/html/jira__client_8py.html b/docs/html/jira__client_8py.html new file mode 100644 index 0000000..cab4af5 --- /dev/null +++ b/docs/html/jira__client_8py.html @@ -0,0 +1,152 @@ + + + + + + + + + + + + + + + + + + +penify-cli: /tmp/github_reposRepoArchDocGenContext/Penify-dev/penify-cli/penify_hook/jira_client.py File Reference + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
penify-cli +
+
+
+ + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+ +
jira_client.py File Reference
+
+
+ + + + +

+Classes

class  penify_hook.jira_client.JiraClient
 
+ + + + + +

+Namespaces

namespace  penify_hook
 
namespace  penify_hook.jira_client
 
+ + + +

+Variables

bool penify_hook.jira_client.JIRA_AVAILABLE = True
 
+
+
+ + + + + diff --git a/docs/html/jira__client_8py.js b/docs/html/jira__client_8py.js new file mode 100644 index 0000000..887fb38 --- /dev/null +++ b/docs/html/jira__client_8py.js @@ -0,0 +1,5 @@ +var jira__client_8py = +[ + [ "penify_hook.jira_client.JiraClient", "classpenify__hook_1_1jira__client_1_1JiraClient.html", "classpenify__hook_1_1jira__client_1_1JiraClient" ], + [ "JIRA_AVAILABLE", "jira__client_8py.html#a5593ea3415081eca1eea92e4c1ad1aa2", null ] +]; \ No newline at end of file diff --git a/docs/html/jquery.js b/docs/html/jquery.js new file mode 100644 index 0000000..c9ed3d9 --- /dev/null +++ b/docs/html/jquery.js @@ -0,0 +1,35 @@ +/*! jQuery v3.6.0 | (c) OpenJS Foundation and other contributors | jquery.org/license */ +!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(C,e){"use strict";var t=[],r=Object.getPrototypeOf,s=t.slice,g=t.flat?function(e){return t.flat.call(e)}:function(e){return t.concat.apply([],e)},u=t.push,i=t.indexOf,n={},o=n.toString,v=n.hasOwnProperty,a=v.toString,l=a.call(Object),y={},m=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType&&"function"!=typeof e.item},x=function(e){return null!=e&&e===e.window},E=C.document,c={type:!0,src:!0,nonce:!0,noModule:!0};function b(e,t,n){var r,i,o=(n=n||E).createElement("script");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function w(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[o.call(e)]||"object":typeof e}var f="3.6.0",S=function(e,t){return new S.fn.init(e,t)};function p(e){var t=!!e&&"length"in e&&e.length,n=w(e);return!m(e)&&!x(e)&&("array"===n||0===t||"number"==typeof t&&0+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp(F),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+F),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\([^\\r\\n\\f])","g"),ne=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(p.childNodes),p.childNodes),t[p.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!N[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&(U.test(t)||z.test(t))){(f=ee.test(t)&&ye(e.parentNode)||e)===e&&d.scope||((s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=S)),o=(l=h(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+xe(l[o]);c=l.join(",")}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){N(t,!0)}finally{s===S&&e.removeAttribute("id")}}}return g(t.replace($,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[S]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e&&e.namespaceURI,n=e&&(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:p;return r!=C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),p!=C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.scope=ce(function(e){return a.appendChild(e).appendChild(C.createElement("div")),"undefined"!=typeof e.querySelectorAll&&!e.querySelectorAll(":scope fieldset div").length}),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=S,!C.getElementsByName||!C.getElementsByName(S).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){var t;a.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+S+"-]").length||v.push("~="),(t=C.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||v.push("\\["+M+"*name"+M+"*="+M+"*(?:''|\"\")"),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+S+"+*").length||v.push(".#.+[+~]"),e.querySelectorAll("\\\f"),v.push("[\\r\\n\\f]")}),ce(function(e){e.innerHTML="";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",F)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},j=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e==C||e.ownerDocument==p&&y(p,e)?-1:t==C||t.ownerDocument==p&&y(p,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e==C?-1:t==C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]==p?-1:s[r]==p?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if(T(e),d.matchesSelector&&E&&!N[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){N(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=m[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&m(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function j(e,n,r){return m(n)?S.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?S.grep(e,function(e){return e===n!==r}):"string"!=typeof n?S.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(S.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||D,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:q.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof S?t[0]:t,S.merge(this,S.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),N.test(r[1])&&S.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(S):S.makeArray(e,this)}).prototype=S.fn,D=S(E);var L=/^(?:parents|prev(?:Until|All))/,H={children:!0,contents:!0,next:!0,prev:!0};function O(e,t){while((e=e[t])&&1!==e.nodeType);return e}S.fn.extend({has:function(e){var t=S(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i;ce=E.createDocumentFragment().appendChild(E.createElement("div")),(fe=E.createElement("input")).setAttribute("type","radio"),fe.setAttribute("checked","checked"),fe.setAttribute("name","t"),ce.appendChild(fe),y.checkClone=ce.cloneNode(!0).cloneNode(!0).lastChild.checked,ce.innerHTML="",y.noCloneChecked=!!ce.cloneNode(!0).lastChild.defaultValue,ce.innerHTML="",y.option=!!ce.lastChild;var ge={thead:[1,"","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};function ve(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?S.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;n",""]);var me=/<|&#?\w+;/;function xe(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d\s*$/g;function je(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&S(e).children("tbody")[0]||e}function De(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function qe(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Le(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(Y.hasData(e)&&(s=Y.get(e).events))for(i in Y.remove(t,"handle events"),s)for(n=0,r=s[i].length;n").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var _t,zt=[],Ut=/(=)\?(?=&|$)|\?\?/;S.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=zt.pop()||S.expando+"_"+wt.guid++;return this[e]=!0,e}}),S.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Ut.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Ut.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Ut,"$1"+r):!1!==e.jsonp&&(e.url+=(Tt.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||S.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?S(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,zt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((_t=E.implementation.createHTMLDocument("").body).innerHTML="
",2===_t.childNodes.length),S.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=N.exec(e))?[t.createElement(i[1])]:(i=xe([e],t,o),o&&o.length&&S(o).remove(),S.merge([],i.childNodes)));var r,i,o},S.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(S.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},S.expr.pseudos.animated=function(t){return S.grep(S.timers,function(e){return t===e.elem}).length},S.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=S.css(e,"position"),c=S(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=S.css(e,"top"),u=S.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,S.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},S.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){S.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===S.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===S.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=S(e).offset()).top+=S.css(e,"borderTopWidth",!0),i.left+=S.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-S.css(r,"marginTop",!0),left:t.left-i.left-S.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===S.css(e,"position"))e=e.offsetParent;return e||re})}}),S.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;S.fn[t]=function(e){return $(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),S.each(["top","left"],function(e,n){S.cssHooks[n]=Fe(y.pixelPosition,function(e,t){if(t)return t=We(e,n),Pe.test(t)?S(e).position()[n]+"px":t})}),S.each({Height:"height",Width:"width"},function(a,s){S.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){S.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return $(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?S.css(e,t,i):S.style(e,t,n,i)},s,n?e:void 0,n)}})}),S.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){S.fn[t]=function(e){return this.on(t,e)}}),S.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),S.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){S.fn[n]=function(e,t){return 0a;a++)for(i in o[a])n=o[a][i],o[a].hasOwnProperty(i)&&void 0!==n&&(e[i]=t.isPlainObject(n)?t.isPlainObject(e[i])?t.widget.extend({},e[i],n):t.widget.extend({},n):n);return e},t.widget.bridge=function(e,i){var n=i.prototype.widgetFullName||e;t.fn[e]=function(o){var a="string"==typeof o,r=s.call(arguments,1),h=this;return a?this.length||"instance"!==o?this.each(function(){var i,s=t.data(this,n);return"instance"===o?(h=s,!1):s?t.isFunction(s[o])&&"_"!==o.charAt(0)?(i=s[o].apply(s,r),i!==s&&void 0!==i?(h=i&&i.jquery?h.pushStack(i.get()):i,!1):void 0):t.error("no such method '"+o+"' for "+e+" widget instance"):t.error("cannot call methods on "+e+" prior to initialization; "+"attempted to call method '"+o+"'")}):h=void 0:(r.length&&(o=t.widget.extend.apply(null,[o].concat(r))),this.each(function(){var e=t.data(this,n);e?(e.option(o||{}),e._init&&e._init()):t.data(this,n,new i(o,this))})),h}},t.Widget=function(){},t.Widget._childConstructors=[],t.Widget.prototype={widgetName:"widget",widgetEventPrefix:"",defaultElement:"
",options:{classes:{},disabled:!1,create:null},_createWidget:function(e,s){s=t(s||this.defaultElement||this)[0],this.element=t(s),this.uuid=i++,this.eventNamespace="."+this.widgetName+this.uuid,this.bindings=t(),this.hoverable=t(),this.focusable=t(),this.classesElementLookup={},s!==this&&(t.data(s,this.widgetFullName,this),this._on(!0,this.element,{remove:function(t){t.target===s&&this.destroy()}}),this.document=t(s.style?s.ownerDocument:s.document||s),this.window=t(this.document[0].defaultView||this.document[0].parentWindow)),this.options=t.widget.extend({},this.options,this._getCreateOptions(),e),this._create(),this.options.disabled&&this._setOptionDisabled(this.options.disabled),this._trigger("create",null,this._getCreateEventData()),this._init()},_getCreateOptions:function(){return{}},_getCreateEventData:t.noop,_create:t.noop,_init:t.noop,destroy:function(){var e=this;this._destroy(),t.each(this.classesElementLookup,function(t,i){e._removeClass(i,t)}),this.element.off(this.eventNamespace).removeData(this.widgetFullName),this.widget().off(this.eventNamespace).removeAttr("aria-disabled"),this.bindings.off(this.eventNamespace)},_destroy:t.noop,widget:function(){return this.element},option:function(e,i){var s,n,o,a=e;if(0===arguments.length)return t.widget.extend({},this.options);if("string"==typeof e)if(a={},s=e.split("."),e=s.shift(),s.length){for(n=a[e]=t.widget.extend({},this.options[e]),o=0;s.length-1>o;o++)n[s[o]]=n[s[o]]||{},n=n[s[o]];if(e=s.pop(),1===arguments.length)return void 0===n[e]?null:n[e];n[e]=i}else{if(1===arguments.length)return void 0===this.options[e]?null:this.options[e];a[e]=i}return this._setOptions(a),this},_setOptions:function(t){var e;for(e in t)this._setOption(e,t[e]);return this},_setOption:function(t,e){return"classes"===t&&this._setOptionClasses(e),this.options[t]=e,"disabled"===t&&this._setOptionDisabled(e),this},_setOptionClasses:function(e){var i,s,n;for(i in e)n=this.classesElementLookup[i],e[i]!==this.options.classes[i]&&n&&n.length&&(s=t(n.get()),this._removeClass(n,i),s.addClass(this._classes({element:s,keys:i,classes:e,add:!0})))},_setOptionDisabled:function(t){this._toggleClass(this.widget(),this.widgetFullName+"-disabled",null,!!t),t&&(this._removeClass(this.hoverable,null,"ui-state-hover"),this._removeClass(this.focusable,null,"ui-state-focus"))},enable:function(){return this._setOptions({disabled:!1})},disable:function(){return this._setOptions({disabled:!0})},_classes:function(e){function i(i,o){var a,r;for(r=0;i.length>r;r++)a=n.classesElementLookup[i[r]]||t(),a=e.add?t(t.unique(a.get().concat(e.element.get()))):t(a.not(e.element).get()),n.classesElementLookup[i[r]]=a,s.push(i[r]),o&&e.classes[i[r]]&&s.push(e.classes[i[r]])}var s=[],n=this;return e=t.extend({element:this.element,classes:this.options.classes||{}},e),this._on(e.element,{remove:"_untrackClassesElement"}),e.keys&&i(e.keys.match(/\S+/g)||[],!0),e.extra&&i(e.extra.match(/\S+/g)||[]),s.join(" ")},_untrackClassesElement:function(e){var i=this;t.each(i.classesElementLookup,function(s,n){-1!==t.inArray(e.target,n)&&(i.classesElementLookup[s]=t(n.not(e.target).get()))})},_removeClass:function(t,e,i){return this._toggleClass(t,e,i,!1)},_addClass:function(t,e,i){return this._toggleClass(t,e,i,!0)},_toggleClass:function(t,e,i,s){s="boolean"==typeof s?s:i;var n="string"==typeof t||null===t,o={extra:n?e:i,keys:n?t:e,element:n?this.element:t,add:s};return o.element.toggleClass(this._classes(o),s),this},_on:function(e,i,s){var n,o=this;"boolean"!=typeof e&&(s=i,i=e,e=!1),s?(i=n=t(i),this.bindings=this.bindings.add(i)):(s=i,i=this.element,n=this.widget()),t.each(s,function(s,a){function r(){return e||o.options.disabled!==!0&&!t(this).hasClass("ui-state-disabled")?("string"==typeof a?o[a]:a).apply(o,arguments):void 0}"string"!=typeof a&&(r.guid=a.guid=a.guid||r.guid||t.guid++);var h=s.match(/^([\w:-]*)\s*(.*)$/),l=h[1]+o.eventNamespace,c=h[2];c?n.on(l,c,r):i.on(l,r)})},_off:function(e,i){i=(i||"").split(" ").join(this.eventNamespace+" ")+this.eventNamespace,e.off(i).off(i),this.bindings=t(this.bindings.not(e).get()),this.focusable=t(this.focusable.not(e).get()),this.hoverable=t(this.hoverable.not(e).get())},_delay:function(t,e){function i(){return("string"==typeof t?s[t]:t).apply(s,arguments)}var s=this;return setTimeout(i,e||0)},_hoverable:function(e){this.hoverable=this.hoverable.add(e),this._on(e,{mouseenter:function(e){this._addClass(t(e.currentTarget),null,"ui-state-hover")},mouseleave:function(e){this._removeClass(t(e.currentTarget),null,"ui-state-hover")}})},_focusable:function(e){this.focusable=this.focusable.add(e),this._on(e,{focusin:function(e){this._addClass(t(e.currentTarget),null,"ui-state-focus")},focusout:function(e){this._removeClass(t(e.currentTarget),null,"ui-state-focus")}})},_trigger:function(e,i,s){var n,o,a=this.options[e];if(s=s||{},i=t.Event(i),i.type=(e===this.widgetEventPrefix?e:this.widgetEventPrefix+e).toLowerCase(),i.target=this.element[0],o=i.originalEvent)for(n in o)n in i||(i[n]=o[n]);return this.element.trigger(i,s),!(t.isFunction(a)&&a.apply(this.element[0],[i].concat(s))===!1||i.isDefaultPrevented())}},t.each({show:"fadeIn",hide:"fadeOut"},function(e,i){t.Widget.prototype["_"+e]=function(s,n,o){"string"==typeof n&&(n={effect:n});var a,r=n?n===!0||"number"==typeof n?i:n.effect||i:e;n=n||{},"number"==typeof n&&(n={duration:n}),a=!t.isEmptyObject(n),n.complete=o,n.delay&&s.delay(n.delay),a&&t.effects&&t.effects.effect[r]?s[e](n):r!==e&&s[r]?s[r](n.duration,n.easing,o):s.queue(function(i){t(this)[e](),o&&o.call(s[0]),i()})}}),t.widget,function(){function e(t,e,i){return[parseFloat(t[0])*(u.test(t[0])?e/100:1),parseFloat(t[1])*(u.test(t[1])?i/100:1)]}function i(e,i){return parseInt(t.css(e,i),10)||0}function s(e){var i=e[0];return 9===i.nodeType?{width:e.width(),height:e.height(),offset:{top:0,left:0}}:t.isWindow(i)?{width:e.width(),height:e.height(),offset:{top:e.scrollTop(),left:e.scrollLeft()}}:i.preventDefault?{width:0,height:0,offset:{top:i.pageY,left:i.pageX}}:{width:e.outerWidth(),height:e.outerHeight(),offset:e.offset()}}var n,o=Math.max,a=Math.abs,r=/left|center|right/,h=/top|center|bottom/,l=/[\+\-]\d+(\.[\d]+)?%?/,c=/^\w+/,u=/%$/,d=t.fn.position;t.position={scrollbarWidth:function(){if(void 0!==n)return n;var e,i,s=t("
"),o=s.children()[0];return t("body").append(s),e=o.offsetWidth,s.css("overflow","scroll"),i=o.offsetWidth,e===i&&(i=s[0].clientWidth),s.remove(),n=e-i},getScrollInfo:function(e){var i=e.isWindow||e.isDocument?"":e.element.css("overflow-x"),s=e.isWindow||e.isDocument?"":e.element.css("overflow-y"),n="scroll"===i||"auto"===i&&e.widthi?"left":e>0?"right":"center",vertical:0>r?"top":s>0?"bottom":"middle"};l>p&&p>a(e+i)&&(u.horizontal="center"),c>f&&f>a(s+r)&&(u.vertical="middle"),u.important=o(a(e),a(i))>o(a(s),a(r))?"horizontal":"vertical",n.using.call(this,t,u)}),h.offset(t.extend(D,{using:r}))})},t.ui.position={fit:{left:function(t,e){var i,s=e.within,n=s.isWindow?s.scrollLeft:s.offset.left,a=s.width,r=t.left-e.collisionPosition.marginLeft,h=n-r,l=r+e.collisionWidth-a-n;e.collisionWidth>a?h>0&&0>=l?(i=t.left+h+e.collisionWidth-a-n,t.left+=h-i):t.left=l>0&&0>=h?n:h>l?n+a-e.collisionWidth:n:h>0?t.left+=h:l>0?t.left-=l:t.left=o(t.left-r,t.left)},top:function(t,e){var i,s=e.within,n=s.isWindow?s.scrollTop:s.offset.top,a=e.within.height,r=t.top-e.collisionPosition.marginTop,h=n-r,l=r+e.collisionHeight-a-n;e.collisionHeight>a?h>0&&0>=l?(i=t.top+h+e.collisionHeight-a-n,t.top+=h-i):t.top=l>0&&0>=h?n:h>l?n+a-e.collisionHeight:n:h>0?t.top+=h:l>0?t.top-=l:t.top=o(t.top-r,t.top)}},flip:{left:function(t,e){var i,s,n=e.within,o=n.offset.left+n.scrollLeft,r=n.width,h=n.isWindow?n.scrollLeft:n.offset.left,l=t.left-e.collisionPosition.marginLeft,c=l-h,u=l+e.collisionWidth-r-h,d="left"===e.my[0]?-e.elemWidth:"right"===e.my[0]?e.elemWidth:0,p="left"===e.at[0]?e.targetWidth:"right"===e.at[0]?-e.targetWidth:0,f=-2*e.offset[0];0>c?(i=t.left+d+p+f+e.collisionWidth-r-o,(0>i||a(c)>i)&&(t.left+=d+p+f)):u>0&&(s=t.left-e.collisionPosition.marginLeft+d+p+f-h,(s>0||u>a(s))&&(t.left+=d+p+f))},top:function(t,e){var i,s,n=e.within,o=n.offset.top+n.scrollTop,r=n.height,h=n.isWindow?n.scrollTop:n.offset.top,l=t.top-e.collisionPosition.marginTop,c=l-h,u=l+e.collisionHeight-r-h,d="top"===e.my[1],p=d?-e.elemHeight:"bottom"===e.my[1]?e.elemHeight:0,f="top"===e.at[1]?e.targetHeight:"bottom"===e.at[1]?-e.targetHeight:0,m=-2*e.offset[1];0>c?(s=t.top+p+f+m+e.collisionHeight-r-o,(0>s||a(c)>s)&&(t.top+=p+f+m)):u>0&&(i=t.top-e.collisionPosition.marginTop+p+f+m-h,(i>0||u>a(i))&&(t.top+=p+f+m))}},flipfit:{left:function(){t.ui.position.flip.left.apply(this,arguments),t.ui.position.fit.left.apply(this,arguments)},top:function(){t.ui.position.flip.top.apply(this,arguments),t.ui.position.fit.top.apply(this,arguments)}}}}(),t.ui.position,t.extend(t.expr[":"],{data:t.expr.createPseudo?t.expr.createPseudo(function(e){return function(i){return!!t.data(i,e)}}):function(e,i,s){return!!t.data(e,s[3])}}),t.fn.extend({disableSelection:function(){var t="onselectstart"in document.createElement("div")?"selectstart":"mousedown";return function(){return this.on(t+".ui-disableSelection",function(t){t.preventDefault()})}}(),enableSelection:function(){return this.off(".ui-disableSelection")}}),t.ui.focusable=function(i,s){var n,o,a,r,h,l=i.nodeName.toLowerCase();return"area"===l?(n=i.parentNode,o=n.name,i.href&&o&&"map"===n.nodeName.toLowerCase()?(a=t("img[usemap='#"+o+"']"),a.length>0&&a.is(":visible")):!1):(/^(input|select|textarea|button|object)$/.test(l)?(r=!i.disabled,r&&(h=t(i).closest("fieldset")[0],h&&(r=!h.disabled))):r="a"===l?i.href||s:s,r&&t(i).is(":visible")&&e(t(i)))},t.extend(t.expr[":"],{focusable:function(e){return t.ui.focusable(e,null!=t.attr(e,"tabindex"))}}),t.ui.focusable,t.fn.form=function(){return"string"==typeof this[0].form?this.closest("form"):t(this[0].form)},t.ui.formResetMixin={_formResetHandler:function(){var e=t(this);setTimeout(function(){var i=e.data("ui-form-reset-instances");t.each(i,function(){this.refresh()})})},_bindFormResetHandler:function(){if(this.form=this.element.form(),this.form.length){var t=this.form.data("ui-form-reset-instances")||[];t.length||this.form.on("reset.ui-form-reset",this._formResetHandler),t.push(this),this.form.data("ui-form-reset-instances",t)}},_unbindFormResetHandler:function(){if(this.form.length){var e=this.form.data("ui-form-reset-instances");e.splice(t.inArray(this,e),1),e.length?this.form.data("ui-form-reset-instances",e):this.form.removeData("ui-form-reset-instances").off("reset.ui-form-reset")}}},"1.7"===t.fn.jquery.substring(0,3)&&(t.each(["Width","Height"],function(e,i){function s(e,i,s,o){return t.each(n,function(){i-=parseFloat(t.css(e,"padding"+this))||0,s&&(i-=parseFloat(t.css(e,"border"+this+"Width"))||0),o&&(i-=parseFloat(t.css(e,"margin"+this))||0)}),i}var n="Width"===i?["Left","Right"]:["Top","Bottom"],o=i.toLowerCase(),a={innerWidth:t.fn.innerWidth,innerHeight:t.fn.innerHeight,outerWidth:t.fn.outerWidth,outerHeight:t.fn.outerHeight};t.fn["inner"+i]=function(e){return void 0===e?a["inner"+i].call(this):this.each(function(){t(this).css(o,s(this,e)+"px")})},t.fn["outer"+i]=function(e,n){return"number"!=typeof e?a["outer"+i].call(this,e):this.each(function(){t(this).css(o,s(this,e,!0,n)+"px")})}}),t.fn.addBack=function(t){return this.add(null==t?this.prevObject:this.prevObject.filter(t))}),t.ui.keyCode={BACKSPACE:8,COMMA:188,DELETE:46,DOWN:40,END:35,ENTER:13,ESCAPE:27,HOME:36,LEFT:37,PAGE_DOWN:34,PAGE_UP:33,PERIOD:190,RIGHT:39,SPACE:32,TAB:9,UP:38},t.ui.escapeSelector=function(){var t=/([!"#$%&'()*+,./:;<=>?@[\]^`{|}~])/g;return function(e){return e.replace(t,"\\$1")}}(),t.fn.labels=function(){var e,i,s,n,o;return this[0].labels&&this[0].labels.length?this.pushStack(this[0].labels):(n=this.eq(0).parents("label"),s=this.attr("id"),s&&(e=this.eq(0).parents().last(),o=e.add(e.length?e.siblings():this.siblings()),i="label[for='"+t.ui.escapeSelector(s)+"']",n=n.add(o.find(i).addBack(i))),this.pushStack(n))},t.fn.scrollParent=function(e){var i=this.css("position"),s="absolute"===i,n=e?/(auto|scroll|hidden)/:/(auto|scroll)/,o=this.parents().filter(function(){var e=t(this);return s&&"static"===e.css("position")?!1:n.test(e.css("overflow")+e.css("overflow-y")+e.css("overflow-x"))}).eq(0);return"fixed"!==i&&o.length?o:t(this[0].ownerDocument||document)},t.extend(t.expr[":"],{tabbable:function(e){var i=t.attr(e,"tabindex"),s=null!=i;return(!s||i>=0)&&t.ui.focusable(e,s)}}),t.fn.extend({uniqueId:function(){var t=0;return function(){return this.each(function(){this.id||(this.id="ui-id-"+ ++t)})}}(),removeUniqueId:function(){return this.each(function(){/^ui-id-\d+$/.test(this.id)&&t(this).removeAttr("id")})}}),t.ui.ie=!!/msie [\w.]+/.exec(navigator.userAgent.toLowerCase());var n=!1;t(document).on("mouseup",function(){n=!1}),t.widget("ui.mouse",{version:"1.12.1",options:{cancel:"input, textarea, button, select, option",distance:1,delay:0},_mouseInit:function(){var e=this;this.element.on("mousedown."+this.widgetName,function(t){return e._mouseDown(t)}).on("click."+this.widgetName,function(i){return!0===t.data(i.target,e.widgetName+".preventClickEvent")?(t.removeData(i.target,e.widgetName+".preventClickEvent"),i.stopImmediatePropagation(),!1):void 0}),this.started=!1},_mouseDestroy:function(){this.element.off("."+this.widgetName),this._mouseMoveDelegate&&this.document.off("mousemove."+this.widgetName,this._mouseMoveDelegate).off("mouseup."+this.widgetName,this._mouseUpDelegate)},_mouseDown:function(e){if(!n){this._mouseMoved=!1,this._mouseStarted&&this._mouseUp(e),this._mouseDownEvent=e;var i=this,s=1===e.which,o="string"==typeof this.options.cancel&&e.target.nodeName?t(e.target).closest(this.options.cancel).length:!1;return s&&!o&&this._mouseCapture(e)?(this.mouseDelayMet=!this.options.delay,this.mouseDelayMet||(this._mouseDelayTimer=setTimeout(function(){i.mouseDelayMet=!0},this.options.delay)),this._mouseDistanceMet(e)&&this._mouseDelayMet(e)&&(this._mouseStarted=this._mouseStart(e)!==!1,!this._mouseStarted)?(e.preventDefault(),!0):(!0===t.data(e.target,this.widgetName+".preventClickEvent")&&t.removeData(e.target,this.widgetName+".preventClickEvent"),this._mouseMoveDelegate=function(t){return i._mouseMove(t)},this._mouseUpDelegate=function(t){return i._mouseUp(t)},this.document.on("mousemove."+this.widgetName,this._mouseMoveDelegate).on("mouseup."+this.widgetName,this._mouseUpDelegate),e.preventDefault(),n=!0,!0)):!0}},_mouseMove:function(e){if(this._mouseMoved){if(t.ui.ie&&(!document.documentMode||9>document.documentMode)&&!e.button)return this._mouseUp(e);if(!e.which)if(e.originalEvent.altKey||e.originalEvent.ctrlKey||e.originalEvent.metaKey||e.originalEvent.shiftKey)this.ignoreMissingWhich=!0;else if(!this.ignoreMissingWhich)return this._mouseUp(e)}return(e.which||e.button)&&(this._mouseMoved=!0),this._mouseStarted?(this._mouseDrag(e),e.preventDefault()):(this._mouseDistanceMet(e)&&this._mouseDelayMet(e)&&(this._mouseStarted=this._mouseStart(this._mouseDownEvent,e)!==!1,this._mouseStarted?this._mouseDrag(e):this._mouseUp(e)),!this._mouseStarted)},_mouseUp:function(e){this.document.off("mousemove."+this.widgetName,this._mouseMoveDelegate).off("mouseup."+this.widgetName,this._mouseUpDelegate),this._mouseStarted&&(this._mouseStarted=!1,e.target===this._mouseDownEvent.target&&t.data(e.target,this.widgetName+".preventClickEvent",!0),this._mouseStop(e)),this._mouseDelayTimer&&(clearTimeout(this._mouseDelayTimer),delete this._mouseDelayTimer),this.ignoreMissingWhich=!1,n=!1,e.preventDefault()},_mouseDistanceMet:function(t){return Math.max(Math.abs(this._mouseDownEvent.pageX-t.pageX),Math.abs(this._mouseDownEvent.pageY-t.pageY))>=this.options.distance},_mouseDelayMet:function(){return this.mouseDelayMet},_mouseStart:function(){},_mouseDrag:function(){},_mouseStop:function(){},_mouseCapture:function(){return!0}}),t.ui.plugin={add:function(e,i,s){var n,o=t.ui[e].prototype;for(n in s)o.plugins[n]=o.plugins[n]||[],o.plugins[n].push([i,s[n]])},call:function(t,e,i,s){var n,o=t.plugins[e];if(o&&(s||t.element[0].parentNode&&11!==t.element[0].parentNode.nodeType))for(n=0;o.length>n;n++)t.options[o[n][0]]&&o[n][1].apply(t.element,i)}},t.widget("ui.resizable",t.ui.mouse,{version:"1.12.1",widgetEventPrefix:"resize",options:{alsoResize:!1,animate:!1,animateDuration:"slow",animateEasing:"swing",aspectRatio:!1,autoHide:!1,classes:{"ui-resizable-se":"ui-icon ui-icon-gripsmall-diagonal-se"},containment:!1,ghost:!1,grid:!1,handles:"e,s,se",helper:!1,maxHeight:null,maxWidth:null,minHeight:10,minWidth:10,zIndex:90,resize:null,start:null,stop:null},_num:function(t){return parseFloat(t)||0},_isNumber:function(t){return!isNaN(parseFloat(t))},_hasScroll:function(e,i){if("hidden"===t(e).css("overflow"))return!1;var s=i&&"left"===i?"scrollLeft":"scrollTop",n=!1;return e[s]>0?!0:(e[s]=1,n=e[s]>0,e[s]=0,n)},_create:function(){var e,i=this.options,s=this;this._addClass("ui-resizable"),t.extend(this,{_aspectRatio:!!i.aspectRatio,aspectRatio:i.aspectRatio,originalElement:this.element,_proportionallyResizeElements:[],_helper:i.helper||i.ghost||i.animate?i.helper||"ui-resizable-helper":null}),this.element[0].nodeName.match(/^(canvas|textarea|input|select|button|img)$/i)&&(this.element.wrap(t("
").css({position:this.element.css("position"),width:this.element.outerWidth(),height:this.element.outerHeight(),top:this.element.css("top"),left:this.element.css("left")})),this.element=this.element.parent().data("ui-resizable",this.element.resizable("instance")),this.elementIsWrapper=!0,e={marginTop:this.originalElement.css("marginTop"),marginRight:this.originalElement.css("marginRight"),marginBottom:this.originalElement.css("marginBottom"),marginLeft:this.originalElement.css("marginLeft")},this.element.css(e),this.originalElement.css("margin",0),this.originalResizeStyle=this.originalElement.css("resize"),this.originalElement.css("resize","none"),this._proportionallyResizeElements.push(this.originalElement.css({position:"static",zoom:1,display:"block"})),this.originalElement.css(e),this._proportionallyResize()),this._setupHandles(),i.autoHide&&t(this.element).on("mouseenter",function(){i.disabled||(s._removeClass("ui-resizable-autohide"),s._handles.show())}).on("mouseleave",function(){i.disabled||s.resizing||(s._addClass("ui-resizable-autohide"),s._handles.hide())}),this._mouseInit()},_destroy:function(){this._mouseDestroy();var e,i=function(e){t(e).removeData("resizable").removeData("ui-resizable").off(".resizable").find(".ui-resizable-handle").remove()};return this.elementIsWrapper&&(i(this.element),e=this.element,this.originalElement.css({position:e.css("position"),width:e.outerWidth(),height:e.outerHeight(),top:e.css("top"),left:e.css("left")}).insertAfter(e),e.remove()),this.originalElement.css("resize",this.originalResizeStyle),i(this.originalElement),this},_setOption:function(t,e){switch(this._super(t,e),t){case"handles":this._removeHandles(),this._setupHandles();break;default:}},_setupHandles:function(){var e,i,s,n,o,a=this.options,r=this;if(this.handles=a.handles||(t(".ui-resizable-handle",this.element).length?{n:".ui-resizable-n",e:".ui-resizable-e",s:".ui-resizable-s",w:".ui-resizable-w",se:".ui-resizable-se",sw:".ui-resizable-sw",ne:".ui-resizable-ne",nw:".ui-resizable-nw"}:"e,s,se"),this._handles=t(),this.handles.constructor===String)for("all"===this.handles&&(this.handles="n,e,s,w,se,sw,ne,nw"),s=this.handles.split(","),this.handles={},i=0;s.length>i;i++)e=t.trim(s[i]),n="ui-resizable-"+e,o=t("
"),this._addClass(o,"ui-resizable-handle "+n),o.css({zIndex:a.zIndex}),this.handles[e]=".ui-resizable-"+e,this.element.append(o);this._renderAxis=function(e){var i,s,n,o;e=e||this.element;for(i in this.handles)this.handles[i].constructor===String?this.handles[i]=this.element.children(this.handles[i]).first().show():(this.handles[i].jquery||this.handles[i].nodeType)&&(this.handles[i]=t(this.handles[i]),this._on(this.handles[i],{mousedown:r._mouseDown})),this.elementIsWrapper&&this.originalElement[0].nodeName.match(/^(textarea|input|select|button)$/i)&&(s=t(this.handles[i],this.element),o=/sw|ne|nw|se|n|s/.test(i)?s.outerHeight():s.outerWidth(),n=["padding",/ne|nw|n/.test(i)?"Top":/se|sw|s/.test(i)?"Bottom":/^e$/.test(i)?"Right":"Left"].join(""),e.css(n,o),this._proportionallyResize()),this._handles=this._handles.add(this.handles[i])},this._renderAxis(this.element),this._handles=this._handles.add(this.element.find(".ui-resizable-handle")),this._handles.disableSelection(),this._handles.on("mouseover",function(){r.resizing||(this.className&&(o=this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i)),r.axis=o&&o[1]?o[1]:"se")}),a.autoHide&&(this._handles.hide(),this._addClass("ui-resizable-autohide"))},_removeHandles:function(){this._handles.remove()},_mouseCapture:function(e){var i,s,n=!1;for(i in this.handles)s=t(this.handles[i])[0],(s===e.target||t.contains(s,e.target))&&(n=!0);return!this.options.disabled&&n},_mouseStart:function(e){var i,s,n,o=this.options,a=this.element;return this.resizing=!0,this._renderProxy(),i=this._num(this.helper.css("left")),s=this._num(this.helper.css("top")),o.containment&&(i+=t(o.containment).scrollLeft()||0,s+=t(o.containment).scrollTop()||0),this.offset=this.helper.offset(),this.position={left:i,top:s},this.size=this._helper?{width:this.helper.width(),height:this.helper.height()}:{width:a.width(),height:a.height()},this.originalSize=this._helper?{width:a.outerWidth(),height:a.outerHeight()}:{width:a.width(),height:a.height()},this.sizeDiff={width:a.outerWidth()-a.width(),height:a.outerHeight()-a.height()},this.originalPosition={left:i,top:s},this.originalMousePosition={left:e.pageX,top:e.pageY},this.aspectRatio="number"==typeof o.aspectRatio?o.aspectRatio:this.originalSize.width/this.originalSize.height||1,n=t(".ui-resizable-"+this.axis).css("cursor"),t("body").css("cursor","auto"===n?this.axis+"-resize":n),this._addClass("ui-resizable-resizing"),this._propagate("start",e),!0},_mouseDrag:function(e){var i,s,n=this.originalMousePosition,o=this.axis,a=e.pageX-n.left||0,r=e.pageY-n.top||0,h=this._change[o];return this._updatePrevProperties(),h?(i=h.apply(this,[e,a,r]),this._updateVirtualBoundaries(e.shiftKey),(this._aspectRatio||e.shiftKey)&&(i=this._updateRatio(i,e)),i=this._respectSize(i,e),this._updateCache(i),this._propagate("resize",e),s=this._applyChanges(),!this._helper&&this._proportionallyResizeElements.length&&this._proportionallyResize(),t.isEmptyObject(s)||(this._updatePrevProperties(),this._trigger("resize",e,this.ui()),this._applyChanges()),!1):!1},_mouseStop:function(e){this.resizing=!1;var i,s,n,o,a,r,h,l=this.options,c=this;return this._helper&&(i=this._proportionallyResizeElements,s=i.length&&/textarea/i.test(i[0].nodeName),n=s&&this._hasScroll(i[0],"left")?0:c.sizeDiff.height,o=s?0:c.sizeDiff.width,a={width:c.helper.width()-o,height:c.helper.height()-n},r=parseFloat(c.element.css("left"))+(c.position.left-c.originalPosition.left)||null,h=parseFloat(c.element.css("top"))+(c.position.top-c.originalPosition.top)||null,l.animate||this.element.css(t.extend(a,{top:h,left:r})),c.helper.height(c.size.height),c.helper.width(c.size.width),this._helper&&!l.animate&&this._proportionallyResize()),t("body").css("cursor","auto"),this._removeClass("ui-resizable-resizing"),this._propagate("stop",e),this._helper&&this.helper.remove(),!1},_updatePrevProperties:function(){this.prevPosition={top:this.position.top,left:this.position.left},this.prevSize={width:this.size.width,height:this.size.height}},_applyChanges:function(){var t={};return this.position.top!==this.prevPosition.top&&(t.top=this.position.top+"px"),this.position.left!==this.prevPosition.left&&(t.left=this.position.left+"px"),this.size.width!==this.prevSize.width&&(t.width=this.size.width+"px"),this.size.height!==this.prevSize.height&&(t.height=this.size.height+"px"),this.helper.css(t),t},_updateVirtualBoundaries:function(t){var e,i,s,n,o,a=this.options;o={minWidth:this._isNumber(a.minWidth)?a.minWidth:0,maxWidth:this._isNumber(a.maxWidth)?a.maxWidth:1/0,minHeight:this._isNumber(a.minHeight)?a.minHeight:0,maxHeight:this._isNumber(a.maxHeight)?a.maxHeight:1/0},(this._aspectRatio||t)&&(e=o.minHeight*this.aspectRatio,s=o.minWidth/this.aspectRatio,i=o.maxHeight*this.aspectRatio,n=o.maxWidth/this.aspectRatio,e>o.minWidth&&(o.minWidth=e),s>o.minHeight&&(o.minHeight=s),o.maxWidth>i&&(o.maxWidth=i),o.maxHeight>n&&(o.maxHeight=n)),this._vBoundaries=o},_updateCache:function(t){this.offset=this.helper.offset(),this._isNumber(t.left)&&(this.position.left=t.left),this._isNumber(t.top)&&(this.position.top=t.top),this._isNumber(t.height)&&(this.size.height=t.height),this._isNumber(t.width)&&(this.size.width=t.width)},_updateRatio:function(t){var e=this.position,i=this.size,s=this.axis;return this._isNumber(t.height)?t.width=t.height*this.aspectRatio:this._isNumber(t.width)&&(t.height=t.width/this.aspectRatio),"sw"===s&&(t.left=e.left+(i.width-t.width),t.top=null),"nw"===s&&(t.top=e.top+(i.height-t.height),t.left=e.left+(i.width-t.width)),t},_respectSize:function(t){var e=this._vBoundaries,i=this.axis,s=this._isNumber(t.width)&&e.maxWidth&&e.maxWidtht.width,a=this._isNumber(t.height)&&e.minHeight&&e.minHeight>t.height,r=this.originalPosition.left+this.originalSize.width,h=this.originalPosition.top+this.originalSize.height,l=/sw|nw|w/.test(i),c=/nw|ne|n/.test(i);return o&&(t.width=e.minWidth),a&&(t.height=e.minHeight),s&&(t.width=e.maxWidth),n&&(t.height=e.maxHeight),o&&l&&(t.left=r-e.minWidth),s&&l&&(t.left=r-e.maxWidth),a&&c&&(t.top=h-e.minHeight),n&&c&&(t.top=h-e.maxHeight),t.width||t.height||t.left||!t.top?t.width||t.height||t.top||!t.left||(t.left=null):t.top=null,t},_getPaddingPlusBorderDimensions:function(t){for(var e=0,i=[],s=[t.css("borderTopWidth"),t.css("borderRightWidth"),t.css("borderBottomWidth"),t.css("borderLeftWidth")],n=[t.css("paddingTop"),t.css("paddingRight"),t.css("paddingBottom"),t.css("paddingLeft")];4>e;e++)i[e]=parseFloat(s[e])||0,i[e]+=parseFloat(n[e])||0;return{height:i[0]+i[2],width:i[1]+i[3]}},_proportionallyResize:function(){if(this._proportionallyResizeElements.length)for(var t,e=0,i=this.helper||this.element;this._proportionallyResizeElements.length>e;e++)t=this._proportionallyResizeElements[e],this.outerDimensions||(this.outerDimensions=this._getPaddingPlusBorderDimensions(t)),t.css({height:i.height()-this.outerDimensions.height||0,width:i.width()-this.outerDimensions.width||0})},_renderProxy:function(){var e=this.element,i=this.options;this.elementOffset=e.offset(),this._helper?(this.helper=this.helper||t("
"),this._addClass(this.helper,this._helper),this.helper.css({width:this.element.outerWidth(),height:this.element.outerHeight(),position:"absolute",left:this.elementOffset.left+"px",top:this.elementOffset.top+"px",zIndex:++i.zIndex}),this.helper.appendTo("body").disableSelection()):this.helper=this.element +},_change:{e:function(t,e){return{width:this.originalSize.width+e}},w:function(t,e){var i=this.originalSize,s=this.originalPosition;return{left:s.left+e,width:i.width-e}},n:function(t,e,i){var s=this.originalSize,n=this.originalPosition;return{top:n.top+i,height:s.height-i}},s:function(t,e,i){return{height:this.originalSize.height+i}},se:function(e,i,s){return t.extend(this._change.s.apply(this,arguments),this._change.e.apply(this,[e,i,s]))},sw:function(e,i,s){return t.extend(this._change.s.apply(this,arguments),this._change.w.apply(this,[e,i,s]))},ne:function(e,i,s){return t.extend(this._change.n.apply(this,arguments),this._change.e.apply(this,[e,i,s]))},nw:function(e,i,s){return t.extend(this._change.n.apply(this,arguments),this._change.w.apply(this,[e,i,s]))}},_propagate:function(e,i){t.ui.plugin.call(this,e,[i,this.ui()]),"resize"!==e&&this._trigger(e,i,this.ui())},plugins:{},ui:function(){return{originalElement:this.originalElement,element:this.element,helper:this.helper,position:this.position,size:this.size,originalSize:this.originalSize,originalPosition:this.originalPosition}}}),t.ui.plugin.add("resizable","animate",{stop:function(e){var i=t(this).resizable("instance"),s=i.options,n=i._proportionallyResizeElements,o=n.length&&/textarea/i.test(n[0].nodeName),a=o&&i._hasScroll(n[0],"left")?0:i.sizeDiff.height,r=o?0:i.sizeDiff.width,h={width:i.size.width-r,height:i.size.height-a},l=parseFloat(i.element.css("left"))+(i.position.left-i.originalPosition.left)||null,c=parseFloat(i.element.css("top"))+(i.position.top-i.originalPosition.top)||null;i.element.animate(t.extend(h,c&&l?{top:c,left:l}:{}),{duration:s.animateDuration,easing:s.animateEasing,step:function(){var s={width:parseFloat(i.element.css("width")),height:parseFloat(i.element.css("height")),top:parseFloat(i.element.css("top")),left:parseFloat(i.element.css("left"))};n&&n.length&&t(n[0]).css({width:s.width,height:s.height}),i._updateCache(s),i._propagate("resize",e)}})}}),t.ui.plugin.add("resizable","containment",{start:function(){var e,i,s,n,o,a,r,h=t(this).resizable("instance"),l=h.options,c=h.element,u=l.containment,d=u instanceof t?u.get(0):/parent/.test(u)?c.parent().get(0):u;d&&(h.containerElement=t(d),/document/.test(u)||u===document?(h.containerOffset={left:0,top:0},h.containerPosition={left:0,top:0},h.parentData={element:t(document),left:0,top:0,width:t(document).width(),height:t(document).height()||document.body.parentNode.scrollHeight}):(e=t(d),i=[],t(["Top","Right","Left","Bottom"]).each(function(t,s){i[t]=h._num(e.css("padding"+s))}),h.containerOffset=e.offset(),h.containerPosition=e.position(),h.containerSize={height:e.innerHeight()-i[3],width:e.innerWidth()-i[1]},s=h.containerOffset,n=h.containerSize.height,o=h.containerSize.width,a=h._hasScroll(d,"left")?d.scrollWidth:o,r=h._hasScroll(d)?d.scrollHeight:n,h.parentData={element:d,left:s.left,top:s.top,width:a,height:r}))},resize:function(e){var i,s,n,o,a=t(this).resizable("instance"),r=a.options,h=a.containerOffset,l=a.position,c=a._aspectRatio||e.shiftKey,u={top:0,left:0},d=a.containerElement,p=!0;d[0]!==document&&/static/.test(d.css("position"))&&(u=h),l.left<(a._helper?h.left:0)&&(a.size.width=a.size.width+(a._helper?a.position.left-h.left:a.position.left-u.left),c&&(a.size.height=a.size.width/a.aspectRatio,p=!1),a.position.left=r.helper?h.left:0),l.top<(a._helper?h.top:0)&&(a.size.height=a.size.height+(a._helper?a.position.top-h.top:a.position.top),c&&(a.size.width=a.size.height*a.aspectRatio,p=!1),a.position.top=a._helper?h.top:0),n=a.containerElement.get(0)===a.element.parent().get(0),o=/relative|absolute/.test(a.containerElement.css("position")),n&&o?(a.offset.left=a.parentData.left+a.position.left,a.offset.top=a.parentData.top+a.position.top):(a.offset.left=a.element.offset().left,a.offset.top=a.element.offset().top),i=Math.abs(a.sizeDiff.width+(a._helper?a.offset.left-u.left:a.offset.left-h.left)),s=Math.abs(a.sizeDiff.height+(a._helper?a.offset.top-u.top:a.offset.top-h.top)),i+a.size.width>=a.parentData.width&&(a.size.width=a.parentData.width-i,c&&(a.size.height=a.size.width/a.aspectRatio,p=!1)),s+a.size.height>=a.parentData.height&&(a.size.height=a.parentData.height-s,c&&(a.size.width=a.size.height*a.aspectRatio,p=!1)),p||(a.position.left=a.prevPosition.left,a.position.top=a.prevPosition.top,a.size.width=a.prevSize.width,a.size.height=a.prevSize.height)},stop:function(){var e=t(this).resizable("instance"),i=e.options,s=e.containerOffset,n=e.containerPosition,o=e.containerElement,a=t(e.helper),r=a.offset(),h=a.outerWidth()-e.sizeDiff.width,l=a.outerHeight()-e.sizeDiff.height;e._helper&&!i.animate&&/relative/.test(o.css("position"))&&t(this).css({left:r.left-n.left-s.left,width:h,height:l}),e._helper&&!i.animate&&/static/.test(o.css("position"))&&t(this).css({left:r.left-n.left-s.left,width:h,height:l})}}),t.ui.plugin.add("resizable","alsoResize",{start:function(){var e=t(this).resizable("instance"),i=e.options;t(i.alsoResize).each(function(){var e=t(this);e.data("ui-resizable-alsoresize",{width:parseFloat(e.width()),height:parseFloat(e.height()),left:parseFloat(e.css("left")),top:parseFloat(e.css("top"))})})},resize:function(e,i){var s=t(this).resizable("instance"),n=s.options,o=s.originalSize,a=s.originalPosition,r={height:s.size.height-o.height||0,width:s.size.width-o.width||0,top:s.position.top-a.top||0,left:s.position.left-a.left||0};t(n.alsoResize).each(function(){var e=t(this),s=t(this).data("ui-resizable-alsoresize"),n={},o=e.parents(i.originalElement[0]).length?["width","height"]:["width","height","top","left"];t.each(o,function(t,e){var i=(s[e]||0)+(r[e]||0);i&&i>=0&&(n[e]=i||null)}),e.css(n)})},stop:function(){t(this).removeData("ui-resizable-alsoresize")}}),t.ui.plugin.add("resizable","ghost",{start:function(){var e=t(this).resizable("instance"),i=e.size;e.ghost=e.originalElement.clone(),e.ghost.css({opacity:.25,display:"block",position:"relative",height:i.height,width:i.width,margin:0,left:0,top:0}),e._addClass(e.ghost,"ui-resizable-ghost"),t.uiBackCompat!==!1&&"string"==typeof e.options.ghost&&e.ghost.addClass(this.options.ghost),e.ghost.appendTo(e.helper)},resize:function(){var e=t(this).resizable("instance");e.ghost&&e.ghost.css({position:"relative",height:e.size.height,width:e.size.width})},stop:function(){var e=t(this).resizable("instance");e.ghost&&e.helper&&e.helper.get(0).removeChild(e.ghost.get(0))}}),t.ui.plugin.add("resizable","grid",{resize:function(){var e,i=t(this).resizable("instance"),s=i.options,n=i.size,o=i.originalSize,a=i.originalPosition,r=i.axis,h="number"==typeof s.grid?[s.grid,s.grid]:s.grid,l=h[0]||1,c=h[1]||1,u=Math.round((n.width-o.width)/l)*l,d=Math.round((n.height-o.height)/c)*c,p=o.width+u,f=o.height+d,m=s.maxWidth&&p>s.maxWidth,g=s.maxHeight&&f>s.maxHeight,_=s.minWidth&&s.minWidth>p,v=s.minHeight&&s.minHeight>f;s.grid=h,_&&(p+=l),v&&(f+=c),m&&(p-=l),g&&(f-=c),/^(se|s|e)$/.test(r)?(i.size.width=p,i.size.height=f):/^(ne)$/.test(r)?(i.size.width=p,i.size.height=f,i.position.top=a.top-d):/^(sw)$/.test(r)?(i.size.width=p,i.size.height=f,i.position.left=a.left-u):((0>=f-c||0>=p-l)&&(e=i._getPaddingPlusBorderDimensions(this)),f-c>0?(i.size.height=f,i.position.top=a.top-d):(f=c-e.height,i.size.height=f,i.position.top=a.top+o.height-f),p-l>0?(i.size.width=p,i.position.left=a.left-u):(p=l-e.width,i.size.width=p,i.position.left=a.left+o.width-p))}}),t.ui.resizable});/** + * Copyright (c) 2007 Ariel Flesler - aflesler ○ gmail • com | https://github.com/flesler + * Licensed under MIT + * @author Ariel Flesler + * @version 2.1.2 + */ +;(function(f){"use strict";"function"===typeof define&&define.amd?define(["jquery"],f):"undefined"!==typeof module&&module.exports?module.exports=f(require("jquery")):f(jQuery)})(function($){"use strict";function n(a){return!a.nodeName||-1!==$.inArray(a.nodeName.toLowerCase(),["iframe","#document","html","body"])}function h(a){return $.isFunction(a)||$.isPlainObject(a)?a:{top:a,left:a}}var p=$.scrollTo=function(a,d,b){return $(window).scrollTo(a,d,b)};p.defaults={axis:"xy",duration:0,limit:!0};$.fn.scrollTo=function(a,d,b){"object"=== typeof d&&(b=d,d=0);"function"===typeof b&&(b={onAfter:b});"max"===a&&(a=9E9);b=$.extend({},p.defaults,b);d=d||b.duration;var u=b.queue&&1=f[g]?0:Math.min(f[g],n));!a&&1-1){targetElements.on(evt+EVENT_NAMESPACE,function elementToggle(event){$.powerTip.toggle(this,event)})}else{targetElements.on(evt+EVENT_NAMESPACE,function elementOpen(event){$.powerTip.show(this,event)})}});$.each(options.closeEvents,function(idx,evt){if($.inArray(evt,options.openEvents)<0){targetElements.on(evt+EVENT_NAMESPACE,function elementClose(event){$.powerTip.hide(this,!isMouseEvent(event))})}});targetElements.on("keydown"+EVENT_NAMESPACE,function elementKeyDown(event){if(event.keyCode===27){$.powerTip.hide(this,true)}})}return targetElements};$.fn.powerTip.defaults={fadeInTime:200,fadeOutTime:100,followMouse:false,popupId:"powerTip",popupClass:null,intentSensitivity:7,intentPollInterval:100,closeDelay:100,placement:"n",smartPlacement:false,offset:10,mouseOnToPopup:false,manual:false,openEvents:["mouseenter","focus"],closeEvents:["mouseleave","blur"]};$.fn.powerTip.smartPlacementLists={n:["n","ne","nw","s"],e:["e","ne","se","w","nw","sw","n","s","e"],s:["s","se","sw","n"],w:["w","nw","sw","e","ne","se","n","s","w"],nw:["nw","w","sw","n","s","se","nw"],ne:["ne","e","se","n","s","sw","ne"],sw:["sw","w","nw","s","n","ne","sw"],se:["se","e","ne","s","n","nw","se"],"nw-alt":["nw-alt","n","ne-alt","sw-alt","s","se-alt","w","e"],"ne-alt":["ne-alt","n","nw-alt","se-alt","s","sw-alt","e","w"],"sw-alt":["sw-alt","s","se-alt","nw-alt","n","ne-alt","w","e"],"se-alt":["se-alt","s","sw-alt","ne-alt","n","nw-alt","e","w"]};$.powerTip={show:function apiShowTip(element,event){if(isMouseEvent(event)){trackMouse(event);session.previousX=event.pageX;session.previousY=event.pageY;$(element).data(DATA_DISPLAYCONTROLLER).show()}else{$(element).first().data(DATA_DISPLAYCONTROLLER).show(true,true)}return element},reposition:function apiResetPosition(element){$(element).first().data(DATA_DISPLAYCONTROLLER).resetPosition();return element},hide:function apiCloseTip(element,immediate){var displayController;immediate=element?immediate:true;if(element){displayController=$(element).first().data(DATA_DISPLAYCONTROLLER)}else if(session.activeHover){displayController=session.activeHover.data(DATA_DISPLAYCONTROLLER)}if(displayController){displayController.hide(immediate)}return element},toggle:function apiToggle(element,event){if(session.activeHover&&session.activeHover.is(element)){$.powerTip.hide(element,!isMouseEvent(event))}else{$.powerTip.show(element,event)}return element}};$.powerTip.showTip=$.powerTip.show;$.powerTip.closeTip=$.powerTip.hide;function CSSCoordinates(){var me=this;me.top="auto";me.left="auto";me.right="auto";me.bottom="auto";me.set=function(property,value){if($.isNumeric(value)){me[property]=Math.round(value)}}}function DisplayController(element,options,tipController){var hoverTimer=null,myCloseDelay=null;function openTooltip(immediate,forceOpen){cancelTimer();if(!element.data(DATA_HASACTIVEHOVER)){if(!immediate){session.tipOpenImminent=true;hoverTimer=setTimeout(function intentDelay(){hoverTimer=null;checkForIntent()},options.intentPollInterval)}else{if(forceOpen){element.data(DATA_FORCEDOPEN,true)}closeAnyDelayed();tipController.showTip(element)}}else{cancelClose()}}function closeTooltip(disableDelay){if(myCloseDelay){myCloseDelay=session.closeDelayTimeout=clearTimeout(myCloseDelay);session.delayInProgress=false}cancelTimer();session.tipOpenImminent=false;if(element.data(DATA_HASACTIVEHOVER)){element.data(DATA_FORCEDOPEN,false);if(!disableDelay){session.delayInProgress=true;session.closeDelayTimeout=setTimeout(function closeDelay(){session.closeDelayTimeout=null;tipController.hideTip(element);session.delayInProgress=false;myCloseDelay=null},options.closeDelay);myCloseDelay=session.closeDelayTimeout}else{tipController.hideTip(element)}}}function checkForIntent(){var xDifference=Math.abs(session.previousX-session.currentX),yDifference=Math.abs(session.previousY-session.currentY),totalDifference=xDifference+yDifference;if(totalDifference",{id:options.popupId});if($body.length===0){$body=$("body")}$body.append(tipElement);session.tooltips=session.tooltips?session.tooltips.add(tipElement):tipElement}if(options.followMouse){if(!tipElement.data(DATA_HASMOUSEMOVE)){$document.on("mousemove"+EVENT_NAMESPACE,positionTipOnCursor);$window.on("scroll"+EVENT_NAMESPACE,positionTipOnCursor);tipElement.data(DATA_HASMOUSEMOVE,true)}}function beginShowTip(element){element.data(DATA_HASACTIVEHOVER,true);tipElement.queue(function queueTipInit(next){showTip(element);next()})}function showTip(element){var tipContent;if(!element.data(DATA_HASACTIVEHOVER)){return}if(session.isTipOpen){if(!session.isClosing){hideTip(session.activeHover)}tipElement.delay(100).queue(function queueTipAgain(next){showTip(element);next()});return}element.trigger("powerTipPreRender");tipContent=getTooltipContent(element);if(tipContent){tipElement.empty().append(tipContent)}else{return}element.trigger("powerTipRender");session.activeHover=element;session.isTipOpen=true;tipElement.data(DATA_MOUSEONTOTIP,options.mouseOnToPopup);tipElement.addClass(options.popupClass);if(!options.followMouse||element.data(DATA_FORCEDOPEN)){positionTipOnElement(element);session.isFixedTipOpen=true}else{positionTipOnCursor()}if(!element.data(DATA_FORCEDOPEN)&&!options.followMouse){$document.on("click"+EVENT_NAMESPACE,function documentClick(event){var target=event.target;if(target!==element[0]){if(options.mouseOnToPopup){if(target!==tipElement[0]&&!$.contains(tipElement[0],target)){$.powerTip.hide()}}else{$.powerTip.hide()}}})}if(options.mouseOnToPopup&&!options.manual){tipElement.on("mouseenter"+EVENT_NAMESPACE,function tipMouseEnter(){if(session.activeHover){session.activeHover.data(DATA_DISPLAYCONTROLLER).cancel()}});tipElement.on("mouseleave"+EVENT_NAMESPACE,function tipMouseLeave(){if(session.activeHover){session.activeHover.data(DATA_DISPLAYCONTROLLER).hide()}})}tipElement.fadeIn(options.fadeInTime,function fadeInCallback(){if(!session.desyncTimeout){session.desyncTimeout=setInterval(closeDesyncedTip,500)}element.trigger("powerTipOpen")})}function hideTip(element){session.isClosing=true;session.isTipOpen=false;session.desyncTimeout=clearInterval(session.desyncTimeout);element.data(DATA_HASACTIVEHOVER,false);element.data(DATA_FORCEDOPEN,false);$document.off("click"+EVENT_NAMESPACE);tipElement.off(EVENT_NAMESPACE);tipElement.fadeOut(options.fadeOutTime,function fadeOutCallback(){var coords=new CSSCoordinates;session.activeHover=null;session.isClosing=false;session.isFixedTipOpen=false;tipElement.removeClass();coords.set("top",session.currentY+options.offset);coords.set("left",session.currentX+options.offset);tipElement.css(coords);element.trigger("powerTipClose")})}function positionTipOnCursor(){var tipWidth,tipHeight,coords,collisions,collisionCount;if(!session.isFixedTipOpen&&(session.isTipOpen||session.tipOpenImminent&&tipElement.data(DATA_HASMOUSEMOVE))){tipWidth=tipElement.outerWidth();tipHeight=tipElement.outerHeight();coords=new CSSCoordinates;coords.set("top",session.currentY+options.offset);coords.set("left",session.currentX+options.offset);collisions=getViewportCollisions(coords,tipWidth,tipHeight);if(collisions!==Collision.none){collisionCount=countFlags(collisions);if(collisionCount===1){if(collisions===Collision.right){coords.set("left",session.scrollLeft+session.windowWidth-tipWidth)}else if(collisions===Collision.bottom){coords.set("top",session.scrollTop+session.windowHeight-tipHeight)}}else{coords.set("left",session.currentX-tipWidth-options.offset);coords.set("top",session.currentY-tipHeight-options.offset)}}tipElement.css(coords)}}function positionTipOnElement(element){var priorityList,finalPlacement;if(options.smartPlacement||options.followMouse&&element.data(DATA_FORCEDOPEN)){priorityList=$.fn.powerTip.smartPlacementLists[options.placement];$.each(priorityList,function(idx,pos){var collisions=getViewportCollisions(placeTooltip(element,pos),tipElement.outerWidth(),tipElement.outerHeight());finalPlacement=pos;return collisions!==Collision.none})}else{placeTooltip(element,options.placement);finalPlacement=options.placement}tipElement.removeClass("w nw sw e ne se n s w se-alt sw-alt ne-alt nw-alt");tipElement.addClass(finalPlacement)}function placeTooltip(element,placement){var iterationCount=0,tipWidth,tipHeight,coords=new CSSCoordinates;coords.set("top",0);coords.set("left",0);tipElement.css(coords);do{tipWidth=tipElement.outerWidth();tipHeight=tipElement.outerHeight();coords=placementCalculator.compute(element,placement,tipWidth,tipHeight,options.offset);tipElement.css(coords)}while(++iterationCount<=5&&(tipWidth!==tipElement.outerWidth()||tipHeight!==tipElement.outerHeight()));return coords}function closeDesyncedTip(){var isDesynced=false,hasDesyncableCloseEvent=$.grep(["mouseleave","mouseout","blur","focusout"],function(eventType){return $.inArray(eventType,options.closeEvents)!==-1}).length>0;if(session.isTipOpen&&!session.isClosing&&!session.delayInProgress&&hasDesyncableCloseEvent){if(session.activeHover.data(DATA_HASACTIVEHOVER)===false||session.activeHover.is(":disabled")){isDesynced=true}else if(!isMouseOver(session.activeHover)&&!session.activeHover.is(":focus")&&!session.activeHover.data(DATA_FORCEDOPEN)){if(tipElement.data(DATA_MOUSEONTOTIP)){if(!isMouseOver(tipElement)){isDesynced=true}}else{isDesynced=true}}if(isDesynced){hideTip(session.activeHover)}}}this.showTip=beginShowTip;this.hideTip=hideTip;this.resetPosition=positionTipOnElement}function isSvgElement(element){return Boolean(window.SVGElement&&element[0]instanceof SVGElement)}function isMouseEvent(event){return Boolean(event&&$.inArray(event.type,MOUSE_EVENTS)>-1&&typeof event.pageX==="number")}function initTracking(){if(!session.mouseTrackingActive){session.mouseTrackingActive=true;getViewportDimensions();$(getViewportDimensions);$document.on("mousemove"+EVENT_NAMESPACE,trackMouse);$window.on("resize"+EVENT_NAMESPACE,trackResize);$window.on("scroll"+EVENT_NAMESPACE,trackScroll)}}function getViewportDimensions(){session.scrollLeft=$window.scrollLeft();session.scrollTop=$window.scrollTop();session.windowWidth=$window.width();session.windowHeight=$window.height()}function trackResize(){session.windowWidth=$window.width();session.windowHeight=$window.height()}function trackScroll(){var x=$window.scrollLeft(),y=$window.scrollTop();if(x!==session.scrollLeft){session.currentX+=x-session.scrollLeft;session.scrollLeft=x}if(y!==session.scrollTop){session.currentY+=y-session.scrollTop;session.scrollTop=y}}function trackMouse(event){session.currentX=event.pageX;session.currentY=event.pageY}function isMouseOver(element){var elementPosition=element.offset(),elementBox=element[0].getBoundingClientRect(),elementWidth=elementBox.right-elementBox.left,elementHeight=elementBox.bottom-elementBox.top;return session.currentX>=elementPosition.left&&session.currentX<=elementPosition.left+elementWidth&&session.currentY>=elementPosition.top&&session.currentY<=elementPosition.top+elementHeight}function getTooltipContent(element){var tipText=element.data(DATA_POWERTIP),tipObject=element.data(DATA_POWERTIPJQ),tipTarget=element.data(DATA_POWERTIPTARGET),targetElement,content;if(tipText){if($.isFunction(tipText)){tipText=tipText.call(element[0])}content=tipText}else if(tipObject){if($.isFunction(tipObject)){tipObject=tipObject.call(element[0])}if(tipObject.length>0){content=tipObject.clone(true,true)}}else if(tipTarget){targetElement=$("#"+tipTarget);if(targetElement.length>0){content=targetElement.html()}}return content}function getViewportCollisions(coords,elementWidth,elementHeight){var viewportTop=session.scrollTop,viewportLeft=session.scrollLeft,viewportBottom=viewportTop+session.windowHeight,viewportRight=viewportLeft+session.windowWidth,collisions=Collision.none;if(coords.topviewportBottom||Math.abs(coords.bottom-session.windowHeight)>viewportBottom){collisions|=Collision.bottom}if(coords.leftviewportRight){collisions|=Collision.left}if(coords.left+elementWidth>viewportRight||coords.right1)){a.preventDefault();var c=a.originalEvent.changedTouches[0],d=document.createEvent("MouseEvents");d.initMouseEvent(b,!0,!0,window,1,c.screenX,c.screenY,c.clientX,c.clientY,!1,!1,!1,!1,0,null),a.target.dispatchEvent(d)}}if(a.support.touch="ontouchend"in document,a.support.touch){var e,b=a.ui.mouse.prototype,c=b._mouseInit,d=b._mouseDestroy;b._touchStart=function(a){var b=this;!e&&b._mouseCapture(a.originalEvent.changedTouches[0])&&(e=!0,b._touchMoved=!1,f(a,"mouseover"),f(a,"mousemove"),f(a,"mousedown"))},b._touchMove=function(a){e&&(this._touchMoved=!0,f(a,"mousemove"))},b._touchEnd=function(a){e&&(f(a,"mouseup"),f(a,"mouseout"),this._touchMoved||f(a,"click"),e=!1)},b._mouseInit=function(){var b=this;b.element.bind({touchstart:a.proxy(b,"_touchStart"),touchmove:a.proxy(b,"_touchMove"),touchend:a.proxy(b,"_touchEnd")}),c.call(b)},b._mouseDestroy=function(){var b=this;b.element.unbind({touchstart:a.proxy(b,"_touchStart"),touchmove:a.proxy(b,"_touchMove"),touchend:a.proxy(b,"_touchEnd")}),d.call(b)}}}(jQuery);/*! SmartMenus jQuery Plugin - v1.1.0 - September 17, 2017 + * http://www.smartmenus.org/ + * Copyright Vasil Dinkov, Vadikom Web Ltd. http://vadikom.com; Licensed MIT */(function(t){"function"==typeof define&&define.amd?define(["jquery"],t):"object"==typeof module&&"object"==typeof module.exports?module.exports=t(require("jquery")):t(jQuery)})(function($){function initMouseDetection(t){var e=".smartmenus_mouse";if(mouseDetectionEnabled||t)mouseDetectionEnabled&&t&&($(document).off(e),mouseDetectionEnabled=!1);else{var i=!0,s=null,o={mousemove:function(t){var e={x:t.pageX,y:t.pageY,timeStamp:(new Date).getTime()};if(s){var o=Math.abs(s.x-e.x),a=Math.abs(s.y-e.y);if((o>0||a>0)&&2>=o&&2>=a&&300>=e.timeStamp-s.timeStamp&&(mouse=!0,i)){var n=$(t.target).closest("a");n.is("a")&&$.each(menuTrees,function(){return $.contains(this.$root[0],n[0])?(this.itemEnter({currentTarget:n[0]}),!1):void 0}),i=!1}}s=e}};o[touchEvents?"touchstart":"pointerover pointermove pointerout MSPointerOver MSPointerMove MSPointerOut"]=function(t){isTouchEvent(t.originalEvent)&&(mouse=!1)},$(document).on(getEventsNS(o,e)),mouseDetectionEnabled=!0}}function isTouchEvent(t){return!/^(4|mouse)$/.test(t.pointerType)}function getEventsNS(t,e){e||(e="");var i={};for(var s in t)i[s.split(" ").join(e+" ")+e]=t[s];return i}var menuTrees=[],mouse=!1,touchEvents="ontouchstart"in window,mouseDetectionEnabled=!1,requestAnimationFrame=window.requestAnimationFrame||function(t){return setTimeout(t,1e3/60)},cancelAnimationFrame=window.cancelAnimationFrame||function(t){clearTimeout(t)},canAnimate=!!$.fn.animate;return $.SmartMenus=function(t,e){this.$root=$(t),this.opts=e,this.rootId="",this.accessIdPrefix="",this.$subArrow=null,this.activatedItems=[],this.visibleSubMenus=[],this.showTimeout=0,this.hideTimeout=0,this.scrollTimeout=0,this.clickActivated=!1,this.focusActivated=!1,this.zIndexInc=0,this.idInc=0,this.$firstLink=null,this.$firstSub=null,this.disabled=!1,this.$disableOverlay=null,this.$touchScrollingSub=null,this.cssTransforms3d="perspective"in t.style||"webkitPerspective"in t.style,this.wasCollapsible=!1,this.init()},$.extend($.SmartMenus,{hideAll:function(){$.each(menuTrees,function(){this.menuHideAll()})},destroy:function(){for(;menuTrees.length;)menuTrees[0].destroy();initMouseDetection(!0)},prototype:{init:function(t){var e=this;if(!t){menuTrees.push(this),this.rootId=((new Date).getTime()+Math.random()+"").replace(/\D/g,""),this.accessIdPrefix="sm-"+this.rootId+"-",this.$root.hasClass("sm-rtl")&&(this.opts.rightToLeftSubMenus=!0);var i=".smartmenus";this.$root.data("smartmenus",this).attr("data-smartmenus-id",this.rootId).dataSM("level",1).on(getEventsNS({"mouseover focusin":$.proxy(this.rootOver,this),"mouseout focusout":$.proxy(this.rootOut,this),keydown:$.proxy(this.rootKeyDown,this)},i)).on(getEventsNS({mouseenter:$.proxy(this.itemEnter,this),mouseleave:$.proxy(this.itemLeave,this),mousedown:$.proxy(this.itemDown,this),focus:$.proxy(this.itemFocus,this),blur:$.proxy(this.itemBlur,this),click:$.proxy(this.itemClick,this)},i),"a"),i+=this.rootId,this.opts.hideOnClick&&$(document).on(getEventsNS({touchstart:$.proxy(this.docTouchStart,this),touchmove:$.proxy(this.docTouchMove,this),touchend:$.proxy(this.docTouchEnd,this),click:$.proxy(this.docClick,this)},i)),$(window).on(getEventsNS({"resize orientationchange":$.proxy(this.winResize,this)},i)),this.opts.subIndicators&&(this.$subArrow=$("").addClass("sub-arrow"),this.opts.subIndicatorsText&&this.$subArrow.html(this.opts.subIndicatorsText)),initMouseDetection()}if(this.$firstSub=this.$root.find("ul").each(function(){e.menuInit($(this))}).eq(0),this.$firstLink=this.$root.find("a").eq(0),this.opts.markCurrentItem){var s=/(index|default)\.[^#\?\/]*/i,o=/#.*/,a=window.location.href.replace(s,""),n=a.replace(o,"");this.$root.find("a").each(function(){var t=this.href.replace(s,""),i=$(this);(t==a||t==n)&&(i.addClass("current"),e.opts.markCurrentTree&&i.parentsUntil("[data-smartmenus-id]","ul").each(function(){$(this).dataSM("parent-a").addClass("current")}))})}this.wasCollapsible=this.isCollapsible()},destroy:function(t){if(!t){var e=".smartmenus";this.$root.removeData("smartmenus").removeAttr("data-smartmenus-id").removeDataSM("level").off(e),e+=this.rootId,$(document).off(e),$(window).off(e),this.opts.subIndicators&&(this.$subArrow=null)}this.menuHideAll();var i=this;this.$root.find("ul").each(function(){var t=$(this);t.dataSM("scroll-arrows")&&t.dataSM("scroll-arrows").remove(),t.dataSM("shown-before")&&((i.opts.subMenusMinWidth||i.opts.subMenusMaxWidth)&&t.css({width:"",minWidth:"",maxWidth:""}).removeClass("sm-nowrap"),t.dataSM("scroll-arrows")&&t.dataSM("scroll-arrows").remove(),t.css({zIndex:"",top:"",left:"",marginLeft:"",marginTop:"",display:""})),0==(t.attr("id")||"").indexOf(i.accessIdPrefix)&&t.removeAttr("id")}).removeDataSM("in-mega").removeDataSM("shown-before").removeDataSM("scroll-arrows").removeDataSM("parent-a").removeDataSM("level").removeDataSM("beforefirstshowfired").removeAttr("role").removeAttr("aria-hidden").removeAttr("aria-labelledby").removeAttr("aria-expanded"),this.$root.find("a.has-submenu").each(function(){var t=$(this);0==t.attr("id").indexOf(i.accessIdPrefix)&&t.removeAttr("id")}).removeClass("has-submenu").removeDataSM("sub").removeAttr("aria-haspopup").removeAttr("aria-controls").removeAttr("aria-expanded").closest("li").removeDataSM("sub"),this.opts.subIndicators&&this.$root.find("span.sub-arrow").remove(),this.opts.markCurrentItem&&this.$root.find("a.current").removeClass("current"),t||(this.$root=null,this.$firstLink=null,this.$firstSub=null,this.$disableOverlay&&(this.$disableOverlay.remove(),this.$disableOverlay=null),menuTrees.splice($.inArray(this,menuTrees),1))},disable:function(t){if(!this.disabled){if(this.menuHideAll(),!t&&!this.opts.isPopup&&this.$root.is(":visible")){var e=this.$root.offset();this.$disableOverlay=$('
').css({position:"absolute",top:e.top,left:e.left,width:this.$root.outerWidth(),height:this.$root.outerHeight(),zIndex:this.getStartZIndex(!0),opacity:0}).appendTo(document.body)}this.disabled=!0}},docClick:function(t){return this.$touchScrollingSub?(this.$touchScrollingSub=null,void 0):((this.visibleSubMenus.length&&!$.contains(this.$root[0],t.target)||$(t.target).closest("a").length)&&this.menuHideAll(),void 0)},docTouchEnd:function(){if(this.lastTouch){if(!(!this.visibleSubMenus.length||void 0!==this.lastTouch.x2&&this.lastTouch.x1!=this.lastTouch.x2||void 0!==this.lastTouch.y2&&this.lastTouch.y1!=this.lastTouch.y2||this.lastTouch.target&&$.contains(this.$root[0],this.lastTouch.target))){this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0);var t=this;this.hideTimeout=setTimeout(function(){t.menuHideAll()},350)}this.lastTouch=null}},docTouchMove:function(t){if(this.lastTouch){var e=t.originalEvent.touches[0];this.lastTouch.x2=e.pageX,this.lastTouch.y2=e.pageY}},docTouchStart:function(t){var e=t.originalEvent.touches[0];this.lastTouch={x1:e.pageX,y1:e.pageY,target:e.target}},enable:function(){this.disabled&&(this.$disableOverlay&&(this.$disableOverlay.remove(),this.$disableOverlay=null),this.disabled=!1)},getClosestMenu:function(t){for(var e=$(t).closest("ul");e.dataSM("in-mega");)e=e.parent().closest("ul");return e[0]||null},getHeight:function(t){return this.getOffset(t,!0)},getOffset:function(t,e){var i;"none"==t.css("display")&&(i={position:t[0].style.position,visibility:t[0].style.visibility},t.css({position:"absolute",visibility:"hidden"}).show());var s=t[0].getBoundingClientRect&&t[0].getBoundingClientRect(),o=s&&(e?s.height||s.bottom-s.top:s.width||s.right-s.left);return o||0===o||(o=e?t[0].offsetHeight:t[0].offsetWidth),i&&t.hide().css(i),o},getStartZIndex:function(t){var e=parseInt(this[t?"$root":"$firstSub"].css("z-index"));return!t&&isNaN(e)&&(e=parseInt(this.$root.css("z-index"))),isNaN(e)?1:e},getTouchPoint:function(t){return t.touches&&t.touches[0]||t.changedTouches&&t.changedTouches[0]||t},getViewport:function(t){var e=t?"Height":"Width",i=document.documentElement["client"+e],s=window["inner"+e];return s&&(i=Math.min(i,s)),i},getViewportHeight:function(){return this.getViewport(!0)},getViewportWidth:function(){return this.getViewport()},getWidth:function(t){return this.getOffset(t)},handleEvents:function(){return!this.disabled&&this.isCSSOn()},handleItemEvents:function(t){return this.handleEvents()&&!this.isLinkInMegaMenu(t)},isCollapsible:function(){return"static"==this.$firstSub.css("position")},isCSSOn:function(){return"inline"!=this.$firstLink.css("display")},isFixed:function(){var t="fixed"==this.$root.css("position");return t||this.$root.parentsUntil("body").each(function(){return"fixed"==$(this).css("position")?(t=!0,!1):void 0}),t},isLinkInMegaMenu:function(t){return $(this.getClosestMenu(t[0])).hasClass("mega-menu")},isTouchMode:function(){return!mouse||this.opts.noMouseOver||this.isCollapsible()},itemActivate:function(t,e){var i=t.closest("ul"),s=i.dataSM("level");if(s>1&&(!this.activatedItems[s-2]||this.activatedItems[s-2][0]!=i.dataSM("parent-a")[0])){var o=this;$(i.parentsUntil("[data-smartmenus-id]","ul").get().reverse()).add(i).each(function(){o.itemActivate($(this).dataSM("parent-a"))})}if((!this.isCollapsible()||e)&&this.menuHideSubMenus(this.activatedItems[s-1]&&this.activatedItems[s-1][0]==t[0]?s:s-1),this.activatedItems[s-1]=t,this.$root.triggerHandler("activate.smapi",t[0])!==!1){var a=t.dataSM("sub");a&&(this.isTouchMode()||!this.opts.showOnClick||this.clickActivated)&&this.menuShow(a)}},itemBlur:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&this.$root.triggerHandler("blur.smapi",e[0])},itemClick:function(t){var e=$(t.currentTarget);if(this.handleItemEvents(e)){if(this.$touchScrollingSub&&this.$touchScrollingSub[0]==e.closest("ul")[0])return this.$touchScrollingSub=null,t.stopPropagation(),!1;if(this.$root.triggerHandler("click.smapi",e[0])===!1)return!1;var i=$(t.target).is(".sub-arrow"),s=e.dataSM("sub"),o=s?2==s.dataSM("level"):!1,a=this.isCollapsible(),n=/toggle$/.test(this.opts.collapsibleBehavior),r=/link$/.test(this.opts.collapsibleBehavior),h=/^accordion/.test(this.opts.collapsibleBehavior);if(s&&!s.is(":visible")){if((!r||!a||i)&&(this.opts.showOnClick&&o&&(this.clickActivated=!0),this.itemActivate(e,h),s.is(":visible")))return this.focusActivated=!0,!1}else if(a&&(n||i))return this.itemActivate(e,h),this.menuHide(s),n&&(this.focusActivated=!1),!1;return this.opts.showOnClick&&o||e.hasClass("disabled")||this.$root.triggerHandler("select.smapi",e[0])===!1?!1:void 0}},itemDown:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&e.dataSM("mousedown",!0)},itemEnter:function(t){var e=$(t.currentTarget);if(this.handleItemEvents(e)){if(!this.isTouchMode()){this.showTimeout&&(clearTimeout(this.showTimeout),this.showTimeout=0);var i=this;this.showTimeout=setTimeout(function(){i.itemActivate(e)},this.opts.showOnClick&&1==e.closest("ul").dataSM("level")?1:this.opts.showTimeout)}this.$root.triggerHandler("mouseenter.smapi",e[0])}},itemFocus:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&(!this.focusActivated||this.isTouchMode()&&e.dataSM("mousedown")||this.activatedItems.length&&this.activatedItems[this.activatedItems.length-1][0]==e[0]||this.itemActivate(e,!0),this.$root.triggerHandler("focus.smapi",e[0]))},itemLeave:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&(this.isTouchMode()||(e[0].blur(),this.showTimeout&&(clearTimeout(this.showTimeout),this.showTimeout=0)),e.removeDataSM("mousedown"),this.$root.triggerHandler("mouseleave.smapi",e[0]))},menuHide:function(t){if(this.$root.triggerHandler("beforehide.smapi",t[0])!==!1&&(canAnimate&&t.stop(!0,!0),"none"!=t.css("display"))){var e=function(){t.css("z-index","")};this.isCollapsible()?canAnimate&&this.opts.collapsibleHideFunction?this.opts.collapsibleHideFunction.call(this,t,e):t.hide(this.opts.collapsibleHideDuration,e):canAnimate&&this.opts.hideFunction?this.opts.hideFunction.call(this,t,e):t.hide(this.opts.hideDuration,e),t.dataSM("scroll")&&(this.menuScrollStop(t),t.css({"touch-action":"","-ms-touch-action":"","-webkit-transform":"",transform:""}).off(".smartmenus_scroll").removeDataSM("scroll").dataSM("scroll-arrows").hide()),t.dataSM("parent-a").removeClass("highlighted").attr("aria-expanded","false"),t.attr({"aria-expanded":"false","aria-hidden":"true"});var i=t.dataSM("level");this.activatedItems.splice(i-1,1),this.visibleSubMenus.splice($.inArray(t,this.visibleSubMenus),1),this.$root.triggerHandler("hide.smapi",t[0])}},menuHideAll:function(){this.showTimeout&&(clearTimeout(this.showTimeout),this.showTimeout=0);for(var t=this.opts.isPopup?1:0,e=this.visibleSubMenus.length-1;e>=t;e--)this.menuHide(this.visibleSubMenus[e]);this.opts.isPopup&&(canAnimate&&this.$root.stop(!0,!0),this.$root.is(":visible")&&(canAnimate&&this.opts.hideFunction?this.opts.hideFunction.call(this,this.$root):this.$root.hide(this.opts.hideDuration))),this.activatedItems=[],this.visibleSubMenus=[],this.clickActivated=!1,this.focusActivated=!1,this.zIndexInc=0,this.$root.triggerHandler("hideAll.smapi")},menuHideSubMenus:function(t){for(var e=this.activatedItems.length-1;e>=t;e--){var i=this.activatedItems[e].dataSM("sub");i&&this.menuHide(i)}},menuInit:function(t){if(!t.dataSM("in-mega")){t.hasClass("mega-menu")&&t.find("ul").dataSM("in-mega",!0);for(var e=2,i=t[0];(i=i.parentNode.parentNode)!=this.$root[0];)e++;var s=t.prevAll("a").eq(-1);s.length||(s=t.prevAll().find("a").eq(-1)),s.addClass("has-submenu").dataSM("sub",t),t.dataSM("parent-a",s).dataSM("level",e).parent().dataSM("sub",t);var o=s.attr("id")||this.accessIdPrefix+ ++this.idInc,a=t.attr("id")||this.accessIdPrefix+ ++this.idInc;s.attr({id:o,"aria-haspopup":"true","aria-controls":a,"aria-expanded":"false"}),t.attr({id:a,role:"group","aria-hidden":"true","aria-labelledby":o,"aria-expanded":"false"}),this.opts.subIndicators&&s[this.opts.subIndicatorsPos](this.$subArrow.clone())}},menuPosition:function(t){var e,i,s=t.dataSM("parent-a"),o=s.closest("li"),a=o.parent(),n=t.dataSM("level"),r=this.getWidth(t),h=this.getHeight(t),u=s.offset(),l=u.left,c=u.top,d=this.getWidth(s),m=this.getHeight(s),p=$(window),f=p.scrollLeft(),v=p.scrollTop(),b=this.getViewportWidth(),S=this.getViewportHeight(),g=a.parent().is("[data-sm-horizontal-sub]")||2==n&&!a.hasClass("sm-vertical"),M=this.opts.rightToLeftSubMenus&&!o.is("[data-sm-reverse]")||!this.opts.rightToLeftSubMenus&&o.is("[data-sm-reverse]"),w=2==n?this.opts.mainMenuSubOffsetX:this.opts.subMenusSubOffsetX,T=2==n?this.opts.mainMenuSubOffsetY:this.opts.subMenusSubOffsetY;if(g?(e=M?d-r-w:w,i=this.opts.bottomToTopSubMenus?-h-T:m+T):(e=M?w-r:d-w,i=this.opts.bottomToTopSubMenus?m-T-h:T),this.opts.keepInViewport){var y=l+e,I=c+i;if(M&&f>y?e=g?f-y+e:d-w:!M&&y+r>f+b&&(e=g?f+b-r-y+e:w-r),g||(S>h&&I+h>v+S?i+=v+S-h-I:(h>=S||v>I)&&(i+=v-I)),g&&(I+h>v+S+.49||v>I)||!g&&h>S+.49){var x=this;t.dataSM("scroll-arrows")||t.dataSM("scroll-arrows",$([$('')[0],$('')[0]]).on({mouseenter:function(){t.dataSM("scroll").up=$(this).hasClass("scroll-up"),x.menuScroll(t)},mouseleave:function(e){x.menuScrollStop(t),x.menuScrollOut(t,e)},"mousewheel DOMMouseScroll":function(t){t.preventDefault()}}).insertAfter(t));var A=".smartmenus_scroll";if(t.dataSM("scroll",{y:this.cssTransforms3d?0:i-m,step:1,itemH:m,subH:h,arrowDownH:this.getHeight(t.dataSM("scroll-arrows").eq(1))}).on(getEventsNS({mouseover:function(e){x.menuScrollOver(t,e)},mouseout:function(e){x.menuScrollOut(t,e)},"mousewheel DOMMouseScroll":function(e){x.menuScrollMousewheel(t,e)}},A)).dataSM("scroll-arrows").css({top:"auto",left:"0",marginLeft:e+(parseInt(t.css("border-left-width"))||0),width:r-(parseInt(t.css("border-left-width"))||0)-(parseInt(t.css("border-right-width"))||0),zIndex:t.css("z-index")}).eq(g&&this.opts.bottomToTopSubMenus?0:1).show(),this.isFixed()){var C={};C[touchEvents?"touchstart touchmove touchend":"pointerdown pointermove pointerup MSPointerDown MSPointerMove MSPointerUp"]=function(e){x.menuScrollTouch(t,e)},t.css({"touch-action":"none","-ms-touch-action":"none"}).on(getEventsNS(C,A))}}}t.css({top:"auto",left:"0",marginLeft:e,marginTop:i-m})},menuScroll:function(t,e,i){var s,o=t.dataSM("scroll"),a=t.dataSM("scroll-arrows"),n=o.up?o.upEnd:o.downEnd;if(!e&&o.momentum){if(o.momentum*=.92,s=o.momentum,.5>s)return this.menuScrollStop(t),void 0}else s=i||(e||!this.opts.scrollAccelerate?this.opts.scrollStep:Math.floor(o.step));var r=t.dataSM("level");if(this.activatedItems[r-1]&&this.activatedItems[r-1].dataSM("sub")&&this.activatedItems[r-1].dataSM("sub").is(":visible")&&this.menuHideSubMenus(r-1),o.y=o.up&&o.y>=n||!o.up&&n>=o.y?o.y:Math.abs(n-o.y)>s?o.y+(o.up?s:-s):n,t.css(this.cssTransforms3d?{"-webkit-transform":"translate3d(0, "+o.y+"px, 0)",transform:"translate3d(0, "+o.y+"px, 0)"}:{marginTop:o.y}),mouse&&(o.up&&o.y>o.downEnd||!o.up&&o.y0;t.dataSM("scroll-arrows").eq(i?0:1).is(":visible")&&(t.dataSM("scroll").up=i,this.menuScroll(t,!0))}e.preventDefault()},menuScrollOut:function(t,e){mouse&&(/^scroll-(up|down)/.test((e.relatedTarget||"").className)||(t[0]==e.relatedTarget||$.contains(t[0],e.relatedTarget))&&this.getClosestMenu(e.relatedTarget)==t[0]||t.dataSM("scroll-arrows").css("visibility","hidden"))},menuScrollOver:function(t,e){if(mouse&&!/^scroll-(up|down)/.test(e.target.className)&&this.getClosestMenu(e.target)==t[0]){this.menuScrollRefreshData(t);var i=t.dataSM("scroll"),s=$(window).scrollTop()-t.dataSM("parent-a").offset().top-i.itemH;t.dataSM("scroll-arrows").eq(0).css("margin-top",s).end().eq(1).css("margin-top",s+this.getViewportHeight()-i.arrowDownH).end().css("visibility","visible")}},menuScrollRefreshData:function(t){var e=t.dataSM("scroll"),i=$(window).scrollTop()-t.dataSM("parent-a").offset().top-e.itemH;this.cssTransforms3d&&(i=-(parseFloat(t.css("margin-top"))-i)),$.extend(e,{upEnd:i,downEnd:i+this.getViewportHeight()-e.subH})},menuScrollStop:function(t){return this.scrollTimeout?(cancelAnimationFrame(this.scrollTimeout),this.scrollTimeout=0,t.dataSM("scroll").step=1,!0):void 0},menuScrollTouch:function(t,e){if(e=e.originalEvent,isTouchEvent(e)){var i=this.getTouchPoint(e);if(this.getClosestMenu(i.target)==t[0]){var s=t.dataSM("scroll");if(/(start|down)$/i.test(e.type))this.menuScrollStop(t)?(e.preventDefault(),this.$touchScrollingSub=t):this.$touchScrollingSub=null,this.menuScrollRefreshData(t),$.extend(s,{touchStartY:i.pageY,touchStartTime:e.timeStamp});else if(/move$/i.test(e.type)){var o=void 0!==s.touchY?s.touchY:s.touchStartY;if(void 0!==o&&o!=i.pageY){this.$touchScrollingSub=t;var a=i.pageY>o;void 0!==s.up&&s.up!=a&&$.extend(s,{touchStartY:i.pageY,touchStartTime:e.timeStamp}),$.extend(s,{up:a,touchY:i.pageY}),this.menuScroll(t,!0,Math.abs(i.pageY-o))}e.preventDefault()}else void 0!==s.touchY&&((s.momentum=15*Math.pow(Math.abs(i.pageY-s.touchStartY)/(e.timeStamp-s.touchStartTime),2))&&(this.menuScrollStop(t),this.menuScroll(t),e.preventDefault()),delete s.touchY)}}},menuShow:function(t){if((t.dataSM("beforefirstshowfired")||(t.dataSM("beforefirstshowfired",!0),this.$root.triggerHandler("beforefirstshow.smapi",t[0])!==!1))&&this.$root.triggerHandler("beforeshow.smapi",t[0])!==!1&&(t.dataSM("shown-before",!0),canAnimate&&t.stop(!0,!0),!t.is(":visible"))){var e=t.dataSM("parent-a"),i=this.isCollapsible();if((this.opts.keepHighlighted||i)&&e.addClass("highlighted"),i)t.removeClass("sm-nowrap").css({zIndex:"",width:"auto",minWidth:"",maxWidth:"",top:"",left:"",marginLeft:"",marginTop:""});else{if(t.css("z-index",this.zIndexInc=(this.zIndexInc||this.getStartZIndex())+1),(this.opts.subMenusMinWidth||this.opts.subMenusMaxWidth)&&(t.css({width:"auto",minWidth:"",maxWidth:""}).addClass("sm-nowrap"),this.opts.subMenusMinWidth&&t.css("min-width",this.opts.subMenusMinWidth),this.opts.subMenusMaxWidth)){var s=this.getWidth(t);t.css("max-width",this.opts.subMenusMaxWidth),s>this.getWidth(t)&&t.removeClass("sm-nowrap").css("width",this.opts.subMenusMaxWidth)}this.menuPosition(t)}var o=function(){t.css("overflow","")};i?canAnimate&&this.opts.collapsibleShowFunction?this.opts.collapsibleShowFunction.call(this,t,o):t.show(this.opts.collapsibleShowDuration,o):canAnimate&&this.opts.showFunction?this.opts.showFunction.call(this,t,o):t.show(this.opts.showDuration,o),e.attr("aria-expanded","true"),t.attr({"aria-expanded":"true","aria-hidden":"false"}),this.visibleSubMenus.push(t),this.$root.triggerHandler("show.smapi",t[0])}},popupHide:function(t){this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0);var e=this;this.hideTimeout=setTimeout(function(){e.menuHideAll()},t?1:this.opts.hideTimeout)},popupShow:function(t,e){if(!this.opts.isPopup)return alert('SmartMenus jQuery Error:\n\nIf you want to show this menu via the "popupShow" method, set the isPopup:true option.'),void 0;if(this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0),this.$root.dataSM("shown-before",!0),canAnimate&&this.$root.stop(!0,!0),!this.$root.is(":visible")){this.$root.css({left:t,top:e});var i=this,s=function(){i.$root.css("overflow","")};canAnimate&&this.opts.showFunction?this.opts.showFunction.call(this,this.$root,s):this.$root.show(this.opts.showDuration,s),this.visibleSubMenus[0]=this.$root}},refresh:function(){this.destroy(!0),this.init(!0)},rootKeyDown:function(t){if(this.handleEvents())switch(t.keyCode){case 27:var e=this.activatedItems[0];if(e){this.menuHideAll(),e[0].focus();var i=e.dataSM("sub");i&&this.menuHide(i)}break;case 32:var s=$(t.target);if(s.is("a")&&this.handleItemEvents(s)){var i=s.dataSM("sub");i&&!i.is(":visible")&&(this.itemClick({currentTarget:t.target}),t.preventDefault())}}},rootOut:function(t){if(this.handleEvents()&&!this.isTouchMode()&&t.target!=this.$root[0]&&(this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0),!this.opts.showOnClick||!this.opts.hideOnClick)){var e=this;this.hideTimeout=setTimeout(function(){e.menuHideAll()},this.opts.hideTimeout)}},rootOver:function(t){this.handleEvents()&&!this.isTouchMode()&&t.target!=this.$root[0]&&this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0)},winResize:function(t){if(this.handleEvents()){if(!("onorientationchange"in window)||"orientationchange"==t.type){var e=this.isCollapsible();this.wasCollapsible&&e||(this.activatedItems.length&&this.activatedItems[this.activatedItems.length-1][0].blur(),this.menuHideAll()),this.wasCollapsible=e}}else if(this.$disableOverlay){var i=this.$root.offset();this.$disableOverlay.css({top:i.top,left:i.left,width:this.$root.outerWidth(),height:this.$root.outerHeight()})}}}}),$.fn.dataSM=function(t,e){return e?this.data(t+"_smartmenus",e):this.data(t+"_smartmenus")},$.fn.removeDataSM=function(t){return this.removeData(t+"_smartmenus")},$.fn.smartmenus=function(options){if("string"==typeof options){var args=arguments,method=options;return Array.prototype.shift.call(args),this.each(function(){var t=$(this).data("smartmenus");t&&t[method]&&t[method].apply(t,args)})}return this.each(function(){var dataOpts=$(this).data("sm-options")||null;if(dataOpts)try{dataOpts=eval("("+dataOpts+")")}catch(e){dataOpts=null,alert('ERROR\n\nSmartMenus jQuery init:\nInvalid "data-sm-options" attribute value syntax.')}new $.SmartMenus(this,$.extend({},$.fn.smartmenus.defaults,options,dataOpts))})},$.fn.smartmenus.defaults={isPopup:!1,mainMenuSubOffsetX:0,mainMenuSubOffsetY:0,subMenusSubOffsetX:0,subMenusSubOffsetY:0,subMenusMinWidth:"10em",subMenusMaxWidth:"20em",subIndicators:!0,subIndicatorsPos:"append",subIndicatorsText:"",scrollStep:30,scrollAccelerate:!0,showTimeout:250,hideTimeout:500,showDuration:0,showFunction:null,hideDuration:0,hideFunction:function(t,e){t.fadeOut(200,e)},collapsibleShowDuration:0,collapsibleShowFunction:function(t,e){t.slideDown(200,e)},collapsibleHideDuration:0,collapsibleHideFunction:function(t,e){t.slideUp(200,e)},showOnClick:!1,hideOnClick:!0,noMouseOver:!1,keepInViewport:!0,keepHighlighted:!0,markCurrentItem:!1,markCurrentTree:!0,rightToLeftSubMenus:!1,bottomToTopSubMenus:!1,collapsibleBehavior:"default"},$}); \ No newline at end of file diff --git a/docs/html/llm__client_8py.html b/docs/html/llm__client_8py.html new file mode 100644 index 0000000..c970d46 --- /dev/null +++ b/docs/html/llm__client_8py.html @@ -0,0 +1,146 @@ + + + + + + + + + + + + + + + + + + +penify-cli: /tmp/github_reposRepoArchDocGenContext/Penify-dev/penify-cli/penify_hook/llm_client.py File Reference + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
penify-cli +
+
+
+ + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+ +
llm_client.py File Reference
+
+
+ + + + +

+Classes

class  penify_hook.llm_client.LLMClient
 
+ + + + + +

+Namespaces

namespace  penify_hook
 
namespace  penify_hook.llm_client
 
+
+
+ + + + + diff --git a/docs/html/llm__client_8py.js b/docs/html/llm__client_8py.js new file mode 100644 index 0000000..afd0616 --- /dev/null +++ b/docs/html/llm__client_8py.js @@ -0,0 +1,4 @@ +var llm__client_8py = +[ + [ "penify_hook.llm_client.LLMClient", "classpenify__hook_1_1llm__client_1_1LLMClient.html", "classpenify__hook_1_1llm__client_1_1LLMClient" ] +]; \ No newline at end of file diff --git a/docs/html/login__command_8py.html b/docs/html/login__command_8py.html new file mode 100644 index 0000000..04a9bab --- /dev/null +++ b/docs/html/login__command_8py.html @@ -0,0 +1,148 @@ + + + + + + + + + + + + + + + + + + +penify-cli: /tmp/github_reposRepoArchDocGenContext/Penify-dev/penify-cli/penify_hook/login_command.py File Reference + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
penify-cli +
+
+
+ + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+ +
login_command.py File Reference
+
+
+ + + + + + +

+Namespaces

namespace  penify_hook
 
namespace  penify_hook.login_command
 
+ + + + + +

+Functions

def penify_hook.login_command.setup_login_parser (parser)
 
def penify_hook.login_command.handle_login (args)
 
+
+
+ + + + + diff --git a/docs/html/login__command_8py.js b/docs/html/login__command_8py.js new file mode 100644 index 0000000..7ce13bc --- /dev/null +++ b/docs/html/login__command_8py.js @@ -0,0 +1,5 @@ +var login__command_8py = +[ + [ "handle_login", "login__command_8py.html#ae4bf932fbafeff834b0a0c5a37f74ccd", null ], + [ "setup_login_parser", "login__command_8py.html#aae63db4c484797bead34b7d874020c6a", null ] +]; \ No newline at end of file diff --git a/docs/html/main_8py.html b/docs/html/main_8py.html new file mode 100644 index 0000000..cbb866f --- /dev/null +++ b/docs/html/main_8py.html @@ -0,0 +1,146 @@ + + + + + + + + + + + + + + + + + + +penify-cli: /tmp/github_reposRepoArchDocGenContext/Penify-dev/penify-cli/penify_hook/main.py File Reference + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
penify-cli +
+
+
+ + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+ +
main.py File Reference
+
+
+ + + + + + +

+Namespaces

namespace  penify_hook
 
namespace  penify_hook.main
 
+ + + +

+Functions

def penify_hook.main.main ()
 
+
+
+ + + + + diff --git a/docs/html/main_8py.js b/docs/html/main_8py.js new file mode 100644 index 0000000..6150b32 --- /dev/null +++ b/docs/html/main_8py.js @@ -0,0 +1,4 @@ +var main_8py = +[ + [ "main", "main_8py.html#a16838b20df4bd14ee4b5e1dd2906738f", null ] +]; \ No newline at end of file diff --git a/docs/html/md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_README.html b/docs/html/md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_README.html new file mode 100644 index 0000000..d0a3813 --- /dev/null +++ b/docs/html/md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_README.html @@ -0,0 +1,244 @@ + + + + + + + + + + + + + + + + + + +penify-cli: Penify CLI Tool + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
penify-cli +
+
+
+ + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
Penify CLI Tool
+
+
+

Tests Coverage

+

A CLI tool to generate smart commit messages, code documentation, and more.

+

+Features

+
    +
  • Automatically generate documentation for your code
  • +
  • Support for multiple programming languages
  • +
  • Git hook integration for automatic documentation on commits
  • +
  • Folder and file analysis
  • +
+

+Installation

+

Install from PyPI:

+
pip install penify
+

+Usage

+

Penify CLI provides several subcommands for different functionalities, organized into basic commands (no login required) and advanced commands (login required).

+

+Basic Commands (No login required)

+

+Commit

+

Generate smart commit messages using local LLM:

+
penify commit [-m "Optional message"] [-e] [-d]
+

Options:

    +
  • -m, --message: Optional custom commit message
  • +
  • -e, --terminal: Open editor to modify commit message before committing
  • +
  • -d, --description: Generate commit message with both title and description (without this flag, only title is generated)
  • +
+

+Config

+

Configure local LLM and JIRA settings:

+
# Configure LLM settings
+
penify config llm --model MODEL_NAME [--api-base API_URL] [--api-key API_KEY]
+
+
# Configure LLM settings through web interface
+
penify config llm-web
+
+
# Configure JIRA settings
+
penify config jira --url JIRA_URL --username USERNAME --api-token TOKEN [--verify]
+
+
# Configure JIRA settings through web interface
+
penify config jira-web
+

+Advanced Commands (Login required)

+

+Login

+

To log in and obtain an API token:

+
penify login
+

This command will open a browser window for authentication. After successful login, the API key will be saved locally for future use.

+

+Documentation Generation

+

Generate documentation for Git diff, files or folders:

+
# Generate documentation for latest Git commit diff
+
penify docgen
+
+
# Generate documentation for specific file or folder
+
penify docgen -l /path/to/file/or/folder
+

Options:

    +
  • -l, --location: Path to specific file or folder for documentation generation (defaults to current directory)
  • +
+

+Git Hook Management

+

Install or uninstall Git post-commit hooks:

+
# Install Git hook
+
penify docgen install-hook [-l /path/to/repo]
+
+
# Uninstall Git hook
+
penify docgen uninstall-hook [-l /path/to/repo]
+

Options:

    +
  • -l, --location: Path to the Git repository (defaults to current directory)
  • +
+

+Authentication

+

Penify CLI uses an API token for authentication with advanced features.

+

If no token is available and you try to access an advanced feature, you'll be prompted to log in.

+

+Local LLM Configuration

+

For commit message generation, Penify can use a local LLM. Configure it using:

+
penify config llm --model MODEL_NAME --api-base API_URL --api-key API_KEY
+

Common configurations:

+

+JIRA Integration

+

Configure JIRA integration to enhance commit messages with issue details:

+
penify config jira --url https://your-domain.atlassian.net --username your-email@example.com --api-token YOUR_API_TOKEN
+

+Development

+

To set up the development environment:

+
    +
  1. Clone the repository:
    git clone https://github.com/SingularityX-ai/penify-cli.git
    +
  2. +
  3. Install the package in editable mode:
    pip install -e .
    +
  4. +
+

+Running Tests

+
pytest
+

+License

+

This project is licensed under the MIT License.

+

+Author

+

Suman Saurabh (ss.su.nosp@m.mans.nosp@m.aurab.nosp@m.h92@.nosp@m.gmail.nosp@m..com)

+

+Contributing

+

Contributions are welcome! Please feel free to submit a Pull Request.

+

+Issues

+

If you encounter any problems or have suggestions, please file an issue on the GitHub repository.

+

+Support

+

For automated API Documentation, Architecture Documentation, Code Documentation, Pull Request Documentation, or if you need a demo, please join our Discord support channel.

+
+
+
+ + + + + diff --git a/docs/html/md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_commit_commands.html b/docs/html/md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_commit_commands.html new file mode 100644 index 0000000..0412cf9 --- /dev/null +++ b/docs/html/md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_commit_commands.html @@ -0,0 +1,255 @@ + + + + + + + + + + + + + + + + + + +penify-cli: Penify CLI - Commit Commands + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
penify-cli +
+
+
+ + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
Penify CLI - Commit Commands
+
+
+

The commit command allows you to generate smart, AI-powered commit messages for your Git changes. This document explains all available options and combinations.

+

+Basic Usage

+
penify commit
+

By default, this command:

    +
  • Analyzes your staged Git changes
  • +
  • Generates a concise commit title only
  • +
  • Uses local LLM if configured, or falls back to Penify API
  • +
+

+Command Options

+

+<tt>-m, --message</tt>

+

Provide context for the commit message generation:

+
penify commit -m "Fix login flow"
+

This hint helps the AI understand your intention and improves the quality of the generated message.

+

+<tt>-e, --terminal</tt>

+

Open an editor to review and edit the generated commit message before committing:

+
penify commit -e
+

This opens your default Git editor with the generated message for review.

+

+<tt>-d, --description</tt>

+

Generate a detailed commit message with both title and description:

+
penify commit -d
+

Without this flag, only the commit title is generated.

+

+Option Combinations

+

You can combine these options for different workflows:

+

+Generate Title Only with Context

+
penify commit -m "Update login UI"
+

+Generate Title and Description with Context

+
penify commit -m "Update login UI" -d
+

+Generate and Edit Full Commit Message

+
penify commit -d -e
+

+Generate, Edit, and Provide Context

+
penify commit -m "Refactor authentication" -d -e
+

+LLM and JIRA Integration

+

+Using Local LLM

+

If you've configured a local LLM using penify config llm, the commit command will automatically use it for message generation.

+

Benefits:

    +
  • Privacy: your code changes don't leave your machine
  • +
  • Speed: no network latency
  • +
  • Works offline
  • +
+

+JIRA Enhancement

+

If you've configured JIRA integration using penify config jira, the commit command will:

+
    +
  1. Detect JIRA issue references in your changes
  2. +
  3. Fetch issue details from your JIRA instance
  4. +
  5. Include issue information in the commit message
  6. +
  7. Format the commit message according to JIRA's smart commit format
  8. +
+

Example output:

PROJ-123: Fix authentication bug in login flow
+
+
- Updated OAuth token validation
+
- Fixed session timeout handling
+
- Added unit tests for edge cases
+
+
[PROJ-123]
+

+Configuration Requirements

+

For the commit command to work:

+
    +
  1. You must have configured either:
      +
    • Local LLM via penify config llm, OR
    • +
    • Logged in via penify login
    • +
    +
  2. +
  3. For JIRA enhancement (optional):
      +
    • Configure JIRA via penify config jira
    • +
    +
  4. +
+

+Examples

+

+Basic Commit with Default Settings

+
# Stage your changes
+
git add .
+
+
# Generate commit message
+
penify commit
+
+
# Commit with the generated message
+
git commit -m "Generated message here"
+

+Full Workflow with All Features

+
# Stage your changes
+
git add .
+
+
# Generate detailed commit message with JIRA integration,
+
# provide context, and open editor for review
+
penify commit -m "Fix login issue" -d -e
+
+
# The commit is automatically completed after you save and exit the editor
+

+Troubleshooting

+

+Common Issues

+
    +
  1. **"No LLM model or API token provided"**
      +
    • Run penify config llm to configure a local LLM, or
    • +
    • Run penify login to authenticate with Penify
    • +
    +
  2. +
  3. **"Failed to connect to JIRA"**
      +
    • Check your JIRA configuration with cat ~/.penify
    • +
    • Verify your network connection
    • +
    • Ensure your JIRA credentials are valid
    • +
    +
  4. +
  5. **"Error initializing LLM client"**
      +
    • Verify your LLM configuration settings
    • +
    • Ensure the LLM API is accessible
    • +
    +
  6. +
+
+
+
+ + + + + diff --git a/docs/html/md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_config_commands.html b/docs/html/md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_config_commands.html new file mode 100644 index 0000000..ee88fa5 --- /dev/null +++ b/docs/html/md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_config_commands.html @@ -0,0 +1,286 @@ + + + + + + + + + + + + + + + + + + +penify-cli: Penify CLI - Configuration Commands + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
penify-cli +
+
+
+ + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
Penify CLI - Configuration Commands
+
+
+

The config command allows you to set up and manage configuration settings for Penify CLI. This document explains all available configuration options and how to use them.

+

+Configuration Overview

+

Penify CLI stores configuration in a JSON file at ~/.penify/config.json. The configuration includes:

+
    +
  • LLM (Large Language Model) settings for local commit message generation
  • +
  • JIRA integration settings for enhanced commit messages
  • +
  • API tokens and other credentials
  • +
+

+Basic Usage

+
# Configure LLM settings
+
penify config llm
+
+
# Configure JIRA integration
+
penify config jira
+

+LLM Configuration

+

+Web Interface

+

Running penify config llm opens a web interface in your browser where you can configure:

+
    +
  1. Model: The LLM model to use (e.g., gpt-3.5-turbo)
  2. +
  3. API Base URL: The endpoint URL for your LLM API (e.g., https://api.openai.com/v1)
  4. +
  5. API Key: Your authentication key for the LLM API
  6. +
+

+Supported LLMs

+

Penify CLI supports various LLM providers:

+

+OpenAI

+ +

+Anthropic

+ +

+Ollama (Local)

+ +

+Azure OpenAI

+
    +
  • Model: Your deployed model name
  • +
  • API Base: Your Azure endpoint
  • +
  • API Key: Your Azure API key
  • +
+

+Configuration File Structure

+

After configuration, your ~/.penify/config.json will contain:

+
{
+
"llm": {
+
"model": "gpt-3.5-turbo",
+
"api_base": "https://api.openai.com/v1",
+
"api_key": "sk-..."
+
}
+
}
+

+JIRA Configuration

+

+Web Interface

+

Running penify config jira opens a web interface where you can configure:

+
    +
  1. JIRA URL: Your JIRA instance URL (e.g., https://yourcompany.atlassian.net)
  2. +
  3. Username: Your JIRA username (typically your email)
  4. +
  5. API Token: Your JIRA API token
  6. +
+

+Creating a JIRA API Token

+
    +
  1. Log in to https://id.atlassian.com/manage-profile/security/api-tokens
  2. +
  3. Click "Create API token"
  4. +
  5. Give it a name (e.g., "Penify CLI")
  6. +
  7. Copy the generated token and paste it into the configuration
  8. +
+

+Configuration File Structure

+

After configuration, your ~/.penify/config.json will contain:

+
{
+
"jira": {
+
"url": "https://yourcompany.atlassian.net",
+
"username": "your.email@example.com",
+
"api_token": "your-jira-api-token"
+
}
+
}
+

+Configuration Locations

+

Penify CLI looks for configuration in multiple locations:

+
    +
  1. Project-specific: .penify/config.json in the Git repository root
  2. +
  3. User-specific: ~/.penify/config.json in your home directory
  4. +
+

The project-specific configuration takes precedence if both exist.

+

+Environment Variables

+

You can override configuration settings using environment variables:

+
    +
  • PENIFY_API_TOKEN: Override the stored API token
  • +
  • PENIFY_LLM_MODEL: Override the configured LLM model
  • +
  • PENIFY_LLM_API_BASE: Override the configured LLM API base URL
  • +
  • PENIFY_LLM_API_KEY: Override the configured LLM API key
  • +
  • PENIFY_JIRA_URL: Override the configured JIRA URL
  • +
  • PENIFY_JIRA_USER: Override the configured JIRA username
  • +
  • PENIFY_JIRA_TOKEN: Override the configured JIRA API token
  • +
+

Example:

export PENIFY_LLM_MODEL="gpt-4"
+
penify commit
+

+Command-Line Configuration

+

For advanced users or scripting, you can directly edit the configuration file:

+
# View current configuration
+
cat ~/.penify/config.json
+
+
# Edit configuration with your preferred editor
+
nano ~/.penify/config.json
+

+Sharing Configuration

+

You can share configuration between machines by copying the .penify/config.json file. However, be cautious with API keys and credentials.

+

For team settings, consider:

    +
  1. Using a project-specific .penify/config.json with shared settings
  2. +
  3. Excluding API keys from shared configuration
  4. +
  5. Using environment variables for sensitive credentials
  6. +
+

+Troubleshooting

+

+Common Issues

+
    +
  1. **"Error reading configuration file"**
      +
    • Check if the file exists: ls -la ~/.penify
    • +
    • Ensure it contains valid JSON: cat ~/.penify/config.json
    • +
    +
  2. +
  3. **"Failed to connect to LLM API"**
      +
    • Verify API base URL and API key
    • +
    • Check network connectivity to the API endpoint
    • +
    • Ensure your account has access to the specified model
    • +
    +
  4. +
  5. **"Failed to connect to JIRA"**
      +
    • Check JIRA URL format (should include https://)
    • +
    • Verify username and API token
    • +
    • Ensure your JIRA account has API access permissions
    • +
    +
  6. +
+
+
+
+ + + + + diff --git a/docs/html/md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_detailed_usage.html b/docs/html/md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_detailed_usage.html new file mode 100644 index 0000000..8c48729 --- /dev/null +++ b/docs/html/md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_detailed_usage.html @@ -0,0 +1,280 @@ + + + + + + + + + + + + + + + + + + +penify-cli: Penify CLI - Detailed Usage Guide + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
penify-cli +
+
+
+ + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
Penify CLI - Detailed Usage Guide
+
+
+

This document provides in-depth information about all features and capabilities of the Penify CLI tool.

+

+Table of Contents

+
    +
  • Penify CLI - Detailed Usage Guide
      +
    • Table of Contents
    • +
    • Authentication
        +
      • Login Process
      • +
      • API Token Storage
      • +
      • Token Precedence
      • +
      +
    • +
    • Command Overview
    • +
    • Commit Message Generation
    • +
    • Code Documentation Generation
        +
      • Use Cases
      • +
      • Authentication Requirement
      • +
      +
    • +
    • Configuration Settings
    • +
    • Git Hooks
        +
      • Post-Commit Hook
      • +
      • Custom Hook Location
      • +
      +
    • +
    • Advanced Use Cases
        +
      • CI/CD Integration
      • +
      • Remote Repository Documentation
      • +
      +
    • +
    • Troubleshooting
        +
      • Common Issues
      • +
      • Logs
      • +
      • Support
      • +
      +
    • +
    +
  • +
+

+Authentication

+

+Login Process

+

When you run penify login, the tool:

+
    +
  1. Opens your default web browser
  2. +
  3. Redirects you to Penify's login page
  4. +
  5. Captures the authentication token after successful login
  6. +
  7. Saves the token in ~/.penify file
  8. +
+

+API Token Storage

+

API tokens are stored in your home directory in the .penify file. This JSON file contains:

+
{
+
"api_keys": "your-api-token",
+
"llm": { "model": "...", "api_base": "...", "api_key": "..." },
+
"jira": { "url": "...", "username": "...", "api_token": "..." }
+
}
+

+Token Precedence

+
    +
  1. Environment variable PENIFY_API_TOKEN (highest priority)
  2. +
  3. Token in ~/.penify file
  4. +
+

+Command Overview

+
penify
+
├── commit Generate smart commit messages
+
├── config Configure local LLM and JIRA
+
│ ├── llm Configure local LLM settings
+
│ └── jira Configure JIRA integration
+
├── login Log in to Penify account
+
└── docgen Generate code documentation
+
├── install-hook Install Git post-commit hook
+
└── uninstall-hook Remove Git post-commit hook
+

+Commit Message Generation

+

The commit command analyzes your staged changes and generates meaningful commit messages. It can:

+
    +
  • Use a local LLM if configured
  • +
  • Enhance messages with JIRA issue details
  • +
  • Provide both title and description
  • +
+

For specific options and examples, see docs/commit-commands.md.

+

+Code Documentation Generation

+

The docgen command generates documentation for your code:

+

+Use Cases

+
    +
  1. Current Git Diff: Default behavior, documents only changed files
  2. +
  3. Specific File: Pass a file path with -l path/to/file.py
  4. +
  5. Entire Folder: Pass a folder path with -l path/to/folder
  6. +
+

+Authentication Requirement

+

This feature requires authentication with a Penify account. Run penify login before using documentation features.

+

+Configuration Settings

+

Configure local settings using the config command:

+
    +
  • LLM Settings: Configure a local LLM for commit message generation
  • +
  • JIRA Settings: Set up JIRA integration for enhanced commit messages
  • +
+

For detailed configuration options, see docs/config-commands.md.

+

+Git Hooks

+

Penify can install Git hooks to automate documentation generation:

+

+Post-Commit Hook

+
    +
  • Install: penify docgen install-hook
  • +
  • What it does: Automatically generates documentation for changed files after each commit
  • +
  • Uninstall: penify docgen uninstall-hook
  • +
+

+Custom Hook Location

+

You can specify a custom location for Git hooks:

+
penify docgen install-hook -l /path/to/git/repo
+

+Advanced Use Cases

+

+CI/CD Integration

+

For CI/CD pipelines:

+
    +
  1. Set PENIFY_API_TOKEN as an environment variable
  2. +
  3. Run commands without requiring interactive login
  4. +
+

+Remote Repository Documentation

+

Generate documentation for an entire repository:

+
git clone https://github.com/user/repo
+
cd repo
+
penify docgen -l .
+

+Troubleshooting

+

+Common Issues

+
    +
  1. API Key Errors: Ensure you've run penify login or set PENIFY_API_TOKEN
  2. +
  3. LLM Configuration: Check your LLM settings with cat ~/.penify
  4. +
  5. JIRA Integration: Verify JIRA credentials in your configuration
  6. +
+

+Logs

+

For more detailed logs, you can set the environment variable:

+
export PENIFY_DEBUG=1
+

+Support

+

For additional help, visit https://docs.penify.dev/ or contact suppo.nosp@m.rt@p.nosp@m.enify.nosp@m..dev

+
+
+
+ + + + + diff --git a/docs/html/md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_doc_commands.html b/docs/html/md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_doc_commands.html new file mode 100644 index 0000000..bec0ccb --- /dev/null +++ b/docs/html/md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_doc_commands.html @@ -0,0 +1,363 @@ + + + + + + + + + + + + + + + + + + +penify-cli: Penify CLI - Documentation Generation Commands + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
penify-cli +
+
+
+ + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
Penify CLI - Documentation Generation Commands
+
+
+

This document provides a detailed guide to all permutations and combinations of the docgen command, including extensive information about Git hook commands for automating documentation generation.

+

+Table of Contents

+
    +
  • Basic Usage
  • +
  • Command Options
  • +
  • Option Combinations
  • +
  • Git Hook Commands
      +
    • Hook Installation
    • +
    • Hook Customization
    • +
    • Hook Uninstallation
    • +
    +
  • +
  • Advanced Use Cases
  • +
  • Troubleshooting
  • +
+

+Basic Usage

+
penify docgen
+

By default, this command:

    +
  • Analyzes the current Git diff (changes since last commit)
  • +
  • Generates documentation for changed files only
  • +
  • Requires authentication via penify login
  • +
+

+Command Options

+

+<tt>-l, --location</tt>

+

Specify a target for documentation generation:

+
# Generate documentation for a specific file
+
penify docgen -l path/to/file.py
+
+
# Generate documentation for a specific folder
+
penify docgen -l path/to/folder
+

Without this flag, Penify analyzes only Git-tracked modified files.

+

+Subcommands

+

+<tt>install-hook</tt>

+

Install a Git post-commit hook to automatically generate documentation:

+
penify docgen install-hook
+

+<tt>uninstall-hook</tt>

+

Remove the Git post-commit hook:

+
penify docgen uninstall-hook
+

+Option Combinations

+

+Generate Documentation for Current Git Diff

+
# Basic usage - current Git diff
+
penify docgen
+

+Generate Documentation for a Specific File

+
# Single file documentation
+
penify docgen -l src/main.py
+

+Generate Documentation for a Folder

+
# Folder documentation
+
penify docgen -l src/models/
+

+Install Hook in Current Repository

+
# Install hook in current Git repository
+
penify docgen install-hook
+

+Install Hook in Specific Repository

+
# Install hook in a specific Git repository
+
penify docgen install-hook -l /path/to/repo
+

+Uninstall Hook from Current Repository

+
# Uninstall hook from current Git repository
+
penify docgen uninstall-hook
+

+Uninstall Hook from Specific Repository

+
# Uninstall hook from a specific Git repository
+
penify docgen uninstall-hook -l /path/to/repo
+

+Git Hook Commands

+

Penify provides Git hook commands to automate documentation generation as part of your Git workflow.

+

+Hook Installation

+

+How Hooks Work

+

When you install a Git hook with penify docgen install-hook, Penify:

+
    +
  1. Creates a post-commit hook script in the .git/hooks directory
  2. +
  3. Makes the script executable
  4. +
  5. Configures the hook to run penify docgen after each commit
  6. +
+

+Hook Script Content

+

The generated post-commit hook contains:

+
#!/bin/sh
+
# This is a post-commit hook generated by penify.
+
# Automatically generates documentation for changed files after each commit.
+
+
penify docgen -gf /path/to/git/repository -t your_api_token
+

+Installation Location

+

By default, hooks are installed in the current Git repository. You can specify a different location:

+
penify docgen install-hook -l /path/to/repo
+

+Installation Requirements

+

To install hooks, you need:

    +
  • A valid Penify API token (login first with penify login)
  • +
  • Write permissions to the .git/hooks directory
  • +
+

+Verifying Installation

+

After installation, you can verify that the hook is installed:

+
cat .git/hooks/post-commit
+

+Hook Customization

+

You can customize the post-commit hook after installation:

+

+Modifying Hook Behavior

+
    +
  1. Edit the .git/hooks/post-commit file
  2. +
  3. Add additional options to the penify docgen command
  4. +
  5. Add other commands to run after commit
  6. +
+

Example of a customized hook:

+
#!/bin/sh
+
# This is a post-commit hook generated by penify.
+
# Automatically generates documentation for changed files after each commit.
+
+
# Generate documentation
+
penify docgen -gf /path/to/git/repository -t your_api_token
+
+
# Additional custom commands
+
echo "Documentation generation complete!"
+

+Advanced Hook Scenarios

+

Conditional Documentation Generation:

+
#!/bin/sh
+
# Only generate documentation for commits to the main branch
+
BRANCH=$(git rev-parse --abbrev-ref HEAD)
+
if [ "$BRANCH" = "main" ]; then
+
penify docgen -gf /path/to/git/repository -t your_api_token
+
fi
+

Documenting Specific Files/Folders:

+
#!/bin/sh
+
# Only document Python files in the src directory
+
penify docgen -l src/ -gf /path/to/git/repository -t your_api_token
+

+Hook Uninstallation

+

+Standard Uninstallation

+

To remove a hook from the current repository:

+
penify docgen uninstall-hook
+

+Specific Repository Uninstallation

+

To remove a hook from a specific repository:

+
penify docgen uninstall-hook -l /path/to/repo
+

+Manual Hook Removal

+

If needed, you can manually remove the hook:

+
rm .git/hooks/post-commit
+

+Verifying Uninstallation

+

Check that the hook was successfully removed:

+
ls -la .git/hooks/post-commit # Should return "No such file or directory"
+

+Advanced Use Cases

+

+Continuous Integration

+

Run documentation generation in CI pipelines:

+
# In your CI script
+
export PENIFY_API_TOKEN=your_api_token
+
penify docgen -l src/
+

+Batch Documentation

+

Generate documentation for multiple repositories:

+
# Bash script for batch documentation
+
for repo in repo1 repo2 repo3; do
+
cd /path/to/$repo
+
penify docgen -l .
+
done
+

+Custom Git Hook Integration

+

Integrate with other Git hooks:

+
# In .git/hooks/pre-push
+
penify docgen -l src/
+

+Documenting Release Tags

+

Generate documentation when creating a release tag:

+
# Document everything when creating a tag
+
git tag -a v1.0.0
+
penify docgen -l . # Document entire codebase
+
git commit --amend -m "Release v1.0.0 with updated documentation"
+

+Troubleshooting

+

+Common Issues

+
    +
  1. **"Authentication required"**
      +
    • Run penify login before using documentation features
    • +
    • Check your API token with cat ~/.penify
    • +
    +
  2. +
  3. **"Permission denied when installing hook"**
      +
    • Check Git repository permissions
    • +
    • Try running with sudo (if appropriate for your environment)
    • +
    • Ensure the .git/hooks directory exists
    • +
    +
  4. +
  5. **"Hook installed but not running"**
      +
    • Check if the hook is executable: ls -la .git/hooks/post-commit
    • +
    • Make it executable if needed: chmod +x .git/hooks/post-commit
    • +
    • Check for syntax errors in the hook script
    • +
    +
  6. +
  7. **"File or directory not found"**
      +
    • Verify the path provided to the -l option
    • +
    • Ensure you're running the command from the correct directory
    • +
    +
  8. +
  9. **"Hook uninstallation failed"**
      +
    • Check permissions on the .git/hooks directory
    • +
    • Try manual removal: rm .git/hooks/post-commit
    • +
    +
  10. +
+

+Debugging

+

For detailed output when running documentation commands:

+
export PENIFY_DEBUG=1
+
penify docgen -l src/
+

+Getting Help

+

For command-specific help:

+
penify docgen --help
+
penify docgen install-hook --help
+
penify docgen uninstall-hook --help
+
+
+
+ + + + + diff --git a/docs/html/md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_example_workflows.html b/docs/html/md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_example_workflows.html new file mode 100644 index 0000000..4ca255e --- /dev/null +++ b/docs/html/md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_example_workflows.html @@ -0,0 +1,239 @@ + + + + + + + + + + + + + + + + + + +penify-cli: Penify CLI Example Workflows + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
penify-cli +
+
+
+ + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
Penify CLI Example Workflows
+
+
+

This document demonstrates how to use Penify CLI in real-world development workflows to improve your productivity.

+

+Workflow 1: Efficient Git Commits with AI

+

+Setup

+

First, configure your local LLM for offline operation:

+
penify config llm
+

Configure your JIRA integration for enhanced commit messages:

+
penify config jira
+

+Daily Workflow

+
    +
  1. Make your code changes as usual
  2. +
  3. When ready to commit, use Penify to generate a smart commit message:
  4. +
+
penify commit
+
    +
  1. Review and confirm the generated commit message
  2. +
  3. Git commit and push as usual
  4. +
+

+Benefits

+
    +
  • Consistent and descriptive commit messages
  • +
  • Automatic inclusion of relevant JIRA ticket information
  • +
  • Time saved from writing detailed commit messages
  • +
+

+Workflow 2: Documentation Generation Pipeline

+

+Setup

+

Login to Penify to access advanced documentation features:

+
penify login
+

Install the Git hook for automatic documentation generation:

+
penify docgen install-hook
+

+Daily Workflow

+
    +
  1. Make your code changes as usual
  2. +
  3. Commit your changes
  4. +
  5. Documentation is automatically generated for changed files
  6. +
  7. Review the generated documentation
  8. +
+

+Manual Documentation

+

For specific files or folders:

+
penify docgen -l src/components/authentication
+

+Benefits

+
    +
  • Always up-to-date documentation
  • +
  • Consistent documentation style
  • +
  • Time saved from writing detailed documentation
  • +
+

+Workflow 3: Code Review Enhancement

+

+Setup

+

Ensure you're logged into Penify:

+
penify login
+

+Workflow

+
    +
  1. Before submitting a PR, generate documentation for changed files:
  2. +
+
penify docgen
+
    +
  1. Include the generated documentation in your PR
  2. +
  3. Reviewers can better understand your changes with the AI-generated explanations
  4. +
+

+Benefits

+
    +
  • Improved PR quality
  • +
  • Faster code reviews
  • +
  • Better team understanding of code changes
  • +
+

+Workflow 4: Onboarding New Team Members

+

+For Team Leads

+

Generate comprehensive documentation for the entire codebase:

+
penify docgen -l .
+

+For New Team Members

+

Generate focused documentation for components you're working on:

+
penify docgen -l src/components/my-feature
+

+Benefits

+
    +
  • Faster onboarding
  • +
  • Better understanding of code structure
  • +
  • Reduced questions to senior team members
  • +
+

+Workflow 5: Legacy Code Understanding

+

When working with unfamiliar legacy code:

+
# Document a specific complex file
+
penify docgen -l src/legacy/complex_module.py
+
+
# Document an entire legacy component
+
penify docgen -l src/legacy/old_component
+

+Benefits

+
    +
  • Quickly understand complex legacy systems
  • +
  • Reduce time spent deciphering undocumented code
  • +
  • Make safer changes to legacy systems
  • +
+
+
+
+ + + + + diff --git a/docs/html/menu.js b/docs/html/menu.js new file mode 100644 index 0000000..818b859 --- /dev/null +++ b/docs/html/menu.js @@ -0,0 +1,135 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file + */ +function initMenu(relPath,searchEnabled,serverSide,searchPage,search) { + function makeTree(data,relPath) { + var result=''; + if ('children' in data) { + result+='
    '; + for (var i in data.children) { + var url; + var link; + link = data.children[i].url; + if (link.substring(0,1)=='^') { + url = link.substring(1); + } else { + url = relPath+link; + } + result+='
  • '+ + data.children[i].text+''+ + makeTree(data.children[i],relPath)+'
  • '; + } + result+='
'; + } + return result; + } + var searchBox; + if (searchEnabled) { + if (serverSide) { + searchBox='
'+ + '
'+ + '
'+ + ''+ + '
'+ + '
'+ + '
'+ + '
'; + } else { + searchBox='
'+ + ''+ + ''+ + ''+ + ''+ + ''+ + '' + '' + '
'; + } + } + + $('#main-nav').before('
'+ + ''+ + ''+ + '
'); + $('#main-nav').append(makeTree(menudata,relPath)); + $('#main-nav').children(':first').addClass('sm sm-dox').attr('id','main-menu'); + if (searchBox) { + $('#main-menu').append('
  • '); + } + var $mainMenuState = $('#main-menu-state'); + var prevWidth = 0; + if ($mainMenuState.length) { + function initResizableIfExists() { + if (typeof initResizable==='function') initResizable(); + } + // animate mobile menu + $mainMenuState.change(function(e) { + var $menu = $('#main-menu'); + var options = { duration: 250, step: initResizableIfExists }; + if (this.checked) { + options['complete'] = function() { $menu.css('display', 'block') }; + $menu.hide().slideDown(options); + } else { + options['complete'] = function() { $menu.css('display', 'none') }; + $menu.show().slideUp(options); + } + }); + // set default menu visibility + function resetState() { + var $menu = $('#main-menu'); + var $mainMenuState = $('#main-menu-state'); + var newWidth = $(window).outerWidth(); + if (newWidth!=prevWidth) { + if ($(window).outerWidth()<768) { + $mainMenuState.prop('checked',false); $menu.hide(); + $('#searchBoxPos1').html(searchBox); + $('#searchBoxPos2').hide(); + } else { + $menu.show(); + $('#searchBoxPos1').empty(); + $('#searchBoxPos2').html(searchBox); + $('#searchBoxPos2').show(); + } + prevWidth = newWidth; + } + } + $(window).ready(function() { resetState(); initResizableIfExists(); }); + $(window).resize(resetState); + } + $('#main-menu').smartmenus(); +} +/* @license-end */ diff --git a/docs/html/menudata.js b/docs/html/menudata.js new file mode 100644 index 0000000..314c51a --- /dev/null +++ b/docs/html/menudata.js @@ -0,0 +1,117 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file +*/ +var menudata={children:[ +{text:"Main Page",url:"index.html"}, +{text:"Related Pages",url:"pages.html"}, +{text:"Namespaces",url:"namespaces.html",children:[ +{text:"Namespace List",url:"namespaces.html"}, +{text:"Namespace Members",url:"namespacemembers.html",children:[ +{text:"All",url:"namespacemembers.html",children:[ +{text:"a",url:"namespacemembers.html#index_a"}, +{text:"c",url:"namespacemembers.html#index_c"}, +{text:"d",url:"namespacemembers.html#index_d"}, +{text:"e",url:"namespacemembers.html#index_e"}, +{text:"f",url:"namespacemembers.html#index_f"}, +{text:"g",url:"namespacemembers.html#index_g"}, +{text:"h",url:"namespacemembers.html#index_h"}, +{text:"i",url:"namespacemembers.html#index_i"}, +{text:"j",url:"namespacemembers.html#index_j"}, +{text:"l",url:"namespacemembers.html#index_l"}, +{text:"m",url:"namespacemembers.html#index_m"}, +{text:"n",url:"namespacemembers.html#index_n"}, +{text:"p",url:"namespacemembers.html#index_p"}, +{text:"r",url:"namespacemembers.html#index_r"}, +{text:"s",url:"namespacemembers.html#index_s"}, +{text:"t",url:"namespacemembers.html#index_t"}, +{text:"u",url:"namespacemembers.html#index_u"}, +{text:"v",url:"namespacemembers.html#index_v"}, +{text:"w",url:"namespacemembers.html#index_w"}]}, +{text:"Functions",url:"namespacemembers_func.html",children:[ +{text:"c",url:"namespacemembers_func.html#index_c"}, +{text:"f",url:"namespacemembers_func.html#index_f"}, +{text:"g",url:"namespacemembers_func.html#index_g"}, +{text:"h",url:"namespacemembers_func.html#index_h"}, +{text:"i",url:"namespacemembers_func.html#index_i"}, +{text:"l",url:"namespacemembers_func.html#index_l"}, +{text:"m",url:"namespacemembers_func.html#index_m"}, +{text:"p",url:"namespacemembers_func.html#index_p"}, +{text:"r",url:"namespacemembers_func.html#index_r"}, +{text:"s",url:"namespacemembers_func.html#index_s"}, +{text:"t",url:"namespacemembers_func.html#index_t"}, +{text:"u",url:"namespacemembers_func.html#index_u"}]}, +{text:"Variables",url:"namespacemembers_vars.html",children:[ +{text:"a",url:"namespacemembers_vars.html#index_a"}, +{text:"c",url:"namespacemembers_vars.html#index_c"}, +{text:"d",url:"namespacemembers_vars.html#index_d"}, +{text:"e",url:"namespacemembers_vars.html#index_e"}, +{text:"h",url:"namespacemembers_vars.html#index_h"}, +{text:"i",url:"namespacemembers_vars.html#index_i"}, +{text:"j",url:"namespacemembers_vars.html#index_j"}, +{text:"l",url:"namespacemembers_vars.html#index_l"}, +{text:"n",url:"namespacemembers_vars.html#index_n"}, +{text:"p",url:"namespacemembers_vars.html#index_p"}, +{text:"s",url:"namespacemembers_vars.html#index_s"}, +{text:"u",url:"namespacemembers_vars.html#index_u"}, +{text:"v",url:"namespacemembers_vars.html#index_v"}, +{text:"w",url:"namespacemembers_vars.html#index_w"}]}]}]}, +{text:"Classes",url:"annotated.html",children:[ +{text:"Class List",url:"annotated.html"}, +{text:"Class Index",url:"classes.html"}, +{text:"Class Hierarchy",url:"inherits.html"}, +{text:"Class Members",url:"functions.html",children:[ +{text:"All",url:"functions.html",children:[ +{text:"_",url:"functions.html#index__5F"}, +{text:"a",url:"functions.html#index_a"}, +{text:"b",url:"functions.html#index_b"}, +{text:"d",url:"functions.html#index_d"}, +{text:"e",url:"functions.html#index_e"}, +{text:"f",url:"functions.html#index_f"}, +{text:"g",url:"functions.html#index_g"}, +{text:"i",url:"functions.html#index_i"}, +{text:"j",url:"functions.html#index_j"}, +{text:"l",url:"functions.html#index_l"}, +{text:"m",url:"functions.html#index_m"}, +{text:"p",url:"functions.html#index_p"}, +{text:"r",url:"functions.html#index_r"}, +{text:"s",url:"functions.html#index_s"}, +{text:"t",url:"functions.html#index_t"}, +{text:"u",url:"functions.html#index_u"}]}, +{text:"Functions",url:"functions_func.html",children:[ +{text:"_",url:"functions_func.html#index__5F"}, +{text:"a",url:"functions_func.html#index_a"}, +{text:"e",url:"functions_func.html#index_e"}, +{text:"f",url:"functions_func.html#index_f"}, +{text:"g",url:"functions_func.html#index_g"}, +{text:"i",url:"functions_func.html#index_i"}, +{text:"l",url:"functions_func.html#index_l"}, +{text:"m",url:"functions_func.html#index_m"}, +{text:"p",url:"functions_func.html#index_p"}, +{text:"r",url:"functions_func.html#index_r"}, +{text:"s",url:"functions_func.html#index_s"}, +{text:"t",url:"functions_func.html#index_t"}, +{text:"u",url:"functions_func.html#index_u"}]}, +{text:"Variables",url:"functions_vars.html"}]}]}, +{text:"Files",url:"files.html",children:[ +{text:"File List",url:"files.html"}]}]} diff --git a/docs/html/namespacemembers.html b/docs/html/namespacemembers.html new file mode 100644 index 0000000..03dba31 --- /dev/null +++ b/docs/html/namespacemembers.html @@ -0,0 +1,289 @@ + + + + + + + + + + + + + + + + + + +penify-cli: Namespace Members + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    penify-cli +
    +
    +
    + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    +
    Here is a list of all namespace members with links to the namespace documentation for each member:
    + +

    - a -

    + + +

    - c -

    + + +

    - d -

    + + +

    - e -

    + + +

    - f -

    + + +

    - g -

    + + +

    - h -

    + + +

    - i -

    + + +

    - j -

    + + +

    - l -

    + + +

    - m -

    + + +

    - n -

    + + +

    - p -

    + + +

    - r -

    + + +

    - s -

    + + +

    - t -

    + + +

    - u -

    + + +

    - v -

    + + +

    - w -

    +
    +
    + + + + + diff --git a/docs/html/namespacemembers_func.html b/docs/html/namespacemembers_func.html new file mode 100644 index 0000000..d743317 --- /dev/null +++ b/docs/html/namespacemembers_func.html @@ -0,0 +1,228 @@ + + + + + + + + + + + + + + + + + + +penify-cli: Namespace Members + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    penify-cli +
    +
    +
    + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    +  + +

    - c -

    + + +

    - f -

    + + +

    - g -

    + + +

    - h -

    + + +

    - i -

    + + +

    - l -

    + + +

    - m -

    + + +

    - p -

    + + +

    - r -

    + + +

    - s -

    + + +

    - t -

    + + +

    - u -

    +
    +
    + + + + + diff --git a/docs/html/namespacemembers_vars.html b/docs/html/namespacemembers_vars.html new file mode 100644 index 0000000..bc16f53 --- /dev/null +++ b/docs/html/namespacemembers_vars.html @@ -0,0 +1,215 @@ + + + + + + + + + + + + + + + + + + +penify-cli: Namespace Members + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    penify-cli +
    +
    +
    + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    +  + +

    - a -

    + + +

    - c -

      +
    • classifiers : setup
    • +
    + + +

    - d -

    + + +

    - e -

    + + +

    - h -

    + + +

    - i -

    + + +

    - j -

    + + +

    - l -

    + + +

    - n -

    + + +

    - p -

    + + +

    - s -

    + + +

    - u -

    + + +

    - v -

    + + +

    - w -

    +
    +
    + + + + + diff --git a/docs/html/namespacepenify__hook.html b/docs/html/namespacepenify__hook.html new file mode 100644 index 0000000..8b78397 --- /dev/null +++ b/docs/html/namespacepenify__hook.html @@ -0,0 +1,166 @@ + + + + + + + + + + + + + + + + + + +penify-cli: penify_hook Namespace Reference + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    penify-cli +
    +
    +
    + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    + +
    penify_hook Namespace Reference
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    +Namespaces

    namespace  api_client
     
    namespace  base_analyzer
     
    namespace  commands
     
    namespace  commit_analyzer
     
    namespace  config_command
     
    namespace  constants
     
    namespace  file_analyzer
     
    namespace  folder_analyzer
     
    namespace  git_analyzer
     
    namespace  jira_client
     
    namespace  llm_client
     
    namespace  login_command
     
    namespace  main
     
    namespace  ui_utils
     
    namespace  utils
     
    +
    +
    + + + + + diff --git a/docs/html/namespacepenify__hook.js b/docs/html/namespacepenify__hook.js new file mode 100644 index 0000000..3344578 --- /dev/null +++ b/docs/html/namespacepenify__hook.js @@ -0,0 +1,56 @@ +var namespacepenify__hook = +[ + [ "api_client", "namespacepenify__hook_1_1api__client.html", "namespacepenify__hook_1_1api__client" ], + [ "base_analyzer", "namespacepenify__hook_1_1base__analyzer.html", "namespacepenify__hook_1_1base__analyzer" ], + [ "commands", "namespacepenify__hook_1_1commands.html", "namespacepenify__hook_1_1commands" ], + [ "commit_analyzer", "namespacepenify__hook_1_1commit__analyzer.html", "namespacepenify__hook_1_1commit__analyzer" ], + [ "config_command", "namespacepenify__hook_1_1config__command.html", [ + [ "handle_config", "namespacepenify__hook_1_1config__command.html#a240e5331681eb574ac319d7458783bde", null ], + [ "setup_config_parser", "namespacepenify__hook_1_1config__command.html#a4f3eb92164a69df1446d745f8a09285e", null ] + ] ], + [ "constants", "namespacepenify__hook_1_1constants.html", [ + [ "API_URL", "namespacepenify__hook_1_1constants.html#af198b5d1fc2f44657a2061aa324af3e0", null ], + [ "DASHBOARD_URL", "namespacepenify__hook_1_1constants.html#a316c5a606e4440fb8224c6544c3a15f0", null ] + ] ], + [ "file_analyzer", "namespacepenify__hook_1_1file__analyzer.html", "namespacepenify__hook_1_1file__analyzer" ], + [ "folder_analyzer", "namespacepenify__hook_1_1folder__analyzer.html", "namespacepenify__hook_1_1folder__analyzer" ], + [ "git_analyzer", "namespacepenify__hook_1_1git__analyzer.html", "namespacepenify__hook_1_1git__analyzer" ], + [ "jira_client", "namespacepenify__hook_1_1jira__client.html", "namespacepenify__hook_1_1jira__client" ], + [ "llm_client", "namespacepenify__hook_1_1llm__client.html", "namespacepenify__hook_1_1llm__client" ], + [ "login_command", "namespacepenify__hook_1_1login__command.html", [ + [ "handle_login", "namespacepenify__hook_1_1login__command.html#ae4bf932fbafeff834b0a0c5a37f74ccd", null ], + [ "setup_login_parser", "namespacepenify__hook_1_1login__command.html#aae63db4c484797bead34b7d874020c6a", null ] + ] ], + [ "main", "namespacepenify__hook_1_1main.html", [ + [ "main", "namespacepenify__hook_1_1main.html#a16838b20df4bd14ee4b5e1dd2906738f", null ] + ] ], + [ "ui_utils", "namespacepenify__hook_1_1ui__utils.html", [ + [ "create_progress_bar", "namespacepenify__hook_1_1ui__utils.html#a12b92532b1458af94f3649d411b5505c", null ], + [ "create_stage_progress_bar", "namespacepenify__hook_1_1ui__utils.html#a3da02cd1140179a9ce60f62c85fccfef", null ], + [ "format_error", "namespacepenify__hook_1_1ui__utils.html#a4dd934568897433fa73f9cc182ac4a3e", null ], + [ "format_file_path", "namespacepenify__hook_1_1ui__utils.html#af3441fb3c2c3850b8b3b6455a9fdaba4", null ], + [ "format_highlight", "namespacepenify__hook_1_1ui__utils.html#adcb97fc26b405d2b9cdf5eb7aecc5452", null ], + [ "format_info", "namespacepenify__hook_1_1ui__utils.html#a92c3e466d1912058167be2eacf85b9f6", null ], + [ "format_success", "namespacepenify__hook_1_1ui__utils.html#a532cdb4de7c679ce8b29c3e9116c4776", null ], + [ "format_warning", "namespacepenify__hook_1_1ui__utils.html#a0a6fd2613c6fe053b6e4356cd9e5cda2", null ], + [ "print_error", "namespacepenify__hook_1_1ui__utils.html#a6f0acd7dd91abfe67d0807803bc3b65f", null ], + [ "print_info", "namespacepenify__hook_1_1ui__utils.html#a811f0adf6e9bf71510c379b6fa155e44", null ], + [ "print_processing", "namespacepenify__hook_1_1ui__utils.html#adfcbbfe39029ab6d1dd33e7bf75ae115", null ], + [ "print_status", "namespacepenify__hook_1_1ui__utils.html#aa6e684c00e26199440137a87ed9b195c", null ], + [ "print_success", "namespacepenify__hook_1_1ui__utils.html#a2b16aa6b68a9edea5f29f84f1c4be79a", null ], + [ "print_warning", "namespacepenify__hook_1_1ui__utils.html#a1ffbb9671dbe233770268e2dd66a67fa", null ], + [ "update_stage", "namespacepenify__hook_1_1ui__utils.html#a5a7340d0fc60fb80f17514d60bf45f1d", null ], + [ "autoreset", "namespacepenify__hook_1_1ui__utils.html#ab560cfade398ac1e0bd47befb52d9f71", null ], + [ "ERROR_COLOR", "namespacepenify__hook_1_1ui__utils.html#a4ab4e61dfab7973c87bef59c6e1977fe", null ], + [ "ERROR_SYMBOL", "namespacepenify__hook_1_1ui__utils.html#aa564e1e1d016c8227d076542e74cecb0", null ], + [ "HIGHLIGHT_COLOR", "namespacepenify__hook_1_1ui__utils.html#aba01b8259f0d66cdc2b4a1b58f9736fc", null ], + [ "INFO_COLOR", "namespacepenify__hook_1_1ui__utils.html#a9fdcb180915696f5d217032a62c3857c", null ], + [ "NEUTRAL_COLOR", "namespacepenify__hook_1_1ui__utils.html#aca0fcee81606857497520ae4290bc9f5", null ], + [ "PROCESSING_SYMBOL", "namespacepenify__hook_1_1ui__utils.html#a3b208e2750a38dd09467a73e4afd9756", null ], + [ "SUCCESS_COLOR", "namespacepenify__hook_1_1ui__utils.html#a22c450c5e2b5394618ecf9b636560df4", null ], + [ "SUCCESS_SYMBOL", "namespacepenify__hook_1_1ui__utils.html#a3c6fe4bd17c1a5fe76587225ae4beb3e", null ], + [ "WARNING_COLOR", "namespacepenify__hook_1_1ui__utils.html#a177bc9b44157844c999e0c1c2c6936ff", null ], + [ "WARNING_SYMBOL", "namespacepenify__hook_1_1ui__utils.html#a6eaea98f1a8cbe16a181647da2fc0a16", null ] + ] ], + [ "utils", "namespacepenify__hook_1_1utils.html", "namespacepenify__hook_1_1utils" ] +]; \ No newline at end of file diff --git a/docs/html/namespacepenify__hook_1_1api__client.html b/docs/html/namespacepenify__hook_1_1api__client.html new file mode 100644 index 0000000..c31b28a --- /dev/null +++ b/docs/html/namespacepenify__hook_1_1api__client.html @@ -0,0 +1,138 @@ + + + + + + + + + + + + + + + + + + +penify-cli: penify_hook.api_client Namespace Reference + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    penify-cli +
    +
    +
    + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    + +
    penify_hook.api_client Namespace Reference
    +
    +
    + + + + +

    +Classes

    class  APIClient
     
    +
    +
    + + + + + diff --git a/docs/html/namespacepenify__hook_1_1api__client.js b/docs/html/namespacepenify__hook_1_1api__client.js new file mode 100644 index 0000000..fb9b017 --- /dev/null +++ b/docs/html/namespacepenify__hook_1_1api__client.js @@ -0,0 +1,4 @@ +var namespacepenify__hook_1_1api__client = +[ + [ "APIClient", "classpenify__hook_1_1api__client_1_1APIClient.html", "classpenify__hook_1_1api__client_1_1APIClient" ] +]; \ No newline at end of file diff --git a/docs/html/namespacepenify__hook_1_1base__analyzer.html b/docs/html/namespacepenify__hook_1_1base__analyzer.html new file mode 100644 index 0000000..ea23373 --- /dev/null +++ b/docs/html/namespacepenify__hook_1_1base__analyzer.html @@ -0,0 +1,138 @@ + + + + + + + + + + + + + + + + + + +penify-cli: penify_hook.base_analyzer Namespace Reference + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    penify-cli +
    +
    +
    + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    + +
    penify_hook.base_analyzer Namespace Reference
    +
    +
    + + + + +

    +Classes

    class  BaseAnalyzer
     
    +
    +
    + + + + + diff --git a/docs/html/namespacepenify__hook_1_1base__analyzer.js b/docs/html/namespacepenify__hook_1_1base__analyzer.js new file mode 100644 index 0000000..6701f69 --- /dev/null +++ b/docs/html/namespacepenify__hook_1_1base__analyzer.js @@ -0,0 +1,4 @@ +var namespacepenify__hook_1_1base__analyzer = +[ + [ "BaseAnalyzer", "classpenify__hook_1_1base__analyzer_1_1BaseAnalyzer.html", "classpenify__hook_1_1base__analyzer_1_1BaseAnalyzer" ] +]; \ No newline at end of file diff --git a/docs/html/namespacepenify__hook_1_1commands.html b/docs/html/namespacepenify__hook_1_1commands.html new file mode 100644 index 0000000..2be9286 --- /dev/null +++ b/docs/html/namespacepenify__hook_1_1commands.html @@ -0,0 +1,146 @@ + + + + + + + + + + + + + + + + + + +penify-cli: penify_hook.commands Namespace Reference + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    penify-cli +
    +
    +
    + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    + +
    penify_hook.commands Namespace Reference
    +
    +
    + + + + + + + + + + + + +

    +Namespaces

    namespace  auth_commands
     
    namespace  commit_commands
     
    namespace  config_commands
     
    namespace  doc_commands
     
    namespace  hook_commands
     
    +
    +
    + + + + + diff --git a/docs/html/namespacepenify__hook_1_1commands.js b/docs/html/namespacepenify__hook_1_1commands.js new file mode 100644 index 0000000..28e70f5 --- /dev/null +++ b/docs/html/namespacepenify__hook_1_1commands.js @@ -0,0 +1,38 @@ +var namespacepenify__hook_1_1commands = +[ + [ "auth_commands", "namespacepenify__hook_1_1commands_1_1auth__commands.html", [ + [ "login", "namespacepenify__hook_1_1commands_1_1auth__commands.html#a78f375c58bb6f69f98675e6a9ac84655", null ], + [ "save_credentials", "namespacepenify__hook_1_1commands_1_1auth__commands.html#aa3956ca1749d4218ea1dc6e5b6218b24", null ] + ] ], + [ "commit_commands", "namespacepenify__hook_1_1commands_1_1commit__commands.html", [ + [ "commit_code", "namespacepenify__hook_1_1commands_1_1commit__commands.html#a62564c4e8ad59fc46d56cb0f9122a71a", null ], + [ "handle_commit", "namespacepenify__hook_1_1commands_1_1commit__commands.html#af4f739f524c38b437e4e47673d683e23", null ], + [ "setup_commit_parser", "namespacepenify__hook_1_1commands_1_1commit__commands.html#a8627583116eb78e31a4d3cdc16d2f15c", null ] + ] ], + [ "config_commands", "namespacepenify__hook_1_1commands_1_1config__commands.html", [ + [ "config_jira_web", "namespacepenify__hook_1_1commands_1_1config__commands.html#af115198ea5d6808ccb98733957f50b06", null ], + [ "config_llm_web", "namespacepenify__hook_1_1commands_1_1config__commands.html#a185dfc34a655ed80e6c95939b6f3c35c", null ], + [ "get_env_var_or_default", "namespacepenify__hook_1_1commands_1_1config__commands.html#a3caf2b062dd33b1f1d7ddc7224f0ff87", null ], + [ "get_jira_config", "namespacepenify__hook_1_1commands_1_1config__commands.html#a15bf3685c4dcb5c15ba6a4055e484cf2", null ], + [ "get_llm_config", "namespacepenify__hook_1_1commands_1_1config__commands.html#a6492bc8e7df6e38bb06ad05e572d4cc0", null ], + [ "get_penify_config", "namespacepenify__hook_1_1commands_1_1config__commands.html#a6559a82d0bf727703d550d1003d3ed20", null ], + [ "get_token", "namespacepenify__hook_1_1commands_1_1config__commands.html#a5503d51c905e2f1b299b12d2a73bd812", null ], + [ "load_env_files", "namespacepenify__hook_1_1commands_1_1config__commands.html#aabe277132ce0bc0aacef951cf1dee2ae", null ], + [ "save_jira_config", "namespacepenify__hook_1_1commands_1_1config__commands.html#ab2486ac2bf16b4a671e49625bfa4f9b4", null ], + [ "save_llm_config", "namespacepenify__hook_1_1commands_1_1config__commands.html#a4617bc5956e502c9555dc0dda0376df4", null ], + [ "DOTENV_AVAILABLE", "namespacepenify__hook_1_1commands_1_1config__commands.html#a152642ab83cf6219b604bda6122aba67", null ], + [ "path", "namespacepenify__hook_1_1commands_1_1config__commands.html#a4b202072a3a3b8515c9c254622e9c880", null ] + ] ], + [ "doc_commands", "namespacepenify__hook_1_1commands_1_1doc__commands.html", [ + [ "generate_doc", "namespacepenify__hook_1_1commands_1_1doc__commands.html#a4daac68bc563432bf25c85dc78081a25", null ], + [ "handle_docgen", "namespacepenify__hook_1_1commands_1_1doc__commands.html#a2006ab13bff718ef783868a910c0b704", null ], + [ "setup_docgen_parser", "namespacepenify__hook_1_1commands_1_1doc__commands.html#acc7f4ead1b11951d885fa5c151c2cbe0", null ], + [ "docgen_description", "namespacepenify__hook_1_1commands_1_1doc__commands.html#a3e42540047da37565afffeaf106cb948", null ] + ] ], + [ "hook_commands", "namespacepenify__hook_1_1commands_1_1hook__commands.html", [ + [ "install_git_hook", "namespacepenify__hook_1_1commands_1_1hook__commands.html#adff8f5d3bf1c3795974a391ee95b72b2", null ], + [ "uninstall_git_hook", "namespacepenify__hook_1_1commands_1_1hook__commands.html#a81543eb5fa835fd1237f24e8bce6201d", null ], + [ "HOOK_FILENAME", "namespacepenify__hook_1_1commands_1_1hook__commands.html#ae82fd46e5a9219da1478b0476b8214b1", null ], + [ "HOOK_TEMPLATE", "namespacepenify__hook_1_1commands_1_1hook__commands.html#a6a45aad71c8d32ce11a6dff8cee8bee7", null ] + ] ] +]; \ No newline at end of file diff --git a/docs/html/namespacepenify__hook_1_1commands_1_1auth__commands.html b/docs/html/namespacepenify__hook_1_1commands_1_1auth__commands.html new file mode 100644 index 0000000..6068bbd --- /dev/null +++ b/docs/html/namespacepenify__hook_1_1commands_1_1auth__commands.html @@ -0,0 +1,229 @@ + + + + + + + + + + + + + + + + + + +penify-cli: penify_hook.commands.auth_commands Namespace Reference + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    penify-cli +
    +
    +
    + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    + +
    penify_hook.commands.auth_commands Namespace Reference
    +
    +
    + + + + + + +

    +Functions

    def save_credentials (api_key)
     
    def login (api_url, dashboard_url)
     
    +

    Function Documentation

    + +

    ◆ login()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    def penify_hook.commands.auth_commands.login ( api_url,
     dashboard_url 
    )
    +
    +
    Open the login page in a web browser and capture the token via redirect.
    +Here is the call graph for this function:
    +
    +
    +
    +
    +
    +Here is the caller graph for this function:
    +
    +
    +
    +
    + +
    +
    + +

    ◆ save_credentials()

    + +
    +
    + + + + + + + + +
    def penify_hook.commands.auth_commands.save_credentials ( api_key)
    +
    +
    Save the API key in a priority-based manner.
    +
    +This function attempts to save the API key in two locations, based on priority:
    +1. In a `.env` file located in the root of the Git repository if one is found.
    +2. In a global `.penify` file located in the user's home directory as a
    +fallback.  The function first tries to locate the Git repository using
    +`recursive_search_git_folder`. If a Git repository is found, it reads the
    +existing `.env` file (if present), updates or adds the API key under the key
    +`PENIFY_API_TOKEN`, and writes the updated content back. If any error occurs
    +during this process, it falls back to saving the credentials in the global
    +`.penify` file. The function handles exceptions and prints appropriate error
    +messages.
    +
    +Args:
    +    api_key (str): The API key to save.
    +
    +Returns:
    +    bool: True if the API key is saved successfully, False otherwise.
    +
    +Here is the call graph for this function:
    +
    +
    +
    +
    +
    +Here is the caller graph for this function:
    +
    +
    +
    +
    + +
    +
    +
    +
    + + + + + diff --git a/docs/html/namespacepenify__hook_1_1commands_1_1auth__commands_a78f375c58bb6f69f98675e6a9ac84655_cgraph.map b/docs/html/namespacepenify__hook_1_1commands_1_1auth__commands_a78f375c58bb6f69f98675e6a9ac84655_cgraph.map new file mode 100644 index 0000000..966bdbb --- /dev/null +++ b/docs/html/namespacepenify__hook_1_1commands_1_1auth__commands_a78f375c58bb6f69f98675e6a9ac84655_cgraph.map @@ -0,0 +1,5 @@ + + + + + diff --git a/docs/html/namespacepenify__hook_1_1commands_1_1auth__commands_a78f375c58bb6f69f98675e6a9ac84655_cgraph.md5 b/docs/html/namespacepenify__hook_1_1commands_1_1auth__commands_a78f375c58bb6f69f98675e6a9ac84655_cgraph.md5 new file mode 100644 index 0000000..3843ca4 --- /dev/null +++ b/docs/html/namespacepenify__hook_1_1commands_1_1auth__commands_a78f375c58bb6f69f98675e6a9ac84655_cgraph.md5 @@ -0,0 +1 @@ +8ad325585e8efe43cb16f6c7070d7d0a \ No newline at end of file diff --git a/docs/html/namespacepenify__hook_1_1commands_1_1auth__commands_a78f375c58bb6f69f98675e6a9ac84655_cgraph.svg b/docs/html/namespacepenify__hook_1_1commands_1_1auth__commands_a78f375c58bb6f69f98675e6a9ac84655_cgraph.svg new file mode 100644 index 0000000..50d45ea --- /dev/null +++ b/docs/html/namespacepenify__hook_1_1commands_1_1auth__commands_a78f375c58bb6f69f98675e6a9ac84655_cgraph.svg @@ -0,0 +1,149 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +penify_hook.commands.auth_commands.login + + + +Node1 + + +penify_hook.commands.auth +_commands.login + + + + + +Node2 + + +penify_hook.commands.auth +_commands.save_credentials + + + + + +Node1->Node2 + + + + + +Node3 + + +penify_hook.utils.recursive +_search_git_folder + + + + + +Node2->Node3 + + + + + +Node3->Node3 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/html/namespacepenify__hook_1_1commands_1_1auth__commands_a78f375c58bb6f69f98675e6a9ac84655_cgraph_org.svg b/docs/html/namespacepenify__hook_1_1commands_1_1auth__commands_a78f375c58bb6f69f98675e6a9ac84655_cgraph_org.svg new file mode 100644 index 0000000..964fd40 --- /dev/null +++ b/docs/html/namespacepenify__hook_1_1commands_1_1auth__commands_a78f375c58bb6f69f98675e6a9ac84655_cgraph_org.svg @@ -0,0 +1,61 @@ + + + + + + +penify_hook.commands.auth_commands.login + + + +Node1 + + +penify_hook.commands.auth +_commands.login + + + + + +Node2 + + +penify_hook.commands.auth +_commands.save_credentials + + + + + +Node1->Node2 + + + + + +Node3 + + +penify_hook.utils.recursive +_search_git_folder + + + + + +Node2->Node3 + + + + + +Node3->Node3 + + + + + diff --git a/docs/html/namespacepenify__hook_1_1commands_1_1auth__commands_a78f375c58bb6f69f98675e6a9ac84655_icgraph.map b/docs/html/namespacepenify__hook_1_1commands_1_1auth__commands_a78f375c58bb6f69f98675e6a9ac84655_icgraph.map new file mode 100644 index 0000000..88a6ff8 --- /dev/null +++ b/docs/html/namespacepenify__hook_1_1commands_1_1auth__commands_a78f375c58bb6f69f98675e6a9ac84655_icgraph.map @@ -0,0 +1,5 @@ + + + + + diff --git a/docs/html/namespacepenify__hook_1_1commands_1_1auth__commands_a78f375c58bb6f69f98675e6a9ac84655_icgraph.md5 b/docs/html/namespacepenify__hook_1_1commands_1_1auth__commands_a78f375c58bb6f69f98675e6a9ac84655_icgraph.md5 new file mode 100644 index 0000000..a7db012 --- /dev/null +++ b/docs/html/namespacepenify__hook_1_1commands_1_1auth__commands_a78f375c58bb6f69f98675e6a9ac84655_icgraph.md5 @@ -0,0 +1 @@ +65e495614449516908c997067ca3d2d2 \ No newline at end of file diff --git a/docs/html/namespacepenify__hook_1_1commands_1_1auth__commands_a78f375c58bb6f69f98675e6a9ac84655_icgraph.svg b/docs/html/namespacepenify__hook_1_1commands_1_1auth__commands_a78f375c58bb6f69f98675e6a9ac84655_icgraph.svg new file mode 100644 index 0000000..028514f --- /dev/null +++ b/docs/html/namespacepenify__hook_1_1commands_1_1auth__commands_a78f375c58bb6f69f98675e6a9ac84655_icgraph.svg @@ -0,0 +1,148 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +penify_hook.commands.auth_commands.login + + + +Node1 + + +penify_hook.commands.auth +_commands.login + + + + + +Node2 + + +penify_hook.login_command.handle +_login + + + + + +Node1->Node2 + + + + + +Node3 + + +penify_hook.main.main + + + + + +Node2->Node3 + + + + + +Node3->Node3 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/html/namespacepenify__hook_1_1commands_1_1auth__commands_a78f375c58bb6f69f98675e6a9ac84655_icgraph_org.svg b/docs/html/namespacepenify__hook_1_1commands_1_1auth__commands_a78f375c58bb6f69f98675e6a9ac84655_icgraph_org.svg new file mode 100644 index 0000000..a07bb01 --- /dev/null +++ b/docs/html/namespacepenify__hook_1_1commands_1_1auth__commands_a78f375c58bb6f69f98675e6a9ac84655_icgraph_org.svg @@ -0,0 +1,60 @@ + + + + + + +penify_hook.commands.auth_commands.login + + + +Node1 + + +penify_hook.commands.auth +_commands.login + + + + + +Node2 + + +penify_hook.login_command.handle +_login + + + + + +Node1->Node2 + + + + + +Node3 + + +penify_hook.main.main + + + + + +Node2->Node3 + + + + + +Node3->Node3 + + + + + diff --git a/docs/html/namespacepenify__hook_1_1commands_1_1auth__commands_aa3956ca1749d4218ea1dc6e5b6218b24_cgraph.map b/docs/html/namespacepenify__hook_1_1commands_1_1auth__commands_aa3956ca1749d4218ea1dc6e5b6218b24_cgraph.map new file mode 100644 index 0000000..5c0b505 --- /dev/null +++ b/docs/html/namespacepenify__hook_1_1commands_1_1auth__commands_aa3956ca1749d4218ea1dc6e5b6218b24_cgraph.map @@ -0,0 +1,4 @@ + + + + diff --git a/docs/html/namespacepenify__hook_1_1commands_1_1auth__commands_aa3956ca1749d4218ea1dc6e5b6218b24_cgraph.md5 b/docs/html/namespacepenify__hook_1_1commands_1_1auth__commands_aa3956ca1749d4218ea1dc6e5b6218b24_cgraph.md5 new file mode 100644 index 0000000..17fadc1 --- /dev/null +++ b/docs/html/namespacepenify__hook_1_1commands_1_1auth__commands_aa3956ca1749d4218ea1dc6e5b6218b24_cgraph.md5 @@ -0,0 +1 @@ +31a51591f0a8f9ef897c4a08daac5829 \ No newline at end of file diff --git a/docs/html/namespacepenify__hook_1_1commands_1_1auth__commands_aa3956ca1749d4218ea1dc6e5b6218b24_cgraph.svg b/docs/html/namespacepenify__hook_1_1commands_1_1auth__commands_aa3956ca1749d4218ea1dc6e5b6218b24_cgraph.svg new file mode 100644 index 0000000..e40984b --- /dev/null +++ b/docs/html/namespacepenify__hook_1_1commands_1_1auth__commands_aa3956ca1749d4218ea1dc6e5b6218b24_cgraph.svg @@ -0,0 +1,45 @@ + + + + + + +penify_hook.commands.auth_commands.save_credentials + + + +Node1 + + +penify_hook.commands.auth +_commands.save_credentials + + + + + +Node2 + + +penify_hook.utils.recursive +_search_git_folder + + + + + +Node1->Node2 + + + + + +Node2->Node2 + + + + + diff --git a/docs/html/namespacepenify__hook_1_1commands_1_1auth__commands_aa3956ca1749d4218ea1dc6e5b6218b24_icgraph.map b/docs/html/namespacepenify__hook_1_1commands_1_1auth__commands_aa3956ca1749d4218ea1dc6e5b6218b24_icgraph.map new file mode 100644 index 0000000..c6d1bd8 --- /dev/null +++ b/docs/html/namespacepenify__hook_1_1commands_1_1auth__commands_aa3956ca1749d4218ea1dc6e5b6218b24_icgraph.map @@ -0,0 +1,6 @@ + + + + + + diff --git a/docs/html/namespacepenify__hook_1_1commands_1_1auth__commands_aa3956ca1749d4218ea1dc6e5b6218b24_icgraph.md5 b/docs/html/namespacepenify__hook_1_1commands_1_1auth__commands_aa3956ca1749d4218ea1dc6e5b6218b24_icgraph.md5 new file mode 100644 index 0000000..051c10c --- /dev/null +++ b/docs/html/namespacepenify__hook_1_1commands_1_1auth__commands_aa3956ca1749d4218ea1dc6e5b6218b24_icgraph.md5 @@ -0,0 +1 @@ +ec7d7c899a70e1c68057353448e9a6d9 \ No newline at end of file diff --git a/docs/html/namespacepenify__hook_1_1commands_1_1auth__commands_aa3956ca1749d4218ea1dc6e5b6218b24_icgraph.svg b/docs/html/namespacepenify__hook_1_1commands_1_1auth__commands_aa3956ca1749d4218ea1dc6e5b6218b24_icgraph.svg new file mode 100644 index 0000000..7d1c3a1 --- /dev/null +++ b/docs/html/namespacepenify__hook_1_1commands_1_1auth__commands_aa3956ca1749d4218ea1dc6e5b6218b24_icgraph.svg @@ -0,0 +1,164 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +penify_hook.commands.auth_commands.save_credentials + + + +Node1 + + +penify_hook.commands.auth +_commands.save_credentials + + + + + +Node2 + + +penify_hook.commands.auth +_commands.login + + + + + +Node1->Node2 + + + + + +Node3 + + +penify_hook.login_command.handle +_login + + + + + +Node2->Node3 + + + + + +Node4 + + +penify_hook.main.main + + + + + +Node3->Node4 + + + + + +Node4->Node4 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/html/namespacepenify__hook_1_1commands_1_1auth__commands_aa3956ca1749d4218ea1dc6e5b6218b24_icgraph_org.svg b/docs/html/namespacepenify__hook_1_1commands_1_1auth__commands_aa3956ca1749d4218ea1dc6e5b6218b24_icgraph_org.svg new file mode 100644 index 0000000..8ab520a --- /dev/null +++ b/docs/html/namespacepenify__hook_1_1commands_1_1auth__commands_aa3956ca1749d4218ea1dc6e5b6218b24_icgraph_org.svg @@ -0,0 +1,76 @@ + + + + + + +penify_hook.commands.auth_commands.save_credentials + + + +Node1 + + +penify_hook.commands.auth +_commands.save_credentials + + + + + +Node2 + + +penify_hook.commands.auth +_commands.login + + + + + +Node1->Node2 + + + + + +Node3 + + +penify_hook.login_command.handle +_login + + + + + +Node2->Node3 + + + + + +Node4 + + +penify_hook.main.main + + + + + +Node3->Node4 + + + + + +Node4->Node4 + + + + + diff --git a/docs/html/namespacepenify__hook_1_1commands_1_1commit__commands.html b/docs/html/namespacepenify__hook_1_1commands_1_1commit__commands.html new file mode 100644 index 0000000..b3951d2 --- /dev/null +++ b/docs/html/namespacepenify__hook_1_1commands_1_1commit__commands.html @@ -0,0 +1,311 @@ + + + + + + + + + + + + + + + + + + +penify-cli: penify_hook.commands.commit_commands Namespace Reference + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    penify-cli +
    +
    +
    + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    + +
    penify_hook.commands.commit_commands Namespace Reference
    +
    +
    + + + + + + + + +

    +Functions

    def commit_code (api_url, token, message, open_terminal, generate_description, llm_model=None, llm_api_base=None, llm_api_key=None, jira_url=None, jira_user=None, jira_api_token=None)
     
    def setup_commit_parser (parser)
     
    def handle_commit (args)
     
    +

    Function Documentation

    + +

    ◆ commit_code()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    def penify_hook.commands.commit_commands.commit_code ( api_url,
     token,
     message,
     open_terminal,
     generate_description,
     llm_model = None,
     llm_api_base = None,
     llm_api_key = None,
     jira_url = None,
     jira_user = None,
     jira_api_token = None 
    )
    +
    +
    Enhance Git commits with AI-powered commit messages.
    +
    +This function allows for the generation of enhanced commit messages using
    +natural language processing models and optionally integrates with JIRA for
    +additional context. It processes the current Git folder to find relevant files
    +and generates a detailed commit message based on the provided parameters.
    +
    +Args:
    +    api_url (str): URL of the API endpoint.
    +    token (str): Authentication token for the API.
    +    message (str): Initial commit message provided by the user.
    +    open_terminal (bool): Whether to open the terminal after committing.
    +    generate_description (bool): Whether to generate a detailed description in the commit message.
    +    llm_model (str?): The language model to use for generating the commit message. Defaults to None.
    +    llm_api_base (str?): Base URL of the LLM API. Defaults to None.
    +    llm_api_key (str?): API key for accessing the LLM service. Defaults to None.
    +    jira_url (str?): URL of the JIRA instance. Defaults to None.
    +    jira_user (str?): Username for authenticating with JIRA. Defaults to None.
    +    jira_api_token (str?): API token for accessing JIRA. Defaults to None.
    +
    +Here is the call graph for this function:
    +
    +
    +
    +
    +
    +Here is the caller graph for this function:
    +
    +
    +
    +
    + +
    +
    + +

    ◆ handle_commit()

    + +
    +
    + + + + + + + + +
    def penify_hook.commands.commit_commands.handle_commit ( args)
    +
    +
    Handle commit functionality by processing arguments and invoking the
    +appropriate commands.
    +Here is the call graph for this function:
    +
    +
    +
    +
    +
    +Here is the caller graph for this function:
    +
    +
    +
    +
    + +
    +
    + +

    ◆ setup_commit_parser()

    + +
    +
    + + + + + + + + +
    def penify_hook.commands.commit_commands.setup_commit_parser ( parser)
    +
    +
    Sets up an argument parser for generating smart commit messages.
    +Here is the caller graph for this function:
    +
    +
    +
    +
    + +
    +
    +
    +
    + + + + + diff --git a/docs/html/namespacepenify__hook_1_1commands_1_1commit__commands_a62564c4e8ad59fc46d56cb0f9122a71a_cgraph.map b/docs/html/namespacepenify__hook_1_1commands_1_1commit__commands_a62564c4e8ad59fc46d56cb0f9122a71a_cgraph.map new file mode 100644 index 0000000..9d410b4 --- /dev/null +++ b/docs/html/namespacepenify__hook_1_1commands_1_1commit__commands_a62564c4e8ad59fc46d56cb0f9122a71a_cgraph.map @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/docs/html/namespacepenify__hook_1_1commands_1_1commit__commands_a62564c4e8ad59fc46d56cb0f9122a71a_cgraph.md5 b/docs/html/namespacepenify__hook_1_1commands_1_1commit__commands_a62564c4e8ad59fc46d56cb0f9122a71a_cgraph.md5 new file mode 100644 index 0000000..f0df322 --- /dev/null +++ b/docs/html/namespacepenify__hook_1_1commands_1_1commit__commands_a62564c4e8ad59fc46d56cb0f9122a71a_cgraph.md5 @@ -0,0 +1 @@ +ebbb356587ab923660dadd713f529935 \ No newline at end of file diff --git a/docs/html/namespacepenify__hook_1_1commands_1_1commit__commands_a62564c4e8ad59fc46d56cb0f9122a71a_cgraph.svg b/docs/html/namespacepenify__hook_1_1commands_1_1commit__commands_a62564c4e8ad59fc46d56cb0f9122a71a_cgraph.svg new file mode 100644 index 0000000..1a0e3d8 --- /dev/null +++ b/docs/html/namespacepenify__hook_1_1commands_1_1commit__commands_a62564c4e8ad59fc46d56cb0f9122a71a_cgraph.svg @@ -0,0 +1,227 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +penify_hook.commands.commit_commands.commit_code + + + +Node1 + + +penify_hook.commands.commit +_commands.commit_code + + + + + +Node2 + + +penify_hook.ui_utils.print +_error + + + + + +Node1->Node2 + + + + + +Node4 + + +penify_hook.ui_utils.print_info + + + + + +Node1->Node4 + + + + + +Node6 + + +penify_hook.ui_utils.print +_warning + + + + + +Node1->Node6 + + + + + +Node8 + + +penify_hook.utils.recursive +_search_git_folder + + + + + +Node1->Node8 + + + + + +Node3 + + +penify_hook.ui_utils.format +_error + + + + + +Node2->Node3 + + + + + +Node5 + + +penify_hook.ui_utils.format_info + + + + + +Node4->Node5 + + + + + +Node7 + + +penify_hook.ui_utils.format +_warning + + + + + +Node6->Node7 + + + + + +Node8->Node8 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/html/namespacepenify__hook_1_1commands_1_1commit__commands_a62564c4e8ad59fc46d56cb0f9122a71a_cgraph_org.svg b/docs/html/namespacepenify__hook_1_1commands_1_1commit__commands_a62564c4e8ad59fc46d56cb0f9122a71a_cgraph_org.svg new file mode 100644 index 0000000..602876a --- /dev/null +++ b/docs/html/namespacepenify__hook_1_1commands_1_1commit__commands_a62564c4e8ad59fc46d56cb0f9122a71a_cgraph_org.svg @@ -0,0 +1,139 @@ + + + + + + +penify_hook.commands.commit_commands.commit_code + + + +Node1 + + +penify_hook.commands.commit +_commands.commit_code + + + + + +Node2 + + +penify_hook.ui_utils.print +_error + + + + + +Node1->Node2 + + + + + +Node4 + + +penify_hook.ui_utils.print_info + + + + + +Node1->Node4 + + + + + +Node6 + + +penify_hook.ui_utils.print +_warning + + + + + +Node1->Node6 + + + + + +Node8 + + +penify_hook.utils.recursive +_search_git_folder + + + + + +Node1->Node8 + + + + + +Node3 + + +penify_hook.ui_utils.format +_error + + + + + +Node2->Node3 + + + + + +Node5 + + +penify_hook.ui_utils.format_info + + + + + +Node4->Node5 + + + + + +Node7 + + +penify_hook.ui_utils.format +_warning + + + + + +Node6->Node7 + + + + + +Node8->Node8 + + + + + diff --git a/docs/html/namespacepenify__hook_1_1commands_1_1commit__commands_a62564c4e8ad59fc46d56cb0f9122a71a_icgraph.map b/docs/html/namespacepenify__hook_1_1commands_1_1commit__commands_a62564c4e8ad59fc46d56cb0f9122a71a_icgraph.map new file mode 100644 index 0000000..45d80f3 --- /dev/null +++ b/docs/html/namespacepenify__hook_1_1commands_1_1commit__commands_a62564c4e8ad59fc46d56cb0f9122a71a_icgraph.map @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/docs/html/namespacepenify__hook_1_1commands_1_1commit__commands_a62564c4e8ad59fc46d56cb0f9122a71a_icgraph.md5 b/docs/html/namespacepenify__hook_1_1commands_1_1commit__commands_a62564c4e8ad59fc46d56cb0f9122a71a_icgraph.md5 new file mode 100644 index 0000000..30b2f36 --- /dev/null +++ b/docs/html/namespacepenify__hook_1_1commands_1_1commit__commands_a62564c4e8ad59fc46d56cb0f9122a71a_icgraph.md5 @@ -0,0 +1 @@ +b42af33551c96c0ccabd26bf5dac7901 \ No newline at end of file diff --git a/docs/html/namespacepenify__hook_1_1commands_1_1commit__commands_a62564c4e8ad59fc46d56cb0f9122a71a_icgraph.svg b/docs/html/namespacepenify__hook_1_1commands_1_1commit__commands_a62564c4e8ad59fc46d56cb0f9122a71a_icgraph.svg new file mode 100644 index 0000000..ec9d033 --- /dev/null +++ b/docs/html/namespacepenify__hook_1_1commands_1_1commit__commands_a62564c4e8ad59fc46d56cb0f9122a71a_icgraph.svg @@ -0,0 +1,234 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +penify_hook.commands.commit_commands.commit_code + + + +Node1 + + +penify_hook.commands.commit +_commands.commit_code + + + + + +Node2 + + +penify_hook.commands.commit +_commands.handle_commit + + + + + +Node1->Node2 + + + + + +Node5 + + +tests.test_commit_commands. +TestCommitCommands.test +_commit_code_error_handling + + + + + +Node1->Node5 + + + + + +Node6 + + +tests.test_commit_commands. +TestCommitCommands.test +_commit_code_with_jira_client + + + + + +Node1->Node6 + + + + + +Node7 + + +tests.test_commit_commands. +TestCommitCommands.test +_commit_code_with_jira_connection +_failure + + + + + +Node1->Node7 + + + + + +Node8 + + +tests.test_commit_commands. +TestCommitCommands.test +_commit_code_with_llm_client + + + + + +Node1->Node8 + + + + + +Node3 + + +penify_hook.main.main + + + + + +Node2->Node3 + + + + + +Node4 + + +tests.test_commit_commands. +TestCommitCommands.test +_handle_commit + + + + + +Node2->Node4 + + + + + +Node3->Node3 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/html/namespacepenify__hook_1_1commands_1_1commit__commands_a62564c4e8ad59fc46d56cb0f9122a71a_icgraph_org.svg b/docs/html/namespacepenify__hook_1_1commands_1_1commit__commands_a62564c4e8ad59fc46d56cb0f9122a71a_icgraph_org.svg new file mode 100644 index 0000000..c3b9bf0 --- /dev/null +++ b/docs/html/namespacepenify__hook_1_1commands_1_1commit__commands_a62564c4e8ad59fc46d56cb0f9122a71a_icgraph_org.svg @@ -0,0 +1,146 @@ + + + + + + +penify_hook.commands.commit_commands.commit_code + + + +Node1 + + +penify_hook.commands.commit +_commands.commit_code + + + + + +Node2 + + +penify_hook.commands.commit +_commands.handle_commit + + + + + +Node1->Node2 + + + + + +Node5 + + +tests.test_commit_commands. +TestCommitCommands.test +_commit_code_error_handling + + + + + +Node1->Node5 + + + + + +Node6 + + +tests.test_commit_commands. +TestCommitCommands.test +_commit_code_with_jira_client + + + + + +Node1->Node6 + + + + + +Node7 + + +tests.test_commit_commands. +TestCommitCommands.test +_commit_code_with_jira_connection +_failure + + + + + +Node1->Node7 + + + + + +Node8 + + +tests.test_commit_commands. +TestCommitCommands.test +_commit_code_with_llm_client + + + + + +Node1->Node8 + + + + + +Node3 + + +penify_hook.main.main + + + + + +Node2->Node3 + + + + + +Node4 + + +tests.test_commit_commands. +TestCommitCommands.test +_handle_commit + + + + + +Node2->Node4 + + + + + +Node3->Node3 + + + + + diff --git a/docs/html/namespacepenify__hook_1_1commands_1_1commit__commands_a8627583116eb78e31a4d3cdc16d2f15c_icgraph.map b/docs/html/namespacepenify__hook_1_1commands_1_1commit__commands_a8627583116eb78e31a4d3cdc16d2f15c_icgraph.map new file mode 100644 index 0000000..f16a071 --- /dev/null +++ b/docs/html/namespacepenify__hook_1_1commands_1_1commit__commands_a8627583116eb78e31a4d3cdc16d2f15c_icgraph.map @@ -0,0 +1,5 @@ + + + + + diff --git a/docs/html/namespacepenify__hook_1_1commands_1_1commit__commands_a8627583116eb78e31a4d3cdc16d2f15c_icgraph.md5 b/docs/html/namespacepenify__hook_1_1commands_1_1commit__commands_a8627583116eb78e31a4d3cdc16d2f15c_icgraph.md5 new file mode 100644 index 0000000..c49ca59 --- /dev/null +++ b/docs/html/namespacepenify__hook_1_1commands_1_1commit__commands_a8627583116eb78e31a4d3cdc16d2f15c_icgraph.md5 @@ -0,0 +1 @@ +9d31c6bce57180d0019639c06f0a64c6 \ No newline at end of file diff --git a/docs/html/namespacepenify__hook_1_1commands_1_1commit__commands_a8627583116eb78e31a4d3cdc16d2f15c_icgraph.svg b/docs/html/namespacepenify__hook_1_1commands_1_1commit__commands_a8627583116eb78e31a4d3cdc16d2f15c_icgraph.svg new file mode 100644 index 0000000..e254716 --- /dev/null +++ b/docs/html/namespacepenify__hook_1_1commands_1_1commit__commands_a8627583116eb78e31a4d3cdc16d2f15c_icgraph.svg @@ -0,0 +1,61 @@ + + + + + + +penify_hook.commands.commit_commands.setup_commit_parser + + + +Node1 + + +penify_hook.commands.commit +_commands.setup_commit_parser + + + + + +Node2 + + +penify_hook.main.main + + + + + +Node1->Node2 + + + + + +Node3 + + +tests.test_commit_commands. +TestCommitCommands.test +_setup_commit_parser + + + + + +Node1->Node3 + + + + + +Node2->Node2 + + + + + diff --git a/docs/html/namespacepenify__hook_1_1commands_1_1commit__commands_af4f739f524c38b437e4e47673d683e23_cgraph.map b/docs/html/namespacepenify__hook_1_1commands_1_1commit__commands_af4f739f524c38b437e4e47673d683e23_cgraph.map new file mode 100644 index 0000000..2910728 --- /dev/null +++ b/docs/html/namespacepenify__hook_1_1commands_1_1commit__commands_af4f739f524c38b437e4e47673d683e23_cgraph.map @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/docs/html/namespacepenify__hook_1_1commands_1_1commit__commands_af4f739f524c38b437e4e47673d683e23_cgraph.md5 b/docs/html/namespacepenify__hook_1_1commands_1_1commit__commands_af4f739f524c38b437e4e47673d683e23_cgraph.md5 new file mode 100644 index 0000000..9c1af92 --- /dev/null +++ b/docs/html/namespacepenify__hook_1_1commands_1_1commit__commands_af4f739f524c38b437e4e47673d683e23_cgraph.md5 @@ -0,0 +1 @@ +76b990698c4e374b742a1a611bfd524b \ No newline at end of file diff --git a/docs/html/namespacepenify__hook_1_1commands_1_1commit__commands_af4f739f524c38b437e4e47673d683e23_cgraph.svg b/docs/html/namespacepenify__hook_1_1commands_1_1commit__commands_af4f739f524c38b437e4e47673d683e23_cgraph.svg new file mode 100644 index 0000000..7ad44ff --- /dev/null +++ b/docs/html/namespacepenify__hook_1_1commands_1_1commit__commands_af4f739f524c38b437e4e47673d683e23_cgraph.svg @@ -0,0 +1,388 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +penify_hook.commands.commit_commands.handle_commit + + + +Node1 + + +penify_hook.commands.commit +_commands.handle_commit + + + + + +Node2 + + +penify_hook.commands.commit +_commands.commit_code + + + + + +Node1->Node2 + + + + + +Node5 + + +penify_hook.ui_utils.print_info + + + + + +Node1->Node5 + + + + + +Node10 + + +penify_hook.commands.config +_commands.get_jira_config + + + + + +Node1->Node10 + + + + + +Node13 + + +penify_hook.commands.config +_commands.get_llm_config + + + + + +Node1->Node13 + + + + + +Node14 + + +penify_hook.commands.config +_commands.get_token + + + + + +Node1->Node14 + + + + + +Node3 + + +penify_hook.ui_utils.print +_error + + + + + +Node2->Node3 + + + + + +Node2->Node5 + + + + + +Node7 + + +penify_hook.ui_utils.print +_warning + + + + + +Node2->Node7 + + + + + +Node9 + + +penify_hook.utils.recursive +_search_git_folder + + + + + +Node2->Node9 + + + + + +Node4 + + +penify_hook.ui_utils.format +_error + + + + + +Node3->Node4 + + + + + +Node6 + + +penify_hook.ui_utils.format_info + + + + + +Node5->Node6 + + + + + +Node8 + + +penify_hook.ui_utils.format +_warning + + + + + +Node7->Node8 + + + + + +Node9->Node9 + + + + + +Node11 + + +penify_hook.commands.config +_commands.get_env_var_or +_default + + + + + +Node10->Node11 + + + + + +Node12 + + +penify_hook.commands.config +_commands.load_env_files + + + + + +Node10->Node12 + + + + + +Node12->Node9 + + + + + +Node12->Node12 + + + + + +Node13->Node11 + + + + + +Node13->Node12 + + + + + +Node14->Node11 + + + + + +Node14->Node12 + + + + + +Node15 + + +penify_hook.commands.config +_commands.get_penify_config + + + + + +Node14->Node15 + + + + + +Node15->Node9 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/html/namespacepenify__hook_1_1commands_1_1commit__commands_af4f739f524c38b437e4e47673d683e23_cgraph_org.svg b/docs/html/namespacepenify__hook_1_1commands_1_1commit__commands_af4f739f524c38b437e4e47673d683e23_cgraph_org.svg new file mode 100644 index 0000000..bd1b9a1 --- /dev/null +++ b/docs/html/namespacepenify__hook_1_1commands_1_1commit__commands_af4f739f524c38b437e4e47673d683e23_cgraph_org.svg @@ -0,0 +1,300 @@ + + + + + + +penify_hook.commands.commit_commands.handle_commit + + + +Node1 + + +penify_hook.commands.commit +_commands.handle_commit + + + + + +Node2 + + +penify_hook.commands.commit +_commands.commit_code + + + + + +Node1->Node2 + + + + + +Node5 + + +penify_hook.ui_utils.print_info + + + + + +Node1->Node5 + + + + + +Node10 + + +penify_hook.commands.config +_commands.get_jira_config + + + + + +Node1->Node10 + + + + + +Node13 + + +penify_hook.commands.config +_commands.get_llm_config + + + + + +Node1->Node13 + + + + + +Node14 + + +penify_hook.commands.config +_commands.get_token + + + + + +Node1->Node14 + + + + + +Node3 + + +penify_hook.ui_utils.print +_error + + + + + +Node2->Node3 + + + + + +Node2->Node5 + + + + + +Node7 + + +penify_hook.ui_utils.print +_warning + + + + + +Node2->Node7 + + + + + +Node9 + + +penify_hook.utils.recursive +_search_git_folder + + + + + +Node2->Node9 + + + + + +Node4 + + +penify_hook.ui_utils.format +_error + + + + + +Node3->Node4 + + + + + +Node6 + + +penify_hook.ui_utils.format_info + + + + + +Node5->Node6 + + + + + +Node8 + + +penify_hook.ui_utils.format +_warning + + + + + +Node7->Node8 + + + + + +Node9->Node9 + + + + + +Node11 + + +penify_hook.commands.config +_commands.get_env_var_or +_default + + + + + +Node10->Node11 + + + + + +Node12 + + +penify_hook.commands.config +_commands.load_env_files + + + + + +Node10->Node12 + + + + + +Node12->Node9 + + + + + +Node12->Node12 + + + + + +Node13->Node11 + + + + + +Node13->Node12 + + + + + +Node14->Node11 + + + + + +Node14->Node12 + + + + + +Node15 + + +penify_hook.commands.config +_commands.get_penify_config + + + + + +Node14->Node15 + + + + + +Node15->Node9 + + + + + diff --git a/docs/html/namespacepenify__hook_1_1commands_1_1commit__commands_af4f739f524c38b437e4e47673d683e23_icgraph.map b/docs/html/namespacepenify__hook_1_1commands_1_1commit__commands_af4f739f524c38b437e4e47673d683e23_icgraph.map new file mode 100644 index 0000000..d25f3e9 --- /dev/null +++ b/docs/html/namespacepenify__hook_1_1commands_1_1commit__commands_af4f739f524c38b437e4e47673d683e23_icgraph.map @@ -0,0 +1,5 @@ + + + + + diff --git a/docs/html/namespacepenify__hook_1_1commands_1_1commit__commands_af4f739f524c38b437e4e47673d683e23_icgraph.md5 b/docs/html/namespacepenify__hook_1_1commands_1_1commit__commands_af4f739f524c38b437e4e47673d683e23_icgraph.md5 new file mode 100644 index 0000000..47a6cde --- /dev/null +++ b/docs/html/namespacepenify__hook_1_1commands_1_1commit__commands_af4f739f524c38b437e4e47673d683e23_icgraph.md5 @@ -0,0 +1 @@ +a8800179f1f560b476cc721ea33d08f7 \ No newline at end of file diff --git a/docs/html/namespacepenify__hook_1_1commands_1_1commit__commands_af4f739f524c38b437e4e47673d683e23_icgraph.svg b/docs/html/namespacepenify__hook_1_1commands_1_1commit__commands_af4f739f524c38b437e4e47673d683e23_icgraph.svg new file mode 100644 index 0000000..c57863f --- /dev/null +++ b/docs/html/namespacepenify__hook_1_1commands_1_1commit__commands_af4f739f524c38b437e4e47673d683e23_icgraph.svg @@ -0,0 +1,61 @@ + + + + + + +penify_hook.commands.commit_commands.handle_commit + + + +Node1 + + +penify_hook.commands.commit +_commands.handle_commit + + + + + +Node2 + + +penify_hook.main.main + + + + + +Node1->Node2 + + + + + +Node3 + + +tests.test_commit_commands. +TestCommitCommands.test +_handle_commit + + + + + +Node1->Node3 + + + + + +Node2->Node2 + + + + + diff --git a/docs/html/namespacepenify__hook_1_1commands_1_1config__commands.html b/docs/html/namespacepenify__hook_1_1commands_1_1config__commands.html new file mode 100644 index 0000000..3f52559 --- /dev/null +++ b/docs/html/namespacepenify__hook_1_1commands_1_1config__commands.html @@ -0,0 +1,567 @@ + + + + + + + + + + + + + + + + + + +penify-cli: penify_hook.commands.config_commands Namespace Reference + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    penify-cli +
    +
    +
    + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    + +
    penify_hook.commands.config_commands Namespace Reference
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + +

    +Functions

    None load_env_files ()
     
    Path get_penify_config ()
     
    Any get_env_var_or_default (str env_var, Any default=None)
     
    def save_llm_config (model, api_base, api_key)
     
    def save_jira_config (url, username, api_token)
     
    Dict[str, str] get_llm_config ()
     
    Dict[str, str] get_jira_config ()
     
    def config_llm_web ()
     
    def config_jira_web ()
     
    Optional[str] get_token ()
     
    + + + + + +

    +Variables

    bool DOTENV_AVAILABLE = True
     
     path
     
    +

    Function Documentation

    + +

    ◆ config_jira_web()

    + +
    +
    + + + + + + + +
    def penify_hook.commands.config_commands.config_jira_web ()
    +
    +
    Starts a web server for configuring JIRA settings.
    +Here is the call graph for this function:
    +
    +
    +
    +
    +
    +Here is the caller graph for this function:
    +
    +
    +
    +
    + +
    +
    + +

    ◆ config_llm_web()

    + +
    +
    + + + + + + + +
    def penify_hook.commands.config_commands.config_llm_web ()
    +
    +
    Starts an HTTP server for configuring LLM settings via a web interface.
    +Here is the caller graph for this function:
    +
    +
    +
    +
    + +
    +
    + +

    ◆ get_env_var_or_default()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    Any penify_hook.commands.config_commands.get_env_var_or_default (str env_var,
    Any  default = None 
    )
    +
    +
    Get environment variable or return default value.
    +Here is the caller graph for this function:
    +
    +
    +
    +
    + +
    +
    + +

    ◆ get_jira_config()

    + +
    +
    + + + + + + + +
    Dict[str, str] penify_hook.commands.config_commands.get_jira_config ()
    +
    +
    Retrieve JIRA configuration from environment variables.
    +Here is the call graph for this function:
    +
    +
    +
    +
    +
    +Here is the caller graph for this function:
    +
    +
    +
    +
    + +
    +
    + +

    ◆ get_llm_config()

    + +
    +
    + + + + + + + +
    Dict[str, str] penify_hook.commands.config_commands.get_llm_config ()
    +
    +
    Retrieve LLM configuration from environment variables.
    +Here is the call graph for this function:
    +
    +
    +
    +
    +
    +Here is the caller graph for this function:
    +
    +
    +
    +
    + +
    +
    + +

    ◆ get_penify_config()

    + +
    +
    + + + + + + + +
    Path penify_hook.commands.config_commands.get_penify_config ()
    +
    +
    Returns the path to the `config.json` file within the `.penify` directory,
    +creating it if necessary.
    +Here is the call graph for this function:
    +
    +
    +
    +
    +
    +Here is the caller graph for this function:
    +
    +
    +
    +
    + +
    +
    + +

    ◆ get_token()

    + +
    +
    + + + + + + + +
    Optional[str] penify_hook.commands.config_commands.get_token ()
    +
    +
    Retrieves an API token using a prioritized method.
    +
    +This function first attempts to load environment variables from all `.env`
    +files and checks if the `PENIFY_API_TOKEN` environment variable is set. If
    +found, it returns the token. If not, it looks for the API key in a
    +configuration file named 'api_keys'. If both methods fail, it returns None.
    +
    +Returns:
    +    str or None: The API token if found, otherwise None.
    +
    +Here is the call graph for this function:
    +
    +
    +
    +
    +
    +Here is the caller graph for this function:
    +
    +
    +
    +
    + +
    +
    + +

    ◆ load_env_files()

    + +
    +
    + + + + + + + +
    None penify_hook.commands.config_commands.load_env_files ()
    +
    +
    Load environment variables from .env files in various locations with proper
    +priority.
    +
    +This function loads environment variables from .env files located in different
    +directories, prioritizing the current directory over the Git repo root and the
    +user home directory. The loading process ensures that later files override
    +earlier ones.
    +
    +Here is the call graph for this function:
    +
    +
    +
    +
    +
    +Here is the caller graph for this function:
    +
    +
    +
    +
    + +
    +
    + +

    ◆ save_jira_config()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    def penify_hook.commands.config_commands.save_jira_config ( url,
     username,
     api_token 
    )
    +
    +
    Save JIRA configuration settings to a .env file.
    +
    +This function saves JIRA configuration following these steps: 1. Determine the
    +target .env file location based on whether the current directory is inside a
    +Git repository. 2. If inside a Git repo, use the Git repo root's .env file;
    +otherwise, use the user home directory's .env file. 3. Read the existing
    +content of the .env file (if it exists) to preserve other settings. 4. Update
    +the .env content with the new JIRA configuration. 5. Write the updated content
    +back to the .env file. 6. Optionally, reload environment variables to make
    +changes immediately available.
    +
    +Args:
    +    url (str): The JIRA URL to be saved in the .env file.
    +    username (str): The JIRA username to be saved in the .env file.
    +    api_token (str): The JIRA API token to be saved in the .env file.
    +
    +Returns:
    +    bool: True if the configuration was successfully saved, False otherwise.
    +
    +Here is the call graph for this function:
    +
    +
    +
    +
    +
    +Here is the caller graph for this function:
    +
    +
    +
    +
    + +
    +
    + +

    ◆ save_llm_config()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    def penify_hook.commands.config_commands.save_llm_config ( model,
     api_base,
     api_key 
    )
    +
    +
    Save LLM configuration settings to an .env file.
    +
    +This function saves the LLM configuration following a specific priority: 1. Git
    +repo root .env (if inside a git repo) 2. User home directory .env  It handles
    +the detection of the Git repo root, reads the existing .env content, updates it
    +with the new LLM configuration, and writes it back to the file. It also reloads
    +the environment variables to make changes immediately available.
    +
    +Args:
    +    model (str): The name of the language model.
    +    api_base (str): The base URL for the API.
    +    api_key (str): The API key for authentication.
    +
    +Returns:
    +    bool: True if the configuration is saved successfully, False otherwise.
    +
    +Here is the call graph for this function:
    +
    +
    +
    +
    +
    +Here is the caller graph for this function:
    +
    +
    +
    +
    + +
    +
    +

    Variable Documentation

    + +

    ◆ DOTENV_AVAILABLE

    + +
    +
    + + + + +
    bool penify_hook.commands.config_commands.DOTENV_AVAILABLE = True
    +
    + +
    +
    + +

    ◆ path

    + +
    +
    + + + + +
    penify_hook.commands.config_commands.path
    +
    + +
    +
    +
    +
    + + + + + diff --git a/docs/html/namespacepenify__hook_1_1commands_1_1config__commands_a15bf3685c4dcb5c15ba6a4055e484cf2_cgraph.map b/docs/html/namespacepenify__hook_1_1commands_1_1config__commands_a15bf3685c4dcb5c15ba6a4055e484cf2_cgraph.map new file mode 100644 index 0000000..3d04ded --- /dev/null +++ b/docs/html/namespacepenify__hook_1_1commands_1_1config__commands_a15bf3685c4dcb5c15ba6a4055e484cf2_cgraph.map @@ -0,0 +1,6 @@ + + + + + + diff --git a/docs/html/namespacepenify__hook_1_1commands_1_1config__commands_a15bf3685c4dcb5c15ba6a4055e484cf2_cgraph.md5 b/docs/html/namespacepenify__hook_1_1commands_1_1config__commands_a15bf3685c4dcb5c15ba6a4055e484cf2_cgraph.md5 new file mode 100644 index 0000000..8a855e7 --- /dev/null +++ b/docs/html/namespacepenify__hook_1_1commands_1_1config__commands_a15bf3685c4dcb5c15ba6a4055e484cf2_cgraph.md5 @@ -0,0 +1 @@ +168858f3e9d4759f99db4c52c229e797 \ No newline at end of file diff --git a/docs/html/namespacepenify__hook_1_1commands_1_1config__commands_a15bf3685c4dcb5c15ba6a4055e484cf2_cgraph.svg b/docs/html/namespacepenify__hook_1_1commands_1_1config__commands_a15bf3685c4dcb5c15ba6a4055e484cf2_cgraph.svg new file mode 100644 index 0000000..fb362e4 --- /dev/null +++ b/docs/html/namespacepenify__hook_1_1commands_1_1config__commands_a15bf3685c4dcb5c15ba6a4055e484cf2_cgraph.svg @@ -0,0 +1,172 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +penify_hook.commands.config_commands.get_jira_config + + + +Node1 + + +penify_hook.commands.config +_commands.get_jira_config + + + + + +Node2 + + +penify_hook.commands.config +_commands.get_env_var_or +_default + + + + + +Node1->Node2 + + + + + +Node3 + + +penify_hook.commands.config +_commands.load_env_files + + + + + +Node1->Node3 + + + + + +Node3->Node3 + + + + + +Node4 + + +penify_hook.utils.recursive +_search_git_folder + + + + + +Node3->Node4 + + + + + +Node4->Node4 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/html/namespacepenify__hook_1_1commands_1_1config__commands_a15bf3685c4dcb5c15ba6a4055e484cf2_cgraph_org.svg b/docs/html/namespacepenify__hook_1_1commands_1_1config__commands_a15bf3685c4dcb5c15ba6a4055e484cf2_cgraph_org.svg new file mode 100644 index 0000000..3cc35c6 --- /dev/null +++ b/docs/html/namespacepenify__hook_1_1commands_1_1config__commands_a15bf3685c4dcb5c15ba6a4055e484cf2_cgraph_org.svg @@ -0,0 +1,84 @@ + + + + + + +penify_hook.commands.config_commands.get_jira_config + + + +Node1 + + +penify_hook.commands.config +_commands.get_jira_config + + + + + +Node2 + + +penify_hook.commands.config +_commands.get_env_var_or +_default + + + + + +Node1->Node2 + + + + + +Node3 + + +penify_hook.commands.config +_commands.load_env_files + + + + + +Node1->Node3 + + + + + +Node3->Node3 + + + + + +Node4 + + +penify_hook.utils.recursive +_search_git_folder + + + + + +Node3->Node4 + + + + + +Node4->Node4 + + + + + diff --git a/docs/html/namespacepenify__hook_1_1commands_1_1config__commands_a15bf3685c4dcb5c15ba6a4055e484cf2_icgraph.map b/docs/html/namespacepenify__hook_1_1commands_1_1config__commands_a15bf3685c4dcb5c15ba6a4055e484cf2_icgraph.map new file mode 100644 index 0000000..31799e7 --- /dev/null +++ b/docs/html/namespacepenify__hook_1_1commands_1_1config__commands_a15bf3685c4dcb5c15ba6a4055e484cf2_icgraph.map @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/docs/html/namespacepenify__hook_1_1commands_1_1config__commands_a15bf3685c4dcb5c15ba6a4055e484cf2_icgraph.md5 b/docs/html/namespacepenify__hook_1_1commands_1_1config__commands_a15bf3685c4dcb5c15ba6a4055e484cf2_icgraph.md5 new file mode 100644 index 0000000..3595ee0 --- /dev/null +++ b/docs/html/namespacepenify__hook_1_1commands_1_1config__commands_a15bf3685c4dcb5c15ba6a4055e484cf2_icgraph.md5 @@ -0,0 +1 @@ +543187d5c63c1c460ff6dd5d57c6a646 \ No newline at end of file diff --git a/docs/html/namespacepenify__hook_1_1commands_1_1config__commands_a15bf3685c4dcb5c15ba6a4055e484cf2_icgraph.svg b/docs/html/namespacepenify__hook_1_1commands_1_1config__commands_a15bf3685c4dcb5c15ba6a4055e484cf2_icgraph.svg new file mode 100644 index 0000000..b03c3d5 --- /dev/null +++ b/docs/html/namespacepenify__hook_1_1commands_1_1config__commands_a15bf3685c4dcb5c15ba6a4055e484cf2_icgraph.svg @@ -0,0 +1,237 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +penify_hook.commands.config_commands.get_jira_config + + + +Node1 + + +penify_hook.commands.config +_commands.get_jira_config + + + + + +Node2 + + +penify_hook.commands.config +_commands.config_jira_web + + + + + +Node1->Node2 + + + + + +Node6 + + +penify_hook.commands.commit +_commands.handle_commit + + + + + +Node1->Node6 + + + + + +Node8 + + +tests.test_config_commands. +TestConfigCommands.test +_get_jira_config_exists + + + + + +Node1->Node8 + + + + + +Node3 + + +penify_hook.config +_command.handle_config + + + + + +Node2->Node3 + + + + + +Node5 + + +tests.test_web_config.Test +WebConfig.test_config_jira +_web_server_setup + + + + + +Node2->Node5 + + + + + +Node4 + + +penify_hook.main.main + + + + + +Node3->Node4 + + + + + +Node4->Node4 + + + + + +Node6->Node4 + + + + + +Node7 + + +tests.test_commit_commands. +TestCommitCommands.test +_handle_commit + + + + + +Node6->Node7 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/html/namespacepenify__hook_1_1commands_1_1config__commands_a15bf3685c4dcb5c15ba6a4055e484cf2_icgraph_org.svg b/docs/html/namespacepenify__hook_1_1commands_1_1config__commands_a15bf3685c4dcb5c15ba6a4055e484cf2_icgraph_org.svg new file mode 100644 index 0000000..9f5c40f --- /dev/null +++ b/docs/html/namespacepenify__hook_1_1commands_1_1config__commands_a15bf3685c4dcb5c15ba6a4055e484cf2_icgraph_org.svg @@ -0,0 +1,149 @@ + + + + + + +penify_hook.commands.config_commands.get_jira_config + + + +Node1 + + +penify_hook.commands.config +_commands.get_jira_config + + + + + +Node2 + + +penify_hook.commands.config +_commands.config_jira_web + + + + + +Node1->Node2 + + + + + +Node6 + + +penify_hook.commands.commit +_commands.handle_commit + + + + + +Node1->Node6 + + + + + +Node8 + + +tests.test_config_commands. +TestConfigCommands.test +_get_jira_config_exists + + + + + +Node1->Node8 + + + + + +Node3 + + +penify_hook.config +_command.handle_config + + + + + +Node2->Node3 + + + + + +Node5 + + +tests.test_web_config.Test +WebConfig.test_config_jira +_web_server_setup + + + + + +Node2->Node5 + + + + + +Node4 + + +penify_hook.main.main + + + + + +Node3->Node4 + + + + + +Node4->Node4 + + + + + +Node6->Node4 + + + + + +Node7 + + +tests.test_commit_commands. +TestCommitCommands.test +_handle_commit + + + + + +Node6->Node7 + + + + + diff --git a/docs/html/namespacepenify__hook_1_1commands_1_1config__commands_a185dfc34a655ed80e6c95939b6f3c35c_icgraph.map b/docs/html/namespacepenify__hook_1_1commands_1_1config__commands_a185dfc34a655ed80e6c95939b6f3c35c_icgraph.map new file mode 100644 index 0000000..6bb067d --- /dev/null +++ b/docs/html/namespacepenify__hook_1_1commands_1_1config__commands_a185dfc34a655ed80e6c95939b6f3c35c_icgraph.map @@ -0,0 +1,6 @@ + + + + + + diff --git a/docs/html/namespacepenify__hook_1_1commands_1_1config__commands_a185dfc34a655ed80e6c95939b6f3c35c_icgraph.md5 b/docs/html/namespacepenify__hook_1_1commands_1_1config__commands_a185dfc34a655ed80e6c95939b6f3c35c_icgraph.md5 new file mode 100644 index 0000000..fd6eb21 --- /dev/null +++ b/docs/html/namespacepenify__hook_1_1commands_1_1config__commands_a185dfc34a655ed80e6c95939b6f3c35c_icgraph.md5 @@ -0,0 +1 @@ +91a6c2c6a25f3c8c1d38cd6f5f5c3f25 \ No newline at end of file diff --git a/docs/html/namespacepenify__hook_1_1commands_1_1config__commands_a185dfc34a655ed80e6c95939b6f3c35c_icgraph.svg b/docs/html/namespacepenify__hook_1_1commands_1_1config__commands_a185dfc34a655ed80e6c95939b6f3c35c_icgraph.svg new file mode 100644 index 0000000..ece71b8 --- /dev/null +++ b/docs/html/namespacepenify__hook_1_1commands_1_1config__commands_a185dfc34a655ed80e6c95939b6f3c35c_icgraph.svg @@ -0,0 +1,165 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +penify_hook.commands.config_commands.config_llm_web + + + +Node1 + + +penify_hook.commands.config +_commands.config_llm_web + + + + + +Node2 + + +penify_hook.config +_command.handle_config + + + + + +Node1->Node2 + + + + + +Node4 + + +tests.test_web_config.Test +WebConfig.test_config_llm +_web_server_setup + + + + + +Node1->Node4 + + + + + +Node3 + + +penify_hook.main.main + + + + + +Node2->Node3 + + + + + +Node3->Node3 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/html/namespacepenify__hook_1_1commands_1_1config__commands_a185dfc34a655ed80e6c95939b6f3c35c_icgraph_org.svg b/docs/html/namespacepenify__hook_1_1commands_1_1config__commands_a185dfc34a655ed80e6c95939b6f3c35c_icgraph_org.svg new file mode 100644 index 0000000..3ab7894 --- /dev/null +++ b/docs/html/namespacepenify__hook_1_1commands_1_1config__commands_a185dfc34a655ed80e6c95939b6f3c35c_icgraph_org.svg @@ -0,0 +1,77 @@ + + + + + + +penify_hook.commands.config_commands.config_llm_web + + + +Node1 + + +penify_hook.commands.config +_commands.config_llm_web + + + + + +Node2 + + +penify_hook.config +_command.handle_config + + + + + +Node1->Node2 + + + + + +Node4 + + +tests.test_web_config.Test +WebConfig.test_config_llm +_web_server_setup + + + + + +Node1->Node4 + + + + + +Node3 + + +penify_hook.main.main + + + + + +Node2->Node3 + + + + + +Node3->Node3 + + + + + diff --git a/docs/html/namespacepenify__hook_1_1commands_1_1config__commands_a3caf2b062dd33b1f1d7ddc7224f0ff87_icgraph.map b/docs/html/namespacepenify__hook_1_1commands_1_1config__commands_a3caf2b062dd33b1f1d7ddc7224f0ff87_icgraph.map new file mode 100644 index 0000000..988f965 --- /dev/null +++ b/docs/html/namespacepenify__hook_1_1commands_1_1config__commands_a3caf2b062dd33b1f1d7ddc7224f0ff87_icgraph.map @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/html/namespacepenify__hook_1_1commands_1_1config__commands_a3caf2b062dd33b1f1d7ddc7224f0ff87_icgraph.md5 b/docs/html/namespacepenify__hook_1_1commands_1_1config__commands_a3caf2b062dd33b1f1d7ddc7224f0ff87_icgraph.md5 new file mode 100644 index 0000000..f9c067a --- /dev/null +++ b/docs/html/namespacepenify__hook_1_1commands_1_1config__commands_a3caf2b062dd33b1f1d7ddc7224f0ff87_icgraph.md5 @@ -0,0 +1 @@ +78a315f2a9f5ef12496dc5b4a1f2f578 \ No newline at end of file diff --git a/docs/html/namespacepenify__hook_1_1commands_1_1config__commands_a3caf2b062dd33b1f1d7ddc7224f0ff87_icgraph.svg b/docs/html/namespacepenify__hook_1_1commands_1_1config__commands_a3caf2b062dd33b1f1d7ddc7224f0ff87_icgraph.svg new file mode 100644 index 0000000..af8bba2 --- /dev/null +++ b/docs/html/namespacepenify__hook_1_1commands_1_1config__commands_a3caf2b062dd33b1f1d7ddc7224f0ff87_icgraph.svg @@ -0,0 +1,486 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +penify_hook.commands.config_commands.get_env_var_or_default + + + +Node1 + + +penify_hook.commands.config +_commands.get_env_var_or +_default + + + + + +Node2 + + +penify_hook.commands.config +_commands.get_jira_config + + + + + +Node1->Node2 + + + + + +Node10 + + +penify_hook.commands.config +_commands.get_llm_config + + + + + +Node1->Node10 + + + + + +Node14 + + +penify_hook.commands.config +_commands.get_token + + + + + +Node1->Node14 + + + + + +Node3 + + +penify_hook.commands.config +_commands.config_jira_web + + + + + +Node2->Node3 + + + + + +Node7 + + +penify_hook.commands.commit +_commands.handle_commit + + + + + +Node2->Node7 + + + + + +Node9 + + +tests.test_config_commands. +TestConfigCommands.test +_get_jira_config_exists + + + + + +Node2->Node9 + + + + + +Node4 + + +penify_hook.config +_command.handle_config + + + + + +Node3->Node4 + + + + + +Node6 + + +tests.test_web_config.Test +WebConfig.test_config_jira +_web_server_setup + + + + + +Node3->Node6 + + + + + +Node5 + + +penify_hook.main.main + + + + + +Node4->Node5 + + + + + +Node5->Node5 + + + + + +Node7->Node5 + + + + + +Node8 + + +tests.test_commit_commands. +TestCommitCommands.test +_handle_commit + + + + + +Node7->Node8 + + + + + +Node10->Node7 + + + + + +Node11 + + +tests.test_config_commands. +TestConfigCommands.test +_get_llm_config_empty + + + + + +Node10->Node11 + + + + + +Node12 + + +tests.test_config_commands. +TestConfigCommands.test +_get_llm_config_exists + + + + + +Node10->Node12 + + + + + +Node13 + + +tests.test_config_commands. +TestConfigCommands.test +_get_llm_config_invalid_json + + + + + +Node10->Node13 + + + + + +Node14->Node7 + + + + + +Node15 + + +penify_hook.commands.doc +_commands.handle_docgen + + + + + +Node14->Node15 + + + + + +Node20 + + +tests.test_config_commands. +TestConfigCommands.test +_get_token_from_config + + + + + +Node14->Node20 + + + + + +Node21 + + +tests.test_config_commands. +TestConfigCommands.test +_get_token_from_env + + + + + +Node14->Node21 + + + + + +Node22 + + +tests.test_config_commands. +TestConfigCommands.test +_get_token_not_found + + + + + +Node14->Node22 + + + + + +Node15->Node5 + + + + + +Node16 + + +tests.test_doc_commands.test +_handle_docgen_generate + + + + + +Node15->Node16 + + + + + +Node17 + + +tests.test_doc_commands.test +_handle_docgen_install_hook + + + + + +Node15->Node17 + + + + + +Node18 + + +tests.test_doc_commands.test +_handle_docgen_no_token + + + + + +Node15->Node18 + + + + + +Node19 + + +tests.test_doc_commands.test +_handle_docgen_uninstall_hook + + + + + +Node15->Node19 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/html/namespacepenify__hook_1_1commands_1_1config__commands_a3caf2b062dd33b1f1d7ddc7224f0ff87_icgraph_org.svg b/docs/html/namespacepenify__hook_1_1commands_1_1config__commands_a3caf2b062dd33b1f1d7ddc7224f0ff87_icgraph_org.svg new file mode 100644 index 0000000..5dd38f9 --- /dev/null +++ b/docs/html/namespacepenify__hook_1_1commands_1_1config__commands_a3caf2b062dd33b1f1d7ddc7224f0ff87_icgraph_org.svg @@ -0,0 +1,398 @@ + + + + + + +penify_hook.commands.config_commands.get_env_var_or_default + + + +Node1 + + +penify_hook.commands.config +_commands.get_env_var_or +_default + + + + + +Node2 + + +penify_hook.commands.config +_commands.get_jira_config + + + + + +Node1->Node2 + + + + + +Node10 + + +penify_hook.commands.config +_commands.get_llm_config + + + + + +Node1->Node10 + + + + + +Node14 + + +penify_hook.commands.config +_commands.get_token + + + + + +Node1->Node14 + + + + + +Node3 + + +penify_hook.commands.config +_commands.config_jira_web + + + + + +Node2->Node3 + + + + + +Node7 + + +penify_hook.commands.commit +_commands.handle_commit + + + + + +Node2->Node7 + + + + + +Node9 + + +tests.test_config_commands. +TestConfigCommands.test +_get_jira_config_exists + + + + + +Node2->Node9 + + + + + +Node4 + + +penify_hook.config +_command.handle_config + + + + + +Node3->Node4 + + + + + +Node6 + + +tests.test_web_config.Test +WebConfig.test_config_jira +_web_server_setup + + + + + +Node3->Node6 + + + + + +Node5 + + +penify_hook.main.main + + + + + +Node4->Node5 + + + + + +Node5->Node5 + + + + + +Node7->Node5 + + + + + +Node8 + + +tests.test_commit_commands. +TestCommitCommands.test +_handle_commit + + + + + +Node7->Node8 + + + + + +Node10->Node7 + + + + + +Node11 + + +tests.test_config_commands. +TestConfigCommands.test +_get_llm_config_empty + + + + + +Node10->Node11 + + + + + +Node12 + + +tests.test_config_commands. +TestConfigCommands.test +_get_llm_config_exists + + + + + +Node10->Node12 + + + + + +Node13 + + +tests.test_config_commands. +TestConfigCommands.test +_get_llm_config_invalid_json + + + + + +Node10->Node13 + + + + + +Node14->Node7 + + + + + +Node15 + + +penify_hook.commands.doc +_commands.handle_docgen + + + + + +Node14->Node15 + + + + + +Node20 + + +tests.test_config_commands. +TestConfigCommands.test +_get_token_from_config + + + + + +Node14->Node20 + + + + + +Node21 + + +tests.test_config_commands. +TestConfigCommands.test +_get_token_from_env + + + + + +Node14->Node21 + + + + + +Node22 + + +tests.test_config_commands. +TestConfigCommands.test +_get_token_not_found + + + + + +Node14->Node22 + + + + + +Node15->Node5 + + + + + +Node16 + + +tests.test_doc_commands.test +_handle_docgen_generate + + + + + +Node15->Node16 + + + + + +Node17 + + +tests.test_doc_commands.test +_handle_docgen_install_hook + + + + + +Node15->Node17 + + + + + +Node18 + + +tests.test_doc_commands.test +_handle_docgen_no_token + + + + + +Node15->Node18 + + + + + +Node19 + + +tests.test_doc_commands.test +_handle_docgen_uninstall_hook + + + + + +Node15->Node19 + + + + + diff --git a/docs/html/namespacepenify__hook_1_1commands_1_1config__commands_a4617bc5956e502c9555dc0dda0376df4_cgraph.map b/docs/html/namespacepenify__hook_1_1commands_1_1config__commands_a4617bc5956e502c9555dc0dda0376df4_cgraph.map new file mode 100644 index 0000000..523e618 --- /dev/null +++ b/docs/html/namespacepenify__hook_1_1commands_1_1config__commands_a4617bc5956e502c9555dc0dda0376df4_cgraph.map @@ -0,0 +1,4 @@ + + + + diff --git a/docs/html/namespacepenify__hook_1_1commands_1_1config__commands_a4617bc5956e502c9555dc0dda0376df4_cgraph.md5 b/docs/html/namespacepenify__hook_1_1commands_1_1config__commands_a4617bc5956e502c9555dc0dda0376df4_cgraph.md5 new file mode 100644 index 0000000..1d6bd9c --- /dev/null +++ b/docs/html/namespacepenify__hook_1_1commands_1_1config__commands_a4617bc5956e502c9555dc0dda0376df4_cgraph.md5 @@ -0,0 +1 @@ +1312bc7ffa0a3c4b3d914591e46647ea \ No newline at end of file diff --git a/docs/html/namespacepenify__hook_1_1commands_1_1config__commands_a4617bc5956e502c9555dc0dda0376df4_cgraph.svg b/docs/html/namespacepenify__hook_1_1commands_1_1config__commands_a4617bc5956e502c9555dc0dda0376df4_cgraph.svg new file mode 100644 index 0000000..6772dc2 --- /dev/null +++ b/docs/html/namespacepenify__hook_1_1commands_1_1config__commands_a4617bc5956e502c9555dc0dda0376df4_cgraph.svg @@ -0,0 +1,45 @@ + + + + + + +penify_hook.commands.config_commands.save_llm_config + + + +Node1 + + +penify_hook.commands.config +_commands.save_llm_config + + + + + +Node2 + + +penify_hook.utils.recursive +_search_git_folder + + + + + +Node1->Node2 + + + + + +Node2->Node2 + + + + + diff --git a/docs/html/namespacepenify__hook_1_1commands_1_1config__commands_a4617bc5956e502c9555dc0dda0376df4_icgraph.map b/docs/html/namespacepenify__hook_1_1commands_1_1config__commands_a4617bc5956e502c9555dc0dda0376df4_icgraph.map new file mode 100644 index 0000000..0a1bd6e --- /dev/null +++ b/docs/html/namespacepenify__hook_1_1commands_1_1config__commands_a4617bc5956e502c9555dc0dda0376df4_icgraph.map @@ -0,0 +1,7 @@ + + + + + + + diff --git a/docs/html/namespacepenify__hook_1_1commands_1_1config__commands_a4617bc5956e502c9555dc0dda0376df4_icgraph.md5 b/docs/html/namespacepenify__hook_1_1commands_1_1config__commands_a4617bc5956e502c9555dc0dda0376df4_icgraph.md5 new file mode 100644 index 0000000..4427799 --- /dev/null +++ b/docs/html/namespacepenify__hook_1_1commands_1_1config__commands_a4617bc5956e502c9555dc0dda0376df4_icgraph.md5 @@ -0,0 +1 @@ +64e3e5d1614b987e9beaa7b1002e49e6 \ No newline at end of file diff --git a/docs/html/namespacepenify__hook_1_1commands_1_1config__commands_a4617bc5956e502c9555dc0dda0376df4_icgraph.svg b/docs/html/namespacepenify__hook_1_1commands_1_1config__commands_a4617bc5956e502c9555dc0dda0376df4_icgraph.svg new file mode 100644 index 0000000..7653ae5 --- /dev/null +++ b/docs/html/namespacepenify__hook_1_1commands_1_1config__commands_a4617bc5956e502c9555dc0dda0376df4_icgraph.svg @@ -0,0 +1,182 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +penify_hook.commands.config_commands.save_llm_config + + + +Node1 + + +penify_hook.commands.config +_commands.save_llm_config + + + + + +Node2 + + +penify_hook.config +_command.handle_config + + + + + +Node1->Node2 + + + + + +Node4 + + +tests.test_config_commands. +TestConfigCommands.test +_save_llm_config_failure + + + + + +Node1->Node4 + + + + + +Node5 + + +tests.test_config_commands. +TestConfigCommands.test +_save_llm_config_success + + + + + +Node1->Node5 + + + + + +Node3 + + +penify_hook.main.main + + + + + +Node2->Node3 + + + + + +Node3->Node3 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/html/namespacepenify__hook_1_1commands_1_1config__commands_a4617bc5956e502c9555dc0dda0376df4_icgraph_org.svg b/docs/html/namespacepenify__hook_1_1commands_1_1config__commands_a4617bc5956e502c9555dc0dda0376df4_icgraph_org.svg new file mode 100644 index 0000000..4779598 --- /dev/null +++ b/docs/html/namespacepenify__hook_1_1commands_1_1config__commands_a4617bc5956e502c9555dc0dda0376df4_icgraph_org.svg @@ -0,0 +1,94 @@ + + + + + + +penify_hook.commands.config_commands.save_llm_config + + + +Node1 + + +penify_hook.commands.config +_commands.save_llm_config + + + + + +Node2 + + +penify_hook.config +_command.handle_config + + + + + +Node1->Node2 + + + + + +Node4 + + +tests.test_config_commands. +TestConfigCommands.test +_save_llm_config_failure + + + + + +Node1->Node4 + + + + + +Node5 + + +tests.test_config_commands. +TestConfigCommands.test +_save_llm_config_success + + + + + +Node1->Node5 + + + + + +Node3 + + +penify_hook.main.main + + + + + +Node2->Node3 + + + + + +Node3->Node3 + + + + + diff --git a/docs/html/namespacepenify__hook_1_1commands_1_1config__commands_a5503d51c905e2f1b299b12d2a73bd812_cgraph.map b/docs/html/namespacepenify__hook_1_1commands_1_1config__commands_a5503d51c905e2f1b299b12d2a73bd812_cgraph.map new file mode 100644 index 0000000..8a89956 --- /dev/null +++ b/docs/html/namespacepenify__hook_1_1commands_1_1config__commands_a5503d51c905e2f1b299b12d2a73bd812_cgraph.map @@ -0,0 +1,7 @@ + + + + + + + diff --git a/docs/html/namespacepenify__hook_1_1commands_1_1config__commands_a5503d51c905e2f1b299b12d2a73bd812_cgraph.md5 b/docs/html/namespacepenify__hook_1_1commands_1_1config__commands_a5503d51c905e2f1b299b12d2a73bd812_cgraph.md5 new file mode 100644 index 0000000..47f24a6 --- /dev/null +++ b/docs/html/namespacepenify__hook_1_1commands_1_1config__commands_a5503d51c905e2f1b299b12d2a73bd812_cgraph.md5 @@ -0,0 +1 @@ +e227b3587529f3c7fa14501fb496ccc8 \ No newline at end of file diff --git a/docs/html/namespacepenify__hook_1_1commands_1_1config__commands_a5503d51c905e2f1b299b12d2a73bd812_cgraph.svg b/docs/html/namespacepenify__hook_1_1commands_1_1config__commands_a5503d51c905e2f1b299b12d2a73bd812_cgraph.svg new file mode 100644 index 0000000..af6abf0 --- /dev/null +++ b/docs/html/namespacepenify__hook_1_1commands_1_1config__commands_a5503d51c905e2f1b299b12d2a73bd812_cgraph.svg @@ -0,0 +1,194 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +penify_hook.commands.config_commands.get_token + + + +Node1 + + +penify_hook.commands.config +_commands.get_token + + + + + +Node2 + + +penify_hook.commands.config +_commands.get_env_var_or +_default + + + + + +Node1->Node2 + + + + + +Node3 + + +penify_hook.commands.config +_commands.get_penify_config + + + + + +Node1->Node3 + + + + + +Node5 + + +penify_hook.commands.config +_commands.load_env_files + + + + + +Node1->Node5 + + + + + +Node4 + + +penify_hook.utils.recursive +_search_git_folder + + + + + +Node3->Node4 + + + + + +Node4->Node4 + + + + + +Node5->Node4 + + + + + +Node5->Node5 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/html/namespacepenify__hook_1_1commands_1_1config__commands_a5503d51c905e2f1b299b12d2a73bd812_cgraph_org.svg b/docs/html/namespacepenify__hook_1_1commands_1_1config__commands_a5503d51c905e2f1b299b12d2a73bd812_cgraph_org.svg new file mode 100644 index 0000000..0cd794d --- /dev/null +++ b/docs/html/namespacepenify__hook_1_1commands_1_1config__commands_a5503d51c905e2f1b299b12d2a73bd812_cgraph_org.svg @@ -0,0 +1,106 @@ + + + + + + +penify_hook.commands.config_commands.get_token + + + +Node1 + + +penify_hook.commands.config +_commands.get_token + + + + + +Node2 + + +penify_hook.commands.config +_commands.get_env_var_or +_default + + + + + +Node1->Node2 + + + + + +Node3 + + +penify_hook.commands.config +_commands.get_penify_config + + + + + +Node1->Node3 + + + + + +Node5 + + +penify_hook.commands.config +_commands.load_env_files + + + + + +Node1->Node5 + + + + + +Node4 + + +penify_hook.utils.recursive +_search_git_folder + + + + + +Node3->Node4 + + + + + +Node4->Node4 + + + + + +Node5->Node4 + + + + + +Node5->Node5 + + + + + diff --git a/docs/html/namespacepenify__hook_1_1commands_1_1config__commands_a5503d51c905e2f1b299b12d2a73bd812_icgraph.map b/docs/html/namespacepenify__hook_1_1commands_1_1config__commands_a5503d51c905e2f1b299b12d2a73bd812_icgraph.map new file mode 100644 index 0000000..27e33e7 --- /dev/null +++ b/docs/html/namespacepenify__hook_1_1commands_1_1config__commands_a5503d51c905e2f1b299b12d2a73bd812_icgraph.map @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/docs/html/namespacepenify__hook_1_1commands_1_1config__commands_a5503d51c905e2f1b299b12d2a73bd812_icgraph.md5 b/docs/html/namespacepenify__hook_1_1commands_1_1config__commands_a5503d51c905e2f1b299b12d2a73bd812_icgraph.md5 new file mode 100644 index 0000000..5a5a866 --- /dev/null +++ b/docs/html/namespacepenify__hook_1_1commands_1_1config__commands_a5503d51c905e2f1b299b12d2a73bd812_icgraph.md5 @@ -0,0 +1 @@ +9c6b048bd5412b617ea890b1f88c2104 \ No newline at end of file diff --git a/docs/html/namespacepenify__hook_1_1commands_1_1config__commands_a5503d51c905e2f1b299b12d2a73bd812_icgraph.svg b/docs/html/namespacepenify__hook_1_1commands_1_1config__commands_a5503d51c905e2f1b299b12d2a73bd812_icgraph.svg new file mode 100644 index 0000000..6b05345 --- /dev/null +++ b/docs/html/namespacepenify__hook_1_1commands_1_1config__commands_a5503d51c905e2f1b299b12d2a73bd812_icgraph.svg @@ -0,0 +1,302 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +penify_hook.commands.config_commands.get_token + + + +Node1 + + +penify_hook.commands.config +_commands.get_token + + + + + +Node2 + + +penify_hook.commands.commit +_commands.handle_commit + + + + + +Node1->Node2 + + + + + +Node5 + + +penify_hook.commands.doc +_commands.handle_docgen + + + + + +Node1->Node5 + + + + + +Node10 + + +tests.test_config_commands. +TestConfigCommands.test +_get_token_from_config + + + + + +Node1->Node10 + + + + + +Node11 + + +tests.test_config_commands. +TestConfigCommands.test +_get_token_from_env + + + + + +Node1->Node11 + + + + + +Node12 + + +tests.test_config_commands. +TestConfigCommands.test +_get_token_not_found + + + + + +Node1->Node12 + + + + + +Node3 + + +penify_hook.main.main + + + + + +Node2->Node3 + + + + + +Node4 + + +tests.test_commit_commands. +TestCommitCommands.test +_handle_commit + + + + + +Node2->Node4 + + + + + +Node3->Node3 + + + + + +Node5->Node3 + + + + + +Node6 + + +tests.test_doc_commands.test +_handle_docgen_generate + + + + + +Node5->Node6 + + + + + +Node7 + + +tests.test_doc_commands.test +_handle_docgen_install_hook + + + + + +Node5->Node7 + + + + + +Node8 + + +tests.test_doc_commands.test +_handle_docgen_no_token + + + + + +Node5->Node8 + + + + + +Node9 + + +tests.test_doc_commands.test +_handle_docgen_uninstall_hook + + + + + +Node5->Node9 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/html/namespacepenify__hook_1_1commands_1_1config__commands_a5503d51c905e2f1b299b12d2a73bd812_icgraph_org.svg b/docs/html/namespacepenify__hook_1_1commands_1_1config__commands_a5503d51c905e2f1b299b12d2a73bd812_icgraph_org.svg new file mode 100644 index 0000000..8a0f76b --- /dev/null +++ b/docs/html/namespacepenify__hook_1_1commands_1_1config__commands_a5503d51c905e2f1b299b12d2a73bd812_icgraph_org.svg @@ -0,0 +1,214 @@ + + + + + + +penify_hook.commands.config_commands.get_token + + + +Node1 + + +penify_hook.commands.config +_commands.get_token + + + + + +Node2 + + +penify_hook.commands.commit +_commands.handle_commit + + + + + +Node1->Node2 + + + + + +Node5 + + +penify_hook.commands.doc +_commands.handle_docgen + + + + + +Node1->Node5 + + + + + +Node10 + + +tests.test_config_commands. +TestConfigCommands.test +_get_token_from_config + + + + + +Node1->Node10 + + + + + +Node11 + + +tests.test_config_commands. +TestConfigCommands.test +_get_token_from_env + + + + + +Node1->Node11 + + + + + +Node12 + + +tests.test_config_commands. +TestConfigCommands.test +_get_token_not_found + + + + + +Node1->Node12 + + + + + +Node3 + + +penify_hook.main.main + + + + + +Node2->Node3 + + + + + +Node4 + + +tests.test_commit_commands. +TestCommitCommands.test +_handle_commit + + + + + +Node2->Node4 + + + + + +Node3->Node3 + + + + + +Node5->Node3 + + + + + +Node6 + + +tests.test_doc_commands.test +_handle_docgen_generate + + + + + +Node5->Node6 + + + + + +Node7 + + +tests.test_doc_commands.test +_handle_docgen_install_hook + + + + + +Node5->Node7 + + + + + +Node8 + + +tests.test_doc_commands.test +_handle_docgen_no_token + + + + + +Node5->Node8 + + + + + +Node9 + + +tests.test_doc_commands.test +_handle_docgen_uninstall_hook + + + + + +Node5->Node9 + + + + + diff --git a/docs/html/namespacepenify__hook_1_1commands_1_1config__commands_a6492bc8e7df6e38bb06ad05e572d4cc0_cgraph.map b/docs/html/namespacepenify__hook_1_1commands_1_1config__commands_a6492bc8e7df6e38bb06ad05e572d4cc0_cgraph.map new file mode 100644 index 0000000..55fc422 --- /dev/null +++ b/docs/html/namespacepenify__hook_1_1commands_1_1config__commands_a6492bc8e7df6e38bb06ad05e572d4cc0_cgraph.map @@ -0,0 +1,6 @@ + + + + + + diff --git a/docs/html/namespacepenify__hook_1_1commands_1_1config__commands_a6492bc8e7df6e38bb06ad05e572d4cc0_cgraph.md5 b/docs/html/namespacepenify__hook_1_1commands_1_1config__commands_a6492bc8e7df6e38bb06ad05e572d4cc0_cgraph.md5 new file mode 100644 index 0000000..c4b9ce2 --- /dev/null +++ b/docs/html/namespacepenify__hook_1_1commands_1_1config__commands_a6492bc8e7df6e38bb06ad05e572d4cc0_cgraph.md5 @@ -0,0 +1 @@ +67c138c843a1f5d8ab7592c326643328 \ No newline at end of file diff --git a/docs/html/namespacepenify__hook_1_1commands_1_1config__commands_a6492bc8e7df6e38bb06ad05e572d4cc0_cgraph.svg b/docs/html/namespacepenify__hook_1_1commands_1_1config__commands_a6492bc8e7df6e38bb06ad05e572d4cc0_cgraph.svg new file mode 100644 index 0000000..aa2fbc9 --- /dev/null +++ b/docs/html/namespacepenify__hook_1_1commands_1_1config__commands_a6492bc8e7df6e38bb06ad05e572d4cc0_cgraph.svg @@ -0,0 +1,172 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +penify_hook.commands.config_commands.get_llm_config + + + +Node1 + + +penify_hook.commands.config +_commands.get_llm_config + + + + + +Node2 + + +penify_hook.commands.config +_commands.get_env_var_or +_default + + + + + +Node1->Node2 + + + + + +Node3 + + +penify_hook.commands.config +_commands.load_env_files + + + + + +Node1->Node3 + + + + + +Node3->Node3 + + + + + +Node4 + + +penify_hook.utils.recursive +_search_git_folder + + + + + +Node3->Node4 + + + + + +Node4->Node4 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/html/namespacepenify__hook_1_1commands_1_1config__commands_a6492bc8e7df6e38bb06ad05e572d4cc0_cgraph_org.svg b/docs/html/namespacepenify__hook_1_1commands_1_1config__commands_a6492bc8e7df6e38bb06ad05e572d4cc0_cgraph_org.svg new file mode 100644 index 0000000..4b9759c --- /dev/null +++ b/docs/html/namespacepenify__hook_1_1commands_1_1config__commands_a6492bc8e7df6e38bb06ad05e572d4cc0_cgraph_org.svg @@ -0,0 +1,84 @@ + + + + + + +penify_hook.commands.config_commands.get_llm_config + + + +Node1 + + +penify_hook.commands.config +_commands.get_llm_config + + + + + +Node2 + + +penify_hook.commands.config +_commands.get_env_var_or +_default + + + + + +Node1->Node2 + + + + + +Node3 + + +penify_hook.commands.config +_commands.load_env_files + + + + + +Node1->Node3 + + + + + +Node3->Node3 + + + + + +Node4 + + +penify_hook.utils.recursive +_search_git_folder + + + + + +Node3->Node4 + + + + + +Node4->Node4 + + + + + diff --git a/docs/html/namespacepenify__hook_1_1commands_1_1config__commands_a6492bc8e7df6e38bb06ad05e572d4cc0_icgraph.map b/docs/html/namespacepenify__hook_1_1commands_1_1config__commands_a6492bc8e7df6e38bb06ad05e572d4cc0_icgraph.map new file mode 100644 index 0000000..11e9843 --- /dev/null +++ b/docs/html/namespacepenify__hook_1_1commands_1_1config__commands_a6492bc8e7df6e38bb06ad05e572d4cc0_icgraph.map @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/docs/html/namespacepenify__hook_1_1commands_1_1config__commands_a6492bc8e7df6e38bb06ad05e572d4cc0_icgraph.md5 b/docs/html/namespacepenify__hook_1_1commands_1_1config__commands_a6492bc8e7df6e38bb06ad05e572d4cc0_icgraph.md5 new file mode 100644 index 0000000..280df61 --- /dev/null +++ b/docs/html/namespacepenify__hook_1_1commands_1_1config__commands_a6492bc8e7df6e38bb06ad05e572d4cc0_icgraph.md5 @@ -0,0 +1 @@ +32e055c0ae757bbecf2b86db164d29df \ No newline at end of file diff --git a/docs/html/namespacepenify__hook_1_1commands_1_1config__commands_a6492bc8e7df6e38bb06ad05e572d4cc0_icgraph.svg b/docs/html/namespacepenify__hook_1_1commands_1_1config__commands_a6492bc8e7df6e38bb06ad05e572d4cc0_icgraph.svg new file mode 100644 index 0000000..2e5a94a --- /dev/null +++ b/docs/html/namespacepenify__hook_1_1commands_1_1config__commands_a6492bc8e7df6e38bb06ad05e572d4cc0_icgraph.svg @@ -0,0 +1,216 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +penify_hook.commands.config_commands.get_llm_config + + + +Node1 + + +penify_hook.commands.config +_commands.get_llm_config + + + + + +Node2 + + +penify_hook.commands.commit +_commands.handle_commit + + + + + +Node1->Node2 + + + + + +Node5 + + +tests.test_config_commands. +TestConfigCommands.test +_get_llm_config_empty + + + + + +Node1->Node5 + + + + + +Node6 + + +tests.test_config_commands. +TestConfigCommands.test +_get_llm_config_exists + + + + + +Node1->Node6 + + + + + +Node7 + + +tests.test_config_commands. +TestConfigCommands.test +_get_llm_config_invalid_json + + + + + +Node1->Node7 + + + + + +Node3 + + +penify_hook.main.main + + + + + +Node2->Node3 + + + + + +Node4 + + +tests.test_commit_commands. +TestCommitCommands.test +_handle_commit + + + + + +Node2->Node4 + + + + + +Node3->Node3 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/html/namespacepenify__hook_1_1commands_1_1config__commands_a6492bc8e7df6e38bb06ad05e572d4cc0_icgraph_org.svg b/docs/html/namespacepenify__hook_1_1commands_1_1config__commands_a6492bc8e7df6e38bb06ad05e572d4cc0_icgraph_org.svg new file mode 100644 index 0000000..7c7fba4 --- /dev/null +++ b/docs/html/namespacepenify__hook_1_1commands_1_1config__commands_a6492bc8e7df6e38bb06ad05e572d4cc0_icgraph_org.svg @@ -0,0 +1,128 @@ + + + + + + +penify_hook.commands.config_commands.get_llm_config + + + +Node1 + + +penify_hook.commands.config +_commands.get_llm_config + + + + + +Node2 + + +penify_hook.commands.commit +_commands.handle_commit + + + + + +Node1->Node2 + + + + + +Node5 + + +tests.test_config_commands. +TestConfigCommands.test +_get_llm_config_empty + + + + + +Node1->Node5 + + + + + +Node6 + + +tests.test_config_commands. +TestConfigCommands.test +_get_llm_config_exists + + + + + +Node1->Node6 + + + + + +Node7 + + +tests.test_config_commands. +TestConfigCommands.test +_get_llm_config_invalid_json + + + + + +Node1->Node7 + + + + + +Node3 + + +penify_hook.main.main + + + + + +Node2->Node3 + + + + + +Node4 + + +tests.test_commit_commands. +TestCommitCommands.test +_handle_commit + + + + + +Node2->Node4 + + + + + +Node3->Node3 + + + + + diff --git a/docs/html/namespacepenify__hook_1_1commands_1_1config__commands_a6559a82d0bf727703d550d1003d3ed20_cgraph.map b/docs/html/namespacepenify__hook_1_1commands_1_1config__commands_a6559a82d0bf727703d550d1003d3ed20_cgraph.map new file mode 100644 index 0000000..a9f72bb --- /dev/null +++ b/docs/html/namespacepenify__hook_1_1commands_1_1config__commands_a6559a82d0bf727703d550d1003d3ed20_cgraph.map @@ -0,0 +1,4 @@ + + + + diff --git a/docs/html/namespacepenify__hook_1_1commands_1_1config__commands_a6559a82d0bf727703d550d1003d3ed20_cgraph.md5 b/docs/html/namespacepenify__hook_1_1commands_1_1config__commands_a6559a82d0bf727703d550d1003d3ed20_cgraph.md5 new file mode 100644 index 0000000..6643612 --- /dev/null +++ b/docs/html/namespacepenify__hook_1_1commands_1_1config__commands_a6559a82d0bf727703d550d1003d3ed20_cgraph.md5 @@ -0,0 +1 @@ +69777adad7caeabd935b90d3f0ca21e8 \ No newline at end of file diff --git a/docs/html/namespacepenify__hook_1_1commands_1_1config__commands_a6559a82d0bf727703d550d1003d3ed20_cgraph.svg b/docs/html/namespacepenify__hook_1_1commands_1_1config__commands_a6559a82d0bf727703d550d1003d3ed20_cgraph.svg new file mode 100644 index 0000000..26a2c27 --- /dev/null +++ b/docs/html/namespacepenify__hook_1_1commands_1_1config__commands_a6559a82d0bf727703d550d1003d3ed20_cgraph.svg @@ -0,0 +1,45 @@ + + + + + + +penify_hook.commands.config_commands.get_penify_config + + + +Node1 + + +penify_hook.commands.config +_commands.get_penify_config + + + + + +Node2 + + +penify_hook.utils.recursive +_search_git_folder + + + + + +Node1->Node2 + + + + + +Node2->Node2 + + + + + diff --git a/docs/html/namespacepenify__hook_1_1commands_1_1config__commands_a6559a82d0bf727703d550d1003d3ed20_icgraph.map b/docs/html/namespacepenify__hook_1_1commands_1_1config__commands_a6559a82d0bf727703d550d1003d3ed20_icgraph.map new file mode 100644 index 0000000..9de687d --- /dev/null +++ b/docs/html/namespacepenify__hook_1_1commands_1_1config__commands_a6559a82d0bf727703d550d1003d3ed20_icgraph.map @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/docs/html/namespacepenify__hook_1_1commands_1_1config__commands_a6559a82d0bf727703d550d1003d3ed20_icgraph.md5 b/docs/html/namespacepenify__hook_1_1commands_1_1config__commands_a6559a82d0bf727703d550d1003d3ed20_icgraph.md5 new file mode 100644 index 0000000..3e643ef --- /dev/null +++ b/docs/html/namespacepenify__hook_1_1commands_1_1config__commands_a6559a82d0bf727703d550d1003d3ed20_icgraph.md5 @@ -0,0 +1 @@ +4f8f2c5d878438fd8fa2e1f0ca1dbc52 \ No newline at end of file diff --git a/docs/html/namespacepenify__hook_1_1commands_1_1config__commands_a6559a82d0bf727703d550d1003d3ed20_icgraph.svg b/docs/html/namespacepenify__hook_1_1commands_1_1config__commands_a6559a82d0bf727703d550d1003d3ed20_icgraph.svg new file mode 100644 index 0000000..9a839f1 --- /dev/null +++ b/docs/html/namespacepenify__hook_1_1commands_1_1config__commands_a6559a82d0bf727703d550d1003d3ed20_icgraph.svg @@ -0,0 +1,352 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +penify_hook.commands.config_commands.get_penify_config + + + +Node1 + + +penify_hook.commands.config +_commands.get_penify_config + + + + + +Node2 + + +penify_hook.commands.config +_commands.get_token + + + + + +Node1->Node2 + + + + + +Node14 + + +tests.test_config_commands. +TestConfigCommands.test +_get_penify_config_existing_dir + + + + + +Node1->Node14 + + + + + +Node15 + + +tests.test_config_commands. +TestConfigCommands.test +_get_penify_config_new_dir + + + + + +Node1->Node15 + + + + + +Node3 + + +penify_hook.commands.commit +_commands.handle_commit + + + + + +Node2->Node3 + + + + + +Node6 + + +penify_hook.commands.doc +_commands.handle_docgen + + + + + +Node2->Node6 + + + + + +Node11 + + +tests.test_config_commands. +TestConfigCommands.test +_get_token_from_config + + + + + +Node2->Node11 + + + + + +Node12 + + +tests.test_config_commands. +TestConfigCommands.test +_get_token_from_env + + + + + +Node2->Node12 + + + + + +Node13 + + +tests.test_config_commands. +TestConfigCommands.test +_get_token_not_found + + + + + +Node2->Node13 + + + + + +Node4 + + +penify_hook.main.main + + + + + +Node3->Node4 + + + + + +Node5 + + +tests.test_commit_commands. +TestCommitCommands.test +_handle_commit + + + + + +Node3->Node5 + + + + + +Node4->Node4 + + + + + +Node6->Node4 + + + + + +Node7 + + +tests.test_doc_commands.test +_handle_docgen_generate + + + + + +Node6->Node7 + + + + + +Node8 + + +tests.test_doc_commands.test +_handle_docgen_install_hook + + + + + +Node6->Node8 + + + + + +Node9 + + +tests.test_doc_commands.test +_handle_docgen_no_token + + + + + +Node6->Node9 + + + + + +Node10 + + +tests.test_doc_commands.test +_handle_docgen_uninstall_hook + + + + + +Node6->Node10 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/html/namespacepenify__hook_1_1commands_1_1config__commands_a6559a82d0bf727703d550d1003d3ed20_icgraph_org.svg b/docs/html/namespacepenify__hook_1_1commands_1_1config__commands_a6559a82d0bf727703d550d1003d3ed20_icgraph_org.svg new file mode 100644 index 0000000..a6f9814 --- /dev/null +++ b/docs/html/namespacepenify__hook_1_1commands_1_1config__commands_a6559a82d0bf727703d550d1003d3ed20_icgraph_org.svg @@ -0,0 +1,264 @@ + + + + + + +penify_hook.commands.config_commands.get_penify_config + + + +Node1 + + +penify_hook.commands.config +_commands.get_penify_config + + + + + +Node2 + + +penify_hook.commands.config +_commands.get_token + + + + + +Node1->Node2 + + + + + +Node14 + + +tests.test_config_commands. +TestConfigCommands.test +_get_penify_config_existing_dir + + + + + +Node1->Node14 + + + + + +Node15 + + +tests.test_config_commands. +TestConfigCommands.test +_get_penify_config_new_dir + + + + + +Node1->Node15 + + + + + +Node3 + + +penify_hook.commands.commit +_commands.handle_commit + + + + + +Node2->Node3 + + + + + +Node6 + + +penify_hook.commands.doc +_commands.handle_docgen + + + + + +Node2->Node6 + + + + + +Node11 + + +tests.test_config_commands. +TestConfigCommands.test +_get_token_from_config + + + + + +Node2->Node11 + + + + + +Node12 + + +tests.test_config_commands. +TestConfigCommands.test +_get_token_from_env + + + + + +Node2->Node12 + + + + + +Node13 + + +tests.test_config_commands. +TestConfigCommands.test +_get_token_not_found + + + + + +Node2->Node13 + + + + + +Node4 + + +penify_hook.main.main + + + + + +Node3->Node4 + + + + + +Node5 + + +tests.test_commit_commands. +TestCommitCommands.test +_handle_commit + + + + + +Node3->Node5 + + + + + +Node4->Node4 + + + + + +Node6->Node4 + + + + + +Node7 + + +tests.test_doc_commands.test +_handle_docgen_generate + + + + + +Node6->Node7 + + + + + +Node8 + + +tests.test_doc_commands.test +_handle_docgen_install_hook + + + + + +Node6->Node8 + + + + + +Node9 + + +tests.test_doc_commands.test +_handle_docgen_no_token + + + + + +Node6->Node9 + + + + + +Node10 + + +tests.test_doc_commands.test +_handle_docgen_uninstall_hook + + + + + +Node6->Node10 + + + + + diff --git a/docs/html/namespacepenify__hook_1_1commands_1_1config__commands_aabe277132ce0bc0aacef951cf1dee2ae_cgraph.map b/docs/html/namespacepenify__hook_1_1commands_1_1config__commands_aabe277132ce0bc0aacef951cf1dee2ae_cgraph.map new file mode 100644 index 0000000..85cba52 --- /dev/null +++ b/docs/html/namespacepenify__hook_1_1commands_1_1config__commands_aabe277132ce0bc0aacef951cf1dee2ae_cgraph.map @@ -0,0 +1,4 @@ + + + + diff --git a/docs/html/namespacepenify__hook_1_1commands_1_1config__commands_aabe277132ce0bc0aacef951cf1dee2ae_cgraph.md5 b/docs/html/namespacepenify__hook_1_1commands_1_1config__commands_aabe277132ce0bc0aacef951cf1dee2ae_cgraph.md5 new file mode 100644 index 0000000..26009b0 --- /dev/null +++ b/docs/html/namespacepenify__hook_1_1commands_1_1config__commands_aabe277132ce0bc0aacef951cf1dee2ae_cgraph.md5 @@ -0,0 +1 @@ +91b1c0b60f8171163e43b782cfdc5e4b \ No newline at end of file diff --git a/docs/html/namespacepenify__hook_1_1commands_1_1config__commands_aabe277132ce0bc0aacef951cf1dee2ae_cgraph.svg b/docs/html/namespacepenify__hook_1_1commands_1_1config__commands_aabe277132ce0bc0aacef951cf1dee2ae_cgraph.svg new file mode 100644 index 0000000..5ed2818 --- /dev/null +++ b/docs/html/namespacepenify__hook_1_1commands_1_1config__commands_aabe277132ce0bc0aacef951cf1dee2ae_cgraph.svg @@ -0,0 +1,51 @@ + + + + + + +penify_hook.commands.config_commands.load_env_files + + + +Node1 + + +penify_hook.commands.config +_commands.load_env_files + + + + + +Node1->Node1 + + + + + +Node2 + + +penify_hook.utils.recursive +_search_git_folder + + + + + +Node1->Node2 + + + + + +Node2->Node2 + + + + + diff --git a/docs/html/namespacepenify__hook_1_1commands_1_1config__commands_aabe277132ce0bc0aacef951cf1dee2ae_icgraph.map b/docs/html/namespacepenify__hook_1_1commands_1_1config__commands_aabe277132ce0bc0aacef951cf1dee2ae_icgraph.map new file mode 100644 index 0000000..d99de6a --- /dev/null +++ b/docs/html/namespacepenify__hook_1_1commands_1_1config__commands_aabe277132ce0bc0aacef951cf1dee2ae_icgraph.map @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/html/namespacepenify__hook_1_1commands_1_1config__commands_aabe277132ce0bc0aacef951cf1dee2ae_icgraph.md5 b/docs/html/namespacepenify__hook_1_1commands_1_1config__commands_aabe277132ce0bc0aacef951cf1dee2ae_icgraph.md5 new file mode 100644 index 0000000..a2245b9 --- /dev/null +++ b/docs/html/namespacepenify__hook_1_1commands_1_1config__commands_aabe277132ce0bc0aacef951cf1dee2ae_icgraph.md5 @@ -0,0 +1 @@ +e208c1be2bea05a2824626f2971c2bf3 \ No newline at end of file diff --git a/docs/html/namespacepenify__hook_1_1commands_1_1config__commands_aabe277132ce0bc0aacef951cf1dee2ae_icgraph.svg b/docs/html/namespacepenify__hook_1_1commands_1_1config__commands_aabe277132ce0bc0aacef951cf1dee2ae_icgraph.svg new file mode 100644 index 0000000..e4f35a6 --- /dev/null +++ b/docs/html/namespacepenify__hook_1_1commands_1_1config__commands_aabe277132ce0bc0aacef951cf1dee2ae_icgraph.svg @@ -0,0 +1,491 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +penify_hook.commands.config_commands.load_env_files + + + +Node1 + + +penify_hook.commands.config +_commands.load_env_files + + + + + +Node1->Node1 + + + + + +Node2 + + +penify_hook.commands.config +_commands.get_jira_config + + + + + +Node1->Node2 + + + + + +Node10 + + +penify_hook.commands.config +_commands.get_llm_config + + + + + +Node1->Node10 + + + + + +Node14 + + +penify_hook.commands.config +_commands.get_token + + + + + +Node1->Node14 + + + + + +Node3 + + +penify_hook.commands.config +_commands.config_jira_web + + + + + +Node2->Node3 + + + + + +Node7 + + +penify_hook.commands.commit +_commands.handle_commit + + + + + +Node2->Node7 + + + + + +Node9 + + +tests.test_config_commands. +TestConfigCommands.test +_get_jira_config_exists + + + + + +Node2->Node9 + + + + + +Node4 + + +penify_hook.config +_command.handle_config + + + + + +Node3->Node4 + + + + + +Node6 + + +tests.test_web_config.Test +WebConfig.test_config_jira +_web_server_setup + + + + + +Node3->Node6 + + + + + +Node5 + + +penify_hook.main.main + + + + + +Node4->Node5 + + + + + +Node5->Node5 + + + + + +Node7->Node5 + + + + + +Node8 + + +tests.test_commit_commands. +TestCommitCommands.test +_handle_commit + + + + + +Node7->Node8 + + + + + +Node10->Node7 + + + + + +Node11 + + +tests.test_config_commands. +TestConfigCommands.test +_get_llm_config_empty + + + + + +Node10->Node11 + + + + + +Node12 + + +tests.test_config_commands. +TestConfigCommands.test +_get_llm_config_exists + + + + + +Node10->Node12 + + + + + +Node13 + + +tests.test_config_commands. +TestConfigCommands.test +_get_llm_config_invalid_json + + + + + +Node10->Node13 + + + + + +Node14->Node7 + + + + + +Node15 + + +penify_hook.commands.doc +_commands.handle_docgen + + + + + +Node14->Node15 + + + + + +Node20 + + +tests.test_config_commands. +TestConfigCommands.test +_get_token_from_config + + + + + +Node14->Node20 + + + + + +Node21 + + +tests.test_config_commands. +TestConfigCommands.test +_get_token_from_env + + + + + +Node14->Node21 + + + + + +Node22 + + +tests.test_config_commands. +TestConfigCommands.test +_get_token_not_found + + + + + +Node14->Node22 + + + + + +Node15->Node5 + + + + + +Node16 + + +tests.test_doc_commands.test +_handle_docgen_generate + + + + + +Node15->Node16 + + + + + +Node17 + + +tests.test_doc_commands.test +_handle_docgen_install_hook + + + + + +Node15->Node17 + + + + + +Node18 + + +tests.test_doc_commands.test +_handle_docgen_no_token + + + + + +Node15->Node18 + + + + + +Node19 + + +tests.test_doc_commands.test +_handle_docgen_uninstall_hook + + + + + +Node15->Node19 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/html/namespacepenify__hook_1_1commands_1_1config__commands_aabe277132ce0bc0aacef951cf1dee2ae_icgraph_org.svg b/docs/html/namespacepenify__hook_1_1commands_1_1config__commands_aabe277132ce0bc0aacef951cf1dee2ae_icgraph_org.svg new file mode 100644 index 0000000..a264e4b --- /dev/null +++ b/docs/html/namespacepenify__hook_1_1commands_1_1config__commands_aabe277132ce0bc0aacef951cf1dee2ae_icgraph_org.svg @@ -0,0 +1,403 @@ + + + + + + +penify_hook.commands.config_commands.load_env_files + + + +Node1 + + +penify_hook.commands.config +_commands.load_env_files + + + + + +Node1->Node1 + + + + + +Node2 + + +penify_hook.commands.config +_commands.get_jira_config + + + + + +Node1->Node2 + + + + + +Node10 + + +penify_hook.commands.config +_commands.get_llm_config + + + + + +Node1->Node10 + + + + + +Node14 + + +penify_hook.commands.config +_commands.get_token + + + + + +Node1->Node14 + + + + + +Node3 + + +penify_hook.commands.config +_commands.config_jira_web + + + + + +Node2->Node3 + + + + + +Node7 + + +penify_hook.commands.commit +_commands.handle_commit + + + + + +Node2->Node7 + + + + + +Node9 + + +tests.test_config_commands. +TestConfigCommands.test +_get_jira_config_exists + + + + + +Node2->Node9 + + + + + +Node4 + + +penify_hook.config +_command.handle_config + + + + + +Node3->Node4 + + + + + +Node6 + + +tests.test_web_config.Test +WebConfig.test_config_jira +_web_server_setup + + + + + +Node3->Node6 + + + + + +Node5 + + +penify_hook.main.main + + + + + +Node4->Node5 + + + + + +Node5->Node5 + + + + + +Node7->Node5 + + + + + +Node8 + + +tests.test_commit_commands. +TestCommitCommands.test +_handle_commit + + + + + +Node7->Node8 + + + + + +Node10->Node7 + + + + + +Node11 + + +tests.test_config_commands. +TestConfigCommands.test +_get_llm_config_empty + + + + + +Node10->Node11 + + + + + +Node12 + + +tests.test_config_commands. +TestConfigCommands.test +_get_llm_config_exists + + + + + +Node10->Node12 + + + + + +Node13 + + +tests.test_config_commands. +TestConfigCommands.test +_get_llm_config_invalid_json + + + + + +Node10->Node13 + + + + + +Node14->Node7 + + + + + +Node15 + + +penify_hook.commands.doc +_commands.handle_docgen + + + + + +Node14->Node15 + + + + + +Node20 + + +tests.test_config_commands. +TestConfigCommands.test +_get_token_from_config + + + + + +Node14->Node20 + + + + + +Node21 + + +tests.test_config_commands. +TestConfigCommands.test +_get_token_from_env + + + + + +Node14->Node21 + + + + + +Node22 + + +tests.test_config_commands. +TestConfigCommands.test +_get_token_not_found + + + + + +Node14->Node22 + + + + + +Node15->Node5 + + + + + +Node16 + + +tests.test_doc_commands.test +_handle_docgen_generate + + + + + +Node15->Node16 + + + + + +Node17 + + +tests.test_doc_commands.test +_handle_docgen_install_hook + + + + + +Node15->Node17 + + + + + +Node18 + + +tests.test_doc_commands.test +_handle_docgen_no_token + + + + + +Node15->Node18 + + + + + +Node19 + + +tests.test_doc_commands.test +_handle_docgen_uninstall_hook + + + + + +Node15->Node19 + + + + + diff --git a/docs/html/namespacepenify__hook_1_1commands_1_1config__commands_ab2486ac2bf16b4a671e49625bfa4f9b4_cgraph.map b/docs/html/namespacepenify__hook_1_1commands_1_1config__commands_ab2486ac2bf16b4a671e49625bfa4f9b4_cgraph.map new file mode 100644 index 0000000..66dc072 --- /dev/null +++ b/docs/html/namespacepenify__hook_1_1commands_1_1config__commands_ab2486ac2bf16b4a671e49625bfa4f9b4_cgraph.map @@ -0,0 +1,4 @@ + + + + diff --git a/docs/html/namespacepenify__hook_1_1commands_1_1config__commands_ab2486ac2bf16b4a671e49625bfa4f9b4_cgraph.md5 b/docs/html/namespacepenify__hook_1_1commands_1_1config__commands_ab2486ac2bf16b4a671e49625bfa4f9b4_cgraph.md5 new file mode 100644 index 0000000..9c2e575 --- /dev/null +++ b/docs/html/namespacepenify__hook_1_1commands_1_1config__commands_ab2486ac2bf16b4a671e49625bfa4f9b4_cgraph.md5 @@ -0,0 +1 @@ +68e4fb55d25659f523e8547c8cb01464 \ No newline at end of file diff --git a/docs/html/namespacepenify__hook_1_1commands_1_1config__commands_ab2486ac2bf16b4a671e49625bfa4f9b4_cgraph.svg b/docs/html/namespacepenify__hook_1_1commands_1_1config__commands_ab2486ac2bf16b4a671e49625bfa4f9b4_cgraph.svg new file mode 100644 index 0000000..d2e2758 --- /dev/null +++ b/docs/html/namespacepenify__hook_1_1commands_1_1config__commands_ab2486ac2bf16b4a671e49625bfa4f9b4_cgraph.svg @@ -0,0 +1,45 @@ + + + + + + +penify_hook.commands.config_commands.save_jira_config + + + +Node1 + + +penify_hook.commands.config +_commands.save_jira_config + + + + + +Node2 + + +penify_hook.utils.recursive +_search_git_folder + + + + + +Node1->Node2 + + + + + +Node2->Node2 + + + + + diff --git a/docs/html/namespacepenify__hook_1_1commands_1_1config__commands_ab2486ac2bf16b4a671e49625bfa4f9b4_icgraph.map b/docs/html/namespacepenify__hook_1_1commands_1_1config__commands_ab2486ac2bf16b4a671e49625bfa4f9b4_icgraph.map new file mode 100644 index 0000000..c80d943 --- /dev/null +++ b/docs/html/namespacepenify__hook_1_1commands_1_1config__commands_ab2486ac2bf16b4a671e49625bfa4f9b4_icgraph.map @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/docs/html/namespacepenify__hook_1_1commands_1_1config__commands_ab2486ac2bf16b4a671e49625bfa4f9b4_icgraph.md5 b/docs/html/namespacepenify__hook_1_1commands_1_1config__commands_ab2486ac2bf16b4a671e49625bfa4f9b4_icgraph.md5 new file mode 100644 index 0000000..1f53baa --- /dev/null +++ b/docs/html/namespacepenify__hook_1_1commands_1_1config__commands_ab2486ac2bf16b4a671e49625bfa4f9b4_icgraph.md5 @@ -0,0 +1 @@ +d1ffd3debe0bd71ea914f1dd47c727ad \ No newline at end of file diff --git a/docs/html/namespacepenify__hook_1_1commands_1_1config__commands_ab2486ac2bf16b4a671e49625bfa4f9b4_icgraph.svg b/docs/html/namespacepenify__hook_1_1commands_1_1config__commands_ab2486ac2bf16b4a671e49625bfa4f9b4_icgraph.svg new file mode 100644 index 0000000..359799d --- /dev/null +++ b/docs/html/namespacepenify__hook_1_1commands_1_1config__commands_ab2486ac2bf16b4a671e49625bfa4f9b4_icgraph.svg @@ -0,0 +1,204 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +penify_hook.commands.config_commands.save_jira_config + + + +Node1 + + +penify_hook.commands.config +_commands.save_jira_config + + + + + +Node2 + + +penify_hook.commands.config +_commands.config_jira_web + + + + + +Node1->Node2 + + + + + +Node3 + + +penify_hook.config +_command.handle_config + + + + + +Node1->Node3 + + + + + +Node6 + + +tests.test_config_commands. +TestConfigCommands.test +_save_jira_config_success + + + + + +Node1->Node6 + + + + + +Node2->Node3 + + + + + +Node5 + + +tests.test_web_config.Test +WebConfig.test_config_jira +_web_server_setup + + + + + +Node2->Node5 + + + + + +Node4 + + +penify_hook.main.main + + + + + +Node3->Node4 + + + + + +Node4->Node4 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/html/namespacepenify__hook_1_1commands_1_1config__commands_ab2486ac2bf16b4a671e49625bfa4f9b4_icgraph_org.svg b/docs/html/namespacepenify__hook_1_1commands_1_1config__commands_ab2486ac2bf16b4a671e49625bfa4f9b4_icgraph_org.svg new file mode 100644 index 0000000..d5eb5c0 --- /dev/null +++ b/docs/html/namespacepenify__hook_1_1commands_1_1config__commands_ab2486ac2bf16b4a671e49625bfa4f9b4_icgraph_org.svg @@ -0,0 +1,116 @@ + + + + + + +penify_hook.commands.config_commands.save_jira_config + + + +Node1 + + +penify_hook.commands.config +_commands.save_jira_config + + + + + +Node2 + + +penify_hook.commands.config +_commands.config_jira_web + + + + + +Node1->Node2 + + + + + +Node3 + + +penify_hook.config +_command.handle_config + + + + + +Node1->Node3 + + + + + +Node6 + + +tests.test_config_commands. +TestConfigCommands.test +_save_jira_config_success + + + + + +Node1->Node6 + + + + + +Node2->Node3 + + + + + +Node5 + + +tests.test_web_config.Test +WebConfig.test_config_jira +_web_server_setup + + + + + +Node2->Node5 + + + + + +Node4 + + +penify_hook.main.main + + + + + +Node3->Node4 + + + + + +Node4->Node4 + + + + + diff --git a/docs/html/namespacepenify__hook_1_1commands_1_1config__commands_af115198ea5d6808ccb98733957f50b06_cgraph.map b/docs/html/namespacepenify__hook_1_1commands_1_1config__commands_af115198ea5d6808ccb98733957f50b06_cgraph.map new file mode 100644 index 0000000..f9b2f55 --- /dev/null +++ b/docs/html/namespacepenify__hook_1_1commands_1_1config__commands_af115198ea5d6808ccb98733957f50b06_cgraph.map @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/docs/html/namespacepenify__hook_1_1commands_1_1config__commands_af115198ea5d6808ccb98733957f50b06_cgraph.md5 b/docs/html/namespacepenify__hook_1_1commands_1_1config__commands_af115198ea5d6808ccb98733957f50b06_cgraph.md5 new file mode 100644 index 0000000..7795142 --- /dev/null +++ b/docs/html/namespacepenify__hook_1_1commands_1_1config__commands_af115198ea5d6808ccb98733957f50b06_cgraph.md5 @@ -0,0 +1 @@ +e83a80d18918d47faae41628fcd92c7a \ No newline at end of file diff --git a/docs/html/namespacepenify__hook_1_1commands_1_1config__commands_af115198ea5d6808ccb98733957f50b06_cgraph.svg b/docs/html/namespacepenify__hook_1_1commands_1_1config__commands_af115198ea5d6808ccb98733957f50b06_cgraph.svg new file mode 100644 index 0000000..5211cae --- /dev/null +++ b/docs/html/namespacepenify__hook_1_1commands_1_1config__commands_af115198ea5d6808ccb98733957f50b06_cgraph.svg @@ -0,0 +1,210 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +penify_hook.commands.config_commands.config_jira_web + + + +Node1 + + +penify_hook.commands.config +_commands.config_jira_web + + + + + +Node2 + + +penify_hook.commands.config +_commands.get_jira_config + + + + + +Node1->Node2 + + + + + +Node6 + + +penify_hook.commands.config +_commands.save_jira_config + + + + + +Node1->Node6 + + + + + +Node3 + + +penify_hook.commands.config +_commands.get_env_var_or +_default + + + + + +Node2->Node3 + + + + + +Node4 + + +penify_hook.commands.config +_commands.load_env_files + + + + + +Node2->Node4 + + + + + +Node4->Node4 + + + + + +Node5 + + +penify_hook.utils.recursive +_search_git_folder + + + + + +Node4->Node5 + + + + + +Node5->Node5 + + + + + +Node6->Node5 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/html/namespacepenify__hook_1_1commands_1_1config__commands_af115198ea5d6808ccb98733957f50b06_cgraph_org.svg b/docs/html/namespacepenify__hook_1_1commands_1_1config__commands_af115198ea5d6808ccb98733957f50b06_cgraph_org.svg new file mode 100644 index 0000000..d7f7ae5 --- /dev/null +++ b/docs/html/namespacepenify__hook_1_1commands_1_1config__commands_af115198ea5d6808ccb98733957f50b06_cgraph_org.svg @@ -0,0 +1,122 @@ + + + + + + +penify_hook.commands.config_commands.config_jira_web + + + +Node1 + + +penify_hook.commands.config +_commands.config_jira_web + + + + + +Node2 + + +penify_hook.commands.config +_commands.get_jira_config + + + + + +Node1->Node2 + + + + + +Node6 + + +penify_hook.commands.config +_commands.save_jira_config + + + + + +Node1->Node6 + + + + + +Node3 + + +penify_hook.commands.config +_commands.get_env_var_or +_default + + + + + +Node2->Node3 + + + + + +Node4 + + +penify_hook.commands.config +_commands.load_env_files + + + + + +Node2->Node4 + + + + + +Node4->Node4 + + + + + +Node5 + + +penify_hook.utils.recursive +_search_git_folder + + + + + +Node4->Node5 + + + + + +Node5->Node5 + + + + + +Node6->Node5 + + + + + diff --git a/docs/html/namespacepenify__hook_1_1commands_1_1config__commands_af115198ea5d6808ccb98733957f50b06_icgraph.map b/docs/html/namespacepenify__hook_1_1commands_1_1config__commands_af115198ea5d6808ccb98733957f50b06_icgraph.map new file mode 100644 index 0000000..fc35b2e --- /dev/null +++ b/docs/html/namespacepenify__hook_1_1commands_1_1config__commands_af115198ea5d6808ccb98733957f50b06_icgraph.map @@ -0,0 +1,6 @@ + + + + + + diff --git a/docs/html/namespacepenify__hook_1_1commands_1_1config__commands_af115198ea5d6808ccb98733957f50b06_icgraph.md5 b/docs/html/namespacepenify__hook_1_1commands_1_1config__commands_af115198ea5d6808ccb98733957f50b06_icgraph.md5 new file mode 100644 index 0000000..166f9b7 --- /dev/null +++ b/docs/html/namespacepenify__hook_1_1commands_1_1config__commands_af115198ea5d6808ccb98733957f50b06_icgraph.md5 @@ -0,0 +1 @@ +e627346d77982130e6685bfc2c553220 \ No newline at end of file diff --git a/docs/html/namespacepenify__hook_1_1commands_1_1config__commands_af115198ea5d6808ccb98733957f50b06_icgraph.svg b/docs/html/namespacepenify__hook_1_1commands_1_1config__commands_af115198ea5d6808ccb98733957f50b06_icgraph.svg new file mode 100644 index 0000000..b4cc55b --- /dev/null +++ b/docs/html/namespacepenify__hook_1_1commands_1_1config__commands_af115198ea5d6808ccb98733957f50b06_icgraph.svg @@ -0,0 +1,165 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +penify_hook.commands.config_commands.config_jira_web + + + +Node1 + + +penify_hook.commands.config +_commands.config_jira_web + + + + + +Node2 + + +penify_hook.config +_command.handle_config + + + + + +Node1->Node2 + + + + + +Node4 + + +tests.test_web_config.Test +WebConfig.test_config_jira +_web_server_setup + + + + + +Node1->Node4 + + + + + +Node3 + + +penify_hook.main.main + + + + + +Node2->Node3 + + + + + +Node3->Node3 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/html/namespacepenify__hook_1_1commands_1_1config__commands_af115198ea5d6808ccb98733957f50b06_icgraph_org.svg b/docs/html/namespacepenify__hook_1_1commands_1_1config__commands_af115198ea5d6808ccb98733957f50b06_icgraph_org.svg new file mode 100644 index 0000000..72fd941 --- /dev/null +++ b/docs/html/namespacepenify__hook_1_1commands_1_1config__commands_af115198ea5d6808ccb98733957f50b06_icgraph_org.svg @@ -0,0 +1,77 @@ + + + + + + +penify_hook.commands.config_commands.config_jira_web + + + +Node1 + + +penify_hook.commands.config +_commands.config_jira_web + + + + + +Node2 + + +penify_hook.config +_command.handle_config + + + + + +Node1->Node2 + + + + + +Node4 + + +tests.test_web_config.Test +WebConfig.test_config_jira +_web_server_setup + + + + + +Node1->Node4 + + + + + +Node3 + + +penify_hook.main.main + + + + + +Node2->Node3 + + + + + +Node3->Node3 + + + + + diff --git a/docs/html/namespacepenify__hook_1_1commands_1_1doc__commands.html b/docs/html/namespacepenify__hook_1_1commands_1_1doc__commands.html new file mode 100644 index 0000000..c2edb77 --- /dev/null +++ b/docs/html/namespacepenify__hook_1_1commands_1_1doc__commands.html @@ -0,0 +1,279 @@ + + + + + + + + + + + + + + + + + + +penify-cli: penify_hook.commands.doc_commands Namespace Reference + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    penify-cli +
    +
    +
    + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    + +
    penify_hook.commands.doc_commands Namespace Reference
    +
    +
    + + + + + + + + +

    +Functions

    def generate_doc (api_url, token, location=None)
     
    def setup_docgen_parser (parser)
     
    def handle_docgen (args)
     
    + + + +

    +Variables

    string docgen_description
     
    +

    Function Documentation

    + +

    ◆ generate_doc()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    def penify_hook.commands.doc_commands.generate_doc ( api_url,
     token,
     location = None 
    )
    +
    +
    Generates documentation based on the given parameters.
    +
    +This function initializes an API client using the provided API URL and token.
    +It then generates documentation by analyzing the specified location, which can
    +be a folder, a file, or the current working directory if no location is
    +provided. The function handles different types of analysis based on the input
    +location and reports any errors encountered during the process.
    +
    +Args:
    +    api_url (str): The URL of the API to connect to for documentation generation.
    +    token (str): The authentication token for accessing the API.
    +    location (str?): The path to a specific file or folder to analyze. If not provided,
    +        the current working directory is used.
    +
    +Here is the caller graph for this function:
    +
    +
    +
    +
    + +
    +
    + +

    ◆ handle_docgen()

    + +
    +
    + + + + + + + + +
    def penify_hook.commands.doc_commands.handle_docgen ( args)
    +
    +
    Handle document generation and hook management based on subcommands.
    +Here is the call graph for this function:
    +
    +
    +
    +
    +
    +Here is the caller graph for this function:
    +
    +
    +
    +
    + +
    +
    + +

    ◆ setup_docgen_parser()

    + +
    +
    + + + + + + + + +
    def penify_hook.commands.doc_commands.setup_docgen_parser ( parser)
    +
    +
    Configure a parser for generating documentation using Git commands.
    +Here is the caller graph for this function:
    +
    +
    +
    +
    + +
    +
    +

    Variable Documentation

    + +

    ◆ docgen_description

    + +
    +
    + + + + +
    string penify_hook.commands.doc_commands.docgen_description
    +
    +Initial value:
    1= """Generate code documentation using Penify.
    +
    2
    +
    3This command requires you to be logged in to your Penify account.
    +
    4You can generate documentation for:
    +
    5- Current Git diff (default)
    +
    6- Specific file
    +
    7- Specific folder
    +
    8"""
    +
    +
    +
    +
    +
    + + + + + diff --git a/docs/html/namespacepenify__hook_1_1commands_1_1doc__commands_a2006ab13bff718ef783868a910c0b704_cgraph.map b/docs/html/namespacepenify__hook_1_1commands_1_1doc__commands_a2006ab13bff718ef783868a910c0b704_cgraph.map new file mode 100644 index 0000000..2c0a565 --- /dev/null +++ b/docs/html/namespacepenify__hook_1_1commands_1_1doc__commands_a2006ab13bff718ef783868a910c0b704_cgraph.map @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/docs/html/namespacepenify__hook_1_1commands_1_1doc__commands_a2006ab13bff718ef783868a910c0b704_cgraph.md5 b/docs/html/namespacepenify__hook_1_1commands_1_1doc__commands_a2006ab13bff718ef783868a910c0b704_cgraph.md5 new file mode 100644 index 0000000..472a430 --- /dev/null +++ b/docs/html/namespacepenify__hook_1_1commands_1_1doc__commands_a2006ab13bff718ef783868a910c0b704_cgraph.md5 @@ -0,0 +1 @@ +d7ee1e07127beb9f489b974a61acce5d \ No newline at end of file diff --git a/docs/html/namespacepenify__hook_1_1commands_1_1doc__commands_a2006ab13bff718ef783868a910c0b704_cgraph.svg b/docs/html/namespacepenify__hook_1_1commands_1_1doc__commands_a2006ab13bff718ef783868a910c0b704_cgraph.svg new file mode 100644 index 0000000..9ea3b5d --- /dev/null +++ b/docs/html/namespacepenify__hook_1_1commands_1_1doc__commands_a2006ab13bff718ef783868a910c0b704_cgraph.svg @@ -0,0 +1,258 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +penify_hook.commands.doc_commands.handle_docgen + + + +Node1 + + +penify_hook.commands.doc +_commands.handle_docgen + + + + + +Node2 + + +penify_hook.commands.doc +_commands.generate_doc + + + + + +Node1->Node2 + + + + + +Node3 + + +penify_hook.commands.config +_commands.get_token + + + + + +Node1->Node3 + + + + + +Node8 + + +penify_hook.commands.hook +_commands.install_git_hook + + + + + +Node1->Node8 + + + + + +Node9 + + +penify_hook.commands.hook +_commands.uninstall_git_hook + + + + + +Node1->Node9 + + + + + +Node4 + + +penify_hook.commands.config +_commands.get_env_var_or +_default + + + + + +Node3->Node4 + + + + + +Node5 + + +penify_hook.commands.config +_commands.get_penify_config + + + + + +Node3->Node5 + + + + + +Node7 + + +penify_hook.commands.config +_commands.load_env_files + + + + + +Node3->Node7 + + + + + +Node6 + + +penify_hook.utils.recursive +_search_git_folder + + + + + +Node5->Node6 + + + + + +Node6->Node6 + + + + + +Node7->Node6 + + + + + +Node7->Node7 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/html/namespacepenify__hook_1_1commands_1_1doc__commands_a2006ab13bff718ef783868a910c0b704_cgraph_org.svg b/docs/html/namespacepenify__hook_1_1commands_1_1doc__commands_a2006ab13bff718ef783868a910c0b704_cgraph_org.svg new file mode 100644 index 0000000..838bb12 --- /dev/null +++ b/docs/html/namespacepenify__hook_1_1commands_1_1doc__commands_a2006ab13bff718ef783868a910c0b704_cgraph_org.svg @@ -0,0 +1,170 @@ + + + + + + +penify_hook.commands.doc_commands.handle_docgen + + + +Node1 + + +penify_hook.commands.doc +_commands.handle_docgen + + + + + +Node2 + + +penify_hook.commands.doc +_commands.generate_doc + + + + + +Node1->Node2 + + + + + +Node3 + + +penify_hook.commands.config +_commands.get_token + + + + + +Node1->Node3 + + + + + +Node8 + + +penify_hook.commands.hook +_commands.install_git_hook + + + + + +Node1->Node8 + + + + + +Node9 + + +penify_hook.commands.hook +_commands.uninstall_git_hook + + + + + +Node1->Node9 + + + + + +Node4 + + +penify_hook.commands.config +_commands.get_env_var_or +_default + + + + + +Node3->Node4 + + + + + +Node5 + + +penify_hook.commands.config +_commands.get_penify_config + + + + + +Node3->Node5 + + + + + +Node7 + + +penify_hook.commands.config +_commands.load_env_files + + + + + +Node3->Node7 + + + + + +Node6 + + +penify_hook.utils.recursive +_search_git_folder + + + + + +Node5->Node6 + + + + + +Node6->Node6 + + + + + +Node7->Node6 + + + + + +Node7->Node7 + + + + + diff --git a/docs/html/namespacepenify__hook_1_1commands_1_1doc__commands_a2006ab13bff718ef783868a910c0b704_icgraph.map b/docs/html/namespacepenify__hook_1_1commands_1_1doc__commands_a2006ab13bff718ef783868a910c0b704_icgraph.map new file mode 100644 index 0000000..37a65e4 --- /dev/null +++ b/docs/html/namespacepenify__hook_1_1commands_1_1doc__commands_a2006ab13bff718ef783868a910c0b704_icgraph.map @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/docs/html/namespacepenify__hook_1_1commands_1_1doc__commands_a2006ab13bff718ef783868a910c0b704_icgraph.md5 b/docs/html/namespacepenify__hook_1_1commands_1_1doc__commands_a2006ab13bff718ef783868a910c0b704_icgraph.md5 new file mode 100644 index 0000000..9d429ee --- /dev/null +++ b/docs/html/namespacepenify__hook_1_1commands_1_1doc__commands_a2006ab13bff718ef783868a910c0b704_icgraph.md5 @@ -0,0 +1 @@ +ed70390d069e80c493faf1a14a7c6fff \ No newline at end of file diff --git a/docs/html/namespacepenify__hook_1_1commands_1_1doc__commands_a2006ab13bff718ef783868a910c0b704_icgraph.svg b/docs/html/namespacepenify__hook_1_1commands_1_1doc__commands_a2006ab13bff718ef783868a910c0b704_icgraph.svg new file mode 100644 index 0000000..6790fe4 --- /dev/null +++ b/docs/html/namespacepenify__hook_1_1commands_1_1doc__commands_a2006ab13bff718ef783868a910c0b704_icgraph.svg @@ -0,0 +1,108 @@ + + + + + + +penify_hook.commands.doc_commands.handle_docgen + + + +Node1 + + +penify_hook.commands.doc +_commands.handle_docgen + + + + + +Node2 + + +penify_hook.main.main + + + + + +Node1->Node2 + + + + + +Node3 + + +tests.test_doc_commands.test +_handle_docgen_generate + + + + + +Node1->Node3 + + + + + +Node4 + + +tests.test_doc_commands.test +_handle_docgen_install_hook + + + + + +Node1->Node4 + + + + + +Node5 + + +tests.test_doc_commands.test +_handle_docgen_no_token + + + + + +Node1->Node5 + + + + + +Node6 + + +tests.test_doc_commands.test +_handle_docgen_uninstall_hook + + + + + +Node1->Node6 + + + + + +Node2->Node2 + + + + + diff --git a/docs/html/namespacepenify__hook_1_1commands_1_1doc__commands_a4daac68bc563432bf25c85dc78081a25_icgraph.map b/docs/html/namespacepenify__hook_1_1commands_1_1doc__commands_a4daac68bc563432bf25c85dc78081a25_icgraph.map new file mode 100644 index 0000000..3084ab9 --- /dev/null +++ b/docs/html/namespacepenify__hook_1_1commands_1_1doc__commands_a4daac68bc563432bf25c85dc78081a25_icgraph.map @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/docs/html/namespacepenify__hook_1_1commands_1_1doc__commands_a4daac68bc563432bf25c85dc78081a25_icgraph.md5 b/docs/html/namespacepenify__hook_1_1commands_1_1doc__commands_a4daac68bc563432bf25c85dc78081a25_icgraph.md5 new file mode 100644 index 0000000..171b82e --- /dev/null +++ b/docs/html/namespacepenify__hook_1_1commands_1_1doc__commands_a4daac68bc563432bf25c85dc78081a25_icgraph.md5 @@ -0,0 +1 @@ +5e9faa5a79a60188abcf0c90efae69aa \ No newline at end of file diff --git a/docs/html/namespacepenify__hook_1_1commands_1_1doc__commands_a4daac68bc563432bf25c85dc78081a25_icgraph.svg b/docs/html/namespacepenify__hook_1_1commands_1_1doc__commands_a4daac68bc563432bf25c85dc78081a25_icgraph.svg new file mode 100644 index 0000000..c5131ef --- /dev/null +++ b/docs/html/namespacepenify__hook_1_1commands_1_1doc__commands_a4daac68bc563432bf25c85dc78081a25_icgraph.svg @@ -0,0 +1,309 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +penify_hook.commands.doc_commands.generate_doc + + + +Node1 + + +penify_hook.commands.doc +_commands.generate_doc + + + + + +Node2 + + +penify_hook.commands.doc +_commands.handle_docgen + + + + + +Node1->Node2 + + + + + +Node8 + + +tests.test_doc_commands.test +_generate_doc_error_handling + + + + + +Node1->Node8 + + + + + +Node9 + + +tests.test_doc_commands.test +_generate_doc_file_location + + + + + +Node1->Node9 + + + + + +Node10 + + +tests.test_doc_commands.test +_generate_doc_folder_location + + + + + +Node1->Node10 + + + + + +Node11 + + +tests.test_doc_commands.test +_generate_doc_no_location + + + + + +Node1->Node11 + + + + + +Node12 + + +tests.test_doc_commands.test +_generate_doc_with_file_exception + + + + + +Node1->Node12 + + + + + +Node13 + + +tests.test_doc_commands.test +_generate_doc_with_folder +_exception + + + + + +Node1->Node13 + + + + + +Node3 + + +penify_hook.main.main + + + + + +Node2->Node3 + + + + + +Node4 + + +tests.test_doc_commands.test +_handle_docgen_generate + + + + + +Node2->Node4 + + + + + +Node5 + + +tests.test_doc_commands.test +_handle_docgen_install_hook + + + + + +Node2->Node5 + + + + + +Node6 + + +tests.test_doc_commands.test +_handle_docgen_no_token + + + + + +Node2->Node6 + + + + + +Node7 + + +tests.test_doc_commands.test +_handle_docgen_uninstall_hook + + + + + +Node2->Node7 + + + + + +Node3->Node3 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/html/namespacepenify__hook_1_1commands_1_1doc__commands_a4daac68bc563432bf25c85dc78081a25_icgraph_org.svg b/docs/html/namespacepenify__hook_1_1commands_1_1doc__commands_a4daac68bc563432bf25c85dc78081a25_icgraph_org.svg new file mode 100644 index 0000000..4cf4b48 --- /dev/null +++ b/docs/html/namespacepenify__hook_1_1commands_1_1doc__commands_a4daac68bc563432bf25c85dc78081a25_icgraph_org.svg @@ -0,0 +1,221 @@ + + + + + + +penify_hook.commands.doc_commands.generate_doc + + + +Node1 + + +penify_hook.commands.doc +_commands.generate_doc + + + + + +Node2 + + +penify_hook.commands.doc +_commands.handle_docgen + + + + + +Node1->Node2 + + + + + +Node8 + + +tests.test_doc_commands.test +_generate_doc_error_handling + + + + + +Node1->Node8 + + + + + +Node9 + + +tests.test_doc_commands.test +_generate_doc_file_location + + + + + +Node1->Node9 + + + + + +Node10 + + +tests.test_doc_commands.test +_generate_doc_folder_location + + + + + +Node1->Node10 + + + + + +Node11 + + +tests.test_doc_commands.test +_generate_doc_no_location + + + + + +Node1->Node11 + + + + + +Node12 + + +tests.test_doc_commands.test +_generate_doc_with_file_exception + + + + + +Node1->Node12 + + + + + +Node13 + + +tests.test_doc_commands.test +_generate_doc_with_folder +_exception + + + + + +Node1->Node13 + + + + + +Node3 + + +penify_hook.main.main + + + + + +Node2->Node3 + + + + + +Node4 + + +tests.test_doc_commands.test +_handle_docgen_generate + + + + + +Node2->Node4 + + + + + +Node5 + + +tests.test_doc_commands.test +_handle_docgen_install_hook + + + + + +Node2->Node5 + + + + + +Node6 + + +tests.test_doc_commands.test +_handle_docgen_no_token + + + + + +Node2->Node6 + + + + + +Node7 + + +tests.test_doc_commands.test +_handle_docgen_uninstall_hook + + + + + +Node2->Node7 + + + + + +Node3->Node3 + + + + + diff --git a/docs/html/namespacepenify__hook_1_1commands_1_1doc__commands_acc7f4ead1b11951d885fa5c151c2cbe0_icgraph.map b/docs/html/namespacepenify__hook_1_1commands_1_1doc__commands_acc7f4ead1b11951d885fa5c151c2cbe0_icgraph.map new file mode 100644 index 0000000..0ee99eb --- /dev/null +++ b/docs/html/namespacepenify__hook_1_1commands_1_1doc__commands_acc7f4ead1b11951d885fa5c151c2cbe0_icgraph.map @@ -0,0 +1,5 @@ + + + + + diff --git a/docs/html/namespacepenify__hook_1_1commands_1_1doc__commands_acc7f4ead1b11951d885fa5c151c2cbe0_icgraph.md5 b/docs/html/namespacepenify__hook_1_1commands_1_1doc__commands_acc7f4ead1b11951d885fa5c151c2cbe0_icgraph.md5 new file mode 100644 index 0000000..0dc7e32 --- /dev/null +++ b/docs/html/namespacepenify__hook_1_1commands_1_1doc__commands_acc7f4ead1b11951d885fa5c151c2cbe0_icgraph.md5 @@ -0,0 +1 @@ +0fa78969e5f8672d0da52972dd124680 \ No newline at end of file diff --git a/docs/html/namespacepenify__hook_1_1commands_1_1doc__commands_acc7f4ead1b11951d885fa5c151c2cbe0_icgraph.svg b/docs/html/namespacepenify__hook_1_1commands_1_1doc__commands_acc7f4ead1b11951d885fa5c151c2cbe0_icgraph.svg new file mode 100644 index 0000000..998d629 --- /dev/null +++ b/docs/html/namespacepenify__hook_1_1commands_1_1doc__commands_acc7f4ead1b11951d885fa5c151c2cbe0_icgraph.svg @@ -0,0 +1,60 @@ + + + + + + +penify_hook.commands.doc_commands.setup_docgen_parser + + + +Node1 + + +penify_hook.commands.doc +_commands.setup_docgen_parser + + + + + +Node2 + + +penify_hook.main.main + + + + + +Node1->Node2 + + + + + +Node3 + + +tests.test_doc_commands.test +_setup_docgen_parser + + + + + +Node1->Node3 + + + + + +Node2->Node2 + + + + + diff --git a/docs/html/namespacepenify__hook_1_1commands_1_1hook__commands.html b/docs/html/namespacepenify__hook_1_1commands_1_1hook__commands.html new file mode 100644 index 0000000..aa1ac7d --- /dev/null +++ b/docs/html/namespacepenify__hook_1_1commands_1_1hook__commands.html @@ -0,0 +1,242 @@ + + + + + + + + + + + + + + + + + + +penify-cli: penify_hook.commands.hook_commands Namespace Reference + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    penify-cli +
    +
    +
    + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    + +
    penify_hook.commands.hook_commands Namespace Reference
    +
    +
    + + + + + + +

    +Functions

    def install_git_hook (location, token)
     
    def uninstall_git_hook (location)
     
    + + + + + +

    +Variables

    string HOOK_FILENAME = "post-commit"
     
    string HOOK_TEMPLATE
     
    +

    Function Documentation

    + +

    ◆ install_git_hook()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    def penify_hook.commands.hook_commands.install_git_hook ( location,
     token 
    )
    +
    +
    Install a post-commit Git hook that generates documentation for changed files.
    +Here is the caller graph for this function:
    +
    +
    +
    +
    + +
    +
    + +

    ◆ uninstall_git_hook()

    + +
    +
    + + + + + + + + +
    def penify_hook.commands.hook_commands.uninstall_git_hook ( location)
    +
    +
    Uninstalls the post-commit hook from the specified location.
    +Here is the caller graph for this function:
    +
    +
    +
    +
    + +
    +
    +

    Variable Documentation

    + +

    ◆ HOOK_FILENAME

    + +
    +
    + + + + +
    string penify_hook.commands.hook_commands.HOOK_FILENAME = "post-commit"
    +
    + +
    +
    + +

    ◆ HOOK_TEMPLATE

    + +
    +
    + + + + +
    string penify_hook.commands.hook_commands.HOOK_TEMPLATE
    +
    +Initial value:
    1= """#!/bin/sh
    +
    2# This is a post-commit hook generated by penify.
    +
    3# Automatically generates documentation for changed files after each commit.
    +
    4
    +
    5penify docgen -gf {git_folder_path} -t {token}
    +
    6"""
    +
    +
    +
    +
    +
    + + + + + diff --git a/docs/html/namespacepenify__hook_1_1commands_1_1hook__commands_a81543eb5fa835fd1237f24e8bce6201d_icgraph.map b/docs/html/namespacepenify__hook_1_1commands_1_1hook__commands_a81543eb5fa835fd1237f24e8bce6201d_icgraph.map new file mode 100644 index 0000000..ea3d3f4 --- /dev/null +++ b/docs/html/namespacepenify__hook_1_1commands_1_1hook__commands_a81543eb5fa835fd1237f24e8bce6201d_icgraph.map @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/docs/html/namespacepenify__hook_1_1commands_1_1hook__commands_a81543eb5fa835fd1237f24e8bce6201d_icgraph.md5 b/docs/html/namespacepenify__hook_1_1commands_1_1hook__commands_a81543eb5fa835fd1237f24e8bce6201d_icgraph.md5 new file mode 100644 index 0000000..197f108 --- /dev/null +++ b/docs/html/namespacepenify__hook_1_1commands_1_1hook__commands_a81543eb5fa835fd1237f24e8bce6201d_icgraph.md5 @@ -0,0 +1 @@ +25f36344702d0e8ec428aac2f670078e \ No newline at end of file diff --git a/docs/html/namespacepenify__hook_1_1commands_1_1hook__commands_a81543eb5fa835fd1237f24e8bce6201d_icgraph.svg b/docs/html/namespacepenify__hook_1_1commands_1_1hook__commands_a81543eb5fa835fd1237f24e8bce6201d_icgraph.svg new file mode 100644 index 0000000..a399555 --- /dev/null +++ b/docs/html/namespacepenify__hook_1_1commands_1_1hook__commands_a81543eb5fa835fd1237f24e8bce6201d_icgraph.svg @@ -0,0 +1,212 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +penify_hook.commands.hook_commands.uninstall_git_hook + + + +Node1 + + +penify_hook.commands.hook +_commands.uninstall_git_hook + + + + + +Node2 + + +penify_hook.commands.doc +_commands.handle_docgen + + + + + +Node1->Node2 + + + + + +Node3 + + +penify_hook.main.main + + + + + +Node2->Node3 + + + + + +Node4 + + +tests.test_doc_commands.test +_handle_docgen_generate + + + + + +Node2->Node4 + + + + + +Node5 + + +tests.test_doc_commands.test +_handle_docgen_install_hook + + + + + +Node2->Node5 + + + + + +Node6 + + +tests.test_doc_commands.test +_handle_docgen_no_token + + + + + +Node2->Node6 + + + + + +Node7 + + +tests.test_doc_commands.test +_handle_docgen_uninstall_hook + + + + + +Node2->Node7 + + + + + +Node3->Node3 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/html/namespacepenify__hook_1_1commands_1_1hook__commands_a81543eb5fa835fd1237f24e8bce6201d_icgraph_org.svg b/docs/html/namespacepenify__hook_1_1commands_1_1hook__commands_a81543eb5fa835fd1237f24e8bce6201d_icgraph_org.svg new file mode 100644 index 0000000..6068928 --- /dev/null +++ b/docs/html/namespacepenify__hook_1_1commands_1_1hook__commands_a81543eb5fa835fd1237f24e8bce6201d_icgraph_org.svg @@ -0,0 +1,124 @@ + + + + + + +penify_hook.commands.hook_commands.uninstall_git_hook + + + +Node1 + + +penify_hook.commands.hook +_commands.uninstall_git_hook + + + + + +Node2 + + +penify_hook.commands.doc +_commands.handle_docgen + + + + + +Node1->Node2 + + + + + +Node3 + + +penify_hook.main.main + + + + + +Node2->Node3 + + + + + +Node4 + + +tests.test_doc_commands.test +_handle_docgen_generate + + + + + +Node2->Node4 + + + + + +Node5 + + +tests.test_doc_commands.test +_handle_docgen_install_hook + + + + + +Node2->Node5 + + + + + +Node6 + + +tests.test_doc_commands.test +_handle_docgen_no_token + + + + + +Node2->Node6 + + + + + +Node7 + + +tests.test_doc_commands.test +_handle_docgen_uninstall_hook + + + + + +Node2->Node7 + + + + + +Node3->Node3 + + + + + diff --git a/docs/html/namespacepenify__hook_1_1commands_1_1hook__commands_adff8f5d3bf1c3795974a391ee95b72b2_icgraph.map b/docs/html/namespacepenify__hook_1_1commands_1_1hook__commands_adff8f5d3bf1c3795974a391ee95b72b2_icgraph.map new file mode 100644 index 0000000..16920b6 --- /dev/null +++ b/docs/html/namespacepenify__hook_1_1commands_1_1hook__commands_adff8f5d3bf1c3795974a391ee95b72b2_icgraph.map @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/docs/html/namespacepenify__hook_1_1commands_1_1hook__commands_adff8f5d3bf1c3795974a391ee95b72b2_icgraph.md5 b/docs/html/namespacepenify__hook_1_1commands_1_1hook__commands_adff8f5d3bf1c3795974a391ee95b72b2_icgraph.md5 new file mode 100644 index 0000000..333d2ec --- /dev/null +++ b/docs/html/namespacepenify__hook_1_1commands_1_1hook__commands_adff8f5d3bf1c3795974a391ee95b72b2_icgraph.md5 @@ -0,0 +1 @@ +3ec2e3ff4462cc865b4cb6fd3a62753d \ No newline at end of file diff --git a/docs/html/namespacepenify__hook_1_1commands_1_1hook__commands_adff8f5d3bf1c3795974a391ee95b72b2_icgraph.svg b/docs/html/namespacepenify__hook_1_1commands_1_1hook__commands_adff8f5d3bf1c3795974a391ee95b72b2_icgraph.svg new file mode 100644 index 0000000..ebcff0a --- /dev/null +++ b/docs/html/namespacepenify__hook_1_1commands_1_1hook__commands_adff8f5d3bf1c3795974a391ee95b72b2_icgraph.svg @@ -0,0 +1,212 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +penify_hook.commands.hook_commands.install_git_hook + + + +Node1 + + +penify_hook.commands.hook +_commands.install_git_hook + + + + + +Node2 + + +penify_hook.commands.doc +_commands.handle_docgen + + + + + +Node1->Node2 + + + + + +Node3 + + +penify_hook.main.main + + + + + +Node2->Node3 + + + + + +Node4 + + +tests.test_doc_commands.test +_handle_docgen_generate + + + + + +Node2->Node4 + + + + + +Node5 + + +tests.test_doc_commands.test +_handle_docgen_install_hook + + + + + +Node2->Node5 + + + + + +Node6 + + +tests.test_doc_commands.test +_handle_docgen_no_token + + + + + +Node2->Node6 + + + + + +Node7 + + +tests.test_doc_commands.test +_handle_docgen_uninstall_hook + + + + + +Node2->Node7 + + + + + +Node3->Node3 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/html/namespacepenify__hook_1_1commands_1_1hook__commands_adff8f5d3bf1c3795974a391ee95b72b2_icgraph_org.svg b/docs/html/namespacepenify__hook_1_1commands_1_1hook__commands_adff8f5d3bf1c3795974a391ee95b72b2_icgraph_org.svg new file mode 100644 index 0000000..8141220 --- /dev/null +++ b/docs/html/namespacepenify__hook_1_1commands_1_1hook__commands_adff8f5d3bf1c3795974a391ee95b72b2_icgraph_org.svg @@ -0,0 +1,124 @@ + + + + + + +penify_hook.commands.hook_commands.install_git_hook + + + +Node1 + + +penify_hook.commands.hook +_commands.install_git_hook + + + + + +Node2 + + +penify_hook.commands.doc +_commands.handle_docgen + + + + + +Node1->Node2 + + + + + +Node3 + + +penify_hook.main.main + + + + + +Node2->Node3 + + + + + +Node4 + + +tests.test_doc_commands.test +_handle_docgen_generate + + + + + +Node2->Node4 + + + + + +Node5 + + +tests.test_doc_commands.test +_handle_docgen_install_hook + + + + + +Node2->Node5 + + + + + +Node6 + + +tests.test_doc_commands.test +_handle_docgen_no_token + + + + + +Node2->Node6 + + + + + +Node7 + + +tests.test_doc_commands.test +_handle_docgen_uninstall_hook + + + + + +Node2->Node7 + + + + + +Node3->Node3 + + + + + diff --git a/docs/html/namespacepenify__hook_1_1commit__analyzer.html b/docs/html/namespacepenify__hook_1_1commit__analyzer.html new file mode 100644 index 0000000..a7fb551 --- /dev/null +++ b/docs/html/namespacepenify__hook_1_1commit__analyzer.html @@ -0,0 +1,138 @@ + + + + + + + + + + + + + + + + + + +penify-cli: penify_hook.commit_analyzer Namespace Reference + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    penify-cli +
    +
    +
    + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    + +
    penify_hook.commit_analyzer Namespace Reference
    +
    +
    + + + + +

    +Classes

    class  CommitDocGenHook
     
    +
    +
    + + + + + diff --git a/docs/html/namespacepenify__hook_1_1commit__analyzer.js b/docs/html/namespacepenify__hook_1_1commit__analyzer.js new file mode 100644 index 0000000..da2cbba --- /dev/null +++ b/docs/html/namespacepenify__hook_1_1commit__analyzer.js @@ -0,0 +1,4 @@ +var namespacepenify__hook_1_1commit__analyzer = +[ + [ "CommitDocGenHook", "classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook.html", "classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook" ] +]; \ No newline at end of file diff --git a/docs/html/namespacepenify__hook_1_1config__command.html b/docs/html/namespacepenify__hook_1_1config__command.html new file mode 100644 index 0000000..ceba4b5 --- /dev/null +++ b/docs/html/namespacepenify__hook_1_1config__command.html @@ -0,0 +1,205 @@ + + + + + + + + + + + + + + + + + + +penify-cli: penify_hook.config_command Namespace Reference + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    penify-cli +
    +
    +
    + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    + +
    penify_hook.config_command Namespace Reference
    +
    +
    + + + + + + +

    +Functions

    def setup_config_parser (parent_parser)
     
    def handle_config (args)
     
    +

    Function Documentation

    + +

    ◆ handle_config()

    + +
    +
    + + + + + + + + +
    def penify_hook.config_command.handle_config ( args)
    +
    +
    Handle configuration settings based on the specified config type.
    +
    +This function processes different types of configurations such as LLM (Language
    +Model) and JIRA. It saves configurations, sets up web-based configurations, and
    +verifies JIRA connections. Depending on the `args.config_type`, it imports
    +necessary modules, handles configuration saving or setup, and optionally
    +verifies JIRA connectivity.
    +
    +Args:
    +    args (argparse.Namespace): Command-line arguments containing the type of configuration to handle.
    +
    +Here is the call graph for this function:
    +
    +
    +
    +
    +
    +Here is the caller graph for this function:
    +
    +
    +
    +
    + +
    +
    + +

    ◆ setup_config_parser()

    + +
    +
    + + + + + + + + +
    def penify_hook.config_command.setup_config_parser ( parent_parser)
    +
    +
    Set up configuration parsers with subcommands for LLM and JIRA settings.
    +Here is the caller graph for this function:
    +
    +
    +
    +
    + +
    +
    +
    +
    + + + + + diff --git a/docs/html/namespacepenify__hook_1_1config__command_a240e5331681eb574ac319d7458783bde_cgraph.map b/docs/html/namespacepenify__hook_1_1config__command_a240e5331681eb574ac319d7458783bde_cgraph.map new file mode 100644 index 0000000..5262513 --- /dev/null +++ b/docs/html/namespacepenify__hook_1_1config__command_a240e5331681eb574ac319d7458783bde_cgraph.map @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/docs/html/namespacepenify__hook_1_1config__command_a240e5331681eb574ac319d7458783bde_cgraph.md5 b/docs/html/namespacepenify__hook_1_1config__command_a240e5331681eb574ac319d7458783bde_cgraph.md5 new file mode 100644 index 0000000..1e009e6 --- /dev/null +++ b/docs/html/namespacepenify__hook_1_1config__command_a240e5331681eb574ac319d7458783bde_cgraph.md5 @@ -0,0 +1 @@ +4f75720d323fed0e1cf98ec14ae8f6e9 \ No newline at end of file diff --git a/docs/html/namespacepenify__hook_1_1config__command_a240e5331681eb574ac319d7458783bde_cgraph.svg b/docs/html/namespacepenify__hook_1_1config__command_a240e5331681eb574ac319d7458783bde_cgraph.svg new file mode 100644 index 0000000..7daaddc --- /dev/null +++ b/docs/html/namespacepenify__hook_1_1config__command_a240e5331681eb574ac319d7458783bde_cgraph.svg @@ -0,0 +1,270 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +penify_hook.config_command.handle_config + + + +Node1 + + +penify_hook.config +_command.handle_config + + + + + +Node2 + + +penify_hook.commands.config +_commands.config_jira_web + + + + + +Node1->Node2 + + + + + +Node7 + + +penify_hook.commands.config +_commands.save_jira_config + + + + + +Node1->Node7 + + + + + +Node8 + + +penify_hook.commands.config +_commands.config_llm_web + + + + + +Node1->Node8 + + + + + +Node9 + + +penify_hook.commands.config +_commands.save_llm_config + + + + + +Node1->Node9 + + + + + +Node3 + + +penify_hook.commands.config +_commands.get_jira_config + + + + + +Node2->Node3 + + + + + +Node2->Node7 + + + + + +Node4 + + +penify_hook.commands.config +_commands.get_env_var_or +_default + + + + + +Node3->Node4 + + + + + +Node5 + + +penify_hook.commands.config +_commands.load_env_files + + + + + +Node3->Node5 + + + + + +Node5->Node5 + + + + + +Node6 + + +penify_hook.utils.recursive +_search_git_folder + + + + + +Node5->Node6 + + + + + +Node6->Node6 + + + + + +Node7->Node6 + + + + + +Node9->Node6 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/html/namespacepenify__hook_1_1config__command_a240e5331681eb574ac319d7458783bde_cgraph_org.svg b/docs/html/namespacepenify__hook_1_1config__command_a240e5331681eb574ac319d7458783bde_cgraph_org.svg new file mode 100644 index 0000000..2707803 --- /dev/null +++ b/docs/html/namespacepenify__hook_1_1config__command_a240e5331681eb574ac319d7458783bde_cgraph_org.svg @@ -0,0 +1,182 @@ + + + + + + +penify_hook.config_command.handle_config + + + +Node1 + + +penify_hook.config +_command.handle_config + + + + + +Node2 + + +penify_hook.commands.config +_commands.config_jira_web + + + + + +Node1->Node2 + + + + + +Node7 + + +penify_hook.commands.config +_commands.save_jira_config + + + + + +Node1->Node7 + + + + + +Node8 + + +penify_hook.commands.config +_commands.config_llm_web + + + + + +Node1->Node8 + + + + + +Node9 + + +penify_hook.commands.config +_commands.save_llm_config + + + + + +Node1->Node9 + + + + + +Node3 + + +penify_hook.commands.config +_commands.get_jira_config + + + + + +Node2->Node3 + + + + + +Node2->Node7 + + + + + +Node4 + + +penify_hook.commands.config +_commands.get_env_var_or +_default + + + + + +Node3->Node4 + + + + + +Node5 + + +penify_hook.commands.config +_commands.load_env_files + + + + + +Node3->Node5 + + + + + +Node5->Node5 + + + + + +Node6 + + +penify_hook.utils.recursive +_search_git_folder + + + + + +Node5->Node6 + + + + + +Node6->Node6 + + + + + +Node7->Node6 + + + + + +Node9->Node6 + + + + + diff --git a/docs/html/namespacepenify__hook_1_1config__command_a240e5331681eb574ac319d7458783bde_icgraph.map b/docs/html/namespacepenify__hook_1_1config__command_a240e5331681eb574ac319d7458783bde_icgraph.map new file mode 100644 index 0000000..b702a42 --- /dev/null +++ b/docs/html/namespacepenify__hook_1_1config__command_a240e5331681eb574ac319d7458783bde_icgraph.map @@ -0,0 +1,4 @@ + + + + diff --git a/docs/html/namespacepenify__hook_1_1config__command_a240e5331681eb574ac319d7458783bde_icgraph.md5 b/docs/html/namespacepenify__hook_1_1config__command_a240e5331681eb574ac319d7458783bde_icgraph.md5 new file mode 100644 index 0000000..a09bdd4 --- /dev/null +++ b/docs/html/namespacepenify__hook_1_1config__command_a240e5331681eb574ac319d7458783bde_icgraph.md5 @@ -0,0 +1 @@ +f35e472a3767aa0a0b09219e96174cf9 \ No newline at end of file diff --git a/docs/html/namespacepenify__hook_1_1config__command_a240e5331681eb574ac319d7458783bde_icgraph.svg b/docs/html/namespacepenify__hook_1_1config__command_a240e5331681eb574ac319d7458783bde_icgraph.svg new file mode 100644 index 0000000..cafcc47 --- /dev/null +++ b/docs/html/namespacepenify__hook_1_1config__command_a240e5331681eb574ac319d7458783bde_icgraph.svg @@ -0,0 +1,44 @@ + + + + + + +penify_hook.config_command.handle_config + + + +Node1 + + +penify_hook.config +_command.handle_config + + + + + +Node2 + + +penify_hook.main.main + + + + + +Node1->Node2 + + + + + +Node2->Node2 + + + + + diff --git a/docs/html/namespacepenify__hook_1_1config__command_a4f3eb92164a69df1446d745f8a09285e_icgraph.map b/docs/html/namespacepenify__hook_1_1config__command_a4f3eb92164a69df1446d745f8a09285e_icgraph.map new file mode 100644 index 0000000..f0c2ef3 --- /dev/null +++ b/docs/html/namespacepenify__hook_1_1config__command_a4f3eb92164a69df1446d745f8a09285e_icgraph.map @@ -0,0 +1,4 @@ + + + + diff --git a/docs/html/namespacepenify__hook_1_1config__command_a4f3eb92164a69df1446d745f8a09285e_icgraph.md5 b/docs/html/namespacepenify__hook_1_1config__command_a4f3eb92164a69df1446d745f8a09285e_icgraph.md5 new file mode 100644 index 0000000..48311b5 --- /dev/null +++ b/docs/html/namespacepenify__hook_1_1config__command_a4f3eb92164a69df1446d745f8a09285e_icgraph.md5 @@ -0,0 +1 @@ +a17b5eb406ca6a74de12d7201d9bcee7 \ No newline at end of file diff --git a/docs/html/namespacepenify__hook_1_1config__command_a4f3eb92164a69df1446d745f8a09285e_icgraph.svg b/docs/html/namespacepenify__hook_1_1config__command_a4f3eb92164a69df1446d745f8a09285e_icgraph.svg new file mode 100644 index 0000000..edae0c9 --- /dev/null +++ b/docs/html/namespacepenify__hook_1_1config__command_a4f3eb92164a69df1446d745f8a09285e_icgraph.svg @@ -0,0 +1,45 @@ + + + + + + +penify_hook.config_command.setup_config_parser + + + +Node1 + + +penify_hook.config +_command.setup_config +_parser + + + + + +Node2 + + +penify_hook.main.main + + + + + +Node1->Node2 + + + + + +Node2->Node2 + + + + + diff --git a/docs/html/namespacepenify__hook_1_1constants.html b/docs/html/namespacepenify__hook_1_1constants.html new file mode 100644 index 0000000..9da5b07 --- /dev/null +++ b/docs/html/namespacepenify__hook_1_1constants.html @@ -0,0 +1,169 @@ + + + + + + + + + + + + + + + + + + +penify-cli: penify_hook.constants Namespace Reference + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    penify-cli +
    +
    +
    + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    + +
    penify_hook.constants Namespace Reference
    +
    +
    + + + + + + +

    +Variables

    string API_URL = 'http://localhost:8000/api'
     
    string DASHBOARD_URL = "https://dashboard.penify.dev/auth/localhost/login"
     
    +

    Variable Documentation

    + +

    ◆ API_URL

    + +
    +
    + + + + +
    string penify_hook.constants.API_URL = 'http://localhost:8000/api'
    +
    + +
    +
    + +

    ◆ DASHBOARD_URL

    + +
    +
    + + + + +
    string penify_hook.constants.DASHBOARD_URL = "https://dashboard.penify.dev/auth/localhost/login"
    +
    + +
    +
    +
    +
    + + + + + diff --git a/docs/html/namespacepenify__hook_1_1file__analyzer.html b/docs/html/namespacepenify__hook_1_1file__analyzer.html new file mode 100644 index 0000000..16b8a66 --- /dev/null +++ b/docs/html/namespacepenify__hook_1_1file__analyzer.html @@ -0,0 +1,159 @@ + + + + + + + + + + + + + + + + + + +penify-cli: penify_hook.file_analyzer Namespace Reference + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    penify-cli +
    +
    +
    + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    + +
    penify_hook.file_analyzer Namespace Reference
    +
    +
    + + + + +

    +Classes

    class  FileAnalyzerGenHook
     
    + + + +

    +Variables

     logger = logging.getLogger(__name__)
     
    +

    Variable Documentation

    + +

    ◆ logger

    + +
    +
    + + + + +
    penify_hook.file_analyzer.logger = logging.getLogger(__name__)
    +
    + +
    +
    +
    +
    + + + + + diff --git a/docs/html/namespacepenify__hook_1_1file__analyzer.js b/docs/html/namespacepenify__hook_1_1file__analyzer.js new file mode 100644 index 0000000..2fd7c22 --- /dev/null +++ b/docs/html/namespacepenify__hook_1_1file__analyzer.js @@ -0,0 +1,5 @@ +var namespacepenify__hook_1_1file__analyzer = +[ + [ "FileAnalyzerGenHook", "classpenify__hook_1_1file__analyzer_1_1FileAnalyzerGenHook.html", "classpenify__hook_1_1file__analyzer_1_1FileAnalyzerGenHook" ], + [ "logger", "namespacepenify__hook_1_1file__analyzer.html#af419a4965f079d58cac5a5281ddb1828", null ] +]; \ No newline at end of file diff --git a/docs/html/namespacepenify__hook_1_1folder__analyzer.html b/docs/html/namespacepenify__hook_1_1folder__analyzer.html new file mode 100644 index 0000000..d2fcf9c --- /dev/null +++ b/docs/html/namespacepenify__hook_1_1folder__analyzer.html @@ -0,0 +1,138 @@ + + + + + + + + + + + + + + + + + + +penify-cli: penify_hook.folder_analyzer Namespace Reference + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    penify-cli +
    +
    +
    + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    + +
    penify_hook.folder_analyzer Namespace Reference
    +
    +
    + + + + +

    +Classes

    class  FolderAnalyzerGenHook
     
    +
    +
    + + + + + diff --git a/docs/html/namespacepenify__hook_1_1folder__analyzer.js b/docs/html/namespacepenify__hook_1_1folder__analyzer.js new file mode 100644 index 0000000..01d86ca --- /dev/null +++ b/docs/html/namespacepenify__hook_1_1folder__analyzer.js @@ -0,0 +1,4 @@ +var namespacepenify__hook_1_1folder__analyzer = +[ + [ "FolderAnalyzerGenHook", "classpenify__hook_1_1folder__analyzer_1_1FolderAnalyzerGenHook.html", "classpenify__hook_1_1folder__analyzer_1_1FolderAnalyzerGenHook" ] +]; \ No newline at end of file diff --git a/docs/html/namespacepenify__hook_1_1git__analyzer.html b/docs/html/namespacepenify__hook_1_1git__analyzer.html new file mode 100644 index 0000000..8bfcace --- /dev/null +++ b/docs/html/namespacepenify__hook_1_1git__analyzer.html @@ -0,0 +1,159 @@ + + + + + + + + + + + + + + + + + + +penify-cli: penify_hook.git_analyzer Namespace Reference + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    penify-cli +
    +
    +
    + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    + +
    penify_hook.git_analyzer Namespace Reference
    +
    +
    + + + + +

    +Classes

    class  GitDocGenHook
     
    + + + +

    +Variables

     logger = logging.getLogger(__name__)
     
    +

    Variable Documentation

    + +

    ◆ logger

    + +
    +
    + + + + +
    penify_hook.git_analyzer.logger = logging.getLogger(__name__)
    +
    + +
    +
    +
    +
    + + + + + diff --git a/docs/html/namespacepenify__hook_1_1git__analyzer.js b/docs/html/namespacepenify__hook_1_1git__analyzer.js new file mode 100644 index 0000000..d89c507 --- /dev/null +++ b/docs/html/namespacepenify__hook_1_1git__analyzer.js @@ -0,0 +1,5 @@ +var namespacepenify__hook_1_1git__analyzer = +[ + [ "GitDocGenHook", "classpenify__hook_1_1git__analyzer_1_1GitDocGenHook.html", "classpenify__hook_1_1git__analyzer_1_1GitDocGenHook" ], + [ "logger", "namespacepenify__hook_1_1git__analyzer.html#ac4ce143fdca789a79c66852c37d7363a", null ] +]; \ No newline at end of file diff --git a/docs/html/namespacepenify__hook_1_1jira__client.html b/docs/html/namespacepenify__hook_1_1jira__client.html new file mode 100644 index 0000000..af6a2bf --- /dev/null +++ b/docs/html/namespacepenify__hook_1_1jira__client.html @@ -0,0 +1,159 @@ + + + + + + + + + + + + + + + + + + +penify-cli: penify_hook.jira_client Namespace Reference + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    penify-cli +
    +
    +
    + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    + +
    penify_hook.jira_client Namespace Reference
    +
    +
    + + + + +

    +Classes

    class  JiraClient
     
    + + + +

    +Variables

    bool JIRA_AVAILABLE = True
     
    +

    Variable Documentation

    + +

    ◆ JIRA_AVAILABLE

    + +
    +
    + + + + +
    bool penify_hook.jira_client.JIRA_AVAILABLE = True
    +
    + +
    +
    +
    +
    + + + + + diff --git a/docs/html/namespacepenify__hook_1_1jira__client.js b/docs/html/namespacepenify__hook_1_1jira__client.js new file mode 100644 index 0000000..824018c --- /dev/null +++ b/docs/html/namespacepenify__hook_1_1jira__client.js @@ -0,0 +1,5 @@ +var namespacepenify__hook_1_1jira__client = +[ + [ "JiraClient", "classpenify__hook_1_1jira__client_1_1JiraClient.html", "classpenify__hook_1_1jira__client_1_1JiraClient" ], + [ "JIRA_AVAILABLE", "namespacepenify__hook_1_1jira__client.html#a5593ea3415081eca1eea92e4c1ad1aa2", null ] +]; \ No newline at end of file diff --git a/docs/html/namespacepenify__hook_1_1llm__client.html b/docs/html/namespacepenify__hook_1_1llm__client.html new file mode 100644 index 0000000..dd865a0 --- /dev/null +++ b/docs/html/namespacepenify__hook_1_1llm__client.html @@ -0,0 +1,138 @@ + + + + + + + + + + + + + + + + + + +penify-cli: penify_hook.llm_client Namespace Reference + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    penify-cli +
    +
    +
    + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    + +
    penify_hook.llm_client Namespace Reference
    +
    +
    + + + + +

    +Classes

    class  LLMClient
     
    +
    +
    + + + + + diff --git a/docs/html/namespacepenify__hook_1_1llm__client.js b/docs/html/namespacepenify__hook_1_1llm__client.js new file mode 100644 index 0000000..9f99a1e --- /dev/null +++ b/docs/html/namespacepenify__hook_1_1llm__client.js @@ -0,0 +1,4 @@ +var namespacepenify__hook_1_1llm__client = +[ + [ "LLMClient", "classpenify__hook_1_1llm__client_1_1LLMClient.html", "classpenify__hook_1_1llm__client_1_1LLMClient" ] +]; \ No newline at end of file diff --git a/docs/html/namespacepenify__hook_1_1login__command.html b/docs/html/namespacepenify__hook_1_1login__command.html new file mode 100644 index 0000000..b581072 --- /dev/null +++ b/docs/html/namespacepenify__hook_1_1login__command.html @@ -0,0 +1,196 @@ + + + + + + + + + + + + + + + + + + +penify-cli: penify_hook.login_command Namespace Reference + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    penify-cli +
    +
    +
    + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    + +
    penify_hook.login_command Namespace Reference
    +
    +
    + + + + + + +

    +Functions

    def setup_login_parser (parser)
     
    def handle_login (args)
     
    +

    Function Documentation

    + +

    ◆ handle_login()

    + +
    +
    + + + + + + + + +
    def penify_hook.login_command.handle_login ( args)
    +
    +
    Initiates a user login process using predefined constants and the `login`
    +function.
    +Here is the call graph for this function:
    +
    +
    +
    +
    +
    +Here is the caller graph for this function:
    +
    +
    +
    +
    + +
    +
    + +

    ◆ setup_login_parser()

    + +
    +
    + + + + + + + + +
    def penify_hook.login_command.setup_login_parser ( parser)
    +
    +
    Set up command-line arguments for login.
    +Here is the caller graph for this function:
    +
    +
    +
    +
    + +
    +
    +
    +
    + + + + + diff --git a/docs/html/namespacepenify__hook_1_1login__command_aae63db4c484797bead34b7d874020c6a_icgraph.map b/docs/html/namespacepenify__hook_1_1login__command_aae63db4c484797bead34b7d874020c6a_icgraph.map new file mode 100644 index 0000000..e39c064 --- /dev/null +++ b/docs/html/namespacepenify__hook_1_1login__command_aae63db4c484797bead34b7d874020c6a_icgraph.map @@ -0,0 +1,4 @@ + + + + diff --git a/docs/html/namespacepenify__hook_1_1login__command_aae63db4c484797bead34b7d874020c6a_icgraph.md5 b/docs/html/namespacepenify__hook_1_1login__command_aae63db4c484797bead34b7d874020c6a_icgraph.md5 new file mode 100644 index 0000000..2daae41 --- /dev/null +++ b/docs/html/namespacepenify__hook_1_1login__command_aae63db4c484797bead34b7d874020c6a_icgraph.md5 @@ -0,0 +1 @@ +34cbd1a77d726e3937d67455d405b0ba \ No newline at end of file diff --git a/docs/html/namespacepenify__hook_1_1login__command_aae63db4c484797bead34b7d874020c6a_icgraph.svg b/docs/html/namespacepenify__hook_1_1login__command_aae63db4c484797bead34b7d874020c6a_icgraph.svg new file mode 100644 index 0000000..84d1c1e --- /dev/null +++ b/docs/html/namespacepenify__hook_1_1login__command_aae63db4c484797bead34b7d874020c6a_icgraph.svg @@ -0,0 +1,44 @@ + + + + + + +penify_hook.login_command.setup_login_parser + + + +Node1 + + +penify_hook.login_command.setup +_login_parser + + + + + +Node2 + + +penify_hook.main.main + + + + + +Node1->Node2 + + + + + +Node2->Node2 + + + + + diff --git a/docs/html/namespacepenify__hook_1_1login__command_ae4bf932fbafeff834b0a0c5a37f74ccd_cgraph.map b/docs/html/namespacepenify__hook_1_1login__command_ae4bf932fbafeff834b0a0c5a37f74ccd_cgraph.map new file mode 100644 index 0000000..dd44b98 --- /dev/null +++ b/docs/html/namespacepenify__hook_1_1login__command_ae4bf932fbafeff834b0a0c5a37f74ccd_cgraph.map @@ -0,0 +1,6 @@ + + + + + + diff --git a/docs/html/namespacepenify__hook_1_1login__command_ae4bf932fbafeff834b0a0c5a37f74ccd_cgraph.md5 b/docs/html/namespacepenify__hook_1_1login__command_ae4bf932fbafeff834b0a0c5a37f74ccd_cgraph.md5 new file mode 100644 index 0000000..ad91965 --- /dev/null +++ b/docs/html/namespacepenify__hook_1_1login__command_ae4bf932fbafeff834b0a0c5a37f74ccd_cgraph.md5 @@ -0,0 +1 @@ +6a1ceeef99a0101ba5882e9e71fa9bce \ No newline at end of file diff --git a/docs/html/namespacepenify__hook_1_1login__command_ae4bf932fbafeff834b0a0c5a37f74ccd_cgraph.svg b/docs/html/namespacepenify__hook_1_1login__command_ae4bf932fbafeff834b0a0c5a37f74ccd_cgraph.svg new file mode 100644 index 0000000..23caccd --- /dev/null +++ b/docs/html/namespacepenify__hook_1_1login__command_ae4bf932fbafeff834b0a0c5a37f74ccd_cgraph.svg @@ -0,0 +1,165 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +penify_hook.login_command.handle_login + + + +Node1 + + +penify_hook.login_command.handle +_login + + + + + +Node2 + + +penify_hook.commands.auth +_commands.login + + + + + +Node1->Node2 + + + + + +Node3 + + +penify_hook.commands.auth +_commands.save_credentials + + + + + +Node2->Node3 + + + + + +Node4 + + +penify_hook.utils.recursive +_search_git_folder + + + + + +Node3->Node4 + + + + + +Node4->Node4 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/html/namespacepenify__hook_1_1login__command_ae4bf932fbafeff834b0a0c5a37f74ccd_cgraph_org.svg b/docs/html/namespacepenify__hook_1_1login__command_ae4bf932fbafeff834b0a0c5a37f74ccd_cgraph_org.svg new file mode 100644 index 0000000..97e0e2a --- /dev/null +++ b/docs/html/namespacepenify__hook_1_1login__command_ae4bf932fbafeff834b0a0c5a37f74ccd_cgraph_org.svg @@ -0,0 +1,77 @@ + + + + + + +penify_hook.login_command.handle_login + + + +Node1 + + +penify_hook.login_command.handle +_login + + + + + +Node2 + + +penify_hook.commands.auth +_commands.login + + + + + +Node1->Node2 + + + + + +Node3 + + +penify_hook.commands.auth +_commands.save_credentials + + + + + +Node2->Node3 + + + + + +Node4 + + +penify_hook.utils.recursive +_search_git_folder + + + + + +Node3->Node4 + + + + + +Node4->Node4 + + + + + diff --git a/docs/html/namespacepenify__hook_1_1login__command_ae4bf932fbafeff834b0a0c5a37f74ccd_icgraph.map b/docs/html/namespacepenify__hook_1_1login__command_ae4bf932fbafeff834b0a0c5a37f74ccd_icgraph.map new file mode 100644 index 0000000..74fa8c7 --- /dev/null +++ b/docs/html/namespacepenify__hook_1_1login__command_ae4bf932fbafeff834b0a0c5a37f74ccd_icgraph.map @@ -0,0 +1,4 @@ + + + + diff --git a/docs/html/namespacepenify__hook_1_1login__command_ae4bf932fbafeff834b0a0c5a37f74ccd_icgraph.md5 b/docs/html/namespacepenify__hook_1_1login__command_ae4bf932fbafeff834b0a0c5a37f74ccd_icgraph.md5 new file mode 100644 index 0000000..7a114f5 --- /dev/null +++ b/docs/html/namespacepenify__hook_1_1login__command_ae4bf932fbafeff834b0a0c5a37f74ccd_icgraph.md5 @@ -0,0 +1 @@ +1f6ec32e02e9919f90ba1a6a23743cb6 \ No newline at end of file diff --git a/docs/html/namespacepenify__hook_1_1login__command_ae4bf932fbafeff834b0a0c5a37f74ccd_icgraph.svg b/docs/html/namespacepenify__hook_1_1login__command_ae4bf932fbafeff834b0a0c5a37f74ccd_icgraph.svg new file mode 100644 index 0000000..88bfdb9 --- /dev/null +++ b/docs/html/namespacepenify__hook_1_1login__command_ae4bf932fbafeff834b0a0c5a37f74ccd_icgraph.svg @@ -0,0 +1,44 @@ + + + + + + +penify_hook.login_command.handle_login + + + +Node1 + + +penify_hook.login_command.handle +_login + + + + + +Node2 + + +penify_hook.main.main + + + + + +Node1->Node2 + + + + + +Node2->Node2 + + + + + diff --git a/docs/html/namespacepenify__hook_1_1main.html b/docs/html/namespacepenify__hook_1_1main.html new file mode 100644 index 0000000..7579bb3 --- /dev/null +++ b/docs/html/namespacepenify__hook_1_1main.html @@ -0,0 +1,176 @@ + + + + + + + + + + + + + + + + + + +penify-cli: penify_hook.main Namespace Reference + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    penify-cli +
    +
    +
    + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    + +
    penify_hook.main Namespace Reference
    +
    +
    + + + + +

    +Functions

    def main ()
     
    +

    Function Documentation

    + +

    ◆ main()

    + +
    +
    + + + + + + + +
    def penify_hook.main.main ()
    +
    +
    Main function to handle command-line interface (CLI) interactions with Penify
    +services.
    +
    +This tool provides a command-line interface for generating smart commit
    +messages, configuring local-LLM and JIRA, and generating code documentation. It
    +supports basic commands that do not require login and advanced commands that
    +require user authentication. The `--version` flag can be used to display the
    +version information.
    +
    +Here is the call graph for this function:
    +
    +
    +
    +
    +
    +Here is the caller graph for this function:
    +
    +
    +
    +
    + +
    +
    +
    +
    + + + + + diff --git a/docs/html/namespacepenify__hook_1_1main_a16838b20df4bd14ee4b5e1dd2906738f_cgraph.map b/docs/html/namespacepenify__hook_1_1main_a16838b20df4bd14ee4b5e1dd2906738f_cgraph.map new file mode 100644 index 0000000..5c35b70 --- /dev/null +++ b/docs/html/namespacepenify__hook_1_1main_a16838b20df4bd14ee4b5e1dd2906738f_cgraph.map @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/html/namespacepenify__hook_1_1main_a16838b20df4bd14ee4b5e1dd2906738f_cgraph.md5 b/docs/html/namespacepenify__hook_1_1main_a16838b20df4bd14ee4b5e1dd2906738f_cgraph.md5 new file mode 100644 index 0000000..304cb74 --- /dev/null +++ b/docs/html/namespacepenify__hook_1_1main_a16838b20df4bd14ee4b5e1dd2906738f_cgraph.md5 @@ -0,0 +1 @@ +73631f13dbb5d5f90aafdead88d96c1c \ No newline at end of file diff --git a/docs/html/namespacepenify__hook_1_1main_a16838b20df4bd14ee4b5e1dd2906738f_cgraph.svg b/docs/html/namespacepenify__hook_1_1main_a16838b20df4bd14ee4b5e1dd2906738f_cgraph.svg new file mode 100644 index 0000000..eed8f52 --- /dev/null +++ b/docs/html/namespacepenify__hook_1_1main_a16838b20df4bd14ee4b5e1dd2906738f_cgraph.svg @@ -0,0 +1,708 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +penify_hook.main.main + + + +Node1 + + +penify_hook.main.main + + + + + +Node1->Node1 + + + + + +Node2 + + +penify_hook.commands.commit +_commands.handle_commit + + + + + +Node1->Node2 + + + + + +Node6 + + +penify_hook.ui_utils.print_info + + + + + +Node1->Node6 + + + + + +Node17 + + +penify_hook.config +_command.handle_config + + + + + +Node1->Node17 + + + + + +Node22 + + +penify_hook.commands.doc +_commands.handle_docgen + + + + + +Node1->Node22 + + + + + +Node26 + + +penify_hook.login_command.handle +_login + + + + + +Node1->Node26 + + + + + +Node29 + + +penify_hook.commands.commit +_commands.setup_commit_parser + + + + + +Node1->Node29 + + + + + +Node30 + + +penify_hook.config +_command.setup_config +_parser + + + + + +Node1->Node30 + + + + + +Node31 + + +penify_hook.commands.doc +_commands.setup_docgen_parser + + + + + +Node1->Node31 + + + + + +Node32 + + +penify_hook.login_command.setup +_login_parser + + + + + +Node1->Node32 + + + + + +Node3 + + +penify_hook.commands.commit +_commands.commit_code + + + + + +Node2->Node3 + + + + + +Node2->Node6 + + + + + +Node11 + + +penify_hook.commands.config +_commands.get_jira_config + + + + + +Node2->Node11 + + + + + +Node14 + + +penify_hook.commands.config +_commands.get_llm_config + + + + + +Node2->Node14 + + + + + +Node15 + + +penify_hook.commands.config +_commands.get_token + + + + + +Node2->Node15 + + + + + +Node4 + + +penify_hook.ui_utils.print +_error + + + + + +Node3->Node4 + + + + + +Node3->Node6 + + + + + +Node8 + + +penify_hook.ui_utils.print +_warning + + + + + +Node3->Node8 + + + + + +Node10 + + +penify_hook.utils.recursive +_search_git_folder + + + + + +Node3->Node10 + + + + + +Node5 + + +penify_hook.ui_utils.format +_error + + + + + +Node4->Node5 + + + + + +Node7 + + +penify_hook.ui_utils.format_info + + + + + +Node6->Node7 + + + + + +Node9 + + +penify_hook.ui_utils.format +_warning + + + + + +Node8->Node9 + + + + + +Node10->Node10 + + + + + +Node12 + + +penify_hook.commands.config +_commands.get_env_var_or +_default + + + + + +Node11->Node12 + + + + + +Node13 + + +penify_hook.commands.config +_commands.load_env_files + + + + + +Node11->Node13 + + + + + +Node13->Node10 + + + + + +Node13->Node13 + + + + + +Node14->Node12 + + + + + +Node14->Node13 + + + + + +Node15->Node12 + + + + + +Node15->Node13 + + + + + +Node16 + + +penify_hook.commands.config +_commands.get_penify_config + + + + + +Node15->Node16 + + + + + +Node16->Node10 + + + + + +Node18 + + +penify_hook.commands.config +_commands.config_jira_web + + + + + +Node17->Node18 + + + + + +Node19 + + +penify_hook.commands.config +_commands.save_jira_config + + + + + +Node17->Node19 + + + + + +Node20 + + +penify_hook.commands.config +_commands.config_llm_web + + + + + +Node17->Node20 + + + + + +Node21 + + +penify_hook.commands.config +_commands.save_llm_config + + + + + +Node17->Node21 + + + + + +Node18->Node11 + + + + + +Node18->Node19 + + + + + +Node19->Node10 + + + + + +Node21->Node10 + + + + + +Node22->Node15 + + + + + +Node23 + + +penify_hook.commands.doc +_commands.generate_doc + + + + + +Node22->Node23 + + + + + +Node24 + + +penify_hook.commands.hook +_commands.install_git_hook + + + + + +Node22->Node24 + + + + + +Node25 + + +penify_hook.commands.hook +_commands.uninstall_git_hook + + + + + +Node22->Node25 + + + + + +Node27 + + +penify_hook.commands.auth +_commands.login + + + + + +Node26->Node27 + + + + + +Node28 + + +penify_hook.commands.auth +_commands.save_credentials + + + + + +Node27->Node28 + + + + + +Node28->Node10 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/html/namespacepenify__hook_1_1main_a16838b20df4bd14ee4b5e1dd2906738f_cgraph_org.svg b/docs/html/namespacepenify__hook_1_1main_a16838b20df4bd14ee4b5e1dd2906738f_cgraph_org.svg new file mode 100644 index 0000000..4199d83 --- /dev/null +++ b/docs/html/namespacepenify__hook_1_1main_a16838b20df4bd14ee4b5e1dd2906738f_cgraph_org.svg @@ -0,0 +1,620 @@ + + + + + + +penify_hook.main.main + + + +Node1 + + +penify_hook.main.main + + + + + +Node1->Node1 + + + + + +Node2 + + +penify_hook.commands.commit +_commands.handle_commit + + + + + +Node1->Node2 + + + + + +Node6 + + +penify_hook.ui_utils.print_info + + + + + +Node1->Node6 + + + + + +Node17 + + +penify_hook.config +_command.handle_config + + + + + +Node1->Node17 + + + + + +Node22 + + +penify_hook.commands.doc +_commands.handle_docgen + + + + + +Node1->Node22 + + + + + +Node26 + + +penify_hook.login_command.handle +_login + + + + + +Node1->Node26 + + + + + +Node29 + + +penify_hook.commands.commit +_commands.setup_commit_parser + + + + + +Node1->Node29 + + + + + +Node30 + + +penify_hook.config +_command.setup_config +_parser + + + + + +Node1->Node30 + + + + + +Node31 + + +penify_hook.commands.doc +_commands.setup_docgen_parser + + + + + +Node1->Node31 + + + + + +Node32 + + +penify_hook.login_command.setup +_login_parser + + + + + +Node1->Node32 + + + + + +Node3 + + +penify_hook.commands.commit +_commands.commit_code + + + + + +Node2->Node3 + + + + + +Node2->Node6 + + + + + +Node11 + + +penify_hook.commands.config +_commands.get_jira_config + + + + + +Node2->Node11 + + + + + +Node14 + + +penify_hook.commands.config +_commands.get_llm_config + + + + + +Node2->Node14 + + + + + +Node15 + + +penify_hook.commands.config +_commands.get_token + + + + + +Node2->Node15 + + + + + +Node4 + + +penify_hook.ui_utils.print +_error + + + + + +Node3->Node4 + + + + + +Node3->Node6 + + + + + +Node8 + + +penify_hook.ui_utils.print +_warning + + + + + +Node3->Node8 + + + + + +Node10 + + +penify_hook.utils.recursive +_search_git_folder + + + + + +Node3->Node10 + + + + + +Node5 + + +penify_hook.ui_utils.format +_error + + + + + +Node4->Node5 + + + + + +Node7 + + +penify_hook.ui_utils.format_info + + + + + +Node6->Node7 + + + + + +Node9 + + +penify_hook.ui_utils.format +_warning + + + + + +Node8->Node9 + + + + + +Node10->Node10 + + + + + +Node12 + + +penify_hook.commands.config +_commands.get_env_var_or +_default + + + + + +Node11->Node12 + + + + + +Node13 + + +penify_hook.commands.config +_commands.load_env_files + + + + + +Node11->Node13 + + + + + +Node13->Node10 + + + + + +Node13->Node13 + + + + + +Node14->Node12 + + + + + +Node14->Node13 + + + + + +Node15->Node12 + + + + + +Node15->Node13 + + + + + +Node16 + + +penify_hook.commands.config +_commands.get_penify_config + + + + + +Node15->Node16 + + + + + +Node16->Node10 + + + + + +Node18 + + +penify_hook.commands.config +_commands.config_jira_web + + + + + +Node17->Node18 + + + + + +Node19 + + +penify_hook.commands.config +_commands.save_jira_config + + + + + +Node17->Node19 + + + + + +Node20 + + +penify_hook.commands.config +_commands.config_llm_web + + + + + +Node17->Node20 + + + + + +Node21 + + +penify_hook.commands.config +_commands.save_llm_config + + + + + +Node17->Node21 + + + + + +Node18->Node11 + + + + + +Node18->Node19 + + + + + +Node19->Node10 + + + + + +Node21->Node10 + + + + + +Node22->Node15 + + + + + +Node23 + + +penify_hook.commands.doc +_commands.generate_doc + + + + + +Node22->Node23 + + + + + +Node24 + + +penify_hook.commands.hook +_commands.install_git_hook + + + + + +Node22->Node24 + + + + + +Node25 + + +penify_hook.commands.hook +_commands.uninstall_git_hook + + + + + +Node22->Node25 + + + + + +Node27 + + +penify_hook.commands.auth +_commands.login + + + + + +Node26->Node27 + + + + + +Node28 + + +penify_hook.commands.auth +_commands.save_credentials + + + + + +Node27->Node28 + + + + + +Node28->Node10 + + + + + diff --git a/docs/html/namespacepenify__hook_1_1main_a16838b20df4bd14ee4b5e1dd2906738f_icgraph.map b/docs/html/namespacepenify__hook_1_1main_a16838b20df4bd14ee4b5e1dd2906738f_icgraph.map new file mode 100644 index 0000000..3aaa58c --- /dev/null +++ b/docs/html/namespacepenify__hook_1_1main_a16838b20df4bd14ee4b5e1dd2906738f_icgraph.map @@ -0,0 +1,3 @@ + + + diff --git a/docs/html/namespacepenify__hook_1_1main_a16838b20df4bd14ee4b5e1dd2906738f_icgraph.md5 b/docs/html/namespacepenify__hook_1_1main_a16838b20df4bd14ee4b5e1dd2906738f_icgraph.md5 new file mode 100644 index 0000000..4bf17ac --- /dev/null +++ b/docs/html/namespacepenify__hook_1_1main_a16838b20df4bd14ee4b5e1dd2906738f_icgraph.md5 @@ -0,0 +1 @@ +3a9435159e82b3293bbcf47f41f2b41c \ No newline at end of file diff --git a/docs/html/namespacepenify__hook_1_1main_a16838b20df4bd14ee4b5e1dd2906738f_icgraph.svg b/docs/html/namespacepenify__hook_1_1main_a16838b20df4bd14ee4b5e1dd2906738f_icgraph.svg new file mode 100644 index 0000000..5001f6b --- /dev/null +++ b/docs/html/namespacepenify__hook_1_1main_a16838b20df4bd14ee4b5e1dd2906738f_icgraph.svg @@ -0,0 +1,28 @@ + + + + + + +penify_hook.main.main + + + +Node1 + + +penify_hook.main.main + + + + + +Node1->Node1 + + + + + diff --git a/docs/html/namespacepenify__hook_1_1ui__utils.html b/docs/html/namespacepenify__hook_1_1ui__utils.html new file mode 100644 index 0000000..896b2c1 --- /dev/null +++ b/docs/html/namespacepenify__hook_1_1ui__utils.html @@ -0,0 +1,795 @@ + + + + + + + + + + + + + + + + + + +penify-cli: penify_hook.ui_utils Namespace Reference + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    penify-cli +
    +
    +
    + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    + +
    penify_hook.ui_utils Namespace Reference
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    +Functions

    def format_info (message)
     
    def format_success (message)
     
    def format_warning (message)
     
    def format_error (message)
     
    def format_highlight (message)
     
    def format_file_path (file_path)
     
    def print_info (message)
     
    def print_success (message)
     
    def print_warning (message)
     
    def print_error (message)
     
    def print_processing (file_path)
     
    def print_status (status, message)
     
    def create_progress_bar (total, desc="Processing", unit="item")
     
    def create_stage_progress_bar (stages, desc="Processing")
     
    def update_stage (pbar, stage_name)
     
    + + + + + + + + + + + + + + + + + + + + + + + +

    +Variables

     autoreset
     
     INFO_COLOR = Fore.CYAN
     
     SUCCESS_COLOR = Fore.GREEN
     
     WARNING_COLOR = Fore.YELLOW
     
     ERROR_COLOR = Fore.RED
     
     HIGHLIGHT_COLOR = Fore.BLUE
     
     NEUTRAL_COLOR = Fore.WHITE
     
    string SUCCESS_SYMBOL = "✓"
     
    string WARNING_SYMBOL = "○"
     
    string ERROR_SYMBOL = "✗"
     
    string PROCESSING_SYMBOL = "⟳"
     
    +

    Detailed Description

    +
    UI utilities for Penify CLI.
    +
    +This module provides utility functions for consistent UI formatting,
    +colored output, and progress indicators across the Penify CLI application.
    +

    Function Documentation

    + +

    ◆ create_progress_bar()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    def penify_hook.ui_utils.create_progress_bar ( total,
     desc = "Processing",
     unit = "item" 
    )
    +
    +
    Create a tqdm progress bar with consistent styling.
    +Here is the call graph for this function:
    +
    +
    +
    +
    +
    +Here is the caller graph for this function:
    +
    +
    +
    +
    + +
    +
    + +

    ◆ create_stage_progress_bar()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    def penify_hook.ui_utils.create_stage_progress_bar ( stages,
     desc = "Processing" 
    )
    +
    +
    Create a tqdm progress bar for processing stages with consistent styling.
    +Here is the call graph for this function:
    +
    +
    +
    +
    +
    +Here is the caller graph for this function:
    +
    +
    +
    +
    + +
    +
    + +

    ◆ format_error()

    + +
    +
    + + + + + + + + +
    def penify_hook.ui_utils.format_error ( message)
    +
    +
    Format an error message with the specified error color.
    +Here is the caller graph for this function:
    +
    +
    +
    +
    + +
    +
    + +

    ◆ format_file_path()

    + +
    +
    + + + + + + + + +
    def penify_hook.ui_utils.format_file_path ( file_path)
    +
    +
    Format a file path with a warning color.
    +Here is the caller graph for this function:
    +
    +
    +
    +
    + +
    +
    + +

    ◆ format_highlight()

    + +
    +
    + + + + + + + + +
    def penify_hook.ui_utils.format_highlight ( message)
    +
    +
    Format a highlighted message with appropriate color.
    +
    +
    + +

    ◆ format_info()

    + +
    +
    + + + + + + + + +
    def penify_hook.ui_utils.format_info ( message)
    +
    +
    Format an informational message with appropriate color.
    +Here is the caller graph for this function:
    +
    +
    +
    +
    + +
    +
    + +

    ◆ format_success()

    + +
    +
    + + + + + + + + +
    def penify_hook.ui_utils.format_success ( message)
    +
    +
    Formats a success message with green color and reset style.
    +Here is the caller graph for this function:
    +
    +
    +
    +
    + +
    +
    + +

    ◆ format_warning()

    + +
    +
    + + + + + + + + +
    def penify_hook.ui_utils.format_warning ( message)
    +
    +
    Format a warning message with appropriate color.
    +Here is the caller graph for this function:
    +
    +
    +
    +
    + +
    +
    + +

    ◆ print_error()

    + +
    +
    + + + + + + + + +
    def penify_hook.ui_utils.print_error ( message)
    +
    +
    Print an error message with appropriate formatting.
    +Here is the call graph for this function:
    +
    +
    +
    +
    +
    +Here is the caller graph for this function:
    +
    +
    +
    +
    + +
    +
    + +

    ◆ print_info()

    + +
    +
    + + + + + + + + +
    def penify_hook.ui_utils.print_info ( message)
    +
    +
    Prints an informational message with formatting.
    +Here is the call graph for this function:
    +
    +
    +
    +
    +
    +Here is the caller graph for this function:
    +
    +
    +
    +
    + +
    +
    + +

    ◆ print_processing()

    + +
    +
    + + + + + + + + +
    def penify_hook.ui_utils.print_processing ( file_path)
    +
    +
    Print a processing message for a specified file.
    +Here is the call graph for this function:
    +
    +
    +
    +
    +
    +Here is the caller graph for this function:
    +
    +
    +
    +
    + +
    +
    + +

    ◆ print_status()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    def penify_hook.ui_utils.print_status ( status,
     message 
    )
    +
    +
    Print a status message with an appropriate symbol.
    +Here is the caller graph for this function:
    +
    +
    +
    +
    + +
    +
    + +

    ◆ print_success()

    + +
    +
    + + + + + + + + +
    def penify_hook.ui_utils.print_success ( message)
    +
    +
    Prints a formatted success message.
    +Here is the call graph for this function:
    +
    +
    +
    +
    +
    +Here is the caller graph for this function:
    +
    +
    +
    +
    + +
    +
    + +

    ◆ print_warning()

    + +
    +
    + + + + + + + + +
    def penify_hook.ui_utils.print_warning ( message)
    +
    +
    Prints a warning message with formatted output.
    +Here is the call graph for this function:
    +
    +
    +
    +
    +
    +Here is the caller graph for this function:
    +
    +
    +
    +
    + +
    +
    + +

    ◆ update_stage()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    def penify_hook.ui_utils.update_stage ( pbar,
     stage_name 
    )
    +
    +
    Update the progress bar with a new stage name.
    +Here is the caller graph for this function:
    +
    +
    +
    +
    + +
    +
    +

    Variable Documentation

    + +

    ◆ autoreset

    + +
    +
    + + + + +
    penify_hook.ui_utils.autoreset
    +
    + +
    +
    + +

    ◆ ERROR_COLOR

    + +
    +
    + + + + +
    penify_hook.ui_utils.ERROR_COLOR = Fore.RED
    +
    + +
    +
    + +

    ◆ ERROR_SYMBOL

    + +
    +
    + + + + +
    string penify_hook.ui_utils.ERROR_SYMBOL = "✗"
    +
    + +
    +
    + +

    ◆ HIGHLIGHT_COLOR

    + +
    +
    + + + + +
    penify_hook.ui_utils.HIGHLIGHT_COLOR = Fore.BLUE
    +
    + +
    +
    + +

    ◆ INFO_COLOR

    + +
    +
    + + + + +
    penify_hook.ui_utils.INFO_COLOR = Fore.CYAN
    +
    + +
    +
    + +

    ◆ NEUTRAL_COLOR

    + +
    +
    + + + + +
    penify_hook.ui_utils.NEUTRAL_COLOR = Fore.WHITE
    +
    + +
    +
    + +

    ◆ PROCESSING_SYMBOL

    + +
    +
    + + + + +
    string penify_hook.ui_utils.PROCESSING_SYMBOL = "⟳"
    +
    + +
    +
    + +

    ◆ SUCCESS_COLOR

    + +
    +
    + + + + +
    penify_hook.ui_utils.SUCCESS_COLOR = Fore.GREEN
    +
    + +
    +
    + +

    ◆ SUCCESS_SYMBOL

    + +
    +
    + + + + +
    string penify_hook.ui_utils.SUCCESS_SYMBOL = "✓"
    +
    + +
    +
    + +

    ◆ WARNING_COLOR

    + +
    +
    + + + + +
    penify_hook.ui_utils.WARNING_COLOR = Fore.YELLOW
    +
    + +
    +
    + +

    ◆ WARNING_SYMBOL

    + +
    +
    + + + + +
    string penify_hook.ui_utils.WARNING_SYMBOL = "○"
    +
    + +
    +
    +
    +
    + + + + + diff --git a/docs/html/namespacepenify__hook_1_1ui__utils_a0a6fd2613c6fe053b6e4356cd9e5cda2_icgraph.map b/docs/html/namespacepenify__hook_1_1ui__utils_a0a6fd2613c6fe053b6e4356cd9e5cda2_icgraph.map new file mode 100644 index 0000000..25e33d6 --- /dev/null +++ b/docs/html/namespacepenify__hook_1_1ui__utils_a0a6fd2613c6fe053b6e4356cd9e5cda2_icgraph.map @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/docs/html/namespacepenify__hook_1_1ui__utils_a0a6fd2613c6fe053b6e4356cd9e5cda2_icgraph.md5 b/docs/html/namespacepenify__hook_1_1ui__utils_a0a6fd2613c6fe053b6e4356cd9e5cda2_icgraph.md5 new file mode 100644 index 0000000..e8c2c22 --- /dev/null +++ b/docs/html/namespacepenify__hook_1_1ui__utils_a0a6fd2613c6fe053b6e4356cd9e5cda2_icgraph.md5 @@ -0,0 +1 @@ +e844738072248c6c64fdcc2330f4e553 \ No newline at end of file diff --git a/docs/html/namespacepenify__hook_1_1ui__utils_a0a6fd2613c6fe053b6e4356cd9e5cda2_icgraph.svg b/docs/html/namespacepenify__hook_1_1ui__utils_a0a6fd2613c6fe053b6e4356cd9e5cda2_icgraph.svg new file mode 100644 index 0000000..d1398fc --- /dev/null +++ b/docs/html/namespacepenify__hook_1_1ui__utils_a0a6fd2613c6fe053b6e4356cd9e5cda2_icgraph.svg @@ -0,0 +1,347 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +penify_hook.ui_utils.format_warning + + + +Node1 + + +penify_hook.ui_utils.format +_warning + + + + + +Node2 + + +penify_hook.ui_utils.print +_warning + + + + + +Node1->Node2 + + + + + +Node3 + + +penify_hook.commands.commit +_commands.commit_code + + + + + +Node2->Node3 + + + + + +Node11 + + +penify_hook.file_analyzer. +FileAnalyzerGenHook.process_file + + + + + +Node2->Node11 + + + + + +Node14 + + +penify_hook.commit +_analyzer.CommitDocGenHook.process +_jira_integration + + + + + +Node2->Node14 + + + + + +Node4 + + +penify_hook.commands.commit +_commands.handle_commit + + + + + +Node3->Node4 + + + + + +Node7 + + +tests.test_commit_commands. +TestCommitCommands.test +_commit_code_error_handling + + + + + +Node3->Node7 + + + + + +Node8 + + +tests.test_commit_commands. +TestCommitCommands.test +_commit_code_with_jira_client + + + + + +Node3->Node8 + + + + + +Node9 + + +tests.test_commit_commands. +TestCommitCommands.test +_commit_code_with_jira_connection +_failure + + + + + +Node3->Node9 + + + + + +Node10 + + +tests.test_commit_commands. +TestCommitCommands.test +_commit_code_with_llm_client + + + + + +Node3->Node10 + + + + + +Node5 + + +penify_hook.main.main + + + + + +Node4->Node5 + + + + + +Node6 + + +tests.test_commit_commands. +TestCommitCommands.test +_handle_commit + + + + + +Node4->Node6 + + + + + +Node5->Node5 + + + + + +Node12 + + +penify_hook.file_analyzer. +FileAnalyzerGenHook.run + + + + + +Node11->Node12 + + + + + +Node13 + + +penify_hook.git_analyzer. +GitDocGenHook.run + + + + + +Node11->Node13 + + + + + +Node15 + + +penify_hook.commit +_analyzer.CommitDocGenHook.run + + + + + +Node14->Node15 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/html/namespacepenify__hook_1_1ui__utils_a0a6fd2613c6fe053b6e4356cd9e5cda2_icgraph_org.svg b/docs/html/namespacepenify__hook_1_1ui__utils_a0a6fd2613c6fe053b6e4356cd9e5cda2_icgraph_org.svg new file mode 100644 index 0000000..1de8b95 --- /dev/null +++ b/docs/html/namespacepenify__hook_1_1ui__utils_a0a6fd2613c6fe053b6e4356cd9e5cda2_icgraph_org.svg @@ -0,0 +1,259 @@ + + + + + + +penify_hook.ui_utils.format_warning + + + +Node1 + + +penify_hook.ui_utils.format +_warning + + + + + +Node2 + + +penify_hook.ui_utils.print +_warning + + + + + +Node1->Node2 + + + + + +Node3 + + +penify_hook.commands.commit +_commands.commit_code + + + + + +Node2->Node3 + + + + + +Node11 + + +penify_hook.file_analyzer. +FileAnalyzerGenHook.process_file + + + + + +Node2->Node11 + + + + + +Node14 + + +penify_hook.commit +_analyzer.CommitDocGenHook.process +_jira_integration + + + + + +Node2->Node14 + + + + + +Node4 + + +penify_hook.commands.commit +_commands.handle_commit + + + + + +Node3->Node4 + + + + + +Node7 + + +tests.test_commit_commands. +TestCommitCommands.test +_commit_code_error_handling + + + + + +Node3->Node7 + + + + + +Node8 + + +tests.test_commit_commands. +TestCommitCommands.test +_commit_code_with_jira_client + + + + + +Node3->Node8 + + + + + +Node9 + + +tests.test_commit_commands. +TestCommitCommands.test +_commit_code_with_jira_connection +_failure + + + + + +Node3->Node9 + + + + + +Node10 + + +tests.test_commit_commands. +TestCommitCommands.test +_commit_code_with_llm_client + + + + + +Node3->Node10 + + + + + +Node5 + + +penify_hook.main.main + + + + + +Node4->Node5 + + + + + +Node6 + + +tests.test_commit_commands. +TestCommitCommands.test +_handle_commit + + + + + +Node4->Node6 + + + + + +Node5->Node5 + + + + + +Node12 + + +penify_hook.file_analyzer. +FileAnalyzerGenHook.run + + + + + +Node11->Node12 + + + + + +Node13 + + +penify_hook.git_analyzer. +GitDocGenHook.run + + + + + +Node11->Node13 + + + + + +Node15 + + +penify_hook.commit +_analyzer.CommitDocGenHook.run + + + + + +Node14->Node15 + + + + + diff --git a/docs/html/namespacepenify__hook_1_1ui__utils_a12b92532b1458af94f3649d411b5505c_cgraph.map b/docs/html/namespacepenify__hook_1_1ui__utils_a12b92532b1458af94f3649d411b5505c_cgraph.map new file mode 100644 index 0000000..b3bbd49 --- /dev/null +++ b/docs/html/namespacepenify__hook_1_1ui__utils_a12b92532b1458af94f3649d411b5505c_cgraph.map @@ -0,0 +1,4 @@ + + + + diff --git a/docs/html/namespacepenify__hook_1_1ui__utils_a12b92532b1458af94f3649d411b5505c_cgraph.md5 b/docs/html/namespacepenify__hook_1_1ui__utils_a12b92532b1458af94f3649d411b5505c_cgraph.md5 new file mode 100644 index 0000000..61c5559 --- /dev/null +++ b/docs/html/namespacepenify__hook_1_1ui__utils_a12b92532b1458af94f3649d411b5505c_cgraph.md5 @@ -0,0 +1 @@ +107c8ab941ac9fce368d49be27d3ad77 \ No newline at end of file diff --git a/docs/html/namespacepenify__hook_1_1ui__utils_a12b92532b1458af94f3649d411b5505c_cgraph.svg b/docs/html/namespacepenify__hook_1_1ui__utils_a12b92532b1458af94f3649d411b5505c_cgraph.svg new file mode 100644 index 0000000..4f4e98b --- /dev/null +++ b/docs/html/namespacepenify__hook_1_1ui__utils_a12b92532b1458af94f3649d411b5505c_cgraph.svg @@ -0,0 +1,38 @@ + + + + + + +penify_hook.ui_utils.create_progress_bar + + + +Node1 + + +penify_hook.ui_utils.create +_progress_bar + + + + + +Node2 + + +penify_hook.ui_utils.format_info + + + + + +Node1->Node2 + + + + + diff --git a/docs/html/namespacepenify__hook_1_1ui__utils_a12b92532b1458af94f3649d411b5505c_icgraph.map b/docs/html/namespacepenify__hook_1_1ui__utils_a12b92532b1458af94f3649d411b5505c_icgraph.map new file mode 100644 index 0000000..2837065 --- /dev/null +++ b/docs/html/namespacepenify__hook_1_1ui__utils_a12b92532b1458af94f3649d411b5505c_icgraph.map @@ -0,0 +1,4 @@ + + + + diff --git a/docs/html/namespacepenify__hook_1_1ui__utils_a12b92532b1458af94f3649d411b5505c_icgraph.md5 b/docs/html/namespacepenify__hook_1_1ui__utils_a12b92532b1458af94f3649d411b5505c_icgraph.md5 new file mode 100644 index 0000000..28e733d --- /dev/null +++ b/docs/html/namespacepenify__hook_1_1ui__utils_a12b92532b1458af94f3649d411b5505c_icgraph.md5 @@ -0,0 +1 @@ +31face48bece50b969dd777e2fc02655 \ No newline at end of file diff --git a/docs/html/namespacepenify__hook_1_1ui__utils_a12b92532b1458af94f3649d411b5505c_icgraph.svg b/docs/html/namespacepenify__hook_1_1ui__utils_a12b92532b1458af94f3649d411b5505c_icgraph.svg new file mode 100644 index 0000000..c38d43e --- /dev/null +++ b/docs/html/namespacepenify__hook_1_1ui__utils_a12b92532b1458af94f3649d411b5505c_icgraph.svg @@ -0,0 +1,39 @@ + + + + + + +penify_hook.ui_utils.create_progress_bar + + + +Node1 + + +penify_hook.ui_utils.create +_progress_bar + + + + + +Node2 + + +penify_hook.git_analyzer. +GitDocGenHook.run + + + + + +Node1->Node2 + + + + + diff --git a/docs/html/namespacepenify__hook_1_1ui__utils_a1ffbb9671dbe233770268e2dd66a67fa_cgraph.map b/docs/html/namespacepenify__hook_1_1ui__utils_a1ffbb9671dbe233770268e2dd66a67fa_cgraph.map new file mode 100644 index 0000000..9aa84d3 --- /dev/null +++ b/docs/html/namespacepenify__hook_1_1ui__utils_a1ffbb9671dbe233770268e2dd66a67fa_cgraph.map @@ -0,0 +1,4 @@ + + + + diff --git a/docs/html/namespacepenify__hook_1_1ui__utils_a1ffbb9671dbe233770268e2dd66a67fa_cgraph.md5 b/docs/html/namespacepenify__hook_1_1ui__utils_a1ffbb9671dbe233770268e2dd66a67fa_cgraph.md5 new file mode 100644 index 0000000..95113cf --- /dev/null +++ b/docs/html/namespacepenify__hook_1_1ui__utils_a1ffbb9671dbe233770268e2dd66a67fa_cgraph.md5 @@ -0,0 +1 @@ +dc9c89eee18a938f2f9191abf1d0c4e3 \ No newline at end of file diff --git a/docs/html/namespacepenify__hook_1_1ui__utils_a1ffbb9671dbe233770268e2dd66a67fa_cgraph.svg b/docs/html/namespacepenify__hook_1_1ui__utils_a1ffbb9671dbe233770268e2dd66a67fa_cgraph.svg new file mode 100644 index 0000000..3d3ba26 --- /dev/null +++ b/docs/html/namespacepenify__hook_1_1ui__utils_a1ffbb9671dbe233770268e2dd66a67fa_cgraph.svg @@ -0,0 +1,39 @@ + + + + + + +penify_hook.ui_utils.print_warning + + + +Node1 + + +penify_hook.ui_utils.print +_warning + + + + + +Node2 + + +penify_hook.ui_utils.format +_warning + + + + + +Node1->Node2 + + + + + diff --git a/docs/html/namespacepenify__hook_1_1ui__utils_a1ffbb9671dbe233770268e2dd66a67fa_icgraph.map b/docs/html/namespacepenify__hook_1_1ui__utils_a1ffbb9671dbe233770268e2dd66a67fa_icgraph.map new file mode 100644 index 0000000..951c8b4 --- /dev/null +++ b/docs/html/namespacepenify__hook_1_1ui__utils_a1ffbb9671dbe233770268e2dd66a67fa_icgraph.map @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/docs/html/namespacepenify__hook_1_1ui__utils_a1ffbb9671dbe233770268e2dd66a67fa_icgraph.md5 b/docs/html/namespacepenify__hook_1_1ui__utils_a1ffbb9671dbe233770268e2dd66a67fa_icgraph.md5 new file mode 100644 index 0000000..cd55665 --- /dev/null +++ b/docs/html/namespacepenify__hook_1_1ui__utils_a1ffbb9671dbe233770268e2dd66a67fa_icgraph.md5 @@ -0,0 +1 @@ +9fb882734b6d928eec5be79c1f8ddcfd \ No newline at end of file diff --git a/docs/html/namespacepenify__hook_1_1ui__utils_a1ffbb9671dbe233770268e2dd66a67fa_icgraph.svg b/docs/html/namespacepenify__hook_1_1ui__utils_a1ffbb9671dbe233770268e2dd66a67fa_icgraph.svg new file mode 100644 index 0000000..c19d945 --- /dev/null +++ b/docs/html/namespacepenify__hook_1_1ui__utils_a1ffbb9671dbe233770268e2dd66a67fa_icgraph.svg @@ -0,0 +1,331 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +penify_hook.ui_utils.print_warning + + + +Node1 + + +penify_hook.ui_utils.print +_warning + + + + + +Node2 + + +penify_hook.commands.commit +_commands.commit_code + + + + + +Node1->Node2 + + + + + +Node10 + + +penify_hook.file_analyzer. +FileAnalyzerGenHook.process_file + + + + + +Node1->Node10 + + + + + +Node13 + + +penify_hook.commit +_analyzer.CommitDocGenHook.process +_jira_integration + + + + + +Node1->Node13 + + + + + +Node3 + + +penify_hook.commands.commit +_commands.handle_commit + + + + + +Node2->Node3 + + + + + +Node6 + + +tests.test_commit_commands. +TestCommitCommands.test +_commit_code_error_handling + + + + + +Node2->Node6 + + + + + +Node7 + + +tests.test_commit_commands. +TestCommitCommands.test +_commit_code_with_jira_client + + + + + +Node2->Node7 + + + + + +Node8 + + +tests.test_commit_commands. +TestCommitCommands.test +_commit_code_with_jira_connection +_failure + + + + + +Node2->Node8 + + + + + +Node9 + + +tests.test_commit_commands. +TestCommitCommands.test +_commit_code_with_llm_client + + + + + +Node2->Node9 + + + + + +Node4 + + +penify_hook.main.main + + + + + +Node3->Node4 + + + + + +Node5 + + +tests.test_commit_commands. +TestCommitCommands.test +_handle_commit + + + + + +Node3->Node5 + + + + + +Node4->Node4 + + + + + +Node11 + + +penify_hook.file_analyzer. +FileAnalyzerGenHook.run + + + + + +Node10->Node11 + + + + + +Node12 + + +penify_hook.git_analyzer. +GitDocGenHook.run + + + + + +Node10->Node12 + + + + + +Node14 + + +penify_hook.commit +_analyzer.CommitDocGenHook.run + + + + + +Node13->Node14 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/html/namespacepenify__hook_1_1ui__utils_a1ffbb9671dbe233770268e2dd66a67fa_icgraph_org.svg b/docs/html/namespacepenify__hook_1_1ui__utils_a1ffbb9671dbe233770268e2dd66a67fa_icgraph_org.svg new file mode 100644 index 0000000..8fa32d4 --- /dev/null +++ b/docs/html/namespacepenify__hook_1_1ui__utils_a1ffbb9671dbe233770268e2dd66a67fa_icgraph_org.svg @@ -0,0 +1,243 @@ + + + + + + +penify_hook.ui_utils.print_warning + + + +Node1 + + +penify_hook.ui_utils.print +_warning + + + + + +Node2 + + +penify_hook.commands.commit +_commands.commit_code + + + + + +Node1->Node2 + + + + + +Node10 + + +penify_hook.file_analyzer. +FileAnalyzerGenHook.process_file + + + + + +Node1->Node10 + + + + + +Node13 + + +penify_hook.commit +_analyzer.CommitDocGenHook.process +_jira_integration + + + + + +Node1->Node13 + + + + + +Node3 + + +penify_hook.commands.commit +_commands.handle_commit + + + + + +Node2->Node3 + + + + + +Node6 + + +tests.test_commit_commands. +TestCommitCommands.test +_commit_code_error_handling + + + + + +Node2->Node6 + + + + + +Node7 + + +tests.test_commit_commands. +TestCommitCommands.test +_commit_code_with_jira_client + + + + + +Node2->Node7 + + + + + +Node8 + + +tests.test_commit_commands. +TestCommitCommands.test +_commit_code_with_jira_connection +_failure + + + + + +Node2->Node8 + + + + + +Node9 + + +tests.test_commit_commands. +TestCommitCommands.test +_commit_code_with_llm_client + + + + + +Node2->Node9 + + + + + +Node4 + + +penify_hook.main.main + + + + + +Node3->Node4 + + + + + +Node5 + + +tests.test_commit_commands. +TestCommitCommands.test +_handle_commit + + + + + +Node3->Node5 + + + + + +Node4->Node4 + + + + + +Node11 + + +penify_hook.file_analyzer. +FileAnalyzerGenHook.run + + + + + +Node10->Node11 + + + + + +Node12 + + +penify_hook.git_analyzer. +GitDocGenHook.run + + + + + +Node10->Node12 + + + + + +Node14 + + +penify_hook.commit +_analyzer.CommitDocGenHook.run + + + + + +Node13->Node14 + + + + + diff --git a/docs/html/namespacepenify__hook_1_1ui__utils_a2b16aa6b68a9edea5f29f84f1c4be79a_cgraph.map b/docs/html/namespacepenify__hook_1_1ui__utils_a2b16aa6b68a9edea5f29f84f1c4be79a_cgraph.map new file mode 100644 index 0000000..dd6f039 --- /dev/null +++ b/docs/html/namespacepenify__hook_1_1ui__utils_a2b16aa6b68a9edea5f29f84f1c4be79a_cgraph.map @@ -0,0 +1,4 @@ + + + + diff --git a/docs/html/namespacepenify__hook_1_1ui__utils_a2b16aa6b68a9edea5f29f84f1c4be79a_cgraph.md5 b/docs/html/namespacepenify__hook_1_1ui__utils_a2b16aa6b68a9edea5f29f84f1c4be79a_cgraph.md5 new file mode 100644 index 0000000..2cb272d --- /dev/null +++ b/docs/html/namespacepenify__hook_1_1ui__utils_a2b16aa6b68a9edea5f29f84f1c4be79a_cgraph.md5 @@ -0,0 +1 @@ +86ecc3cd8eb77718a70cf2d0a033d81b \ No newline at end of file diff --git a/docs/html/namespacepenify__hook_1_1ui__utils_a2b16aa6b68a9edea5f29f84f1c4be79a_cgraph.svg b/docs/html/namespacepenify__hook_1_1ui__utils_a2b16aa6b68a9edea5f29f84f1c4be79a_cgraph.svg new file mode 100644 index 0000000..7e446d7 --- /dev/null +++ b/docs/html/namespacepenify__hook_1_1ui__utils_a2b16aa6b68a9edea5f29f84f1c4be79a_cgraph.svg @@ -0,0 +1,39 @@ + + + + + + +penify_hook.ui_utils.print_success + + + +Node1 + + +penify_hook.ui_utils.print +_success + + + + + +Node2 + + +penify_hook.ui_utils.format +_success + + + + + +Node1->Node2 + + + + + diff --git a/docs/html/namespacepenify__hook_1_1ui__utils_a2b16aa6b68a9edea5f29f84f1c4be79a_icgraph.map b/docs/html/namespacepenify__hook_1_1ui__utils_a2b16aa6b68a9edea5f29f84f1c4be79a_icgraph.map new file mode 100644 index 0000000..ae7f6f9 --- /dev/null +++ b/docs/html/namespacepenify__hook_1_1ui__utils_a2b16aa6b68a9edea5f29f84f1c4be79a_icgraph.map @@ -0,0 +1,6 @@ + + + + + + diff --git a/docs/html/namespacepenify__hook_1_1ui__utils_a2b16aa6b68a9edea5f29f84f1c4be79a_icgraph.md5 b/docs/html/namespacepenify__hook_1_1ui__utils_a2b16aa6b68a9edea5f29f84f1c4be79a_icgraph.md5 new file mode 100644 index 0000000..aeb43db --- /dev/null +++ b/docs/html/namespacepenify__hook_1_1ui__utils_a2b16aa6b68a9edea5f29f84f1c4be79a_icgraph.md5 @@ -0,0 +1 @@ +5a5f4e31cb2a03012aa538af45b7c2f7 \ No newline at end of file diff --git a/docs/html/namespacepenify__hook_1_1ui__utils_a2b16aa6b68a9edea5f29f84f1c4be79a_icgraph.svg b/docs/html/namespacepenify__hook_1_1ui__utils_a2b16aa6b68a9edea5f29f84f1c4be79a_icgraph.svg new file mode 100644 index 0000000..72720aa --- /dev/null +++ b/docs/html/namespacepenify__hook_1_1ui__utils_a2b16aa6b68a9edea5f29f84f1c4be79a_icgraph.svg @@ -0,0 +1,71 @@ + + + + + + +penify_hook.ui_utils.print_success + + + +Node1 + + +penify_hook.ui_utils.print +_success + + + + + +Node2 + + +penify_hook.file_analyzer. +FileAnalyzerGenHook.run + + + + + +Node1->Node2 + + + + + +Node3 + + +penify_hook.git_analyzer. +GitDocGenHook.run + + + + + +Node1->Node3 + + + + + +Node4 + + +penify_hook.commit +_analyzer.CommitDocGenHook.run + + + + + +Node1->Node4 + + + + + diff --git a/docs/html/namespacepenify__hook_1_1ui__utils_a3da02cd1140179a9ce60f62c85fccfef_cgraph.map b/docs/html/namespacepenify__hook_1_1ui__utils_a3da02cd1140179a9ce60f62c85fccfef_cgraph.map new file mode 100644 index 0000000..7bb444c --- /dev/null +++ b/docs/html/namespacepenify__hook_1_1ui__utils_a3da02cd1140179a9ce60f62c85fccfef_cgraph.map @@ -0,0 +1,4 @@ + + + + diff --git a/docs/html/namespacepenify__hook_1_1ui__utils_a3da02cd1140179a9ce60f62c85fccfef_cgraph.md5 b/docs/html/namespacepenify__hook_1_1ui__utils_a3da02cd1140179a9ce60f62c85fccfef_cgraph.md5 new file mode 100644 index 0000000..13a3f9b --- /dev/null +++ b/docs/html/namespacepenify__hook_1_1ui__utils_a3da02cd1140179a9ce60f62c85fccfef_cgraph.md5 @@ -0,0 +1 @@ +07bb20aff57367351bd025b6bbac0225 \ No newline at end of file diff --git a/docs/html/namespacepenify__hook_1_1ui__utils_a3da02cd1140179a9ce60f62c85fccfef_cgraph.svg b/docs/html/namespacepenify__hook_1_1ui__utils_a3da02cd1140179a9ce60f62c85fccfef_cgraph.svg new file mode 100644 index 0000000..29c14be --- /dev/null +++ b/docs/html/namespacepenify__hook_1_1ui__utils_a3da02cd1140179a9ce60f62c85fccfef_cgraph.svg @@ -0,0 +1,38 @@ + + + + + + +penify_hook.ui_utils.create_stage_progress_bar + + + +Node1 + + +penify_hook.ui_utils.create +_stage_progress_bar + + + + + +Node2 + + +penify_hook.ui_utils.format_info + + + + + +Node1->Node2 + + + + + diff --git a/docs/html/namespacepenify__hook_1_1ui__utils_a3da02cd1140179a9ce60f62c85fccfef_icgraph.map b/docs/html/namespacepenify__hook_1_1ui__utils_a3da02cd1140179a9ce60f62c85fccfef_icgraph.map new file mode 100644 index 0000000..f7b8a4e --- /dev/null +++ b/docs/html/namespacepenify__hook_1_1ui__utils_a3da02cd1140179a9ce60f62c85fccfef_icgraph.map @@ -0,0 +1,4 @@ + + + + diff --git a/docs/html/namespacepenify__hook_1_1ui__utils_a3da02cd1140179a9ce60f62c85fccfef_icgraph.md5 b/docs/html/namespacepenify__hook_1_1ui__utils_a3da02cd1140179a9ce60f62c85fccfef_icgraph.md5 new file mode 100644 index 0000000..2972d31 --- /dev/null +++ b/docs/html/namespacepenify__hook_1_1ui__utils_a3da02cd1140179a9ce60f62c85fccfef_icgraph.md5 @@ -0,0 +1 @@ +c7fe8cba89008798c4a6df0ce478844e \ No newline at end of file diff --git a/docs/html/namespacepenify__hook_1_1ui__utils_a3da02cd1140179a9ce60f62c85fccfef_icgraph.svg b/docs/html/namespacepenify__hook_1_1ui__utils_a3da02cd1140179a9ce60f62c85fccfef_icgraph.svg new file mode 100644 index 0000000..756b57c --- /dev/null +++ b/docs/html/namespacepenify__hook_1_1ui__utils_a3da02cd1140179a9ce60f62c85fccfef_icgraph.svg @@ -0,0 +1,39 @@ + + + + + + +penify_hook.ui_utils.create_stage_progress_bar + + + +Node1 + + +penify_hook.ui_utils.create +_stage_progress_bar + + + + + +Node2 + + +penify_hook.file_analyzer. +FileAnalyzerGenHook.run + + + + + +Node1->Node2 + + + + + diff --git a/docs/html/namespacepenify__hook_1_1ui__utils_a4dd934568897433fa73f9cc182ac4a3e_icgraph.map b/docs/html/namespacepenify__hook_1_1ui__utils_a4dd934568897433fa73f9cc182ac4a3e_icgraph.map new file mode 100644 index 0000000..1474643 --- /dev/null +++ b/docs/html/namespacepenify__hook_1_1ui__utils_a4dd934568897433fa73f9cc182ac4a3e_icgraph.map @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/docs/html/namespacepenify__hook_1_1ui__utils_a4dd934568897433fa73f9cc182ac4a3e_icgraph.md5 b/docs/html/namespacepenify__hook_1_1ui__utils_a4dd934568897433fa73f9cc182ac4a3e_icgraph.md5 new file mode 100644 index 0000000..69b06bc --- /dev/null +++ b/docs/html/namespacepenify__hook_1_1ui__utils_a4dd934568897433fa73f9cc182ac4a3e_icgraph.md5 @@ -0,0 +1 @@ +e9b17f53f8eea3fa235635a840d97fb5 \ No newline at end of file diff --git a/docs/html/namespacepenify__hook_1_1ui__utils_a4dd934568897433fa73f9cc182ac4a3e_icgraph.svg b/docs/html/namespacepenify__hook_1_1ui__utils_a4dd934568897433fa73f9cc182ac4a3e_icgraph.svg new file mode 100644 index 0000000..35fcfaa --- /dev/null +++ b/docs/html/namespacepenify__hook_1_1ui__utils_a4dd934568897433fa73f9cc182ac4a3e_icgraph.svg @@ -0,0 +1,266 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +penify_hook.ui_utils.format_error + + + +Node1 + + +penify_hook.ui_utils.format +_error + + + + + +Node2 + + +penify_hook.ui_utils.print +_error + + + + + +Node1->Node2 + + + + + +Node3 + + +penify_hook.commands.commit +_commands.commit_code + + + + + +Node2->Node3 + + + + + +Node4 + + +penify_hook.commands.commit +_commands.handle_commit + + + + + +Node3->Node4 + + + + + +Node7 + + +tests.test_commit_commands. +TestCommitCommands.test +_commit_code_error_handling + + + + + +Node3->Node7 + + + + + +Node8 + + +tests.test_commit_commands. +TestCommitCommands.test +_commit_code_with_jira_client + + + + + +Node3->Node8 + + + + + +Node9 + + +tests.test_commit_commands. +TestCommitCommands.test +_commit_code_with_jira_connection +_failure + + + + + +Node3->Node9 + + + + + +Node10 + + +tests.test_commit_commands. +TestCommitCommands.test +_commit_code_with_llm_client + + + + + +Node3->Node10 + + + + + +Node5 + + +penify_hook.main.main + + + + + +Node4->Node5 + + + + + +Node6 + + +tests.test_commit_commands. +TestCommitCommands.test +_handle_commit + + + + + +Node4->Node6 + + + + + +Node5->Node5 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/html/namespacepenify__hook_1_1ui__utils_a4dd934568897433fa73f9cc182ac4a3e_icgraph_org.svg b/docs/html/namespacepenify__hook_1_1ui__utils_a4dd934568897433fa73f9cc182ac4a3e_icgraph_org.svg new file mode 100644 index 0000000..d6c4844 --- /dev/null +++ b/docs/html/namespacepenify__hook_1_1ui__utils_a4dd934568897433fa73f9cc182ac4a3e_icgraph_org.svg @@ -0,0 +1,178 @@ + + + + + + +penify_hook.ui_utils.format_error + + + +Node1 + + +penify_hook.ui_utils.format +_error + + + + + +Node2 + + +penify_hook.ui_utils.print +_error + + + + + +Node1->Node2 + + + + + +Node3 + + +penify_hook.commands.commit +_commands.commit_code + + + + + +Node2->Node3 + + + + + +Node4 + + +penify_hook.commands.commit +_commands.handle_commit + + + + + +Node3->Node4 + + + + + +Node7 + + +tests.test_commit_commands. +TestCommitCommands.test +_commit_code_error_handling + + + + + +Node3->Node7 + + + + + +Node8 + + +tests.test_commit_commands. +TestCommitCommands.test +_commit_code_with_jira_client + + + + + +Node3->Node8 + + + + + +Node9 + + +tests.test_commit_commands. +TestCommitCommands.test +_commit_code_with_jira_connection +_failure + + + + + +Node3->Node9 + + + + + +Node10 + + +tests.test_commit_commands. +TestCommitCommands.test +_commit_code_with_llm_client + + + + + +Node3->Node10 + + + + + +Node5 + + +penify_hook.main.main + + + + + +Node4->Node5 + + + + + +Node6 + + +tests.test_commit_commands. +TestCommitCommands.test +_handle_commit + + + + + +Node4->Node6 + + + + + +Node5->Node5 + + + + + diff --git a/docs/html/namespacepenify__hook_1_1ui__utils_a532cdb4de7c679ce8b29c3e9116c4776_icgraph.map b/docs/html/namespacepenify__hook_1_1ui__utils_a532cdb4de7c679ce8b29c3e9116c4776_icgraph.map new file mode 100644 index 0000000..9ed7a63 --- /dev/null +++ b/docs/html/namespacepenify__hook_1_1ui__utils_a532cdb4de7c679ce8b29c3e9116c4776_icgraph.map @@ -0,0 +1,7 @@ + + + + + + + diff --git a/docs/html/namespacepenify__hook_1_1ui__utils_a532cdb4de7c679ce8b29c3e9116c4776_icgraph.md5 b/docs/html/namespacepenify__hook_1_1ui__utils_a532cdb4de7c679ce8b29c3e9116c4776_icgraph.md5 new file mode 100644 index 0000000..5199573 --- /dev/null +++ b/docs/html/namespacepenify__hook_1_1ui__utils_a532cdb4de7c679ce8b29c3e9116c4776_icgraph.md5 @@ -0,0 +1 @@ +e25efaa5775be3034819eb11f9cbeeb3 \ No newline at end of file diff --git a/docs/html/namespacepenify__hook_1_1ui__utils_a532cdb4de7c679ce8b29c3e9116c4776_icgraph.svg b/docs/html/namespacepenify__hook_1_1ui__utils_a532cdb4de7c679ce8b29c3e9116c4776_icgraph.svg new file mode 100644 index 0000000..1b60170 --- /dev/null +++ b/docs/html/namespacepenify__hook_1_1ui__utils_a532cdb4de7c679ce8b29c3e9116c4776_icgraph.svg @@ -0,0 +1,175 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +penify_hook.ui_utils.format_success + + + +Node1 + + +penify_hook.ui_utils.format +_success + + + + + +Node2 + + +penify_hook.ui_utils.print +_success + + + + + +Node1->Node2 + + + + + +Node3 + + +penify_hook.file_analyzer. +FileAnalyzerGenHook.run + + + + + +Node2->Node3 + + + + + +Node4 + + +penify_hook.git_analyzer. +GitDocGenHook.run + + + + + +Node2->Node4 + + + + + +Node5 + + +penify_hook.commit +_analyzer.CommitDocGenHook.run + + + + + +Node2->Node5 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/html/namespacepenify__hook_1_1ui__utils_a532cdb4de7c679ce8b29c3e9116c4776_icgraph_org.svg b/docs/html/namespacepenify__hook_1_1ui__utils_a532cdb4de7c679ce8b29c3e9116c4776_icgraph_org.svg new file mode 100644 index 0000000..a84c7b9 --- /dev/null +++ b/docs/html/namespacepenify__hook_1_1ui__utils_a532cdb4de7c679ce8b29c3e9116c4776_icgraph_org.svg @@ -0,0 +1,87 @@ + + + + + + +penify_hook.ui_utils.format_success + + + +Node1 + + +penify_hook.ui_utils.format +_success + + + + + +Node2 + + +penify_hook.ui_utils.print +_success + + + + + +Node1->Node2 + + + + + +Node3 + + +penify_hook.file_analyzer. +FileAnalyzerGenHook.run + + + + + +Node2->Node3 + + + + + +Node4 + + +penify_hook.git_analyzer. +GitDocGenHook.run + + + + + +Node2->Node4 + + + + + +Node5 + + +penify_hook.commit +_analyzer.CommitDocGenHook.run + + + + + +Node2->Node5 + + + + + diff --git a/docs/html/namespacepenify__hook_1_1ui__utils_a5a7340d0fc60fb80f17514d60bf45f1d_icgraph.map b/docs/html/namespacepenify__hook_1_1ui__utils_a5a7340d0fc60fb80f17514d60bf45f1d_icgraph.map new file mode 100644 index 0000000..68ad486 --- /dev/null +++ b/docs/html/namespacepenify__hook_1_1ui__utils_a5a7340d0fc60fb80f17514d60bf45f1d_icgraph.map @@ -0,0 +1,6 @@ + + + + + + diff --git a/docs/html/namespacepenify__hook_1_1ui__utils_a5a7340d0fc60fb80f17514d60bf45f1d_icgraph.md5 b/docs/html/namespacepenify__hook_1_1ui__utils_a5a7340d0fc60fb80f17514d60bf45f1d_icgraph.md5 new file mode 100644 index 0000000..882dba5 --- /dev/null +++ b/docs/html/namespacepenify__hook_1_1ui__utils_a5a7340d0fc60fb80f17514d60bf45f1d_icgraph.md5 @@ -0,0 +1 @@ +3b447097b4d45a9b7a66bc911d7dd54f \ No newline at end of file diff --git a/docs/html/namespacepenify__hook_1_1ui__utils_a5a7340d0fc60fb80f17514d60bf45f1d_icgraph.svg b/docs/html/namespacepenify__hook_1_1ui__utils_a5a7340d0fc60fb80f17514d60bf45f1d_icgraph.svg new file mode 100644 index 0000000..dd6a762 --- /dev/null +++ b/docs/html/namespacepenify__hook_1_1ui__utils_a5a7340d0fc60fb80f17514d60bf45f1d_icgraph.svg @@ -0,0 +1,165 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +penify_hook.ui_utils.update_stage + + + +Node1 + + +penify_hook.ui_utils.update +_stage + + + + + +Node2 + + +penify_hook.file_analyzer. +FileAnalyzerGenHook.process_file + + + + + +Node1->Node2 + + + + + +Node3 + + +penify_hook.file_analyzer. +FileAnalyzerGenHook.run + + + + + +Node1->Node3 + + + + + +Node2->Node3 + + + + + +Node4 + + +penify_hook.git_analyzer. +GitDocGenHook.run + + + + + +Node2->Node4 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/html/namespacepenify__hook_1_1ui__utils_a5a7340d0fc60fb80f17514d60bf45f1d_icgraph_org.svg b/docs/html/namespacepenify__hook_1_1ui__utils_a5a7340d0fc60fb80f17514d60bf45f1d_icgraph_org.svg new file mode 100644 index 0000000..1b51200 --- /dev/null +++ b/docs/html/namespacepenify__hook_1_1ui__utils_a5a7340d0fc60fb80f17514d60bf45f1d_icgraph_org.svg @@ -0,0 +1,77 @@ + + + + + + +penify_hook.ui_utils.update_stage + + + +Node1 + + +penify_hook.ui_utils.update +_stage + + + + + +Node2 + + +penify_hook.file_analyzer. +FileAnalyzerGenHook.process_file + + + + + +Node1->Node2 + + + + + +Node3 + + +penify_hook.file_analyzer. +FileAnalyzerGenHook.run + + + + + +Node1->Node3 + + + + + +Node2->Node3 + + + + + +Node4 + + +penify_hook.git_analyzer. +GitDocGenHook.run + + + + + +Node2->Node4 + + + + + diff --git a/docs/html/namespacepenify__hook_1_1ui__utils_a6f0acd7dd91abfe67d0807803bc3b65f_cgraph.map b/docs/html/namespacepenify__hook_1_1ui__utils_a6f0acd7dd91abfe67d0807803bc3b65f_cgraph.map new file mode 100644 index 0000000..b95ed08 --- /dev/null +++ b/docs/html/namespacepenify__hook_1_1ui__utils_a6f0acd7dd91abfe67d0807803bc3b65f_cgraph.map @@ -0,0 +1,4 @@ + + + + diff --git a/docs/html/namespacepenify__hook_1_1ui__utils_a6f0acd7dd91abfe67d0807803bc3b65f_cgraph.md5 b/docs/html/namespacepenify__hook_1_1ui__utils_a6f0acd7dd91abfe67d0807803bc3b65f_cgraph.md5 new file mode 100644 index 0000000..e14594c --- /dev/null +++ b/docs/html/namespacepenify__hook_1_1ui__utils_a6f0acd7dd91abfe67d0807803bc3b65f_cgraph.md5 @@ -0,0 +1 @@ +f7f77cf41919f414860683374ddefc0a \ No newline at end of file diff --git a/docs/html/namespacepenify__hook_1_1ui__utils_a6f0acd7dd91abfe67d0807803bc3b65f_cgraph.svg b/docs/html/namespacepenify__hook_1_1ui__utils_a6f0acd7dd91abfe67d0807803bc3b65f_cgraph.svg new file mode 100644 index 0000000..268b380 --- /dev/null +++ b/docs/html/namespacepenify__hook_1_1ui__utils_a6f0acd7dd91abfe67d0807803bc3b65f_cgraph.svg @@ -0,0 +1,39 @@ + + + + + + +penify_hook.ui_utils.print_error + + + +Node1 + + +penify_hook.ui_utils.print +_error + + + + + +Node2 + + +penify_hook.ui_utils.format +_error + + + + + +Node1->Node2 + + + + + diff --git a/docs/html/namespacepenify__hook_1_1ui__utils_a6f0acd7dd91abfe67d0807803bc3b65f_icgraph.map b/docs/html/namespacepenify__hook_1_1ui__utils_a6f0acd7dd91abfe67d0807803bc3b65f_icgraph.map new file mode 100644 index 0000000..cfe84b1 --- /dev/null +++ b/docs/html/namespacepenify__hook_1_1ui__utils_a6f0acd7dd91abfe67d0807803bc3b65f_icgraph.map @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/docs/html/namespacepenify__hook_1_1ui__utils_a6f0acd7dd91abfe67d0807803bc3b65f_icgraph.md5 b/docs/html/namespacepenify__hook_1_1ui__utils_a6f0acd7dd91abfe67d0807803bc3b65f_icgraph.md5 new file mode 100644 index 0000000..8538194 --- /dev/null +++ b/docs/html/namespacepenify__hook_1_1ui__utils_a6f0acd7dd91abfe67d0807803bc3b65f_icgraph.md5 @@ -0,0 +1 @@ +9c27aeee4681a41d96bdc9cb1c2cd259 \ No newline at end of file diff --git a/docs/html/namespacepenify__hook_1_1ui__utils_a6f0acd7dd91abfe67d0807803bc3b65f_icgraph.svg b/docs/html/namespacepenify__hook_1_1ui__utils_a6f0acd7dd91abfe67d0807803bc3b65f_icgraph.svg new file mode 100644 index 0000000..5e321ab --- /dev/null +++ b/docs/html/namespacepenify__hook_1_1ui__utils_a6f0acd7dd91abfe67d0807803bc3b65f_icgraph.svg @@ -0,0 +1,250 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +penify_hook.ui_utils.print_error + + + +Node1 + + +penify_hook.ui_utils.print +_error + + + + + +Node2 + + +penify_hook.commands.commit +_commands.commit_code + + + + + +Node1->Node2 + + + + + +Node3 + + +penify_hook.commands.commit +_commands.handle_commit + + + + + +Node2->Node3 + + + + + +Node6 + + +tests.test_commit_commands. +TestCommitCommands.test +_commit_code_error_handling + + + + + +Node2->Node6 + + + + + +Node7 + + +tests.test_commit_commands. +TestCommitCommands.test +_commit_code_with_jira_client + + + + + +Node2->Node7 + + + + + +Node8 + + +tests.test_commit_commands. +TestCommitCommands.test +_commit_code_with_jira_connection +_failure + + + + + +Node2->Node8 + + + + + +Node9 + + +tests.test_commit_commands. +TestCommitCommands.test +_commit_code_with_llm_client + + + + + +Node2->Node9 + + + + + +Node4 + + +penify_hook.main.main + + + + + +Node3->Node4 + + + + + +Node5 + + +tests.test_commit_commands. +TestCommitCommands.test +_handle_commit + + + + + +Node3->Node5 + + + + + +Node4->Node4 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/html/namespacepenify__hook_1_1ui__utils_a6f0acd7dd91abfe67d0807803bc3b65f_icgraph_org.svg b/docs/html/namespacepenify__hook_1_1ui__utils_a6f0acd7dd91abfe67d0807803bc3b65f_icgraph_org.svg new file mode 100644 index 0000000..e913c1f --- /dev/null +++ b/docs/html/namespacepenify__hook_1_1ui__utils_a6f0acd7dd91abfe67d0807803bc3b65f_icgraph_org.svg @@ -0,0 +1,162 @@ + + + + + + +penify_hook.ui_utils.print_error + + + +Node1 + + +penify_hook.ui_utils.print +_error + + + + + +Node2 + + +penify_hook.commands.commit +_commands.commit_code + + + + + +Node1->Node2 + + + + + +Node3 + + +penify_hook.commands.commit +_commands.handle_commit + + + + + +Node2->Node3 + + + + + +Node6 + + +tests.test_commit_commands. +TestCommitCommands.test +_commit_code_error_handling + + + + + +Node2->Node6 + + + + + +Node7 + + +tests.test_commit_commands. +TestCommitCommands.test +_commit_code_with_jira_client + + + + + +Node2->Node7 + + + + + +Node8 + + +tests.test_commit_commands. +TestCommitCommands.test +_commit_code_with_jira_connection +_failure + + + + + +Node2->Node8 + + + + + +Node9 + + +tests.test_commit_commands. +TestCommitCommands.test +_commit_code_with_llm_client + + + + + +Node2->Node9 + + + + + +Node4 + + +penify_hook.main.main + + + + + +Node3->Node4 + + + + + +Node5 + + +tests.test_commit_commands. +TestCommitCommands.test +_handle_commit + + + + + +Node3->Node5 + + + + + +Node4->Node4 + + + + + diff --git a/docs/html/namespacepenify__hook_1_1ui__utils_a811f0adf6e9bf71510c379b6fa155e44_cgraph.map b/docs/html/namespacepenify__hook_1_1ui__utils_a811f0adf6e9bf71510c379b6fa155e44_cgraph.map new file mode 100644 index 0000000..07143b8 --- /dev/null +++ b/docs/html/namespacepenify__hook_1_1ui__utils_a811f0adf6e9bf71510c379b6fa155e44_cgraph.map @@ -0,0 +1,4 @@ + + + + diff --git a/docs/html/namespacepenify__hook_1_1ui__utils_a811f0adf6e9bf71510c379b6fa155e44_cgraph.md5 b/docs/html/namespacepenify__hook_1_1ui__utils_a811f0adf6e9bf71510c379b6fa155e44_cgraph.md5 new file mode 100644 index 0000000..f566c4a --- /dev/null +++ b/docs/html/namespacepenify__hook_1_1ui__utils_a811f0adf6e9bf71510c379b6fa155e44_cgraph.md5 @@ -0,0 +1 @@ +0ee2c99f818d114be866466bd3ca67e3 \ No newline at end of file diff --git a/docs/html/namespacepenify__hook_1_1ui__utils_a811f0adf6e9bf71510c379b6fa155e44_cgraph.svg b/docs/html/namespacepenify__hook_1_1ui__utils_a811f0adf6e9bf71510c379b6fa155e44_cgraph.svg new file mode 100644 index 0000000..ec42fa5 --- /dev/null +++ b/docs/html/namespacepenify__hook_1_1ui__utils_a811f0adf6e9bf71510c379b6fa155e44_cgraph.svg @@ -0,0 +1,37 @@ + + + + + + +penify_hook.ui_utils.print_info + + + +Node1 + + +penify_hook.ui_utils.print_info + + + + + +Node2 + + +penify_hook.ui_utils.format_info + + + + + +Node1->Node2 + + + + + diff --git a/docs/html/namespacepenify__hook_1_1ui__utils_a811f0adf6e9bf71510c379b6fa155e44_icgraph.map b/docs/html/namespacepenify__hook_1_1ui__utils_a811f0adf6e9bf71510c379b6fa155e44_icgraph.map new file mode 100644 index 0000000..a111cc8 --- /dev/null +++ b/docs/html/namespacepenify__hook_1_1ui__utils_a811f0adf6e9bf71510c379b6fa155e44_icgraph.map @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/docs/html/namespacepenify__hook_1_1ui__utils_a811f0adf6e9bf71510c379b6fa155e44_icgraph.md5 b/docs/html/namespacepenify__hook_1_1ui__utils_a811f0adf6e9bf71510c379b6fa155e44_icgraph.md5 new file mode 100644 index 0000000..9d7b6fc --- /dev/null +++ b/docs/html/namespacepenify__hook_1_1ui__utils_a811f0adf6e9bf71510c379b6fa155e44_icgraph.md5 @@ -0,0 +1 @@ +4693bdcc77b647a09f27d1c12b6cf38a \ No newline at end of file diff --git a/docs/html/namespacepenify__hook_1_1ui__utils_a811f0adf6e9bf71510c379b6fa155e44_icgraph.svg b/docs/html/namespacepenify__hook_1_1ui__utils_a811f0adf6e9bf71510c379b6fa155e44_icgraph.svg new file mode 100644 index 0000000..5e238f9 --- /dev/null +++ b/docs/html/namespacepenify__hook_1_1ui__utils_a811f0adf6e9bf71510c379b6fa155e44_icgraph.svg @@ -0,0 +1,356 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +penify_hook.ui_utils.print_info + + + +Node1 + + +penify_hook.ui_utils.print_info + + + + + +Node2 + + +penify_hook.commands.commit +_commands.commit_code + + + + + +Node1->Node2 + + + + + +Node3 + + +penify_hook.commands.commit +_commands.handle_commit + + + + + +Node1->Node3 + + + + + +Node4 + + +penify_hook.main.main + + + + + +Node1->Node4 + + + + + +Node10 + + +penify_hook.jira_client. +JiraClient.extract_issue +_keys_from_branch + + + + + +Node1->Node10 + + + + + +Node11 + + +penify_hook.commit +_analyzer.CommitDocGenHook.get +_summary + + + + + +Node1->Node11 + + + + + +Node12 + + +penify_hook.commit +_analyzer.CommitDocGenHook.run + + + + + +Node1->Node12 + + + + + +Node13 + + +penify_hook.commit +_analyzer.CommitDocGenHook.process +_jira_integration + + + + + +Node1->Node13 + + + + + +Node14 + + +penify_hook.git_analyzer. +GitDocGenHook.run + + + + + +Node1->Node14 + + + + + +Node2->Node3 + + + + + +Node6 + + +tests.test_commit_commands. +TestCommitCommands.test +_commit_code_error_handling + + + + + +Node2->Node6 + + + + + +Node7 + + +tests.test_commit_commands. +TestCommitCommands.test +_commit_code_with_jira_client + + + + + +Node2->Node7 + + + + + +Node8 + + +tests.test_commit_commands. +TestCommitCommands.test +_commit_code_with_jira_connection +_failure + + + + + +Node2->Node8 + + + + + +Node9 + + +tests.test_commit_commands. +TestCommitCommands.test +_commit_code_with_llm_client + + + + + +Node2->Node9 + + + + + +Node3->Node4 + + + + + +Node5 + + +tests.test_commit_commands. +TestCommitCommands.test +_handle_commit + + + + + +Node3->Node5 + + + + + +Node4->Node4 + + + + + +Node11->Node12 + + + + + +Node13->Node12 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/html/namespacepenify__hook_1_1ui__utils_a811f0adf6e9bf71510c379b6fa155e44_icgraph_org.svg b/docs/html/namespacepenify__hook_1_1ui__utils_a811f0adf6e9bf71510c379b6fa155e44_icgraph_org.svg new file mode 100644 index 0000000..f960222 --- /dev/null +++ b/docs/html/namespacepenify__hook_1_1ui__utils_a811f0adf6e9bf71510c379b6fa155e44_icgraph_org.svg @@ -0,0 +1,268 @@ + + + + + + +penify_hook.ui_utils.print_info + + + +Node1 + + +penify_hook.ui_utils.print_info + + + + + +Node2 + + +penify_hook.commands.commit +_commands.commit_code + + + + + +Node1->Node2 + + + + + +Node3 + + +penify_hook.commands.commit +_commands.handle_commit + + + + + +Node1->Node3 + + + + + +Node4 + + +penify_hook.main.main + + + + + +Node1->Node4 + + + + + +Node10 + + +penify_hook.jira_client. +JiraClient.extract_issue +_keys_from_branch + + + + + +Node1->Node10 + + + + + +Node11 + + +penify_hook.commit +_analyzer.CommitDocGenHook.get +_summary + + + + + +Node1->Node11 + + + + + +Node12 + + +penify_hook.commit +_analyzer.CommitDocGenHook.run + + + + + +Node1->Node12 + + + + + +Node13 + + +penify_hook.commit +_analyzer.CommitDocGenHook.process +_jira_integration + + + + + +Node1->Node13 + + + + + +Node14 + + +penify_hook.git_analyzer. +GitDocGenHook.run + + + + + +Node1->Node14 + + + + + +Node2->Node3 + + + + + +Node6 + + +tests.test_commit_commands. +TestCommitCommands.test +_commit_code_error_handling + + + + + +Node2->Node6 + + + + + +Node7 + + +tests.test_commit_commands. +TestCommitCommands.test +_commit_code_with_jira_client + + + + + +Node2->Node7 + + + + + +Node8 + + +tests.test_commit_commands. +TestCommitCommands.test +_commit_code_with_jira_connection +_failure + + + + + +Node2->Node8 + + + + + +Node9 + + +tests.test_commit_commands. +TestCommitCommands.test +_commit_code_with_llm_client + + + + + +Node2->Node9 + + + + + +Node3->Node4 + + + + + +Node5 + + +tests.test_commit_commands. +TestCommitCommands.test +_handle_commit + + + + + +Node3->Node5 + + + + + +Node4->Node4 + + + + + +Node11->Node12 + + + + + +Node13->Node12 + + + + + diff --git a/docs/html/namespacepenify__hook_1_1ui__utils_a92c3e466d1912058167be2eacf85b9f6_icgraph.map b/docs/html/namespacepenify__hook_1_1ui__utils_a92c3e466d1912058167be2eacf85b9f6_icgraph.map new file mode 100644 index 0000000..7df2c63 --- /dev/null +++ b/docs/html/namespacepenify__hook_1_1ui__utils_a92c3e466d1912058167be2eacf85b9f6_icgraph.map @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/docs/html/namespacepenify__hook_1_1ui__utils_a92c3e466d1912058167be2eacf85b9f6_icgraph.md5 b/docs/html/namespacepenify__hook_1_1ui__utils_a92c3e466d1912058167be2eacf85b9f6_icgraph.md5 new file mode 100644 index 0000000..0acebf0 --- /dev/null +++ b/docs/html/namespacepenify__hook_1_1ui__utils_a92c3e466d1912058167be2eacf85b9f6_icgraph.md5 @@ -0,0 +1 @@ +ebb2d3fbd74327cb6297532859329884 \ No newline at end of file diff --git a/docs/html/namespacepenify__hook_1_1ui__utils_a92c3e466d1912058167be2eacf85b9f6_icgraph.svg b/docs/html/namespacepenify__hook_1_1ui__utils_a92c3e466d1912058167be2eacf85b9f6_icgraph.svg new file mode 100644 index 0000000..af64c2d --- /dev/null +++ b/docs/html/namespacepenify__hook_1_1ui__utils_a92c3e466d1912058167be2eacf85b9f6_icgraph.svg @@ -0,0 +1,425 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +penify_hook.ui_utils.format_info + + + +Node1 + + +penify_hook.ui_utils.format_info + + + + + +Node2 + + +penify_hook.ui_utils.create +_progress_bar + + + + + +Node1->Node2 + + + + + +Node4 + + +penify_hook.ui_utils.create +_stage_progress_bar + + + + + +Node1->Node4 + + + + + +Node6 + + +penify_hook.ui_utils.print_info + + + + + +Node1->Node6 + + + + + +Node3 + + +penify_hook.git_analyzer. +GitDocGenHook.run + + + + + +Node2->Node3 + + + + + +Node5 + + +penify_hook.file_analyzer. +FileAnalyzerGenHook.run + + + + + +Node4->Node5 + + + + + +Node6->Node3 + + + + + +Node7 + + +penify_hook.commands.commit +_commands.commit_code + + + + + +Node6->Node7 + + + + + +Node8 + + +penify_hook.commands.commit +_commands.handle_commit + + + + + +Node6->Node8 + + + + + +Node9 + + +penify_hook.main.main + + + + + +Node6->Node9 + + + + + +Node15 + + +penify_hook.jira_client. +JiraClient.extract_issue +_keys_from_branch + + + + + +Node6->Node15 + + + + + +Node16 + + +penify_hook.commit +_analyzer.CommitDocGenHook.get +_summary + + + + + +Node6->Node16 + + + + + +Node17 + + +penify_hook.commit +_analyzer.CommitDocGenHook.run + + + + + +Node6->Node17 + + + + + +Node18 + + +penify_hook.commit +_analyzer.CommitDocGenHook.process +_jira_integration + + + + + +Node6->Node18 + + + + + +Node7->Node8 + + + + + +Node11 + + +tests.test_commit_commands. +TestCommitCommands.test +_commit_code_error_handling + + + + + +Node7->Node11 + + + + + +Node12 + + +tests.test_commit_commands. +TestCommitCommands.test +_commit_code_with_jira_client + + + + + +Node7->Node12 + + + + + +Node13 + + +tests.test_commit_commands. +TestCommitCommands.test +_commit_code_with_jira_connection +_failure + + + + + +Node7->Node13 + + + + + +Node14 + + +tests.test_commit_commands. +TestCommitCommands.test +_commit_code_with_llm_client + + + + + +Node7->Node14 + + + + + +Node8->Node9 + + + + + +Node10 + + +tests.test_commit_commands. +TestCommitCommands.test +_handle_commit + + + + + +Node8->Node10 + + + + + +Node9->Node9 + + + + + +Node16->Node17 + + + + + +Node18->Node17 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/html/namespacepenify__hook_1_1ui__utils_a92c3e466d1912058167be2eacf85b9f6_icgraph_org.svg b/docs/html/namespacepenify__hook_1_1ui__utils_a92c3e466d1912058167be2eacf85b9f6_icgraph_org.svg new file mode 100644 index 0000000..99f7f74 --- /dev/null +++ b/docs/html/namespacepenify__hook_1_1ui__utils_a92c3e466d1912058167be2eacf85b9f6_icgraph_org.svg @@ -0,0 +1,337 @@ + + + + + + +penify_hook.ui_utils.format_info + + + +Node1 + + +penify_hook.ui_utils.format_info + + + + + +Node2 + + +penify_hook.ui_utils.create +_progress_bar + + + + + +Node1->Node2 + + + + + +Node4 + + +penify_hook.ui_utils.create +_stage_progress_bar + + + + + +Node1->Node4 + + + + + +Node6 + + +penify_hook.ui_utils.print_info + + + + + +Node1->Node6 + + + + + +Node3 + + +penify_hook.git_analyzer. +GitDocGenHook.run + + + + + +Node2->Node3 + + + + + +Node5 + + +penify_hook.file_analyzer. +FileAnalyzerGenHook.run + + + + + +Node4->Node5 + + + + + +Node6->Node3 + + + + + +Node7 + + +penify_hook.commands.commit +_commands.commit_code + + + + + +Node6->Node7 + + + + + +Node8 + + +penify_hook.commands.commit +_commands.handle_commit + + + + + +Node6->Node8 + + + + + +Node9 + + +penify_hook.main.main + + + + + +Node6->Node9 + + + + + +Node15 + + +penify_hook.jira_client. +JiraClient.extract_issue +_keys_from_branch + + + + + +Node6->Node15 + + + + + +Node16 + + +penify_hook.commit +_analyzer.CommitDocGenHook.get +_summary + + + + + +Node6->Node16 + + + + + +Node17 + + +penify_hook.commit +_analyzer.CommitDocGenHook.run + + + + + +Node6->Node17 + + + + + +Node18 + + +penify_hook.commit +_analyzer.CommitDocGenHook.process +_jira_integration + + + + + +Node6->Node18 + + + + + +Node7->Node8 + + + + + +Node11 + + +tests.test_commit_commands. +TestCommitCommands.test +_commit_code_error_handling + + + + + +Node7->Node11 + + + + + +Node12 + + +tests.test_commit_commands. +TestCommitCommands.test +_commit_code_with_jira_client + + + + + +Node7->Node12 + + + + + +Node13 + + +tests.test_commit_commands. +TestCommitCommands.test +_commit_code_with_jira_connection +_failure + + + + + +Node7->Node13 + + + + + +Node14 + + +tests.test_commit_commands. +TestCommitCommands.test +_commit_code_with_llm_client + + + + + +Node7->Node14 + + + + + +Node8->Node9 + + + + + +Node10 + + +tests.test_commit_commands. +TestCommitCommands.test +_handle_commit + + + + + +Node8->Node10 + + + + + +Node9->Node9 + + + + + +Node16->Node17 + + + + + +Node18->Node17 + + + + + diff --git a/docs/html/namespacepenify__hook_1_1ui__utils_aa6e684c00e26199440137a87ed9b195c_icgraph.map b/docs/html/namespacepenify__hook_1_1ui__utils_aa6e684c00e26199440137a87ed9b195c_icgraph.map new file mode 100644 index 0000000..a068346 --- /dev/null +++ b/docs/html/namespacepenify__hook_1_1ui__utils_aa6e684c00e26199440137a87ed9b195c_icgraph.map @@ -0,0 +1,5 @@ + + + + + diff --git a/docs/html/namespacepenify__hook_1_1ui__utils_aa6e684c00e26199440137a87ed9b195c_icgraph.md5 b/docs/html/namespacepenify__hook_1_1ui__utils_aa6e684c00e26199440137a87ed9b195c_icgraph.md5 new file mode 100644 index 0000000..fc03531 --- /dev/null +++ b/docs/html/namespacepenify__hook_1_1ui__utils_aa6e684c00e26199440137a87ed9b195c_icgraph.md5 @@ -0,0 +1 @@ +cb2ef693a136057440c77b2ffc5fc5cc \ No newline at end of file diff --git a/docs/html/namespacepenify__hook_1_1ui__utils_aa6e684c00e26199440137a87ed9b195c_icgraph.svg b/docs/html/namespacepenify__hook_1_1ui__utils_aa6e684c00e26199440137a87ed9b195c_icgraph.svg new file mode 100644 index 0000000..57fce61 --- /dev/null +++ b/docs/html/namespacepenify__hook_1_1ui__utils_aa6e684c00e26199440137a87ed9b195c_icgraph.svg @@ -0,0 +1,55 @@ + + + + + + +penify_hook.ui_utils.print_status + + + +Node1 + + +penify_hook.ui_utils.print +_status + + + + + +Node2 + + +penify_hook.file_analyzer. +FileAnalyzerGenHook.run + + + + + +Node1->Node2 + + + + + +Node3 + + +penify_hook.git_analyzer. +GitDocGenHook.run + + + + + +Node1->Node3 + + + + + diff --git a/docs/html/namespacepenify__hook_1_1ui__utils_adfcbbfe39029ab6d1dd33e7bf75ae115_cgraph.map b/docs/html/namespacepenify__hook_1_1ui__utils_adfcbbfe39029ab6d1dd33e7bf75ae115_cgraph.map new file mode 100644 index 0000000..0d99cfe --- /dev/null +++ b/docs/html/namespacepenify__hook_1_1ui__utils_adfcbbfe39029ab6d1dd33e7bf75ae115_cgraph.map @@ -0,0 +1,4 @@ + + + + diff --git a/docs/html/namespacepenify__hook_1_1ui__utils_adfcbbfe39029ab6d1dd33e7bf75ae115_cgraph.md5 b/docs/html/namespacepenify__hook_1_1ui__utils_adfcbbfe39029ab6d1dd33e7bf75ae115_cgraph.md5 new file mode 100644 index 0000000..c14d515 --- /dev/null +++ b/docs/html/namespacepenify__hook_1_1ui__utils_adfcbbfe39029ab6d1dd33e7bf75ae115_cgraph.md5 @@ -0,0 +1 @@ +65fe82e63024fcc065fa65dce2c0c8fb \ No newline at end of file diff --git a/docs/html/namespacepenify__hook_1_1ui__utils_adfcbbfe39029ab6d1dd33e7bf75ae115_cgraph.svg b/docs/html/namespacepenify__hook_1_1ui__utils_adfcbbfe39029ab6d1dd33e7bf75ae115_cgraph.svg new file mode 100644 index 0000000..a59c184 --- /dev/null +++ b/docs/html/namespacepenify__hook_1_1ui__utils_adfcbbfe39029ab6d1dd33e7bf75ae115_cgraph.svg @@ -0,0 +1,39 @@ + + + + + + +penify_hook.ui_utils.print_processing + + + +Node1 + + +penify_hook.ui_utils.print +_processing + + + + + +Node2 + + +penify_hook.ui_utils.format +_file_path + + + + + +Node1->Node2 + + + + + diff --git a/docs/html/namespacepenify__hook_1_1ui__utils_adfcbbfe39029ab6d1dd33e7bf75ae115_icgraph.map b/docs/html/namespacepenify__hook_1_1ui__utils_adfcbbfe39029ab6d1dd33e7bf75ae115_icgraph.map new file mode 100644 index 0000000..f15b74e --- /dev/null +++ b/docs/html/namespacepenify__hook_1_1ui__utils_adfcbbfe39029ab6d1dd33e7bf75ae115_icgraph.map @@ -0,0 +1,4 @@ + + + + diff --git a/docs/html/namespacepenify__hook_1_1ui__utils_adfcbbfe39029ab6d1dd33e7bf75ae115_icgraph.md5 b/docs/html/namespacepenify__hook_1_1ui__utils_adfcbbfe39029ab6d1dd33e7bf75ae115_icgraph.md5 new file mode 100644 index 0000000..568301c --- /dev/null +++ b/docs/html/namespacepenify__hook_1_1ui__utils_adfcbbfe39029ab6d1dd33e7bf75ae115_icgraph.md5 @@ -0,0 +1 @@ +34c0d184b1a914e69d4b0bdacbaaff04 \ No newline at end of file diff --git a/docs/html/namespacepenify__hook_1_1ui__utils_adfcbbfe39029ab6d1dd33e7bf75ae115_icgraph.svg b/docs/html/namespacepenify__hook_1_1ui__utils_adfcbbfe39029ab6d1dd33e7bf75ae115_icgraph.svg new file mode 100644 index 0000000..8c29f6a --- /dev/null +++ b/docs/html/namespacepenify__hook_1_1ui__utils_adfcbbfe39029ab6d1dd33e7bf75ae115_icgraph.svg @@ -0,0 +1,39 @@ + + + + + + +penify_hook.ui_utils.print_processing + + + +Node1 + + +penify_hook.ui_utils.print +_processing + + + + + +Node2 + + +penify_hook.git_analyzer. +GitDocGenHook.run + + + + + +Node1->Node2 + + + + + diff --git a/docs/html/namespacepenify__hook_1_1ui__utils_af3441fb3c2c3850b8b3b6455a9fdaba4_icgraph.map b/docs/html/namespacepenify__hook_1_1ui__utils_af3441fb3c2c3850b8b3b6455a9fdaba4_icgraph.map new file mode 100644 index 0000000..37c3667 --- /dev/null +++ b/docs/html/namespacepenify__hook_1_1ui__utils_af3441fb3c2c3850b8b3b6455a9fdaba4_icgraph.map @@ -0,0 +1,6 @@ + + + + + + diff --git a/docs/html/namespacepenify__hook_1_1ui__utils_af3441fb3c2c3850b8b3b6455a9fdaba4_icgraph.md5 b/docs/html/namespacepenify__hook_1_1ui__utils_af3441fb3c2c3850b8b3b6455a9fdaba4_icgraph.md5 new file mode 100644 index 0000000..354e231 --- /dev/null +++ b/docs/html/namespacepenify__hook_1_1ui__utils_af3441fb3c2c3850b8b3b6455a9fdaba4_icgraph.md5 @@ -0,0 +1 @@ +788f6631fd68b88312b14eace530bcf4 \ No newline at end of file diff --git a/docs/html/namespacepenify__hook_1_1ui__utils_af3441fb3c2c3850b8b3b6455a9fdaba4_icgraph.svg b/docs/html/namespacepenify__hook_1_1ui__utils_af3441fb3c2c3850b8b3b6455a9fdaba4_icgraph.svg new file mode 100644 index 0000000..fa2467e --- /dev/null +++ b/docs/html/namespacepenify__hook_1_1ui__utils_af3441fb3c2c3850b8b3b6455a9fdaba4_icgraph.svg @@ -0,0 +1,160 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +penify_hook.ui_utils.format_file_path + + + +Node1 + + +penify_hook.ui_utils.format +_file_path + + + + + +Node2 + + +penify_hook.ui_utils.print +_processing + + + + + +Node1->Node2 + + + + + +Node4 + + +penify_hook.file_analyzer. +FileAnalyzerGenHook.print +_processing + + + + + +Node1->Node4 + + + + + +Node3 + + +penify_hook.git_analyzer. +GitDocGenHook.run + + + + + +Node2->Node3 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/html/namespacepenify__hook_1_1ui__utils_af3441fb3c2c3850b8b3b6455a9fdaba4_icgraph_org.svg b/docs/html/namespacepenify__hook_1_1ui__utils_af3441fb3c2c3850b8b3b6455a9fdaba4_icgraph_org.svg new file mode 100644 index 0000000..2e9a0f9 --- /dev/null +++ b/docs/html/namespacepenify__hook_1_1ui__utils_af3441fb3c2c3850b8b3b6455a9fdaba4_icgraph_org.svg @@ -0,0 +1,72 @@ + + + + + + +penify_hook.ui_utils.format_file_path + + + +Node1 + + +penify_hook.ui_utils.format +_file_path + + + + + +Node2 + + +penify_hook.ui_utils.print +_processing + + + + + +Node1->Node2 + + + + + +Node4 + + +penify_hook.file_analyzer. +FileAnalyzerGenHook.print +_processing + + + + + +Node1->Node4 + + + + + +Node3 + + +penify_hook.git_analyzer. +GitDocGenHook.run + + + + + +Node2->Node3 + + + + + diff --git a/docs/html/namespacepenify__hook_1_1utils.html b/docs/html/namespacepenify__hook_1_1utils.html new file mode 100644 index 0000000..eba0f22 --- /dev/null +++ b/docs/html/namespacepenify__hook_1_1utils.html @@ -0,0 +1,253 @@ + + + + + + + + + + + + + + + + + + +penify-cli: penify_hook.utils Namespace Reference + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    penify-cli +
    +
    +
    + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    + +
    penify_hook.utils Namespace Reference
    +
    +
    + + + + +

    +Classes

    class  GitRepoNotFoundError
     
    + + + + + + + +

    +Functions

    def get_repo_details (Repo repo)
     
    def recursive_search_git_folder (folder_path)
     
    def find_git_parent (path)
     
    + + + +

    +Variables

     logger = logging.getLogger(__name__)
     
    +

    Function Documentation

    + +

    ◆ find_git_parent()

    + +
    +
    + + + + + + + + +
    def penify_hook.utils.find_git_parent ( path)
    +
    +
    Traverse up from the given path to find the nearest directory containing a .git
    +subdirectory.
    +
    +
    + +

    ◆ get_repo_details()

    + +
    +
    + + + + + + + + +
    def penify_hook.utils.get_repo_details (Repo repo)
    +
    +
    Determine the details of a repository including its remote URL, hosting
    +service, organization name, and repository name.
    +
    +This function extracts the remote URL from the given Git repository object and
    +determines the hosting service (e.g., GitHub, Azure DevOps, Bitbucket, GitLab).
    +It then parses the URL to extract the organization name and repository name. If
    +the URL does not match any known hosting service pattern, it sets the hosting
    +service as "Unknown". The function handles exceptions that may occur during
    +this process and logs an error message if needed.
    +
    +Args:
    +    repo (Repo): A GitPython Repo object representing the local git repository.
    +
    +Returns:
    +    dict: A dictionary containing the organization name, repository name, and hosting
    +        service.
    +
    +
    +
    + +

    ◆ recursive_search_git_folder()

    + +
    +
    + + + + + + + + +
    def penify_hook.utils.recursive_search_git_folder ( folder_path)
    +
    +
    Recursively searches for a .git folder starting from the given directory.
    +Here is the call graph for this function:
    +
    +
    +
    +
    +
    +Here is the caller graph for this function:
    +
    +
    +
    +
    + +
    +
    +

    Variable Documentation

    + +

    ◆ logger

    + +
    +
    + + + + +
    penify_hook.utils.logger = logging.getLogger(__name__)
    +
    + +
    +
    +
    +
    + + + + + diff --git a/docs/html/namespacepenify__hook_1_1utils.js b/docs/html/namespacepenify__hook_1_1utils.js new file mode 100644 index 0000000..af7a599 --- /dev/null +++ b/docs/html/namespacepenify__hook_1_1utils.js @@ -0,0 +1,8 @@ +var namespacepenify__hook_1_1utils = +[ + [ "GitRepoNotFoundError", "classpenify__hook_1_1utils_1_1GitRepoNotFoundError.html", null ], + [ "find_git_parent", "namespacepenify__hook_1_1utils.html#a4ec5335a4026c22a34a3a8ccf665a5f2", null ], + [ "get_repo_details", "namespacepenify__hook_1_1utils.html#ae236f3c4c8bf5dcddbb92b4c2065eea3", null ], + [ "recursive_search_git_folder", "namespacepenify__hook_1_1utils.html#a95c3f9c80860d6a2e2d061d2fb660a3f", null ], + [ "logger", "namespacepenify__hook_1_1utils.html#a0c0c1ed6b197038085c94a90ceedfb01", null ] +]; \ No newline at end of file diff --git a/docs/html/namespacepenify__hook_1_1utils_a95c3f9c80860d6a2e2d061d2fb660a3f_cgraph.map b/docs/html/namespacepenify__hook_1_1utils_a95c3f9c80860d6a2e2d061d2fb660a3f_cgraph.map new file mode 100644 index 0000000..054f06d --- /dev/null +++ b/docs/html/namespacepenify__hook_1_1utils_a95c3f9c80860d6a2e2d061d2fb660a3f_cgraph.map @@ -0,0 +1,3 @@ + + + diff --git a/docs/html/namespacepenify__hook_1_1utils_a95c3f9c80860d6a2e2d061d2fb660a3f_cgraph.md5 b/docs/html/namespacepenify__hook_1_1utils_a95c3f9c80860d6a2e2d061d2fb660a3f_cgraph.md5 new file mode 100644 index 0000000..1431c94 --- /dev/null +++ b/docs/html/namespacepenify__hook_1_1utils_a95c3f9c80860d6a2e2d061d2fb660a3f_cgraph.md5 @@ -0,0 +1 @@ +dd726258fb2e799d709d2647521b3371 \ No newline at end of file diff --git a/docs/html/namespacepenify__hook_1_1utils_a95c3f9c80860d6a2e2d061d2fb660a3f_cgraph.svg b/docs/html/namespacepenify__hook_1_1utils_a95c3f9c80860d6a2e2d061d2fb660a3f_cgraph.svg new file mode 100644 index 0000000..058cc5f --- /dev/null +++ b/docs/html/namespacepenify__hook_1_1utils_a95c3f9c80860d6a2e2d061d2fb660a3f_cgraph.svg @@ -0,0 +1,29 @@ + + + + + + +penify_hook.utils.recursive_search_git_folder + + + +Node1 + + +penify_hook.utils.recursive +_search_git_folder + + + + + +Node1->Node1 + + + + + diff --git a/docs/html/namespacepenify__hook_1_1utils_a95c3f9c80860d6a2e2d061d2fb660a3f_icgraph.map b/docs/html/namespacepenify__hook_1_1utils_a95c3f9c80860d6a2e2d061d2fb660a3f_icgraph.map new file mode 100644 index 0000000..24785f5 --- /dev/null +++ b/docs/html/namespacepenify__hook_1_1utils_a95c3f9c80860d6a2e2d061d2fb660a3f_icgraph.map @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/html/namespacepenify__hook_1_1utils_a95c3f9c80860d6a2e2d061d2fb660a3f_icgraph.md5 b/docs/html/namespacepenify__hook_1_1utils_a95c3f9c80860d6a2e2d061d2fb660a3f_icgraph.md5 new file mode 100644 index 0000000..768ce43 --- /dev/null +++ b/docs/html/namespacepenify__hook_1_1utils_a95c3f9c80860d6a2e2d061d2fb660a3f_icgraph.md5 @@ -0,0 +1 @@ +7f750ca69d16550b240f7065f5db45d2 \ No newline at end of file diff --git a/docs/html/namespacepenify__hook_1_1utils_a95c3f9c80860d6a2e2d061d2fb660a3f_icgraph.svg b/docs/html/namespacepenify__hook_1_1utils_a95c3f9c80860d6a2e2d061d2fb660a3f_icgraph.svg new file mode 100644 index 0000000..4b06faf --- /dev/null +++ b/docs/html/namespacepenify__hook_1_1utils_a95c3f9c80860d6a2e2d061d2fb660a3f_icgraph.svg @@ -0,0 +1,815 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +penify_hook.utils.recursive_search_git_folder + + + +Node1 + + +penify_hook.utils.recursive +_search_git_folder + + + + + +Node1->Node1 + + + + + +Node2 + + +penify_hook.commands.commit +_commands.commit_code + + + + + +Node1->Node2 + + + + + +Node10 + + +penify_hook.commands.config +_commands.get_penify_config + + + + + +Node1->Node10 + + + + + +Node22 + + +penify_hook.commands.config +_commands.load_env_files + + + + + +Node1->Node22 + + + + + +Node32 + + +penify_hook.commands.auth +_commands.save_credentials + + + + + +Node1->Node32 + + + + + +Node35 + + +penify_hook.commands.config +_commands.save_jira_config + + + + + +Node1->Node35 + + + + + +Node37 + + +penify_hook.commands.config +_commands.save_llm_config + + + + + +Node1->Node37 + + + + + +Node3 + + +penify_hook.commands.commit +_commands.handle_commit + + + + + +Node2->Node3 + + + + + +Node6 + + +tests.test_commit_commands. +TestCommitCommands.test +_commit_code_error_handling + + + + + +Node2->Node6 + + + + + +Node7 + + +tests.test_commit_commands. +TestCommitCommands.test +_commit_code_with_jira_client + + + + + +Node2->Node7 + + + + + +Node8 + + +tests.test_commit_commands. +TestCommitCommands.test +_commit_code_with_jira_connection +_failure + + + + + +Node2->Node8 + + + + + +Node9 + + +tests.test_commit_commands. +TestCommitCommands.test +_commit_code_with_llm_client + + + + + +Node2->Node9 + + + + + +Node4 + + +penify_hook.main.main + + + + + +Node3->Node4 + + + + + +Node5 + + +tests.test_commit_commands. +TestCommitCommands.test +_handle_commit + + + + + +Node3->Node5 + + + + + +Node4->Node4 + + + + + +Node11 + + +penify_hook.commands.config +_commands.get_token + + + + + +Node10->Node11 + + + + + +Node20 + + +tests.test_config_commands. +TestConfigCommands.test +_get_penify_config_existing_dir + + + + + +Node10->Node20 + + + + + +Node21 + + +tests.test_config_commands. +TestConfigCommands.test +_get_penify_config_new_dir + + + + + +Node10->Node21 + + + + + +Node11->Node3 + + + + + +Node12 + + +penify_hook.commands.doc +_commands.handle_docgen + + + + + +Node11->Node12 + + + + + +Node17 + + +tests.test_config_commands. +TestConfigCommands.test +_get_token_from_config + + + + + +Node11->Node17 + + + + + +Node18 + + +tests.test_config_commands. +TestConfigCommands.test +_get_token_from_env + + + + + +Node11->Node18 + + + + + +Node19 + + +tests.test_config_commands. +TestConfigCommands.test +_get_token_not_found + + + + + +Node11->Node19 + + + + + +Node12->Node4 + + + + + +Node13 + + +tests.test_doc_commands.test +_handle_docgen_generate + + + + + +Node12->Node13 + + + + + +Node14 + + +tests.test_doc_commands.test +_handle_docgen_install_hook + + + + + +Node12->Node14 + + + + + +Node15 + + +tests.test_doc_commands.test +_handle_docgen_no_token + + + + + +Node12->Node15 + + + + + +Node16 + + +tests.test_doc_commands.test +_handle_docgen_uninstall_hook + + + + + +Node12->Node16 + + + + + +Node22->Node11 + + + + + +Node22->Node22 + + + + + +Node23 + + +penify_hook.commands.config +_commands.get_jira_config + + + + + +Node22->Node23 + + + + + +Node28 + + +penify_hook.commands.config +_commands.get_llm_config + + + + + +Node22->Node28 + + + + + +Node23->Node3 + + + + + +Node24 + + +penify_hook.commands.config +_commands.config_jira_web + + + + + +Node23->Node24 + + + + + +Node27 + + +tests.test_config_commands. +TestConfigCommands.test +_get_jira_config_exists + + + + + +Node23->Node27 + + + + + +Node25 + + +penify_hook.config +_command.handle_config + + + + + +Node24->Node25 + + + + + +Node26 + + +tests.test_web_config.Test +WebConfig.test_config_jira +_web_server_setup + + + + + +Node24->Node26 + + + + + +Node25->Node4 + + + + + +Node28->Node3 + + + + + +Node29 + + +tests.test_config_commands. +TestConfigCommands.test +_get_llm_config_empty + + + + + +Node28->Node29 + + + + + +Node30 + + +tests.test_config_commands. +TestConfigCommands.test +_get_llm_config_exists + + + + + +Node28->Node30 + + + + + +Node31 + + +tests.test_config_commands. +TestConfigCommands.test +_get_llm_config_invalid_json + + + + + +Node28->Node31 + + + + + +Node33 + + +penify_hook.commands.auth +_commands.login + + + + + +Node32->Node33 + + + + + +Node34 + + +penify_hook.login_command.handle +_login + + + + + +Node33->Node34 + + + + + +Node34->Node4 + + + + + +Node35->Node24 + + + + + +Node35->Node25 + + + + + +Node36 + + +tests.test_config_commands. +TestConfigCommands.test +_save_jira_config_success + + + + + +Node35->Node36 + + + + + +Node37->Node25 + + + + + +Node38 + + +tests.test_config_commands. +TestConfigCommands.test +_save_llm_config_failure + + + + + +Node37->Node38 + + + + + +Node39 + + +tests.test_config_commands. +TestConfigCommands.test +_save_llm_config_success + + + + + +Node37->Node39 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/html/namespacepenify__hook_1_1utils_a95c3f9c80860d6a2e2d061d2fb660a3f_icgraph_org.svg b/docs/html/namespacepenify__hook_1_1utils_a95c3f9c80860d6a2e2d061d2fb660a3f_icgraph_org.svg new file mode 100644 index 0000000..8094fbd --- /dev/null +++ b/docs/html/namespacepenify__hook_1_1utils_a95c3f9c80860d6a2e2d061d2fb660a3f_icgraph_org.svg @@ -0,0 +1,727 @@ + + + + + + +penify_hook.utils.recursive_search_git_folder + + + +Node1 + + +penify_hook.utils.recursive +_search_git_folder + + + + + +Node1->Node1 + + + + + +Node2 + + +penify_hook.commands.commit +_commands.commit_code + + + + + +Node1->Node2 + + + + + +Node10 + + +penify_hook.commands.config +_commands.get_penify_config + + + + + +Node1->Node10 + + + + + +Node22 + + +penify_hook.commands.config +_commands.load_env_files + + + + + +Node1->Node22 + + + + + +Node32 + + +penify_hook.commands.auth +_commands.save_credentials + + + + + +Node1->Node32 + + + + + +Node35 + + +penify_hook.commands.config +_commands.save_jira_config + + + + + +Node1->Node35 + + + + + +Node37 + + +penify_hook.commands.config +_commands.save_llm_config + + + + + +Node1->Node37 + + + + + +Node3 + + +penify_hook.commands.commit +_commands.handle_commit + + + + + +Node2->Node3 + + + + + +Node6 + + +tests.test_commit_commands. +TestCommitCommands.test +_commit_code_error_handling + + + + + +Node2->Node6 + + + + + +Node7 + + +tests.test_commit_commands. +TestCommitCommands.test +_commit_code_with_jira_client + + + + + +Node2->Node7 + + + + + +Node8 + + +tests.test_commit_commands. +TestCommitCommands.test +_commit_code_with_jira_connection +_failure + + + + + +Node2->Node8 + + + + + +Node9 + + +tests.test_commit_commands. +TestCommitCommands.test +_commit_code_with_llm_client + + + + + +Node2->Node9 + + + + + +Node4 + + +penify_hook.main.main + + + + + +Node3->Node4 + + + + + +Node5 + + +tests.test_commit_commands. +TestCommitCommands.test +_handle_commit + + + + + +Node3->Node5 + + + + + +Node4->Node4 + + + + + +Node11 + + +penify_hook.commands.config +_commands.get_token + + + + + +Node10->Node11 + + + + + +Node20 + + +tests.test_config_commands. +TestConfigCommands.test +_get_penify_config_existing_dir + + + + + +Node10->Node20 + + + + + +Node21 + + +tests.test_config_commands. +TestConfigCommands.test +_get_penify_config_new_dir + + + + + +Node10->Node21 + + + + + +Node11->Node3 + + + + + +Node12 + + +penify_hook.commands.doc +_commands.handle_docgen + + + + + +Node11->Node12 + + + + + +Node17 + + +tests.test_config_commands. +TestConfigCommands.test +_get_token_from_config + + + + + +Node11->Node17 + + + + + +Node18 + + +tests.test_config_commands. +TestConfigCommands.test +_get_token_from_env + + + + + +Node11->Node18 + + + + + +Node19 + + +tests.test_config_commands. +TestConfigCommands.test +_get_token_not_found + + + + + +Node11->Node19 + + + + + +Node12->Node4 + + + + + +Node13 + + +tests.test_doc_commands.test +_handle_docgen_generate + + + + + +Node12->Node13 + + + + + +Node14 + + +tests.test_doc_commands.test +_handle_docgen_install_hook + + + + + +Node12->Node14 + + + + + +Node15 + + +tests.test_doc_commands.test +_handle_docgen_no_token + + + + + +Node12->Node15 + + + + + +Node16 + + +tests.test_doc_commands.test +_handle_docgen_uninstall_hook + + + + + +Node12->Node16 + + + + + +Node22->Node11 + + + + + +Node22->Node22 + + + + + +Node23 + + +penify_hook.commands.config +_commands.get_jira_config + + + + + +Node22->Node23 + + + + + +Node28 + + +penify_hook.commands.config +_commands.get_llm_config + + + + + +Node22->Node28 + + + + + +Node23->Node3 + + + + + +Node24 + + +penify_hook.commands.config +_commands.config_jira_web + + + + + +Node23->Node24 + + + + + +Node27 + + +tests.test_config_commands. +TestConfigCommands.test +_get_jira_config_exists + + + + + +Node23->Node27 + + + + + +Node25 + + +penify_hook.config +_command.handle_config + + + + + +Node24->Node25 + + + + + +Node26 + + +tests.test_web_config.Test +WebConfig.test_config_jira +_web_server_setup + + + + + +Node24->Node26 + + + + + +Node25->Node4 + + + + + +Node28->Node3 + + + + + +Node29 + + +tests.test_config_commands. +TestConfigCommands.test +_get_llm_config_empty + + + + + +Node28->Node29 + + + + + +Node30 + + +tests.test_config_commands. +TestConfigCommands.test +_get_llm_config_exists + + + + + +Node28->Node30 + + + + + +Node31 + + +tests.test_config_commands. +TestConfigCommands.test +_get_llm_config_invalid_json + + + + + +Node28->Node31 + + + + + +Node33 + + +penify_hook.commands.auth +_commands.login + + + + + +Node32->Node33 + + + + + +Node34 + + +penify_hook.login_command.handle +_login + + + + + +Node33->Node34 + + + + + +Node34->Node4 + + + + + +Node35->Node24 + + + + + +Node35->Node25 + + + + + +Node36 + + +tests.test_config_commands. +TestConfigCommands.test +_save_jira_config_success + + + + + +Node35->Node36 + + + + + +Node37->Node25 + + + + + +Node38 + + +tests.test_config_commands. +TestConfigCommands.test +_save_llm_config_failure + + + + + +Node37->Node38 + + + + + +Node39 + + +tests.test_config_commands. +TestConfigCommands.test +_save_llm_config_success + + + + + +Node37->Node39 + + + + + diff --git a/docs/html/namespaces.html b/docs/html/namespaces.html new file mode 100644 index 0000000..0115dea --- /dev/null +++ b/docs/html/namespaces.html @@ -0,0 +1,173 @@ + + + + + + + + + + + + + + + + + + +penify-cli: Namespace List + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    penify-cli +
    +
    +
    + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    +
    Namespace List
    +
    + +
    + + + + + diff --git a/docs/html/namespaces_dup.js b/docs/html/namespaces_dup.js new file mode 100644 index 0000000..7fcb39b --- /dev/null +++ b/docs/html/namespaces_dup.js @@ -0,0 +1,20 @@ +var namespaces_dup = +[ + [ "penify_hook", "namespacepenify__hook.html", "namespacepenify__hook" ], + [ "setup", "namespacesetup.html", [ + [ "author", "namespacesetup.html#a3a57a4772d418a06835249cbade0d86a", null ], + [ "author_email", "namespacesetup.html#a5b08034343aa2be607722a8b315f3625", null ], + [ "classifiers", "namespacesetup.html#abe96a9c38c1c61f9f0fdb002c482f785", null ], + [ "description", "namespacesetup.html#aedf461ec52a946bda975938ba0b93ec0", null ], + [ "entry_points", "namespacesetup.html#ada7058afc98897f073d3f3b8b9157059", null ], + [ "install_requires", "namespacesetup.html#abead4f26b530856f858f0d44c7cf2588", null ], + [ "long_description", "namespacesetup.html#a4cda9dbfb952875376a0749fe08a5bde", null ], + [ "long_description_content_type", "namespacesetup.html#a3796ea10c998699d07d391414ff5d720", null ], + [ "name", "namespacesetup.html#ab3a7a0638d76a01367c5bc3cc699447f", null ], + [ "packages", "namespacesetup.html#aff2375a361fd5865c77bd9aa093be747", null ], + [ "python_requires", "namespacesetup.html#aa7ca7bc9391b217e81efeb03689d8dbf", null ], + [ "url", "namespacesetup.html#afc13124aa5c0124e84e1d965e3f4b0fb", null ], + [ "version", "namespacesetup.html#a2aa722b36a933088812b50ea79b97a5c", null ] + ] ], + [ "tests", "namespacetests.html", "namespacetests" ] +]; \ No newline at end of file diff --git a/docs/html/namespacesetup.html b/docs/html/namespacesetup.html new file mode 100644 index 0000000..54b9567 --- /dev/null +++ b/docs/html/namespacesetup.html @@ -0,0 +1,345 @@ + + + + + + + + + + + + + + + + + + +penify-cli: setup Namespace Reference + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    penify-cli +
    +
    +
    + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    + +
    setup Namespace Reference
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    +Variables

     name
     
     version
     
     packages
     
     install_requires
     
     entry_points
     
     author
     
     author_email
     
     description
     
     long_description
     
     long_description_content_type
     
     url
     
     classifiers
     
     python_requires
     
    +

    Variable Documentation

    + +

    ◆ author

    + +
    +
    + + + + +
    setup.author
    +
    + +
    +
    + +

    ◆ author_email

    + +
    +
    + + + + +
    setup.author_email
    +
    + +
    +
    + +

    ◆ classifiers

    + +
    +
    + + + + +
    setup.classifiers
    +
    + +
    +
    + +

    ◆ description

    + +
    +
    + + + + +
    setup.description
    +
    + +
    +
    + +

    ◆ entry_points

    + +
    +
    + + + + +
    setup.entry_points
    +
    + +
    +
    + +

    ◆ install_requires

    + +
    +
    + + + + +
    setup.install_requires
    +
    + +
    +
    + +

    ◆ long_description

    + +
    +
    + + + + +
    setup.long_description
    +
    + +
    +
    + +

    ◆ long_description_content_type

    + +
    +
    + + + + +
    setup.long_description_content_type
    +
    + +
    +
    + +

    ◆ name

    + +
    +
    + + + + +
    setup.name
    +
    + +
    +
    + +

    ◆ packages

    + +
    +
    + + + + +
    setup.packages
    +
    + +
    +
    + +

    ◆ python_requires

    + +
    +
    + + + + +
    setup.python_requires
    +
    + +
    +
    + +

    ◆ url

    + +
    +
    + + + + +
    setup.url
    +
    + +
    +
    + +

    ◆ version

    + +
    +
    + + + + +
    setup.version
    +
    + +
    +
    +
    +
    + + + + + diff --git a/docs/html/namespacetests.html b/docs/html/namespacetests.html new file mode 100644 index 0000000..fa7d8ed --- /dev/null +++ b/docs/html/namespacetests.html @@ -0,0 +1,146 @@ + + + + + + + + + + + + + + + + + + +penify-cli: tests Namespace Reference + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    penify-cli +
    +
    +
    + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    + +
    tests Namespace Reference
    +
    +
    + + + + + + + + + + + + +

    +Namespaces

    namespace  conftest
     
    namespace  test_commit_commands
     
    namespace  test_config_commands
     
    namespace  test_doc_commands
     
    namespace  test_web_config
     
    +
    +
    + + + + + diff --git a/docs/html/namespacetests.js b/docs/html/namespacetests.js new file mode 100644 index 0000000..cc880ce --- /dev/null +++ b/docs/html/namespacetests.js @@ -0,0 +1,20 @@ +var namespacetests = +[ + [ "conftest", "namespacetests_1_1conftest.html", null ], + [ "test_commit_commands", "namespacetests_1_1test__commit__commands.html", "namespacetests_1_1test__commit__commands" ], + [ "test_config_commands", "namespacetests_1_1test__config__commands.html", "namespacetests_1_1test__config__commands" ], + [ "test_doc_commands", "namespacetests_1_1test__doc__commands.html", [ + [ "test_generate_doc_error_handling", "namespacetests_1_1test__doc__commands.html#aec76cc25c23476794234cdadbcaef0c0", null ], + [ "test_generate_doc_file_location", "namespacetests_1_1test__doc__commands.html#a0e74c920f258f442914771164fe26b45", null ], + [ "test_generate_doc_folder_location", "namespacetests_1_1test__doc__commands.html#a4bb75610e40d94d42bc169b25403c186", null ], + [ "test_generate_doc_no_location", "namespacetests_1_1test__doc__commands.html#a806110833eb0aad547156faf014b31d8", null ], + [ "test_generate_doc_with_file_exception", "namespacetests_1_1test__doc__commands.html#a335e7fd4912192c7276cf31bbebc6eb0", null ], + [ "test_generate_doc_with_folder_exception", "namespacetests_1_1test__doc__commands.html#a64165ddfdb3071a88422f080f0e529a3", null ], + [ "test_handle_docgen_generate", "namespacetests_1_1test__doc__commands.html#ab158ffa48469b6c097a7a55fcb20c21a", null ], + [ "test_handle_docgen_install_hook", "namespacetests_1_1test__doc__commands.html#ab74688baa8c9b5ba302c2877a9789d05", null ], + [ "test_handle_docgen_no_token", "namespacetests_1_1test__doc__commands.html#af9b01e5fc89255cac96747fa081c442c", null ], + [ "test_handle_docgen_uninstall_hook", "namespacetests_1_1test__doc__commands.html#a1458af9ad0128c3ca1263b552fd5e482", null ], + [ "test_setup_docgen_parser", "namespacetests_1_1test__doc__commands.html#a0f27751d0ba2acfe40ef7e85bccf47d7", null ] + ] ], + [ "test_web_config", "namespacetests_1_1test__web__config.html", "namespacetests_1_1test__web__config" ] +]; \ No newline at end of file diff --git a/docs/html/namespacetests_1_1conftest.html b/docs/html/namespacetests_1_1conftest.html new file mode 100644 index 0000000..acab969 --- /dev/null +++ b/docs/html/namespacetests_1_1conftest.html @@ -0,0 +1,130 @@ + + + + + + + + + + + + + + + + + + +penify-cli: tests.conftest Namespace Reference + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    penify-cli +
    +
    +
    + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    +
    tests.conftest Namespace Reference
    +
    +
    +
    +
    + + + + + diff --git a/docs/html/namespacetests_1_1test__commit__commands.html b/docs/html/namespacetests_1_1test__commit__commands.html new file mode 100644 index 0000000..5d44bab --- /dev/null +++ b/docs/html/namespacetests_1_1test__commit__commands.html @@ -0,0 +1,138 @@ + + + + + + + + + + + + + + + + + + +penify-cli: tests.test_commit_commands Namespace Reference + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    penify-cli +
    +
    +
    + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    + +
    tests.test_commit_commands Namespace Reference
    +
    +
    + + + + +

    +Classes

    class  TestCommitCommands
     
    +
    +
    + + + + + diff --git a/docs/html/namespacetests_1_1test__commit__commands.js b/docs/html/namespacetests_1_1test__commit__commands.js new file mode 100644 index 0000000..03fd373 --- /dev/null +++ b/docs/html/namespacetests_1_1test__commit__commands.js @@ -0,0 +1,4 @@ +var namespacetests_1_1test__commit__commands = +[ + [ "TestCommitCommands", "classtests_1_1test__commit__commands_1_1TestCommitCommands.html", "classtests_1_1test__commit__commands_1_1TestCommitCommands" ] +]; \ No newline at end of file diff --git a/docs/html/namespacetests_1_1test__config__commands.html b/docs/html/namespacetests_1_1test__config__commands.html new file mode 100644 index 0000000..5e1960e --- /dev/null +++ b/docs/html/namespacetests_1_1test__config__commands.html @@ -0,0 +1,138 @@ + + + + + + + + + + + + + + + + + + +penify-cli: tests.test_config_commands Namespace Reference + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    penify-cli +
    +
    +
    + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    + +
    tests.test_config_commands Namespace Reference
    +
    +
    + + + + +

    +Classes

    class  TestConfigCommands
     
    +
    +
    + + + + + diff --git a/docs/html/namespacetests_1_1test__config__commands.js b/docs/html/namespacetests_1_1test__config__commands.js new file mode 100644 index 0000000..ae998ee --- /dev/null +++ b/docs/html/namespacetests_1_1test__config__commands.js @@ -0,0 +1,4 @@ +var namespacetests_1_1test__config__commands = +[ + [ "TestConfigCommands", "classtests_1_1test__config__commands_1_1TestConfigCommands.html", "classtests_1_1test__config__commands_1_1TestConfigCommands" ] +]; \ No newline at end of file diff --git a/docs/html/namespacetests_1_1test__doc__commands.html b/docs/html/namespacetests_1_1test__doc__commands.html new file mode 100644 index 0000000..6bad079 --- /dev/null +++ b/docs/html/namespacetests_1_1test__doc__commands.html @@ -0,0 +1,746 @@ + + + + + + + + + + + + + + + + + + +penify-cli: tests.test_doc_commands Namespace Reference + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    penify-cli +
    +
    +
    + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    + +
    tests.test_doc_commands Namespace Reference
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +

    +Functions

    def test_generate_doc_no_location (mock_getcwd, mock_api_client, mock_folder_analyzer, mock_file_analyzer, mock_git_analyzer)
     
    def test_generate_doc_file_location (mock_api_client, mock_folder_analyzer, mock_file_analyzer, mock_git_analyzer)
     
    def test_generate_doc_folder_location (mock_api_client, mock_folder_analyzer, mock_file_analyzer, mock_git_analyzer)
     
    def test_generate_doc_error_handling (mock_api_client, mock_git_analyzer, mock_exit)
     
    def test_setup_docgen_parser ()
     
    def test_handle_docgen_install_hook (mock_exit, mock_get_token, mock_generate_doc, mock_uninstall_hook, mock_install_hook)
     
    def test_handle_docgen_uninstall_hook (mock_exit, mock_get_token, mock_generate_doc, mock_uninstall_hook, mock_install_hook)
     
    def test_handle_docgen_generate (mock_get_token, mock_generate_doc, mock_uninstall_hook, mock_install_hook)
     
    def test_handle_docgen_no_token (mock_exit, mock_get_token)
     
    def test_generate_doc_with_file_exception (mock_api_client, mock_getcwd)
     
    def test_generate_doc_with_folder_exception (mock_api_client, mock_getcwd)
     
    +

    Function Documentation

    + +

    ◆ test_generate_doc_error_handling()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    def tests.test_doc_commands.test_generate_doc_error_handling ( mock_api_client,
     mock_git_analyzer,
     mock_exit 
    )
    +
    +
    Generate a documentation string for the provided code snippet using
    +Google Docstring style.
    +
    +Short one line description: Test function to ensure proper error
    +handling during API calls with GitAnalyzer.  Multiline long description:
    +This test function is designed to verify that the generate_doc function
    +handles exceptions correctly when an error occurs during API interaction
    +with GitAnalyzer. It sets up a mock API client and a mock Git analyzer,
    +causing the analyzer to raise an exception to simulate a failure
    +condition. The function then asserts that the exit code is set to 1 when
    +the error handling mechanism is invoked.
    +
    +Args:
    +    mock_api_client (MagicMock): A mock object simulating the API client.
    +    mock_git_analyzer (MagicMock): A mock object simulating the Git analyzer, configured to raise an
    +        exception.
    +    mock_exit (MagicMock): A mock object representing the exit function, which should be called
    +        with an error code.
    +
    +Here is the call graph for this function:
    +
    +
    +
    +
    + +
    +
    + +

    ◆ test_generate_doc_file_location()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    def tests.test_doc_commands.test_generate_doc_file_location ( mock_api_client,
     mock_folder_analyzer,
     mock_file_analyzer,
     mock_git_analyzer 
    )
    +
    +
    Test generating a documentation file location.
    +
    +This function tests the process of generating a documentation file
    +location using mock objects for API client, folder analyzer, file
    +analyzer, and Git analyzer. It sets up the necessary mocks, calls the
    +`generate_doc` function with specified parameters, and asserts that the
    +appropriate methods on the mock objects are called as expected.
    +
    +Args:
    +    mock_api_client (MagicMock): Mock object for the API client.
    +    mock_folder_analyzer (MagicMock): Mock object for the folder analyzer.
    +    mock_file_analyzer (MagicMock): Mock object for the file analyzer.
    +    mock_git_analyzer (MagicMock): Mock object for the Git analyzer.
    +
    +Here is the call graph for this function:
    +
    +
    +
    +
    + +
    +
    + +

    ◆ test_generate_doc_folder_location()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    def tests.test_doc_commands.test_generate_doc_folder_location ( mock_api_client,
     mock_folder_analyzer,
     mock_file_analyzer,
     mock_git_analyzer 
    )
    +
    +
    Test the function to generate documentation for a folder location.
    +
    +It sets up mock objects for API client, folder analyzer, file analyzer,
    +and Git analyzer, then calls the `generate_doc` function with specified
    +parameters. Finally, it asserts that the correct methods on the mock
    +objects were called as expected.
    +
    +Args:
    +    mock_api_client (MagicMock): Mock object for the API client.
    +    mock_folder_analyzer (MagicMock): Mock object for the folder analyzer.
    +    mock_file_analyzer (MagicMock): Mock object for the file analyzer.
    +    mock_git_analyzer (MagicMock): Mock object for the Git analyzer.
    +
    +Here is the call graph for this function:
    +
    +
    +
    +
    + +
    +
    + +

    ◆ test_generate_doc_no_location()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    def tests.test_doc_commands.test_generate_doc_no_location ( mock_getcwd,
     mock_api_client,
     mock_folder_analyzer,
     mock_file_analyzer,
     mock_git_analyzer 
    )
    +
    +
    Test function to generate documentation without location information.
    +
    +This function sets up mocks for the API client, current working
    +directory, and Git analyzer. It then calls the `generate_doc` function
    +with a fake API URL and token. The function is expected to initialize
    +the API client, configure the Git analyzer, and run it without any
    +location information.
    +
    +Args:
    +    mock_getcwd (MagicMock): Mock for os.getcwd().
    +    mock_api_client (MagicMock): Mock for creating an API client.
    +    mock_folder_analyzer (MagicMock): Mock for folder analysis.
    +    mock_file_analyzer (MagicMock): Mock for file analysis.
    +    mock_git_analyzer (MagicMock): Mock for Git analyzer setup.
    +
    +Here is the call graph for this function:
    +
    +
    +
    +
    + +
    +
    + +

    ◆ test_generate_doc_with_file_exception()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    def tests.test_doc_commands.test_generate_doc_with_file_exception ( mock_api_client,
     mock_getcwd 
    )
    +
    +
    Generate documentation from a Python source file.
    +
    +This function reads a Python file and generates a docstring based on its
    +content. It uses mock objects to simulate API calls and directory
    +operations during testing.
    +
    +Args:
    +    mock_api_client (unittest.mock.MagicMock): A mock object for simulating API client behavior.
    +    mock_getcwd (unittest.mock.MagicMock): A mock object for simulating the current working directory function.
    +
    +Here is the call graph for this function:
    +
    +
    +
    +
    + +
    +
    + +

    ◆ test_generate_doc_with_folder_exception()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    def tests.test_doc_commands.test_generate_doc_with_folder_exception ( mock_api_client,
     mock_getcwd 
    )
    +
    +
    Generate documentation from a given API endpoint and save it to a
    +folder.
    +
    +This function fetches data from the specified API endpoint, processes
    +it, and saves the generated documentation in the provided folder. If an
    +error occurs during the fetching process, a SystemExit exception is
    +raised with an appropriate message.
    +
    +Args:
    +    api_url (str): The URL of the API endpoint from which data will be fetched.
    +    token (str): The authentication token required to access the API.
    +    folder_path (str): The path to the folder where the documentation will be saved.
    +
    +Here is the call graph for this function:
    +
    +
    +
    +
    + +
    +
    + +

    ◆ test_handle_docgen_generate()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    def tests.test_doc_commands.test_handle_docgen_generate ( mock_get_token,
     mock_generate_doc,
     mock_uninstall_hook,
     mock_install_hook 
    )
    +
    +
    Test the direct documentation generation functionality.
    +
    +This function tests the `handle_docgen` function when no subcommand is
    +provided. It verifies that the document generation hook is called and
    +the uninstall and install hooks are not called.
    +
    +Args:
    +    mock_get_token (MagicMock): Mocked function to get authentication token.
    +    mock_generate_doc (MagicMock): Mocked function for generating documentation.
    +    mock_uninstall_hook (MagicMock): Mocked function for uninstalling the document generation hook.
    +    mock_install_hook (MagicMock): Mocked function for installing the document generation hook.
    +
    +Here is the call graph for this function:
    +
    +
    +
    +
    + +
    +
    + +

    ◆ test_handle_docgen_install_hook()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    def tests.test_doc_commands.test_handle_docgen_install_hook ( mock_exit,
     mock_get_token,
     mock_generate_doc,
     mock_uninstall_hook,
     mock_install_hook 
    )
    +
    +
    Test the handling of the 'install-hook' subcommand.
    +
    +This function sets up a mock environment where it simulates the
    +execution of the 'install-hook' subcommand. It verifies that the
    +`mock_install_hook` is called with the correct arguments, while
    +`mock_generate_doc` and `mock_uninstall_hook` are not called.
    +
    +Args:
    +    mock_exit (MagicMock): Mock object for sys.exit.
    +    mock_get_token (MagicMock): Mock object to simulate fetching a token.
    +    mock_generate_doc (MagicMock): Mock object to simulate generating documentation.
    +    mock_uninstall_hook (MagicMock): Mock object to simulate uninstalling a hook.
    +    mock_install_hook (MagicMock): Mock object to simulate installing a hook.
    +
    +Here is the call graph for this function:
    +
    +
    +
    +
    + +
    +
    + +

    ◆ test_handle_docgen_no_token()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    def tests.test_doc_commands.test_handle_docgen_no_token ( mock_exit,
     mock_get_token 
    )
    +
    +
    Test the behavior of the `handle_docgen` function when no token is
    +provided.
    +
    +This function asserts that if no token is returned by `mock_get_token`,
    +the `handle_docgen` function will call `mock_exit` with a status code of
    +1.
    +
    +Args:
    +    mock_exit (MagicMock): A MagicMock object simulating the `exit` function.
    +    mock_get_token (MagicMock): A MagicMock object simulating the `get_token` function.
    +
    +Here is the call graph for this function:
    +
    +
    +
    +
    + +
    +
    + +

    ◆ test_handle_docgen_uninstall_hook()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    def tests.test_doc_commands.test_handle_docgen_uninstall_hook ( mock_exit,
     mock_get_token,
     mock_generate_doc,
     mock_uninstall_hook,
     mock_install_hook 
    )
    +
    +
    Test the uninstall-hook subcommand of the handle_docgen function.
    +This test case sets up a mock environment and verifies that the
    +uninstall-hook is called with the correct location, while generate_doc
    +and install_hook are not called.
    +
    +Args:
    +    mock_exit (MagicMock): A mock for the exit function.
    +    mock_get_token (MagicMock): A mock for the get_token function.
    +    mock_generate_doc (MagicMock): A mock for the generate_doc function.
    +    mock_uninstall_hook (MagicMock): A mock for the uninstall_hook function.
    +    mock_install_hook (MagicMock): A mock for the install_hook function.
    +
    +Here is the call graph for this function:
    +
    +
    +
    +
    + +
    +
    + +

    ◆ test_setup_docgen_parser()

    + +
    +
    + + + + + + + +
    def tests.test_doc_commands.test_setup_docgen_parser ()
    +
    +
    Test the setup_docgen_parser function to ensure it properly configures
    +the ArgumentParser for docgen options.
    +
    +It verifies that the parser correctly sets up docgen options and handles
    +different subcommands like 'install-hook' and 'uninstall-hook'.
    +
    +Here is the call graph for this function:
    +
    +
    +
    +
    + +
    +
    +
    +
    + + + + + diff --git a/docs/html/namespacetests_1_1test__doc__commands_a0e74c920f258f442914771164fe26b45_cgraph.map b/docs/html/namespacetests_1_1test__doc__commands_a0e74c920f258f442914771164fe26b45_cgraph.map new file mode 100644 index 0000000..f0f54c3 --- /dev/null +++ b/docs/html/namespacetests_1_1test__doc__commands_a0e74c920f258f442914771164fe26b45_cgraph.map @@ -0,0 +1,4 @@ + + + + diff --git a/docs/html/namespacetests_1_1test__doc__commands_a0e74c920f258f442914771164fe26b45_cgraph.md5 b/docs/html/namespacetests_1_1test__doc__commands_a0e74c920f258f442914771164fe26b45_cgraph.md5 new file mode 100644 index 0000000..b280dc5 --- /dev/null +++ b/docs/html/namespacetests_1_1test__doc__commands_a0e74c920f258f442914771164fe26b45_cgraph.md5 @@ -0,0 +1 @@ +28c17f21f2a2a250d23b14c68e3e5d3a \ No newline at end of file diff --git a/docs/html/namespacetests_1_1test__doc__commands_a0e74c920f258f442914771164fe26b45_cgraph.svg b/docs/html/namespacetests_1_1test__doc__commands_a0e74c920f258f442914771164fe26b45_cgraph.svg new file mode 100644 index 0000000..c482b86 --- /dev/null +++ b/docs/html/namespacetests_1_1test__doc__commands_a0e74c920f258f442914771164fe26b45_cgraph.svg @@ -0,0 +1,39 @@ + + + + + + +tests.test_doc_commands.test_generate_doc_file_location + + + +Node1 + + +tests.test_doc_commands.test +_generate_doc_file_location + + + + + +Node2 + + +penify_hook.commands.doc +_commands.generate_doc + + + + + +Node1->Node2 + + + + + diff --git a/docs/html/namespacetests_1_1test__doc__commands_a0f27751d0ba2acfe40ef7e85bccf47d7_cgraph.map b/docs/html/namespacetests_1_1test__doc__commands_a0f27751d0ba2acfe40ef7e85bccf47d7_cgraph.map new file mode 100644 index 0000000..a8ff77b --- /dev/null +++ b/docs/html/namespacetests_1_1test__doc__commands_a0f27751d0ba2acfe40ef7e85bccf47d7_cgraph.map @@ -0,0 +1,4 @@ + + + + diff --git a/docs/html/namespacetests_1_1test__doc__commands_a0f27751d0ba2acfe40ef7e85bccf47d7_cgraph.md5 b/docs/html/namespacetests_1_1test__doc__commands_a0f27751d0ba2acfe40ef7e85bccf47d7_cgraph.md5 new file mode 100644 index 0000000..53e2e0a --- /dev/null +++ b/docs/html/namespacetests_1_1test__doc__commands_a0f27751d0ba2acfe40ef7e85bccf47d7_cgraph.md5 @@ -0,0 +1 @@ +192fbe5412db3710d1849692c54ac106 \ No newline at end of file diff --git a/docs/html/namespacetests_1_1test__doc__commands_a0f27751d0ba2acfe40ef7e85bccf47d7_cgraph.svg b/docs/html/namespacetests_1_1test__doc__commands_a0f27751d0ba2acfe40ef7e85bccf47d7_cgraph.svg new file mode 100644 index 0000000..6ca2ff2 --- /dev/null +++ b/docs/html/namespacetests_1_1test__doc__commands_a0f27751d0ba2acfe40ef7e85bccf47d7_cgraph.svg @@ -0,0 +1,39 @@ + + + + + + +tests.test_doc_commands.test_setup_docgen_parser + + + +Node1 + + +tests.test_doc_commands.test +_setup_docgen_parser + + + + + +Node2 + + +penify_hook.commands.doc +_commands.setup_docgen_parser + + + + + +Node1->Node2 + + + + + diff --git a/docs/html/namespacetests_1_1test__doc__commands_a1458af9ad0128c3ca1263b552fd5e482_cgraph.map b/docs/html/namespacetests_1_1test__doc__commands_a1458af9ad0128c3ca1263b552fd5e482_cgraph.map new file mode 100644 index 0000000..b5bbb57 --- /dev/null +++ b/docs/html/namespacetests_1_1test__doc__commands_a1458af9ad0128c3ca1263b552fd5e482_cgraph.map @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/docs/html/namespacetests_1_1test__doc__commands_a1458af9ad0128c3ca1263b552fd5e482_cgraph.md5 b/docs/html/namespacetests_1_1test__doc__commands_a1458af9ad0128c3ca1263b552fd5e482_cgraph.md5 new file mode 100644 index 0000000..300f399 --- /dev/null +++ b/docs/html/namespacetests_1_1test__doc__commands_a1458af9ad0128c3ca1263b552fd5e482_cgraph.md5 @@ -0,0 +1 @@ +aef759552fc6cc4d80899b0b13739a5e \ No newline at end of file diff --git a/docs/html/namespacetests_1_1test__doc__commands_a1458af9ad0128c3ca1263b552fd5e482_cgraph.svg b/docs/html/namespacetests_1_1test__doc__commands_a1458af9ad0128c3ca1263b552fd5e482_cgraph.svg new file mode 100644 index 0000000..94a320e --- /dev/null +++ b/docs/html/namespacetests_1_1test__doc__commands_a1458af9ad0128c3ca1263b552fd5e482_cgraph.svg @@ -0,0 +1,274 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +tests.test_doc_commands.test_handle_docgen_uninstall_hook + + + +Node1 + + +tests.test_doc_commands.test +_handle_docgen_uninstall_hook + + + + + +Node2 + + +penify_hook.commands.doc +_commands.handle_docgen + + + + + +Node1->Node2 + + + + + +Node3 + + +penify_hook.commands.doc +_commands.generate_doc + + + + + +Node2->Node3 + + + + + +Node4 + + +penify_hook.commands.config +_commands.get_token + + + + + +Node2->Node4 + + + + + +Node9 + + +penify_hook.commands.hook +_commands.install_git_hook + + + + + +Node2->Node9 + + + + + +Node10 + + +penify_hook.commands.hook +_commands.uninstall_git_hook + + + + + +Node2->Node10 + + + + + +Node5 + + +penify_hook.commands.config +_commands.get_env_var_or +_default + + + + + +Node4->Node5 + + + + + +Node6 + + +penify_hook.commands.config +_commands.get_penify_config + + + + + +Node4->Node6 + + + + + +Node8 + + +penify_hook.commands.config +_commands.load_env_files + + + + + +Node4->Node8 + + + + + +Node7 + + +penify_hook.utils.recursive +_search_git_folder + + + + + +Node6->Node7 + + + + + +Node7->Node7 + + + + + +Node8->Node7 + + + + + +Node8->Node8 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/html/namespacetests_1_1test__doc__commands_a1458af9ad0128c3ca1263b552fd5e482_cgraph_org.svg b/docs/html/namespacetests_1_1test__doc__commands_a1458af9ad0128c3ca1263b552fd5e482_cgraph_org.svg new file mode 100644 index 0000000..fd67a25 --- /dev/null +++ b/docs/html/namespacetests_1_1test__doc__commands_a1458af9ad0128c3ca1263b552fd5e482_cgraph_org.svg @@ -0,0 +1,186 @@ + + + + + + +tests.test_doc_commands.test_handle_docgen_uninstall_hook + + + +Node1 + + +tests.test_doc_commands.test +_handle_docgen_uninstall_hook + + + + + +Node2 + + +penify_hook.commands.doc +_commands.handle_docgen + + + + + +Node1->Node2 + + + + + +Node3 + + +penify_hook.commands.doc +_commands.generate_doc + + + + + +Node2->Node3 + + + + + +Node4 + + +penify_hook.commands.config +_commands.get_token + + + + + +Node2->Node4 + + + + + +Node9 + + +penify_hook.commands.hook +_commands.install_git_hook + + + + + +Node2->Node9 + + + + + +Node10 + + +penify_hook.commands.hook +_commands.uninstall_git_hook + + + + + +Node2->Node10 + + + + + +Node5 + + +penify_hook.commands.config +_commands.get_env_var_or +_default + + + + + +Node4->Node5 + + + + + +Node6 + + +penify_hook.commands.config +_commands.get_penify_config + + + + + +Node4->Node6 + + + + + +Node8 + + +penify_hook.commands.config +_commands.load_env_files + + + + + +Node4->Node8 + + + + + +Node7 + + +penify_hook.utils.recursive +_search_git_folder + + + + + +Node6->Node7 + + + + + +Node7->Node7 + + + + + +Node8->Node7 + + + + + +Node8->Node8 + + + + + diff --git a/docs/html/namespacetests_1_1test__doc__commands_a335e7fd4912192c7276cf31bbebc6eb0_cgraph.map b/docs/html/namespacetests_1_1test__doc__commands_a335e7fd4912192c7276cf31bbebc6eb0_cgraph.map new file mode 100644 index 0000000..f220740 --- /dev/null +++ b/docs/html/namespacetests_1_1test__doc__commands_a335e7fd4912192c7276cf31bbebc6eb0_cgraph.map @@ -0,0 +1,4 @@ + + + + diff --git a/docs/html/namespacetests_1_1test__doc__commands_a335e7fd4912192c7276cf31bbebc6eb0_cgraph.md5 b/docs/html/namespacetests_1_1test__doc__commands_a335e7fd4912192c7276cf31bbebc6eb0_cgraph.md5 new file mode 100644 index 0000000..ef64a42 --- /dev/null +++ b/docs/html/namespacetests_1_1test__doc__commands_a335e7fd4912192c7276cf31bbebc6eb0_cgraph.md5 @@ -0,0 +1 @@ +10d76966ac7089e8706fb1aec3e4f9d6 \ No newline at end of file diff --git a/docs/html/namespacetests_1_1test__doc__commands_a335e7fd4912192c7276cf31bbebc6eb0_cgraph.svg b/docs/html/namespacetests_1_1test__doc__commands_a335e7fd4912192c7276cf31bbebc6eb0_cgraph.svg new file mode 100644 index 0000000..b369e3b --- /dev/null +++ b/docs/html/namespacetests_1_1test__doc__commands_a335e7fd4912192c7276cf31bbebc6eb0_cgraph.svg @@ -0,0 +1,39 @@ + + + + + + +tests.test_doc_commands.test_generate_doc_with_file_exception + + + +Node1 + + +tests.test_doc_commands.test +_generate_doc_with_file_exception + + + + + +Node2 + + +penify_hook.commands.doc +_commands.generate_doc + + + + + +Node1->Node2 + + + + + diff --git a/docs/html/namespacetests_1_1test__doc__commands_a4bb75610e40d94d42bc169b25403c186_cgraph.map b/docs/html/namespacetests_1_1test__doc__commands_a4bb75610e40d94d42bc169b25403c186_cgraph.map new file mode 100644 index 0000000..1cee3ef --- /dev/null +++ b/docs/html/namespacetests_1_1test__doc__commands_a4bb75610e40d94d42bc169b25403c186_cgraph.map @@ -0,0 +1,4 @@ + + + + diff --git a/docs/html/namespacetests_1_1test__doc__commands_a4bb75610e40d94d42bc169b25403c186_cgraph.md5 b/docs/html/namespacetests_1_1test__doc__commands_a4bb75610e40d94d42bc169b25403c186_cgraph.md5 new file mode 100644 index 0000000..076630a --- /dev/null +++ b/docs/html/namespacetests_1_1test__doc__commands_a4bb75610e40d94d42bc169b25403c186_cgraph.md5 @@ -0,0 +1 @@ +064f1a8c9470887507dea5cf5dd184eb \ No newline at end of file diff --git a/docs/html/namespacetests_1_1test__doc__commands_a4bb75610e40d94d42bc169b25403c186_cgraph.svg b/docs/html/namespacetests_1_1test__doc__commands_a4bb75610e40d94d42bc169b25403c186_cgraph.svg new file mode 100644 index 0000000..d9f33f9 --- /dev/null +++ b/docs/html/namespacetests_1_1test__doc__commands_a4bb75610e40d94d42bc169b25403c186_cgraph.svg @@ -0,0 +1,39 @@ + + + + + + +tests.test_doc_commands.test_generate_doc_folder_location + + + +Node1 + + +tests.test_doc_commands.test +_generate_doc_folder_location + + + + + +Node2 + + +penify_hook.commands.doc +_commands.generate_doc + + + + + +Node1->Node2 + + + + + diff --git a/docs/html/namespacetests_1_1test__doc__commands_a64165ddfdb3071a88422f080f0e529a3_cgraph.map b/docs/html/namespacetests_1_1test__doc__commands_a64165ddfdb3071a88422f080f0e529a3_cgraph.map new file mode 100644 index 0000000..6505473 --- /dev/null +++ b/docs/html/namespacetests_1_1test__doc__commands_a64165ddfdb3071a88422f080f0e529a3_cgraph.map @@ -0,0 +1,4 @@ + + + + diff --git a/docs/html/namespacetests_1_1test__doc__commands_a64165ddfdb3071a88422f080f0e529a3_cgraph.md5 b/docs/html/namespacetests_1_1test__doc__commands_a64165ddfdb3071a88422f080f0e529a3_cgraph.md5 new file mode 100644 index 0000000..314f15d --- /dev/null +++ b/docs/html/namespacetests_1_1test__doc__commands_a64165ddfdb3071a88422f080f0e529a3_cgraph.md5 @@ -0,0 +1 @@ +e42b926dad2f0ff5205af415d972f1da \ No newline at end of file diff --git a/docs/html/namespacetests_1_1test__doc__commands_a64165ddfdb3071a88422f080f0e529a3_cgraph.svg b/docs/html/namespacetests_1_1test__doc__commands_a64165ddfdb3071a88422f080f0e529a3_cgraph.svg new file mode 100644 index 0000000..f231670 --- /dev/null +++ b/docs/html/namespacetests_1_1test__doc__commands_a64165ddfdb3071a88422f080f0e529a3_cgraph.svg @@ -0,0 +1,40 @@ + + + + + + +tests.test_doc_commands.test_generate_doc_with_folder_exception + + + +Node1 + + +tests.test_doc_commands.test +_generate_doc_with_folder +_exception + + + + + +Node2 + + +penify_hook.commands.doc +_commands.generate_doc + + + + + +Node1->Node2 + + + + + diff --git a/docs/html/namespacetests_1_1test__doc__commands_a806110833eb0aad547156faf014b31d8_cgraph.map b/docs/html/namespacetests_1_1test__doc__commands_a806110833eb0aad547156faf014b31d8_cgraph.map new file mode 100644 index 0000000..73c8b64 --- /dev/null +++ b/docs/html/namespacetests_1_1test__doc__commands_a806110833eb0aad547156faf014b31d8_cgraph.map @@ -0,0 +1,4 @@ + + + + diff --git a/docs/html/namespacetests_1_1test__doc__commands_a806110833eb0aad547156faf014b31d8_cgraph.md5 b/docs/html/namespacetests_1_1test__doc__commands_a806110833eb0aad547156faf014b31d8_cgraph.md5 new file mode 100644 index 0000000..99c08a9 --- /dev/null +++ b/docs/html/namespacetests_1_1test__doc__commands_a806110833eb0aad547156faf014b31d8_cgraph.md5 @@ -0,0 +1 @@ +d4d1f9d92eb42ae249ce3409ab7627ac \ No newline at end of file diff --git a/docs/html/namespacetests_1_1test__doc__commands_a806110833eb0aad547156faf014b31d8_cgraph.svg b/docs/html/namespacetests_1_1test__doc__commands_a806110833eb0aad547156faf014b31d8_cgraph.svg new file mode 100644 index 0000000..0ee0fcd --- /dev/null +++ b/docs/html/namespacetests_1_1test__doc__commands_a806110833eb0aad547156faf014b31d8_cgraph.svg @@ -0,0 +1,39 @@ + + + + + + +tests.test_doc_commands.test_generate_doc_no_location + + + +Node1 + + +tests.test_doc_commands.test +_generate_doc_no_location + + + + + +Node2 + + +penify_hook.commands.doc +_commands.generate_doc + + + + + +Node1->Node2 + + + + + diff --git a/docs/html/namespacetests_1_1test__doc__commands_ab158ffa48469b6c097a7a55fcb20c21a_cgraph.map b/docs/html/namespacetests_1_1test__doc__commands_ab158ffa48469b6c097a7a55fcb20c21a_cgraph.map new file mode 100644 index 0000000..86fe3ea --- /dev/null +++ b/docs/html/namespacetests_1_1test__doc__commands_ab158ffa48469b6c097a7a55fcb20c21a_cgraph.map @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/docs/html/namespacetests_1_1test__doc__commands_ab158ffa48469b6c097a7a55fcb20c21a_cgraph.md5 b/docs/html/namespacetests_1_1test__doc__commands_ab158ffa48469b6c097a7a55fcb20c21a_cgraph.md5 new file mode 100644 index 0000000..28ac74a --- /dev/null +++ b/docs/html/namespacetests_1_1test__doc__commands_ab158ffa48469b6c097a7a55fcb20c21a_cgraph.md5 @@ -0,0 +1 @@ +810237d2c8640fcab5bd4448f12a9692 \ No newline at end of file diff --git a/docs/html/namespacetests_1_1test__doc__commands_ab158ffa48469b6c097a7a55fcb20c21a_cgraph.svg b/docs/html/namespacetests_1_1test__doc__commands_ab158ffa48469b6c097a7a55fcb20c21a_cgraph.svg new file mode 100644 index 0000000..ae76a88 --- /dev/null +++ b/docs/html/namespacetests_1_1test__doc__commands_ab158ffa48469b6c097a7a55fcb20c21a_cgraph.svg @@ -0,0 +1,274 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +tests.test_doc_commands.test_handle_docgen_generate + + + +Node1 + + +tests.test_doc_commands.test +_handle_docgen_generate + + + + + +Node2 + + +penify_hook.commands.doc +_commands.handle_docgen + + + + + +Node1->Node2 + + + + + +Node3 + + +penify_hook.commands.doc +_commands.generate_doc + + + + + +Node2->Node3 + + + + + +Node4 + + +penify_hook.commands.config +_commands.get_token + + + + + +Node2->Node4 + + + + + +Node9 + + +penify_hook.commands.hook +_commands.install_git_hook + + + + + +Node2->Node9 + + + + + +Node10 + + +penify_hook.commands.hook +_commands.uninstall_git_hook + + + + + +Node2->Node10 + + + + + +Node5 + + +penify_hook.commands.config +_commands.get_env_var_or +_default + + + + + +Node4->Node5 + + + + + +Node6 + + +penify_hook.commands.config +_commands.get_penify_config + + + + + +Node4->Node6 + + + + + +Node8 + + +penify_hook.commands.config +_commands.load_env_files + + + + + +Node4->Node8 + + + + + +Node7 + + +penify_hook.utils.recursive +_search_git_folder + + + + + +Node6->Node7 + + + + + +Node7->Node7 + + + + + +Node8->Node7 + + + + + +Node8->Node8 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/html/namespacetests_1_1test__doc__commands_ab158ffa48469b6c097a7a55fcb20c21a_cgraph_org.svg b/docs/html/namespacetests_1_1test__doc__commands_ab158ffa48469b6c097a7a55fcb20c21a_cgraph_org.svg new file mode 100644 index 0000000..408dbc3 --- /dev/null +++ b/docs/html/namespacetests_1_1test__doc__commands_ab158ffa48469b6c097a7a55fcb20c21a_cgraph_org.svg @@ -0,0 +1,186 @@ + + + + + + +tests.test_doc_commands.test_handle_docgen_generate + + + +Node1 + + +tests.test_doc_commands.test +_handle_docgen_generate + + + + + +Node2 + + +penify_hook.commands.doc +_commands.handle_docgen + + + + + +Node1->Node2 + + + + + +Node3 + + +penify_hook.commands.doc +_commands.generate_doc + + + + + +Node2->Node3 + + + + + +Node4 + + +penify_hook.commands.config +_commands.get_token + + + + + +Node2->Node4 + + + + + +Node9 + + +penify_hook.commands.hook +_commands.install_git_hook + + + + + +Node2->Node9 + + + + + +Node10 + + +penify_hook.commands.hook +_commands.uninstall_git_hook + + + + + +Node2->Node10 + + + + + +Node5 + + +penify_hook.commands.config +_commands.get_env_var_or +_default + + + + + +Node4->Node5 + + + + + +Node6 + + +penify_hook.commands.config +_commands.get_penify_config + + + + + +Node4->Node6 + + + + + +Node8 + + +penify_hook.commands.config +_commands.load_env_files + + + + + +Node4->Node8 + + + + + +Node7 + + +penify_hook.utils.recursive +_search_git_folder + + + + + +Node6->Node7 + + + + + +Node7->Node7 + + + + + +Node8->Node7 + + + + + +Node8->Node8 + + + + + diff --git a/docs/html/namespacetests_1_1test__doc__commands_ab74688baa8c9b5ba302c2877a9789d05_cgraph.map b/docs/html/namespacetests_1_1test__doc__commands_ab74688baa8c9b5ba302c2877a9789d05_cgraph.map new file mode 100644 index 0000000..97c848c --- /dev/null +++ b/docs/html/namespacetests_1_1test__doc__commands_ab74688baa8c9b5ba302c2877a9789d05_cgraph.map @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/docs/html/namespacetests_1_1test__doc__commands_ab74688baa8c9b5ba302c2877a9789d05_cgraph.md5 b/docs/html/namespacetests_1_1test__doc__commands_ab74688baa8c9b5ba302c2877a9789d05_cgraph.md5 new file mode 100644 index 0000000..56e1467 --- /dev/null +++ b/docs/html/namespacetests_1_1test__doc__commands_ab74688baa8c9b5ba302c2877a9789d05_cgraph.md5 @@ -0,0 +1 @@ +dc60bba75d6f8dafbd4701e4ac271385 \ No newline at end of file diff --git a/docs/html/namespacetests_1_1test__doc__commands_ab74688baa8c9b5ba302c2877a9789d05_cgraph.svg b/docs/html/namespacetests_1_1test__doc__commands_ab74688baa8c9b5ba302c2877a9789d05_cgraph.svg new file mode 100644 index 0000000..927f757 --- /dev/null +++ b/docs/html/namespacetests_1_1test__doc__commands_ab74688baa8c9b5ba302c2877a9789d05_cgraph.svg @@ -0,0 +1,274 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +tests.test_doc_commands.test_handle_docgen_install_hook + + + +Node1 + + +tests.test_doc_commands.test +_handle_docgen_install_hook + + + + + +Node2 + + +penify_hook.commands.doc +_commands.handle_docgen + + + + + +Node1->Node2 + + + + + +Node3 + + +penify_hook.commands.doc +_commands.generate_doc + + + + + +Node2->Node3 + + + + + +Node4 + + +penify_hook.commands.config +_commands.get_token + + + + + +Node2->Node4 + + + + + +Node9 + + +penify_hook.commands.hook +_commands.install_git_hook + + + + + +Node2->Node9 + + + + + +Node10 + + +penify_hook.commands.hook +_commands.uninstall_git_hook + + + + + +Node2->Node10 + + + + + +Node5 + + +penify_hook.commands.config +_commands.get_env_var_or +_default + + + + + +Node4->Node5 + + + + + +Node6 + + +penify_hook.commands.config +_commands.get_penify_config + + + + + +Node4->Node6 + + + + + +Node8 + + +penify_hook.commands.config +_commands.load_env_files + + + + + +Node4->Node8 + + + + + +Node7 + + +penify_hook.utils.recursive +_search_git_folder + + + + + +Node6->Node7 + + + + + +Node7->Node7 + + + + + +Node8->Node7 + + + + + +Node8->Node8 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/html/namespacetests_1_1test__doc__commands_ab74688baa8c9b5ba302c2877a9789d05_cgraph_org.svg b/docs/html/namespacetests_1_1test__doc__commands_ab74688baa8c9b5ba302c2877a9789d05_cgraph_org.svg new file mode 100644 index 0000000..0258a01 --- /dev/null +++ b/docs/html/namespacetests_1_1test__doc__commands_ab74688baa8c9b5ba302c2877a9789d05_cgraph_org.svg @@ -0,0 +1,186 @@ + + + + + + +tests.test_doc_commands.test_handle_docgen_install_hook + + + +Node1 + + +tests.test_doc_commands.test +_handle_docgen_install_hook + + + + + +Node2 + + +penify_hook.commands.doc +_commands.handle_docgen + + + + + +Node1->Node2 + + + + + +Node3 + + +penify_hook.commands.doc +_commands.generate_doc + + + + + +Node2->Node3 + + + + + +Node4 + + +penify_hook.commands.config +_commands.get_token + + + + + +Node2->Node4 + + + + + +Node9 + + +penify_hook.commands.hook +_commands.install_git_hook + + + + + +Node2->Node9 + + + + + +Node10 + + +penify_hook.commands.hook +_commands.uninstall_git_hook + + + + + +Node2->Node10 + + + + + +Node5 + + +penify_hook.commands.config +_commands.get_env_var_or +_default + + + + + +Node4->Node5 + + + + + +Node6 + + +penify_hook.commands.config +_commands.get_penify_config + + + + + +Node4->Node6 + + + + + +Node8 + + +penify_hook.commands.config +_commands.load_env_files + + + + + +Node4->Node8 + + + + + +Node7 + + +penify_hook.utils.recursive +_search_git_folder + + + + + +Node6->Node7 + + + + + +Node7->Node7 + + + + + +Node8->Node7 + + + + + +Node8->Node8 + + + + + diff --git a/docs/html/namespacetests_1_1test__doc__commands_aec76cc25c23476794234cdadbcaef0c0_cgraph.map b/docs/html/namespacetests_1_1test__doc__commands_aec76cc25c23476794234cdadbcaef0c0_cgraph.map new file mode 100644 index 0000000..1b841f4 --- /dev/null +++ b/docs/html/namespacetests_1_1test__doc__commands_aec76cc25c23476794234cdadbcaef0c0_cgraph.map @@ -0,0 +1,4 @@ + + + + diff --git a/docs/html/namespacetests_1_1test__doc__commands_aec76cc25c23476794234cdadbcaef0c0_cgraph.md5 b/docs/html/namespacetests_1_1test__doc__commands_aec76cc25c23476794234cdadbcaef0c0_cgraph.md5 new file mode 100644 index 0000000..ef9f04c --- /dev/null +++ b/docs/html/namespacetests_1_1test__doc__commands_aec76cc25c23476794234cdadbcaef0c0_cgraph.md5 @@ -0,0 +1 @@ +7930a342103b95a29b43ca93e1212cff \ No newline at end of file diff --git a/docs/html/namespacetests_1_1test__doc__commands_aec76cc25c23476794234cdadbcaef0c0_cgraph.svg b/docs/html/namespacetests_1_1test__doc__commands_aec76cc25c23476794234cdadbcaef0c0_cgraph.svg new file mode 100644 index 0000000..9768a7e --- /dev/null +++ b/docs/html/namespacetests_1_1test__doc__commands_aec76cc25c23476794234cdadbcaef0c0_cgraph.svg @@ -0,0 +1,39 @@ + + + + + + +tests.test_doc_commands.test_generate_doc_error_handling + + + +Node1 + + +tests.test_doc_commands.test +_generate_doc_error_handling + + + + + +Node2 + + +penify_hook.commands.doc +_commands.generate_doc + + + + + +Node1->Node2 + + + + + diff --git a/docs/html/namespacetests_1_1test__doc__commands_af9b01e5fc89255cac96747fa081c442c_cgraph.map b/docs/html/namespacetests_1_1test__doc__commands_af9b01e5fc89255cac96747fa081c442c_cgraph.map new file mode 100644 index 0000000..6b196ac --- /dev/null +++ b/docs/html/namespacetests_1_1test__doc__commands_af9b01e5fc89255cac96747fa081c442c_cgraph.map @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/docs/html/namespacetests_1_1test__doc__commands_af9b01e5fc89255cac96747fa081c442c_cgraph.md5 b/docs/html/namespacetests_1_1test__doc__commands_af9b01e5fc89255cac96747fa081c442c_cgraph.md5 new file mode 100644 index 0000000..8969799 --- /dev/null +++ b/docs/html/namespacetests_1_1test__doc__commands_af9b01e5fc89255cac96747fa081c442c_cgraph.md5 @@ -0,0 +1 @@ +4dfa85ad92a13ab307edd504ab65bb1a \ No newline at end of file diff --git a/docs/html/namespacetests_1_1test__doc__commands_af9b01e5fc89255cac96747fa081c442c_cgraph.svg b/docs/html/namespacetests_1_1test__doc__commands_af9b01e5fc89255cac96747fa081c442c_cgraph.svg new file mode 100644 index 0000000..b636d21 --- /dev/null +++ b/docs/html/namespacetests_1_1test__doc__commands_af9b01e5fc89255cac96747fa081c442c_cgraph.svg @@ -0,0 +1,274 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +tests.test_doc_commands.test_handle_docgen_no_token + + + +Node1 + + +tests.test_doc_commands.test +_handle_docgen_no_token + + + + + +Node2 + + +penify_hook.commands.doc +_commands.handle_docgen + + + + + +Node1->Node2 + + + + + +Node3 + + +penify_hook.commands.doc +_commands.generate_doc + + + + + +Node2->Node3 + + + + + +Node4 + + +penify_hook.commands.config +_commands.get_token + + + + + +Node2->Node4 + + + + + +Node9 + + +penify_hook.commands.hook +_commands.install_git_hook + + + + + +Node2->Node9 + + + + + +Node10 + + +penify_hook.commands.hook +_commands.uninstall_git_hook + + + + + +Node2->Node10 + + + + + +Node5 + + +penify_hook.commands.config +_commands.get_env_var_or +_default + + + + + +Node4->Node5 + + + + + +Node6 + + +penify_hook.commands.config +_commands.get_penify_config + + + + + +Node4->Node6 + + + + + +Node8 + + +penify_hook.commands.config +_commands.load_env_files + + + + + +Node4->Node8 + + + + + +Node7 + + +penify_hook.utils.recursive +_search_git_folder + + + + + +Node6->Node7 + + + + + +Node7->Node7 + + + + + +Node8->Node7 + + + + + +Node8->Node8 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/html/namespacetests_1_1test__doc__commands_af9b01e5fc89255cac96747fa081c442c_cgraph_org.svg b/docs/html/namespacetests_1_1test__doc__commands_af9b01e5fc89255cac96747fa081c442c_cgraph_org.svg new file mode 100644 index 0000000..0cfb00d --- /dev/null +++ b/docs/html/namespacetests_1_1test__doc__commands_af9b01e5fc89255cac96747fa081c442c_cgraph_org.svg @@ -0,0 +1,186 @@ + + + + + + +tests.test_doc_commands.test_handle_docgen_no_token + + + +Node1 + + +tests.test_doc_commands.test +_handle_docgen_no_token + + + + + +Node2 + + +penify_hook.commands.doc +_commands.handle_docgen + + + + + +Node1->Node2 + + + + + +Node3 + + +penify_hook.commands.doc +_commands.generate_doc + + + + + +Node2->Node3 + + + + + +Node4 + + +penify_hook.commands.config +_commands.get_token + + + + + +Node2->Node4 + + + + + +Node9 + + +penify_hook.commands.hook +_commands.install_git_hook + + + + + +Node2->Node9 + + + + + +Node10 + + +penify_hook.commands.hook +_commands.uninstall_git_hook + + + + + +Node2->Node10 + + + + + +Node5 + + +penify_hook.commands.config +_commands.get_env_var_or +_default + + + + + +Node4->Node5 + + + + + +Node6 + + +penify_hook.commands.config +_commands.get_penify_config + + + + + +Node4->Node6 + + + + + +Node8 + + +penify_hook.commands.config +_commands.load_env_files + + + + + +Node4->Node8 + + + + + +Node7 + + +penify_hook.utils.recursive +_search_git_folder + + + + + +Node6->Node7 + + + + + +Node7->Node7 + + + + + +Node8->Node7 + + + + + +Node8->Node8 + + + + + diff --git a/docs/html/namespacetests_1_1test__web__config.html b/docs/html/namespacetests_1_1test__web__config.html new file mode 100644 index 0000000..71f67f5 --- /dev/null +++ b/docs/html/namespacetests_1_1test__web__config.html @@ -0,0 +1,138 @@ + + + + + + + + + + + + + + + + + + +penify-cli: tests.test_web_config Namespace Reference + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    penify-cli +
    +
    +
    + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    + +
    tests.test_web_config Namespace Reference
    +
    +
    + + + + +

    +Classes

    class  TestWebConfig
     
    +
    +
    + + + + + diff --git a/docs/html/namespacetests_1_1test__web__config.js b/docs/html/namespacetests_1_1test__web__config.js new file mode 100644 index 0000000..9c444bb --- /dev/null +++ b/docs/html/namespacetests_1_1test__web__config.js @@ -0,0 +1,4 @@ +var namespacetests_1_1test__web__config = +[ + [ "TestWebConfig", "classtests_1_1test__web__config_1_1TestWebConfig.html", "classtests_1_1test__web__config_1_1TestWebConfig" ] +]; \ No newline at end of file diff --git a/docs/html/nav_f.png b/docs/html/nav_f.png new file mode 100644 index 0000000000000000000000000000000000000000..72a58a529ed3a9ed6aa0c51a79cf207e026deee2 GIT binary patch literal 153 zcmeAS@N?(olHy`uVBq!ia0vp^j6iI`!2~2XGqLUlQVE_ejv*C{Z|{2ZH7M}7UYxc) zn!W8uqtnIQ>_z8U literal 0 HcmV?d00001 diff --git a/docs/html/nav_g.png b/docs/html/nav_g.png new file mode 100644 index 0000000000000000000000000000000000000000..2093a237a94f6c83e19ec6e5fd42f7ddabdafa81 GIT binary patch literal 95 zcmeAS@N?(olHy`uVBq!ia0vp^j6lrB!3HFm1ilyoDK$?Q$B+ufw|5PB85lU25BhtE tr?otc=hd~V+ws&_A@j8Fiv!KF$B+ufw|5=67#uj90@pIL wZ=Q8~_Ju`#59=RjDrmm`tMD@M=!-l18IR?&vFVdQ&MBb@0HFXL=0 ? varName.substring(i+1) : varName; + return eval(n.replace(/\-/g,'_')); +} + +function stripPath(uri) +{ + return uri.substring(uri.lastIndexOf('/')+1); +} + +function stripPath2(uri) +{ + var i = uri.lastIndexOf('/'); + var s = uri.substring(i+1); + var m = uri.substring(0,i+1).match(/\/d\w\/d\w\w\/$/); + return m ? uri.substring(i-6) : s; +} + +function hashValue() +{ + return $(location).attr('hash').substring(1).replace(/[^\w\-]/g,''); +} + +function hashUrl() +{ + return '#'+hashValue(); +} + +function pathName() +{ + return $(location).attr('pathname').replace(/[^-A-Za-z0-9+&@#/%?=~_|!:,.;\(\)]/g, ''); +} + +function localStorageSupported() +{ + try { + return 'localStorage' in window && window['localStorage'] !== null && window.localStorage.getItem; + } + catch(e) { + return false; + } +} + +function storeLink(link) +{ + if (!$("#nav-sync").hasClass('sync') && localStorageSupported()) { + window.localStorage.setItem('navpath',link); + } +} + +function deleteLink() +{ + if (localStorageSupported()) { + window.localStorage.setItem('navpath',''); + } +} + +function cachedLink() +{ + if (localStorageSupported()) { + return window.localStorage.getItem('navpath'); + } else { + return ''; + } +} + +function getScript(scriptName,func,show) +{ + var head = document.getElementsByTagName("head")[0]; + var script = document.createElement('script'); + script.id = scriptName; + script.type = 'text/javascript'; + script.onload = func; + script.src = scriptName+'.js'; + head.appendChild(script); +} + +function createIndent(o,domNode,node,level) +{ + var level=-1; + var n = node; + while (n.parentNode) { level++; n=n.parentNode; } + if (node.childrenData) { + var imgNode = document.createElement("span"); + imgNode.className = 'arrow'; + imgNode.style.paddingLeft=(16*level).toString()+'px'; + imgNode.innerHTML=arrowRight; + node.plus_img = imgNode; + node.expandToggle = document.createElement("a"); + node.expandToggle.href = "javascript:void(0)"; + node.expandToggle.onclick = function() { + if (node.expanded) { + $(node.getChildrenUL()).slideUp("fast"); + node.plus_img.innerHTML=arrowRight; + node.expanded = false; + } else { + expandNode(o, node, false, false); + } + } + node.expandToggle.appendChild(imgNode); + domNode.appendChild(node.expandToggle); + } else { + var span = document.createElement("span"); + span.className = 'arrow'; + span.style.width = 16*(level+1)+'px'; + span.innerHTML = ' '; + domNode.appendChild(span); + } +} + +var animationInProgress = false; + +function gotoAnchor(anchor,aname,updateLocation) +{ + var pos, docContent = $('#doc-content'); + var ancParent = $(anchor.parent()); + if (ancParent.hasClass('memItemLeft') || + ancParent.hasClass('memtitle') || + ancParent.hasClass('fieldname') || + ancParent.hasClass('fieldtype') || + ancParent.is(':header')) + { + pos = ancParent.position().top; + } else if (anchor.position()) { + pos = anchor.position().top; + } + if (pos) { + var dist = Math.abs(Math.min( + pos-docContent.offset().top, + docContent[0].scrollHeight- + docContent.height()-docContent.scrollTop())); + animationInProgress=true; + docContent.animate({ + scrollTop: pos + docContent.scrollTop() - docContent.offset().top + },Math.max(50,Math.min(500,dist)),function(){ + if (updateLocation) window.location.href=aname; + animationInProgress=false; + }); + } +} + +function newNode(o, po, text, link, childrenData, lastNode) +{ + var node = new Object(); + node.children = Array(); + node.childrenData = childrenData; + node.depth = po.depth + 1; + node.relpath = po.relpath; + node.isLast = lastNode; + + node.li = document.createElement("li"); + po.getChildrenUL().appendChild(node.li); + node.parentNode = po; + + node.itemDiv = document.createElement("div"); + node.itemDiv.className = "item"; + + node.labelSpan = document.createElement("span"); + node.labelSpan.className = "label"; + + createIndent(o,node.itemDiv,node,0); + node.itemDiv.appendChild(node.labelSpan); + node.li.appendChild(node.itemDiv); + + var a = document.createElement("a"); + node.labelSpan.appendChild(a); + node.label = document.createTextNode(text); + node.expanded = false; + a.appendChild(node.label); + if (link) { + var url; + if (link.substring(0,1)=='^') { + url = link.substring(1); + link = url; + } else { + url = node.relpath+link; + } + a.className = stripPath(link.replace('#',':')); + if (link.indexOf('#')!=-1) { + var aname = '#'+link.split('#')[1]; + var srcPage = stripPath(pathName()); + var targetPage = stripPath(link.split('#')[0]); + a.href = srcPage!=targetPage ? url : "javascript:void(0)"; + a.onclick = function(){ + storeLink(link); + if (!$(a).parent().parent().hasClass('selected')) + { + $('.item').removeClass('selected'); + $('.item').removeAttr('id'); + $(a).parent().parent().addClass('selected'); + $(a).parent().parent().attr('id','selected'); + } + var anchor = $(aname); + gotoAnchor(anchor,aname,true); + }; + } else { + a.href = url; + a.onclick = function() { storeLink(link); } + } + } else { + if (childrenData != null) + { + a.className = "nolink"; + a.href = "javascript:void(0)"; + a.onclick = node.expandToggle.onclick; + } + } + + node.childrenUL = null; + node.getChildrenUL = function() { + if (!node.childrenUL) { + node.childrenUL = document.createElement("ul"); + node.childrenUL.className = "children_ul"; + node.childrenUL.style.display = "none"; + node.li.appendChild(node.childrenUL); + } + return node.childrenUL; + }; + + return node; +} + +function showRoot() +{ + var headerHeight = $("#top").height(); + var footerHeight = $("#nav-path").height(); + var windowHeight = $(window).height() - headerHeight - footerHeight; + (function (){ // retry until we can scroll to the selected item + try { + var navtree=$('#nav-tree'); + navtree.scrollTo('#selected',100,{offset:-windowHeight/2}); + } catch (err) { + setTimeout(arguments.callee, 0); + } + })(); +} + +function expandNode(o, node, imm, showRoot) +{ + if (node.childrenData && !node.expanded) { + if (typeof(node.childrenData)==='string') { + var varName = node.childrenData; + getScript(node.relpath+varName,function(){ + node.childrenData = getData(varName); + expandNode(o, node, imm, showRoot); + }, showRoot); + } else { + if (!node.childrenVisited) { + getNode(o, node); + } + $(node.getChildrenUL()).slideDown("fast"); + node.plus_img.innerHTML = arrowDown; + node.expanded = true; + } + } +} + +function glowEffect(n,duration) +{ + n.addClass('glow').delay(duration).queue(function(next){ + $(this).removeClass('glow');next(); + }); +} + +function highlightAnchor() +{ + var aname = hashUrl(); + var anchor = $(aname); + if (anchor.parent().attr('class')=='memItemLeft'){ + var rows = $('.memberdecls tr[class$="'+hashValue()+'"]'); + glowEffect(rows.children(),300); // member without details + } else if (anchor.parent().attr('class')=='fieldname'){ + glowEffect(anchor.parent().parent(),1000); // enum value + } else if (anchor.parent().attr('class')=='fieldtype'){ + glowEffect(anchor.parent().parent(),1000); // struct field + } else if (anchor.parent().is(":header")) { + glowEffect(anchor.parent(),1000); // section header + } else { + glowEffect(anchor.next(),1000); // normal member + } +} + +function selectAndHighlight(hash,n) +{ + var a; + if (hash) { + var link=stripPath(pathName())+':'+hash.substring(1); + a=$('.item a[class$="'+link+'"]'); + } + if (a && a.length) { + a.parent().parent().addClass('selected'); + a.parent().parent().attr('id','selected'); + highlightAnchor(); + } else if (n) { + $(n.itemDiv).addClass('selected'); + $(n.itemDiv).attr('id','selected'); + } + var topOffset=5; + if (typeof page_layout!=='undefined' && page_layout==1) { + topOffset+=$('#top').outerHeight(); + } + if ($('#nav-tree-contents .item:first').hasClass('selected')) { + topOffset+=25; + } + $('#nav-sync').css('top',topOffset+'px'); + showRoot(); +} + +function showNode(o, node, index, hash) +{ + if (node && node.childrenData) { + if (typeof(node.childrenData)==='string') { + var varName = node.childrenData; + getScript(node.relpath+varName,function(){ + node.childrenData = getData(varName); + showNode(o,node,index,hash); + },true); + } else { + if (!node.childrenVisited) { + getNode(o, node); + } + $(node.getChildrenUL()).css({'display':'block'}); + node.plus_img.innerHTML = arrowDown; + node.expanded = true; + var n = node.children[o.breadcrumbs[index]]; + if (index+11) hash = '#'+parts[1].replace(/[^\w\-]/g,''); + else hash=''; + } + if (hash.match(/^#l\d+$/)) { + var anchor=$('a[name='+hash.substring(1)+']'); + glowEffect(anchor.parent(),1000); // line number + hash=''; // strip line number anchors + } + var url=root+hash; + var i=-1; + while (NAVTREEINDEX[i+1]<=url) i++; + if (i==-1) { i=0; root=NAVTREE[0][1]; } // fallback: show index + if (navTreeSubIndices[i]) { + gotoNode(o,i,root,hash,relpath) + } else { + getScript(relpath+'navtreeindex'+i,function(){ + navTreeSubIndices[i] = eval('NAVTREEINDEX'+i); + if (navTreeSubIndices[i]) { + gotoNode(o,i,root,hash,relpath); + } + },true); + } +} + +function showSyncOff(n,relpath) +{ + n.html(''); +} + +function showSyncOn(n,relpath) +{ + n.html(''); +} + +function toggleSyncButton(relpath) +{ + var navSync = $('#nav-sync'); + if (navSync.hasClass('sync')) { + navSync.removeClass('sync'); + showSyncOff(navSync,relpath); + storeLink(stripPath2(pathName())+hashUrl()); + } else { + navSync.addClass('sync'); + showSyncOn(navSync,relpath); + deleteLink(); + } +} + +var loadTriggered = false; +var readyTriggered = false; +var loadObject,loadToRoot,loadUrl,loadRelPath; + +$(window).on('load',function(){ + if (readyTriggered) { // ready first + navTo(loadObject,loadToRoot,loadUrl,loadRelPath); + showRoot(); + } + loadTriggered=true; +}); + +function initNavTree(toroot,relpath) +{ + var o = new Object(); + o.toroot = toroot; + o.node = new Object(); + o.node.li = document.getElementById("nav-tree-contents"); + o.node.childrenData = NAVTREE; + o.node.children = new Array(); + o.node.childrenUL = document.createElement("ul"); + o.node.getChildrenUL = function() { return o.node.childrenUL; }; + o.node.li.appendChild(o.node.childrenUL); + o.node.depth = 0; + o.node.relpath = relpath; + o.node.expanded = false; + o.node.isLast = true; + o.node.plus_img = document.createElement("span"); + o.node.plus_img.className = 'arrow'; + o.node.plus_img.innerHTML = arrowRight; + + if (localStorageSupported()) { + var navSync = $('#nav-sync'); + if (cachedLink()) { + showSyncOff(navSync,relpath); + navSync.removeClass('sync'); + } else { + showSyncOn(navSync,relpath); + } + navSync.click(function(){ toggleSyncButton(relpath); }); + } + + if (loadTriggered) { // load before ready + navTo(o,toroot,hashUrl(),relpath); + showRoot(); + } else { // ready before load + loadObject = o; + loadToRoot = toroot; + loadUrl = hashUrl(); + loadRelPath = relpath; + readyTriggered=true; + } + + $(window).bind('hashchange', function(){ + if (window.location.hash && window.location.hash.length>1){ + var a; + if ($(location).attr('hash')){ + var clslink=stripPath(pathName())+':'+hashValue(); + a=$('.item a[class$="'+clslink.replace(/-m, --message", "md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_commit_commands.html#autotoc_md3", null ], + [ "-e, --terminal", "md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_commit_commands.html#autotoc_md4", null ], + [ "-d, --description", "md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_commit_commands.html#autotoc_md5", null ] + ] ], + [ "Option Combinations", "md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_commit_commands.html#autotoc_md6", [ + [ "Generate Title Only with Context", "md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_commit_commands.html#autotoc_md7", null ], + [ "Generate Title and Description with Context", "md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_commit_commands.html#autotoc_md8", null ], + [ "Generate and Edit Full Commit Message", "md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_commit_commands.html#autotoc_md9", null ], + [ "Generate, Edit, and Provide Context", "md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_commit_commands.html#autotoc_md10", null ] + ] ], + [ "LLM and JIRA Integration", "md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_commit_commands.html#autotoc_md11", [ + [ "Using Local LLM", "md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_commit_commands.html#autotoc_md12", null ], + [ "JIRA Enhancement", "md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_commit_commands.html#autotoc_md13", null ] + ] ], + [ "Configuration Requirements", "md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_commit_commands.html#autotoc_md14", null ], + [ "Examples", "md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_commit_commands.html#autotoc_md15", [ + [ "Basic Commit with Default Settings", "md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_commit_commands.html#autotoc_md16", null ], + [ "Full Workflow with All Features", "md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_commit_commands.html#autotoc_md17", null ] + ] ], + [ "Troubleshooting", "md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_commit_commands.html#autotoc_md18", [ + [ "Common Issues", "md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_commit_commands.html#autotoc_md19", null ] + ] ] + ] ], + [ "Penify CLI - Configuration Commands", "md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_config_commands.html", [ + [ "Configuration Overview", "md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_config_commands.html#autotoc_md21", null ], + [ "Basic Usage", "md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_config_commands.html#autotoc_md22", null ], + [ "LLM Configuration", "md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_config_commands.html#autotoc_md23", [ + [ "Web Interface", "md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_config_commands.html#autotoc_md24", null ], + [ "Supported LLMs", "md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_config_commands.html#autotoc_md25", [ + [ "OpenAI", "md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_config_commands.html#autotoc_md26", null ], + [ "Anthropic", "md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_config_commands.html#autotoc_md27", null ], + [ "Ollama (Local)", "md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_config_commands.html#autotoc_md28", null ], + [ "Azure OpenAI", "md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_config_commands.html#autotoc_md29", null ] + ] ], + [ "Configuration File Structure", "md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_config_commands.html#autotoc_md30", null ] + ] ], + [ "JIRA Configuration", "md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_config_commands.html#autotoc_md31", [ + [ "Web Interface", "md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_config_commands.html#autotoc_md32", null ], + [ "Creating a JIRA API Token", "md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_config_commands.html#autotoc_md33", null ], + [ "Configuration File Structure", "md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_config_commands.html#autotoc_md34", null ] + ] ], + [ "Configuration Locations", "md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_config_commands.html#autotoc_md35", null ], + [ "Environment Variables", "md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_config_commands.html#autotoc_md36", null ], + [ "Command-Line Configuration", "md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_config_commands.html#autotoc_md37", null ], + [ "Sharing Configuration", "md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_config_commands.html#autotoc_md38", null ], + [ "Troubleshooting", "md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_config_commands.html#autotoc_md39", [ + [ "Common Issues", "md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_config_commands.html#autotoc_md40", null ] + ] ] + ] ], + [ "Penify CLI - Detailed Usage Guide", "md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_detailed_usage.html", [ + [ "Table of Contents", "md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_detailed_usage.html#autotoc_md42", null ], + [ "Authentication", "md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_detailed_usage.html#autotoc_md43", [ + [ "Login Process", "md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_detailed_usage.html#autotoc_md44", null ], + [ "API Token Storage", "md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_detailed_usage.html#autotoc_md45", null ], + [ "Token Precedence", "md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_detailed_usage.html#autotoc_md46", null ] + ] ], + [ "Command Overview", "md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_detailed_usage.html#autotoc_md47", null ], + [ "Commit Message Generation", "md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_detailed_usage.html#autotoc_md48", null ], + [ "Code Documentation Generation", "md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_detailed_usage.html#autotoc_md49", [ + [ "Use Cases", "md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_detailed_usage.html#autotoc_md50", null ], + [ "Authentication Requirement", "md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_detailed_usage.html#autotoc_md51", null ] + ] ], + [ "Configuration Settings", "md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_detailed_usage.html#autotoc_md52", null ], + [ "Git Hooks", "md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_detailed_usage.html#autotoc_md53", [ + [ "Post-Commit Hook", "md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_detailed_usage.html#autotoc_md54", null ], + [ "Custom Hook Location", "md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_detailed_usage.html#autotoc_md55", null ] + ] ], + [ "Advanced Use Cases", "md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_detailed_usage.html#autotoc_md56", [ + [ "CI/CD Integration", "md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_detailed_usage.html#autotoc_md57", null ], + [ "Remote Repository Documentation", "md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_detailed_usage.html#autotoc_md58", null ] + ] ], + [ "Troubleshooting", "md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_detailed_usage.html#autotoc_md59", [ + [ "Common Issues", "md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_detailed_usage.html#autotoc_md60", null ], + [ "Logs", "md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_detailed_usage.html#autotoc_md61", null ], + [ "Support", "md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_detailed_usage.html#autotoc_md62", null ] + ] ] + ] ], + [ "Penify CLI - Documentation Generation Commands", "md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_doc_commands.html", [ + [ "Table of Contents", "md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_doc_commands.html#autotoc_md64", null ], + [ "Basic Usage", "md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_doc_commands.html#autotoc_md65", null ], + [ "Command Options", "md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_doc_commands.html#autotoc_md66", [ + [ "-l, --location", "md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_doc_commands.html#autotoc_md67", null ], + [ "Subcommands", "md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_doc_commands.html#autotoc_md68", [ + [ "install-hook", "md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_doc_commands.html#autotoc_md69", null ], + [ "uninstall-hook", "md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_doc_commands.html#autotoc_md70", null ] + ] ] + ] ], + [ "Option Combinations", "md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_doc_commands.html#autotoc_md71", [ + [ "Generate Documentation for Current Git Diff", "md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_doc_commands.html#autotoc_md72", null ], + [ "Generate Documentation for a Specific File", "md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_doc_commands.html#autotoc_md73", null ], + [ "Generate Documentation for a Folder", "md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_doc_commands.html#autotoc_md74", null ], + [ "Install Hook in Current Repository", "md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_doc_commands.html#autotoc_md75", null ], + [ "Install Hook in Specific Repository", "md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_doc_commands.html#autotoc_md76", null ], + [ "Uninstall Hook from Current Repository", "md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_doc_commands.html#autotoc_md77", null ], + [ "Uninstall Hook from Specific Repository", "md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_doc_commands.html#autotoc_md78", null ] + ] ], + [ "Git Hook Commands", "md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_doc_commands.html#autotoc_md79", [ + [ "Hook Installation", "md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_doc_commands.html#autotoc_md80", [ + [ "How Hooks Work", "md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_doc_commands.html#autotoc_md81", null ], + [ "Hook Script Content", "md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_doc_commands.html#autotoc_md82", null ], + [ "Installation Location", "md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_doc_commands.html#autotoc_md83", null ], + [ "Installation Requirements", "md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_doc_commands.html#autotoc_md84", null ], + [ "Verifying Installation", "md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_doc_commands.html#autotoc_md85", null ] + ] ], + [ "Hook Customization", "md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_doc_commands.html#autotoc_md86", [ + [ "Modifying Hook Behavior", "md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_doc_commands.html#autotoc_md87", null ], + [ "Advanced Hook Scenarios", "md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_doc_commands.html#autotoc_md88", null ] + ] ], + [ "Hook Uninstallation", "md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_doc_commands.html#autotoc_md89", [ + [ "Standard Uninstallation", "md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_doc_commands.html#autotoc_md90", null ], + [ "Specific Repository Uninstallation", "md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_doc_commands.html#autotoc_md91", null ], + [ "Manual Hook Removal", "md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_doc_commands.html#autotoc_md92", null ], + [ "Verifying Uninstallation", "md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_doc_commands.html#autotoc_md93", null ] + ] ] + ] ], + [ "Advanced Use Cases", "md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_doc_commands.html#autotoc_md94", [ + [ "Continuous Integration", "md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_doc_commands.html#autotoc_md95", null ], + [ "Batch Documentation", "md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_doc_commands.html#autotoc_md96", null ], + [ "Custom Git Hook Integration", "md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_doc_commands.html#autotoc_md97", null ], + [ "Documenting Release Tags", "md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_doc_commands.html#autotoc_md98", null ] + ] ], + [ "Troubleshooting", "md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_doc_commands.html#autotoc_md99", [ + [ "Common Issues", "md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_doc_commands.html#autotoc_md100", null ], + [ "Debugging", "md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_doc_commands.html#autotoc_md101", null ], + [ "Getting Help", "md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_doc_commands.html#autotoc_md102", null ] + ] ] + ] ], + [ "Penify CLI Example Workflows", "md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_example_workflows.html", [ + [ "Workflow 1: Efficient Git Commits with AI", "md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_example_workflows.html#autotoc_md104", [ + [ "Setup", "md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_example_workflows.html#autotoc_md105", null ], + [ "Daily Workflow", "md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_example_workflows.html#autotoc_md106", null ], + [ "Benefits", "md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_example_workflows.html#autotoc_md107", null ] + ] ], + [ "Workflow 2: Documentation Generation Pipeline", "md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_example_workflows.html#autotoc_md108", [ + [ "Setup", "md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_example_workflows.html#autotoc_md109", null ], + [ "Daily Workflow", "md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_example_workflows.html#autotoc_md110", null ], + [ "Manual Documentation", "md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_example_workflows.html#autotoc_md111", null ], + [ "Benefits", "md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_example_workflows.html#autotoc_md112", null ] + ] ], + [ "Workflow 3: Code Review Enhancement", "md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_example_workflows.html#autotoc_md113", [ + [ "Setup", "md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_example_workflows.html#autotoc_md114", null ], + [ "Workflow", "md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_example_workflows.html#autotoc_md115", null ], + [ "Benefits", "md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_example_workflows.html#autotoc_md116", null ] + ] ], + [ "Workflow 4: Onboarding New Team Members", "md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_example_workflows.html#autotoc_md117", [ + [ "For Team Leads", "md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_example_workflows.html#autotoc_md118", null ], + [ "For New Team Members", "md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_example_workflows.html#autotoc_md119", null ], + [ "Benefits", "md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_example_workflows.html#autotoc_md120", null ] + ] ], + [ "Workflow 5: Legacy Code Understanding", "md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_example_workflows.html#autotoc_md121", [ + [ "Benefits", "md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_example_workflows.html#autotoc_md122", null ] + ] ] + ] ], + [ "Penify CLI Tool", "md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_README.html", [ + [ "Features", "md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_README.html#autotoc_md157", null ], + [ "Installation", "md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_README.html#autotoc_md158", null ], + [ "Usage", "md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_README.html#autotoc_md159", null ], + [ "Basic Commands (No login required)", "md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_README.html#autotoc_md160", [ + [ "Commit", "md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_README.html#autotoc_md161", null ], + [ "Config", "md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_README.html#autotoc_md162", null ] + ] ], + [ "Advanced Commands (Login required)", "md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_README.html#autotoc_md163", [ + [ "Login", "md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_README.html#autotoc_md164", null ], + [ "Documentation Generation", "md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_README.html#autotoc_md165", null ], + [ "Git Hook Management", "md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_README.html#autotoc_md166", null ] + ] ], + [ "Authentication", "md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_README.html#autotoc_md167", null ], + [ "Local LLM Configuration", "md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_README.html#autotoc_md168", null ], + [ "JIRA Integration", "md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_README.html#autotoc_md169", null ], + [ "Development", "md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_README.html#autotoc_md170", [ + [ "Running Tests", "md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_README.html#autotoc_md171", null ] + ] ], + [ "License", "md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_README.html#autotoc_md172", null ], + [ "Author", "md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_README.html#autotoc_md173", null ], + [ "Contributing", "md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_README.html#autotoc_md174", null ], + [ "Issues", "md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_README.html#autotoc_md175", null ], + [ "Support", "md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_README.html#autotoc_md176", null ] + ] ], + [ "Namespaces", "namespaces.html", [ + [ "Namespace List", "namespaces.html", "namespaces_dup" ], + [ "Namespace Members", "namespacemembers.html", [ + [ "All", "namespacemembers.html", null ], + [ "Functions", "namespacemembers_func.html", null ], + [ "Variables", "namespacemembers_vars.html", null ] + ] ] + ] ], + [ "Classes", "annotated.html", [ + [ "Class List", "annotated.html", "annotated_dup" ], + [ "Class Index", "classes.html", null ], + [ "Class Hierarchy", "hierarchy.html", "hierarchy" ], + [ "Class Members", "functions.html", [ + [ "All", "functions.html", null ], + [ "Functions", "functions_func.html", null ], + [ "Variables", "functions_vars.html", null ] + ] ] + ] ], + [ "Files", "files.html", [ + [ "File List", "files.html", "files_dup" ] + ] ] + ] ] +]; + +var NAVTREEINDEX = +[ +"annotated.html", +"jira__client_8py.html#a5593ea3415081eca1eea92e4c1ad1aa2", +"namespacesetup.html#abead4f26b530856f858f0d44c7cf2588" +]; + +var SYNCONMSG = 'click to disable panel synchronisation'; +var SYNCOFFMSG = 'click to enable panel synchronisation'; \ No newline at end of file diff --git a/docs/html/navtreeindex0.js b/docs/html/navtreeindex0.js new file mode 100644 index 0000000..8358b16 --- /dev/null +++ b/docs/html/navtreeindex0.js @@ -0,0 +1,253 @@ +var NAVTREEINDEX0 = +{ +"annotated.html":[7,0], +"api__client_8py.html":[8,0,0,1,2], +"auth__commands_8py.html":[8,0,0,1,0,1], +"auth__commands_8py.html#a78f375c58bb6f69f98675e6a9ac84655":[8,0,0,1,0,1,0], +"auth__commands_8py.html#aa3956ca1749d4218ea1dc6e5b6218b24":[8,0,0,1,0,1,1], +"base__analyzer_8py.html":[8,0,0,1,3], +"classException.html":[7,0,2], +"classes.html":[7,1], +"classpenify__hook_1_1api__client_1_1APIClient.html":[7,0,0,0,0], +"classpenify__hook_1_1api__client_1_1APIClient.html":[6,0,0,0,0], +"classpenify__hook_1_1api__client_1_1APIClient.html#a130cf688ed35dc0e8cbd8320b6b2d872":[6,0,0,0,0,6], +"classpenify__hook_1_1api__client_1_1APIClient.html#a130cf688ed35dc0e8cbd8320b6b2d872":[7,0,0,0,0,6], +"classpenify__hook_1_1api__client_1_1APIClient.html#a5bb502603717946ad710b49ad9d95237":[6,0,0,0,0,7], +"classpenify__hook_1_1api__client_1_1APIClient.html#a5bb502603717946ad710b49ad9d95237":[7,0,0,0,0,7], +"classpenify__hook_1_1api__client_1_1APIClient.html#a5d2b4a26b24352d951ea79ecc4ff3402":[7,0,0,0,0,4], +"classpenify__hook_1_1api__client_1_1APIClient.html#a5d2b4a26b24352d951ea79ecc4ff3402":[6,0,0,0,0,4], +"classpenify__hook_1_1api__client_1_1APIClient.html#a7d7e2cf42c54eb4f25adee96a09ee7b0":[6,0,0,0,0,8], +"classpenify__hook_1_1api__client_1_1APIClient.html#a7d7e2cf42c54eb4f25adee96a09ee7b0":[7,0,0,0,0,8], +"classpenify__hook_1_1api__client_1_1APIClient.html#a7ff74798e7d428b4e2f20095287eb2ce":[6,0,0,0,0,1], +"classpenify__hook_1_1api__client_1_1APIClient.html#a7ff74798e7d428b4e2f20095287eb2ce":[7,0,0,0,0,1], +"classpenify__hook_1_1api__client_1_1APIClient.html#ac0ada470b897935f9fb372cd0e7e51e3":[6,0,0,0,0,2], +"classpenify__hook_1_1api__client_1_1APIClient.html#ac0ada470b897935f9fb372cd0e7e51e3":[7,0,0,0,0,2], +"classpenify__hook_1_1api__client_1_1APIClient.html#ac5aad61508c2cafdf6e88e6c7d6c82b3":[7,0,0,0,0,5], +"classpenify__hook_1_1api__client_1_1APIClient.html#ac5aad61508c2cafdf6e88e6c7d6c82b3":[6,0,0,0,0,5], +"classpenify__hook_1_1api__client_1_1APIClient.html#ad15b790608e703c8c122aa2ead7dfa99":[6,0,0,0,0,3], +"classpenify__hook_1_1api__client_1_1APIClient.html#ad15b790608e703c8c122aa2ead7dfa99":[7,0,0,0,0,3], +"classpenify__hook_1_1api__client_1_1APIClient.html#ad9cb741a8baf2d13f845e25a36311086":[7,0,0,0,0,0], +"classpenify__hook_1_1api__client_1_1APIClient.html#ad9cb741a8baf2d13f845e25a36311086":[6,0,0,0,0,0], +"classpenify__hook_1_1base__analyzer_1_1BaseAnalyzer.html":[6,0,0,1,0], +"classpenify__hook_1_1base__analyzer_1_1BaseAnalyzer.html":[7,0,0,1,0], +"classpenify__hook_1_1base__analyzer_1_1BaseAnalyzer.html#a0cac0310ec635aa64a34857cf30ce1eb":[6,0,0,1,0,7], +"classpenify__hook_1_1base__analyzer_1_1BaseAnalyzer.html#a0cac0310ec635aa64a34857cf30ce1eb":[7,0,0,1,0,7], +"classpenify__hook_1_1base__analyzer_1_1BaseAnalyzer.html#a3a9ddfa1dfba81fe21214fe486389369":[6,0,0,1,0,4], +"classpenify__hook_1_1base__analyzer_1_1BaseAnalyzer.html#a3a9ddfa1dfba81fe21214fe486389369":[7,0,0,1,0,4], +"classpenify__hook_1_1base__analyzer_1_1BaseAnalyzer.html#a81e9c55709205aaf4ebbe2b41683baf2":[7,0,0,1,0,1], +"classpenify__hook_1_1base__analyzer_1_1BaseAnalyzer.html#a81e9c55709205aaf4ebbe2b41683baf2":[6,0,0,1,0,1], +"classpenify__hook_1_1base__analyzer_1_1BaseAnalyzer.html#a957e81a1ab561f6cecfbe999e7b85499":[6,0,0,1,0,6], +"classpenify__hook_1_1base__analyzer_1_1BaseAnalyzer.html#a957e81a1ab561f6cecfbe999e7b85499":[7,0,0,1,0,6], +"classpenify__hook_1_1base__analyzer_1_1BaseAnalyzer.html#a9cca3465b0cc00d78324b0a9eac1d7f5":[6,0,0,1,0,5], +"classpenify__hook_1_1base__analyzer_1_1BaseAnalyzer.html#a9cca3465b0cc00d78324b0a9eac1d7f5":[7,0,0,1,0,5], +"classpenify__hook_1_1base__analyzer_1_1BaseAnalyzer.html#aa67c06dd12b1bafaeaee81c41dcb7e25":[6,0,0,1,0,2], +"classpenify__hook_1_1base__analyzer_1_1BaseAnalyzer.html#aa67c06dd12b1bafaeaee81c41dcb7e25":[7,0,0,1,0,2], +"classpenify__hook_1_1base__analyzer_1_1BaseAnalyzer.html#ab1296a3d1e9070d891801876b66f7344":[7,0,0,1,0,0], +"classpenify__hook_1_1base__analyzer_1_1BaseAnalyzer.html#ab1296a3d1e9070d891801876b66f7344":[6,0,0,1,0,0], +"classpenify__hook_1_1base__analyzer_1_1BaseAnalyzer.html#ab702c0c3ba81d159d7c3bcd7ea2abba4":[7,0,0,1,0,3], +"classpenify__hook_1_1base__analyzer_1_1BaseAnalyzer.html#ab702c0c3ba81d159d7c3bcd7ea2abba4":[6,0,0,1,0,3], +"classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook.html":[6,0,0,3,0], +"classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook.html":[7,0,0,2,0], +"classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook.html#a6370a03f7ed9175ef6f81e931a105ea9":[6,0,0,3,0,4], +"classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook.html#a6370a03f7ed9175ef6f81e931a105ea9":[7,0,0,2,0,4], +"classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook.html#a8496194276441fa2eb2fa014eaab9a37":[6,0,0,3,0,2], +"classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook.html#a8496194276441fa2eb2fa014eaab9a37":[7,0,0,2,0,2], +"classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook.html#ac999c5cbc852a7ec3b412ccb43c274ca":[7,0,0,2,0,1], +"classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook.html#ac999c5cbc852a7ec3b412ccb43c274ca":[6,0,0,3,0,1], +"classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook.html#ad93360e31f2ec58a0d7c9f08b219028a":[7,0,0,2,0,5], +"classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook.html#ad93360e31f2ec58a0d7c9f08b219028a":[6,0,0,3,0,5], +"classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook.html#adda13cc121d96342476ccf72b63a007f":[7,0,0,2,0,3], +"classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook.html#adda13cc121d96342476ccf72b63a007f":[6,0,0,3,0,3], +"classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook.html#af127d86729e226d74dbeb095b008db3e":[7,0,0,2,0,0], +"classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook.html#af127d86729e226d74dbeb095b008db3e":[6,0,0,3,0,0], +"classpenify__hook_1_1file__analyzer_1_1FileAnalyzerGenHook.html":[6,0,0,6,0], +"classpenify__hook_1_1file__analyzer_1_1FileAnalyzerGenHook.html":[7,0,0,3,0], +"classpenify__hook_1_1file__analyzer_1_1FileAnalyzerGenHook.html#a190c473090b2a07e7cb43073a3211c4b":[6,0,0,6,0,0], +"classpenify__hook_1_1file__analyzer_1_1FileAnalyzerGenHook.html#a190c473090b2a07e7cb43073a3211c4b":[7,0,0,3,0,0], +"classpenify__hook_1_1file__analyzer_1_1FileAnalyzerGenHook.html#a2cc6c22ef588fccf3eed9bbc57fb6d6e":[7,0,0,3,0,2], +"classpenify__hook_1_1file__analyzer_1_1FileAnalyzerGenHook.html#a2cc6c22ef588fccf3eed9bbc57fb6d6e":[6,0,0,6,0,2], +"classpenify__hook_1_1file__analyzer_1_1FileAnalyzerGenHook.html#a4f4dffbc432fac3e259d957dd1e187f1":[6,0,0,6,0,3], +"classpenify__hook_1_1file__analyzer_1_1FileAnalyzerGenHook.html#a4f4dffbc432fac3e259d957dd1e187f1":[7,0,0,3,0,3], +"classpenify__hook_1_1file__analyzer_1_1FileAnalyzerGenHook.html#a6ab39391dfb7686f2a2d21a702dd3073":[7,0,0,3,0,1], +"classpenify__hook_1_1file__analyzer_1_1FileAnalyzerGenHook.html#a6ab39391dfb7686f2a2d21a702dd3073":[6,0,0,6,0,1], +"classpenify__hook_1_1file__analyzer_1_1FileAnalyzerGenHook.html#a9b03b88a9ce1b9af945279375048dc32":[6,0,0,6,0,4], +"classpenify__hook_1_1file__analyzer_1_1FileAnalyzerGenHook.html#a9b03b88a9ce1b9af945279375048dc32":[7,0,0,3,0,4], +"classpenify__hook_1_1folder__analyzer_1_1FolderAnalyzerGenHook.html":[6,0,0,7,0], +"classpenify__hook_1_1folder__analyzer_1_1FolderAnalyzerGenHook.html":[7,0,0,4,0], +"classpenify__hook_1_1folder__analyzer_1_1FolderAnalyzerGenHook.html#a1bb0358140931d82c7616f12efe31821":[7,0,0,4,0,0], +"classpenify__hook_1_1folder__analyzer_1_1FolderAnalyzerGenHook.html#a1bb0358140931d82c7616f12efe31821":[6,0,0,7,0,0], +"classpenify__hook_1_1folder__analyzer_1_1FolderAnalyzerGenHook.html#a53f73d69cc0f00763ee4830e4f0f7393":[6,0,0,7,0,3], +"classpenify__hook_1_1folder__analyzer_1_1FolderAnalyzerGenHook.html#a53f73d69cc0f00763ee4830e4f0f7393":[7,0,0,4,0,3], +"classpenify__hook_1_1folder__analyzer_1_1FolderAnalyzerGenHook.html#a70b845318fc7ac3b607daf26378e19ec":[7,0,0,4,0,1], +"classpenify__hook_1_1folder__analyzer_1_1FolderAnalyzerGenHook.html#a70b845318fc7ac3b607daf26378e19ec":[6,0,0,7,0,1], +"classpenify__hook_1_1folder__analyzer_1_1FolderAnalyzerGenHook.html#afd189d1b8c773bf710a899eb21fd76cc":[7,0,0,4,0,2], +"classpenify__hook_1_1folder__analyzer_1_1FolderAnalyzerGenHook.html#afd189d1b8c773bf710a899eb21fd76cc":[6,0,0,7,0,2], +"classpenify__hook_1_1git__analyzer_1_1GitDocGenHook.html":[6,0,0,8,0], +"classpenify__hook_1_1git__analyzer_1_1GitDocGenHook.html":[7,0,0,5,0], +"classpenify__hook_1_1git__analyzer_1_1GitDocGenHook.html#a05313caa22b173ce75638f0db08eeb85":[7,0,0,5,0,3], +"classpenify__hook_1_1git__analyzer_1_1GitDocGenHook.html#a05313caa22b173ce75638f0db08eeb85":[6,0,0,8,0,3], +"classpenify__hook_1_1git__analyzer_1_1GitDocGenHook.html#a17549766100e91eb94b5f1a1d34bf481":[6,0,0,8,0,1], +"classpenify__hook_1_1git__analyzer_1_1GitDocGenHook.html#a17549766100e91eb94b5f1a1d34bf481":[7,0,0,5,0,1], +"classpenify__hook_1_1git__analyzer_1_1GitDocGenHook.html#a3beba14e92d717391a74bb70b1fab0ae":[7,0,0,5,0,4], +"classpenify__hook_1_1git__analyzer_1_1GitDocGenHook.html#a3beba14e92d717391a74bb70b1fab0ae":[6,0,0,8,0,4], +"classpenify__hook_1_1git__analyzer_1_1GitDocGenHook.html#a92275fddb43dbef6dfdb6c1ed6e96d0c":[6,0,0,8,0,0], +"classpenify__hook_1_1git__analyzer_1_1GitDocGenHook.html#a92275fddb43dbef6dfdb6c1ed6e96d0c":[7,0,0,5,0,0], +"classpenify__hook_1_1git__analyzer_1_1GitDocGenHook.html#a974d2f51315ed6a1965a7fd7e2ced0cd":[7,0,0,5,0,2], +"classpenify__hook_1_1git__analyzer_1_1GitDocGenHook.html#a974d2f51315ed6a1965a7fd7e2ced0cd":[6,0,0,8,0,2], +"classpenify__hook_1_1jira__client_1_1JiraClient.html":[7,0,0,6,0], +"classpenify__hook_1_1jira__client_1_1JiraClient.html":[6,0,0,9,0], +"classpenify__hook_1_1jira__client_1_1JiraClient.html#a00d0f9ae006313a21576362d26ac5ec8":[7,0,0,6,0,9], +"classpenify__hook_1_1jira__client_1_1JiraClient.html#a00d0f9ae006313a21576362d26ac5ec8":[6,0,0,9,0,9], +"classpenify__hook_1_1jira__client_1_1JiraClient.html#a093d6456fe053ef7a7862d5d6851910c":[7,0,0,6,0,4], +"classpenify__hook_1_1jira__client_1_1JiraClient.html#a093d6456fe053ef7a7862d5d6851910c":[6,0,0,9,0,4], +"classpenify__hook_1_1jira__client_1_1JiraClient.html#a3c0cfecff02a75cb7001509a595b8197":[6,0,0,9,0,13], +"classpenify__hook_1_1jira__client_1_1JiraClient.html#a3c0cfecff02a75cb7001509a595b8197":[7,0,0,6,0,13], +"classpenify__hook_1_1jira__client_1_1JiraClient.html#a47efc1ec07389c960f2dfb37ba8c09f5":[7,0,0,6,0,0], +"classpenify__hook_1_1jira__client_1_1JiraClient.html#a47efc1ec07389c960f2dfb37ba8c09f5":[6,0,0,9,0,0], +"classpenify__hook_1_1jira__client_1_1JiraClient.html#a49ea1149758f7f5212149d357b13cc23":[6,0,0,9,0,5], +"classpenify__hook_1_1jira__client_1_1JiraClient.html#a49ea1149758f7f5212149d357b13cc23":[7,0,0,6,0,5], +"classpenify__hook_1_1jira__client_1_1JiraClient.html#a65f6924819084b7c8d268956a784804a":[6,0,0,9,0,8], +"classpenify__hook_1_1jira__client_1_1JiraClient.html#a65f6924819084b7c8d268956a784804a":[7,0,0,6,0,8], +"classpenify__hook_1_1jira__client_1_1JiraClient.html#a70d2c5a6432aa6f238da0ff65d49a760":[7,0,0,6,0,2], +"classpenify__hook_1_1jira__client_1_1JiraClient.html#a70d2c5a6432aa6f238da0ff65d49a760":[6,0,0,9,0,2], +"classpenify__hook_1_1jira__client_1_1JiraClient.html#aa1f374116c64cd5f1492ec7f7e40f9c1":[6,0,0,9,0,1], +"classpenify__hook_1_1jira__client_1_1JiraClient.html#aa1f374116c64cd5f1492ec7f7e40f9c1":[7,0,0,6,0,1], +"classpenify__hook_1_1jira__client_1_1JiraClient.html#aa967169a4b7970c67c0947b9ac56f746":[7,0,0,6,0,7], +"classpenify__hook_1_1jira__client_1_1JiraClient.html#aa967169a4b7970c67c0947b9ac56f746":[6,0,0,9,0,7], +"classpenify__hook_1_1jira__client_1_1JiraClient.html#aca8837552d37bfd611de23441a240826":[7,0,0,6,0,10], +"classpenify__hook_1_1jira__client_1_1JiraClient.html#aca8837552d37bfd611de23441a240826":[6,0,0,9,0,10], +"classpenify__hook_1_1jira__client_1_1JiraClient.html#ad2823ad1d3baaedd38039913c3a97fd7":[7,0,0,6,0,3], +"classpenify__hook_1_1jira__client_1_1JiraClient.html#ad2823ad1d3baaedd38039913c3a97fd7":[6,0,0,9,0,3], +"classpenify__hook_1_1jira__client_1_1JiraClient.html#ae56104d5aa7bda7bb26d169c4b46038c":[7,0,0,6,0,14], +"classpenify__hook_1_1jira__client_1_1JiraClient.html#ae56104d5aa7bda7bb26d169c4b46038c":[6,0,0,9,0,14], +"classpenify__hook_1_1jira__client_1_1JiraClient.html#aefb3f96c79358cf3a95d96d3747235b6":[7,0,0,6,0,12], +"classpenify__hook_1_1jira__client_1_1JiraClient.html#aefb3f96c79358cf3a95d96d3747235b6":[6,0,0,9,0,12], +"classpenify__hook_1_1jira__client_1_1JiraClient.html#afb41ce6f13c30b1265d439ddf04bf2cd":[7,0,0,6,0,6], +"classpenify__hook_1_1jira__client_1_1JiraClient.html#afb41ce6f13c30b1265d439ddf04bf2cd":[6,0,0,9,0,6], +"classpenify__hook_1_1jira__client_1_1JiraClient.html#afc5c90e53b702f9fc27e2ee7d3f991b9":[7,0,0,6,0,11], +"classpenify__hook_1_1jira__client_1_1JiraClient.html#afc5c90e53b702f9fc27e2ee7d3f991b9":[6,0,0,9,0,11], +"classpenify__hook_1_1llm__client_1_1LLMClient.html":[6,0,0,10,0], +"classpenify__hook_1_1llm__client_1_1LLMClient.html":[7,0,0,7,0], +"classpenify__hook_1_1llm__client_1_1LLMClient.html#a2ad3014dac466ee1d8e00306d0cf2000":[7,0,0,7,0,1], +"classpenify__hook_1_1llm__client_1_1LLMClient.html#a2ad3014dac466ee1d8e00306d0cf2000":[6,0,0,10,0,1], +"classpenify__hook_1_1llm__client_1_1LLMClient.html#a76c2e9805f805624ab9c55a9f1f8d362":[7,0,0,7,0,3], +"classpenify__hook_1_1llm__client_1_1LLMClient.html#a76c2e9805f805624ab9c55a9f1f8d362":[6,0,0,10,0,3], +"classpenify__hook_1_1llm__client_1_1LLMClient.html#a76d92354f585ab4bb291169f9f530764":[6,0,0,10,0,0], +"classpenify__hook_1_1llm__client_1_1LLMClient.html#a76d92354f585ab4bb291169f9f530764":[7,0,0,7,0,0], +"classpenify__hook_1_1llm__client_1_1LLMClient.html#abc2cb6b1d6d9b5dc16401ca078ec8c10":[7,0,0,7,0,4], +"classpenify__hook_1_1llm__client_1_1LLMClient.html#abc2cb6b1d6d9b5dc16401ca078ec8c10":[6,0,0,10,0,4], +"classpenify__hook_1_1llm__client_1_1LLMClient.html#ad6f06658ca922793f879474f2234518e":[7,0,0,7,0,2], +"classpenify__hook_1_1llm__client_1_1LLMClient.html#ad6f06658ca922793f879474f2234518e":[6,0,0,10,0,2], +"classpenify__hook_1_1utils_1_1GitRepoNotFoundError.html":[7,0,0,8,0], +"classpenify__hook_1_1utils_1_1GitRepoNotFoundError.html":[6,0,0,14,0], +"classtests_1_1test__commit__commands_1_1TestCommitCommands.html":[6,0,2,1,0], +"classtests_1_1test__commit__commands_1_1TestCommitCommands.html":[7,0,1,0,0], +"classtests_1_1test__commit__commands_1_1TestCommitCommands.html#a05adaa9a713ff1be657455d0667bc6be":[6,0,2,1,0,3], +"classtests_1_1test__commit__commands_1_1TestCommitCommands.html#a05adaa9a713ff1be657455d0667bc6be":[7,0,1,0,0,3], +"classtests_1_1test__commit__commands_1_1TestCommitCommands.html#a20e78370ff5bd6223cc1dd4323a86ea4":[7,0,1,0,0,4], +"classtests_1_1test__commit__commands_1_1TestCommitCommands.html#a20e78370ff5bd6223cc1dd4323a86ea4":[6,0,2,1,0,4], +"classtests_1_1test__commit__commands_1_1TestCommitCommands.html#a2842f456a8c0f1bf0f4def17c183c04e":[7,0,1,0,0,2], +"classtests_1_1test__commit__commands_1_1TestCommitCommands.html#a2842f456a8c0f1bf0f4def17c183c04e":[6,0,2,1,0,2], +"classtests_1_1test__commit__commands_1_1TestCommitCommands.html#a43c2ff3707124aa48e8eb581106b8691":[7,0,1,0,0,6], +"classtests_1_1test__commit__commands_1_1TestCommitCommands.html#a43c2ff3707124aa48e8eb581106b8691":[6,0,2,1,0,6], +"classtests_1_1test__commit__commands_1_1TestCommitCommands.html#a4d04b125e102190a768f65f1948f15bc":[6,0,2,1,0,11], +"classtests_1_1test__commit__commands_1_1TestCommitCommands.html#a4d04b125e102190a768f65f1948f15bc":[7,0,1,0,0,11], +"classtests_1_1test__commit__commands_1_1TestCommitCommands.html#aa9b25a4bf692b8736164695072a398f6":[7,0,1,0,0,1], +"classtests_1_1test__commit__commands_1_1TestCommitCommands.html#aa9b25a4bf692b8736164695072a398f6":[6,0,2,1,0,1], +"classtests_1_1test__commit__commands_1_1TestCommitCommands.html#abcd2354a2af4afe19e57877628d3acc2":[6,0,2,1,0,0], +"classtests_1_1test__commit__commands_1_1TestCommitCommands.html#abcd2354a2af4afe19e57877628d3acc2":[7,0,1,0,0,0], +"classtests_1_1test__commit__commands_1_1TestCommitCommands.html#ac13e368262340af98b30fd8ebdac6597":[7,0,1,0,0,10], +"classtests_1_1test__commit__commands_1_1TestCommitCommands.html#ac13e368262340af98b30fd8ebdac6597":[6,0,2,1,0,10], +"classtests_1_1test__commit__commands_1_1TestCommitCommands.html#acc4b1e4189792a3f7c11d2a745f479c0":[7,0,1,0,0,9], +"classtests_1_1test__commit__commands_1_1TestCommitCommands.html#acc4b1e4189792a3f7c11d2a745f479c0":[6,0,2,1,0,9], +"classtests_1_1test__commit__commands_1_1TestCommitCommands.html#acea0d934ee0f2b914b0b893736e8fe4e":[6,0,2,1,0,8], +"classtests_1_1test__commit__commands_1_1TestCommitCommands.html#acea0d934ee0f2b914b0b893736e8fe4e":[7,0,1,0,0,8], +"classtests_1_1test__commit__commands_1_1TestCommitCommands.html#af9c09013055ec39ddde86b487aefcf8b":[6,0,2,1,0,7], +"classtests_1_1test__commit__commands_1_1TestCommitCommands.html#af9c09013055ec39ddde86b487aefcf8b":[7,0,1,0,0,7], +"classtests_1_1test__commit__commands_1_1TestCommitCommands.html#afafbae3c9aeb0e50a75996256c02c8be":[6,0,2,1,0,5], +"classtests_1_1test__commit__commands_1_1TestCommitCommands.html#afafbae3c9aeb0e50a75996256c02c8be":[7,0,1,0,0,5], +"classtests_1_1test__config__commands_1_1TestConfigCommands.html":[6,0,2,2,0], +"classtests_1_1test__config__commands_1_1TestConfigCommands.html":[7,0,1,1,0], +"classtests_1_1test__config__commands_1_1TestConfigCommands.html#a2e8162082bcdd5652bb37bdb14cf453a":[7,0,1,1,0,4], +"classtests_1_1test__config__commands_1_1TestConfigCommands.html#a2e8162082bcdd5652bb37bdb14cf453a":[6,0,2,2,0,4], +"classtests_1_1test__config__commands_1_1TestConfigCommands.html#a3355f7d313bebaa71694387cf2bc5232":[6,0,2,2,0,7], +"classtests_1_1test__config__commands_1_1TestConfigCommands.html#a3355f7d313bebaa71694387cf2bc5232":[7,0,1,1,0,7], +"classtests_1_1test__config__commands_1_1TestConfigCommands.html#a33d4760eee3b67e1cde3aed755ebb948":[7,0,1,1,0,5], +"classtests_1_1test__config__commands_1_1TestConfigCommands.html#a33d4760eee3b67e1cde3aed755ebb948":[6,0,2,2,0,5], +"classtests_1_1test__config__commands_1_1TestConfigCommands.html#a400ca5d9fcdc159714e8df54920f9436":[7,0,1,1,0,8], +"classtests_1_1test__config__commands_1_1TestConfigCommands.html#a400ca5d9fcdc159714e8df54920f9436":[6,0,2,2,0,8], +"classtests_1_1test__config__commands_1_1TestConfigCommands.html#a473984d31452b56acd6ce4011a1248bd":[7,0,1,1,0,3], +"classtests_1_1test__config__commands_1_1TestConfigCommands.html#a473984d31452b56acd6ce4011a1248bd":[6,0,2,2,0,3], +"classtests_1_1test__config__commands_1_1TestConfigCommands.html#a6c0207be563c3de59a6d16277805114c":[7,0,1,1,0,6], +"classtests_1_1test__config__commands_1_1TestConfigCommands.html#a6c0207be563c3de59a6d16277805114c":[6,0,2,2,0,6], +"classtests_1_1test__config__commands_1_1TestConfigCommands.html#a73a264dfb21e16003e095b79f6eab2ac":[7,0,1,1,0,10], +"classtests_1_1test__config__commands_1_1TestConfigCommands.html#a73a264dfb21e16003e095b79f6eab2ac":[6,0,2,2,0,10], +"classtests_1_1test__config__commands_1_1TestConfigCommands.html#abd12f028b89aa9cd1152c0b9ece5d3cd":[6,0,2,2,0,1], +"classtests_1_1test__config__commands_1_1TestConfigCommands.html#abd12f028b89aa9cd1152c0b9ece5d3cd":[7,0,1,1,0,1], +"classtests_1_1test__config__commands_1_1TestConfigCommands.html#acd8df8219441b9e9871b903a681400d9":[7,0,1,1,0,11], +"classtests_1_1test__config__commands_1_1TestConfigCommands.html#acd8df8219441b9e9871b903a681400d9":[6,0,2,2,0,11], +"classtests_1_1test__config__commands_1_1TestConfigCommands.html#adf9f2233a3f4cc5725b9d4f05758b167":[6,0,2,2,0,2], +"classtests_1_1test__config__commands_1_1TestConfigCommands.html#adf9f2233a3f4cc5725b9d4f05758b167":[7,0,1,1,0,2], +"classtests_1_1test__config__commands_1_1TestConfigCommands.html#aee37b97432821d19758c6325d4c74bcf":[6,0,2,2,0,0], +"classtests_1_1test__config__commands_1_1TestConfigCommands.html#aee37b97432821d19758c6325d4c74bcf":[7,0,1,1,0,0], +"classtests_1_1test__config__commands_1_1TestConfigCommands.html#af8d62310da2d768e21770f8f01ff5375":[7,0,1,1,0,9], +"classtests_1_1test__config__commands_1_1TestConfigCommands.html#af8d62310da2d768e21770f8f01ff5375":[6,0,2,2,0,9], +"classtests_1_1test__web__config_1_1TestWebConfig.html":[6,0,2,4,0], +"classtests_1_1test__web__config_1_1TestWebConfig.html":[7,0,1,2,0], +"classtests_1_1test__web__config_1_1TestWebConfig.html#a06e600222e426b003850509cb1d3190a":[6,0,2,4,0,0], +"classtests_1_1test__web__config_1_1TestWebConfig.html#a06e600222e426b003850509cb1d3190a":[7,0,1,2,0,0], +"classtests_1_1test__web__config_1_1TestWebConfig.html#afc6440352201d207ea8b4d26f8ccfa35":[7,0,1,2,0,1], +"classtests_1_1test__web__config_1_1TestWebConfig.html#afc6440352201d207ea8b4d26f8ccfa35":[6,0,2,4,0,1], +"commit__analyzer_8py.html":[8,0,0,1,4], +"commit__commands_8py.html":[8,0,0,1,0,2], +"commit__commands_8py.html#a62564c4e8ad59fc46d56cb0f9122a71a":[8,0,0,1,0,2,0], +"commit__commands_8py.html#a8627583116eb78e31a4d3cdc16d2f15c":[8,0,0,1,0,2,2], +"commit__commands_8py.html#af4f739f524c38b437e4e47673d683e23":[8,0,0,1,0,2,1], +"config__command_8py.html":[8,0,0,1,5], +"config__command_8py.html#a240e5331681eb574ac319d7458783bde":[8,0,0,1,5,0], +"config__command_8py.html#a4f3eb92164a69df1446d745f8a09285e":[8,0,0,1,5,1], +"config__commands_8py.html":[8,0,0,1,0,3], +"config__commands_8py.html#a152642ab83cf6219b604bda6122aba67":[8,0,0,1,0,3,10], +"config__commands_8py.html#a15bf3685c4dcb5c15ba6a4055e484cf2":[8,0,0,1,0,3,3], +"config__commands_8py.html#a185dfc34a655ed80e6c95939b6f3c35c":[8,0,0,1,0,3,1], +"config__commands_8py.html#a3caf2b062dd33b1f1d7ddc7224f0ff87":[8,0,0,1,0,3,2], +"config__commands_8py.html#a4617bc5956e502c9555dc0dda0376df4":[8,0,0,1,0,3,9], +"config__commands_8py.html#a4b202072a3a3b8515c9c254622e9c880":[8,0,0,1,0,3,11], +"config__commands_8py.html#a5503d51c905e2f1b299b12d2a73bd812":[8,0,0,1,0,3,6], +"config__commands_8py.html#a6492bc8e7df6e38bb06ad05e572d4cc0":[8,0,0,1,0,3,4], +"config__commands_8py.html#a6559a82d0bf727703d550d1003d3ed20":[8,0,0,1,0,3,5], +"config__commands_8py.html#aabe277132ce0bc0aacef951cf1dee2ae":[8,0,0,1,0,3,7], +"config__commands_8py.html#ab2486ac2bf16b4a671e49625bfa4f9b4":[8,0,0,1,0,3,8], +"config__commands_8py.html#af115198ea5d6808ccb98733957f50b06":[8,0,0,1,0,3,0], +"conftest_8py.html":[8,0,0,2,1], +"constants_8py.html":[8,0,0,1,6], +"constants_8py.html#a316c5a606e4440fb8224c6544c3a15f0":[8,0,0,1,6,1], +"constants_8py.html#af198b5d1fc2f44657a2061aa324af3e0":[8,0,0,1,6,0], +"dir_063e2d5fe58a131099a7fe4200cca78c.html":[8,0,0,2], +"dir_1648a057408aae8db85b8e3797335623.html":[8,0,0,0], +"dir_624fa2a8bce97f0444ac5cca335d4e23.html":[8,0,0,1,0], +"dir_b3b22d2ab7966b65f6b237e3231b41be.html":[8,0,0], +"dir_f88c3381c1861b3f7ca1f3d63cf244b5.html":[8,0,0,1], +"doc__commands_8py.html":[8,0,0,1,0,4], +"doc__commands_8py.html#a2006ab13bff718ef783868a910c0b704":[8,0,0,1,0,4,1], +"doc__commands_8py.html#a3e42540047da37565afffeaf106cb948":[8,0,0,1,0,4,3], +"doc__commands_8py.html#a4daac68bc563432bf25c85dc78081a25":[8,0,0,1,0,4,0], +"doc__commands_8py.html#acc7f4ead1b11951d885fa5c151c2cbe0":[8,0,0,1,0,4,2], +"file__analyzer_8py.html":[8,0,0,1,7], +"file__analyzer_8py.html#af419a4965f079d58cac5a5281ddb1828":[8,0,0,1,7,1], +"files.html":[8,0], +"folder__analyzer_8py.html":[8,0,0,1,8], +"functions.html":[7,3,0], +"functions_func.html":[7,3,1], +"functions_vars.html":[7,3,2], +"git__analyzer_8py.html":[8,0,0,1,9], +"git__analyzer_8py.html#ac4ce143fdca789a79c66852c37d7363a":[8,0,0,1,9,1], +"hierarchy.html":[7,2], +"hook__commands_8py.html":[8,0,0,1,0,5], +"hook__commands_8py.html#a6a45aad71c8d32ce11a6dff8cee8bee7":[8,0,0,1,0,5,3], +"hook__commands_8py.html#a81543eb5fa835fd1237f24e8bce6201d":[8,0,0,1,0,5,1], +"hook__commands_8py.html#adff8f5d3bf1c3795974a391ee95b72b2":[8,0,0,1,0,5,0], +"hook__commands_8py.html#ae82fd46e5a9219da1478b0476b8214b1":[8,0,0,1,0,5,2], +"index.html":[], +"jira__client_8py.html":[8,0,0,1,10] +}; diff --git a/docs/html/navtreeindex1.js b/docs/html/navtreeindex1.js new file mode 100644 index 0000000..f9245fe --- /dev/null +++ b/docs/html/navtreeindex1.js @@ -0,0 +1,253 @@ +var NAVTREEINDEX1 = +{ +"jira__client_8py.html#a5593ea3415081eca1eea92e4c1ad1aa2":[8,0,0,1,10,1], +"llm__client_8py.html":[8,0,0,1,11], +"login__command_8py.html":[8,0,0,1,12], +"login__command_8py.html#aae63db4c484797bead34b7d874020c6a":[8,0,0,1,12,1], +"login__command_8py.html#ae4bf932fbafeff834b0a0c5a37f74ccd":[8,0,0,1,12,0], +"main_8py.html":[8,0,0,1,13], +"main_8py.html#a16838b20df4bd14ee4b5e1dd2906738f":[8,0,0,1,13,0], +"md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_README.html":[5], +"md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_README.html#autotoc_md157":[5,0], +"md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_README.html#autotoc_md158":[5,1], +"md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_README.html#autotoc_md159":[5,2], +"md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_README.html#autotoc_md160":[5,3], +"md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_README.html#autotoc_md161":[5,3,0], +"md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_README.html#autotoc_md162":[5,3,1], +"md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_README.html#autotoc_md163":[5,4], +"md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_README.html#autotoc_md164":[5,4,0], +"md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_README.html#autotoc_md165":[5,4,1], +"md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_README.html#autotoc_md166":[5,4,2], +"md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_README.html#autotoc_md167":[5,5], +"md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_README.html#autotoc_md168":[5,6], +"md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_README.html#autotoc_md169":[5,7], +"md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_README.html#autotoc_md170":[5,8], +"md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_README.html#autotoc_md171":[5,8,0], +"md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_README.html#autotoc_md172":[5,9], +"md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_README.html#autotoc_md173":[5,10], +"md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_README.html#autotoc_md174":[5,11], +"md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_README.html#autotoc_md175":[5,12], +"md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_README.html#autotoc_md176":[5,13], +"md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_commit_commands.html":[0], +"md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_commit_commands.html#autotoc_md1":[0,0], +"md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_commit_commands.html#autotoc_md10":[0,2,3], +"md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_commit_commands.html#autotoc_md11":[0,3], +"md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_commit_commands.html#autotoc_md12":[0,3,0], +"md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_commit_commands.html#autotoc_md13":[0,3,1], +"md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_commit_commands.html#autotoc_md14":[0,4], +"md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_commit_commands.html#autotoc_md15":[0,5], +"md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_commit_commands.html#autotoc_md16":[0,5,0], +"md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_commit_commands.html#autotoc_md17":[0,5,1], +"md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_commit_commands.html#autotoc_md18":[0,6], +"md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_commit_commands.html#autotoc_md19":[0,6,0], +"md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_commit_commands.html#autotoc_md2":[0,1], +"md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_commit_commands.html#autotoc_md3":[0,1,0], +"md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_commit_commands.html#autotoc_md4":[0,1,1], +"md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_commit_commands.html#autotoc_md5":[0,1,2], +"md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_commit_commands.html#autotoc_md6":[0,2], +"md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_commit_commands.html#autotoc_md7":[0,2,0], +"md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_commit_commands.html#autotoc_md8":[0,2,1], +"md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_commit_commands.html#autotoc_md9":[0,2,2], +"md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_config_commands.html":[1], +"md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_config_commands.html#autotoc_md21":[1,0], +"md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_config_commands.html#autotoc_md22":[1,1], +"md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_config_commands.html#autotoc_md23":[1,2], +"md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_config_commands.html#autotoc_md24":[1,2,0], +"md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_config_commands.html#autotoc_md25":[1,2,1], +"md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_config_commands.html#autotoc_md26":[1,2,1,0], +"md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_config_commands.html#autotoc_md27":[1,2,1,1], +"md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_config_commands.html#autotoc_md28":[1,2,1,2], +"md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_config_commands.html#autotoc_md29":[1,2,1,3], +"md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_config_commands.html#autotoc_md30":[1,2,2], +"md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_config_commands.html#autotoc_md31":[1,3], +"md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_config_commands.html#autotoc_md32":[1,3,0], +"md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_config_commands.html#autotoc_md33":[1,3,1], +"md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_config_commands.html#autotoc_md34":[1,3,2], +"md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_config_commands.html#autotoc_md35":[1,4], +"md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_config_commands.html#autotoc_md36":[1,5], +"md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_config_commands.html#autotoc_md37":[1,6], +"md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_config_commands.html#autotoc_md38":[1,7], +"md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_config_commands.html#autotoc_md39":[1,8], +"md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_config_commands.html#autotoc_md40":[1,8,0], +"md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_detailed_usage.html":[2], +"md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_detailed_usage.html#autotoc_md42":[2,0], +"md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_detailed_usage.html#autotoc_md43":[2,1], +"md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_detailed_usage.html#autotoc_md44":[2,1,0], +"md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_detailed_usage.html#autotoc_md45":[2,1,1], +"md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_detailed_usage.html#autotoc_md46":[2,1,2], +"md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_detailed_usage.html#autotoc_md47":[2,2], +"md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_detailed_usage.html#autotoc_md48":[2,3], +"md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_detailed_usage.html#autotoc_md49":[2,4], +"md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_detailed_usage.html#autotoc_md50":[2,4,0], +"md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_detailed_usage.html#autotoc_md51":[2,4,1], +"md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_detailed_usage.html#autotoc_md52":[2,5], +"md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_detailed_usage.html#autotoc_md53":[2,6], +"md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_detailed_usage.html#autotoc_md54":[2,6,0], +"md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_detailed_usage.html#autotoc_md55":[2,6,1], +"md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_detailed_usage.html#autotoc_md56":[2,7], +"md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_detailed_usage.html#autotoc_md57":[2,7,0], +"md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_detailed_usage.html#autotoc_md58":[2,7,1], +"md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_detailed_usage.html#autotoc_md59":[2,8], +"md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_detailed_usage.html#autotoc_md60":[2,8,0], +"md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_detailed_usage.html#autotoc_md61":[2,8,1], +"md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_detailed_usage.html#autotoc_md62":[2,8,2], +"md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_doc_commands.html":[3], +"md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_doc_commands.html#autotoc_md100":[3,6,0], +"md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_doc_commands.html#autotoc_md101":[3,6,1], +"md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_doc_commands.html#autotoc_md102":[3,6,2], +"md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_doc_commands.html#autotoc_md64":[3,0], +"md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_doc_commands.html#autotoc_md65":[3,1], +"md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_doc_commands.html#autotoc_md66":[3,2], +"md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_doc_commands.html#autotoc_md67":[3,2,0], +"md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_doc_commands.html#autotoc_md68":[3,2,1], +"md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_doc_commands.html#autotoc_md69":[3,2,1,0], +"md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_doc_commands.html#autotoc_md70":[3,2,1,1], +"md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_doc_commands.html#autotoc_md71":[3,3], +"md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_doc_commands.html#autotoc_md72":[3,3,0], +"md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_doc_commands.html#autotoc_md73":[3,3,1], +"md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_doc_commands.html#autotoc_md74":[3,3,2], +"md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_doc_commands.html#autotoc_md75":[3,3,3], +"md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_doc_commands.html#autotoc_md76":[3,3,4], +"md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_doc_commands.html#autotoc_md77":[3,3,5], +"md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_doc_commands.html#autotoc_md78":[3,3,6], +"md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_doc_commands.html#autotoc_md79":[3,4], +"md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_doc_commands.html#autotoc_md80":[3,4,0], +"md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_doc_commands.html#autotoc_md81":[3,4,0,0], +"md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_doc_commands.html#autotoc_md82":[3,4,0,1], +"md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_doc_commands.html#autotoc_md83":[3,4,0,2], +"md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_doc_commands.html#autotoc_md84":[3,4,0,3], +"md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_doc_commands.html#autotoc_md85":[3,4,0,4], +"md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_doc_commands.html#autotoc_md86":[3,4,1], +"md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_doc_commands.html#autotoc_md87":[3,4,1,0], +"md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_doc_commands.html#autotoc_md88":[3,4,1,1], +"md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_doc_commands.html#autotoc_md89":[3,4,2], +"md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_doc_commands.html#autotoc_md90":[3,4,2,0], +"md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_doc_commands.html#autotoc_md91":[3,4,2,1], +"md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_doc_commands.html#autotoc_md92":[3,4,2,2], +"md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_doc_commands.html#autotoc_md93":[3,4,2,3], +"md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_doc_commands.html#autotoc_md94":[3,5], +"md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_doc_commands.html#autotoc_md95":[3,5,0], +"md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_doc_commands.html#autotoc_md96":[3,5,1], +"md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_doc_commands.html#autotoc_md97":[3,5,2], +"md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_doc_commands.html#autotoc_md98":[3,5,3], +"md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_doc_commands.html#autotoc_md99":[3,6], +"md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_example_workflows.html":[4], +"md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_example_workflows.html#autotoc_md104":[4,0], +"md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_example_workflows.html#autotoc_md105":[4,0,0], +"md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_example_workflows.html#autotoc_md106":[4,0,1], +"md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_example_workflows.html#autotoc_md107":[4,0,2], +"md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_example_workflows.html#autotoc_md108":[4,1], +"md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_example_workflows.html#autotoc_md109":[4,1,0], +"md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_example_workflows.html#autotoc_md110":[4,1,1], +"md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_example_workflows.html#autotoc_md111":[4,1,2], +"md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_example_workflows.html#autotoc_md112":[4,1,3], +"md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_example_workflows.html#autotoc_md113":[4,2], +"md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_example_workflows.html#autotoc_md114":[4,2,0], +"md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_example_workflows.html#autotoc_md115":[4,2,1], +"md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_example_workflows.html#autotoc_md116":[4,2,2], +"md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_example_workflows.html#autotoc_md117":[4,3], +"md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_example_workflows.html#autotoc_md118":[4,3,0], +"md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_example_workflows.html#autotoc_md119":[4,3,1], +"md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_example_workflows.html#autotoc_md120":[4,3,2], +"md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_example_workflows.html#autotoc_md121":[4,4], +"md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_example_workflows.html#autotoc_md122":[4,4,0], +"namespacemembers.html":[6,1,0], +"namespacemembers_func.html":[6,1,1], +"namespacemembers_vars.html":[6,1,2], +"namespacepenify__hook.html":[6,0,0], +"namespacepenify__hook_1_1api__client.html":[6,0,0,0], +"namespacepenify__hook_1_1base__analyzer.html":[6,0,0,1], +"namespacepenify__hook_1_1commands.html":[6,0,0,2], +"namespacepenify__hook_1_1commands_1_1auth__commands.html":[6,0,0,2,0], +"namespacepenify__hook_1_1commands_1_1auth__commands.html#a78f375c58bb6f69f98675e6a9ac84655":[6,0,0,2,0,0], +"namespacepenify__hook_1_1commands_1_1auth__commands.html#aa3956ca1749d4218ea1dc6e5b6218b24":[6,0,0,2,0,1], +"namespacepenify__hook_1_1commands_1_1commit__commands.html":[6,0,0,2,1], +"namespacepenify__hook_1_1commands_1_1commit__commands.html#a62564c4e8ad59fc46d56cb0f9122a71a":[6,0,0,2,1,0], +"namespacepenify__hook_1_1commands_1_1commit__commands.html#a8627583116eb78e31a4d3cdc16d2f15c":[6,0,0,2,1,2], +"namespacepenify__hook_1_1commands_1_1commit__commands.html#af4f739f524c38b437e4e47673d683e23":[6,0,0,2,1,1], +"namespacepenify__hook_1_1commands_1_1config__commands.html":[6,0,0,2,2], +"namespacepenify__hook_1_1commands_1_1config__commands.html#a152642ab83cf6219b604bda6122aba67":[6,0,0,2,2,10], +"namespacepenify__hook_1_1commands_1_1config__commands.html#a15bf3685c4dcb5c15ba6a4055e484cf2":[6,0,0,2,2,3], +"namespacepenify__hook_1_1commands_1_1config__commands.html#a185dfc34a655ed80e6c95939b6f3c35c":[6,0,0,2,2,1], +"namespacepenify__hook_1_1commands_1_1config__commands.html#a3caf2b062dd33b1f1d7ddc7224f0ff87":[6,0,0,2,2,2], +"namespacepenify__hook_1_1commands_1_1config__commands.html#a4617bc5956e502c9555dc0dda0376df4":[6,0,0,2,2,9], +"namespacepenify__hook_1_1commands_1_1config__commands.html#a4b202072a3a3b8515c9c254622e9c880":[6,0,0,2,2,11], +"namespacepenify__hook_1_1commands_1_1config__commands.html#a5503d51c905e2f1b299b12d2a73bd812":[6,0,0,2,2,6], +"namespacepenify__hook_1_1commands_1_1config__commands.html#a6492bc8e7df6e38bb06ad05e572d4cc0":[6,0,0,2,2,4], +"namespacepenify__hook_1_1commands_1_1config__commands.html#a6559a82d0bf727703d550d1003d3ed20":[6,0,0,2,2,5], +"namespacepenify__hook_1_1commands_1_1config__commands.html#aabe277132ce0bc0aacef951cf1dee2ae":[6,0,0,2,2,7], +"namespacepenify__hook_1_1commands_1_1config__commands.html#ab2486ac2bf16b4a671e49625bfa4f9b4":[6,0,0,2,2,8], +"namespacepenify__hook_1_1commands_1_1config__commands.html#af115198ea5d6808ccb98733957f50b06":[6,0,0,2,2,0], +"namespacepenify__hook_1_1commands_1_1doc__commands.html":[6,0,0,2,3], +"namespacepenify__hook_1_1commands_1_1doc__commands.html#a2006ab13bff718ef783868a910c0b704":[6,0,0,2,3,1], +"namespacepenify__hook_1_1commands_1_1doc__commands.html#a3e42540047da37565afffeaf106cb948":[6,0,0,2,3,3], +"namespacepenify__hook_1_1commands_1_1doc__commands.html#a4daac68bc563432bf25c85dc78081a25":[6,0,0,2,3,0], +"namespacepenify__hook_1_1commands_1_1doc__commands.html#acc7f4ead1b11951d885fa5c151c2cbe0":[6,0,0,2,3,2], +"namespacepenify__hook_1_1commands_1_1hook__commands.html":[6,0,0,2,4], +"namespacepenify__hook_1_1commands_1_1hook__commands.html#a6a45aad71c8d32ce11a6dff8cee8bee7":[6,0,0,2,4,3], +"namespacepenify__hook_1_1commands_1_1hook__commands.html#a81543eb5fa835fd1237f24e8bce6201d":[6,0,0,2,4,1], +"namespacepenify__hook_1_1commands_1_1hook__commands.html#adff8f5d3bf1c3795974a391ee95b72b2":[6,0,0,2,4,0], +"namespacepenify__hook_1_1commands_1_1hook__commands.html#ae82fd46e5a9219da1478b0476b8214b1":[6,0,0,2,4,2], +"namespacepenify__hook_1_1commit__analyzer.html":[6,0,0,3], +"namespacepenify__hook_1_1config__command.html":[6,0,0,4], +"namespacepenify__hook_1_1config__command.html#a240e5331681eb574ac319d7458783bde":[6,0,0,4,0], +"namespacepenify__hook_1_1config__command.html#a4f3eb92164a69df1446d745f8a09285e":[6,0,0,4,1], +"namespacepenify__hook_1_1constants.html":[6,0,0,5], +"namespacepenify__hook_1_1constants.html#a316c5a606e4440fb8224c6544c3a15f0":[6,0,0,5,1], +"namespacepenify__hook_1_1constants.html#af198b5d1fc2f44657a2061aa324af3e0":[6,0,0,5,0], +"namespacepenify__hook_1_1file__analyzer.html":[6,0,0,6], +"namespacepenify__hook_1_1file__analyzer.html#af419a4965f079d58cac5a5281ddb1828":[6,0,0,6,1], +"namespacepenify__hook_1_1folder__analyzer.html":[6,0,0,7], +"namespacepenify__hook_1_1git__analyzer.html":[6,0,0,8], +"namespacepenify__hook_1_1git__analyzer.html#ac4ce143fdca789a79c66852c37d7363a":[6,0,0,8,1], +"namespacepenify__hook_1_1jira__client.html":[6,0,0,9], +"namespacepenify__hook_1_1jira__client.html#a5593ea3415081eca1eea92e4c1ad1aa2":[6,0,0,9,1], +"namespacepenify__hook_1_1llm__client.html":[6,0,0,10], +"namespacepenify__hook_1_1login__command.html":[6,0,0,11], +"namespacepenify__hook_1_1login__command.html#aae63db4c484797bead34b7d874020c6a":[6,0,0,11,1], +"namespacepenify__hook_1_1login__command.html#ae4bf932fbafeff834b0a0c5a37f74ccd":[6,0,0,11,0], +"namespacepenify__hook_1_1main.html":[6,0,0,12], +"namespacepenify__hook_1_1main.html#a16838b20df4bd14ee4b5e1dd2906738f":[6,0,0,12,0], +"namespacepenify__hook_1_1ui__utils.html":[6,0,0,13], +"namespacepenify__hook_1_1ui__utils.html#a0a6fd2613c6fe053b6e4356cd9e5cda2":[6,0,0,13,7], +"namespacepenify__hook_1_1ui__utils.html#a12b92532b1458af94f3649d411b5505c":[6,0,0,13,0], +"namespacepenify__hook_1_1ui__utils.html#a177bc9b44157844c999e0c1c2c6936ff":[6,0,0,13,24], +"namespacepenify__hook_1_1ui__utils.html#a1ffbb9671dbe233770268e2dd66a67fa":[6,0,0,13,13], +"namespacepenify__hook_1_1ui__utils.html#a22c450c5e2b5394618ecf9b636560df4":[6,0,0,13,22], +"namespacepenify__hook_1_1ui__utils.html#a2b16aa6b68a9edea5f29f84f1c4be79a":[6,0,0,13,12], +"namespacepenify__hook_1_1ui__utils.html#a3b208e2750a38dd09467a73e4afd9756":[6,0,0,13,21], +"namespacepenify__hook_1_1ui__utils.html#a3c6fe4bd17c1a5fe76587225ae4beb3e":[6,0,0,13,23], +"namespacepenify__hook_1_1ui__utils.html#a3da02cd1140179a9ce60f62c85fccfef":[6,0,0,13,1], +"namespacepenify__hook_1_1ui__utils.html#a4ab4e61dfab7973c87bef59c6e1977fe":[6,0,0,13,16], +"namespacepenify__hook_1_1ui__utils.html#a4dd934568897433fa73f9cc182ac4a3e":[6,0,0,13,2], +"namespacepenify__hook_1_1ui__utils.html#a532cdb4de7c679ce8b29c3e9116c4776":[6,0,0,13,6], +"namespacepenify__hook_1_1ui__utils.html#a5a7340d0fc60fb80f17514d60bf45f1d":[6,0,0,13,14], +"namespacepenify__hook_1_1ui__utils.html#a6eaea98f1a8cbe16a181647da2fc0a16":[6,0,0,13,25], +"namespacepenify__hook_1_1ui__utils.html#a6f0acd7dd91abfe67d0807803bc3b65f":[6,0,0,13,8], +"namespacepenify__hook_1_1ui__utils.html#a811f0adf6e9bf71510c379b6fa155e44":[6,0,0,13,9], +"namespacepenify__hook_1_1ui__utils.html#a92c3e466d1912058167be2eacf85b9f6":[6,0,0,13,5], +"namespacepenify__hook_1_1ui__utils.html#a9fdcb180915696f5d217032a62c3857c":[6,0,0,13,19], +"namespacepenify__hook_1_1ui__utils.html#aa564e1e1d016c8227d076542e74cecb0":[6,0,0,13,17], +"namespacepenify__hook_1_1ui__utils.html#aa6e684c00e26199440137a87ed9b195c":[6,0,0,13,11], +"namespacepenify__hook_1_1ui__utils.html#ab560cfade398ac1e0bd47befb52d9f71":[6,0,0,13,15], +"namespacepenify__hook_1_1ui__utils.html#aba01b8259f0d66cdc2b4a1b58f9736fc":[6,0,0,13,18], +"namespacepenify__hook_1_1ui__utils.html#aca0fcee81606857497520ae4290bc9f5":[6,0,0,13,20], +"namespacepenify__hook_1_1ui__utils.html#adcb97fc26b405d2b9cdf5eb7aecc5452":[6,0,0,13,4], +"namespacepenify__hook_1_1ui__utils.html#adfcbbfe39029ab6d1dd33e7bf75ae115":[6,0,0,13,10], +"namespacepenify__hook_1_1ui__utils.html#af3441fb3c2c3850b8b3b6455a9fdaba4":[6,0,0,13,3], +"namespacepenify__hook_1_1utils.html":[6,0,0,14], +"namespacepenify__hook_1_1utils.html#a0c0c1ed6b197038085c94a90ceedfb01":[6,0,0,14,4], +"namespacepenify__hook_1_1utils.html#a4ec5335a4026c22a34a3a8ccf665a5f2":[6,0,0,14,1], +"namespacepenify__hook_1_1utils.html#a95c3f9c80860d6a2e2d061d2fb660a3f":[6,0,0,14,3], +"namespacepenify__hook_1_1utils.html#ae236f3c4c8bf5dcddbb92b4c2065eea3":[6,0,0,14,2], +"namespaces.html":[6,0], +"namespacesetup.html":[6,0,1], +"namespacesetup.html#a2aa722b36a933088812b50ea79b97a5c":[6,0,1,12], +"namespacesetup.html#a3796ea10c998699d07d391414ff5d720":[6,0,1,7], +"namespacesetup.html#a3a57a4772d418a06835249cbade0d86a":[6,0,1,0], +"namespacesetup.html#a4cda9dbfb952875376a0749fe08a5bde":[6,0,1,6], +"namespacesetup.html#a5b08034343aa2be607722a8b315f3625":[6,0,1,1], +"namespacesetup.html#aa7ca7bc9391b217e81efeb03689d8dbf":[6,0,1,10], +"namespacesetup.html#ab3a7a0638d76a01367c5bc3cc699447f":[6,0,1,8], +"namespacesetup.html#abe96a9c38c1c61f9f0fdb002c482f785":[6,0,1,2] +}; diff --git a/docs/html/navtreeindex2.js b/docs/html/navtreeindex2.js new file mode 100644 index 0000000..8e18872 --- /dev/null +++ b/docs/html/navtreeindex2.js @@ -0,0 +1,90 @@ +var NAVTREEINDEX2 = +{ +"namespacesetup.html#abead4f26b530856f858f0d44c7cf2588":[6,0,1,5], +"namespacesetup.html#ada7058afc98897f073d3f3b8b9157059":[6,0,1,4], +"namespacesetup.html#aedf461ec52a946bda975938ba0b93ec0":[6,0,1,3], +"namespacesetup.html#afc13124aa5c0124e84e1d965e3f4b0fb":[6,0,1,11], +"namespacesetup.html#aff2375a361fd5865c77bd9aa093be747":[6,0,1,9], +"namespacetests.html":[6,0,2], +"namespacetests_1_1conftest.html":[6,0,2,0], +"namespacetests_1_1test__commit__commands.html":[6,0,2,1], +"namespacetests_1_1test__config__commands.html":[6,0,2,2], +"namespacetests_1_1test__doc__commands.html":[6,0,2,3], +"namespacetests_1_1test__doc__commands.html#a0e74c920f258f442914771164fe26b45":[6,0,2,3,1], +"namespacetests_1_1test__doc__commands.html#a0f27751d0ba2acfe40ef7e85bccf47d7":[6,0,2,3,10], +"namespacetests_1_1test__doc__commands.html#a1458af9ad0128c3ca1263b552fd5e482":[6,0,2,3,9], +"namespacetests_1_1test__doc__commands.html#a335e7fd4912192c7276cf31bbebc6eb0":[6,0,2,3,4], +"namespacetests_1_1test__doc__commands.html#a4bb75610e40d94d42bc169b25403c186":[6,0,2,3,2], +"namespacetests_1_1test__doc__commands.html#a64165ddfdb3071a88422f080f0e529a3":[6,0,2,3,5], +"namespacetests_1_1test__doc__commands.html#a806110833eb0aad547156faf014b31d8":[6,0,2,3,3], +"namespacetests_1_1test__doc__commands.html#ab158ffa48469b6c097a7a55fcb20c21a":[6,0,2,3,6], +"namespacetests_1_1test__doc__commands.html#ab74688baa8c9b5ba302c2877a9789d05":[6,0,2,3,7], +"namespacetests_1_1test__doc__commands.html#aec76cc25c23476794234cdadbcaef0c0":[6,0,2,3,0], +"namespacetests_1_1test__doc__commands.html#af9b01e5fc89255cac96747fa081c442c":[6,0,2,3,8], +"namespacetests_1_1test__web__config.html":[6,0,2,4], +"pages.html":[], +"penify__hook_2____init_____8py.html":[8,0,0,1,1], +"penify__hook_2commands_2____init_____8py.html":[8,0,0,1,0,0], +"setup_8py.html":[8,0,0,3], +"setup_8py.html#a2aa722b36a933088812b50ea79b97a5c":[8,0,0,3,12], +"setup_8py.html#a3796ea10c998699d07d391414ff5d720":[8,0,0,3,7], +"setup_8py.html#a3a57a4772d418a06835249cbade0d86a":[8,0,0,3,0], +"setup_8py.html#a4cda9dbfb952875376a0749fe08a5bde":[8,0,0,3,6], +"setup_8py.html#a5b08034343aa2be607722a8b315f3625":[8,0,0,3,1], +"setup_8py.html#aa7ca7bc9391b217e81efeb03689d8dbf":[8,0,0,3,10], +"setup_8py.html#ab3a7a0638d76a01367c5bc3cc699447f":[8,0,0,3,8], +"setup_8py.html#abe96a9c38c1c61f9f0fdb002c482f785":[8,0,0,3,2], +"setup_8py.html#abead4f26b530856f858f0d44c7cf2588":[8,0,0,3,5], +"setup_8py.html#ada7058afc98897f073d3f3b8b9157059":[8,0,0,3,4], +"setup_8py.html#aedf461ec52a946bda975938ba0b93ec0":[8,0,0,3,3], +"setup_8py.html#afc13124aa5c0124e84e1d965e3f4b0fb":[8,0,0,3,11], +"setup_8py.html#aff2375a361fd5865c77bd9aa093be747":[8,0,0,3,9], +"test__commit__commands_8py.html":[8,0,0,2,2], +"test__config__commands_8py.html":[8,0,0,2,3], +"test__doc__commands_8py.html":[8,0,0,2,4], +"test__doc__commands_8py.html#a0e74c920f258f442914771164fe26b45":[8,0,0,2,4,1], +"test__doc__commands_8py.html#a0f27751d0ba2acfe40ef7e85bccf47d7":[8,0,0,2,4,10], +"test__doc__commands_8py.html#a1458af9ad0128c3ca1263b552fd5e482":[8,0,0,2,4,9], +"test__doc__commands_8py.html#a335e7fd4912192c7276cf31bbebc6eb0":[8,0,0,2,4,4], +"test__doc__commands_8py.html#a4bb75610e40d94d42bc169b25403c186":[8,0,0,2,4,2], +"test__doc__commands_8py.html#a64165ddfdb3071a88422f080f0e529a3":[8,0,0,2,4,5], +"test__doc__commands_8py.html#a806110833eb0aad547156faf014b31d8":[8,0,0,2,4,3], +"test__doc__commands_8py.html#ab158ffa48469b6c097a7a55fcb20c21a":[8,0,0,2,4,6], +"test__doc__commands_8py.html#ab74688baa8c9b5ba302c2877a9789d05":[8,0,0,2,4,7], +"test__doc__commands_8py.html#aec76cc25c23476794234cdadbcaef0c0":[8,0,0,2,4,0], +"test__doc__commands_8py.html#af9b01e5fc89255cac96747fa081c442c":[8,0,0,2,4,8], +"test__web__config_8py.html":[8,0,0,2,5], +"tests_2____init_____8py.html":[8,0,0,2,0], +"ui__utils_8py.html":[8,0,0,1,14], +"ui__utils_8py.html#a0a6fd2613c6fe053b6e4356cd9e5cda2":[8,0,0,1,14,7], +"ui__utils_8py.html#a12b92532b1458af94f3649d411b5505c":[8,0,0,1,14,0], +"ui__utils_8py.html#a177bc9b44157844c999e0c1c2c6936ff":[8,0,0,1,14,24], +"ui__utils_8py.html#a1ffbb9671dbe233770268e2dd66a67fa":[8,0,0,1,14,13], +"ui__utils_8py.html#a22c450c5e2b5394618ecf9b636560df4":[8,0,0,1,14,22], +"ui__utils_8py.html#a2b16aa6b68a9edea5f29f84f1c4be79a":[8,0,0,1,14,12], +"ui__utils_8py.html#a3b208e2750a38dd09467a73e4afd9756":[8,0,0,1,14,21], +"ui__utils_8py.html#a3c6fe4bd17c1a5fe76587225ae4beb3e":[8,0,0,1,14,23], +"ui__utils_8py.html#a3da02cd1140179a9ce60f62c85fccfef":[8,0,0,1,14,1], +"ui__utils_8py.html#a4ab4e61dfab7973c87bef59c6e1977fe":[8,0,0,1,14,16], +"ui__utils_8py.html#a4dd934568897433fa73f9cc182ac4a3e":[8,0,0,1,14,2], +"ui__utils_8py.html#a532cdb4de7c679ce8b29c3e9116c4776":[8,0,0,1,14,6], +"ui__utils_8py.html#a5a7340d0fc60fb80f17514d60bf45f1d":[8,0,0,1,14,14], +"ui__utils_8py.html#a6eaea98f1a8cbe16a181647da2fc0a16":[8,0,0,1,14,25], +"ui__utils_8py.html#a6f0acd7dd91abfe67d0807803bc3b65f":[8,0,0,1,14,8], +"ui__utils_8py.html#a811f0adf6e9bf71510c379b6fa155e44":[8,0,0,1,14,9], +"ui__utils_8py.html#a92c3e466d1912058167be2eacf85b9f6":[8,0,0,1,14,5], +"ui__utils_8py.html#a9fdcb180915696f5d217032a62c3857c":[8,0,0,1,14,19], +"ui__utils_8py.html#aa564e1e1d016c8227d076542e74cecb0":[8,0,0,1,14,17], +"ui__utils_8py.html#aa6e684c00e26199440137a87ed9b195c":[8,0,0,1,14,11], +"ui__utils_8py.html#ab560cfade398ac1e0bd47befb52d9f71":[8,0,0,1,14,15], +"ui__utils_8py.html#aba01b8259f0d66cdc2b4a1b58f9736fc":[8,0,0,1,14,18], +"ui__utils_8py.html#aca0fcee81606857497520ae4290bc9f5":[8,0,0,1,14,20], +"ui__utils_8py.html#adcb97fc26b405d2b9cdf5eb7aecc5452":[8,0,0,1,14,4], +"ui__utils_8py.html#adfcbbfe39029ab6d1dd33e7bf75ae115":[8,0,0,1,14,10], +"ui__utils_8py.html#af3441fb3c2c3850b8b3b6455a9fdaba4":[8,0,0,1,14,3], +"utils_8py.html":[8,0,0,1,15], +"utils_8py.html#a0c0c1ed6b197038085c94a90ceedfb01":[8,0,0,1,15,4], +"utils_8py.html#a4ec5335a4026c22a34a3a8ccf665a5f2":[8,0,0,1,15,1], +"utils_8py.html#a95c3f9c80860d6a2e2d061d2fb660a3f":[8,0,0,1,15,3], +"utils_8py.html#ae236f3c4c8bf5dcddbb92b4c2065eea3":[8,0,0,1,15,2] +}; diff --git a/docs/html/open.png b/docs/html/open.png new file mode 100644 index 0000000000000000000000000000000000000000..30f75c7efe2dd0c9e956e35b69777a02751f048b GIT binary patch literal 123 zcmeAS@N?(olHy`uVBq!ia0vp^oFL4>1|%O$WD@{VPM$7~Ar*{o?;hlAFyLXmaDC0y znK1_#cQqJWPES%4Uujug^TE?jMft$}Eq^WaR~)%f)vSNs&gek&x%A9X9sM + + + + + + + + + + + + + + + + + +penify-cli: Related Pages + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    penify-cli +
    +
    +
    + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    +
    Related Pages
    +
    + +
    + + + + + diff --git a/docs/html/penify-cli-documentation_8md.html b/docs/html/penify-cli-documentation_8md.html new file mode 100644 index 0000000..7461154 --- /dev/null +++ b/docs/html/penify-cli-documentation_8md.html @@ -0,0 +1,130 @@ + + + + + + + + + + + + + + + + + + +penify-cli: /tmp/github_reposRepoArchDocGenContext/Penify-dev/penify-cli/docs/penify-cli-documentation.md File Reference + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    penify-cli +
    +
    +
    + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    +
    /tmp/github_reposRepoArchDocGenContext/Penify-dev/penify-cli/docs/penify-cli-documentation.md File Reference
    +
    +
    +
    +
    + + + + + diff --git a/docs/html/penify__hook_2____init_____8py.html b/docs/html/penify__hook_2____init_____8py.html new file mode 100644 index 0000000..efe0016 --- /dev/null +++ b/docs/html/penify__hook_2____init_____8py.html @@ -0,0 +1,130 @@ + + + + + + + + + + + + + + + + + + +penify-cli: /tmp/github_reposRepoArchDocGenContext/Penify-dev/penify-cli/penify_hook/__init__.py File Reference + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    penify-cli +
    +
    +
    + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    +
    __init__.py File Reference
    +
    +
    +
    +
    + + + + + diff --git a/docs/html/penify__hook_2commands_2____init_____8py.html b/docs/html/penify__hook_2commands_2____init_____8py.html new file mode 100644 index 0000000..c4937cc --- /dev/null +++ b/docs/html/penify__hook_2commands_2____init_____8py.html @@ -0,0 +1,140 @@ + + + + + + + + + + + + + + + + + + +penify-cli: /tmp/github_reposRepoArchDocGenContext/Penify-dev/penify-cli/penify_hook/commands/__init__.py File Reference + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    penify-cli +
    +
    +
    + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    + +
    __init__.py File Reference
    +
    +
    + + + + + + +

    +Namespaces

    namespace  penify_hook
     
    namespace  penify_hook.commands
     
    +
    +
    + + + + + diff --git a/docs/html/resize.js b/docs/html/resize.js new file mode 100644 index 0000000..7fe30d1 --- /dev/null +++ b/docs/html/resize.js @@ -0,0 +1,150 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file + */ +function initResizable() +{ + var cookie_namespace = 'doxygen'; + var sidenav,navtree,content,header,collapsed,collapsedWidth=0,barWidth=6,desktop_vp=768,titleHeight; + + function readCookie(cookie) + { + var myCookie = cookie_namespace+"_"+cookie+"="; + if (document.cookie) { + var index = document.cookie.indexOf(myCookie); + if (index != -1) { + var valStart = index + myCookie.length; + var valEnd = document.cookie.indexOf(";", valStart); + if (valEnd == -1) { + valEnd = document.cookie.length; + } + var val = document.cookie.substring(valStart, valEnd); + return val; + } + } + return 0; + } + + function writeCookie(cookie, val, expiration) + { + if (val==undefined) return; + if (expiration == null) { + var date = new Date(); + date.setTime(date.getTime()+(10*365*24*60*60*1000)); // default expiration is one week + expiration = date.toGMTString(); + } + document.cookie = cookie_namespace + "_" + cookie + "=" + val + "; SameSite=Lax; expires=" + expiration+"; path=/"; + } + + function resizeWidth() + { + var windowWidth = $(window).width() + "px"; + var sidenavWidth = $(sidenav).outerWidth(); + content.css({marginLeft:parseInt(sidenavWidth)+"px"}); + writeCookie('width',sidenavWidth-barWidth, null); + } + + function restoreWidth(navWidth) + { + var windowWidth = $(window).width() + "px"; + content.css({marginLeft:parseInt(navWidth)+barWidth+"px"}); + sidenav.css({width:navWidth + "px"}); + } + + function resizeHeight() + { + var headerHeight = header.outerHeight(); + var footerHeight = footer.outerHeight(); + var windowHeight = $(window).height(); + var contentHeight,navtreeHeight,sideNavHeight; + if (typeof page_layout==='undefined' || page_layout==0) { /* DISABLE_INDEX=NO */ + contentHeight = windowHeight - headerHeight - footerHeight; + navtreeHeight = contentHeight; + sideNavHeight = contentHeight; + } else if (page_layout==1) { /* DISABLE_INDEX=YES */ + contentHeight = windowHeight - footerHeight; + navtreeHeight = windowHeight - headerHeight; + sideNavHeight = windowHeight; + } + content.css({height:contentHeight + "px"}); + navtree.css({height:navtreeHeight + "px"}); + sidenav.css({height:sideNavHeight + "px"}); + var width=$(window).width(); + if (width!=collapsedWidth) { + if (width=desktop_vp) { + if (!collapsed) { + collapseExpand(); + } + } else if (width>desktop_vp && collapsedWidth0) { + restoreWidth(0); + collapsed=true; + } + else { + var width = readCookie('width'); + if (width>200 && width<$(window).width()) { restoreWidth(width); } else { restoreWidth(200); } + collapsed=false; + } + } + + header = $("#top"); + sidenav = $("#side-nav"); + content = $("#doc-content"); + navtree = $("#nav-tree"); + footer = $("#nav-path"); + $(".side-nav-resizable").resizable({resize: function(e, ui) { resizeWidth(); } }); + $(sidenav).resizable({ minWidth: 0 }); + $(window).resize(function() { resizeHeight(); }); + var device = navigator.userAgent.toLowerCase(); + var touch_device = device.match(/(iphone|ipod|ipad|android)/); + if (touch_device) { /* wider split bar for touch only devices */ + $(sidenav).css({ paddingRight:'20px' }); + $('.ui-resizable-e').css({ width:'20px' }); + $('#nav-sync').css({ right:'34px' }); + barWidth=20; + } + var width = readCookie('width'); + if (width) { restoreWidth(width); } else { resizeWidth(); } + resizeHeight(); + var url = location.href; + var i=url.indexOf("#"); + if (i>=0) window.location.hash=url.substr(i); + var _preventDefault = function(evt) { evt.preventDefault(); }; + $("#splitbar").bind("dragstart", _preventDefault).bind("selectstart", _preventDefault); + $(".ui-resizable-handle").dblclick(collapseExpand); + $(window).on('load',resizeHeight); +} +/* @license-end */ diff --git a/docs/html/search/all_0.html b/docs/html/search/all_0.html new file mode 100644 index 0000000..bb9e364 --- /dev/null +++ b/docs/html/search/all_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/docs/html/search/all_0.js b/docs/html/search/all_0.js new file mode 100644 index 0000000..66bb827 --- /dev/null +++ b/docs/html/search/all_0.js @@ -0,0 +1,7 @@ +var searchData= +[ + ['_5f_5finit_5f_5f_0',['__init__',['../classpenify__hook_1_1api__client_1_1APIClient.html#ad9cb741a8baf2d13f845e25a36311086',1,'penify_hook.api_client.APIClient.__init__()'],['../classpenify__hook_1_1base__analyzer_1_1BaseAnalyzer.html#ab1296a3d1e9070d891801876b66f7344',1,'penify_hook.base_analyzer.BaseAnalyzer.__init__()'],['../classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook.html#af127d86729e226d74dbeb095b008db3e',1,'penify_hook.commit_analyzer.CommitDocGenHook.__init__()'],['../classpenify__hook_1_1file__analyzer_1_1FileAnalyzerGenHook.html#a190c473090b2a07e7cb43073a3211c4b',1,'penify_hook.file_analyzer.FileAnalyzerGenHook.__init__()'],['../classpenify__hook_1_1folder__analyzer_1_1FolderAnalyzerGenHook.html#a1bb0358140931d82c7616f12efe31821',1,'penify_hook.folder_analyzer.FolderAnalyzerGenHook.__init__()'],['../classpenify__hook_1_1git__analyzer_1_1GitDocGenHook.html#a92275fddb43dbef6dfdb6c1ed6e96d0c',1,'penify_hook.git_analyzer.GitDocGenHook.__init__()'],['../classpenify__hook_1_1jira__client_1_1JiraClient.html#a47efc1ec07389c960f2dfb37ba8c09f5',1,'penify_hook.jira_client.JiraClient.__init__()'],['../classpenify__hook_1_1llm__client_1_1LLMClient.html#a76d92354f585ab4bb291169f9f530764',1,'penify_hook.llm_client.LLMClient.__init__()']]], + ['_5f_5finit_5f_5f_2epy_1',['__init__.py',['../penify__hook_2____init_____8py.html',1,'(Global Namespace)'],['../penify__hook_2commands_2____init_____8py.html',1,'(Global Namespace)'],['../tests_2____init_____8py.html',1,'(Global Namespace)']]], + ['_5famend_5fcommit_2',['_amend_commit',['../classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook.html#ac999c5cbc852a7ec3b412ccb43c274ca',1,'penify_hook::commit_analyzer::CommitDocGenHook']]], + ['_5flitellm_3',['_litellm',['../classpenify__hook_1_1llm__client_1_1LLMClient.html#a76c2e9805f805624ab9c55a9f1f8d362',1,'penify_hook::llm_client::LLMClient']]] +]; diff --git a/docs/html/search/all_1.html b/docs/html/search/all_1.html new file mode 100644 index 0000000..8989416 --- /dev/null +++ b/docs/html/search/all_1.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/docs/html/search/all_1.js b/docs/html/search/all_1.js new file mode 100644 index 0000000..b6a2dbe --- /dev/null +++ b/docs/html/search/all_1.js @@ -0,0 +1,14 @@ +var searchData= +[ + ['add_5fcomment_0',['add_comment',['../classpenify__hook_1_1jira__client_1_1JiraClient.html#aa1f374116c64cd5f1492ec7f7e40f9c1',1,'penify_hook::jira_client::JiraClient']]], + ['api_5fclient_1',['api_client',['../classpenify__hook_1_1base__analyzer_1_1BaseAnalyzer.html#a81e9c55709205aaf4ebbe2b41683baf2',1,'penify_hook::base_analyzer::BaseAnalyzer']]], + ['api_5fclient_2epy_2',['api_client.py',['../api__client_8py.html',1,'']]], + ['api_5furl_3',['api_url',['../classpenify__hook_1_1api__client_1_1APIClient.html#a130cf688ed35dc0e8cbd8320b6b2d872',1,'penify_hook::api_client::APIClient']]], + ['api_5furl_4',['API_URL',['../namespacepenify__hook_1_1constants.html#af198b5d1fc2f44657a2061aa324af3e0',1,'penify_hook::constants']]], + ['apiclient_5',['APIClient',['../classpenify__hook_1_1api__client_1_1APIClient.html',1,'penify_hook::api_client']]], + ['auth_5fcommands_2epy_6',['auth_commands.py',['../auth__commands_8py.html',1,'']]], + ['auth_5ftoken_7',['AUTH_TOKEN',['../classpenify__hook_1_1api__client_1_1APIClient.html#a5bb502603717946ad710b49ad9d95237',1,'penify_hook::api_client::APIClient']]], + ['author_8',['author',['../namespacesetup.html#a3a57a4772d418a06835249cbade0d86a',1,'setup']]], + ['author_5femail_9',['author_email',['../namespacesetup.html#a5b08034343aa2be607722a8b315f3625',1,'setup']]], + ['autoreset_10',['autoreset',['../namespacepenify__hook_1_1ui__utils.html#ab560cfade398ac1e0bd47befb52d9f71',1,'penify_hook::ui_utils']]] +]; diff --git a/docs/html/search/all_10.html b/docs/html/search/all_10.html new file mode 100644 index 0000000..a7c1f9c --- /dev/null +++ b/docs/html/search/all_10.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/docs/html/search/all_10.js b/docs/html/search/all_10.js new file mode 100644 index 0000000..7fb377d --- /dev/null +++ b/docs/html/search/all_10.js @@ -0,0 +1,16 @@ +var searchData= +[ + ['save_5fcredentials_0',['save_credentials',['../namespacepenify__hook_1_1commands_1_1auth__commands.html#aa3956ca1749d4218ea1dc6e5b6218b24',1,'penify_hook::commands::auth_commands']]], + ['save_5fjira_5fconfig_1',['save_jira_config',['../namespacepenify__hook_1_1commands_1_1config__commands.html#ab2486ac2bf16b4a671e49625bfa4f9b4',1,'penify_hook::commands::config_commands']]], + ['save_5fllm_5fconfig_2',['save_llm_config',['../namespacepenify__hook_1_1commands_1_1config__commands.html#a4617bc5956e502c9555dc0dda0376df4',1,'penify_hook::commands::config_commands']]], + ['send_5ffile_5ffor_5fdocstring_5fgeneration_3',['send_file_for_docstring_generation',['../classpenify__hook_1_1api__client_1_1APIClient.html#ac5aad61508c2cafdf6e88e6c7d6c82b3',1,'penify_hook::api_client::APIClient']]], + ['setup_4',['setup',['../namespacesetup.html',1,'']]], + ['setup_2epy_5',['setup.py',['../setup_8py.html',1,'']]], + ['setup_5fcommit_5fparser_6',['setup_commit_parser',['../namespacepenify__hook_1_1commands_1_1commit__commands.html#a8627583116eb78e31a4d3cdc16d2f15c',1,'penify_hook::commands::commit_commands']]], + ['setup_5fconfig_5fparser_7',['setup_config_parser',['../namespacepenify__hook_1_1config__command.html#a4f3eb92164a69df1446d745f8a09285e',1,'penify_hook::config_command']]], + ['setup_5fdocgen_5fparser_8',['setup_docgen_parser',['../namespacepenify__hook_1_1commands_1_1doc__commands.html#acc7f4ead1b11951d885fa5c151c2cbe0',1,'penify_hook::commands::doc_commands']]], + ['setup_5flogin_5fparser_9',['setup_login_parser',['../namespacepenify__hook_1_1login__command.html#aae63db4c484797bead34b7d874020c6a',1,'penify_hook::login_command']]], + ['success_5fcolor_10',['SUCCESS_COLOR',['../namespacepenify__hook_1_1ui__utils.html#a22c450c5e2b5394618ecf9b636560df4',1,'penify_hook::ui_utils']]], + ['success_5fsymbol_11',['SUCCESS_SYMBOL',['../namespacepenify__hook_1_1ui__utils.html#a3c6fe4bd17c1a5fe76587225ae4beb3e',1,'penify_hook::ui_utils']]], + ['supported_5ffile_5ftypes_12',['supported_file_types',['../classpenify__hook_1_1base__analyzer_1_1BaseAnalyzer.html#a0cac0310ec635aa64a34857cf30ce1eb',1,'penify_hook::base_analyzer::BaseAnalyzer']]] +]; diff --git a/docs/html/search/all_11.html b/docs/html/search/all_11.html new file mode 100644 index 0000000..8f86146 --- /dev/null +++ b/docs/html/search/all_11.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/docs/html/search/all_11.js b/docs/html/search/all_11.js new file mode 100644 index 0000000..45646f7 --- /dev/null +++ b/docs/html/search/all_11.js @@ -0,0 +1,47 @@ +var searchData= +[ + ['conftest_0',['conftest',['../namespacetests_1_1conftest.html',1,'tests']]], + ['test_5fcommit_5fcode_5ferror_5fhandling_1',['test_commit_code_error_handling',['../classtests_1_1test__commit__commands_1_1TestCommitCommands.html#a43c2ff3707124aa48e8eb581106b8691',1,'tests::test_commit_commands::TestCommitCommands']]], + ['test_5fcommit_5fcode_5fwith_5fjira_5fclient_2',['test_commit_code_with_jira_client',['../classtests_1_1test__commit__commands_1_1TestCommitCommands.html#af9c09013055ec39ddde86b487aefcf8b',1,'tests::test_commit_commands::TestCommitCommands']]], + ['test_5fcommit_5fcode_5fwith_5fjira_5fconnection_5ffailure_3',['test_commit_code_with_jira_connection_failure',['../classtests_1_1test__commit__commands_1_1TestCommitCommands.html#acea0d934ee0f2b914b0b893736e8fe4e',1,'tests::test_commit_commands::TestCommitCommands']]], + ['test_5fcommit_5fcode_5fwith_5fllm_5fclient_4',['test_commit_code_with_llm_client',['../classtests_1_1test__commit__commands_1_1TestCommitCommands.html#acc4b1e4189792a3f7c11d2a745f479c0',1,'tests::test_commit_commands::TestCommitCommands']]], + ['test_5fcommit_5fcommands_5',['test_commit_commands',['../namespacetests_1_1test__commit__commands.html',1,'tests']]], + ['test_5fcommit_5fcommands_2epy_6',['test_commit_commands.py',['../test__commit__commands_8py.html',1,'']]], + ['test_5fconfig_5fcommands_7',['test_config_commands',['../namespacetests_1_1test__config__commands.html',1,'tests']]], + ['test_5fconfig_5fcommands_2epy_8',['test_config_commands.py',['../test__config__commands_8py.html',1,'']]], + ['test_5fconfig_5fjira_5fweb_5fserver_5fsetup_9',['test_config_jira_web_server_setup',['../classtests_1_1test__web__config_1_1TestWebConfig.html#a06e600222e426b003850509cb1d3190a',1,'tests::test_web_config::TestWebConfig']]], + ['test_5fconfig_5fllm_5fweb_5fserver_5fsetup_10',['test_config_llm_web_server_setup',['../classtests_1_1test__web__config_1_1TestWebConfig.html#afc6440352201d207ea8b4d26f8ccfa35',1,'tests::test_web_config::TestWebConfig']]], + ['test_5fdoc_5fcommands_11',['test_doc_commands',['../namespacetests_1_1test__doc__commands.html',1,'tests']]], + ['test_5fdoc_5fcommands_2epy_12',['test_doc_commands.py',['../test__doc__commands_8py.html',1,'']]], + ['test_5fgenerate_5fdoc_5ferror_5fhandling_13',['test_generate_doc_error_handling',['../namespacetests_1_1test__doc__commands.html#aec76cc25c23476794234cdadbcaef0c0',1,'tests::test_doc_commands']]], + ['test_5fgenerate_5fdoc_5ffile_5flocation_14',['test_generate_doc_file_location',['../namespacetests_1_1test__doc__commands.html#a0e74c920f258f442914771164fe26b45',1,'tests::test_doc_commands']]], + ['test_5fgenerate_5fdoc_5ffolder_5flocation_15',['test_generate_doc_folder_location',['../namespacetests_1_1test__doc__commands.html#a4bb75610e40d94d42bc169b25403c186',1,'tests::test_doc_commands']]], + ['test_5fgenerate_5fdoc_5fno_5flocation_16',['test_generate_doc_no_location',['../namespacetests_1_1test__doc__commands.html#a806110833eb0aad547156faf014b31d8',1,'tests::test_doc_commands']]], + ['test_5fgenerate_5fdoc_5fwith_5ffile_5fexception_17',['test_generate_doc_with_file_exception',['../namespacetests_1_1test__doc__commands.html#a335e7fd4912192c7276cf31bbebc6eb0',1,'tests::test_doc_commands']]], + ['test_5fgenerate_5fdoc_5fwith_5ffolder_5fexception_18',['test_generate_doc_with_folder_exception',['../namespacetests_1_1test__doc__commands.html#a64165ddfdb3071a88422f080f0e529a3',1,'tests::test_doc_commands']]], + ['test_5fget_5fjira_5fconfig_5fexists_19',['test_get_jira_config_exists',['../classtests_1_1test__config__commands_1_1TestConfigCommands.html#aee37b97432821d19758c6325d4c74bcf',1,'tests::test_config_commands::TestConfigCommands']]], + ['test_5fget_5fllm_5fconfig_5fempty_20',['test_get_llm_config_empty',['../classtests_1_1test__config__commands_1_1TestConfigCommands.html#abd12f028b89aa9cd1152c0b9ece5d3cd',1,'tests::test_config_commands::TestConfigCommands']]], + ['test_5fget_5fllm_5fconfig_5fexists_21',['test_get_llm_config_exists',['../classtests_1_1test__config__commands_1_1TestConfigCommands.html#adf9f2233a3f4cc5725b9d4f05758b167',1,'tests::test_config_commands::TestConfigCommands']]], + ['test_5fget_5fllm_5fconfig_5finvalid_5fjson_22',['test_get_llm_config_invalid_json',['../classtests_1_1test__config__commands_1_1TestConfigCommands.html#a473984d31452b56acd6ce4011a1248bd',1,'tests::test_config_commands::TestConfigCommands']]], + ['test_5fget_5fpenify_5fconfig_5fexisting_5fdir_23',['test_get_penify_config_existing_dir',['../classtests_1_1test__config__commands_1_1TestConfigCommands.html#a2e8162082bcdd5652bb37bdb14cf453a',1,'tests::test_config_commands::TestConfigCommands']]], + ['test_5fget_5fpenify_5fconfig_5fnew_5fdir_24',['test_get_penify_config_new_dir',['../classtests_1_1test__config__commands_1_1TestConfigCommands.html#a33d4760eee3b67e1cde3aed755ebb948',1,'tests::test_config_commands::TestConfigCommands']]], + ['test_5fget_5ftoken_5ffrom_5fconfig_25',['test_get_token_from_config',['../classtests_1_1test__config__commands_1_1TestConfigCommands.html#a6c0207be563c3de59a6d16277805114c',1,'tests::test_config_commands::TestConfigCommands']]], + ['test_5fget_5ftoken_5ffrom_5fenv_26',['test_get_token_from_env',['../classtests_1_1test__config__commands_1_1TestConfigCommands.html#a3355f7d313bebaa71694387cf2bc5232',1,'tests::test_config_commands::TestConfigCommands']]], + ['test_5fget_5ftoken_5fnot_5ffound_27',['test_get_token_not_found',['../classtests_1_1test__config__commands_1_1TestConfigCommands.html#a400ca5d9fcdc159714e8df54920f9436',1,'tests::test_config_commands::TestConfigCommands']]], + ['test_5fhandle_5fcommit_28',['test_handle_commit',['../classtests_1_1test__commit__commands_1_1TestCommitCommands.html#ac13e368262340af98b30fd8ebdac6597',1,'tests::test_commit_commands::TestCommitCommands']]], + ['test_5fhandle_5fdocgen_5fgenerate_29',['test_handle_docgen_generate',['../namespacetests_1_1test__doc__commands.html#ab158ffa48469b6c097a7a55fcb20c21a',1,'tests::test_doc_commands']]], + ['test_5fhandle_5fdocgen_5finstall_5fhook_30',['test_handle_docgen_install_hook',['../namespacetests_1_1test__doc__commands.html#ab74688baa8c9b5ba302c2877a9789d05',1,'tests::test_doc_commands']]], + ['test_5fhandle_5fdocgen_5fno_5ftoken_31',['test_handle_docgen_no_token',['../namespacetests_1_1test__doc__commands.html#af9b01e5fc89255cac96747fa081c442c',1,'tests::test_doc_commands']]], + ['test_5fhandle_5fdocgen_5funinstall_5fhook_32',['test_handle_docgen_uninstall_hook',['../namespacetests_1_1test__doc__commands.html#a1458af9ad0128c3ca1263b552fd5e482',1,'tests::test_doc_commands']]], + ['test_5fsave_5fjira_5fconfig_5fsuccess_33',['test_save_jira_config_success',['../classtests_1_1test__config__commands_1_1TestConfigCommands.html#af8d62310da2d768e21770f8f01ff5375',1,'tests::test_config_commands::TestConfigCommands']]], + ['test_5fsave_5fllm_5fconfig_5ffailure_34',['test_save_llm_config_failure',['../classtests_1_1test__config__commands_1_1TestConfigCommands.html#a73a264dfb21e16003e095b79f6eab2ac',1,'tests::test_config_commands::TestConfigCommands']]], + ['test_5fsave_5fllm_5fconfig_5fsuccess_35',['test_save_llm_config_success',['../classtests_1_1test__config__commands_1_1TestConfigCommands.html#acd8df8219441b9e9871b903a681400d9',1,'tests::test_config_commands::TestConfigCommands']]], + ['test_5fsetup_5fcommit_5fparser_36',['test_setup_commit_parser',['../classtests_1_1test__commit__commands_1_1TestCommitCommands.html#a4d04b125e102190a768f65f1948f15bc',1,'tests::test_commit_commands::TestCommitCommands']]], + ['test_5fsetup_5fdocgen_5fparser_37',['test_setup_docgen_parser',['../namespacetests_1_1test__doc__commands.html#a0f27751d0ba2acfe40ef7e85bccf47d7',1,'tests::test_doc_commands']]], + ['test_5fweb_5fconfig_38',['test_web_config',['../namespacetests_1_1test__web__config.html',1,'tests']]], + ['test_5fweb_5fconfig_2epy_39',['test_web_config.py',['../test__web__config_8py.html',1,'']]], + ['testcommitcommands_40',['TestCommitCommands',['../classtests_1_1test__commit__commands_1_1TestCommitCommands.html',1,'tests::test_commit_commands']]], + ['testconfigcommands_41',['TestConfigCommands',['../classtests_1_1test__config__commands_1_1TestConfigCommands.html',1,'tests::test_config_commands']]], + ['tests_42',['tests',['../namespacetests.html',1,'']]], + ['testwebconfig_43',['TestWebConfig',['../classtests_1_1test__web__config_1_1TestWebConfig.html',1,'tests::test_web_config']]] +]; diff --git a/docs/html/search/all_12.html b/docs/html/search/all_12.html new file mode 100644 index 0000000..90b128f --- /dev/null +++ b/docs/html/search/all_12.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/docs/html/search/all_12.js b/docs/html/search/all_12.js new file mode 100644 index 0000000..0d33c8a --- /dev/null +++ b/docs/html/search/all_12.js @@ -0,0 +1,9 @@ +var searchData= +[ + ['ui_5futils_2epy_0',['ui_utils.py',['../ui__utils_8py.html',1,'']]], + ['uninstall_5fgit_5fhook_1',['uninstall_git_hook',['../namespacepenify__hook_1_1commands_1_1hook__commands.html#a81543eb5fa835fd1237f24e8bce6201d',1,'penify_hook::commands::hook_commands']]], + ['update_5fissue_5fstatus_2',['update_issue_status',['../classpenify__hook_1_1jira__client_1_1JiraClient.html#aca8837552d37bfd611de23441a240826',1,'penify_hook::jira_client::JiraClient']]], + ['update_5fstage_3',['update_stage',['../namespacepenify__hook_1_1ui__utils.html#a5a7340d0fc60fb80f17514d60bf45f1d',1,'penify_hook::ui_utils']]], + ['url_4',['url',['../namespacesetup.html#afc13124aa5c0124e84e1d965e3f4b0fb',1,'setup']]], + ['utils_2epy_5',['utils.py',['../utils_8py.html',1,'']]] +]; diff --git a/docs/html/search/all_13.html b/docs/html/search/all_13.html new file mode 100644 index 0000000..272d129 --- /dev/null +++ b/docs/html/search/all_13.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/docs/html/search/all_13.js b/docs/html/search/all_13.js new file mode 100644 index 0000000..d9621d9 --- /dev/null +++ b/docs/html/search/all_13.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['version_0',['version',['../namespacesetup.html#a2aa722b36a933088812b50ea79b97a5c',1,'setup']]] +]; diff --git a/docs/html/search/all_14.html b/docs/html/search/all_14.html new file mode 100644 index 0000000..291e0d9 --- /dev/null +++ b/docs/html/search/all_14.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/docs/html/search/all_14.js b/docs/html/search/all_14.js new file mode 100644 index 0000000..10d696f --- /dev/null +++ b/docs/html/search/all_14.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['warning_5fcolor_0',['WARNING_COLOR',['../namespacepenify__hook_1_1ui__utils.html#a177bc9b44157844c999e0c1c2c6936ff',1,'penify_hook::ui_utils']]], + ['warning_5fsymbol_1',['WARNING_SYMBOL',['../namespacepenify__hook_1_1ui__utils.html#a6eaea98f1a8cbe16a181647da2fc0a16',1,'penify_hook::ui_utils']]] +]; diff --git a/docs/html/search/all_2.html b/docs/html/search/all_2.html new file mode 100644 index 0000000..98e648c --- /dev/null +++ b/docs/html/search/all_2.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/docs/html/search/all_2.js b/docs/html/search/all_2.js new file mode 100644 index 0000000..56f2add --- /dev/null +++ b/docs/html/search/all_2.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['base_5fanalyzer_2epy_0',['base_analyzer.py',['../base__analyzer_8py.html',1,'']]], + ['baseanalyzer_1',['BaseAnalyzer',['../classpenify__hook_1_1base__analyzer_1_1BaseAnalyzer.html',1,'penify_hook::base_analyzer']]], + ['bearer_5ftoken_2',['BEARER_TOKEN',['../classpenify__hook_1_1api__client_1_1APIClient.html#a7d7e2cf42c54eb4f25adee96a09ee7b0',1,'penify_hook::api_client::APIClient']]] +]; diff --git a/docs/html/search/all_3.html b/docs/html/search/all_3.html new file mode 100644 index 0000000..f4e8da7 --- /dev/null +++ b/docs/html/search/all_3.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/docs/html/search/all_3.js b/docs/html/search/all_3.js new file mode 100644 index 0000000..45ec4ff --- /dev/null +++ b/docs/html/search/all_3.js @@ -0,0 +1,18 @@ +var searchData= +[ + ['classifiers_0',['classifiers',['../namespacesetup.html#abe96a9c38c1c61f9f0fdb002c482f785',1,'setup']]], + ['commit_2dcommands_2emd_1',['commit-commands.md',['../commit-commands_8md.html',1,'']]], + ['commit_5fanalyzer_2epy_2',['commit_analyzer.py',['../commit__analyzer_8py.html',1,'']]], + ['commit_5fcode_3',['commit_code',['../namespacepenify__hook_1_1commands_1_1commit__commands.html#a62564c4e8ad59fc46d56cb0f9122a71a',1,'penify_hook::commands::commit_commands']]], + ['commit_5fcommands_2epy_4',['commit_commands.py',['../commit__commands_8py.html',1,'']]], + ['commitdocgenhook_5',['CommitDocGenHook',['../classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook.html',1,'penify_hook::commit_analyzer']]], + ['config_2dcommands_2emd_6',['config-commands.md',['../config-commands_8md.html',1,'']]], + ['config_5fcommand_2epy_7',['config_command.py',['../config__command_8py.html',1,'']]], + ['config_5fcommands_2epy_8',['config_commands.py',['../config__commands_8py.html',1,'']]], + ['config_5fjira_5fweb_9',['config_jira_web',['../namespacepenify__hook_1_1commands_1_1config__commands.html#af115198ea5d6808ccb98733957f50b06',1,'penify_hook::commands::config_commands']]], + ['config_5fllm_5fweb_10',['config_llm_web',['../namespacepenify__hook_1_1commands_1_1config__commands.html#a185dfc34a655ed80e6c95939b6f3c35c',1,'penify_hook::commands::config_commands']]], + ['conftest_2epy_11',['conftest.py',['../conftest_8py.html',1,'']]], + ['constants_2epy_12',['constants.py',['../constants_8py.html',1,'']]], + ['create_5fprogress_5fbar_13',['create_progress_bar',['../namespacepenify__hook_1_1ui__utils.html#a12b92532b1458af94f3649d411b5505c',1,'penify_hook::ui_utils']]], + ['create_5fstage_5fprogress_5fbar_14',['create_stage_progress_bar',['../namespacepenify__hook_1_1ui__utils.html#a3da02cd1140179a9ce60f62c85fccfef',1,'penify_hook::ui_utils']]] +]; diff --git a/docs/html/search/all_4.html b/docs/html/search/all_4.html new file mode 100644 index 0000000..678d3a2 --- /dev/null +++ b/docs/html/search/all_4.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/docs/html/search/all_4.js b/docs/html/search/all_4.js new file mode 100644 index 0000000..ccfe815 --- /dev/null +++ b/docs/html/search/all_4.js @@ -0,0 +1,11 @@ +var searchData= +[ + ['dashboard_5furl_0',['DASHBOARD_URL',['../namespacepenify__hook_1_1constants.html#a316c5a606e4440fb8224c6544c3a15f0',1,'penify_hook::constants']]], + ['description_1',['description',['../namespacesetup.html#aedf461ec52a946bda975938ba0b93ec0',1,'setup']]], + ['detailed_2dusage_2emd_2',['detailed-usage.md',['../detailed-usage_8md.html',1,'']]], + ['dir_5fpath_3',['dir_path',['../classpenify__hook_1_1folder__analyzer_1_1FolderAnalyzerGenHook.html#a53f73d69cc0f00763ee4830e4f0f7393',1,'penify_hook::folder_analyzer::FolderAnalyzerGenHook']]], + ['doc_5fcommands_2emd_4',['doc_commands.md',['../doc__commands_8md.html',1,'']]], + ['doc_5fcommands_2epy_5',['doc_commands.py',['../doc__commands_8py.html',1,'']]], + ['docgen_5fdescription_6',['docgen_description',['../namespacepenify__hook_1_1commands_1_1doc__commands.html#a3e42540047da37565afffeaf106cb948',1,'penify_hook::commands::doc_commands']]], + ['dotenv_5favailable_7',['DOTENV_AVAILABLE',['../namespacepenify__hook_1_1commands_1_1config__commands.html#a152642ab83cf6219b604bda6122aba67',1,'penify_hook::commands::config_commands']]] +]; diff --git a/docs/html/search/all_5.html b/docs/html/search/all_5.html new file mode 100644 index 0000000..aa9af78 --- /dev/null +++ b/docs/html/search/all_5.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/docs/html/search/all_5.js b/docs/html/search/all_5.js new file mode 100644 index 0000000..89b0ea5 --- /dev/null +++ b/docs/html/search/all_5.js @@ -0,0 +1,11 @@ +var searchData= +[ + ['enhance_5fcommit_5fmessage_0',['enhance_commit_message',['../classpenify__hook_1_1jira__client_1_1JiraClient.html#a70d2c5a6432aa6f238da0ff65d49a760',1,'penify_hook::jira_client::JiraClient']]], + ['entry_5fpoints_1',['entry_points',['../namespacesetup.html#ada7058afc98897f073d3f3b8b9157059',1,'setup']]], + ['error_5fcolor_2',['ERROR_COLOR',['../namespacepenify__hook_1_1ui__utils.html#a4ab4e61dfab7973c87bef59c6e1977fe',1,'penify_hook::ui_utils']]], + ['error_5fsymbol_3',['ERROR_SYMBOL',['../namespacepenify__hook_1_1ui__utils.html#aa564e1e1d016c8227d076542e74cecb0',1,'penify_hook::ui_utils']]], + ['example_2dworkflows_2emd_4',['example-workflows.md',['../example-workflows_8md.html',1,'']]], + ['exception_5',['Exception',['../classException.html',1,'']]], + ['extract_5fissue_5fkeys_6',['extract_issue_keys',['../classpenify__hook_1_1jira__client_1_1JiraClient.html#ad2823ad1d3baaedd38039913c3a97fd7',1,'penify_hook::jira_client::JiraClient']]], + ['extract_5fissue_5fkeys_5ffrom_5fbranch_7',['extract_issue_keys_from_branch',['../classpenify__hook_1_1jira__client_1_1JiraClient.html#a093d6456fe053ef7a7862d5d6851910c',1,'penify_hook::jira_client::JiraClient']]] +]; diff --git a/docs/html/search/all_6.html b/docs/html/search/all_6.html new file mode 100644 index 0000000..d3026a7 --- /dev/null +++ b/docs/html/search/all_6.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/docs/html/search/all_6.js b/docs/html/search/all_6.js new file mode 100644 index 0000000..9da4602 --- /dev/null +++ b/docs/html/search/all_6.js @@ -0,0 +1,17 @@ +var searchData= +[ + ['file_5fanalyzer_2epy_0',['file_analyzer.py',['../file__analyzer_8py.html',1,'']]], + ['file_5fpath_1',['file_path',['../classpenify__hook_1_1file__analyzer_1_1FileAnalyzerGenHook.html#a9b03b88a9ce1b9af945279375048dc32',1,'penify_hook::file_analyzer::FileAnalyzerGenHook']]], + ['fileanalyzergenhook_2',['FileAnalyzerGenHook',['../classpenify__hook_1_1file__analyzer_1_1FileAnalyzerGenHook.html',1,'penify_hook::file_analyzer']]], + ['find_5fgit_5fparent_3',['find_git_parent',['../namespacepenify__hook_1_1utils.html#a4ec5335a4026c22a34a3a8ccf665a5f2',1,'penify_hook::utils']]], + ['folder_5fanalyzer_2epy_4',['folder_analyzer.py',['../folder__analyzer_8py.html',1,'']]], + ['folder_5fpath_5',['folder_path',['../classpenify__hook_1_1base__analyzer_1_1BaseAnalyzer.html#aa67c06dd12b1bafaeaee81c41dcb7e25',1,'penify_hook::base_analyzer::BaseAnalyzer']]], + ['folderanalyzergenhook_6',['FolderAnalyzerGenHook',['../classpenify__hook_1_1folder__analyzer_1_1FolderAnalyzerGenHook.html',1,'penify_hook::folder_analyzer']]], + ['format_5fcommit_5fmessage_5fwith_5fjira_5finfo_7',['format_commit_message_with_jira_info',['../classpenify__hook_1_1jira__client_1_1JiraClient.html#a49ea1149758f7f5212149d357b13cc23',1,'penify_hook::jira_client::JiraClient']]], + ['format_5ferror_8',['format_error',['../namespacepenify__hook_1_1ui__utils.html#a4dd934568897433fa73f9cc182ac4a3e',1,'penify_hook::ui_utils']]], + ['format_5ffile_5fpath_9',['format_file_path',['../namespacepenify__hook_1_1ui__utils.html#af3441fb3c2c3850b8b3b6455a9fdaba4',1,'penify_hook::ui_utils']]], + ['format_5fhighlight_10',['format_highlight',['../namespacepenify__hook_1_1ui__utils.html#adcb97fc26b405d2b9cdf5eb7aecc5452',1,'penify_hook::ui_utils']]], + ['format_5finfo_11',['format_info',['../namespacepenify__hook_1_1ui__utils.html#a92c3e466d1912058167be2eacf85b9f6',1,'penify_hook::ui_utils']]], + ['format_5fsuccess_12',['format_success',['../namespacepenify__hook_1_1ui__utils.html#a532cdb4de7c679ce8b29c3e9116c4776',1,'penify_hook::ui_utils']]], + ['format_5fwarning_13',['format_warning',['../namespacepenify__hook_1_1ui__utils.html#a0a6fd2613c6fe053b6e4356cd9e5cda2',1,'penify_hook::ui_utils']]] +]; diff --git a/docs/html/search/all_7.html b/docs/html/search/all_7.html new file mode 100644 index 0000000..b2ee042 --- /dev/null +++ b/docs/html/search/all_7.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/docs/html/search/all_7.js b/docs/html/search/all_7.js new file mode 100644 index 0000000..d5e7346 --- /dev/null +++ b/docs/html/search/all_7.js @@ -0,0 +1,23 @@ +var searchData= +[ + ['generate_5fcommit_5fsummary_0',['generate_commit_summary',['../classpenify__hook_1_1api__client_1_1APIClient.html#a7ff74798e7d428b4e2f20095287eb2ce',1,'penify_hook.api_client.APIClient.generate_commit_summary()'],['../classpenify__hook_1_1llm__client_1_1LLMClient.html#a2ad3014dac466ee1d8e00306d0cf2000',1,'penify_hook.llm_client.LLMClient.generate_commit_summary()']]], + ['generate_5fcommit_5fsummary_5fwith_5fllm_1',['generate_commit_summary_with_llm',['../classpenify__hook_1_1api__client_1_1APIClient.html#ac0ada470b897935f9fb372cd0e7e51e3',1,'penify_hook::api_client::APIClient']]], + ['generate_5fdoc_2',['generate_doc',['../namespacepenify__hook_1_1commands_1_1doc__commands.html#a4daac68bc563432bf25c85dc78081a25',1,'penify_hook::commands::doc_commands']]], + ['get_5fapi_5fkey_3',['get_api_key',['../classpenify__hook_1_1api__client_1_1APIClient.html#ad15b790608e703c8c122aa2ead7dfa99',1,'penify_hook::api_client::APIClient']]], + ['get_5fcommit_5fcontext_5ffrom_5fissues_4',['get_commit_context_from_issues',['../classpenify__hook_1_1jira__client_1_1JiraClient.html#afb41ce6f13c30b1265d439ddf04bf2cd',1,'penify_hook::jira_client::JiraClient']]], + ['get_5fdetailed_5fissue_5fcontext_5',['get_detailed_issue_context',['../classpenify__hook_1_1jira__client_1_1JiraClient.html#aa967169a4b7970c67c0947b9ac56f746',1,'penify_hook::jira_client::JiraClient']]], + ['get_5fenv_5fvar_5for_5fdefault_6',['get_env_var_or_default',['../namespacepenify__hook_1_1commands_1_1config__commands.html#a3caf2b062dd33b1f1d7ddc7224f0ff87',1,'penify_hook::commands::config_commands']]], + ['get_5fissue_5fdetails_7',['get_issue_details',['../classpenify__hook_1_1jira__client_1_1JiraClient.html#a65f6924819084b7c8d268956a784804a',1,'penify_hook::jira_client::JiraClient']]], + ['get_5fjira_5fconfig_8',['get_jira_config',['../namespacepenify__hook_1_1commands_1_1config__commands.html#a15bf3685c4dcb5c15ba6a4055e484cf2',1,'penify_hook::commands::config_commands']]], + ['get_5fllm_5fconfig_9',['get_llm_config',['../namespacepenify__hook_1_1commands_1_1config__commands.html#a6492bc8e7df6e38bb06ad05e572d4cc0',1,'penify_hook::commands::config_commands']]], + ['get_5fmodified_5ffiles_5fin_5flast_5fcommit_10',['get_modified_files_in_last_commit',['../classpenify__hook_1_1git__analyzer_1_1GitDocGenHook.html#a17549766100e91eb94b5f1a1d34bf481',1,'penify_hook::git_analyzer::GitDocGenHook']]], + ['get_5fmodified_5flines_11',['get_modified_lines',['../classpenify__hook_1_1git__analyzer_1_1GitDocGenHook.html#a974d2f51315ed6a1965a7fd7e2ced0cd',1,'penify_hook::git_analyzer::GitDocGenHook']]], + ['get_5fpenify_5fconfig_12',['get_penify_config',['../namespacepenify__hook_1_1commands_1_1config__commands.html#a6559a82d0bf727703d550d1003d3ed20',1,'penify_hook::commands::config_commands']]], + ['get_5frepo_5fdetails_13',['get_repo_details',['../namespacepenify__hook_1_1utils.html#ae236f3c4c8bf5dcddbb92b4c2065eea3',1,'penify_hook::utils']]], + ['get_5fsummary_14',['get_summary',['../classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook.html#a8496194276441fa2eb2fa014eaab9a37',1,'penify_hook::commit_analyzer::CommitDocGenHook']]], + ['get_5fsupported_5ffile_5ftypes_15',['get_supported_file_types',['../classpenify__hook_1_1api__client_1_1APIClient.html#a5d2b4a26b24352d951ea79ecc4ff3402',1,'penify_hook::api_client::APIClient']]], + ['get_5ftoken_16',['get_token',['../namespacepenify__hook_1_1commands_1_1config__commands.html#a5503d51c905e2f1b299b12d2a73bd812',1,'penify_hook::commands::config_commands']]], + ['git_5fanalyzer_2epy_17',['git_analyzer.py',['../git__analyzer_8py.html',1,'']]], + ['gitdocgenhook_18',['GitDocGenHook',['../classpenify__hook_1_1git__analyzer_1_1GitDocGenHook.html',1,'penify_hook::git_analyzer']]], + ['gitreponotfounderror_19',['GitRepoNotFoundError',['../classpenify__hook_1_1utils_1_1GitRepoNotFoundError.html',1,'penify_hook::utils']]] +]; diff --git a/docs/html/search/all_8.html b/docs/html/search/all_8.html new file mode 100644 index 0000000..40a0b3f --- /dev/null +++ b/docs/html/search/all_8.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/docs/html/search/all_8.js b/docs/html/search/all_8.js new file mode 100644 index 0000000..b83bbc6 --- /dev/null +++ b/docs/html/search/all_8.js @@ -0,0 +1,11 @@ +var searchData= +[ + ['handle_5fcommit_0',['handle_commit',['../namespacepenify__hook_1_1commands_1_1commit__commands.html#af4f739f524c38b437e4e47673d683e23',1,'penify_hook::commands::commit_commands']]], + ['handle_5fconfig_1',['handle_config',['../namespacepenify__hook_1_1config__command.html#a240e5331681eb574ac319d7458783bde',1,'penify_hook::config_command']]], + ['handle_5fdocgen_2',['handle_docgen',['../namespacepenify__hook_1_1commands_1_1doc__commands.html#a2006ab13bff718ef783868a910c0b704',1,'penify_hook::commands::doc_commands']]], + ['handle_5flogin_3',['handle_login',['../namespacepenify__hook_1_1login__command.html#ae4bf932fbafeff834b0a0c5a37f74ccd',1,'penify_hook::login_command']]], + ['highlight_5fcolor_4',['HIGHLIGHT_COLOR',['../namespacepenify__hook_1_1ui__utils.html#aba01b8259f0d66cdc2b4a1b58f9736fc',1,'penify_hook::ui_utils']]], + ['hook_5fcommands_2epy_5',['hook_commands.py',['../hook__commands_8py.html',1,'']]], + ['hook_5ffilename_6',['HOOK_FILENAME',['../namespacepenify__hook_1_1commands_1_1hook__commands.html#ae82fd46e5a9219da1478b0476b8214b1',1,'penify_hook::commands::hook_commands']]], + ['hook_5ftemplate_7',['HOOK_TEMPLATE',['../namespacepenify__hook_1_1commands_1_1hook__commands.html#a6a45aad71c8d32ce11a6dff8cee8bee7',1,'penify_hook::commands::hook_commands']]] +]; diff --git a/docs/html/search/all_9.html b/docs/html/search/all_9.html new file mode 100644 index 0000000..7c49144 --- /dev/null +++ b/docs/html/search/all_9.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/docs/html/search/all_9.js b/docs/html/search/all_9.js new file mode 100644 index 0000000..bf0f94f --- /dev/null +++ b/docs/html/search/all_9.js @@ -0,0 +1,7 @@ +var searchData= +[ + ['info_5fcolor_0',['INFO_COLOR',['../namespacepenify__hook_1_1ui__utils.html#a9fdcb180915696f5d217032a62c3857c',1,'penify_hook::ui_utils']]], + ['install_5fgit_5fhook_1',['install_git_hook',['../namespacepenify__hook_1_1commands_1_1hook__commands.html#adff8f5d3bf1c3795974a391ee95b72b2',1,'penify_hook::commands::hook_commands']]], + ['install_5frequires_2',['install_requires',['../namespacesetup.html#abead4f26b530856f858f0d44c7cf2588',1,'setup']]], + ['is_5fconnected_3',['is_connected',['../classpenify__hook_1_1jira__client_1_1JiraClient.html#a00d0f9ae006313a21576362d26ac5ec8',1,'penify_hook::jira_client::JiraClient']]] +]; diff --git a/docs/html/search/all_a.html b/docs/html/search/all_a.html new file mode 100644 index 0000000..fc9d79c --- /dev/null +++ b/docs/html/search/all_a.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/docs/html/search/all_a.js b/docs/html/search/all_a.js new file mode 100644 index 0000000..cb87635 --- /dev/null +++ b/docs/html/search/all_a.js @@ -0,0 +1,10 @@ +var searchData= +[ + ['jira_5fapi_5ftoken_0',['jira_api_token',['../classpenify__hook_1_1jira__client_1_1JiraClient.html#afc5c90e53b702f9fc27e2ee7d3f991b9',1,'penify_hook::jira_client::JiraClient']]], + ['jira_5favailable_1',['JIRA_AVAILABLE',['../namespacepenify__hook_1_1jira__client.html#a5593ea3415081eca1eea92e4c1ad1aa2',1,'penify_hook::jira_client']]], + ['jira_5fclient_2',['jira_client',['../classpenify__hook_1_1jira__client_1_1JiraClient.html#aefb3f96c79358cf3a95d96d3747235b6',1,'penify_hook::jira_client::JiraClient']]], + ['jira_5fclient_2epy_3',['jira_client.py',['../jira__client_8py.html',1,'']]], + ['jira_5furl_4',['jira_url',['../classpenify__hook_1_1jira__client_1_1JiraClient.html#a3c0cfecff02a75cb7001509a595b8197',1,'penify_hook::jira_client::JiraClient']]], + ['jira_5fuser_5',['jira_user',['../classpenify__hook_1_1jira__client_1_1JiraClient.html#ae56104d5aa7bda7bb26d169c4b46038c',1,'penify_hook::jira_client::JiraClient']]], + ['jiraclient_6',['JiraClient',['../classpenify__hook_1_1jira__client_1_1JiraClient.html',1,'penify_hook::jira_client']]] +]; diff --git a/docs/html/search/all_b.html b/docs/html/search/all_b.html new file mode 100644 index 0000000..dafb1fa --- /dev/null +++ b/docs/html/search/all_b.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/docs/html/search/all_b.js b/docs/html/search/all_b.js new file mode 100644 index 0000000..2024217 --- /dev/null +++ b/docs/html/search/all_b.js @@ -0,0 +1,14 @@ +var searchData= +[ + ['list_5fall_5ffiles_5fin_5fdir_0',['list_all_files_in_dir',['../classpenify__hook_1_1folder__analyzer_1_1FolderAnalyzerGenHook.html#a70b845318fc7ac3b607daf26378e19ec',1,'penify_hook::folder_analyzer::FolderAnalyzerGenHook']]], + ['litellm_1',['litellm',['../classpenify__hook_1_1llm__client_1_1LLMClient.html#ad6f06658ca922793f879474f2234518e',1,'penify_hook::llm_client::LLMClient']]], + ['llm_5fclient_2',['llm_client',['../classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook.html#ad93360e31f2ec58a0d7c9f08b219028a',1,'penify_hook::commit_analyzer::CommitDocGenHook']]], + ['llm_5fclient_2epy_3',['llm_client.py',['../llm__client_8py.html',1,'']]], + ['llmclient_4',['LLMClient',['../classpenify__hook_1_1llm__client_1_1LLMClient.html',1,'penify_hook::llm_client']]], + ['load_5fenv_5ffiles_5',['load_env_files',['../namespacepenify__hook_1_1commands_1_1config__commands.html#aabe277132ce0bc0aacef951cf1dee2ae',1,'penify_hook::commands::config_commands']]], + ['logger_6',['logger',['../namespacepenify__hook_1_1file__analyzer.html#af419a4965f079d58cac5a5281ddb1828',1,'penify_hook.file_analyzer.logger()'],['../namespacepenify__hook_1_1git__analyzer.html#ac4ce143fdca789a79c66852c37d7363a',1,'penify_hook.git_analyzer.logger()'],['../namespacepenify__hook_1_1utils.html#a0c0c1ed6b197038085c94a90ceedfb01',1,'penify_hook.utils.logger()']]], + ['login_7',['login',['../namespacepenify__hook_1_1commands_1_1auth__commands.html#a78f375c58bb6f69f98675e6a9ac84655',1,'penify_hook::commands::auth_commands']]], + ['login_5fcommand_2epy_8',['login_command.py',['../login__command_8py.html',1,'']]], + ['long_5fdescription_9',['long_description',['../namespacesetup.html#a4cda9dbfb952875376a0749fe08a5bde',1,'setup']]], + ['long_5fdescription_5fcontent_5ftype_10',['long_description_content_type',['../namespacesetup.html#a3796ea10c998699d07d391414ff5d720',1,'setup']]] +]; diff --git a/docs/html/search/all_c.html b/docs/html/search/all_c.html new file mode 100644 index 0000000..9df619d --- /dev/null +++ b/docs/html/search/all_c.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/docs/html/search/all_c.js b/docs/html/search/all_c.js new file mode 100644 index 0000000..885d3c4 --- /dev/null +++ b/docs/html/search/all_c.js @@ -0,0 +1,12 @@ +var searchData= +[ + ['main_0',['main',['../namespacepenify__hook_1_1main.html#a16838b20df4bd14ee4b5e1dd2906738f',1,'penify_hook::main']]], + ['main_2epy_1',['main.py',['../main_8py.html',1,'']]], + ['mock_5fapi_5fclient_2',['mock_api_client',['../classtests_1_1test__commit__commands_1_1TestCommitCommands.html#abcd2354a2af4afe19e57877628d3acc2',1,'tests::test_commit_commands::TestCommitCommands']]], + ['mock_5fcommit_5fdoc_5fgen_3',['mock_commit_doc_gen',['../classtests_1_1test__commit__commands_1_1TestCommitCommands.html#aa9b25a4bf692b8736164695072a398f6',1,'tests::test_commit_commands::TestCommitCommands']]], + ['mock_5fgit_5ffolder_5fsearch_4',['mock_git_folder_search',['../classtests_1_1test__commit__commands_1_1TestCommitCommands.html#a2842f456a8c0f1bf0f4def17c183c04e',1,'tests::test_commit_commands::TestCommitCommands']]], + ['mock_5fjira_5fclient_5',['mock_jira_client',['../classtests_1_1test__commit__commands_1_1TestCommitCommands.html#a05adaa9a713ff1be657455d0667bc6be',1,'tests::test_commit_commands::TestCommitCommands']]], + ['mock_5fllm_5fclient_6',['mock_llm_client',['../classtests_1_1test__commit__commands_1_1TestCommitCommands.html#a20e78370ff5bd6223cc1dd4323a86ea4',1,'tests::test_commit_commands::TestCommitCommands']]], + ['mock_5fprint_5ffunctions_7',['mock_print_functions',['../classtests_1_1test__commit__commands_1_1TestCommitCommands.html#afafbae3c9aeb0e50a75996256c02c8be',1,'tests::test_commit_commands::TestCommitCommands']]], + ['model_8',['model',['../classpenify__hook_1_1llm__client_1_1LLMClient.html#abc2cb6b1d6d9b5dc16401ca078ec8c10',1,'penify_hook::llm_client::LLMClient']]] +]; diff --git a/docs/html/search/all_d.html b/docs/html/search/all_d.html new file mode 100644 index 0000000..95d8eec --- /dev/null +++ b/docs/html/search/all_d.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/docs/html/search/all_d.js b/docs/html/search/all_d.js new file mode 100644 index 0000000..eb3ec51 --- /dev/null +++ b/docs/html/search/all_d.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['name_0',['name',['../namespacesetup.html#ab3a7a0638d76a01367c5bc3cc699447f',1,'setup']]], + ['neutral_5fcolor_1',['NEUTRAL_COLOR',['../namespacepenify__hook_1_1ui__utils.html#aca0fcee81606857497520ae4290bc9f5',1,'penify_hook::ui_utils']]] +]; diff --git a/docs/html/search/all_e.html b/docs/html/search/all_e.html new file mode 100644 index 0000000..a54e120 --- /dev/null +++ b/docs/html/search/all_e.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/docs/html/search/all_e.js b/docs/html/search/all_e.js new file mode 100644 index 0000000..c246db6 --- /dev/null +++ b/docs/html/search/all_e.js @@ -0,0 +1,43 @@ +var searchData= +[ + ['api_5fclient_0',['api_client',['../namespacepenify__hook_1_1api__client.html',1,'penify_hook']]], + ['auth_5fcommands_1',['auth_commands',['../namespacepenify__hook_1_1commands_1_1auth__commands.html',1,'penify_hook::commands']]], + ['base_5fanalyzer_2',['base_analyzer',['../namespacepenify__hook_1_1base__analyzer.html',1,'penify_hook']]], + ['commands_3',['commands',['../namespacepenify__hook_1_1commands.html',1,'penify_hook']]], + ['commit_5fanalyzer_4',['commit_analyzer',['../namespacepenify__hook_1_1commit__analyzer.html',1,'penify_hook']]], + ['commit_5fcommands_5',['commit_commands',['../namespacepenify__hook_1_1commands_1_1commit__commands.html',1,'penify_hook::commands']]], + ['config_5fcommand_6',['config_command',['../namespacepenify__hook_1_1config__command.html',1,'penify_hook']]], + ['config_5fcommands_7',['config_commands',['../namespacepenify__hook_1_1commands_1_1config__commands.html',1,'penify_hook::commands']]], + ['constants_8',['constants',['../namespacepenify__hook_1_1constants.html',1,'penify_hook']]], + ['doc_5fcommands_9',['doc_commands',['../namespacepenify__hook_1_1commands_1_1doc__commands.html',1,'penify_hook::commands']]], + ['file_5fanalyzer_10',['file_analyzer',['../namespacepenify__hook_1_1file__analyzer.html',1,'penify_hook']]], + ['folder_5fanalyzer_11',['folder_analyzer',['../namespacepenify__hook_1_1folder__analyzer.html',1,'penify_hook']]], + ['git_5fanalyzer_12',['git_analyzer',['../namespacepenify__hook_1_1git__analyzer.html',1,'penify_hook']]], + ['hook_5fcommands_13',['hook_commands',['../namespacepenify__hook_1_1commands_1_1hook__commands.html',1,'penify_hook::commands']]], + ['jira_5fclient_14',['jira_client',['../namespacepenify__hook_1_1jira__client.html',1,'penify_hook']]], + ['llm_5fclient_15',['llm_client',['../namespacepenify__hook_1_1llm__client.html',1,'penify_hook']]], + ['login_5fcommand_16',['login_command',['../namespacepenify__hook_1_1login__command.html',1,'penify_hook']]], + ['main_17',['main',['../namespacepenify__hook_1_1main.html',1,'penify_hook']]], + ['packages_18',['packages',['../namespacesetup.html#aff2375a361fd5865c77bd9aa093be747',1,'setup']]], + ['path_19',['path',['../namespacepenify__hook_1_1commands_1_1config__commands.html#a4b202072a3a3b8515c9c254622e9c880',1,'penify_hook::commands::config_commands']]], + ['penify_20cli_20_2d_20commit_20commands_20',['Penify CLI - Commit Commands',['../md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_commit_commands.html',1,'']]], + ['penify_20cli_20_2d_20configuration_20commands_21',['Penify CLI - Configuration Commands',['../md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_config_commands.html',1,'']]], + ['penify_20cli_20_2d_20detailed_20usage_20guide_22',['Penify CLI - Detailed Usage Guide',['../md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_detailed_usage.html',1,'']]], + ['penify_20cli_20_2d_20documentation_20generation_20commands_23',['Penify CLI - Documentation Generation Commands',['../md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_doc_commands.html',1,'']]], + ['penify_20cli_20example_20workflows_24',['Penify CLI Example Workflows',['../md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_example_workflows.html',1,'']]], + ['penify_20cli_20tool_25',['Penify CLI Tool',['../md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_README.html',1,'']]], + ['penify_2dcli_2ddocumentation_2emd_26',['penify-cli-documentation.md',['../penify-cli-documentation_8md.html',1,'']]], + ['penify_5fhook_27',['penify_hook',['../namespacepenify__hook.html',1,'']]], + ['print_5ferror_28',['print_error',['../namespacepenify__hook_1_1ui__utils.html#a6f0acd7dd91abfe67d0807803bc3b65f',1,'penify_hook::ui_utils']]], + ['print_5finfo_29',['print_info',['../namespacepenify__hook_1_1ui__utils.html#a811f0adf6e9bf71510c379b6fa155e44',1,'penify_hook::ui_utils']]], + ['print_5fprocessing_30',['print_processing',['../namespacepenify__hook_1_1ui__utils.html#adfcbbfe39029ab6d1dd33e7bf75ae115',1,'penify_hook.ui_utils.print_processing()'],['../classpenify__hook_1_1file__analyzer_1_1FileAnalyzerGenHook.html#a6ab39391dfb7686f2a2d21a702dd3073',1,'penify_hook.file_analyzer.FileAnalyzerGenHook.print_processing()']]], + ['print_5fstatus_31',['print_status',['../namespacepenify__hook_1_1ui__utils.html#aa6e684c00e26199440137a87ed9b195c',1,'penify_hook::ui_utils']]], + ['print_5fsuccess_32',['print_success',['../namespacepenify__hook_1_1ui__utils.html#a2b16aa6b68a9edea5f29f84f1c4be79a',1,'penify_hook::ui_utils']]], + ['print_5fwarning_33',['print_warning',['../namespacepenify__hook_1_1ui__utils.html#a1ffbb9671dbe233770268e2dd66a67fa',1,'penify_hook::ui_utils']]], + ['process_5ffile_34',['process_file',['../classpenify__hook_1_1git__analyzer_1_1GitDocGenHook.html#a05313caa22b173ce75638f0db08eeb85',1,'penify_hook.git_analyzer.GitDocGenHook.process_file()'],['../classpenify__hook_1_1file__analyzer_1_1FileAnalyzerGenHook.html#a2cc6c22ef588fccf3eed9bbc57fb6d6e',1,'penify_hook.file_analyzer.FileAnalyzerGenHook.process_file()']]], + ['process_5fjira_5fintegration_35',['process_jira_integration',['../classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook.html#adda13cc121d96342476ccf72b63a007f',1,'penify_hook::commit_analyzer::CommitDocGenHook']]], + ['processing_5fsymbol_36',['PROCESSING_SYMBOL',['../namespacepenify__hook_1_1ui__utils.html#a3b208e2750a38dd09467a73e4afd9756',1,'penify_hook::ui_utils']]], + ['python_5frequires_37',['python_requires',['../namespacesetup.html#aa7ca7bc9391b217e81efeb03689d8dbf',1,'setup']]], + ['ui_5futils_38',['ui_utils',['../namespacepenify__hook_1_1ui__utils.html',1,'penify_hook']]], + ['utils_39',['utils',['../namespacepenify__hook_1_1utils.html',1,'penify_hook']]] +]; diff --git a/docs/html/search/all_f.html b/docs/html/search/all_f.html new file mode 100644 index 0000000..8d0aed3 --- /dev/null +++ b/docs/html/search/all_f.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/docs/html/search/all_f.js b/docs/html/search/all_f.js new file mode 100644 index 0000000..11f8b78 --- /dev/null +++ b/docs/html/search/all_f.js @@ -0,0 +1,10 @@ +var searchData= +[ + ['readme_2emd_0',['README.md',['../README_8md.html',1,'']]], + ['recursive_5fsearch_5fgit_5ffolder_1',['recursive_search_git_folder',['../namespacepenify__hook_1_1utils.html#a95c3f9c80860d6a2e2d061d2fb660a3f',1,'penify_hook::utils']]], + ['relative_5ffile_5fpath_2',['relative_file_path',['../classpenify__hook_1_1base__analyzer_1_1BaseAnalyzer.html#ab702c0c3ba81d159d7c3bcd7ea2abba4',1,'penify_hook::base_analyzer::BaseAnalyzer']]], + ['repo_3',['repo',['../classpenify__hook_1_1base__analyzer_1_1BaseAnalyzer.html#a3a9ddfa1dfba81fe21214fe486389369',1,'penify_hook::base_analyzer::BaseAnalyzer']]], + ['repo_5fdetails_4',['repo_details',['../classpenify__hook_1_1base__analyzer_1_1BaseAnalyzer.html#a9cca3465b0cc00d78324b0a9eac1d7f5',1,'penify_hook::base_analyzer::BaseAnalyzer']]], + ['repo_5fpath_5',['repo_path',['../classpenify__hook_1_1base__analyzer_1_1BaseAnalyzer.html#a957e81a1ab561f6cecfbe999e7b85499',1,'penify_hook::base_analyzer::BaseAnalyzer']]], + ['run_6',['run',['../classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook.html#a6370a03f7ed9175ef6f81e931a105ea9',1,'penify_hook.commit_analyzer.CommitDocGenHook.run()'],['../classpenify__hook_1_1file__analyzer_1_1FileAnalyzerGenHook.html#a4f4dffbc432fac3e259d957dd1e187f1',1,'penify_hook.file_analyzer.FileAnalyzerGenHook.run()'],['../classpenify__hook_1_1folder__analyzer_1_1FolderAnalyzerGenHook.html#afd189d1b8c773bf710a899eb21fd76cc',1,'penify_hook.folder_analyzer.FolderAnalyzerGenHook.run()'],['../classpenify__hook_1_1git__analyzer_1_1GitDocGenHook.html#a3beba14e92d717391a74bb70b1fab0ae',1,'penify_hook.git_analyzer.GitDocGenHook.run()']]] +]; diff --git a/docs/html/search/classes_0.html b/docs/html/search/classes_0.html new file mode 100644 index 0000000..9d4f871 --- /dev/null +++ b/docs/html/search/classes_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/docs/html/search/classes_0.js b/docs/html/search/classes_0.js new file mode 100644 index 0000000..d470783 --- /dev/null +++ b/docs/html/search/classes_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['apiclient_0',['APIClient',['../classpenify__hook_1_1api__client_1_1APIClient.html',1,'penify_hook::api_client']]] +]; diff --git a/docs/html/search/classes_1.html b/docs/html/search/classes_1.html new file mode 100644 index 0000000..0557f9f --- /dev/null +++ b/docs/html/search/classes_1.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/docs/html/search/classes_1.js b/docs/html/search/classes_1.js new file mode 100644 index 0000000..740b36f --- /dev/null +++ b/docs/html/search/classes_1.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['baseanalyzer_0',['BaseAnalyzer',['../classpenify__hook_1_1base__analyzer_1_1BaseAnalyzer.html',1,'penify_hook::base_analyzer']]] +]; diff --git a/docs/html/search/classes_2.html b/docs/html/search/classes_2.html new file mode 100644 index 0000000..fa20861 --- /dev/null +++ b/docs/html/search/classes_2.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/docs/html/search/classes_2.js b/docs/html/search/classes_2.js new file mode 100644 index 0000000..8bdd859 --- /dev/null +++ b/docs/html/search/classes_2.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['commitdocgenhook_0',['CommitDocGenHook',['../classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook.html',1,'penify_hook::commit_analyzer']]] +]; diff --git a/docs/html/search/classes_3.html b/docs/html/search/classes_3.html new file mode 100644 index 0000000..98fbc87 --- /dev/null +++ b/docs/html/search/classes_3.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/docs/html/search/classes_3.js b/docs/html/search/classes_3.js new file mode 100644 index 0000000..0ed9487 --- /dev/null +++ b/docs/html/search/classes_3.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['exception_0',['Exception',['../classException.html',1,'']]] +]; diff --git a/docs/html/search/classes_4.html b/docs/html/search/classes_4.html new file mode 100644 index 0000000..3b6c51e --- /dev/null +++ b/docs/html/search/classes_4.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/docs/html/search/classes_4.js b/docs/html/search/classes_4.js new file mode 100644 index 0000000..e90ffee --- /dev/null +++ b/docs/html/search/classes_4.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['fileanalyzergenhook_0',['FileAnalyzerGenHook',['../classpenify__hook_1_1file__analyzer_1_1FileAnalyzerGenHook.html',1,'penify_hook::file_analyzer']]], + ['folderanalyzergenhook_1',['FolderAnalyzerGenHook',['../classpenify__hook_1_1folder__analyzer_1_1FolderAnalyzerGenHook.html',1,'penify_hook::folder_analyzer']]] +]; diff --git a/docs/html/search/classes_5.html b/docs/html/search/classes_5.html new file mode 100644 index 0000000..51c2b30 --- /dev/null +++ b/docs/html/search/classes_5.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/docs/html/search/classes_5.js b/docs/html/search/classes_5.js new file mode 100644 index 0000000..a6b1740 --- /dev/null +++ b/docs/html/search/classes_5.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['gitdocgenhook_0',['GitDocGenHook',['../classpenify__hook_1_1git__analyzer_1_1GitDocGenHook.html',1,'penify_hook::git_analyzer']]], + ['gitreponotfounderror_1',['GitRepoNotFoundError',['../classpenify__hook_1_1utils_1_1GitRepoNotFoundError.html',1,'penify_hook::utils']]] +]; diff --git a/docs/html/search/classes_6.html b/docs/html/search/classes_6.html new file mode 100644 index 0000000..431fb05 --- /dev/null +++ b/docs/html/search/classes_6.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/docs/html/search/classes_6.js b/docs/html/search/classes_6.js new file mode 100644 index 0000000..6f010a9 --- /dev/null +++ b/docs/html/search/classes_6.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['jiraclient_0',['JiraClient',['../classpenify__hook_1_1jira__client_1_1JiraClient.html',1,'penify_hook::jira_client']]] +]; diff --git a/docs/html/search/classes_7.html b/docs/html/search/classes_7.html new file mode 100644 index 0000000..0c76bf5 --- /dev/null +++ b/docs/html/search/classes_7.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/docs/html/search/classes_7.js b/docs/html/search/classes_7.js new file mode 100644 index 0000000..bd37889 --- /dev/null +++ b/docs/html/search/classes_7.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['llmclient_0',['LLMClient',['../classpenify__hook_1_1llm__client_1_1LLMClient.html',1,'penify_hook::llm_client']]] +]; diff --git a/docs/html/search/classes_8.html b/docs/html/search/classes_8.html new file mode 100644 index 0000000..5a392ee --- /dev/null +++ b/docs/html/search/classes_8.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/docs/html/search/classes_8.js b/docs/html/search/classes_8.js new file mode 100644 index 0000000..ca590a4 --- /dev/null +++ b/docs/html/search/classes_8.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['testcommitcommands_0',['TestCommitCommands',['../classtests_1_1test__commit__commands_1_1TestCommitCommands.html',1,'tests::test_commit_commands']]], + ['testconfigcommands_1',['TestConfigCommands',['../classtests_1_1test__config__commands_1_1TestConfigCommands.html',1,'tests::test_config_commands']]], + ['testwebconfig_2',['TestWebConfig',['../classtests_1_1test__web__config_1_1TestWebConfig.html',1,'tests::test_web_config']]] +]; diff --git a/docs/html/search/close.svg b/docs/html/search/close.svg new file mode 100644 index 0000000..a933eea --- /dev/null +++ b/docs/html/search/close.svg @@ -0,0 +1,31 @@ + + + + + + image/svg+xml + + + + + + + + diff --git a/docs/html/search/files_0.html b/docs/html/search/files_0.html new file mode 100644 index 0000000..2dbb4c2 --- /dev/null +++ b/docs/html/search/files_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/docs/html/search/files_0.js b/docs/html/search/files_0.js new file mode 100644 index 0000000..7b3d690 --- /dev/null +++ b/docs/html/search/files_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['_5f_5finit_5f_5f_2epy_0',['__init__.py',['../penify__hook_2____init_____8py.html',1,'(Global Namespace)'],['../penify__hook_2commands_2____init_____8py.html',1,'(Global Namespace)'],['../tests_2____init_____8py.html',1,'(Global Namespace)']]] +]; diff --git a/docs/html/search/files_1.html b/docs/html/search/files_1.html new file mode 100644 index 0000000..18ccd15 --- /dev/null +++ b/docs/html/search/files_1.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/docs/html/search/files_1.js b/docs/html/search/files_1.js new file mode 100644 index 0000000..6d2b14e --- /dev/null +++ b/docs/html/search/files_1.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['api_5fclient_2epy_0',['api_client.py',['../api__client_8py.html',1,'']]], + ['auth_5fcommands_2epy_1',['auth_commands.py',['../auth__commands_8py.html',1,'']]] +]; diff --git a/docs/html/search/files_10.html b/docs/html/search/files_10.html new file mode 100644 index 0000000..c6af52c --- /dev/null +++ b/docs/html/search/files_10.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/docs/html/search/files_10.js b/docs/html/search/files_10.js new file mode 100644 index 0000000..b759a00 --- /dev/null +++ b/docs/html/search/files_10.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['ui_5futils_2epy_0',['ui_utils.py',['../ui__utils_8py.html',1,'']]], + ['utils_2epy_1',['utils.py',['../utils_8py.html',1,'']]] +]; diff --git a/docs/html/search/files_2.html b/docs/html/search/files_2.html new file mode 100644 index 0000000..a4c2be4 --- /dev/null +++ b/docs/html/search/files_2.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/docs/html/search/files_2.js b/docs/html/search/files_2.js new file mode 100644 index 0000000..ba3909d --- /dev/null +++ b/docs/html/search/files_2.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['base_5fanalyzer_2epy_0',['base_analyzer.py',['../base__analyzer_8py.html',1,'']]] +]; diff --git a/docs/html/search/files_3.html b/docs/html/search/files_3.html new file mode 100644 index 0000000..3ac4cfb --- /dev/null +++ b/docs/html/search/files_3.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/docs/html/search/files_3.js b/docs/html/search/files_3.js new file mode 100644 index 0000000..bb00fd4 --- /dev/null +++ b/docs/html/search/files_3.js @@ -0,0 +1,11 @@ +var searchData= +[ + ['commit_2dcommands_2emd_0',['commit-commands.md',['../commit-commands_8md.html',1,'']]], + ['commit_5fanalyzer_2epy_1',['commit_analyzer.py',['../commit__analyzer_8py.html',1,'']]], + ['commit_5fcommands_2epy_2',['commit_commands.py',['../commit__commands_8py.html',1,'']]], + ['config_2dcommands_2emd_3',['config-commands.md',['../config-commands_8md.html',1,'']]], + ['config_5fcommand_2epy_4',['config_command.py',['../config__command_8py.html',1,'']]], + ['config_5fcommands_2epy_5',['config_commands.py',['../config__commands_8py.html',1,'']]], + ['conftest_2epy_6',['conftest.py',['../conftest_8py.html',1,'']]], + ['constants_2epy_7',['constants.py',['../constants_8py.html',1,'']]] +]; diff --git a/docs/html/search/files_4.html b/docs/html/search/files_4.html new file mode 100644 index 0000000..eb19ecf --- /dev/null +++ b/docs/html/search/files_4.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/docs/html/search/files_4.js b/docs/html/search/files_4.js new file mode 100644 index 0000000..e7bf2b2 --- /dev/null +++ b/docs/html/search/files_4.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['detailed_2dusage_2emd_0',['detailed-usage.md',['../detailed-usage_8md.html',1,'']]], + ['doc_5fcommands_2emd_1',['doc_commands.md',['../doc__commands_8md.html',1,'']]], + ['doc_5fcommands_2epy_2',['doc_commands.py',['../doc__commands_8py.html',1,'']]] +]; diff --git a/docs/html/search/files_5.html b/docs/html/search/files_5.html new file mode 100644 index 0000000..61d86d0 --- /dev/null +++ b/docs/html/search/files_5.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/docs/html/search/files_5.js b/docs/html/search/files_5.js new file mode 100644 index 0000000..29d814a --- /dev/null +++ b/docs/html/search/files_5.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['example_2dworkflows_2emd_0',['example-workflows.md',['../example-workflows_8md.html',1,'']]] +]; diff --git a/docs/html/search/files_6.html b/docs/html/search/files_6.html new file mode 100644 index 0000000..333517d --- /dev/null +++ b/docs/html/search/files_6.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/docs/html/search/files_6.js b/docs/html/search/files_6.js new file mode 100644 index 0000000..3d76b9d --- /dev/null +++ b/docs/html/search/files_6.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['file_5fanalyzer_2epy_0',['file_analyzer.py',['../file__analyzer_8py.html',1,'']]], + ['folder_5fanalyzer_2epy_1',['folder_analyzer.py',['../folder__analyzer_8py.html',1,'']]] +]; diff --git a/docs/html/search/files_7.html b/docs/html/search/files_7.html new file mode 100644 index 0000000..ad481b0 --- /dev/null +++ b/docs/html/search/files_7.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/docs/html/search/files_7.js b/docs/html/search/files_7.js new file mode 100644 index 0000000..4c89ef8 --- /dev/null +++ b/docs/html/search/files_7.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['git_5fanalyzer_2epy_0',['git_analyzer.py',['../git__analyzer_8py.html',1,'']]] +]; diff --git a/docs/html/search/files_8.html b/docs/html/search/files_8.html new file mode 100644 index 0000000..2af8404 --- /dev/null +++ b/docs/html/search/files_8.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/docs/html/search/files_8.js b/docs/html/search/files_8.js new file mode 100644 index 0000000..3d83c4a --- /dev/null +++ b/docs/html/search/files_8.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['hook_5fcommands_2epy_0',['hook_commands.py',['../hook__commands_8py.html',1,'']]] +]; diff --git a/docs/html/search/files_9.html b/docs/html/search/files_9.html new file mode 100644 index 0000000..8d5c07d --- /dev/null +++ b/docs/html/search/files_9.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/docs/html/search/files_9.js b/docs/html/search/files_9.js new file mode 100644 index 0000000..fcddd7a --- /dev/null +++ b/docs/html/search/files_9.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['jira_5fclient_2epy_0',['jira_client.py',['../jira__client_8py.html',1,'']]] +]; diff --git a/docs/html/search/files_a.html b/docs/html/search/files_a.html new file mode 100644 index 0000000..806a999 --- /dev/null +++ b/docs/html/search/files_a.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/docs/html/search/files_a.js b/docs/html/search/files_a.js new file mode 100644 index 0000000..876ef0d --- /dev/null +++ b/docs/html/search/files_a.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['llm_5fclient_2epy_0',['llm_client.py',['../llm__client_8py.html',1,'']]], + ['login_5fcommand_2epy_1',['login_command.py',['../login__command_8py.html',1,'']]] +]; diff --git a/docs/html/search/files_b.html b/docs/html/search/files_b.html new file mode 100644 index 0000000..371cc0f --- /dev/null +++ b/docs/html/search/files_b.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/docs/html/search/files_b.js b/docs/html/search/files_b.js new file mode 100644 index 0000000..01a0bf7 --- /dev/null +++ b/docs/html/search/files_b.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['main_2epy_0',['main.py',['../main_8py.html',1,'']]] +]; diff --git a/docs/html/search/files_c.html b/docs/html/search/files_c.html new file mode 100644 index 0000000..5b93d7f --- /dev/null +++ b/docs/html/search/files_c.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/docs/html/search/files_c.js b/docs/html/search/files_c.js new file mode 100644 index 0000000..6f265cb --- /dev/null +++ b/docs/html/search/files_c.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['penify_2dcli_2ddocumentation_2emd_0',['penify-cli-documentation.md',['../penify-cli-documentation_8md.html',1,'']]] +]; diff --git a/docs/html/search/files_d.html b/docs/html/search/files_d.html new file mode 100644 index 0000000..a9b1c64 --- /dev/null +++ b/docs/html/search/files_d.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/docs/html/search/files_d.js b/docs/html/search/files_d.js new file mode 100644 index 0000000..9847676 --- /dev/null +++ b/docs/html/search/files_d.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['readme_2emd_0',['README.md',['../README_8md.html',1,'']]] +]; diff --git a/docs/html/search/files_e.html b/docs/html/search/files_e.html new file mode 100644 index 0000000..db2d31a --- /dev/null +++ b/docs/html/search/files_e.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/docs/html/search/files_e.js b/docs/html/search/files_e.js new file mode 100644 index 0000000..d0dfcff --- /dev/null +++ b/docs/html/search/files_e.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['setup_2epy_0',['setup.py',['../setup_8py.html',1,'']]] +]; diff --git a/docs/html/search/files_f.html b/docs/html/search/files_f.html new file mode 100644 index 0000000..82b198a --- /dev/null +++ b/docs/html/search/files_f.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/docs/html/search/files_f.js b/docs/html/search/files_f.js new file mode 100644 index 0000000..133fd11 --- /dev/null +++ b/docs/html/search/files_f.js @@ -0,0 +1,7 @@ +var searchData= +[ + ['test_5fcommit_5fcommands_2epy_0',['test_commit_commands.py',['../test__commit__commands_8py.html',1,'']]], + ['test_5fconfig_5fcommands_2epy_1',['test_config_commands.py',['../test__config__commands_8py.html',1,'']]], + ['test_5fdoc_5fcommands_2epy_2',['test_doc_commands.py',['../test__doc__commands_8py.html',1,'']]], + ['test_5fweb_5fconfig_2epy_3',['test_web_config.py',['../test__web__config_8py.html',1,'']]] +]; diff --git a/docs/html/search/functions_0.html b/docs/html/search/functions_0.html new file mode 100644 index 0000000..3b739c7 --- /dev/null +++ b/docs/html/search/functions_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/docs/html/search/functions_0.js b/docs/html/search/functions_0.js new file mode 100644 index 0000000..8362237 --- /dev/null +++ b/docs/html/search/functions_0.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['_5f_5finit_5f_5f_0',['__init__',['../classpenify__hook_1_1api__client_1_1APIClient.html#ad9cb741a8baf2d13f845e25a36311086',1,'penify_hook.api_client.APIClient.__init__()'],['../classpenify__hook_1_1base__analyzer_1_1BaseAnalyzer.html#ab1296a3d1e9070d891801876b66f7344',1,'penify_hook.base_analyzer.BaseAnalyzer.__init__()'],['../classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook.html#af127d86729e226d74dbeb095b008db3e',1,'penify_hook.commit_analyzer.CommitDocGenHook.__init__()'],['../classpenify__hook_1_1file__analyzer_1_1FileAnalyzerGenHook.html#a190c473090b2a07e7cb43073a3211c4b',1,'penify_hook.file_analyzer.FileAnalyzerGenHook.__init__()'],['../classpenify__hook_1_1folder__analyzer_1_1FolderAnalyzerGenHook.html#a1bb0358140931d82c7616f12efe31821',1,'penify_hook.folder_analyzer.FolderAnalyzerGenHook.__init__()'],['../classpenify__hook_1_1git__analyzer_1_1GitDocGenHook.html#a92275fddb43dbef6dfdb6c1ed6e96d0c',1,'penify_hook.git_analyzer.GitDocGenHook.__init__()'],['../classpenify__hook_1_1jira__client_1_1JiraClient.html#a47efc1ec07389c960f2dfb37ba8c09f5',1,'penify_hook.jira_client.JiraClient.__init__()'],['../classpenify__hook_1_1llm__client_1_1LLMClient.html#a76d92354f585ab4bb291169f9f530764',1,'penify_hook.llm_client.LLMClient.__init__()']]], + ['_5famend_5fcommit_1',['_amend_commit',['../classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook.html#ac999c5cbc852a7ec3b412ccb43c274ca',1,'penify_hook::commit_analyzer::CommitDocGenHook']]] +]; diff --git a/docs/html/search/functions_1.html b/docs/html/search/functions_1.html new file mode 100644 index 0000000..2cef5e3 --- /dev/null +++ b/docs/html/search/functions_1.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/docs/html/search/functions_1.js b/docs/html/search/functions_1.js new file mode 100644 index 0000000..6c71456 --- /dev/null +++ b/docs/html/search/functions_1.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['add_5fcomment_0',['add_comment',['../classpenify__hook_1_1jira__client_1_1JiraClient.html#aa1f374116c64cd5f1492ec7f7e40f9c1',1,'penify_hook::jira_client::JiraClient']]] +]; diff --git a/docs/html/search/functions_2.html b/docs/html/search/functions_2.html new file mode 100644 index 0000000..3308c65 --- /dev/null +++ b/docs/html/search/functions_2.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/docs/html/search/functions_2.js b/docs/html/search/functions_2.js new file mode 100644 index 0000000..9ea0560 --- /dev/null +++ b/docs/html/search/functions_2.js @@ -0,0 +1,8 @@ +var searchData= +[ + ['commit_5fcode_0',['commit_code',['../namespacepenify__hook_1_1commands_1_1commit__commands.html#a62564c4e8ad59fc46d56cb0f9122a71a',1,'penify_hook::commands::commit_commands']]], + ['config_5fjira_5fweb_1',['config_jira_web',['../namespacepenify__hook_1_1commands_1_1config__commands.html#af115198ea5d6808ccb98733957f50b06',1,'penify_hook::commands::config_commands']]], + ['config_5fllm_5fweb_2',['config_llm_web',['../namespacepenify__hook_1_1commands_1_1config__commands.html#a185dfc34a655ed80e6c95939b6f3c35c',1,'penify_hook::commands::config_commands']]], + ['create_5fprogress_5fbar_3',['create_progress_bar',['../namespacepenify__hook_1_1ui__utils.html#a12b92532b1458af94f3649d411b5505c',1,'penify_hook::ui_utils']]], + ['create_5fstage_5fprogress_5fbar_4',['create_stage_progress_bar',['../namespacepenify__hook_1_1ui__utils.html#a3da02cd1140179a9ce60f62c85fccfef',1,'penify_hook::ui_utils']]] +]; diff --git a/docs/html/search/functions_3.html b/docs/html/search/functions_3.html new file mode 100644 index 0000000..43ac697 --- /dev/null +++ b/docs/html/search/functions_3.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/docs/html/search/functions_3.js b/docs/html/search/functions_3.js new file mode 100644 index 0000000..79bed7c --- /dev/null +++ b/docs/html/search/functions_3.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['enhance_5fcommit_5fmessage_0',['enhance_commit_message',['../classpenify__hook_1_1jira__client_1_1JiraClient.html#a70d2c5a6432aa6f238da0ff65d49a760',1,'penify_hook::jira_client::JiraClient']]], + ['extract_5fissue_5fkeys_1',['extract_issue_keys',['../classpenify__hook_1_1jira__client_1_1JiraClient.html#ad2823ad1d3baaedd38039913c3a97fd7',1,'penify_hook::jira_client::JiraClient']]], + ['extract_5fissue_5fkeys_5ffrom_5fbranch_2',['extract_issue_keys_from_branch',['../classpenify__hook_1_1jira__client_1_1JiraClient.html#a093d6456fe053ef7a7862d5d6851910c',1,'penify_hook::jira_client::JiraClient']]] +]; diff --git a/docs/html/search/functions_4.html b/docs/html/search/functions_4.html new file mode 100644 index 0000000..d12c2df --- /dev/null +++ b/docs/html/search/functions_4.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/docs/html/search/functions_4.js b/docs/html/search/functions_4.js new file mode 100644 index 0000000..3c2e1af --- /dev/null +++ b/docs/html/search/functions_4.js @@ -0,0 +1,11 @@ +var searchData= +[ + ['find_5fgit_5fparent_0',['find_git_parent',['../namespacepenify__hook_1_1utils.html#a4ec5335a4026c22a34a3a8ccf665a5f2',1,'penify_hook::utils']]], + ['format_5fcommit_5fmessage_5fwith_5fjira_5finfo_1',['format_commit_message_with_jira_info',['../classpenify__hook_1_1jira__client_1_1JiraClient.html#a49ea1149758f7f5212149d357b13cc23',1,'penify_hook::jira_client::JiraClient']]], + ['format_5ferror_2',['format_error',['../namespacepenify__hook_1_1ui__utils.html#a4dd934568897433fa73f9cc182ac4a3e',1,'penify_hook::ui_utils']]], + ['format_5ffile_5fpath_3',['format_file_path',['../namespacepenify__hook_1_1ui__utils.html#af3441fb3c2c3850b8b3b6455a9fdaba4',1,'penify_hook::ui_utils']]], + ['format_5fhighlight_4',['format_highlight',['../namespacepenify__hook_1_1ui__utils.html#adcb97fc26b405d2b9cdf5eb7aecc5452',1,'penify_hook::ui_utils']]], + ['format_5finfo_5',['format_info',['../namespacepenify__hook_1_1ui__utils.html#a92c3e466d1912058167be2eacf85b9f6',1,'penify_hook::ui_utils']]], + ['format_5fsuccess_6',['format_success',['../namespacepenify__hook_1_1ui__utils.html#a532cdb4de7c679ce8b29c3e9116c4776',1,'penify_hook::ui_utils']]], + ['format_5fwarning_7',['format_warning',['../namespacepenify__hook_1_1ui__utils.html#a0a6fd2613c6fe053b6e4356cd9e5cda2',1,'penify_hook::ui_utils']]] +]; diff --git a/docs/html/search/functions_5.html b/docs/html/search/functions_5.html new file mode 100644 index 0000000..7266236 --- /dev/null +++ b/docs/html/search/functions_5.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/docs/html/search/functions_5.js b/docs/html/search/functions_5.js new file mode 100644 index 0000000..75c7e99 --- /dev/null +++ b/docs/html/search/functions_5.js @@ -0,0 +1,20 @@ +var searchData= +[ + ['generate_5fcommit_5fsummary_0',['generate_commit_summary',['../classpenify__hook_1_1llm__client_1_1LLMClient.html#a2ad3014dac466ee1d8e00306d0cf2000',1,'penify_hook.llm_client.LLMClient.generate_commit_summary()'],['../classpenify__hook_1_1api__client_1_1APIClient.html#a7ff74798e7d428b4e2f20095287eb2ce',1,'penify_hook.api_client.APIClient.generate_commit_summary(self, git_diff, str instruction="", repo_details=None, dict jira_context=None)']]], + ['generate_5fcommit_5fsummary_5fwith_5fllm_1',['generate_commit_summary_with_llm',['../classpenify__hook_1_1api__client_1_1APIClient.html#ac0ada470b897935f9fb372cd0e7e51e3',1,'penify_hook::api_client::APIClient']]], + ['generate_5fdoc_2',['generate_doc',['../namespacepenify__hook_1_1commands_1_1doc__commands.html#a4daac68bc563432bf25c85dc78081a25',1,'penify_hook::commands::doc_commands']]], + ['get_5fapi_5fkey_3',['get_api_key',['../classpenify__hook_1_1api__client_1_1APIClient.html#ad15b790608e703c8c122aa2ead7dfa99',1,'penify_hook::api_client::APIClient']]], + ['get_5fcommit_5fcontext_5ffrom_5fissues_4',['get_commit_context_from_issues',['../classpenify__hook_1_1jira__client_1_1JiraClient.html#afb41ce6f13c30b1265d439ddf04bf2cd',1,'penify_hook::jira_client::JiraClient']]], + ['get_5fdetailed_5fissue_5fcontext_5',['get_detailed_issue_context',['../classpenify__hook_1_1jira__client_1_1JiraClient.html#aa967169a4b7970c67c0947b9ac56f746',1,'penify_hook::jira_client::JiraClient']]], + ['get_5fenv_5fvar_5for_5fdefault_6',['get_env_var_or_default',['../namespacepenify__hook_1_1commands_1_1config__commands.html#a3caf2b062dd33b1f1d7ddc7224f0ff87',1,'penify_hook::commands::config_commands']]], + ['get_5fissue_5fdetails_7',['get_issue_details',['../classpenify__hook_1_1jira__client_1_1JiraClient.html#a65f6924819084b7c8d268956a784804a',1,'penify_hook::jira_client::JiraClient']]], + ['get_5fjira_5fconfig_8',['get_jira_config',['../namespacepenify__hook_1_1commands_1_1config__commands.html#a15bf3685c4dcb5c15ba6a4055e484cf2',1,'penify_hook::commands::config_commands']]], + ['get_5fllm_5fconfig_9',['get_llm_config',['../namespacepenify__hook_1_1commands_1_1config__commands.html#a6492bc8e7df6e38bb06ad05e572d4cc0',1,'penify_hook::commands::config_commands']]], + ['get_5fmodified_5ffiles_5fin_5flast_5fcommit_10',['get_modified_files_in_last_commit',['../classpenify__hook_1_1git__analyzer_1_1GitDocGenHook.html#a17549766100e91eb94b5f1a1d34bf481',1,'penify_hook::git_analyzer::GitDocGenHook']]], + ['get_5fmodified_5flines_11',['get_modified_lines',['../classpenify__hook_1_1git__analyzer_1_1GitDocGenHook.html#a974d2f51315ed6a1965a7fd7e2ced0cd',1,'penify_hook::git_analyzer::GitDocGenHook']]], + ['get_5fpenify_5fconfig_12',['get_penify_config',['../namespacepenify__hook_1_1commands_1_1config__commands.html#a6559a82d0bf727703d550d1003d3ed20',1,'penify_hook::commands::config_commands']]], + ['get_5frepo_5fdetails_13',['get_repo_details',['../namespacepenify__hook_1_1utils.html#ae236f3c4c8bf5dcddbb92b4c2065eea3',1,'penify_hook::utils']]], + ['get_5fsummary_14',['get_summary',['../classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook.html#a8496194276441fa2eb2fa014eaab9a37',1,'penify_hook::commit_analyzer::CommitDocGenHook']]], + ['get_5fsupported_5ffile_5ftypes_15',['get_supported_file_types',['../classpenify__hook_1_1api__client_1_1APIClient.html#a5d2b4a26b24352d951ea79ecc4ff3402',1,'penify_hook::api_client::APIClient']]], + ['get_5ftoken_16',['get_token',['../namespacepenify__hook_1_1commands_1_1config__commands.html#a5503d51c905e2f1b299b12d2a73bd812',1,'penify_hook::commands::config_commands']]] +]; diff --git a/docs/html/search/functions_6.html b/docs/html/search/functions_6.html new file mode 100644 index 0000000..7f9fc45 --- /dev/null +++ b/docs/html/search/functions_6.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/docs/html/search/functions_6.js b/docs/html/search/functions_6.js new file mode 100644 index 0000000..6ef2054 --- /dev/null +++ b/docs/html/search/functions_6.js @@ -0,0 +1,7 @@ +var searchData= +[ + ['handle_5fcommit_0',['handle_commit',['../namespacepenify__hook_1_1commands_1_1commit__commands.html#af4f739f524c38b437e4e47673d683e23',1,'penify_hook::commands::commit_commands']]], + ['handle_5fconfig_1',['handle_config',['../namespacepenify__hook_1_1config__command.html#a240e5331681eb574ac319d7458783bde',1,'penify_hook::config_command']]], + ['handle_5fdocgen_2',['handle_docgen',['../namespacepenify__hook_1_1commands_1_1doc__commands.html#a2006ab13bff718ef783868a910c0b704',1,'penify_hook::commands::doc_commands']]], + ['handle_5flogin_3',['handle_login',['../namespacepenify__hook_1_1login__command.html#ae4bf932fbafeff834b0a0c5a37f74ccd',1,'penify_hook::login_command']]] +]; diff --git a/docs/html/search/functions_7.html b/docs/html/search/functions_7.html new file mode 100644 index 0000000..ad0f88b --- /dev/null +++ b/docs/html/search/functions_7.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/docs/html/search/functions_7.js b/docs/html/search/functions_7.js new file mode 100644 index 0000000..f0f0714 --- /dev/null +++ b/docs/html/search/functions_7.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['install_5fgit_5fhook_0',['install_git_hook',['../namespacepenify__hook_1_1commands_1_1hook__commands.html#adff8f5d3bf1c3795974a391ee95b72b2',1,'penify_hook::commands::hook_commands']]], + ['is_5fconnected_1',['is_connected',['../classpenify__hook_1_1jira__client_1_1JiraClient.html#a00d0f9ae006313a21576362d26ac5ec8',1,'penify_hook::jira_client::JiraClient']]] +]; diff --git a/docs/html/search/functions_8.html b/docs/html/search/functions_8.html new file mode 100644 index 0000000..ea7fa74 --- /dev/null +++ b/docs/html/search/functions_8.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/docs/html/search/functions_8.js b/docs/html/search/functions_8.js new file mode 100644 index 0000000..8934697 --- /dev/null +++ b/docs/html/search/functions_8.js @@ -0,0 +1,7 @@ +var searchData= +[ + ['list_5fall_5ffiles_5fin_5fdir_0',['list_all_files_in_dir',['../classpenify__hook_1_1folder__analyzer_1_1FolderAnalyzerGenHook.html#a70b845318fc7ac3b607daf26378e19ec',1,'penify_hook::folder_analyzer::FolderAnalyzerGenHook']]], + ['litellm_1',['litellm',['../classpenify__hook_1_1llm__client_1_1LLMClient.html#ad6f06658ca922793f879474f2234518e',1,'penify_hook::llm_client::LLMClient']]], + ['load_5fenv_5ffiles_2',['load_env_files',['../namespacepenify__hook_1_1commands_1_1config__commands.html#aabe277132ce0bc0aacef951cf1dee2ae',1,'penify_hook::commands::config_commands']]], + ['login_3',['login',['../namespacepenify__hook_1_1commands_1_1auth__commands.html#a78f375c58bb6f69f98675e6a9ac84655',1,'penify_hook::commands::auth_commands']]] +]; diff --git a/docs/html/search/functions_9.html b/docs/html/search/functions_9.html new file mode 100644 index 0000000..d831dc7 --- /dev/null +++ b/docs/html/search/functions_9.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/docs/html/search/functions_9.js b/docs/html/search/functions_9.js new file mode 100644 index 0000000..70a2559 --- /dev/null +++ b/docs/html/search/functions_9.js @@ -0,0 +1,10 @@ +var searchData= +[ + ['main_0',['main',['../namespacepenify__hook_1_1main.html#a16838b20df4bd14ee4b5e1dd2906738f',1,'penify_hook::main']]], + ['mock_5fapi_5fclient_1',['mock_api_client',['../classtests_1_1test__commit__commands_1_1TestCommitCommands.html#abcd2354a2af4afe19e57877628d3acc2',1,'tests::test_commit_commands::TestCommitCommands']]], + ['mock_5fcommit_5fdoc_5fgen_2',['mock_commit_doc_gen',['../classtests_1_1test__commit__commands_1_1TestCommitCommands.html#aa9b25a4bf692b8736164695072a398f6',1,'tests::test_commit_commands::TestCommitCommands']]], + ['mock_5fgit_5ffolder_5fsearch_3',['mock_git_folder_search',['../classtests_1_1test__commit__commands_1_1TestCommitCommands.html#a2842f456a8c0f1bf0f4def17c183c04e',1,'tests::test_commit_commands::TestCommitCommands']]], + ['mock_5fjira_5fclient_4',['mock_jira_client',['../classtests_1_1test__commit__commands_1_1TestCommitCommands.html#a05adaa9a713ff1be657455d0667bc6be',1,'tests::test_commit_commands::TestCommitCommands']]], + ['mock_5fllm_5fclient_5',['mock_llm_client',['../classtests_1_1test__commit__commands_1_1TestCommitCommands.html#a20e78370ff5bd6223cc1dd4323a86ea4',1,'tests::test_commit_commands::TestCommitCommands']]], + ['mock_5fprint_5ffunctions_6',['mock_print_functions',['../classtests_1_1test__commit__commands_1_1TestCommitCommands.html#afafbae3c9aeb0e50a75996256c02c8be',1,'tests::test_commit_commands::TestCommitCommands']]] +]; diff --git a/docs/html/search/functions_a.html b/docs/html/search/functions_a.html new file mode 100644 index 0000000..7018fc6 --- /dev/null +++ b/docs/html/search/functions_a.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/docs/html/search/functions_a.js b/docs/html/search/functions_a.js new file mode 100644 index 0000000..0283fbe --- /dev/null +++ b/docs/html/search/functions_a.js @@ -0,0 +1,11 @@ +var searchData= +[ + ['print_5ferror_0',['print_error',['../namespacepenify__hook_1_1ui__utils.html#a6f0acd7dd91abfe67d0807803bc3b65f',1,'penify_hook::ui_utils']]], + ['print_5finfo_1',['print_info',['../namespacepenify__hook_1_1ui__utils.html#a811f0adf6e9bf71510c379b6fa155e44',1,'penify_hook::ui_utils']]], + ['print_5fprocessing_2',['print_processing',['../classpenify__hook_1_1file__analyzer_1_1FileAnalyzerGenHook.html#a6ab39391dfb7686f2a2d21a702dd3073',1,'penify_hook.file_analyzer.FileAnalyzerGenHook.print_processing()'],['../namespacepenify__hook_1_1ui__utils.html#adfcbbfe39029ab6d1dd33e7bf75ae115',1,'penify_hook.ui_utils.print_processing(file_path)']]], + ['print_5fstatus_3',['print_status',['../namespacepenify__hook_1_1ui__utils.html#aa6e684c00e26199440137a87ed9b195c',1,'penify_hook::ui_utils']]], + ['print_5fsuccess_4',['print_success',['../namespacepenify__hook_1_1ui__utils.html#a2b16aa6b68a9edea5f29f84f1c4be79a',1,'penify_hook::ui_utils']]], + ['print_5fwarning_5',['print_warning',['../namespacepenify__hook_1_1ui__utils.html#a1ffbb9671dbe233770268e2dd66a67fa',1,'penify_hook::ui_utils']]], + ['process_5ffile_6',['process_file',['../classpenify__hook_1_1file__analyzer_1_1FileAnalyzerGenHook.html#a2cc6c22ef588fccf3eed9bbc57fb6d6e',1,'penify_hook.file_analyzer.FileAnalyzerGenHook.process_file()'],['../classpenify__hook_1_1git__analyzer_1_1GitDocGenHook.html#a05313caa22b173ce75638f0db08eeb85',1,'penify_hook.git_analyzer.GitDocGenHook.process_file()']]], + ['process_5fjira_5fintegration_7',['process_jira_integration',['../classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook.html#adda13cc121d96342476ccf72b63a007f',1,'penify_hook::commit_analyzer::CommitDocGenHook']]] +]; diff --git a/docs/html/search/functions_b.html b/docs/html/search/functions_b.html new file mode 100644 index 0000000..c0660b0 --- /dev/null +++ b/docs/html/search/functions_b.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/docs/html/search/functions_b.js b/docs/html/search/functions_b.js new file mode 100644 index 0000000..aa36dc7 --- /dev/null +++ b/docs/html/search/functions_b.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['recursive_5fsearch_5fgit_5ffolder_0',['recursive_search_git_folder',['../namespacepenify__hook_1_1utils.html#a95c3f9c80860d6a2e2d061d2fb660a3f',1,'penify_hook::utils']]], + ['run_1',['run',['../classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook.html#a6370a03f7ed9175ef6f81e931a105ea9',1,'penify_hook.commit_analyzer.CommitDocGenHook.run()'],['../classpenify__hook_1_1file__analyzer_1_1FileAnalyzerGenHook.html#a4f4dffbc432fac3e259d957dd1e187f1',1,'penify_hook.file_analyzer.FileAnalyzerGenHook.run()'],['../classpenify__hook_1_1folder__analyzer_1_1FolderAnalyzerGenHook.html#afd189d1b8c773bf710a899eb21fd76cc',1,'penify_hook.folder_analyzer.FolderAnalyzerGenHook.run()'],['../classpenify__hook_1_1git__analyzer_1_1GitDocGenHook.html#a3beba14e92d717391a74bb70b1fab0ae',1,'penify_hook.git_analyzer.GitDocGenHook.run()']]] +]; diff --git a/docs/html/search/functions_c.html b/docs/html/search/functions_c.html new file mode 100644 index 0000000..b642767 --- /dev/null +++ b/docs/html/search/functions_c.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/docs/html/search/functions_c.js b/docs/html/search/functions_c.js new file mode 100644 index 0000000..8de5e4c --- /dev/null +++ b/docs/html/search/functions_c.js @@ -0,0 +1,11 @@ +var searchData= +[ + ['save_5fcredentials_0',['save_credentials',['../namespacepenify__hook_1_1commands_1_1auth__commands.html#aa3956ca1749d4218ea1dc6e5b6218b24',1,'penify_hook::commands::auth_commands']]], + ['save_5fjira_5fconfig_1',['save_jira_config',['../namespacepenify__hook_1_1commands_1_1config__commands.html#ab2486ac2bf16b4a671e49625bfa4f9b4',1,'penify_hook::commands::config_commands']]], + ['save_5fllm_5fconfig_2',['save_llm_config',['../namespacepenify__hook_1_1commands_1_1config__commands.html#a4617bc5956e502c9555dc0dda0376df4',1,'penify_hook::commands::config_commands']]], + ['send_5ffile_5ffor_5fdocstring_5fgeneration_3',['send_file_for_docstring_generation',['../classpenify__hook_1_1api__client_1_1APIClient.html#ac5aad61508c2cafdf6e88e6c7d6c82b3',1,'penify_hook::api_client::APIClient']]], + ['setup_5fcommit_5fparser_4',['setup_commit_parser',['../namespacepenify__hook_1_1commands_1_1commit__commands.html#a8627583116eb78e31a4d3cdc16d2f15c',1,'penify_hook::commands::commit_commands']]], + ['setup_5fconfig_5fparser_5',['setup_config_parser',['../namespacepenify__hook_1_1config__command.html#a4f3eb92164a69df1446d745f8a09285e',1,'penify_hook::config_command']]], + ['setup_5fdocgen_5fparser_6',['setup_docgen_parser',['../namespacepenify__hook_1_1commands_1_1doc__commands.html#acc7f4ead1b11951d885fa5c151c2cbe0',1,'penify_hook::commands::doc_commands']]], + ['setup_5flogin_5fparser_7',['setup_login_parser',['../namespacepenify__hook_1_1login__command.html#aae63db4c484797bead34b7d874020c6a',1,'penify_hook::login_command']]] +]; diff --git a/docs/html/search/functions_d.html b/docs/html/search/functions_d.html new file mode 100644 index 0000000..16464b4 --- /dev/null +++ b/docs/html/search/functions_d.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/docs/html/search/functions_d.js b/docs/html/search/functions_d.js new file mode 100644 index 0000000..36538fa --- /dev/null +++ b/docs/html/search/functions_d.js @@ -0,0 +1,34 @@ +var searchData= +[ + ['test_5fcommit_5fcode_5ferror_5fhandling_0',['test_commit_code_error_handling',['../classtests_1_1test__commit__commands_1_1TestCommitCommands.html#a43c2ff3707124aa48e8eb581106b8691',1,'tests::test_commit_commands::TestCommitCommands']]], + ['test_5fcommit_5fcode_5fwith_5fjira_5fclient_1',['test_commit_code_with_jira_client',['../classtests_1_1test__commit__commands_1_1TestCommitCommands.html#af9c09013055ec39ddde86b487aefcf8b',1,'tests::test_commit_commands::TestCommitCommands']]], + ['test_5fcommit_5fcode_5fwith_5fjira_5fconnection_5ffailure_2',['test_commit_code_with_jira_connection_failure',['../classtests_1_1test__commit__commands_1_1TestCommitCommands.html#acea0d934ee0f2b914b0b893736e8fe4e',1,'tests::test_commit_commands::TestCommitCommands']]], + ['test_5fcommit_5fcode_5fwith_5fllm_5fclient_3',['test_commit_code_with_llm_client',['../classtests_1_1test__commit__commands_1_1TestCommitCommands.html#acc4b1e4189792a3f7c11d2a745f479c0',1,'tests::test_commit_commands::TestCommitCommands']]], + ['test_5fconfig_5fjira_5fweb_5fserver_5fsetup_4',['test_config_jira_web_server_setup',['../classtests_1_1test__web__config_1_1TestWebConfig.html#a06e600222e426b003850509cb1d3190a',1,'tests::test_web_config::TestWebConfig']]], + ['test_5fconfig_5fllm_5fweb_5fserver_5fsetup_5',['test_config_llm_web_server_setup',['../classtests_1_1test__web__config_1_1TestWebConfig.html#afc6440352201d207ea8b4d26f8ccfa35',1,'tests::test_web_config::TestWebConfig']]], + ['test_5fgenerate_5fdoc_5ferror_5fhandling_6',['test_generate_doc_error_handling',['../namespacetests_1_1test__doc__commands.html#aec76cc25c23476794234cdadbcaef0c0',1,'tests::test_doc_commands']]], + ['test_5fgenerate_5fdoc_5ffile_5flocation_7',['test_generate_doc_file_location',['../namespacetests_1_1test__doc__commands.html#a0e74c920f258f442914771164fe26b45',1,'tests::test_doc_commands']]], + ['test_5fgenerate_5fdoc_5ffolder_5flocation_8',['test_generate_doc_folder_location',['../namespacetests_1_1test__doc__commands.html#a4bb75610e40d94d42bc169b25403c186',1,'tests::test_doc_commands']]], + ['test_5fgenerate_5fdoc_5fno_5flocation_9',['test_generate_doc_no_location',['../namespacetests_1_1test__doc__commands.html#a806110833eb0aad547156faf014b31d8',1,'tests::test_doc_commands']]], + ['test_5fgenerate_5fdoc_5fwith_5ffile_5fexception_10',['test_generate_doc_with_file_exception',['../namespacetests_1_1test__doc__commands.html#a335e7fd4912192c7276cf31bbebc6eb0',1,'tests::test_doc_commands']]], + ['test_5fgenerate_5fdoc_5fwith_5ffolder_5fexception_11',['test_generate_doc_with_folder_exception',['../namespacetests_1_1test__doc__commands.html#a64165ddfdb3071a88422f080f0e529a3',1,'tests::test_doc_commands']]], + ['test_5fget_5fjira_5fconfig_5fexists_12',['test_get_jira_config_exists',['../classtests_1_1test__config__commands_1_1TestConfigCommands.html#aee37b97432821d19758c6325d4c74bcf',1,'tests::test_config_commands::TestConfigCommands']]], + ['test_5fget_5fllm_5fconfig_5fempty_13',['test_get_llm_config_empty',['../classtests_1_1test__config__commands_1_1TestConfigCommands.html#abd12f028b89aa9cd1152c0b9ece5d3cd',1,'tests::test_config_commands::TestConfigCommands']]], + ['test_5fget_5fllm_5fconfig_5fexists_14',['test_get_llm_config_exists',['../classtests_1_1test__config__commands_1_1TestConfigCommands.html#adf9f2233a3f4cc5725b9d4f05758b167',1,'tests::test_config_commands::TestConfigCommands']]], + ['test_5fget_5fllm_5fconfig_5finvalid_5fjson_15',['test_get_llm_config_invalid_json',['../classtests_1_1test__config__commands_1_1TestConfigCommands.html#a473984d31452b56acd6ce4011a1248bd',1,'tests::test_config_commands::TestConfigCommands']]], + ['test_5fget_5fpenify_5fconfig_5fexisting_5fdir_16',['test_get_penify_config_existing_dir',['../classtests_1_1test__config__commands_1_1TestConfigCommands.html#a2e8162082bcdd5652bb37bdb14cf453a',1,'tests::test_config_commands::TestConfigCommands']]], + ['test_5fget_5fpenify_5fconfig_5fnew_5fdir_17',['test_get_penify_config_new_dir',['../classtests_1_1test__config__commands_1_1TestConfigCommands.html#a33d4760eee3b67e1cde3aed755ebb948',1,'tests::test_config_commands::TestConfigCommands']]], + ['test_5fget_5ftoken_5ffrom_5fconfig_18',['test_get_token_from_config',['../classtests_1_1test__config__commands_1_1TestConfigCommands.html#a6c0207be563c3de59a6d16277805114c',1,'tests::test_config_commands::TestConfigCommands']]], + ['test_5fget_5ftoken_5ffrom_5fenv_19',['test_get_token_from_env',['../classtests_1_1test__config__commands_1_1TestConfigCommands.html#a3355f7d313bebaa71694387cf2bc5232',1,'tests::test_config_commands::TestConfigCommands']]], + ['test_5fget_5ftoken_5fnot_5ffound_20',['test_get_token_not_found',['../classtests_1_1test__config__commands_1_1TestConfigCommands.html#a400ca5d9fcdc159714e8df54920f9436',1,'tests::test_config_commands::TestConfigCommands']]], + ['test_5fhandle_5fcommit_21',['test_handle_commit',['../classtests_1_1test__commit__commands_1_1TestCommitCommands.html#ac13e368262340af98b30fd8ebdac6597',1,'tests::test_commit_commands::TestCommitCommands']]], + ['test_5fhandle_5fdocgen_5fgenerate_22',['test_handle_docgen_generate',['../namespacetests_1_1test__doc__commands.html#ab158ffa48469b6c097a7a55fcb20c21a',1,'tests::test_doc_commands']]], + ['test_5fhandle_5fdocgen_5finstall_5fhook_23',['test_handle_docgen_install_hook',['../namespacetests_1_1test__doc__commands.html#ab74688baa8c9b5ba302c2877a9789d05',1,'tests::test_doc_commands']]], + ['test_5fhandle_5fdocgen_5fno_5ftoken_24',['test_handle_docgen_no_token',['../namespacetests_1_1test__doc__commands.html#af9b01e5fc89255cac96747fa081c442c',1,'tests::test_doc_commands']]], + ['test_5fhandle_5fdocgen_5funinstall_5fhook_25',['test_handle_docgen_uninstall_hook',['../namespacetests_1_1test__doc__commands.html#a1458af9ad0128c3ca1263b552fd5e482',1,'tests::test_doc_commands']]], + ['test_5fsave_5fjira_5fconfig_5fsuccess_26',['test_save_jira_config_success',['../classtests_1_1test__config__commands_1_1TestConfigCommands.html#af8d62310da2d768e21770f8f01ff5375',1,'tests::test_config_commands::TestConfigCommands']]], + ['test_5fsave_5fllm_5fconfig_5ffailure_27',['test_save_llm_config_failure',['../classtests_1_1test__config__commands_1_1TestConfigCommands.html#a73a264dfb21e16003e095b79f6eab2ac',1,'tests::test_config_commands::TestConfigCommands']]], + ['test_5fsave_5fllm_5fconfig_5fsuccess_28',['test_save_llm_config_success',['../classtests_1_1test__config__commands_1_1TestConfigCommands.html#acd8df8219441b9e9871b903a681400d9',1,'tests::test_config_commands::TestConfigCommands']]], + ['test_5fsetup_5fcommit_5fparser_29',['test_setup_commit_parser',['../classtests_1_1test__commit__commands_1_1TestCommitCommands.html#a4d04b125e102190a768f65f1948f15bc',1,'tests::test_commit_commands::TestCommitCommands']]], + ['test_5fsetup_5fdocgen_5fparser_30',['test_setup_docgen_parser',['../namespacetests_1_1test__doc__commands.html#a0f27751d0ba2acfe40ef7e85bccf47d7',1,'tests::test_doc_commands']]] +]; diff --git a/docs/html/search/functions_e.html b/docs/html/search/functions_e.html new file mode 100644 index 0000000..e55bbf1 --- /dev/null +++ b/docs/html/search/functions_e.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/docs/html/search/functions_e.js b/docs/html/search/functions_e.js new file mode 100644 index 0000000..60953c2 --- /dev/null +++ b/docs/html/search/functions_e.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['uninstall_5fgit_5fhook_0',['uninstall_git_hook',['../namespacepenify__hook_1_1commands_1_1hook__commands.html#a81543eb5fa835fd1237f24e8bce6201d',1,'penify_hook::commands::hook_commands']]], + ['update_5fissue_5fstatus_1',['update_issue_status',['../classpenify__hook_1_1jira__client_1_1JiraClient.html#aca8837552d37bfd611de23441a240826',1,'penify_hook::jira_client::JiraClient']]], + ['update_5fstage_2',['update_stage',['../namespacepenify__hook_1_1ui__utils.html#a5a7340d0fc60fb80f17514d60bf45f1d',1,'penify_hook::ui_utils']]] +]; diff --git a/docs/html/search/mag_sel.svg b/docs/html/search/mag_sel.svg new file mode 100644 index 0000000..03626f6 --- /dev/null +++ b/docs/html/search/mag_sel.svg @@ -0,0 +1,74 @@ + + + + + + + + image/svg+xml + + + + + + + + + + + diff --git a/docs/html/search/namespaces_0.html b/docs/html/search/namespaces_0.html new file mode 100644 index 0000000..b2d68fe --- /dev/null +++ b/docs/html/search/namespaces_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/docs/html/search/namespaces_0.js b/docs/html/search/namespaces_0.js new file mode 100644 index 0000000..3a1e6d3 --- /dev/null +++ b/docs/html/search/namespaces_0.js @@ -0,0 +1,24 @@ +var searchData= +[ + ['api_5fclient_0',['api_client',['../namespacepenify__hook_1_1api__client.html',1,'penify_hook']]], + ['auth_5fcommands_1',['auth_commands',['../namespacepenify__hook_1_1commands_1_1auth__commands.html',1,'penify_hook::commands']]], + ['base_5fanalyzer_2',['base_analyzer',['../namespacepenify__hook_1_1base__analyzer.html',1,'penify_hook']]], + ['commands_3',['commands',['../namespacepenify__hook_1_1commands.html',1,'penify_hook']]], + ['commit_5fanalyzer_4',['commit_analyzer',['../namespacepenify__hook_1_1commit__analyzer.html',1,'penify_hook']]], + ['commit_5fcommands_5',['commit_commands',['../namespacepenify__hook_1_1commands_1_1commit__commands.html',1,'penify_hook::commands']]], + ['config_5fcommand_6',['config_command',['../namespacepenify__hook_1_1config__command.html',1,'penify_hook']]], + ['config_5fcommands_7',['config_commands',['../namespacepenify__hook_1_1commands_1_1config__commands.html',1,'penify_hook::commands']]], + ['constants_8',['constants',['../namespacepenify__hook_1_1constants.html',1,'penify_hook']]], + ['doc_5fcommands_9',['doc_commands',['../namespacepenify__hook_1_1commands_1_1doc__commands.html',1,'penify_hook::commands']]], + ['file_5fanalyzer_10',['file_analyzer',['../namespacepenify__hook_1_1file__analyzer.html',1,'penify_hook']]], + ['folder_5fanalyzer_11',['folder_analyzer',['../namespacepenify__hook_1_1folder__analyzer.html',1,'penify_hook']]], + ['git_5fanalyzer_12',['git_analyzer',['../namespacepenify__hook_1_1git__analyzer.html',1,'penify_hook']]], + ['hook_5fcommands_13',['hook_commands',['../namespacepenify__hook_1_1commands_1_1hook__commands.html',1,'penify_hook::commands']]], + ['jira_5fclient_14',['jira_client',['../namespacepenify__hook_1_1jira__client.html',1,'penify_hook']]], + ['llm_5fclient_15',['llm_client',['../namespacepenify__hook_1_1llm__client.html',1,'penify_hook']]], + ['login_5fcommand_16',['login_command',['../namespacepenify__hook_1_1login__command.html',1,'penify_hook']]], + ['main_17',['main',['../namespacepenify__hook_1_1main.html',1,'penify_hook']]], + ['penify_5fhook_18',['penify_hook',['../namespacepenify__hook.html',1,'']]], + ['ui_5futils_19',['ui_utils',['../namespacepenify__hook_1_1ui__utils.html',1,'penify_hook']]], + ['utils_20',['utils',['../namespacepenify__hook_1_1utils.html',1,'penify_hook']]] +]; diff --git a/docs/html/search/namespaces_1.html b/docs/html/search/namespaces_1.html new file mode 100644 index 0000000..a4b1530 --- /dev/null +++ b/docs/html/search/namespaces_1.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/docs/html/search/namespaces_1.js b/docs/html/search/namespaces_1.js new file mode 100644 index 0000000..fdca1a8 --- /dev/null +++ b/docs/html/search/namespaces_1.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['setup_0',['setup',['../namespacesetup.html',1,'']]] +]; diff --git a/docs/html/search/namespaces_2.html b/docs/html/search/namespaces_2.html new file mode 100644 index 0000000..a89a756 --- /dev/null +++ b/docs/html/search/namespaces_2.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/docs/html/search/namespaces_2.js b/docs/html/search/namespaces_2.js new file mode 100644 index 0000000..10ec4ce --- /dev/null +++ b/docs/html/search/namespaces_2.js @@ -0,0 +1,9 @@ +var searchData= +[ + ['conftest_0',['conftest',['../namespacetests_1_1conftest.html',1,'tests']]], + ['test_5fcommit_5fcommands_1',['test_commit_commands',['../namespacetests_1_1test__commit__commands.html',1,'tests']]], + ['test_5fconfig_5fcommands_2',['test_config_commands',['../namespacetests_1_1test__config__commands.html',1,'tests']]], + ['test_5fdoc_5fcommands_3',['test_doc_commands',['../namespacetests_1_1test__doc__commands.html',1,'tests']]], + ['test_5fweb_5fconfig_4',['test_web_config',['../namespacetests_1_1test__web__config.html',1,'tests']]], + ['tests_5',['tests',['../namespacetests.html',1,'']]] +]; diff --git a/docs/html/search/nomatches.html b/docs/html/search/nomatches.html new file mode 100644 index 0000000..2b9360b --- /dev/null +++ b/docs/html/search/nomatches.html @@ -0,0 +1,13 @@ + + + + + + + + +
    +
    No Matches
    +
    + + diff --git a/docs/html/search/pages_0.html b/docs/html/search/pages_0.html new file mode 100644 index 0000000..1981712 --- /dev/null +++ b/docs/html/search/pages_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/docs/html/search/pages_0.js b/docs/html/search/pages_0.js new file mode 100644 index 0000000..3cd36ca --- /dev/null +++ b/docs/html/search/pages_0.js @@ -0,0 +1,9 @@ +var searchData= +[ + ['penify_20cli_20_2d_20commit_20commands_0',['Penify CLI - Commit Commands',['../md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_commit_commands.html',1,'']]], + ['penify_20cli_20_2d_20configuration_20commands_1',['Penify CLI - Configuration Commands',['../md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_config_commands.html',1,'']]], + ['penify_20cli_20_2d_20detailed_20usage_20guide_2',['Penify CLI - Detailed Usage Guide',['../md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_detailed_usage.html',1,'']]], + ['penify_20cli_20_2d_20documentation_20generation_20commands_3',['Penify CLI - Documentation Generation Commands',['../md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_doc_commands.html',1,'']]], + ['penify_20cli_20example_20workflows_4',['Penify CLI Example Workflows',['../md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_example_workflows.html',1,'']]], + ['penify_20cli_20tool_5',['Penify CLI Tool',['../md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_README.html',1,'']]] +]; diff --git a/docs/html/search/search.css b/docs/html/search/search.css new file mode 100644 index 0000000..648a792 --- /dev/null +++ b/docs/html/search/search.css @@ -0,0 +1,263 @@ +/*---------------- Search Box */ + +#MSearchBox { + white-space : nowrap; + background: white; + border-radius: 0.65em; + box-shadow: inset 0.5px 0.5px 3px 0px #555; + z-index: 102; +} + +#MSearchBox .left { + display: inline-block; + vertical-align: middle; + height: 1.4em; +} + +#MSearchSelect { + display: inline-block; + vertical-align: middle; + height: 19px; + padding: 0 0 0 0.3em; + margin: 0; +} + +#MSearchField { + display: inline-block; + vertical-align: middle; + width: 7.5em; + height: 19px; + margin: 0 0.15em; + padding: 0; + line-height: 1em; + border:none; + color: #909090; + outline: none; + font-family: Arial, Verdana, sans-serif; + -webkit-border-radius: 0px; + border-radius: 0px; + background: none; +} + +@media(hover: none) { + /* to avoid zooming on iOS */ + #MSearchField { + font-size: 16px; + } +} + +#MSearchBox .right { + display: inline-block; + vertical-align: middle; + width: 1.4em; + height: 1.4em; +} + +#MSearchClose { + display: none; + font-size: inherit; + background : none; + border: none; + margin: 0; + padding: 0; + outline: none; + +} + +#MSearchCloseImg { + height: 1.4em; + padding: 0.3em; + margin: 0; +} + +.MSearchBoxActive #MSearchField { + color: #000000; +} + +#main-menu > li:last-child { + /* This
  • object is the parent of the search bar */ + display: flex; + justify-content: center; + align-items: center; + height: 36px; + margin-right: 1em; +} + +/*---------------- Search filter selection */ + +#MSearchSelectWindow { + display: none; + position: absolute; + left: 0; top: 0; + border: 1px solid #90A5CE; + background-color: #F9FAFC; + z-index: 10001; + padding-top: 4px; + padding-bottom: 4px; + -moz-border-radius: 4px; + -webkit-border-top-left-radius: 4px; + -webkit-border-top-right-radius: 4px; + -webkit-border-bottom-left-radius: 4px; + -webkit-border-bottom-right-radius: 4px; + -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); +} + +.SelectItem { + font: 8pt Arial, Verdana, sans-serif; + padding-left: 2px; + padding-right: 12px; + border: 0px; +} + +span.SelectionMark { + margin-right: 4px; + font-family: monospace; + outline-style: none; + text-decoration: none; +} + +a.SelectItem { + display: block; + outline-style: none; + color: #000000; + text-decoration: none; + padding-left: 6px; + padding-right: 12px; +} + +a.SelectItem:focus, +a.SelectItem:active { + color: #000000; + outline-style: none; + text-decoration: none; +} + +a.SelectItem:hover { + color: #FFFFFF; + background-color: #3D578C; + outline-style: none; + text-decoration: none; + cursor: pointer; + display: block; +} + +/*---------------- Search results window */ + +iframe#MSearchResults { + /*width: 60ex;*/ + height: 15em; +} + +#MSearchResultsWindow { + display: none; + position: absolute; + left: 0; top: 0; + border: 1px solid #000; + background-color: #EEF1F7; + z-index:10000; +} + +/* ----------------------------------- */ + + +#SRIndex { + clear:both; + padding-bottom: 15px; +} + +.SREntry { + font-size: 10pt; + padding-left: 1ex; +} + +.SRPage .SREntry { + font-size: 8pt; + padding: 1px 5px; +} + +body.SRPage { + margin: 5px 2px; +} + +.SRChildren { + padding-left: 3ex; padding-bottom: .5em +} + +.SRPage .SRChildren { + display: none; +} + +.SRSymbol { + font-weight: bold; + color: #425E97; + font-family: Arial, Verdana, sans-serif; + text-decoration: none; + outline: none; +} + +a.SRScope { + display: block; + color: #425E97; + font-family: Arial, Verdana, sans-serif; + text-decoration: none; + outline: none; +} + +a.SRSymbol:focus, a.SRSymbol:active, +a.SRScope:focus, a.SRScope:active { + text-decoration: underline; +} + +span.SRScope { + padding-left: 4px; + font-family: Arial, Verdana, sans-serif; +} + +.SRPage .SRStatus { + padding: 2px 5px; + font-size: 8pt; + font-style: italic; + font-family: Arial, Verdana, sans-serif; +} + +.SRResult { + display: none; +} + +div.searchresults { + margin-left: 10px; + margin-right: 10px; +} + +/*---------------- External search page results */ + +.searchresult { + background-color: #F0F3F8; +} + +.pages b { + color: white; + padding: 5px 5px 3px 5px; + background-image: url("../tab_a.png"); + background-repeat: repeat-x; + text-shadow: 0 1px 1px #000000; +} + +.pages { + line-height: 17px; + margin-left: 4px; + text-decoration: none; +} + +.hl { + font-weight: bold; +} + +#searchresults { + margin-bottom: 20px; +} + +.searchpages { + margin-top: 10px; +} + diff --git a/docs/html/search/search.js b/docs/html/search/search.js new file mode 100644 index 0000000..607f4e1 --- /dev/null +++ b/docs/html/search/search.js @@ -0,0 +1,802 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file + */ +function convertToId(search) +{ + var result = ''; + for (i=0;i do a search + { + this.Search(); + } + } + + this.OnSearchSelectKey = function(evt) + { + var e = (evt) ? evt : window.event; // for IE + if (e.keyCode==40 && this.searchIndex0) // Up + { + this.searchIndex--; + this.OnSelectItem(this.searchIndex); + } + else if (e.keyCode==13 || e.keyCode==27) + { + this.OnSelectItem(this.searchIndex); + this.CloseSelectionWindow(); + this.DOMSearchField().focus(); + } + return false; + } + + // --------- Actions + + // Closes the results window. + this.CloseResultsWindow = function() + { + this.DOMPopupSearchResultsWindow().style.display = 'none'; + this.DOMSearchClose().style.display = 'none'; + this.Activate(false); + } + + this.CloseSelectionWindow = function() + { + this.DOMSearchSelectWindow().style.display = 'none'; + } + + // Performs a search. + this.Search = function() + { + this.keyTimeout = 0; + + // strip leading whitespace + var searchValue = this.DOMSearchField().value.replace(/^ +/, ""); + + var code = searchValue.toLowerCase().charCodeAt(0); + var idxChar = searchValue.substr(0, 1).toLowerCase(); + if ( 0xD800 <= code && code <= 0xDBFF && searchValue > 1) // surrogate pair + { + idxChar = searchValue.substr(0, 2); + } + + var resultsPage; + var resultsPageWithSearch; + var hasResultsPage; + + var idx = indexSectionsWithContent[this.searchIndex].indexOf(idxChar); + if (idx!=-1) + { + var hexCode=idx.toString(16); + resultsPage = this.resultsPath + '/' + indexSectionNames[this.searchIndex] + '_' + hexCode + this.extension; + resultsPageWithSearch = resultsPage+'?'+escape(searchValue); + hasResultsPage = true; + } + else // nothing available for this search term + { + resultsPage = this.resultsPath + '/nomatches' + this.extension; + resultsPageWithSearch = resultsPage; + hasResultsPage = false; + } + + window.frames.MSearchResults.location = resultsPageWithSearch; + var domPopupSearchResultsWindow = this.DOMPopupSearchResultsWindow(); + + if (domPopupSearchResultsWindow.style.display!='block') + { + var domSearchBox = this.DOMSearchBox(); + this.DOMSearchClose().style.display = 'inline-block'; + var domPopupSearchResults = this.DOMPopupSearchResults(); + var left = getXPos(domSearchBox) + 150; // domSearchBox.offsetWidth; + var top = getYPos(domSearchBox) + 20; // domSearchBox.offsetHeight + 1; + domPopupSearchResultsWindow.style.display = 'block'; + left -= domPopupSearchResults.offsetWidth; + var maxWidth = document.body.clientWidth; + var width = 400; + if (left<10) left=10; + if (width+left+8>maxWidth) width=maxWidth-left-8; + domPopupSearchResultsWindow.style.top = top + 'px'; + domPopupSearchResultsWindow.style.left = left + 'px'; + domPopupSearchResultsWindow.style.width = width + 'px'; + } + + this.lastSearchValue = searchValue; + this.lastResultsPage = resultsPage; + } + + // -------- Activation Functions + + // Activates or deactivates the search panel, resetting things to + // their default values if necessary. + this.Activate = function(isActive) + { + if (isActive || // open it + this.DOMPopupSearchResultsWindow().style.display == 'block' + ) + { + this.DOMSearchBox().className = 'MSearchBoxActive'; + + var searchField = this.DOMSearchField(); + + if (searchField.value == this.searchLabel) // clear "Search" term upon entry + { + searchField.value = ''; + this.searchActive = true; + } + } + else if (!isActive) // directly remove the panel + { + this.DOMSearchBox().className = 'MSearchBoxInactive'; + this.DOMSearchField().value = this.searchLabel; + this.searchActive = false; + this.lastSearchValue = '' + this.lastResultsPage = ''; + } + } +} + +// ----------------------------------------------------------------------- + +// The class that handles everything on the search results page. +function SearchResults(name) +{ + // The number of matches from the last run of . + this.lastMatchCount = 0; + this.lastKey = 0; + this.repeatOn = false; + + // Toggles the visibility of the passed element ID. + this.FindChildElement = function(id) + { + var parentElement = document.getElementById(id); + var element = parentElement.firstChild; + + while (element && element!=parentElement) + { + if (element.nodeName.toLowerCase() == 'div' && element.className == 'SRChildren') + { + return element; + } + + if (element.nodeName.toLowerCase() == 'div' && element.hasChildNodes()) + { + element = element.firstChild; + } + else if (element.nextSibling) + { + element = element.nextSibling; + } + else + { + do + { + element = element.parentNode; + } + while (element && element!=parentElement && !element.nextSibling); + + if (element && element!=parentElement) + { + element = element.nextSibling; + } + } + } + } + + this.Toggle = function(id) + { + var element = this.FindChildElement(id); + if (element) + { + if (element.style.display == 'block') + { + element.style.display = 'none'; + } + else + { + element.style.display = 'block'; + } + } + } + + // Searches for the passed string. If there is no parameter, + // it takes it from the URL query. + // + // Always returns true, since other documents may try to call it + // and that may or may not be possible. + this.Search = function(search) + { + if (!search) // get search word from URL + { + search = window.location.search; + search = search.substring(1); // Remove the leading '?' + search = unescape(search); + } + + search = search.replace(/^ +/, ""); // strip leading spaces + search = search.replace(/ +$/, ""); // strip trailing spaces + search = search.toLowerCase(); + search = convertToId(search); + + var resultRows = document.getElementsByTagName("div"); + var matches = 0; + + var i = 0; + while (i < resultRows.length) + { + var row = resultRows.item(i); + if (row.className == "SRResult") + { + var rowMatchName = row.id.toLowerCase(); + rowMatchName = rowMatchName.replace(/^sr\d*_/, ''); // strip 'sr123_' + + if (search.length<=rowMatchName.length && + rowMatchName.substr(0, search.length)==search) + { + row.style.display = 'block'; + matches++; + } + else + { + row.style.display = 'none'; + } + } + i++; + } + document.getElementById("Searching").style.display='none'; + if (matches == 0) // no results + { + document.getElementById("NoMatches").style.display='block'; + } + else // at least one result + { + document.getElementById("NoMatches").style.display='none'; + } + this.lastMatchCount = matches; + return true; + } + + // return the first item with index index or higher that is visible + this.NavNext = function(index) + { + var focusItem; + while (1) + { + var focusName = 'Item'+index; + focusItem = document.getElementById(focusName); + if (focusItem && focusItem.parentNode.parentNode.style.display=='block') + { + break; + } + else if (!focusItem) // last element + { + break; + } + focusItem=null; + index++; + } + return focusItem; + } + + this.NavPrev = function(index) + { + var focusItem; + while (1) + { + var focusName = 'Item'+index; + focusItem = document.getElementById(focusName); + if (focusItem && focusItem.parentNode.parentNode.style.display=='block') + { + break; + } + else if (!focusItem) // last element + { + break; + } + focusItem=null; + index--; + } + return focusItem; + } + + this.ProcessKeys = function(e) + { + if (e.type == "keydown") + { + this.repeatOn = false; + this.lastKey = e.keyCode; + } + else if (e.type == "keypress") + { + if (!this.repeatOn) + { + if (this.lastKey) this.repeatOn = true; + return false; // ignore first keypress after keydown + } + } + else if (e.type == "keyup") + { + this.lastKey = 0; + this.repeatOn = false; + } + return this.lastKey!=0; + } + + this.Nav = function(evt,itemIndex) + { + var e = (evt) ? evt : window.event; // for IE + if (e.keyCode==13) return true; + if (!this.ProcessKeys(e)) return false; + + if (this.lastKey==38) // Up + { + var newIndex = itemIndex-1; + var focusItem = this.NavPrev(newIndex); + if (focusItem) + { + var child = this.FindChildElement(focusItem.parentNode.parentNode.id); + if (child && child.style.display == 'block') // children visible + { + var n=0; + var tmpElem; + while (1) // search for last child + { + tmpElem = document.getElementById('Item'+newIndex+'_c'+n); + if (tmpElem) + { + focusItem = tmpElem; + } + else // found it! + { + break; + } + n++; + } + } + } + if (focusItem) + { + focusItem.focus(); + } + else // return focus to search field + { + parent.document.getElementById("MSearchField").focus(); + } + } + else if (this.lastKey==40) // Down + { + var newIndex = itemIndex+1; + var focusItem; + var item = document.getElementById('Item'+itemIndex); + var elem = this.FindChildElement(item.parentNode.parentNode.id); + if (elem && elem.style.display == 'block') // children visible + { + focusItem = document.getElementById('Item'+itemIndex+'_c0'); + } + if (!focusItem) focusItem = this.NavNext(newIndex); + if (focusItem) focusItem.focus(); + } + else if (this.lastKey==39) // Right + { + var item = document.getElementById('Item'+itemIndex); + var elem = this.FindChildElement(item.parentNode.parentNode.id); + if (elem) elem.style.display = 'block'; + } + else if (this.lastKey==37) // Left + { + var item = document.getElementById('Item'+itemIndex); + var elem = this.FindChildElement(item.parentNode.parentNode.id); + if (elem) elem.style.display = 'none'; + } + else if (this.lastKey==27) // Escape + { + parent.searchBox.CloseResultsWindow(); + parent.document.getElementById("MSearchField").focus(); + } + else if (this.lastKey==13) // Enter + { + return true; + } + return false; + } + + this.NavChild = function(evt,itemIndex,childIndex) + { + var e = (evt) ? evt : window.event; // for IE + if (e.keyCode==13) return true; + if (!this.ProcessKeys(e)) return false; + + if (this.lastKey==38) // Up + { + if (childIndex>0) + { + var newIndex = childIndex-1; + document.getElementById('Item'+itemIndex+'_c'+newIndex).focus(); + } + else // already at first child, jump to parent + { + document.getElementById('Item'+itemIndex).focus(); + } + } + else if (this.lastKey==40) // Down + { + var newIndex = childIndex+1; + var elem = document.getElementById('Item'+itemIndex+'_c'+newIndex); + if (!elem) // last child, jump to parent next parent + { + elem = this.NavNext(itemIndex+1); + } + if (elem) + { + elem.focus(); + } + } + else if (this.lastKey==27) // Escape + { + parent.searchBox.CloseResultsWindow(); + parent.document.getElementById("MSearchField").focus(); + } + else if (this.lastKey==13) // Enter + { + return true; + } + return false; + } +} + +function setKeyActions(elem,action) +{ + elem.setAttribute('onkeydown',action); + elem.setAttribute('onkeypress',action); + elem.setAttribute('onkeyup',action); +} + +function setClassAttr(elem,attr) +{ + elem.setAttribute('class',attr); + elem.setAttribute('className',attr); +} + +function createResults() +{ + var results = document.getElementById("SRResults"); + for (var e=0; e(R!W8j_r#qQ#gnr4kAxdU#F0+OBry$Z+ z_0PMi;P|#{d%mw(dnw=jM%@$onTJa%@6Nm3`;2S#nwtVFJI#`U@2Q@@JCCctagvF- z8H=anvo~dTmJ2YA%wA6IHRv%{vxvUm|R)kgZeo zmX%Zb;mpflGZdXCTAgit`||AFzkI#z&(3d4(htA?U2FOL4WF6wY&TB#n3n*I4+hl| z*NBpo#FA92vEu822WQ%mvv4FO#qs` BFGc_W literal 0 HcmV?d00001 diff --git a/docs/html/search/search_r.png b/docs/html/search/search_r.png new file mode 100644 index 0000000000000000000000000000000000000000..1af5d21ee13e070d7600f1c4657fde843b953a69 GIT binary patch literal 553 zcmeAS@N?(olHy`uVBq!ia0vp^LO?9c!2%@BXHTsJQY`6?zK#qG8~eHcB(ehe3dtTp zz6=bxGZ+|(`xqD=STHa&U1eaXVrO7DwS|Gf*oA>XrmV$GYcEhOQT(QLuS{~ooZ2P@v=Xc@RKW@Irliv8_;wroU0*)0O?temdsA~70jrdux+`@W7 z-N(<(C)L?hOO?KV{>8(jC{hpKsws)#Fh zvsO>IB+gb@b+rGWaO&!a9Z{!U+fV*s7TS>fdt&j$L%^U@Epd$~Nl7e8wMs5Z1yT$~ z28I^8hDN#u<{^fLRz?<9hUVG^237_Jy7tbuQ8eV{r(~v8;?@w8^gA7>fx*+&&t;uc GLK6VEQpiUD literal 0 HcmV?d00001 diff --git a/docs/html/search/searchdata.js b/docs/html/search/searchdata.js new file mode 100644 index 0000000..37552a5 --- /dev/null +++ b/docs/html/search/searchdata.js @@ -0,0 +1,33 @@ +var indexSectionsWithContent = +{ + 0: "_abcdefghijlmnprstuvw", + 1: "abcefgjlt", + 2: "pst", + 3: "_abcdefghjlmprstu", + 4: "_acefghilmprstu", + 5: "_abcdefhijlmnprsuvw", + 6: "p" +}; + +var indexSectionNames = +{ + 0: "all", + 1: "classes", + 2: "namespaces", + 3: "files", + 4: "functions", + 5: "variables", + 6: "pages" +}; + +var indexSectionLabels = +{ + 0: "All", + 1: "Classes", + 2: "Namespaces", + 3: "Files", + 4: "Functions", + 5: "Variables", + 6: "Pages" +}; + diff --git a/docs/html/search/variables_0.html b/docs/html/search/variables_0.html new file mode 100644 index 0000000..fd893a6 --- /dev/null +++ b/docs/html/search/variables_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/docs/html/search/variables_0.js b/docs/html/search/variables_0.js new file mode 100644 index 0000000..ee0a9ff --- /dev/null +++ b/docs/html/search/variables_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['_5flitellm_0',['_litellm',['../classpenify__hook_1_1llm__client_1_1LLMClient.html#a76c2e9805f805624ab9c55a9f1f8d362',1,'penify_hook::llm_client::LLMClient']]] +]; diff --git a/docs/html/search/variables_1.html b/docs/html/search/variables_1.html new file mode 100644 index 0000000..5f8e440 --- /dev/null +++ b/docs/html/search/variables_1.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/docs/html/search/variables_1.js b/docs/html/search/variables_1.js new file mode 100644 index 0000000..a34ece5 --- /dev/null +++ b/docs/html/search/variables_1.js @@ -0,0 +1,10 @@ +var searchData= +[ + ['api_5fclient_0',['api_client',['../classpenify__hook_1_1base__analyzer_1_1BaseAnalyzer.html#a81e9c55709205aaf4ebbe2b41683baf2',1,'penify_hook::base_analyzer::BaseAnalyzer']]], + ['api_5furl_1',['api_url',['../classpenify__hook_1_1api__client_1_1APIClient.html#a130cf688ed35dc0e8cbd8320b6b2d872',1,'penify_hook::api_client::APIClient']]], + ['api_5furl_2',['API_URL',['../namespacepenify__hook_1_1constants.html#af198b5d1fc2f44657a2061aa324af3e0',1,'penify_hook::constants']]], + ['auth_5ftoken_3',['AUTH_TOKEN',['../classpenify__hook_1_1api__client_1_1APIClient.html#a5bb502603717946ad710b49ad9d95237',1,'penify_hook::api_client::APIClient']]], + ['author_4',['author',['../namespacesetup.html#a3a57a4772d418a06835249cbade0d86a',1,'setup']]], + ['author_5femail_5',['author_email',['../namespacesetup.html#a5b08034343aa2be607722a8b315f3625',1,'setup']]], + ['autoreset_6',['autoreset',['../namespacepenify__hook_1_1ui__utils.html#ab560cfade398ac1e0bd47befb52d9f71',1,'penify_hook::ui_utils']]] +]; diff --git a/docs/html/search/variables_10.html b/docs/html/search/variables_10.html new file mode 100644 index 0000000..943cbd1 --- /dev/null +++ b/docs/html/search/variables_10.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/docs/html/search/variables_10.js b/docs/html/search/variables_10.js new file mode 100644 index 0000000..28d0871 --- /dev/null +++ b/docs/html/search/variables_10.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['url_0',['url',['../namespacesetup.html#afc13124aa5c0124e84e1d965e3f4b0fb',1,'setup']]] +]; diff --git a/docs/html/search/variables_11.html b/docs/html/search/variables_11.html new file mode 100644 index 0000000..47f1ec5 --- /dev/null +++ b/docs/html/search/variables_11.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/docs/html/search/variables_11.js b/docs/html/search/variables_11.js new file mode 100644 index 0000000..d9621d9 --- /dev/null +++ b/docs/html/search/variables_11.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['version_0',['version',['../namespacesetup.html#a2aa722b36a933088812b50ea79b97a5c',1,'setup']]] +]; diff --git a/docs/html/search/variables_12.html b/docs/html/search/variables_12.html new file mode 100644 index 0000000..2842f66 --- /dev/null +++ b/docs/html/search/variables_12.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/docs/html/search/variables_12.js b/docs/html/search/variables_12.js new file mode 100644 index 0000000..10d696f --- /dev/null +++ b/docs/html/search/variables_12.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['warning_5fcolor_0',['WARNING_COLOR',['../namespacepenify__hook_1_1ui__utils.html#a177bc9b44157844c999e0c1c2c6936ff',1,'penify_hook::ui_utils']]], + ['warning_5fsymbol_1',['WARNING_SYMBOL',['../namespacepenify__hook_1_1ui__utils.html#a6eaea98f1a8cbe16a181647da2fc0a16',1,'penify_hook::ui_utils']]] +]; diff --git a/docs/html/search/variables_2.html b/docs/html/search/variables_2.html new file mode 100644 index 0000000..77a7f48 --- /dev/null +++ b/docs/html/search/variables_2.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/docs/html/search/variables_2.js b/docs/html/search/variables_2.js new file mode 100644 index 0000000..d02ac2e --- /dev/null +++ b/docs/html/search/variables_2.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['bearer_5ftoken_0',['BEARER_TOKEN',['../classpenify__hook_1_1api__client_1_1APIClient.html#a7d7e2cf42c54eb4f25adee96a09ee7b0',1,'penify_hook::api_client::APIClient']]] +]; diff --git a/docs/html/search/variables_3.html b/docs/html/search/variables_3.html new file mode 100644 index 0000000..3ee62ba --- /dev/null +++ b/docs/html/search/variables_3.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/docs/html/search/variables_3.js b/docs/html/search/variables_3.js new file mode 100644 index 0000000..c6d851a --- /dev/null +++ b/docs/html/search/variables_3.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['classifiers_0',['classifiers',['../namespacesetup.html#abe96a9c38c1c61f9f0fdb002c482f785',1,'setup']]] +]; diff --git a/docs/html/search/variables_4.html b/docs/html/search/variables_4.html new file mode 100644 index 0000000..640713f --- /dev/null +++ b/docs/html/search/variables_4.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/docs/html/search/variables_4.js b/docs/html/search/variables_4.js new file mode 100644 index 0000000..ea198d0 --- /dev/null +++ b/docs/html/search/variables_4.js @@ -0,0 +1,8 @@ +var searchData= +[ + ['dashboard_5furl_0',['DASHBOARD_URL',['../namespacepenify__hook_1_1constants.html#a316c5a606e4440fb8224c6544c3a15f0',1,'penify_hook::constants']]], + ['description_1',['description',['../namespacesetup.html#aedf461ec52a946bda975938ba0b93ec0',1,'setup']]], + ['dir_5fpath_2',['dir_path',['../classpenify__hook_1_1folder__analyzer_1_1FolderAnalyzerGenHook.html#a53f73d69cc0f00763ee4830e4f0f7393',1,'penify_hook::folder_analyzer::FolderAnalyzerGenHook']]], + ['docgen_5fdescription_3',['docgen_description',['../namespacepenify__hook_1_1commands_1_1doc__commands.html#a3e42540047da37565afffeaf106cb948',1,'penify_hook::commands::doc_commands']]], + ['dotenv_5favailable_4',['DOTENV_AVAILABLE',['../namespacepenify__hook_1_1commands_1_1config__commands.html#a152642ab83cf6219b604bda6122aba67',1,'penify_hook::commands::config_commands']]] +]; diff --git a/docs/html/search/variables_5.html b/docs/html/search/variables_5.html new file mode 100644 index 0000000..7b2ba97 --- /dev/null +++ b/docs/html/search/variables_5.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/docs/html/search/variables_5.js b/docs/html/search/variables_5.js new file mode 100644 index 0000000..0ca10cf --- /dev/null +++ b/docs/html/search/variables_5.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['entry_5fpoints_0',['entry_points',['../namespacesetup.html#ada7058afc98897f073d3f3b8b9157059',1,'setup']]], + ['error_5fcolor_1',['ERROR_COLOR',['../namespacepenify__hook_1_1ui__utils.html#a4ab4e61dfab7973c87bef59c6e1977fe',1,'penify_hook::ui_utils']]], + ['error_5fsymbol_2',['ERROR_SYMBOL',['../namespacepenify__hook_1_1ui__utils.html#aa564e1e1d016c8227d076542e74cecb0',1,'penify_hook::ui_utils']]] +]; diff --git a/docs/html/search/variables_6.html b/docs/html/search/variables_6.html new file mode 100644 index 0000000..fb1de8f --- /dev/null +++ b/docs/html/search/variables_6.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/docs/html/search/variables_6.js b/docs/html/search/variables_6.js new file mode 100644 index 0000000..6f038b5 --- /dev/null +++ b/docs/html/search/variables_6.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['file_5fpath_0',['file_path',['../classpenify__hook_1_1file__analyzer_1_1FileAnalyzerGenHook.html#a9b03b88a9ce1b9af945279375048dc32',1,'penify_hook::file_analyzer::FileAnalyzerGenHook']]], + ['folder_5fpath_1',['folder_path',['../classpenify__hook_1_1base__analyzer_1_1BaseAnalyzer.html#aa67c06dd12b1bafaeaee81c41dcb7e25',1,'penify_hook::base_analyzer::BaseAnalyzer']]] +]; diff --git a/docs/html/search/variables_7.html b/docs/html/search/variables_7.html new file mode 100644 index 0000000..cf8dcf4 --- /dev/null +++ b/docs/html/search/variables_7.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/docs/html/search/variables_7.js b/docs/html/search/variables_7.js new file mode 100644 index 0000000..05d3ba9 --- /dev/null +++ b/docs/html/search/variables_7.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['highlight_5fcolor_0',['HIGHLIGHT_COLOR',['../namespacepenify__hook_1_1ui__utils.html#aba01b8259f0d66cdc2b4a1b58f9736fc',1,'penify_hook::ui_utils']]], + ['hook_5ffilename_1',['HOOK_FILENAME',['../namespacepenify__hook_1_1commands_1_1hook__commands.html#ae82fd46e5a9219da1478b0476b8214b1',1,'penify_hook::commands::hook_commands']]], + ['hook_5ftemplate_2',['HOOK_TEMPLATE',['../namespacepenify__hook_1_1commands_1_1hook__commands.html#a6a45aad71c8d32ce11a6dff8cee8bee7',1,'penify_hook::commands::hook_commands']]] +]; diff --git a/docs/html/search/variables_8.html b/docs/html/search/variables_8.html new file mode 100644 index 0000000..88cbb01 --- /dev/null +++ b/docs/html/search/variables_8.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/docs/html/search/variables_8.js b/docs/html/search/variables_8.js new file mode 100644 index 0000000..6c4b704 --- /dev/null +++ b/docs/html/search/variables_8.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['info_5fcolor_0',['INFO_COLOR',['../namespacepenify__hook_1_1ui__utils.html#a9fdcb180915696f5d217032a62c3857c',1,'penify_hook::ui_utils']]], + ['install_5frequires_1',['install_requires',['../namespacesetup.html#abead4f26b530856f858f0d44c7cf2588',1,'setup']]] +]; diff --git a/docs/html/search/variables_9.html b/docs/html/search/variables_9.html new file mode 100644 index 0000000..36c49bd --- /dev/null +++ b/docs/html/search/variables_9.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/docs/html/search/variables_9.js b/docs/html/search/variables_9.js new file mode 100644 index 0000000..4d28226 --- /dev/null +++ b/docs/html/search/variables_9.js @@ -0,0 +1,8 @@ +var searchData= +[ + ['jira_5fapi_5ftoken_0',['jira_api_token',['../classpenify__hook_1_1jira__client_1_1JiraClient.html#afc5c90e53b702f9fc27e2ee7d3f991b9',1,'penify_hook::jira_client::JiraClient']]], + ['jira_5favailable_1',['JIRA_AVAILABLE',['../namespacepenify__hook_1_1jira__client.html#a5593ea3415081eca1eea92e4c1ad1aa2',1,'penify_hook::jira_client']]], + ['jira_5fclient_2',['jira_client',['../classpenify__hook_1_1jira__client_1_1JiraClient.html#aefb3f96c79358cf3a95d96d3747235b6',1,'penify_hook::jira_client::JiraClient']]], + ['jira_5furl_3',['jira_url',['../classpenify__hook_1_1jira__client_1_1JiraClient.html#a3c0cfecff02a75cb7001509a595b8197',1,'penify_hook::jira_client::JiraClient']]], + ['jira_5fuser_4',['jira_user',['../classpenify__hook_1_1jira__client_1_1JiraClient.html#ae56104d5aa7bda7bb26d169c4b46038c',1,'penify_hook::jira_client::JiraClient']]] +]; diff --git a/docs/html/search/variables_a.html b/docs/html/search/variables_a.html new file mode 100644 index 0000000..0005c6a --- /dev/null +++ b/docs/html/search/variables_a.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/docs/html/search/variables_a.js b/docs/html/search/variables_a.js new file mode 100644 index 0000000..1b06afc --- /dev/null +++ b/docs/html/search/variables_a.js @@ -0,0 +1,7 @@ +var searchData= +[ + ['llm_5fclient_0',['llm_client',['../classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook.html#ad93360e31f2ec58a0d7c9f08b219028a',1,'penify_hook::commit_analyzer::CommitDocGenHook']]], + ['logger_1',['logger',['../namespacepenify__hook_1_1file__analyzer.html#af419a4965f079d58cac5a5281ddb1828',1,'penify_hook.file_analyzer.logger()'],['../namespacepenify__hook_1_1git__analyzer.html#ac4ce143fdca789a79c66852c37d7363a',1,'penify_hook.git_analyzer.logger()'],['../namespacepenify__hook_1_1utils.html#a0c0c1ed6b197038085c94a90ceedfb01',1,'penify_hook.utils.logger()']]], + ['long_5fdescription_2',['long_description',['../namespacesetup.html#a4cda9dbfb952875376a0749fe08a5bde',1,'setup']]], + ['long_5fdescription_5fcontent_5ftype_3',['long_description_content_type',['../namespacesetup.html#a3796ea10c998699d07d391414ff5d720',1,'setup']]] +]; diff --git a/docs/html/search/variables_b.html b/docs/html/search/variables_b.html new file mode 100644 index 0000000..757c068 --- /dev/null +++ b/docs/html/search/variables_b.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/docs/html/search/variables_b.js b/docs/html/search/variables_b.js new file mode 100644 index 0000000..0081627 --- /dev/null +++ b/docs/html/search/variables_b.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['model_0',['model',['../classpenify__hook_1_1llm__client_1_1LLMClient.html#abc2cb6b1d6d9b5dc16401ca078ec8c10',1,'penify_hook::llm_client::LLMClient']]] +]; diff --git a/docs/html/search/variables_c.html b/docs/html/search/variables_c.html new file mode 100644 index 0000000..451a136 --- /dev/null +++ b/docs/html/search/variables_c.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/docs/html/search/variables_c.js b/docs/html/search/variables_c.js new file mode 100644 index 0000000..eb3ec51 --- /dev/null +++ b/docs/html/search/variables_c.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['name_0',['name',['../namespacesetup.html#ab3a7a0638d76a01367c5bc3cc699447f',1,'setup']]], + ['neutral_5fcolor_1',['NEUTRAL_COLOR',['../namespacepenify__hook_1_1ui__utils.html#aca0fcee81606857497520ae4290bc9f5',1,'penify_hook::ui_utils']]] +]; diff --git a/docs/html/search/variables_d.html b/docs/html/search/variables_d.html new file mode 100644 index 0000000..aea4286 --- /dev/null +++ b/docs/html/search/variables_d.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/docs/html/search/variables_d.js b/docs/html/search/variables_d.js new file mode 100644 index 0000000..e4b61ad --- /dev/null +++ b/docs/html/search/variables_d.js @@ -0,0 +1,7 @@ +var searchData= +[ + ['packages_0',['packages',['../namespacesetup.html#aff2375a361fd5865c77bd9aa093be747',1,'setup']]], + ['path_1',['path',['../namespacepenify__hook_1_1commands_1_1config__commands.html#a4b202072a3a3b8515c9c254622e9c880',1,'penify_hook::commands::config_commands']]], + ['processing_5fsymbol_2',['PROCESSING_SYMBOL',['../namespacepenify__hook_1_1ui__utils.html#a3b208e2750a38dd09467a73e4afd9756',1,'penify_hook::ui_utils']]], + ['python_5frequires_3',['python_requires',['../namespacesetup.html#aa7ca7bc9391b217e81efeb03689d8dbf',1,'setup']]] +]; diff --git a/docs/html/search/variables_e.html b/docs/html/search/variables_e.html new file mode 100644 index 0000000..ec3793e --- /dev/null +++ b/docs/html/search/variables_e.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/docs/html/search/variables_e.js b/docs/html/search/variables_e.js new file mode 100644 index 0000000..90e3cd7 --- /dev/null +++ b/docs/html/search/variables_e.js @@ -0,0 +1,7 @@ +var searchData= +[ + ['relative_5ffile_5fpath_0',['relative_file_path',['../classpenify__hook_1_1base__analyzer_1_1BaseAnalyzer.html#ab702c0c3ba81d159d7c3bcd7ea2abba4',1,'penify_hook::base_analyzer::BaseAnalyzer']]], + ['repo_1',['repo',['../classpenify__hook_1_1base__analyzer_1_1BaseAnalyzer.html#a3a9ddfa1dfba81fe21214fe486389369',1,'penify_hook::base_analyzer::BaseAnalyzer']]], + ['repo_5fdetails_2',['repo_details',['../classpenify__hook_1_1base__analyzer_1_1BaseAnalyzer.html#a9cca3465b0cc00d78324b0a9eac1d7f5',1,'penify_hook::base_analyzer::BaseAnalyzer']]], + ['repo_5fpath_3',['repo_path',['../classpenify__hook_1_1base__analyzer_1_1BaseAnalyzer.html#a957e81a1ab561f6cecfbe999e7b85499',1,'penify_hook::base_analyzer::BaseAnalyzer']]] +]; diff --git a/docs/html/search/variables_f.html b/docs/html/search/variables_f.html new file mode 100644 index 0000000..ee82fce --- /dev/null +++ b/docs/html/search/variables_f.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/docs/html/search/variables_f.js b/docs/html/search/variables_f.js new file mode 100644 index 0000000..2dcc04a --- /dev/null +++ b/docs/html/search/variables_f.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['success_5fcolor_0',['SUCCESS_COLOR',['../namespacepenify__hook_1_1ui__utils.html#a22c450c5e2b5394618ecf9b636560df4',1,'penify_hook::ui_utils']]], + ['success_5fsymbol_1',['SUCCESS_SYMBOL',['../namespacepenify__hook_1_1ui__utils.html#a3c6fe4bd17c1a5fe76587225ae4beb3e',1,'penify_hook::ui_utils']]], + ['supported_5ffile_5ftypes_2',['supported_file_types',['../classpenify__hook_1_1base__analyzer_1_1BaseAnalyzer.html#a0cac0310ec635aa64a34857cf30ce1eb',1,'penify_hook::base_analyzer::BaseAnalyzer']]] +]; diff --git a/docs/html/setup_8py.html b/docs/html/setup_8py.html new file mode 100644 index 0000000..b778dd7 --- /dev/null +++ b/docs/html/setup_8py.html @@ -0,0 +1,168 @@ + + + + + + + + + + + + + + + + + + +penify-cli: /tmp/github_reposRepoArchDocGenContext/Penify-dev/penify-cli/setup.py File Reference + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    penify-cli +
    +
    +
    + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    + +
    setup.py File Reference
    +
    +
    + + + + +

    +Namespaces

    namespace  setup
     
    + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    +Variables

     setup.name
     
     setup.version
     
     setup.packages
     
     setup.install_requires
     
     setup.entry_points
     
     setup.author
     
     setup.author_email
     
     setup.description
     
     setup.long_description
     
     setup.long_description_content_type
     
     setup.url
     
     setup.classifiers
     
     setup.python_requires
     
    +
    +
    + + + + + diff --git a/docs/html/setup_8py.js b/docs/html/setup_8py.js new file mode 100644 index 0000000..241d406 --- /dev/null +++ b/docs/html/setup_8py.js @@ -0,0 +1,16 @@ +var setup_8py = +[ + [ "author", "setup_8py.html#a3a57a4772d418a06835249cbade0d86a", null ], + [ "author_email", "setup_8py.html#a5b08034343aa2be607722a8b315f3625", null ], + [ "classifiers", "setup_8py.html#abe96a9c38c1c61f9f0fdb002c482f785", null ], + [ "description", "setup_8py.html#aedf461ec52a946bda975938ba0b93ec0", null ], + [ "entry_points", "setup_8py.html#ada7058afc98897f073d3f3b8b9157059", null ], + [ "install_requires", "setup_8py.html#abead4f26b530856f858f0d44c7cf2588", null ], + [ "long_description", "setup_8py.html#a4cda9dbfb952875376a0749fe08a5bde", null ], + [ "long_description_content_type", "setup_8py.html#a3796ea10c998699d07d391414ff5d720", null ], + [ "name", "setup_8py.html#ab3a7a0638d76a01367c5bc3cc699447f", null ], + [ "packages", "setup_8py.html#aff2375a361fd5865c77bd9aa093be747", null ], + [ "python_requires", "setup_8py.html#aa7ca7bc9391b217e81efeb03689d8dbf", null ], + [ "url", "setup_8py.html#afc13124aa5c0124e84e1d965e3f4b0fb", null ], + [ "version", "setup_8py.html#a2aa722b36a933088812b50ea79b97a5c", null ] +]; \ No newline at end of file diff --git a/docs/html/splitbar.png b/docs/html/splitbar.png new file mode 100644 index 0000000000000000000000000000000000000000..fe895f2c58179b471a22d8320b39a4bd7312ec8e GIT binary patch literal 314 zcmeAS@N?(olHy`uVBq!ia0vp^Yzz!63>-{AmhX=Jf(#6djGiuzAr*{o?=JLmPLyc> z_*`QK&+BH@jWrYJ7>r6%keRM@)Qyv8R=enp0jiI>aWlGyB58O zFVR20d+y`K7vDw(hJF3;>dD*3-?v=<8M)@x|EEGLnJsniYK!2U1 Y!`|5biEc?d1`HDhPgg&ebxsLQ02F6;9RL6T literal 0 HcmV?d00001 diff --git a/docs/html/svgpan.js b/docs/html/svgpan.js new file mode 100644 index 0000000..2678d38 --- /dev/null +++ b/docs/html/svgpan.js @@ -0,0 +1,323 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + The code below is based on SVGPan Library 1.2 and was modified for doxygen + to support both zooming and panning via the mouse and via embedded buttons. + + This code is licensed under the following BSD license: + + Copyright 2009-2010 Andrea Leofreddi . All rights reserved. + + Redistribution and use in source and binary forms, with or without modification, are + permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this list of + conditions and the following disclaimer. + + 2. Redistributions in binary form must reproduce the above copyright notice, this list + of conditions and the following disclaimer in the documentation and/or other materials + provided with the distribution. + + THIS SOFTWARE IS PROVIDED BY Andrea Leofreddi ``AS IS'' AND ANY EXPRESS OR IMPLIED + WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL Andrea Leofreddi OR + CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + The views and conclusions contained in the software and documentation are those of the + authors and should not be interpreted as representing official policies, either expressed + or implied, of Andrea Leofreddi. + + @licend The above is the entire license notice for the JavaScript code in this file + */ + +var root = document.documentElement; +var state = 'none'; +var stateOrigin; +var stateTf = root.createSVGMatrix(); +var cursorGrab = ' url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAOCAMAAAAolt3jAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAAlQTFRFAAAA////////c3ilYwAAAAN0Uk5T//8A18oNQQAAAD1JREFUeNp0zlEKACAIA9Bt9z90bZBZkQj29qFBEuBOzQHSnWTTyckEfqUuZgFvslH4ch3qLCO/Kr8cAgwATw4Ax6XRCcoAAAAASUVORK5CYII="), move'; +var zoomSteps = 10; +var zoomInFactor; +var zoomOutFactor; +var windowWidth; +var windowHeight; +var svgDoc; +var minZoom; +var maxZoom; +if (!window) window=this; + +/** + * Show the graph in the middle of the view, scaled to fit + */ +function show() +{ + if (window.innerHeight) // Firefox + { + windowWidth = window.innerWidth; + windowHeight = window.innerHeight; + } + else if (document.documentElement.clientWidth) // Chrome/Safari + { + windowWidth = document.documentElement.clientWidth + windowHeight = document.documentElement.clientHeight + } + if (!windowWidth || !windowHeight) // failsafe + { + windowWidth = 800; + windowHeight = 600; + } + minZoom = Math.min(Math.min(viewHeight,windowHeight)/viewHeight,Math.min(viewWidth,windowWidth)/viewWidth); + maxZoom = minZoom+1.5; + zoomInFactor = Math.pow(maxZoom/minZoom,1.0/zoomSteps); + zoomOutFactor = 1.0/zoomInFactor; + + var g = svgDoc.getElementById('viewport'); + try + { + var bb = g.getBBox(); // this can throw an exception if css { display: none } + var tx = (windowWidth-viewWidth*minZoom+8)/(2*minZoom); + var ty = viewHeight+(windowHeight-viewHeight*minZoom)/(2*minZoom); + var a = 'scale('+minZoom+') rotate(0) translate('+tx+' '+ty+')'; + g.setAttribute('transform',a); + } + catch(e) {} +} + +/** + * Register handlers + */ +function init(evt) +{ + svgDoc = evt.target.ownerDocument; + try { + if (top.window && top.window.registerShow) { // register show function in html doc for dynamic sections + top.window.registerShow(sectionId,show); + } + } catch(e) { + // ugh, we are not allowed to talk to the parent; can happen with Chrome when viewing pages + // locally, since they treat every local page as having a different origin + } + show(); + + setAttributes(root, { + "onmousedown" : "handleMouseDown(evt)", + "onmousemove" : "handleMouseMove(evt)", + "onmouseup" : "handleMouseUp(evt)" + }); + + if (window.addEventListener) + { + if (navigator.userAgent.toLowerCase().indexOf('webkit') >= 0 || + navigator.userAgent.toLowerCase().indexOf("opera") >= 0 || + navigator.appVersion.indexOf("MSIE") != -1) + { + window.addEventListener('mousewheel', handleMouseWheel, false); // Chrome/Safari/IE9 + } + else + { + window.addEventListener('DOMMouseScroll', handleMouseWheel, false); // Others + } + } +} + +window.onresize=function() +{ + if (svgDoc) { show(); } +} + +/** + * Instance an SVGPoint object with given event coordinates. + */ +function getEventPoint(evt) +{ + var p = root.createSVGPoint(); + p.x = evt.clientX; + p.y = evt.clientY; + return p; +} + +/** + * Sets the current transform matrix of an element. + */ +function setCTM(element, matrix) +{ + var s = "matrix(" + matrix.a + "," + matrix.b + "," + matrix.c + "," + matrix.d + "," + matrix.e + "," + matrix.f + ")"; + element.setAttribute("transform", s); +} + +/** + * Sets attributes of an element. + */ +function setAttributes(element, attributes) +{ + for (i in attributes) + element.setAttributeNS(null, i, attributes[i]); +} + +function doZoom(g,point,zoomFactor) +{ + var p = point.matrixTransform(g.getCTM().inverse()); + var k = root.createSVGMatrix().translate(p.x, p.y).scale(zoomFactor).translate(-p.x, -p.y); + var n = g.getCTM().multiply(k); + var s = Math.max(n.a,n.d); + if (s>maxZoom) n=n.translate(p.x,p.y).scale(maxZoom/s).translate(-p.x,-p.y); + else if (s'); + d.write('Print SVG'); + d.write(''); + d.write('
    '+xs+'
    '); + d.write(''); + d.write(''); + d.close(); + } catch(e) { + alert('Failed to open popup window needed for printing!\n'+e.message); + } +} +/* @license-end */ diff --git a/docs/html/sync_off.png b/docs/html/sync_off.png new file mode 100644 index 0000000000000000000000000000000000000000..3b443fc62892114406e3d399421b2a881b897acc GIT binary patch literal 853 zcmV-b1FHOqP)oT|#XixUYy%lpuf3i8{fX!o zUyDD0jOrAiT^tq>fLSOOABs-#u{dV^F$b{L9&!2=9&RmV;;8s^x&UqB$PCj4FdKbh zoB1WTskPUPu05XzFbA}=KZ-GP1fPpAfSs>6AHb12UlR%-i&uOlTpFNS7{jm@mkU1V zh`nrXr~+^lsV-s1dkZOaI|kYyVj3WBpPCY{n~yd%u%e+d=f%`N0FItMPtdgBb@py; zq@v6NVArhyTC7)ULw-Jy8y42S1~4n(3LkrW8mW(F-4oXUP3E`e#g**YyqI7h-J2zK zK{m9##m4ri!7N>CqQqCcnI3hqo1I;Yh&QLNY4T`*ptiQGozK>FF$!$+84Z`xwmeMh zJ0WT+OH$WYFALEaGj2_l+#DC3t7_S`vHpSivNeFbP6+r50cO8iu)`7i%Z4BTPh@_m3Tk!nAm^)5Bqnr%Ov|Baunj#&RPtRuK& z4RGz|D5HNrW83-#ydk}tVKJrNmyYt-sTxLGlJY5nc&Re zU4SgHNPx8~Yxwr$bsju?4q&%T1874xxzq+_%?h8_ofw~(bld=o3iC)LUNR*BY%c0y zWd_jX{Y8`l%z+ol1$@Qa?Cy!(0CVIEeYpKZ`(9{z>3$CIe;pJDQk$m3p}$>xBm4lb zKo{4S)`wdU9Ba9jJbVJ0C=SOefZe%d$8=2r={nu<_^a3~>c#t_U6dye5)JrR(_a^E f@}b6j1K9lwFJq@>o)+Ry00000NkvXXu0mjfWa5j* literal 0 HcmV?d00001 diff --git a/docs/html/sync_on.png b/docs/html/sync_on.png new file mode 100644 index 0000000000000000000000000000000000000000..e08320fb64e6fa33b573005ed6d8fe294e19db76 GIT binary patch literal 845 zcmV-T1G4;yP)Y;xxyHF2B5Wzm| zOOGupOTn@c(JmBOl)e;XMNnZuiTJP>rM8<|Q`7I_))aP?*T)ow&n59{}X4$3Goat zgjs?*aasfbrokzG5cT4K=uG`E14xZl@z)F={P0Y^?$4t z>v!teRnNZym<6h{7sLyF1V0HsfEl+l6TrZpsfr1}luH~F7L}ktXu|*uVX^RG$L0`K zWs3j|0tIvVe(N%_?2{(iCPFGf#B6Hjy6o&}D$A%W%jfO8_W%ZO#-mh}EM$LMn7joJ z05dHr!5Y92g+31l<%i1(=L1a1pXX+OYnalY>31V4K}BjyRe3)9n#;-cCVRD_IG1fT zOKGeNY8q;TL@K{dj@D^scf&VCs*-Jb>8b>|`b*osv52-!A?BpbYtTQBns5EAU**$m zSnVSm(teh>tQi*S*A>#ySc=n;`BHz`DuG4&g4Kf8lLhca+zvZ7t7RflD6-i-mcK=M z!=^P$*u2)bkY5asG4gsss!Hn%u~>}kIW`vMs%lJLH+u*9<4PaV_c6U`KqWXQH%+Nu zTv41O(^ZVi@qhjQdG!fbZw&y+2o!iYymO^?ud3{P*HdoX83YV*Uu_HB=?U&W9%AU# z80}k1SS-CXTU7dcQlsm<^oYLxVSseqY6NO}dc`Nj?8vrhNuCdm@^{a3AQ_>6myOj+ z`1RsLUXF|dm|3k7s2jD(B{rzE>WI2scH8i1;=O5Cc9xB3^aJk%fQjqsu+kH#0=_5a z0nCE8@dbQa-|YIuUVvG0L_IwHMEhOj$Mj4Uq05 X8=0q~qBNan00000NkvXXu0mjfptF>5 literal 0 HcmV?d00001 diff --git a/docs/html/tab_a.png b/docs/html/tab_a.png new file mode 100644 index 0000000000000000000000000000000000000000..3b725c41c5a527a3a3e40097077d0e206a681247 GIT binary patch literal 142 zcmeAS@N?(olHy`uVBq!ia0vp^j6kfy!2~3aiye;!QlXwMjv*C{Z|8b*H5dputLHD# z=<0|*y7z(Vor?d;H&?EG&cXR}?!j-Lm&u1OOI7AIF5&c)RFE;&p0MYK>*Kl@eiymD r@|NpwKX@^z+;{u_Z~trSBfrMKa%3`zocFjEXaR$#tDnm{r-UW|TZ1%4 literal 0 HcmV?d00001 diff --git a/docs/html/tab_b.png b/docs/html/tab_b.png new file mode 100644 index 0000000000000000000000000000000000000000..e2b4a8638cb3496a016eaed9e16ffc12846dea18 GIT binary patch literal 169 zcmeAS@N?(olHy`uVBq!ia0vp^j6kfy!2~3aiye;!QU#tajv*C{Z}0l@H7kg?K0Lnr z!j&C6_(~HV9oQ0Pa6x{-v0AGV_E?vLn=ZI-;YrdjIl`U`uzuDWSP?o#Dmo{%SgM#oan kX~E1%D-|#H#QbHoIja2U-MgvsK&LQxy85}Sb4q9e0Efg%P5=M^ literal 0 HcmV?d00001 diff --git a/docs/html/tabs.css b/docs/html/tabs.css new file mode 100644 index 0000000..fb0977a --- /dev/null +++ b/docs/html/tabs.css @@ -0,0 +1 @@ +.sm{position:relative;z-index:9999}.sm,.sm ul,.sm li{display:block;list-style:none;margin:0;padding:0;line-height:normal;direction:ltr;text-align:left;-webkit-tap-highlight-color:rgba(0,0,0,0)}.sm-rtl,.sm-rtl ul,.sm-rtl li{direction:rtl;text-align:right}.sm>li>h1,.sm>li>h2,.sm>li>h3,.sm>li>h4,.sm>li>h5,.sm>li>h6{margin:0;padding:0}.sm ul{display:none}.sm li,.sm a{position:relative}.sm a{display:block}.sm a.disabled{cursor:not-allowed}.sm:after{content:"\00a0";display:block;height:0;font:0px/0 serif;clear:both;visibility:hidden;overflow:hidden}.sm,.sm *,.sm *:before,.sm *:after{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}.main-menu-btn{position:relative;display:inline-block;width:36px;height:36px;text-indent:36px;margin-left:8px;white-space:nowrap;overflow:hidden;cursor:pointer;-webkit-tap-highlight-color:rgba(0,0,0,0)}.main-menu-btn-icon,.main-menu-btn-icon:before,.main-menu-btn-icon:after{position:absolute;top:50%;left:2px;height:2px;width:24px;background:#666;-webkit-transition:all 0.25s;transition:all 0.25s}.main-menu-btn-icon:before{content:'';top:-7px;left:0}.main-menu-btn-icon:after{content:'';top:7px;left:0}#main-menu-state:checked~.main-menu-btn .main-menu-btn-icon{height:0}#main-menu-state:checked~.main-menu-btn .main-menu-btn-icon:before{top:0;-webkit-transform:rotate(-45deg);transform:rotate(-45deg)}#main-menu-state:checked~.main-menu-btn .main-menu-btn-icon:after{top:0;-webkit-transform:rotate(45deg);transform:rotate(45deg)}#main-menu-state{position:absolute;width:1px;height:1px;margin:-1px;border:0;padding:0;overflow:hidden;clip:rect(1px, 1px, 1px, 1px)}#main-menu-state:not(:checked)~#main-menu{display:none}#main-menu-state:checked~#main-menu{display:block}@media (min-width: 768px){.main-menu-btn{position:absolute;top:-99999px}#main-menu-state:not(:checked)~#main-menu{display:block}}.sm-dox{background-image:url("tab_b.png")}.sm-dox a,.sm-dox a:focus,.sm-dox a:hover,.sm-dox a:active{padding:0px 12px;padding-right:43px;font-family:"Lucida Grande","Geneva","Helvetica",Arial,sans-serif;font-size:13px;font-weight:bold;line-height:36px;text-decoration:none;text-shadow:0px 1px 1px rgba(255,255,255,0.9);color:#283A5D;outline:none}.sm-dox a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:#fff;text-shadow:0px 1px 1px #000}.sm-dox a.current{color:#D23600}.sm-dox a.disabled{color:#bbb}.sm-dox a span.sub-arrow{position:absolute;top:50%;margin-top:-14px;left:auto;right:3px;width:28px;height:28px;overflow:hidden;font:bold 12px/28px monospace !important;text-align:center;text-shadow:none;background:rgba(255,255,255,0.5);border-radius:5px}.sm-dox a span.sub-arrow:before{display:block;content:'+'}.sm-dox a.highlighted span.sub-arrow:before{display:block;content:'-'}.sm-dox>li:first-child>a,.sm-dox>li:first-child>:not(ul) a{border-radius:5px 5px 0 0}.sm-dox>li:last-child>a,.sm-dox>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul{border-radius:0 0 5px 5px}.sm-dox>li:last-child>a.highlighted,.sm-dox>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted{border-radius:0}.sm-dox ul{background:rgba(162,162,162,0.1)}.sm-dox ul a,.sm-dox ul a:focus,.sm-dox ul a:hover,.sm-dox ul a:active{font-size:12px;border-left:8px solid transparent;line-height:36px;text-shadow:none;background-color:white;background-image:none}.sm-dox ul a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:#fff;text-shadow:0px 1px 1px #000}.sm-dox ul ul a,.sm-dox ul ul a:hover,.sm-dox ul ul a:focus,.sm-dox ul ul a:active{border-left:16px solid transparent}.sm-dox ul ul ul a,.sm-dox ul ul ul a:hover,.sm-dox ul ul ul a:focus,.sm-dox ul ul ul a:active{border-left:24px solid transparent}.sm-dox ul ul ul ul a,.sm-dox ul ul ul ul a:hover,.sm-dox ul ul ul ul a:focus,.sm-dox ul ul ul ul a:active{border-left:32px solid transparent}.sm-dox ul ul ul ul ul a,.sm-dox ul ul ul ul ul a:hover,.sm-dox ul ul ul ul ul a:focus,.sm-dox ul ul ul ul ul a:active{border-left:40px solid transparent}@media (min-width: 768px){.sm-dox ul{position:absolute;width:12em}.sm-dox li{float:left}.sm-dox.sm-rtl li{float:right}.sm-dox ul li,.sm-dox.sm-rtl ul li,.sm-dox.sm-vertical li{float:none}.sm-dox a{white-space:nowrap}.sm-dox ul a,.sm-dox.sm-vertical a{white-space:normal}.sm-dox .sm-nowrap>li>a,.sm-dox .sm-nowrap>li>:not(ul) a{white-space:nowrap}.sm-dox{padding:0 10px;background-image:url("tab_b.png");line-height:36px}.sm-dox a span.sub-arrow{top:50%;margin-top:-2px;right:12px;width:0;height:0;border-width:4px;border-style:solid dashed dashed dashed;border-color:#283A5D transparent transparent transparent;background:transparent;border-radius:0}.sm-dox a,.sm-dox a:focus,.sm-dox a:active,.sm-dox a:hover,.sm-dox a.highlighted{padding:0px 12px;background-image:url("tab_s.png");background-repeat:no-repeat;background-position:right;border-radius:0 !important}.sm-dox a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:#fff;text-shadow:0px 1px 1px #000}.sm-dox a:hover span.sub-arrow{border-color:#fff transparent transparent transparent}.sm-dox a.has-submenu{padding-right:24px}.sm-dox li{border-top:0}.sm-dox>li>ul:before,.sm-dox>li>ul:after{content:'';position:absolute;top:-18px;left:30px;width:0;height:0;overflow:hidden;border-width:9px;border-style:dashed dashed solid dashed;border-color:transparent transparent #bbb transparent}.sm-dox>li>ul:after{top:-16px;left:31px;border-width:8px;border-color:transparent transparent #fff transparent}.sm-dox ul{border:1px solid #bbb;padding:5px 0;background:#fff;border-radius:5px !important;box-shadow:0 5px 9px rgba(0,0,0,0.2)}.sm-dox ul a span.sub-arrow{right:8px;top:50%;margin-top:-5px;border-width:5px;border-color:transparent transparent transparent #555;border-style:dashed dashed dashed solid}.sm-dox ul a,.sm-dox ul a:hover,.sm-dox ul a:focus,.sm-dox ul a:active,.sm-dox ul a.highlighted{color:#555;background-image:none;border:0 !important;color:#555;background-image:none}.sm-dox ul a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:#fff;text-shadow:0px 1px 1px #000}.sm-dox ul a:hover span.sub-arrow{border-color:transparent transparent transparent #fff}.sm-dox span.scroll-up,.sm-dox span.scroll-down{position:absolute;display:none;visibility:hidden;overflow:hidden;background:#fff;height:36px}.sm-dox span.scroll-up:hover,.sm-dox span.scroll-down:hover{background:#eee}.sm-dox span.scroll-up:hover span.scroll-up-arrow,.sm-dox span.scroll-up:hover span.scroll-down-arrow{border-color:transparent transparent #D23600 transparent}.sm-dox span.scroll-down:hover span.scroll-down-arrow{border-color:#D23600 transparent transparent transparent}.sm-dox span.scroll-up-arrow,.sm-dox span.scroll-down-arrow{position:absolute;top:0;left:50%;margin-left:-6px;width:0;height:0;overflow:hidden;border-width:6px;border-style:dashed dashed solid dashed;border-color:transparent transparent #555 transparent}.sm-dox span.scroll-down-arrow{top:8px;border-style:solid dashed dashed dashed;border-color:#555 transparent transparent transparent}.sm-dox.sm-rtl a.has-submenu{padding-right:12px;padding-left:24px}.sm-dox.sm-rtl a span.sub-arrow{right:auto;left:12px}.sm-dox.sm-rtl.sm-vertical a.has-submenu{padding:10px 20px}.sm-dox.sm-rtl.sm-vertical a span.sub-arrow{right:auto;left:8px;border-style:dashed solid dashed dashed;border-color:transparent #555 transparent transparent}.sm-dox.sm-rtl>li>ul:before{left:auto;right:30px}.sm-dox.sm-rtl>li>ul:after{left:auto;right:31px}.sm-dox.sm-rtl ul a.has-submenu{padding:10px 20px !important}.sm-dox.sm-rtl ul a span.sub-arrow{right:auto;left:8px;border-style:dashed solid dashed dashed;border-color:transparent #555 transparent transparent}.sm-dox.sm-vertical{padding:10px 0;border-radius:5px}.sm-dox.sm-vertical a{padding:10px 20px}.sm-dox.sm-vertical a:hover,.sm-dox.sm-vertical a:focus,.sm-dox.sm-vertical a:active,.sm-dox.sm-vertical a.highlighted{background:#fff}.sm-dox.sm-vertical a.disabled{background-image:url("tab_b.png")}.sm-dox.sm-vertical a span.sub-arrow{right:8px;top:50%;margin-top:-5px;border-width:5px;border-style:dashed dashed dashed solid;border-color:transparent transparent transparent #555}.sm-dox.sm-vertical>li>ul:before,.sm-dox.sm-vertical>li>ul:after{display:none}.sm-dox.sm-vertical ul a{padding:10px 20px}.sm-dox.sm-vertical ul a:hover,.sm-dox.sm-vertical ul a:focus,.sm-dox.sm-vertical ul a:active,.sm-dox.sm-vertical ul a.highlighted{background:#eee}.sm-dox.sm-vertical ul a.disabled{background:#fff}} diff --git a/docs/html/test__commit__commands_8py.html b/docs/html/test__commit__commands_8py.html new file mode 100644 index 0000000..c9083aa --- /dev/null +++ b/docs/html/test__commit__commands_8py.html @@ -0,0 +1,146 @@ + + + + + + + + + + + + + + + + + + +penify-cli: /tmp/github_reposRepoArchDocGenContext/Penify-dev/penify-cli/tests/test_commit_commands.py File Reference + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    penify-cli +
    +
    +
    + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    + +
    test_commit_commands.py File Reference
    +
    +
    + + + + +

    +Classes

    class  tests.test_commit_commands.TestCommitCommands
     
    + + + + + +

    +Namespaces

    namespace  tests
     
    namespace  tests.test_commit_commands
     
    +
    +
    + + + + + diff --git a/docs/html/test__commit__commands_8py.js b/docs/html/test__commit__commands_8py.js new file mode 100644 index 0000000..1aa1dc7 --- /dev/null +++ b/docs/html/test__commit__commands_8py.js @@ -0,0 +1,4 @@ +var test__commit__commands_8py = +[ + [ "tests.test_commit_commands.TestCommitCommands", "classtests_1_1test__commit__commands_1_1TestCommitCommands.html", "classtests_1_1test__commit__commands_1_1TestCommitCommands" ] +]; \ No newline at end of file diff --git a/docs/html/test__config__commands_8py.html b/docs/html/test__config__commands_8py.html new file mode 100644 index 0000000..08b0de7 --- /dev/null +++ b/docs/html/test__config__commands_8py.html @@ -0,0 +1,146 @@ + + + + + + + + + + + + + + + + + + +penify-cli: /tmp/github_reposRepoArchDocGenContext/Penify-dev/penify-cli/tests/test_config_commands.py File Reference + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    penify-cli +
    +
    +
    + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    + +
    test_config_commands.py File Reference
    +
    +
    + + + + +

    +Classes

    class  tests.test_config_commands.TestConfigCommands
     
    + + + + + +

    +Namespaces

    namespace  tests
     
    namespace  tests.test_config_commands
     
    +
    +
    + + + + + diff --git a/docs/html/test__config__commands_8py.js b/docs/html/test__config__commands_8py.js new file mode 100644 index 0000000..2eebb0e --- /dev/null +++ b/docs/html/test__config__commands_8py.js @@ -0,0 +1,4 @@ +var test__config__commands_8py = +[ + [ "tests.test_config_commands.TestConfigCommands", "classtests_1_1test__config__commands_1_1TestConfigCommands.html", "classtests_1_1test__config__commands_1_1TestConfigCommands" ] +]; \ No newline at end of file diff --git a/docs/html/test__doc__commands_8py.html b/docs/html/test__doc__commands_8py.html new file mode 100644 index 0000000..fcf2df2 --- /dev/null +++ b/docs/html/test__doc__commands_8py.html @@ -0,0 +1,166 @@ + + + + + + + + + + + + + + + + + + +penify-cli: /tmp/github_reposRepoArchDocGenContext/Penify-dev/penify-cli/tests/test_doc_commands.py File Reference + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    penify-cli +
    +
    +
    + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    + +
    test_doc_commands.py File Reference
    +
    +
    + + + + + + +

    +Namespaces

    namespace  tests
     
    namespace  tests.test_doc_commands
     
    + + + + + + + + + + + + + + + + + + + + + + + +

    +Functions

    def tests.test_doc_commands.test_generate_doc_no_location (mock_getcwd, mock_api_client, mock_folder_analyzer, mock_file_analyzer, mock_git_analyzer)
     
    def tests.test_doc_commands.test_generate_doc_file_location (mock_api_client, mock_folder_analyzer, mock_file_analyzer, mock_git_analyzer)
     
    def tests.test_doc_commands.test_generate_doc_folder_location (mock_api_client, mock_folder_analyzer, mock_file_analyzer, mock_git_analyzer)
     
    def tests.test_doc_commands.test_generate_doc_error_handling (mock_api_client, mock_git_analyzer, mock_exit)
     
    def tests.test_doc_commands.test_setup_docgen_parser ()
     
    def tests.test_doc_commands.test_handle_docgen_install_hook (mock_exit, mock_get_token, mock_generate_doc, mock_uninstall_hook, mock_install_hook)
     
    def tests.test_doc_commands.test_handle_docgen_uninstall_hook (mock_exit, mock_get_token, mock_generate_doc, mock_uninstall_hook, mock_install_hook)
     
    def tests.test_doc_commands.test_handle_docgen_generate (mock_get_token, mock_generate_doc, mock_uninstall_hook, mock_install_hook)
     
    def tests.test_doc_commands.test_handle_docgen_no_token (mock_exit, mock_get_token)
     
    def tests.test_doc_commands.test_generate_doc_with_file_exception (mock_api_client, mock_getcwd)
     
    def tests.test_doc_commands.test_generate_doc_with_folder_exception (mock_api_client, mock_getcwd)
     
    +
    +
    + + + + + diff --git a/docs/html/test__doc__commands_8py.js b/docs/html/test__doc__commands_8py.js new file mode 100644 index 0000000..31809a6 --- /dev/null +++ b/docs/html/test__doc__commands_8py.js @@ -0,0 +1,14 @@ +var test__doc__commands_8py = +[ + [ "test_generate_doc_error_handling", "test__doc__commands_8py.html#aec76cc25c23476794234cdadbcaef0c0", null ], + [ "test_generate_doc_file_location", "test__doc__commands_8py.html#a0e74c920f258f442914771164fe26b45", null ], + [ "test_generate_doc_folder_location", "test__doc__commands_8py.html#a4bb75610e40d94d42bc169b25403c186", null ], + [ "test_generate_doc_no_location", "test__doc__commands_8py.html#a806110833eb0aad547156faf014b31d8", null ], + [ "test_generate_doc_with_file_exception", "test__doc__commands_8py.html#a335e7fd4912192c7276cf31bbebc6eb0", null ], + [ "test_generate_doc_with_folder_exception", "test__doc__commands_8py.html#a64165ddfdb3071a88422f080f0e529a3", null ], + [ "test_handle_docgen_generate", "test__doc__commands_8py.html#ab158ffa48469b6c097a7a55fcb20c21a", null ], + [ "test_handle_docgen_install_hook", "test__doc__commands_8py.html#ab74688baa8c9b5ba302c2877a9789d05", null ], + [ "test_handle_docgen_no_token", "test__doc__commands_8py.html#af9b01e5fc89255cac96747fa081c442c", null ], + [ "test_handle_docgen_uninstall_hook", "test__doc__commands_8py.html#a1458af9ad0128c3ca1263b552fd5e482", null ], + [ "test_setup_docgen_parser", "test__doc__commands_8py.html#a0f27751d0ba2acfe40ef7e85bccf47d7", null ] +]; \ No newline at end of file diff --git a/docs/html/test__web__config_8py.html b/docs/html/test__web__config_8py.html new file mode 100644 index 0000000..ee39b81 --- /dev/null +++ b/docs/html/test__web__config_8py.html @@ -0,0 +1,146 @@ + + + + + + + + + + + + + + + + + + +penify-cli: /tmp/github_reposRepoArchDocGenContext/Penify-dev/penify-cli/tests/test_web_config.py File Reference + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    penify-cli +
    +
    +
    + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    + +
    test_web_config.py File Reference
    +
    +
    + + + + +

    +Classes

    class  tests.test_web_config.TestWebConfig
     
    + + + + + +

    +Namespaces

    namespace  tests
     
    namespace  tests.test_web_config
     
    +
    +
    + + + + + diff --git a/docs/html/test__web__config_8py.js b/docs/html/test__web__config_8py.js new file mode 100644 index 0000000..d691683 --- /dev/null +++ b/docs/html/test__web__config_8py.js @@ -0,0 +1,4 @@ +var test__web__config_8py = +[ + [ "tests.test_web_config.TestWebConfig", "classtests_1_1test__web__config_1_1TestWebConfig.html", "classtests_1_1test__web__config_1_1TestWebConfig" ] +]; \ No newline at end of file diff --git a/docs/html/tests_2____init_____8py.html b/docs/html/tests_2____init_____8py.html new file mode 100644 index 0000000..dc0d10e --- /dev/null +++ b/docs/html/tests_2____init_____8py.html @@ -0,0 +1,138 @@ + + + + + + + + + + + + + + + + + + +penify-cli: /tmp/github_reposRepoArchDocGenContext/Penify-dev/penify-cli/tests/__init__.py File Reference + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    penify-cli +
    +
    +
    + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    + +
    __init__.py File Reference
    +
    +
    + + + + +

    +Namespaces

    namespace  tests
     
    +
    +
    + + + + + diff --git a/docs/html/toggle-alternative-theme.js b/docs/html/toggle-alternative-theme.js new file mode 100644 index 0000000..dc822e1 --- /dev/null +++ b/docs/html/toggle-alternative-theme.js @@ -0,0 +1,11 @@ +let original_theme_active = true; + +function toggle_alternative_theme() { + if(original_theme_active) { + document.documentElement.classList.add("alternative") + original_theme_active = false; + } else { + document.documentElement.classList.remove("alternative") + original_theme_active = true; + } +} \ No newline at end of file diff --git a/docs/html/ui__utils_8py.html b/docs/html/ui__utils_8py.html new file mode 100644 index 0000000..7e54d27 --- /dev/null +++ b/docs/html/ui__utils_8py.html @@ -0,0 +1,200 @@ + + + + + + + + + + + + + + + + + + +penify-cli: /tmp/github_reposRepoArchDocGenContext/Penify-dev/penify-cli/penify_hook/ui_utils.py File Reference + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    penify-cli +
    +
    +
    + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    + +
    ui_utils.py File Reference
    +
    +
    + + + + + + +

    +Namespaces

    namespace  penify_hook
     
    namespace  penify_hook.ui_utils
     
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    +Functions

    def penify_hook.ui_utils.format_info (message)
     
    def penify_hook.ui_utils.format_success (message)
     
    def penify_hook.ui_utils.format_warning (message)
     
    def penify_hook.ui_utils.format_error (message)
     
    def penify_hook.ui_utils.format_highlight (message)
     
    def penify_hook.ui_utils.format_file_path (file_path)
     
    def penify_hook.ui_utils.print_info (message)
     
    def penify_hook.ui_utils.print_success (message)
     
    def penify_hook.ui_utils.print_warning (message)
     
    def penify_hook.ui_utils.print_error (message)
     
    def penify_hook.ui_utils.print_processing (file_path)
     
    def penify_hook.ui_utils.print_status (status, message)
     
    def penify_hook.ui_utils.create_progress_bar (total, desc="Processing", unit="item")
     
    def penify_hook.ui_utils.create_stage_progress_bar (stages, desc="Processing")
     
    def penify_hook.ui_utils.update_stage (pbar, stage_name)
     
    + + + + + + + + + + + + + + + + + + + + + + + +

    +Variables

     penify_hook.ui_utils.autoreset
     
     penify_hook.ui_utils.INFO_COLOR = Fore.CYAN
     
     penify_hook.ui_utils.SUCCESS_COLOR = Fore.GREEN
     
     penify_hook.ui_utils.WARNING_COLOR = Fore.YELLOW
     
     penify_hook.ui_utils.ERROR_COLOR = Fore.RED
     
     penify_hook.ui_utils.HIGHLIGHT_COLOR = Fore.BLUE
     
     penify_hook.ui_utils.NEUTRAL_COLOR = Fore.WHITE
     
    string penify_hook.ui_utils.SUCCESS_SYMBOL = "✓"
     
    string penify_hook.ui_utils.WARNING_SYMBOL = "○"
     
    string penify_hook.ui_utils.ERROR_SYMBOL = "✗"
     
    string penify_hook.ui_utils.PROCESSING_SYMBOL = "⟳"
     
    +
    +
    + + + + + diff --git a/docs/html/ui__utils_8py.js b/docs/html/ui__utils_8py.js new file mode 100644 index 0000000..04380b0 --- /dev/null +++ b/docs/html/ui__utils_8py.js @@ -0,0 +1,29 @@ +var ui__utils_8py = +[ + [ "create_progress_bar", "ui__utils_8py.html#a12b92532b1458af94f3649d411b5505c", null ], + [ "create_stage_progress_bar", "ui__utils_8py.html#a3da02cd1140179a9ce60f62c85fccfef", null ], + [ "format_error", "ui__utils_8py.html#a4dd934568897433fa73f9cc182ac4a3e", null ], + [ "format_file_path", "ui__utils_8py.html#af3441fb3c2c3850b8b3b6455a9fdaba4", null ], + [ "format_highlight", "ui__utils_8py.html#adcb97fc26b405d2b9cdf5eb7aecc5452", null ], + [ "format_info", "ui__utils_8py.html#a92c3e466d1912058167be2eacf85b9f6", null ], + [ "format_success", "ui__utils_8py.html#a532cdb4de7c679ce8b29c3e9116c4776", null ], + [ "format_warning", "ui__utils_8py.html#a0a6fd2613c6fe053b6e4356cd9e5cda2", null ], + [ "print_error", "ui__utils_8py.html#a6f0acd7dd91abfe67d0807803bc3b65f", null ], + [ "print_info", "ui__utils_8py.html#a811f0adf6e9bf71510c379b6fa155e44", null ], + [ "print_processing", "ui__utils_8py.html#adfcbbfe39029ab6d1dd33e7bf75ae115", null ], + [ "print_status", "ui__utils_8py.html#aa6e684c00e26199440137a87ed9b195c", null ], + [ "print_success", "ui__utils_8py.html#a2b16aa6b68a9edea5f29f84f1c4be79a", null ], + [ "print_warning", "ui__utils_8py.html#a1ffbb9671dbe233770268e2dd66a67fa", null ], + [ "update_stage", "ui__utils_8py.html#a5a7340d0fc60fb80f17514d60bf45f1d", null ], + [ "autoreset", "ui__utils_8py.html#ab560cfade398ac1e0bd47befb52d9f71", null ], + [ "ERROR_COLOR", "ui__utils_8py.html#a4ab4e61dfab7973c87bef59c6e1977fe", null ], + [ "ERROR_SYMBOL", "ui__utils_8py.html#aa564e1e1d016c8227d076542e74cecb0", null ], + [ "HIGHLIGHT_COLOR", "ui__utils_8py.html#aba01b8259f0d66cdc2b4a1b58f9736fc", null ], + [ "INFO_COLOR", "ui__utils_8py.html#a9fdcb180915696f5d217032a62c3857c", null ], + [ "NEUTRAL_COLOR", "ui__utils_8py.html#aca0fcee81606857497520ae4290bc9f5", null ], + [ "PROCESSING_SYMBOL", "ui__utils_8py.html#a3b208e2750a38dd09467a73e4afd9756", null ], + [ "SUCCESS_COLOR", "ui__utils_8py.html#a22c450c5e2b5394618ecf9b636560df4", null ], + [ "SUCCESS_SYMBOL", "ui__utils_8py.html#a3c6fe4bd17c1a5fe76587225ae4beb3e", null ], + [ "WARNING_COLOR", "ui__utils_8py.html#a177bc9b44157844c999e0c1c2c6936ff", null ], + [ "WARNING_SYMBOL", "ui__utils_8py.html#a6eaea98f1a8cbe16a181647da2fc0a16", null ] +]; \ No newline at end of file diff --git a/docs/html/utils_8py.html b/docs/html/utils_8py.html new file mode 100644 index 0000000..b2fa532 --- /dev/null +++ b/docs/html/utils_8py.html @@ -0,0 +1,162 @@ + + + + + + + + + + + + + + + + + + +penify-cli: /tmp/github_reposRepoArchDocGenContext/Penify-dev/penify-cli/penify_hook/utils.py File Reference + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    penify-cli +
    +
    +
    + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    + +
    utils.py File Reference
    +
    +
    + + + + +

    +Classes

    class  penify_hook.utils.GitRepoNotFoundError
     
    + + + + + +

    +Namespaces

    namespace  penify_hook
     
    namespace  penify_hook.utils
     
    + + + + + + + +

    +Functions

    def penify_hook.utils.get_repo_details (Repo repo)
     
    def penify_hook.utils.recursive_search_git_folder (folder_path)
     
    def penify_hook.utils.find_git_parent (path)
     
    + + + +

    +Variables

     penify_hook.utils.logger = logging.getLogger(__name__)
     
    +
    +
    + + + + + diff --git a/docs/html/utils_8py.js b/docs/html/utils_8py.js new file mode 100644 index 0000000..073b162 --- /dev/null +++ b/docs/html/utils_8py.js @@ -0,0 +1,8 @@ +var utils_8py = +[ + [ "penify_hook.utils.GitRepoNotFoundError", "classpenify__hook_1_1utils_1_1GitRepoNotFoundError.html", null ], + [ "find_git_parent", "utils_8py.html#a4ec5335a4026c22a34a3a8ccf665a5f2", null ], + [ "get_repo_details", "utils_8py.html#ae236f3c4c8bf5dcddbb92b4c2065eea3", null ], + [ "recursive_search_git_folder", "utils_8py.html#a95c3f9c80860d6a2e2d061d2fb660a3f", null ], + [ "logger", "utils_8py.html#a0c0c1ed6b197038085c94a90ceedfb01", null ] +]; \ No newline at end of file diff --git a/docs/penify-cli-Penify-dev-g.tar.gz b/docs/penify-cli-Penify-dev-g.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..48994bc13741e355d4577bdef25024eeea485862 GIT binary patch literal 793800 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

    F0y;G>V%(BTsnBG&CrvNBY) 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�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%0Du=;U1%tLF24q}-wJmqEWT?HZ54NyG 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

    t9grT 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 x40h2bEeauW7ZFUZVmcPBfY!zx<5%Ct*(XsFtHy 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ΝKa>k-!n+nd&9 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,jYS3S`_J;xo98Ek&M&^mKC^?Fgh)%u%MOcJ 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 + + + + + +Exception + + + +Node1 + + +Exception + + + + + + + + + diff --git a/docs/rtf/classException__inherit__graph.md5 b/docs/rtf/classException__inherit__graph.md5 new file mode 100644 index 0000000..f7c5b12 --- /dev/null +++ b/docs/rtf/classException__inherit__graph.md5 @@ -0,0 +1 @@ +02df0cdd064aa2dca59b7424cdd2be62 \ No newline at end of file diff --git a/docs/rtf/classException__inherit__graph.svg b/docs/rtf/classException__inherit__graph.svg new file mode 100644 index 0000000..c8fc6d6 --- /dev/null +++ b/docs/rtf/classException__inherit__graph.svg @@ -0,0 +1,46 @@ + + + + + + +Exception + + + +Node1 + + +Exception + + + + + + + + + +Node2 + + +penify_hook.utils.GitRepo +NotFoundError + + + + + + + + + +Node1->Node2 + + + + + diff --git a/docs/rtf/classpenify__hook_1_1api__client_1_1APIClient__coll__graph.md5 b/docs/rtf/classpenify__hook_1_1api__client_1_1APIClient__coll__graph.md5 new file mode 100644 index 0000000..2c7b583 --- /dev/null +++ b/docs/rtf/classpenify__hook_1_1api__client_1_1APIClient__coll__graph.md5 @@ -0,0 +1 @@ +92a3e9cee2cd5e4975e6a42b548f0d62 \ No newline at end of file diff --git a/docs/rtf/classpenify__hook_1_1api__client_1_1APIClient__coll__graph.svg b/docs/rtf/classpenify__hook_1_1api__client_1_1APIClient__coll__graph.svg new file mode 100644 index 0000000..fe24d95 --- /dev/null +++ b/docs/rtf/classpenify__hook_1_1api__client_1_1APIClient__coll__graph.svg @@ -0,0 +1,36 @@ + + + + + + +penify_hook.api_client.APIClient + + + +Node1 + + +penify_hook.api_client.APIClient + ++ api_url ++ AUTH_TOKEN ++ BEARER_TOKEN + ++ __init__() ++ send_file_for_docstring +_generation() ++ generate_commit_summary() ++ get_supported_file +_types() ++ generate_commit_summary +_with_llm() ++ get_api_key() + + + + + diff --git a/docs/rtf/classpenify__hook_1_1api__client_1_1APIClient_a7ff74798e7d428b4e2f20095287eb2ce_icgraph.md5 b/docs/rtf/classpenify__hook_1_1api__client_1_1APIClient_a7ff74798e7d428b4e2f20095287eb2ce_icgraph.md5 new file mode 100644 index 0000000..b12cf91 --- /dev/null +++ b/docs/rtf/classpenify__hook_1_1api__client_1_1APIClient_a7ff74798e7d428b4e2f20095287eb2ce_icgraph.md5 @@ -0,0 +1 @@ +ea70dd7bbb840c4828c970ec1a8f5446 \ No newline at end of file diff --git a/docs/rtf/classpenify__hook_1_1api__client_1_1APIClient_a7ff74798e7d428b4e2f20095287eb2ce_icgraph.svg b/docs/rtf/classpenify__hook_1_1api__client_1_1APIClient_a7ff74798e7d428b4e2f20095287eb2ce_icgraph.svg new file mode 100644 index 0000000..54dce22 --- /dev/null +++ b/docs/rtf/classpenify__hook_1_1api__client_1_1APIClient_a7ff74798e7d428b4e2f20095287eb2ce_icgraph.svg @@ -0,0 +1,39 @@ + + + + + + +penify_hook.api_client.APIClient.generate_commit_summary + + + +Node1 + + +penify_hook.api_client.APIClient.generate +_commit_summary + + + + + +Node2 + + +penify_hook.api_client.APIClient.generate +_commit_summary_with_llm + + + + + +Node1->Node2 + + + + + diff --git a/docs/rtf/classpenify__hook_1_1api__client_1_1APIClient_ac0ada470b897935f9fb372cd0e7e51e3_cgraph.md5 b/docs/rtf/classpenify__hook_1_1api__client_1_1APIClient_ac0ada470b897935f9fb372cd0e7e51e3_cgraph.md5 new file mode 100644 index 0000000..186981a --- /dev/null +++ b/docs/rtf/classpenify__hook_1_1api__client_1_1APIClient_ac0ada470b897935f9fb372cd0e7e51e3_cgraph.md5 @@ -0,0 +1 @@ +6b1ca4842de706fb2f00719bcb509a8b \ No newline at end of file diff --git a/docs/rtf/classpenify__hook_1_1api__client_1_1APIClient_ac0ada470b897935f9fb372cd0e7e51e3_cgraph.svg b/docs/rtf/classpenify__hook_1_1api__client_1_1APIClient_ac0ada470b897935f9fb372cd0e7e51e3_cgraph.svg new file mode 100644 index 0000000..a04a292 --- /dev/null +++ b/docs/rtf/classpenify__hook_1_1api__client_1_1APIClient_ac0ada470b897935f9fb372cd0e7e51e3_cgraph.svg @@ -0,0 +1,70 @@ + + + + + + +penify_hook.api_client.APIClient.generate_commit_summary_with_llm + + + +Node1 + + +penify_hook.api_client.APIClient.generate +_commit_summary_with_llm + + + + + +Node2 + + +penify_hook.api_client.APIClient.generate +_commit_summary + + + + + +Node1->Node2 + + + + + +Node3 + + +penify_hook.llm_client.LLMClient.generate +_commit_summary + + + + + +Node1->Node3 + + + + + +Node4 + + +penify_hook.llm_client.LLMClient.litellm + + + + + +Node3->Node4 + + + + + diff --git a/docs/rtf/classpenify__hook_1_1base__analyzer_1_1BaseAnalyzer__coll__graph.md5 b/docs/rtf/classpenify__hook_1_1base__analyzer_1_1BaseAnalyzer__coll__graph.md5 new file mode 100644 index 0000000..8f67765 --- /dev/null +++ b/docs/rtf/classpenify__hook_1_1base__analyzer_1_1BaseAnalyzer__coll__graph.md5 @@ -0,0 +1 @@ +ba0c3a1d5b95dea65df70168e43976e0 \ No newline at end of file diff --git a/docs/rtf/classpenify__hook_1_1base__analyzer_1_1BaseAnalyzer__coll__graph.svg b/docs/rtf/classpenify__hook_1_1base__analyzer_1_1BaseAnalyzer__coll__graph.svg new file mode 100644 index 0000000..c7b4e4a --- /dev/null +++ b/docs/rtf/classpenify__hook_1_1base__analyzer_1_1BaseAnalyzer__coll__graph.svg @@ -0,0 +1,33 @@ + + + + + + +penify_hook.base_analyzer.BaseAnalyzer + + + +Node1 + + +penify_hook.base_analyzer. +BaseAnalyzer + ++ folder_path ++ repo_path ++ repo ++ repo_details ++ relative_file_path ++ api_client ++ supported_file_types + ++ __init__() + + + + + diff --git a/docs/rtf/classpenify__hook_1_1base__analyzer_1_1BaseAnalyzer__inherit__graph.md5 b/docs/rtf/classpenify__hook_1_1base__analyzer_1_1BaseAnalyzer__inherit__graph.md5 new file mode 100644 index 0000000..cb38209 --- /dev/null +++ b/docs/rtf/classpenify__hook_1_1base__analyzer_1_1BaseAnalyzer__inherit__graph.md5 @@ -0,0 +1 @@ +63e8393eea1557a855929943cd8aca92 \ No newline at end of file diff --git a/docs/rtf/classpenify__hook_1_1base__analyzer_1_1BaseAnalyzer__inherit__graph.svg b/docs/rtf/classpenify__hook_1_1base__analyzer_1_1BaseAnalyzer__inherit__graph.svg new file mode 100644 index 0000000..285efa6 --- /dev/null +++ b/docs/rtf/classpenify__hook_1_1base__analyzer_1_1BaseAnalyzer__inherit__graph.svg @@ -0,0 +1,127 @@ + + + + + + +penify_hook.base_analyzer.BaseAnalyzer + + + +Node1 + + +penify_hook.base_analyzer. +BaseAnalyzer + ++ folder_path ++ repo_path ++ repo ++ repo_details ++ relative_file_path ++ api_client ++ supported_file_types + ++ __init__() + + + + + +Node2 + + +penify_hook.commit +_analyzer.CommitDocGenHook + ++ llm_client + ++ __init__() ++ get_summary() ++ run() ++ process_jira_integration() +- _amend_commit() + + + + + +Node1->Node2 + + + + + +Node3 + + +penify_hook.file_analyzer. +FileAnalyzerGenHook + ++ file_path + ++ __init__() ++ process_file() ++ print_processing() ++ run() + + + + + +Node1->Node3 + + + + + +Node4 + + +penify_hook.folder +_analyzer.FolderAnalyzerGenHook + ++ dir_path + ++ __init__() ++ list_all_files_in_dir() ++ run() + + + + + +Node1->Node4 + + + + + +Node5 + + +penify_hook.git_analyzer. +GitDocGenHook + + + ++ __init__() ++ get_modified_files +_in_last_commit() ++ get_modified_lines() ++ process_file() ++ run() + + + + + +Node1->Node5 + + + + + diff --git a/docs/rtf/classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook__coll__graph.md5 b/docs/rtf/classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook__coll__graph.md5 new file mode 100644 index 0000000..4d6e419 --- /dev/null +++ b/docs/rtf/classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook__coll__graph.md5 @@ -0,0 +1 @@ +7b0dd63703399513e2ba32399fe691fd \ No newline at end of file diff --git a/docs/rtf/classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook__coll__graph.svg b/docs/rtf/classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook__coll__graph.svg new file mode 100644 index 0000000..ebcb060 --- /dev/null +++ b/docs/rtf/classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook__coll__graph.svg @@ -0,0 +1,57 @@ + + + + + + +penify_hook.commit_analyzer.CommitDocGenHook + + + +Node1 + + +penify_hook.commit +_analyzer.CommitDocGenHook + ++ llm_client + ++ __init__() ++ get_summary() ++ run() ++ process_jira_integration() +- _amend_commit() + + + + + +Node2 + + +penify_hook.base_analyzer. +BaseAnalyzer + ++ folder_path ++ repo_path ++ repo ++ repo_details ++ relative_file_path ++ api_client ++ supported_file_types + ++ __init__() + + + + + +Node2->Node1 + + + + + diff --git a/docs/rtf/classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook__inherit__graph.md5 b/docs/rtf/classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook__inherit__graph.md5 new file mode 100644 index 0000000..4d6e419 --- /dev/null +++ b/docs/rtf/classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook__inherit__graph.md5 @@ -0,0 +1 @@ +7b0dd63703399513e2ba32399fe691fd \ No newline at end of file diff --git a/docs/rtf/classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook__inherit__graph.svg b/docs/rtf/classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook__inherit__graph.svg new file mode 100644 index 0000000..ebcb060 --- /dev/null +++ b/docs/rtf/classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook__inherit__graph.svg @@ -0,0 +1,57 @@ + + + + + + +penify_hook.commit_analyzer.CommitDocGenHook + + + +Node1 + + +penify_hook.commit +_analyzer.CommitDocGenHook + ++ llm_client + ++ __init__() ++ get_summary() ++ run() ++ process_jira_integration() +- _amend_commit() + + + + + +Node2 + + +penify_hook.base_analyzer. +BaseAnalyzer + ++ folder_path ++ repo_path ++ repo ++ repo_details ++ relative_file_path ++ api_client ++ supported_file_types + ++ __init__() + + + + + +Node2->Node1 + + + + + diff --git a/docs/rtf/classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook_a6370a03f7ed9175ef6f81e931a105ea9_cgraph.md5 b/docs/rtf/classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook_a6370a03f7ed9175ef6f81e931a105ea9_cgraph.md5 new file mode 100644 index 0000000..d530502 --- /dev/null +++ b/docs/rtf/classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook_a6370a03f7ed9175ef6f81e931a105ea9_cgraph.md5 @@ -0,0 +1 @@ +503804b19fd6263bc4d634da365fcb38 \ No newline at end of file diff --git a/docs/rtf/classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook_a6370a03f7ed9175ef6f81e931a105ea9_cgraph.svg b/docs/rtf/classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook_a6370a03f7ed9175ef6f81e931a105ea9_cgraph.svg new file mode 100644 index 0000000..e69c2c7 --- /dev/null +++ b/docs/rtf/classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook_a6370a03f7ed9175ef6f81e931a105ea9_cgraph.svg @@ -0,0 +1,180 @@ + + + + + + +penify_hook.commit_analyzer.CommitDocGenHook.run + + + +Node1 + + +penify_hook.commit +_analyzer.CommitDocGenHook.run + + + + + +Node2 + + +penify_hook.commit +_analyzer.CommitDocGenHook. +_amend_commit + + + + + +Node1->Node2 + + + + + +Node3 + + +penify_hook.commit +_analyzer.CommitDocGenHook.get +_summary + + + + + +Node1->Node3 + + + + + +Node4 + + +penify_hook.ui_utils.print_info + + + + + +Node1->Node4 + + + + + +Node6 + + +penify_hook.ui_utils.print +_success + + + + + +Node1->Node6 + + + + + +Node8 + + +penify_hook.commit +_analyzer.CommitDocGenHook.process +_jira_integration + + + + + +Node1->Node8 + + + + + +Node3->Node4 + + + + + +Node5 + + +penify_hook.ui_utils.format_info + + + + + +Node4->Node5 + + + + + +Node7 + + +penify_hook.ui_utils.format +_success + + + + + +Node6->Node7 + + + + + +Node8->Node4 + + + + + +Node9 + + +penify_hook.ui_utils.print +_warning + + + + + +Node8->Node9 + + + + + +Node10 + + +penify_hook.ui_utils.format +_warning + + + + + +Node9->Node10 + + + + + diff --git a/docs/rtf/classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook_a8496194276441fa2eb2fa014eaab9a37_cgraph.md5 b/docs/rtf/classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook_a8496194276441fa2eb2fa014eaab9a37_cgraph.md5 new file mode 100644 index 0000000..96b4195 --- /dev/null +++ b/docs/rtf/classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook_a8496194276441fa2eb2fa014eaab9a37_cgraph.md5 @@ -0,0 +1 @@ +ad1182651b0cfe9906faf8af31cf667d \ No newline at end of file diff --git a/docs/rtf/classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook_a8496194276441fa2eb2fa014eaab9a37_cgraph.svg b/docs/rtf/classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook_a8496194276441fa2eb2fa014eaab9a37_cgraph.svg new file mode 100644 index 0000000..3064361 --- /dev/null +++ b/docs/rtf/classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook_a8496194276441fa2eb2fa014eaab9a37_cgraph.svg @@ -0,0 +1,54 @@ + + + + + + +penify_hook.commit_analyzer.CommitDocGenHook.get_summary + + + +Node1 + + +penify_hook.commit +_analyzer.CommitDocGenHook.get +_summary + + + + + +Node2 + + +penify_hook.ui_utils.print_info + + + + + +Node1->Node2 + + + + + +Node3 + + +penify_hook.ui_utils.format_info + + + + + +Node2->Node3 + + + + + diff --git a/docs/rtf/classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook_a8496194276441fa2eb2fa014eaab9a37_icgraph.md5 b/docs/rtf/classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook_a8496194276441fa2eb2fa014eaab9a37_icgraph.md5 new file mode 100644 index 0000000..fffc366 --- /dev/null +++ b/docs/rtf/classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook_a8496194276441fa2eb2fa014eaab9a37_icgraph.md5 @@ -0,0 +1 @@ +086b563bbc1068f3e0325d4a68d5bd17 \ No newline at end of file diff --git a/docs/rtf/classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook_a8496194276441fa2eb2fa014eaab9a37_icgraph.svg b/docs/rtf/classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook_a8496194276441fa2eb2fa014eaab9a37_icgraph.svg new file mode 100644 index 0000000..3b6972e --- /dev/null +++ b/docs/rtf/classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook_a8496194276441fa2eb2fa014eaab9a37_icgraph.svg @@ -0,0 +1,40 @@ + + + + + + +penify_hook.commit_analyzer.CommitDocGenHook.get_summary + + + +Node1 + + +penify_hook.commit +_analyzer.CommitDocGenHook.get +_summary + + + + + +Node2 + + +penify_hook.commit +_analyzer.CommitDocGenHook.run + + + + + +Node1->Node2 + + + + + diff --git a/docs/rtf/classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook_ac999c5cbc852a7ec3b412ccb43c274ca_icgraph.md5 b/docs/rtf/classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook_ac999c5cbc852a7ec3b412ccb43c274ca_icgraph.md5 new file mode 100644 index 0000000..0536af9 --- /dev/null +++ b/docs/rtf/classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook_ac999c5cbc852a7ec3b412ccb43c274ca_icgraph.md5 @@ -0,0 +1 @@ +fb0bae9cf2f7e07ac778eed1297c327b \ No newline at end of file diff --git a/docs/rtf/classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook_ac999c5cbc852a7ec3b412ccb43c274ca_icgraph.svg b/docs/rtf/classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook_ac999c5cbc852a7ec3b412ccb43c274ca_icgraph.svg new file mode 100644 index 0000000..dc56728 --- /dev/null +++ b/docs/rtf/classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook_ac999c5cbc852a7ec3b412ccb43c274ca_icgraph.svg @@ -0,0 +1,40 @@ + + + + + + +penify_hook.commit_analyzer.CommitDocGenHook._amend_commit + + + +Node1 + + +penify_hook.commit +_analyzer.CommitDocGenHook. +_amend_commit + + + + + +Node2 + + +penify_hook.commit +_analyzer.CommitDocGenHook.run + + + + + +Node1->Node2 + + + + + diff --git a/docs/rtf/classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook_adda13cc121d96342476ccf72b63a007f_cgraph.md5 b/docs/rtf/classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook_adda13cc121d96342476ccf72b63a007f_cgraph.md5 new file mode 100644 index 0000000..76d8830 --- /dev/null +++ b/docs/rtf/classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook_adda13cc121d96342476ccf72b63a007f_cgraph.md5 @@ -0,0 +1 @@ +4cfab920326b3a6b29c805803ac72558 \ No newline at end of file diff --git a/docs/rtf/classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook_adda13cc121d96342476ccf72b63a007f_cgraph.svg b/docs/rtf/classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook_adda13cc121d96342476ccf72b63a007f_cgraph.svg new file mode 100644 index 0000000..8fe268a --- /dev/null +++ b/docs/rtf/classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook_adda13cc121d96342476ccf72b63a007f_cgraph.svg @@ -0,0 +1,86 @@ + + + + + + +penify_hook.commit_analyzer.CommitDocGenHook.process_jira_integration + + + +Node1 + + +penify_hook.commit +_analyzer.CommitDocGenHook.process +_jira_integration + + + + + +Node2 + + +penify_hook.ui_utils.print_info + + + + + +Node1->Node2 + + + + + +Node4 + + +penify_hook.ui_utils.print +_warning + + + + + +Node1->Node4 + + + + + +Node3 + + +penify_hook.ui_utils.format_info + + + + + +Node2->Node3 + + + + + +Node5 + + +penify_hook.ui_utils.format +_warning + + + + + +Node4->Node5 + + + + + diff --git a/docs/rtf/classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook_adda13cc121d96342476ccf72b63a007f_icgraph.md5 b/docs/rtf/classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook_adda13cc121d96342476ccf72b63a007f_icgraph.md5 new file mode 100644 index 0000000..cf1b6d3 --- /dev/null +++ b/docs/rtf/classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook_adda13cc121d96342476ccf72b63a007f_icgraph.md5 @@ -0,0 +1 @@ +3cd15e6828a60d49cece5c87177581df \ No newline at end of file diff --git a/docs/rtf/classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook_adda13cc121d96342476ccf72b63a007f_icgraph.svg b/docs/rtf/classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook_adda13cc121d96342476ccf72b63a007f_icgraph.svg new file mode 100644 index 0000000..e5bf8f4 --- /dev/null +++ b/docs/rtf/classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook_adda13cc121d96342476ccf72b63a007f_icgraph.svg @@ -0,0 +1,40 @@ + + + + + + +penify_hook.commit_analyzer.CommitDocGenHook.process_jira_integration + + + +Node1 + + +penify_hook.commit +_analyzer.CommitDocGenHook.process +_jira_integration + + + + + +Node2 + + +penify_hook.commit +_analyzer.CommitDocGenHook.run + + + + + +Node1->Node2 + + + + + diff --git a/docs/rtf/classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook_af127d86729e226d74dbeb095b008db3e_cgraph.md5 b/docs/rtf/classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook_af127d86729e226d74dbeb095b008db3e_cgraph.md5 new file mode 100644 index 0000000..5f2103d --- /dev/null +++ b/docs/rtf/classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook_af127d86729e226d74dbeb095b008db3e_cgraph.md5 @@ -0,0 +1 @@ +95c682625e7209c65fce50a4bb060a81 \ No newline at end of file diff --git a/docs/rtf/classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook_af127d86729e226d74dbeb095b008db3e_cgraph.svg b/docs/rtf/classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook_af127d86729e226d74dbeb095b008db3e_cgraph.svg new file mode 100644 index 0000000..d985a2a --- /dev/null +++ b/docs/rtf/classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook_af127d86729e226d74dbeb095b008db3e_cgraph.svg @@ -0,0 +1,30 @@ + + + + + + +penify_hook.commit_analyzer.CommitDocGenHook.__init__ + + + +Node1 + + +penify_hook.commit +_analyzer.CommitDocGenHook. +__init__ + + + + + +Node1->Node1 + + + + + diff --git a/docs/rtf/classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook_af127d86729e226d74dbeb095b008db3e_icgraph.md5 b/docs/rtf/classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook_af127d86729e226d74dbeb095b008db3e_icgraph.md5 new file mode 100644 index 0000000..39adea9 --- /dev/null +++ b/docs/rtf/classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook_af127d86729e226d74dbeb095b008db3e_icgraph.md5 @@ -0,0 +1 @@ +534bd5898147e11eac4c0e46a39c7860 \ No newline at end of file diff --git a/docs/rtf/classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook_af127d86729e226d74dbeb095b008db3e_icgraph.svg b/docs/rtf/classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook_af127d86729e226d74dbeb095b008db3e_icgraph.svg new file mode 100644 index 0000000..8cebb40 --- /dev/null +++ b/docs/rtf/classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook_af127d86729e226d74dbeb095b008db3e_icgraph.svg @@ -0,0 +1,30 @@ + + + + + + +penify_hook.commit_analyzer.CommitDocGenHook.__init__ + + + +Node1 + + +penify_hook.commit +_analyzer.CommitDocGenHook. +__init__ + + + + + +Node1->Node1 + + + + + diff --git a/docs/rtf/classpenify__hook_1_1file__analyzer_1_1FileAnalyzerGenHook__coll__graph.md5 b/docs/rtf/classpenify__hook_1_1file__analyzer_1_1FileAnalyzerGenHook__coll__graph.md5 new file mode 100644 index 0000000..b6c2c1c --- /dev/null +++ b/docs/rtf/classpenify__hook_1_1file__analyzer_1_1FileAnalyzerGenHook__coll__graph.md5 @@ -0,0 +1 @@ +98c7ce96bb60ecdbb8c57ef7c2bc6d59 \ No newline at end of file diff --git a/docs/rtf/classpenify__hook_1_1file__analyzer_1_1FileAnalyzerGenHook__coll__graph.svg b/docs/rtf/classpenify__hook_1_1file__analyzer_1_1FileAnalyzerGenHook__coll__graph.svg new file mode 100644 index 0000000..2c46dfc --- /dev/null +++ b/docs/rtf/classpenify__hook_1_1file__analyzer_1_1FileAnalyzerGenHook__coll__graph.svg @@ -0,0 +1,56 @@ + + + + + + +penify_hook.file_analyzer.FileAnalyzerGenHook + + + +Node1 + + +penify_hook.file_analyzer. +FileAnalyzerGenHook + ++ file_path + ++ __init__() ++ process_file() ++ print_processing() ++ run() + + + + + +Node2 + + +penify_hook.base_analyzer. +BaseAnalyzer + ++ folder_path ++ repo_path ++ repo ++ repo_details ++ relative_file_path ++ api_client ++ supported_file_types + ++ __init__() + + + + + +Node2->Node1 + + + + + diff --git a/docs/rtf/classpenify__hook_1_1file__analyzer_1_1FileAnalyzerGenHook__inherit__graph.md5 b/docs/rtf/classpenify__hook_1_1file__analyzer_1_1FileAnalyzerGenHook__inherit__graph.md5 new file mode 100644 index 0000000..b6c2c1c --- /dev/null +++ b/docs/rtf/classpenify__hook_1_1file__analyzer_1_1FileAnalyzerGenHook__inherit__graph.md5 @@ -0,0 +1 @@ +98c7ce96bb60ecdbb8c57ef7c2bc6d59 \ No newline at end of file diff --git a/docs/rtf/classpenify__hook_1_1file__analyzer_1_1FileAnalyzerGenHook__inherit__graph.svg b/docs/rtf/classpenify__hook_1_1file__analyzer_1_1FileAnalyzerGenHook__inherit__graph.svg new file mode 100644 index 0000000..2c46dfc --- /dev/null +++ b/docs/rtf/classpenify__hook_1_1file__analyzer_1_1FileAnalyzerGenHook__inherit__graph.svg @@ -0,0 +1,56 @@ + + + + + + +penify_hook.file_analyzer.FileAnalyzerGenHook + + + +Node1 + + +penify_hook.file_analyzer. +FileAnalyzerGenHook + ++ file_path + ++ __init__() ++ process_file() ++ print_processing() ++ run() + + + + + +Node2 + + +penify_hook.base_analyzer. +BaseAnalyzer + ++ folder_path ++ repo_path ++ repo ++ repo_details ++ relative_file_path ++ api_client ++ supported_file_types + ++ __init__() + + + + + +Node2->Node1 + + + + + diff --git a/docs/rtf/classpenify__hook_1_1file__analyzer_1_1FileAnalyzerGenHook_a2cc6c22ef588fccf3eed9bbc57fb6d6e_cgraph.md5 b/docs/rtf/classpenify__hook_1_1file__analyzer_1_1FileAnalyzerGenHook_a2cc6c22ef588fccf3eed9bbc57fb6d6e_cgraph.md5 new file mode 100644 index 0000000..416cd78 --- /dev/null +++ b/docs/rtf/classpenify__hook_1_1file__analyzer_1_1FileAnalyzerGenHook_a2cc6c22ef588fccf3eed9bbc57fb6d6e_cgraph.md5 @@ -0,0 +1 @@ +dd6dbfdde640f0bc6f1c0cc995a9b4fb \ No newline at end of file diff --git a/docs/rtf/classpenify__hook_1_1file__analyzer_1_1FileAnalyzerGenHook_a2cc6c22ef588fccf3eed9bbc57fb6d6e_cgraph.svg b/docs/rtf/classpenify__hook_1_1file__analyzer_1_1FileAnalyzerGenHook_a2cc6c22ef588fccf3eed9bbc57fb6d6e_cgraph.svg new file mode 100644 index 0000000..df60e23 --- /dev/null +++ b/docs/rtf/classpenify__hook_1_1file__analyzer_1_1FileAnalyzerGenHook_a2cc6c22ef588fccf3eed9bbc57fb6d6e_cgraph.svg @@ -0,0 +1,71 @@ + + + + + + +penify_hook.file_analyzer.FileAnalyzerGenHook.process_file + + + +Node1 + + +penify_hook.file_analyzer. +FileAnalyzerGenHook.process_file + + + + + +Node2 + + +penify_hook.ui_utils.print +_warning + + + + + +Node1->Node2 + + + + + +Node4 + + +penify_hook.ui_utils.update +_stage + + + + + +Node1->Node4 + + + + + +Node3 + + +penify_hook.ui_utils.format +_warning + + + + + +Node2->Node3 + + + + + diff --git a/docs/rtf/classpenify__hook_1_1file__analyzer_1_1FileAnalyzerGenHook_a2cc6c22ef588fccf3eed9bbc57fb6d6e_icgraph.md5 b/docs/rtf/classpenify__hook_1_1file__analyzer_1_1FileAnalyzerGenHook_a2cc6c22ef588fccf3eed9bbc57fb6d6e_icgraph.md5 new file mode 100644 index 0000000..8da8816 --- /dev/null +++ b/docs/rtf/classpenify__hook_1_1file__analyzer_1_1FileAnalyzerGenHook_a2cc6c22ef588fccf3eed9bbc57fb6d6e_icgraph.md5 @@ -0,0 +1 @@ +dce29e772ed93d06e90894791ddc50ca \ No newline at end of file diff --git a/docs/rtf/classpenify__hook_1_1file__analyzer_1_1FileAnalyzerGenHook_a2cc6c22ef588fccf3eed9bbc57fb6d6e_icgraph.svg b/docs/rtf/classpenify__hook_1_1file__analyzer_1_1FileAnalyzerGenHook_a2cc6c22ef588fccf3eed9bbc57fb6d6e_icgraph.svg new file mode 100644 index 0000000..c688580 --- /dev/null +++ b/docs/rtf/classpenify__hook_1_1file__analyzer_1_1FileAnalyzerGenHook_a2cc6c22ef588fccf3eed9bbc57fb6d6e_icgraph.svg @@ -0,0 +1,55 @@ + + + + + + +penify_hook.file_analyzer.FileAnalyzerGenHook.process_file + + + +Node1 + + +penify_hook.file_analyzer. +FileAnalyzerGenHook.process_file + + + + + +Node2 + + +penify_hook.file_analyzer. +FileAnalyzerGenHook.run + + + + + +Node1->Node2 + + + + + +Node3 + + +penify_hook.git_analyzer. +GitDocGenHook.run + + + + + +Node1->Node3 + + + + + diff --git a/docs/rtf/classpenify__hook_1_1file__analyzer_1_1FileAnalyzerGenHook_a4f4dffbc432fac3e259d957dd1e187f1_cgraph.md5 b/docs/rtf/classpenify__hook_1_1file__analyzer_1_1FileAnalyzerGenHook_a4f4dffbc432fac3e259d957dd1e187f1_cgraph.md5 new file mode 100644 index 0000000..f40daaf --- /dev/null +++ b/docs/rtf/classpenify__hook_1_1file__analyzer_1_1FileAnalyzerGenHook_a4f4dffbc432fac3e259d957dd1e187f1_cgraph.md5 @@ -0,0 +1 @@ +5c58a576c4056ea132d5a9cca6880cb6 \ No newline at end of file diff --git a/docs/rtf/classpenify__hook_1_1file__analyzer_1_1FileAnalyzerGenHook_a4f4dffbc432fac3e259d957dd1e187f1_cgraph.svg b/docs/rtf/classpenify__hook_1_1file__analyzer_1_1FileAnalyzerGenHook_a4f4dffbc432fac3e259d957dd1e187f1_cgraph.svg new file mode 100644 index 0000000..c02effb --- /dev/null +++ b/docs/rtf/classpenify__hook_1_1file__analyzer_1_1FileAnalyzerGenHook_a4f4dffbc432fac3e259d957dd1e187f1_cgraph.svg @@ -0,0 +1,204 @@ + + + + + + +penify_hook.file_analyzer.FileAnalyzerGenHook.run + + + +Node1 + + +penify_hook.file_analyzer. +FileAnalyzerGenHook.run + + + + + +Node2 + + +penify_hook.ui_utils.create +_stage_progress_bar + + + + + +Node1->Node2 + + + + + +Node4 + + +penify_hook.ui_utils.print +_status + + + + + +Node1->Node4 + + + + + +Node5 + + +penify_hook.ui_utils.print +_success + + + + + +Node1->Node5 + + + + + +Node7 + + +penify_hook.git_analyzer. +GitDocGenHook.process_file + + + + + +Node1->Node7 + + + + + +Node9 + + +penify_hook.file_analyzer. +FileAnalyzerGenHook.process_file + + + + + +Node1->Node9 + + + + + +Node12 + + +penify_hook.ui_utils.update +_stage + + + + + +Node1->Node12 + + + + + +Node3 + + +penify_hook.ui_utils.format_info + + + + + +Node2->Node3 + + + + + +Node6 + + +penify_hook.ui_utils.format +_success + + + + + +Node5->Node6 + + + + + +Node8 + + +penify_hook.git_analyzer. +GitDocGenHook.get_modified_lines + + + + + +Node7->Node8 + + + + + +Node10 + + +penify_hook.ui_utils.print +_warning + + + + + +Node9->Node10 + + + + + +Node9->Node12 + + + + + +Node11 + + +penify_hook.ui_utils.format +_warning + + + + + +Node10->Node11 + + + + + diff --git a/docs/rtf/classpenify__hook_1_1file__analyzer_1_1FileAnalyzerGenHook_a6ab39391dfb7686f2a2d21a702dd3073_cgraph.md5 b/docs/rtf/classpenify__hook_1_1file__analyzer_1_1FileAnalyzerGenHook_a6ab39391dfb7686f2a2d21a702dd3073_cgraph.md5 new file mode 100644 index 0000000..a24f9ee --- /dev/null +++ b/docs/rtf/classpenify__hook_1_1file__analyzer_1_1FileAnalyzerGenHook_a6ab39391dfb7686f2a2d21a702dd3073_cgraph.md5 @@ -0,0 +1 @@ +e106885ca4b06113170f86da8447c21c \ No newline at end of file diff --git a/docs/rtf/classpenify__hook_1_1file__analyzer_1_1FileAnalyzerGenHook_a6ab39391dfb7686f2a2d21a702dd3073_cgraph.svg b/docs/rtf/classpenify__hook_1_1file__analyzer_1_1FileAnalyzerGenHook_a6ab39391dfb7686f2a2d21a702dd3073_cgraph.svg new file mode 100644 index 0000000..ac0606c --- /dev/null +++ b/docs/rtf/classpenify__hook_1_1file__analyzer_1_1FileAnalyzerGenHook_a6ab39391dfb7686f2a2d21a702dd3073_cgraph.svg @@ -0,0 +1,40 @@ + + + + + + +penify_hook.file_analyzer.FileAnalyzerGenHook.print_processing + + + +Node1 + + +penify_hook.file_analyzer. +FileAnalyzerGenHook.print +_processing + + + + + +Node2 + + +penify_hook.ui_utils.format +_file_path + + + + + +Node1->Node2 + + + + + diff --git a/docs/rtf/classpenify__hook_1_1folder__analyzer_1_1FolderAnalyzerGenHook__coll__graph.md5 b/docs/rtf/classpenify__hook_1_1folder__analyzer_1_1FolderAnalyzerGenHook__coll__graph.md5 new file mode 100644 index 0000000..320340b --- /dev/null +++ b/docs/rtf/classpenify__hook_1_1folder__analyzer_1_1FolderAnalyzerGenHook__coll__graph.md5 @@ -0,0 +1 @@ +2ce8b70614e0bc292a08fd5461334e23 \ No newline at end of file diff --git a/docs/rtf/classpenify__hook_1_1folder__analyzer_1_1FolderAnalyzerGenHook__coll__graph.svg b/docs/rtf/classpenify__hook_1_1folder__analyzer_1_1FolderAnalyzerGenHook__coll__graph.svg new file mode 100644 index 0000000..f0b7c4a --- /dev/null +++ b/docs/rtf/classpenify__hook_1_1folder__analyzer_1_1FolderAnalyzerGenHook__coll__graph.svg @@ -0,0 +1,55 @@ + + + + + + +penify_hook.folder_analyzer.FolderAnalyzerGenHook + + + +Node1 + + +penify_hook.folder +_analyzer.FolderAnalyzerGenHook + ++ dir_path + ++ __init__() ++ list_all_files_in_dir() ++ run() + + + + + +Node2 + + +penify_hook.base_analyzer. +BaseAnalyzer + ++ folder_path ++ repo_path ++ repo ++ repo_details ++ relative_file_path ++ api_client ++ supported_file_types + ++ __init__() + + + + + +Node2->Node1 + + + + + diff --git a/docs/rtf/classpenify__hook_1_1folder__analyzer_1_1FolderAnalyzerGenHook__inherit__graph.md5 b/docs/rtf/classpenify__hook_1_1folder__analyzer_1_1FolderAnalyzerGenHook__inherit__graph.md5 new file mode 100644 index 0000000..320340b --- /dev/null +++ b/docs/rtf/classpenify__hook_1_1folder__analyzer_1_1FolderAnalyzerGenHook__inherit__graph.md5 @@ -0,0 +1 @@ +2ce8b70614e0bc292a08fd5461334e23 \ No newline at end of file diff --git a/docs/rtf/classpenify__hook_1_1folder__analyzer_1_1FolderAnalyzerGenHook__inherit__graph.svg b/docs/rtf/classpenify__hook_1_1folder__analyzer_1_1FolderAnalyzerGenHook__inherit__graph.svg new file mode 100644 index 0000000..f0b7c4a --- /dev/null +++ b/docs/rtf/classpenify__hook_1_1folder__analyzer_1_1FolderAnalyzerGenHook__inherit__graph.svg @@ -0,0 +1,55 @@ + + + + + + +penify_hook.folder_analyzer.FolderAnalyzerGenHook + + + +Node1 + + +penify_hook.folder +_analyzer.FolderAnalyzerGenHook + ++ dir_path + ++ __init__() ++ list_all_files_in_dir() ++ run() + + + + + +Node2 + + +penify_hook.base_analyzer. +BaseAnalyzer + ++ folder_path ++ repo_path ++ repo ++ repo_details ++ relative_file_path ++ api_client ++ supported_file_types + ++ __init__() + + + + + +Node2->Node1 + + + + + diff --git a/docs/rtf/classpenify__hook_1_1folder__analyzer_1_1FolderAnalyzerGenHook_a70b845318fc7ac3b607daf26378e19ec_icgraph.md5 b/docs/rtf/classpenify__hook_1_1folder__analyzer_1_1FolderAnalyzerGenHook_a70b845318fc7ac3b607daf26378e19ec_icgraph.md5 new file mode 100644 index 0000000..4aed41f --- /dev/null +++ b/docs/rtf/classpenify__hook_1_1folder__analyzer_1_1FolderAnalyzerGenHook_a70b845318fc7ac3b607daf26378e19ec_icgraph.md5 @@ -0,0 +1 @@ +e2a0ef57ef0713a63ba1c8ee5591e9f5 \ No newline at end of file diff --git a/docs/rtf/classpenify__hook_1_1folder__analyzer_1_1FolderAnalyzerGenHook_a70b845318fc7ac3b607daf26378e19ec_icgraph.svg b/docs/rtf/classpenify__hook_1_1folder__analyzer_1_1FolderAnalyzerGenHook_a70b845318fc7ac3b607daf26378e19ec_icgraph.svg new file mode 100644 index 0000000..ba8e0cb --- /dev/null +++ b/docs/rtf/classpenify__hook_1_1folder__analyzer_1_1FolderAnalyzerGenHook_a70b845318fc7ac3b607daf26378e19ec_icgraph.svg @@ -0,0 +1,41 @@ + + + + + + +penify_hook.folder_analyzer.FolderAnalyzerGenHook.list_all_files_in_dir + + + +Node1 + + +penify_hook.folder +_analyzer.FolderAnalyzerGen +Hook.list_all_files_in_dir + + + + + +Node2 + + +penify_hook.folder +_analyzer.FolderAnalyzerGen +Hook.run + + + + + +Node1->Node2 + + + + + diff --git a/docs/rtf/classpenify__hook_1_1folder__analyzer_1_1FolderAnalyzerGenHook_afd189d1b8c773bf710a899eb21fd76cc_cgraph.md5 b/docs/rtf/classpenify__hook_1_1folder__analyzer_1_1FolderAnalyzerGenHook_afd189d1b8c773bf710a899eb21fd76cc_cgraph.md5 new file mode 100644 index 0000000..88516d8 --- /dev/null +++ b/docs/rtf/classpenify__hook_1_1folder__analyzer_1_1FolderAnalyzerGenHook_afd189d1b8c773bf710a899eb21fd76cc_cgraph.md5 @@ -0,0 +1 @@ +a3c6817cbc08f61a1a5f2b81334ae3dc \ No newline at end of file diff --git a/docs/rtf/classpenify__hook_1_1folder__analyzer_1_1FolderAnalyzerGenHook_afd189d1b8c773bf710a899eb21fd76cc_cgraph.svg b/docs/rtf/classpenify__hook_1_1folder__analyzer_1_1FolderAnalyzerGenHook_afd189d1b8c773bf710a899eb21fd76cc_cgraph.svg new file mode 100644 index 0000000..47f7147 --- /dev/null +++ b/docs/rtf/classpenify__hook_1_1folder__analyzer_1_1FolderAnalyzerGenHook_afd189d1b8c773bf710a899eb21fd76cc_cgraph.svg @@ -0,0 +1,41 @@ + + + + + + +penify_hook.folder_analyzer.FolderAnalyzerGenHook.run + + + +Node1 + + +penify_hook.folder +_analyzer.FolderAnalyzerGen +Hook.run + + + + + +Node2 + + +penify_hook.folder +_analyzer.FolderAnalyzerGen +Hook.list_all_files_in_dir + + + + + +Node1->Node2 + + + + + diff --git a/docs/rtf/classpenify__hook_1_1git__analyzer_1_1GitDocGenHook__coll__graph.md5 b/docs/rtf/classpenify__hook_1_1git__analyzer_1_1GitDocGenHook__coll__graph.md5 new file mode 100644 index 0000000..8b8aff5 --- /dev/null +++ b/docs/rtf/classpenify__hook_1_1git__analyzer_1_1GitDocGenHook__coll__graph.md5 @@ -0,0 +1 @@ +d285fcb980d93312bfad049f92895ba8 \ No newline at end of file diff --git a/docs/rtf/classpenify__hook_1_1git__analyzer_1_1GitDocGenHook__coll__graph.svg b/docs/rtf/classpenify__hook_1_1git__analyzer_1_1GitDocGenHook__coll__graph.svg new file mode 100644 index 0000000..0383f84 --- /dev/null +++ b/docs/rtf/classpenify__hook_1_1git__analyzer_1_1GitDocGenHook__coll__graph.svg @@ -0,0 +1,58 @@ + + + + + + +penify_hook.git_analyzer.GitDocGenHook + + + +Node1 + + +penify_hook.git_analyzer. +GitDocGenHook + + + ++ __init__() ++ get_modified_files +_in_last_commit() ++ get_modified_lines() ++ process_file() ++ run() + + + + + +Node2 + + +penify_hook.base_analyzer. +BaseAnalyzer + ++ folder_path ++ repo_path ++ repo ++ repo_details ++ relative_file_path ++ api_client ++ supported_file_types + ++ __init__() + + + + + +Node2->Node1 + + + + + diff --git a/docs/rtf/classpenify__hook_1_1git__analyzer_1_1GitDocGenHook__inherit__graph.md5 b/docs/rtf/classpenify__hook_1_1git__analyzer_1_1GitDocGenHook__inherit__graph.md5 new file mode 100644 index 0000000..8b8aff5 --- /dev/null +++ b/docs/rtf/classpenify__hook_1_1git__analyzer_1_1GitDocGenHook__inherit__graph.md5 @@ -0,0 +1 @@ +d285fcb980d93312bfad049f92895ba8 \ No newline at end of file diff --git a/docs/rtf/classpenify__hook_1_1git__analyzer_1_1GitDocGenHook__inherit__graph.svg b/docs/rtf/classpenify__hook_1_1git__analyzer_1_1GitDocGenHook__inherit__graph.svg new file mode 100644 index 0000000..0383f84 --- /dev/null +++ b/docs/rtf/classpenify__hook_1_1git__analyzer_1_1GitDocGenHook__inherit__graph.svg @@ -0,0 +1,58 @@ + + + + + + +penify_hook.git_analyzer.GitDocGenHook + + + +Node1 + + +penify_hook.git_analyzer. +GitDocGenHook + + + ++ __init__() ++ get_modified_files +_in_last_commit() ++ get_modified_lines() ++ process_file() ++ run() + + + + + +Node2 + + +penify_hook.base_analyzer. +BaseAnalyzer + ++ folder_path ++ repo_path ++ repo ++ repo_details ++ relative_file_path ++ api_client ++ supported_file_types + ++ __init__() + + + + + +Node2->Node1 + + + + + diff --git a/docs/rtf/classpenify__hook_1_1git__analyzer_1_1GitDocGenHook_a05313caa22b173ce75638f0db08eeb85_cgraph.md5 b/docs/rtf/classpenify__hook_1_1git__analyzer_1_1GitDocGenHook_a05313caa22b173ce75638f0db08eeb85_cgraph.md5 new file mode 100644 index 0000000..bfda978 --- /dev/null +++ b/docs/rtf/classpenify__hook_1_1git__analyzer_1_1GitDocGenHook_a05313caa22b173ce75638f0db08eeb85_cgraph.md5 @@ -0,0 +1 @@ +d30b2fe6c8ef2ddf32a8fa6ab13a25f2 \ No newline at end of file diff --git a/docs/rtf/classpenify__hook_1_1git__analyzer_1_1GitDocGenHook_a05313caa22b173ce75638f0db08eeb85_cgraph.svg b/docs/rtf/classpenify__hook_1_1git__analyzer_1_1GitDocGenHook_a05313caa22b173ce75638f0db08eeb85_cgraph.svg new file mode 100644 index 0000000..a0f9a52 --- /dev/null +++ b/docs/rtf/classpenify__hook_1_1git__analyzer_1_1GitDocGenHook_a05313caa22b173ce75638f0db08eeb85_cgraph.svg @@ -0,0 +1,39 @@ + + + + + + +penify_hook.git_analyzer.GitDocGenHook.process_file + + + +Node1 + + +penify_hook.git_analyzer. +GitDocGenHook.process_file + + + + + +Node2 + + +penify_hook.git_analyzer. +GitDocGenHook.get_modified_lines + + + + + +Node1->Node2 + + + + + diff --git a/docs/rtf/classpenify__hook_1_1git__analyzer_1_1GitDocGenHook_a05313caa22b173ce75638f0db08eeb85_icgraph.md5 b/docs/rtf/classpenify__hook_1_1git__analyzer_1_1GitDocGenHook_a05313caa22b173ce75638f0db08eeb85_icgraph.md5 new file mode 100644 index 0000000..519d9fc --- /dev/null +++ b/docs/rtf/classpenify__hook_1_1git__analyzer_1_1GitDocGenHook_a05313caa22b173ce75638f0db08eeb85_icgraph.md5 @@ -0,0 +1 @@ +4e6accfb0097a03bb56e2f390d46b980 \ No newline at end of file diff --git a/docs/rtf/classpenify__hook_1_1git__analyzer_1_1GitDocGenHook_a05313caa22b173ce75638f0db08eeb85_icgraph.svg b/docs/rtf/classpenify__hook_1_1git__analyzer_1_1GitDocGenHook_a05313caa22b173ce75638f0db08eeb85_icgraph.svg new file mode 100644 index 0000000..d14f6c2 --- /dev/null +++ b/docs/rtf/classpenify__hook_1_1git__analyzer_1_1GitDocGenHook_a05313caa22b173ce75638f0db08eeb85_icgraph.svg @@ -0,0 +1,55 @@ + + + + + + +penify_hook.git_analyzer.GitDocGenHook.process_file + + + +Node1 + + +penify_hook.git_analyzer. +GitDocGenHook.process_file + + + + + +Node2 + + +penify_hook.file_analyzer. +FileAnalyzerGenHook.run + + + + + +Node1->Node2 + + + + + +Node3 + + +penify_hook.git_analyzer. +GitDocGenHook.run + + + + + +Node1->Node3 + + + + + diff --git a/docs/rtf/classpenify__hook_1_1git__analyzer_1_1GitDocGenHook_a17549766100e91eb94b5f1a1d34bf481_icgraph.md5 b/docs/rtf/classpenify__hook_1_1git__analyzer_1_1GitDocGenHook_a17549766100e91eb94b5f1a1d34bf481_icgraph.md5 new file mode 100644 index 0000000..e94ad2c --- /dev/null +++ b/docs/rtf/classpenify__hook_1_1git__analyzer_1_1GitDocGenHook_a17549766100e91eb94b5f1a1d34bf481_icgraph.md5 @@ -0,0 +1 @@ +c545389fcb803268668d7fa34c6d8fd9 \ No newline at end of file diff --git a/docs/rtf/classpenify__hook_1_1git__analyzer_1_1GitDocGenHook_a17549766100e91eb94b5f1a1d34bf481_icgraph.svg b/docs/rtf/classpenify__hook_1_1git__analyzer_1_1GitDocGenHook_a17549766100e91eb94b5f1a1d34bf481_icgraph.svg new file mode 100644 index 0000000..8cb348b --- /dev/null +++ b/docs/rtf/classpenify__hook_1_1git__analyzer_1_1GitDocGenHook_a17549766100e91eb94b5f1a1d34bf481_icgraph.svg @@ -0,0 +1,40 @@ + + + + + + +penify_hook.git_analyzer.GitDocGenHook.get_modified_files_in_last_commit + + + +Node1 + + +penify_hook.git_analyzer. +GitDocGenHook.get_modified +_files_in_last_commit + + + + + +Node2 + + +penify_hook.git_analyzer. +GitDocGenHook.run + + + + + +Node1->Node2 + + + + + diff --git a/docs/rtf/classpenify__hook_1_1git__analyzer_1_1GitDocGenHook_a3beba14e92d717391a74bb70b1fab0ae_cgraph.md5 b/docs/rtf/classpenify__hook_1_1git__analyzer_1_1GitDocGenHook_a3beba14e92d717391a74bb70b1fab0ae_cgraph.md5 new file mode 100644 index 0000000..cda212c --- /dev/null +++ b/docs/rtf/classpenify__hook_1_1git__analyzer_1_1GitDocGenHook_a3beba14e92d717391a74bb70b1fab0ae_cgraph.md5 @@ -0,0 +1 @@ +4498c89a026edc471fa55e435c85053e \ No newline at end of file diff --git a/docs/rtf/classpenify__hook_1_1git__analyzer_1_1GitDocGenHook_a3beba14e92d717391a74bb70b1fab0ae_cgraph.svg b/docs/rtf/classpenify__hook_1_1git__analyzer_1_1GitDocGenHook_a3beba14e92d717391a74bb70b1fab0ae_cgraph.svg new file mode 100644 index 0000000..03cf8de --- /dev/null +++ b/docs/rtf/classpenify__hook_1_1git__analyzer_1_1GitDocGenHook_a3beba14e92d717391a74bb70b1fab0ae_cgraph.svg @@ -0,0 +1,268 @@ + + + + + + +penify_hook.git_analyzer.GitDocGenHook.run + + + +Node1 + + +penify_hook.git_analyzer. +GitDocGenHook.run + + + + + +Node2 + + +penify_hook.ui_utils.create +_progress_bar + + + + + +Node1->Node2 + + + + + +Node4 + + +penify_hook.git_analyzer. +GitDocGenHook.get_modified +_files_in_last_commit + + + + + +Node1->Node4 + + + + + +Node5 + + +penify_hook.ui_utils.print_info + + + + + +Node1->Node5 + + + + + +Node6 + + +penify_hook.ui_utils.print +_processing + + + + + +Node1->Node6 + + + + + +Node8 + + +penify_hook.ui_utils.print +_status + + + + + +Node1->Node8 + + + + + +Node9 + + +penify_hook.ui_utils.print +_success + + + + + +Node1->Node9 + + + + + +Node11 + + +penify_hook.git_analyzer. +GitDocGenHook.process_file + + + + + +Node1->Node11 + + + + + +Node13 + + +penify_hook.file_analyzer. +FileAnalyzerGenHook.process_file + + + + + +Node1->Node13 + + + + + +Node3 + + +penify_hook.ui_utils.format_info + + + + + +Node2->Node3 + + + + + +Node5->Node3 + + + + + +Node7 + + +penify_hook.ui_utils.format +_file_path + + + + + +Node6->Node7 + + + + + +Node10 + + +penify_hook.ui_utils.format +_success + + + + + +Node9->Node10 + + + + + +Node12 + + +penify_hook.git_analyzer. +GitDocGenHook.get_modified_lines + + + + + +Node11->Node12 + + + + + +Node14 + + +penify_hook.ui_utils.print +_warning + + + + + +Node13->Node14 + + + + + +Node16 + + +penify_hook.ui_utils.update +_stage + + + + + +Node13->Node16 + + + + + +Node15 + + +penify_hook.ui_utils.format +_warning + + + + + +Node14->Node15 + + + + + diff --git a/docs/rtf/classpenify__hook_1_1git__analyzer_1_1GitDocGenHook_a92275fddb43dbef6dfdb6c1ed6e96d0c_cgraph.md5 b/docs/rtf/classpenify__hook_1_1git__analyzer_1_1GitDocGenHook_a92275fddb43dbef6dfdb6c1ed6e96d0c_cgraph.md5 new file mode 100644 index 0000000..4c4eb97 --- /dev/null +++ b/docs/rtf/classpenify__hook_1_1git__analyzer_1_1GitDocGenHook_a92275fddb43dbef6dfdb6c1ed6e96d0c_cgraph.md5 @@ -0,0 +1 @@ +eb87828bf186415180fe0c4a9a69bffa \ No newline at end of file diff --git a/docs/rtf/classpenify__hook_1_1git__analyzer_1_1GitDocGenHook_a92275fddb43dbef6dfdb6c1ed6e96d0c_cgraph.svg b/docs/rtf/classpenify__hook_1_1git__analyzer_1_1GitDocGenHook_a92275fddb43dbef6dfdb6c1ed6e96d0c_cgraph.svg new file mode 100644 index 0000000..cec3173 --- /dev/null +++ b/docs/rtf/classpenify__hook_1_1git__analyzer_1_1GitDocGenHook_a92275fddb43dbef6dfdb6c1ed6e96d0c_cgraph.svg @@ -0,0 +1,29 @@ + + + + + + +penify_hook.git_analyzer.GitDocGenHook.__init__ + + + +Node1 + + +penify_hook.git_analyzer. +GitDocGenHook.__init__ + + + + + +Node1->Node1 + + + + + diff --git a/docs/rtf/classpenify__hook_1_1git__analyzer_1_1GitDocGenHook_a92275fddb43dbef6dfdb6c1ed6e96d0c_icgraph.md5 b/docs/rtf/classpenify__hook_1_1git__analyzer_1_1GitDocGenHook_a92275fddb43dbef6dfdb6c1ed6e96d0c_icgraph.md5 new file mode 100644 index 0000000..756ea69 --- /dev/null +++ b/docs/rtf/classpenify__hook_1_1git__analyzer_1_1GitDocGenHook_a92275fddb43dbef6dfdb6c1ed6e96d0c_icgraph.md5 @@ -0,0 +1 @@ +3a80069fcc09aa58b795925a04c3a1a9 \ No newline at end of file diff --git a/docs/rtf/classpenify__hook_1_1git__analyzer_1_1GitDocGenHook_a92275fddb43dbef6dfdb6c1ed6e96d0c_icgraph.svg b/docs/rtf/classpenify__hook_1_1git__analyzer_1_1GitDocGenHook_a92275fddb43dbef6dfdb6c1ed6e96d0c_icgraph.svg new file mode 100644 index 0000000..caf1235 --- /dev/null +++ b/docs/rtf/classpenify__hook_1_1git__analyzer_1_1GitDocGenHook_a92275fddb43dbef6dfdb6c1ed6e96d0c_icgraph.svg @@ -0,0 +1,29 @@ + + + + + + +penify_hook.git_analyzer.GitDocGenHook.__init__ + + + +Node1 + + +penify_hook.git_analyzer. +GitDocGenHook.__init__ + + + + + +Node1->Node1 + + + + + diff --git a/docs/rtf/classpenify__hook_1_1git__analyzer_1_1GitDocGenHook_a974d2f51315ed6a1965a7fd7e2ced0cd_icgraph.md5 b/docs/rtf/classpenify__hook_1_1git__analyzer_1_1GitDocGenHook_a974d2f51315ed6a1965a7fd7e2ced0cd_icgraph.md5 new file mode 100644 index 0000000..5dc8e1b --- /dev/null +++ b/docs/rtf/classpenify__hook_1_1git__analyzer_1_1GitDocGenHook_a974d2f51315ed6a1965a7fd7e2ced0cd_icgraph.md5 @@ -0,0 +1 @@ +1071229abc0a24fe1359fe7763b4c8d0 \ No newline at end of file diff --git a/docs/rtf/classpenify__hook_1_1git__analyzer_1_1GitDocGenHook_a974d2f51315ed6a1965a7fd7e2ced0cd_icgraph.svg b/docs/rtf/classpenify__hook_1_1git__analyzer_1_1GitDocGenHook_a974d2f51315ed6a1965a7fd7e2ced0cd_icgraph.svg new file mode 100644 index 0000000..f0cc7fa --- /dev/null +++ b/docs/rtf/classpenify__hook_1_1git__analyzer_1_1GitDocGenHook_a974d2f51315ed6a1965a7fd7e2ced0cd_icgraph.svg @@ -0,0 +1,71 @@ + + + + + + +penify_hook.git_analyzer.GitDocGenHook.get_modified_lines + + + +Node1 + + +penify_hook.git_analyzer. +GitDocGenHook.get_modified_lines + + + + + +Node2 + + +penify_hook.git_analyzer. +GitDocGenHook.process_file + + + + + +Node1->Node2 + + + + + +Node3 + + +penify_hook.file_analyzer. +FileAnalyzerGenHook.run + + + + + +Node2->Node3 + + + + + +Node4 + + +penify_hook.git_analyzer. +GitDocGenHook.run + + + + + +Node2->Node4 + + + + + diff --git a/docs/rtf/classpenify__hook_1_1jira__client_1_1JiraClient__coll__graph.md5 b/docs/rtf/classpenify__hook_1_1jira__client_1_1JiraClient__coll__graph.md5 new file mode 100644 index 0000000..fd79a8c --- /dev/null +++ b/docs/rtf/classpenify__hook_1_1jira__client_1_1JiraClient__coll__graph.md5 @@ -0,0 +1 @@ +6c94c8bb54063a87c9a021e499d2535a \ No newline at end of file diff --git a/docs/rtf/classpenify__hook_1_1jira__client_1_1JiraClient__coll__graph.svg b/docs/rtf/classpenify__hook_1_1jira__client_1_1JiraClient__coll__graph.svg new file mode 100644 index 0000000..9d17916 --- /dev/null +++ b/docs/rtf/classpenify__hook_1_1jira__client_1_1JiraClient__coll__graph.svg @@ -0,0 +1,44 @@ + + + + + + +penify_hook.jira_client.JiraClient + + + +Node1 + + +penify_hook.jira_client. +JiraClient + ++ jira_url ++ jira_user ++ jira_api_token ++ jira_client + ++ __init__() ++ is_connected() ++ extract_issue_keys +_from_branch() ++ extract_issue_keys() ++ get_issue_details() ++ add_comment() ++ update_issue_status() ++ format_commit_message +_with_jira_info() ++ get_detailed_issue +_context() ++ get_commit_context +_from_issues() ++ enhance_commit_message() + + + + + diff --git a/docs/rtf/classpenify__hook_1_1jira__client_1_1JiraClient_a00d0f9ae006313a21576362d26ac5ec8_icgraph.md5 b/docs/rtf/classpenify__hook_1_1jira__client_1_1JiraClient_a00d0f9ae006313a21576362d26ac5ec8_icgraph.md5 new file mode 100644 index 0000000..15413c7 --- /dev/null +++ b/docs/rtf/classpenify__hook_1_1jira__client_1_1JiraClient_a00d0f9ae006313a21576362d26ac5ec8_icgraph.md5 @@ -0,0 +1 @@ +e49f7a18c7f7394bc3ba168c4b7dfcbf \ No newline at end of file diff --git a/docs/rtf/classpenify__hook_1_1jira__client_1_1JiraClient_a00d0f9ae006313a21576362d26ac5ec8_icgraph.svg b/docs/rtf/classpenify__hook_1_1jira__client_1_1JiraClient_a00d0f9ae006313a21576362d26ac5ec8_icgraph.svg new file mode 100644 index 0000000..dbff1cc --- /dev/null +++ b/docs/rtf/classpenify__hook_1_1jira__client_1_1JiraClient_a00d0f9ae006313a21576362d26ac5ec8_icgraph.svg @@ -0,0 +1,176 @@ + + + + + + +penify_hook.jira_client.JiraClient.is_connected + + + +Node1 + + +penify_hook.jira_client. +JiraClient.is_connected + + + + + +Node2 + + +penify_hook.jira_client. +JiraClient.add_comment + + + + + +Node1->Node2 + + + + + +Node3 + + +penify_hook.jira_client. +JiraClient.enhance_commit +_message + + + + + +Node1->Node3 + + + + + +Node4 + + +penify_hook.jira_client. +JiraClient.format_commit +_message_with_jira_info + + + + + +Node1->Node4 + + + + + +Node5 + + +penify_hook.jira_client. +JiraClient.get_commit +_context_from_issues + + + + + +Node1->Node5 + + + + + +Node6 + + +penify_hook.jira_client. +JiraClient.get_detailed +_issue_context + + + + + +Node1->Node6 + + + + + +Node7 + + +penify_hook.jira_client. +JiraClient.get_issue_details + + + + + +Node1->Node7 + + + + + +Node8 + + +penify_hook.jira_client. +JiraClient.update_issue +_status + + + + + +Node1->Node8 + + + + + +Node2->Node2 + + + + + +Node4->Node3 + + + + + +Node5->Node3 + + + + + +Node6->Node5 + + + + + +Node7->Node4 + + + + + +Node7->Node5 + + + + + diff --git a/docs/rtf/classpenify__hook_1_1jira__client_1_1JiraClient_a093d6456fe053ef7a7862d5d6851910c_cgraph.md5 b/docs/rtf/classpenify__hook_1_1jira__client_1_1JiraClient_a093d6456fe053ef7a7862d5d6851910c_cgraph.md5 new file mode 100644 index 0000000..bf358a8 --- /dev/null +++ b/docs/rtf/classpenify__hook_1_1jira__client_1_1JiraClient_a093d6456fe053ef7a7862d5d6851910c_cgraph.md5 @@ -0,0 +1 @@ +c2b8f7eecd95ef8d0186d7f206ad610c \ No newline at end of file diff --git a/docs/rtf/classpenify__hook_1_1jira__client_1_1JiraClient_a093d6456fe053ef7a7862d5d6851910c_cgraph.svg b/docs/rtf/classpenify__hook_1_1jira__client_1_1JiraClient_a093d6456fe053ef7a7862d5d6851910c_cgraph.svg new file mode 100644 index 0000000..a105cc3 --- /dev/null +++ b/docs/rtf/classpenify__hook_1_1jira__client_1_1JiraClient_a093d6456fe053ef7a7862d5d6851910c_cgraph.svg @@ -0,0 +1,54 @@ + + + + + + +penify_hook.jira_client.JiraClient.extract_issue_keys_from_branch + + + +Node1 + + +penify_hook.jira_client. +JiraClient.extract_issue +_keys_from_branch + + + + + +Node2 + + +penify_hook.ui_utils.print_info + + + + + +Node1->Node2 + + + + + +Node3 + + +penify_hook.ui_utils.format_info + + + + + +Node2->Node3 + + + + + diff --git a/docs/rtf/classpenify__hook_1_1jira__client_1_1JiraClient_a49ea1149758f7f5212149d357b13cc23_cgraph.md5 b/docs/rtf/classpenify__hook_1_1jira__client_1_1JiraClient_a49ea1149758f7f5212149d357b13cc23_cgraph.md5 new file mode 100644 index 0000000..c70fc7f --- /dev/null +++ b/docs/rtf/classpenify__hook_1_1jira__client_1_1JiraClient_a49ea1149758f7f5212149d357b13cc23_cgraph.md5 @@ -0,0 +1 @@ +3fdd0ff288b79c613c0ccbdde81f6b44 \ No newline at end of file diff --git a/docs/rtf/classpenify__hook_1_1jira__client_1_1JiraClient_a49ea1149758f7f5212149d357b13cc23_cgraph.svg b/docs/rtf/classpenify__hook_1_1jira__client_1_1JiraClient_a49ea1149758f7f5212149d357b13cc23_cgraph.svg new file mode 100644 index 0000000..505f77c --- /dev/null +++ b/docs/rtf/classpenify__hook_1_1jira__client_1_1JiraClient_a49ea1149758f7f5212149d357b13cc23_cgraph.svg @@ -0,0 +1,78 @@ + + + + + + +penify_hook.jira_client.JiraClient.format_commit_message_with_jira_info + + + +Node1 + + +penify_hook.jira_client. +JiraClient.format_commit +_message_with_jira_info + + + + + +Node2 + + +penify_hook.jira_client. +JiraClient.extract_issue_keys + + + + + +Node1->Node2 + + + + + +Node3 + + +penify_hook.jira_client. +JiraClient.get_issue_details + + + + + +Node1->Node3 + + + + + +Node4 + + +penify_hook.jira_client. +JiraClient.is_connected + + + + + +Node1->Node4 + + + + + +Node3->Node4 + + + + + diff --git a/docs/rtf/classpenify__hook_1_1jira__client_1_1JiraClient_a49ea1149758f7f5212149d357b13cc23_icgraph.md5 b/docs/rtf/classpenify__hook_1_1jira__client_1_1JiraClient_a49ea1149758f7f5212149d357b13cc23_icgraph.md5 new file mode 100644 index 0000000..58d4f7d --- /dev/null +++ b/docs/rtf/classpenify__hook_1_1jira__client_1_1JiraClient_a49ea1149758f7f5212149d357b13cc23_icgraph.md5 @@ -0,0 +1 @@ +e64b34f639342bc29f69697ff85b6115 \ No newline at end of file diff --git a/docs/rtf/classpenify__hook_1_1jira__client_1_1JiraClient_a49ea1149758f7f5212149d357b13cc23_icgraph.svg b/docs/rtf/classpenify__hook_1_1jira__client_1_1JiraClient_a49ea1149758f7f5212149d357b13cc23_icgraph.svg new file mode 100644 index 0000000..4afaaf0 --- /dev/null +++ b/docs/rtf/classpenify__hook_1_1jira__client_1_1JiraClient_a49ea1149758f7f5212149d357b13cc23_icgraph.svg @@ -0,0 +1,41 @@ + + + + + + +penify_hook.jira_client.JiraClient.format_commit_message_with_jira_info + + + +Node1 + + +penify_hook.jira_client. +JiraClient.format_commit +_message_with_jira_info + + + + + +Node2 + + +penify_hook.jira_client. +JiraClient.enhance_commit +_message + + + + + +Node1->Node2 + + + + + diff --git a/docs/rtf/classpenify__hook_1_1jira__client_1_1JiraClient_a65f6924819084b7c8d268956a784804a_cgraph.md5 b/docs/rtf/classpenify__hook_1_1jira__client_1_1JiraClient_a65f6924819084b7c8d268956a784804a_cgraph.md5 new file mode 100644 index 0000000..e84f7d7 --- /dev/null +++ b/docs/rtf/classpenify__hook_1_1jira__client_1_1JiraClient_a65f6924819084b7c8d268956a784804a_cgraph.md5 @@ -0,0 +1 @@ +ce0d7d39675e66eb580380759195be0e \ No newline at end of file diff --git a/docs/rtf/classpenify__hook_1_1jira__client_1_1JiraClient_a65f6924819084b7c8d268956a784804a_cgraph.svg b/docs/rtf/classpenify__hook_1_1jira__client_1_1JiraClient_a65f6924819084b7c8d268956a784804a_cgraph.svg new file mode 100644 index 0000000..5494c0f --- /dev/null +++ b/docs/rtf/classpenify__hook_1_1jira__client_1_1JiraClient_a65f6924819084b7c8d268956a784804a_cgraph.svg @@ -0,0 +1,39 @@ + + + + + + +penify_hook.jira_client.JiraClient.get_issue_details + + + +Node1 + + +penify_hook.jira_client. +JiraClient.get_issue_details + + + + + +Node2 + + +penify_hook.jira_client. +JiraClient.is_connected + + + + + +Node1->Node2 + + + + + diff --git a/docs/rtf/classpenify__hook_1_1jira__client_1_1JiraClient_a65f6924819084b7c8d268956a784804a_icgraph.md5 b/docs/rtf/classpenify__hook_1_1jira__client_1_1JiraClient_a65f6924819084b7c8d268956a784804a_icgraph.md5 new file mode 100644 index 0000000..584c012 --- /dev/null +++ b/docs/rtf/classpenify__hook_1_1jira__client_1_1JiraClient_a65f6924819084b7c8d268956a784804a_icgraph.md5 @@ -0,0 +1 @@ +b4d0f6392752d140ca4858cea5527f74 \ No newline at end of file diff --git a/docs/rtf/classpenify__hook_1_1jira__client_1_1JiraClient_a65f6924819084b7c8d268956a784804a_icgraph.svg b/docs/rtf/classpenify__hook_1_1jira__client_1_1JiraClient_a65f6924819084b7c8d268956a784804a_icgraph.svg new file mode 100644 index 0000000..28ed8fb --- /dev/null +++ b/docs/rtf/classpenify__hook_1_1jira__client_1_1JiraClient_a65f6924819084b7c8d268956a784804a_icgraph.svg @@ -0,0 +1,80 @@ + + + + + + +penify_hook.jira_client.JiraClient.get_issue_details + + + +Node1 + + +penify_hook.jira_client. +JiraClient.get_issue_details + + + + + +Node2 + + +penify_hook.jira_client. +JiraClient.format_commit +_message_with_jira_info + + + + + +Node1->Node2 + + + + + +Node4 + + +penify_hook.jira_client. +JiraClient.get_commit +_context_from_issues + + + + + +Node1->Node4 + + + + + +Node3 + + +penify_hook.jira_client. +JiraClient.enhance_commit +_message + + + + + +Node2->Node3 + + + + + +Node4->Node3 + + + + + diff --git a/docs/rtf/classpenify__hook_1_1jira__client_1_1JiraClient_a70d2c5a6432aa6f238da0ff65d49a760_cgraph.md5 b/docs/rtf/classpenify__hook_1_1jira__client_1_1JiraClient_a70d2c5a6432aa6f238da0ff65d49a760_cgraph.md5 new file mode 100644 index 0000000..d953518 --- /dev/null +++ b/docs/rtf/classpenify__hook_1_1jira__client_1_1JiraClient_a70d2c5a6432aa6f238da0ff65d49a760_cgraph.md5 @@ -0,0 +1 @@ +9194291c6b536fb2aa39473066ce3d57 \ No newline at end of file diff --git a/docs/rtf/classpenify__hook_1_1jira__client_1_1JiraClient_a70d2c5a6432aa6f238da0ff65d49a760_cgraph.svg b/docs/rtf/classpenify__hook_1_1jira__client_1_1JiraClient_a70d2c5a6432aa6f238da0ff65d49a760_cgraph.svg new file mode 100644 index 0000000..d1c93aa --- /dev/null +++ b/docs/rtf/classpenify__hook_1_1jira__client_1_1JiraClient_a70d2c5a6432aa6f238da0ff65d49a760_cgraph.svg @@ -0,0 +1,153 @@ + + + + + + +penify_hook.jira_client.JiraClient.enhance_commit_message + + + +Node1 + + +penify_hook.jira_client. +JiraClient.enhance_commit +_message + + + + + +Node2 + + +penify_hook.jira_client. +JiraClient.format_commit +_message_with_jira_info + + + + + +Node1->Node2 + + + + + +Node5 + + +penify_hook.jira_client. +JiraClient.is_connected + + + + + +Node1->Node5 + + + + + +Node6 + + +penify_hook.jira_client. +JiraClient.get_commit +_context_from_issues + + + + + +Node1->Node6 + + + + + +Node3 + + +penify_hook.jira_client. +JiraClient.extract_issue_keys + + + + + +Node2->Node3 + + + + + +Node4 + + +penify_hook.jira_client. +JiraClient.get_issue_details + + + + + +Node2->Node4 + + + + + +Node2->Node5 + + + + + +Node4->Node5 + + + + + +Node6->Node4 + + + + + +Node6->Node5 + + + + + +Node7 + + +penify_hook.jira_client. +JiraClient.get_detailed +_issue_context + + + + + +Node6->Node7 + + + + + +Node7->Node5 + + + + + diff --git a/docs/rtf/classpenify__hook_1_1jira__client_1_1JiraClient_aa1f374116c64cd5f1492ec7f7e40f9c1_cgraph.md5 b/docs/rtf/classpenify__hook_1_1jira__client_1_1JiraClient_aa1f374116c64cd5f1492ec7f7e40f9c1_cgraph.md5 new file mode 100644 index 0000000..ea4f60f --- /dev/null +++ b/docs/rtf/classpenify__hook_1_1jira__client_1_1JiraClient_aa1f374116c64cd5f1492ec7f7e40f9c1_cgraph.md5 @@ -0,0 +1 @@ +01a09828002214953a0e4ce5a004f82b \ No newline at end of file diff --git a/docs/rtf/classpenify__hook_1_1jira__client_1_1JiraClient_aa1f374116c64cd5f1492ec7f7e40f9c1_cgraph.svg b/docs/rtf/classpenify__hook_1_1jira__client_1_1JiraClient_aa1f374116c64cd5f1492ec7f7e40f9c1_cgraph.svg new file mode 100644 index 0000000..9b98fd2 --- /dev/null +++ b/docs/rtf/classpenify__hook_1_1jira__client_1_1JiraClient_aa1f374116c64cd5f1492ec7f7e40f9c1_cgraph.svg @@ -0,0 +1,45 @@ + + + + + + +penify_hook.jira_client.JiraClient.add_comment + + + +Node1 + + +penify_hook.jira_client. +JiraClient.add_comment + + + + + +Node1->Node1 + + + + + +Node2 + + +penify_hook.jira_client. +JiraClient.is_connected + + + + + +Node1->Node2 + + + + + diff --git a/docs/rtf/classpenify__hook_1_1jira__client_1_1JiraClient_aa1f374116c64cd5f1492ec7f7e40f9c1_icgraph.md5 b/docs/rtf/classpenify__hook_1_1jira__client_1_1JiraClient_aa1f374116c64cd5f1492ec7f7e40f9c1_icgraph.md5 new file mode 100644 index 0000000..8cce519 --- /dev/null +++ b/docs/rtf/classpenify__hook_1_1jira__client_1_1JiraClient_aa1f374116c64cd5f1492ec7f7e40f9c1_icgraph.md5 @@ -0,0 +1 @@ +be0799c63ed63825acfa4aefd053a607 \ No newline at end of file diff --git a/docs/rtf/classpenify__hook_1_1jira__client_1_1JiraClient_aa1f374116c64cd5f1492ec7f7e40f9c1_icgraph.svg b/docs/rtf/classpenify__hook_1_1jira__client_1_1JiraClient_aa1f374116c64cd5f1492ec7f7e40f9c1_icgraph.svg new file mode 100644 index 0000000..dcc9f2d --- /dev/null +++ b/docs/rtf/classpenify__hook_1_1jira__client_1_1JiraClient_aa1f374116c64cd5f1492ec7f7e40f9c1_icgraph.svg @@ -0,0 +1,29 @@ + + + + + + +penify_hook.jira_client.JiraClient.add_comment + + + +Node1 + + +penify_hook.jira_client. +JiraClient.add_comment + + + + + +Node1->Node1 + + + + + diff --git a/docs/rtf/classpenify__hook_1_1jira__client_1_1JiraClient_aa967169a4b7970c67c0947b9ac56f746_cgraph.md5 b/docs/rtf/classpenify__hook_1_1jira__client_1_1JiraClient_aa967169a4b7970c67c0947b9ac56f746_cgraph.md5 new file mode 100644 index 0000000..562794f --- /dev/null +++ b/docs/rtf/classpenify__hook_1_1jira__client_1_1JiraClient_aa967169a4b7970c67c0947b9ac56f746_cgraph.md5 @@ -0,0 +1 @@ +de5b0ac337604f2c79dc74aaee0a1763 \ No newline at end of file diff --git a/docs/rtf/classpenify__hook_1_1jira__client_1_1JiraClient_aa967169a4b7970c67c0947b9ac56f746_cgraph.svg b/docs/rtf/classpenify__hook_1_1jira__client_1_1JiraClient_aa967169a4b7970c67c0947b9ac56f746_cgraph.svg new file mode 100644 index 0000000..93d705f --- /dev/null +++ b/docs/rtf/classpenify__hook_1_1jira__client_1_1JiraClient_aa967169a4b7970c67c0947b9ac56f746_cgraph.svg @@ -0,0 +1,40 @@ + + + + + + +penify_hook.jira_client.JiraClient.get_detailed_issue_context + + + +Node1 + + +penify_hook.jira_client. +JiraClient.get_detailed +_issue_context + + + + + +Node2 + + +penify_hook.jira_client. +JiraClient.is_connected + + + + + +Node1->Node2 + + + + + diff --git a/docs/rtf/classpenify__hook_1_1jira__client_1_1JiraClient_aa967169a4b7970c67c0947b9ac56f746_icgraph.md5 b/docs/rtf/classpenify__hook_1_1jira__client_1_1JiraClient_aa967169a4b7970c67c0947b9ac56f746_icgraph.md5 new file mode 100644 index 0000000..cc19180 --- /dev/null +++ b/docs/rtf/classpenify__hook_1_1jira__client_1_1JiraClient_aa967169a4b7970c67c0947b9ac56f746_icgraph.md5 @@ -0,0 +1 @@ +8ed68fcd41631bf9876f85ae6b4b3de2 \ No newline at end of file diff --git a/docs/rtf/classpenify__hook_1_1jira__client_1_1JiraClient_aa967169a4b7970c67c0947b9ac56f746_icgraph.svg b/docs/rtf/classpenify__hook_1_1jira__client_1_1JiraClient_aa967169a4b7970c67c0947b9ac56f746_icgraph.svg new file mode 100644 index 0000000..4c91c11 --- /dev/null +++ b/docs/rtf/classpenify__hook_1_1jira__client_1_1JiraClient_aa967169a4b7970c67c0947b9ac56f746_icgraph.svg @@ -0,0 +1,58 @@ + + + + + + +penify_hook.jira_client.JiraClient.get_detailed_issue_context + + + +Node1 + + +penify_hook.jira_client. +JiraClient.get_detailed +_issue_context + + + + + +Node2 + + +penify_hook.jira_client. +JiraClient.get_commit +_context_from_issues + + + + + +Node1->Node2 + + + + + +Node3 + + +penify_hook.jira_client. +JiraClient.enhance_commit +_message + + + + + +Node2->Node3 + + + + + diff --git a/docs/rtf/classpenify__hook_1_1jira__client_1_1JiraClient_aca8837552d37bfd611de23441a240826_cgraph.md5 b/docs/rtf/classpenify__hook_1_1jira__client_1_1JiraClient_aca8837552d37bfd611de23441a240826_cgraph.md5 new file mode 100644 index 0000000..b855a20 --- /dev/null +++ b/docs/rtf/classpenify__hook_1_1jira__client_1_1JiraClient_aca8837552d37bfd611de23441a240826_cgraph.md5 @@ -0,0 +1 @@ +2e42fe22a9070fc3f543991e99faf205 \ No newline at end of file diff --git a/docs/rtf/classpenify__hook_1_1jira__client_1_1JiraClient_aca8837552d37bfd611de23441a240826_cgraph.svg b/docs/rtf/classpenify__hook_1_1jira__client_1_1JiraClient_aca8837552d37bfd611de23441a240826_cgraph.svg new file mode 100644 index 0000000..aff53e7 --- /dev/null +++ b/docs/rtf/classpenify__hook_1_1jira__client_1_1JiraClient_aca8837552d37bfd611de23441a240826_cgraph.svg @@ -0,0 +1,40 @@ + + + + + + +penify_hook.jira_client.JiraClient.update_issue_status + + + +Node1 + + +penify_hook.jira_client. +JiraClient.update_issue +_status + + + + + +Node2 + + +penify_hook.jira_client. +JiraClient.is_connected + + + + + +Node1->Node2 + + + + + diff --git a/docs/rtf/classpenify__hook_1_1jira__client_1_1JiraClient_ad2823ad1d3baaedd38039913c3a97fd7_icgraph.md5 b/docs/rtf/classpenify__hook_1_1jira__client_1_1JiraClient_ad2823ad1d3baaedd38039913c3a97fd7_icgraph.md5 new file mode 100644 index 0000000..f452c00 --- /dev/null +++ b/docs/rtf/classpenify__hook_1_1jira__client_1_1JiraClient_ad2823ad1d3baaedd38039913c3a97fd7_icgraph.md5 @@ -0,0 +1 @@ +f5fed9d6bb8f646e32b31343d031871d \ No newline at end of file diff --git a/docs/rtf/classpenify__hook_1_1jira__client_1_1JiraClient_ad2823ad1d3baaedd38039913c3a97fd7_icgraph.svg b/docs/rtf/classpenify__hook_1_1jira__client_1_1JiraClient_ad2823ad1d3baaedd38039913c3a97fd7_icgraph.svg new file mode 100644 index 0000000..f764e5c --- /dev/null +++ b/docs/rtf/classpenify__hook_1_1jira__client_1_1JiraClient_ad2823ad1d3baaedd38039913c3a97fd7_icgraph.svg @@ -0,0 +1,57 @@ + + + + + + +penify_hook.jira_client.JiraClient.extract_issue_keys + + + +Node1 + + +penify_hook.jira_client. +JiraClient.extract_issue_keys + + + + + +Node2 + + +penify_hook.jira_client. +JiraClient.format_commit +_message_with_jira_info + + + + + +Node1->Node2 + + + + + +Node3 + + +penify_hook.jira_client. +JiraClient.enhance_commit +_message + + + + + +Node2->Node3 + + + + + diff --git a/docs/rtf/classpenify__hook_1_1jira__client_1_1JiraClient_afb41ce6f13c30b1265d439ddf04bf2cd_cgraph.md5 b/docs/rtf/classpenify__hook_1_1jira__client_1_1JiraClient_afb41ce6f13c30b1265d439ddf04bf2cd_cgraph.md5 new file mode 100644 index 0000000..990f237 --- /dev/null +++ b/docs/rtf/classpenify__hook_1_1jira__client_1_1JiraClient_afb41ce6f13c30b1265d439ddf04bf2cd_cgraph.md5 @@ -0,0 +1 @@ +e8676c5f3006c0807c1fe30ed75a7701 \ No newline at end of file diff --git a/docs/rtf/classpenify__hook_1_1jira__client_1_1JiraClient_afb41ce6f13c30b1265d439ddf04bf2cd_cgraph.svg b/docs/rtf/classpenify__hook_1_1jira__client_1_1JiraClient_afb41ce6f13c30b1265d439ddf04bf2cd_cgraph.svg new file mode 100644 index 0000000..7230635 --- /dev/null +++ b/docs/rtf/classpenify__hook_1_1jira__client_1_1JiraClient_afb41ce6f13c30b1265d439ddf04bf2cd_cgraph.svg @@ -0,0 +1,85 @@ + + + + + + +penify_hook.jira_client.JiraClient.get_commit_context_from_issues + + + +Node1 + + +penify_hook.jira_client. +JiraClient.get_commit +_context_from_issues + + + + + +Node2 + + +penify_hook.jira_client. +JiraClient.get_detailed +_issue_context + + + + + +Node1->Node2 + + + + + +Node3 + + +penify_hook.jira_client. +JiraClient.is_connected + + + + + +Node1->Node3 + + + + + +Node4 + + +penify_hook.jira_client. +JiraClient.get_issue_details + + + + + +Node1->Node4 + + + + + +Node2->Node3 + + + + + +Node4->Node3 + + + + + diff --git a/docs/rtf/classpenify__hook_1_1jira__client_1_1JiraClient_afb41ce6f13c30b1265d439ddf04bf2cd_icgraph.md5 b/docs/rtf/classpenify__hook_1_1jira__client_1_1JiraClient_afb41ce6f13c30b1265d439ddf04bf2cd_icgraph.md5 new file mode 100644 index 0000000..3221326 --- /dev/null +++ b/docs/rtf/classpenify__hook_1_1jira__client_1_1JiraClient_afb41ce6f13c30b1265d439ddf04bf2cd_icgraph.md5 @@ -0,0 +1 @@ +8e9085e7e96a72eae434ab3b9bb34f71 \ No newline at end of file diff --git a/docs/rtf/classpenify__hook_1_1jira__client_1_1JiraClient_afb41ce6f13c30b1265d439ddf04bf2cd_icgraph.svg b/docs/rtf/classpenify__hook_1_1jira__client_1_1JiraClient_afb41ce6f13c30b1265d439ddf04bf2cd_icgraph.svg new file mode 100644 index 0000000..c8bea4f --- /dev/null +++ b/docs/rtf/classpenify__hook_1_1jira__client_1_1JiraClient_afb41ce6f13c30b1265d439ddf04bf2cd_icgraph.svg @@ -0,0 +1,41 @@ + + + + + + +penify_hook.jira_client.JiraClient.get_commit_context_from_issues + + + +Node1 + + +penify_hook.jira_client. +JiraClient.get_commit +_context_from_issues + + + + + +Node2 + + +penify_hook.jira_client. +JiraClient.enhance_commit +_message + + + + + +Node1->Node2 + + + + + diff --git a/docs/rtf/classpenify__hook_1_1llm__client_1_1LLMClient__coll__graph.md5 b/docs/rtf/classpenify__hook_1_1llm__client_1_1LLMClient__coll__graph.md5 new file mode 100644 index 0000000..6db17d2 --- /dev/null +++ b/docs/rtf/classpenify__hook_1_1llm__client_1_1LLMClient__coll__graph.md5 @@ -0,0 +1 @@ +98e4897c5b45a162671e50e760d299ce \ No newline at end of file diff --git a/docs/rtf/classpenify__hook_1_1llm__client_1_1LLMClient__coll__graph.svg b/docs/rtf/classpenify__hook_1_1llm__client_1_1LLMClient__coll__graph.svg new file mode 100644 index 0000000..40f016c --- /dev/null +++ b/docs/rtf/classpenify__hook_1_1llm__client_1_1LLMClient__coll__graph.svg @@ -0,0 +1,29 @@ + + + + + + +penify_hook.llm_client.LLMClient + + + +Node1 + + +penify_hook.llm_client.LLMClient + ++ model +- _litellm + ++ __init__() ++ litellm() ++ generate_commit_summary() + + + + + diff --git a/docs/rtf/classpenify__hook_1_1llm__client_1_1LLMClient_a2ad3014dac466ee1d8e00306d0cf2000_cgraph.md5 b/docs/rtf/classpenify__hook_1_1llm__client_1_1LLMClient_a2ad3014dac466ee1d8e00306d0cf2000_cgraph.md5 new file mode 100644 index 0000000..5ae4b79 --- /dev/null +++ b/docs/rtf/classpenify__hook_1_1llm__client_1_1LLMClient_a2ad3014dac466ee1d8e00306d0cf2000_cgraph.md5 @@ -0,0 +1 @@ +3a38b34ed8236aa424f3ba243fba3cf0 \ No newline at end of file diff --git a/docs/rtf/classpenify__hook_1_1llm__client_1_1LLMClient_a2ad3014dac466ee1d8e00306d0cf2000_cgraph.svg b/docs/rtf/classpenify__hook_1_1llm__client_1_1LLMClient_a2ad3014dac466ee1d8e00306d0cf2000_cgraph.svg new file mode 100644 index 0000000..9c8fc75 --- /dev/null +++ b/docs/rtf/classpenify__hook_1_1llm__client_1_1LLMClient_a2ad3014dac466ee1d8e00306d0cf2000_cgraph.svg @@ -0,0 +1,38 @@ + + + + + + +penify_hook.llm_client.LLMClient.generate_commit_summary + + + +Node1 + + +penify_hook.llm_client.LLMClient.generate +_commit_summary + + + + + +Node2 + + +penify_hook.llm_client.LLMClient.litellm + + + + + +Node1->Node2 + + + + + diff --git a/docs/rtf/classpenify__hook_1_1llm__client_1_1LLMClient_a2ad3014dac466ee1d8e00306d0cf2000_icgraph.md5 b/docs/rtf/classpenify__hook_1_1llm__client_1_1LLMClient_a2ad3014dac466ee1d8e00306d0cf2000_icgraph.md5 new file mode 100644 index 0000000..6c5244f --- /dev/null +++ b/docs/rtf/classpenify__hook_1_1llm__client_1_1LLMClient_a2ad3014dac466ee1d8e00306d0cf2000_icgraph.md5 @@ -0,0 +1 @@ +2232db7a39aade439b305a1e3373c005 \ No newline at end of file diff --git a/docs/rtf/classpenify__hook_1_1llm__client_1_1LLMClient_a2ad3014dac466ee1d8e00306d0cf2000_icgraph.svg b/docs/rtf/classpenify__hook_1_1llm__client_1_1LLMClient_a2ad3014dac466ee1d8e00306d0cf2000_icgraph.svg new file mode 100644 index 0000000..f54f300 --- /dev/null +++ b/docs/rtf/classpenify__hook_1_1llm__client_1_1LLMClient_a2ad3014dac466ee1d8e00306d0cf2000_icgraph.svg @@ -0,0 +1,39 @@ + + + + + + +penify_hook.llm_client.LLMClient.generate_commit_summary + + + +Node1 + + +penify_hook.llm_client.LLMClient.generate +_commit_summary + + + + + +Node2 + + +penify_hook.api_client.APIClient.generate +_commit_summary_with_llm + + + + + +Node1->Node2 + + + + + diff --git a/docs/rtf/classpenify__hook_1_1llm__client_1_1LLMClient_ad6f06658ca922793f879474f2234518e_icgraph.md5 b/docs/rtf/classpenify__hook_1_1llm__client_1_1LLMClient_ad6f06658ca922793f879474f2234518e_icgraph.md5 new file mode 100644 index 0000000..22a2946 --- /dev/null +++ b/docs/rtf/classpenify__hook_1_1llm__client_1_1LLMClient_ad6f06658ca922793f879474f2234518e_icgraph.md5 @@ -0,0 +1 @@ +3dd9f4364bc4c50da31157ac03a3e97f \ No newline at end of file diff --git a/docs/rtf/classpenify__hook_1_1llm__client_1_1LLMClient_ad6f06658ca922793f879474f2234518e_icgraph.svg b/docs/rtf/classpenify__hook_1_1llm__client_1_1LLMClient_ad6f06658ca922793f879474f2234518e_icgraph.svg new file mode 100644 index 0000000..dd6e7a9 --- /dev/null +++ b/docs/rtf/classpenify__hook_1_1llm__client_1_1LLMClient_ad6f06658ca922793f879474f2234518e_icgraph.svg @@ -0,0 +1,54 @@ + + + + + + +penify_hook.llm_client.LLMClient.litellm + + + +Node1 + + +penify_hook.llm_client.LLMClient.litellm + + + + + +Node2 + + +penify_hook.llm_client.LLMClient.generate +_commit_summary + + + + + +Node1->Node2 + + + + + +Node3 + + +penify_hook.api_client.APIClient.generate +_commit_summary_with_llm + + + + + +Node2->Node3 + + + + + diff --git a/docs/rtf/classpenify__hook_1_1utils_1_1GitRepoNotFoundError__coll__graph.md5 b/docs/rtf/classpenify__hook_1_1utils_1_1GitRepoNotFoundError__coll__graph.md5 new file mode 100644 index 0000000..2e3ae13 --- /dev/null +++ b/docs/rtf/classpenify__hook_1_1utils_1_1GitRepoNotFoundError__coll__graph.md5 @@ -0,0 +1 @@ +ae33ddd5f5a4f2a38ac959e4302206a1 \ No newline at end of file diff --git a/docs/rtf/classpenify__hook_1_1utils_1_1GitRepoNotFoundError__coll__graph.svg b/docs/rtf/classpenify__hook_1_1utils_1_1GitRepoNotFoundError__coll__graph.svg new file mode 100644 index 0000000..ab658ad --- /dev/null +++ b/docs/rtf/classpenify__hook_1_1utils_1_1GitRepoNotFoundError__coll__graph.svg @@ -0,0 +1,46 @@ + + + + + + +penify_hook.utils.GitRepoNotFoundError + + + +Node1 + + +penify_hook.utils.GitRepo +NotFoundError + + + + + + + + + +Node2 + + +Exception + + + + + + + + + +Node2->Node1 + + + + + diff --git a/docs/rtf/classpenify__hook_1_1utils_1_1GitRepoNotFoundError__inherit__graph.md5 b/docs/rtf/classpenify__hook_1_1utils_1_1GitRepoNotFoundError__inherit__graph.md5 new file mode 100644 index 0000000..2e3ae13 --- /dev/null +++ b/docs/rtf/classpenify__hook_1_1utils_1_1GitRepoNotFoundError__inherit__graph.md5 @@ -0,0 +1 @@ +ae33ddd5f5a4f2a38ac959e4302206a1 \ No newline at end of file diff --git a/docs/rtf/classpenify__hook_1_1utils_1_1GitRepoNotFoundError__inherit__graph.svg b/docs/rtf/classpenify__hook_1_1utils_1_1GitRepoNotFoundError__inherit__graph.svg new file mode 100644 index 0000000..ab658ad --- /dev/null +++ b/docs/rtf/classpenify__hook_1_1utils_1_1GitRepoNotFoundError__inherit__graph.svg @@ -0,0 +1,46 @@ + + + + + + +penify_hook.utils.GitRepoNotFoundError + + + +Node1 + + +penify_hook.utils.GitRepo +NotFoundError + + + + + + + + + +Node2 + + +Exception + + + + + + + + + +Node2->Node1 + + + + + diff --git a/docs/rtf/classtests_1_1test__commit__commands_1_1TestCommitCommands__coll__graph.md5 b/docs/rtf/classtests_1_1test__commit__commands_1_1TestCommitCommands__coll__graph.md5 new file mode 100644 index 0000000..9d383d8 --- /dev/null +++ b/docs/rtf/classtests_1_1test__commit__commands_1_1TestCommitCommands__coll__graph.md5 @@ -0,0 +1 @@ +01c384c51b9b9d20ecd5af3519740055 \ No newline at end of file diff --git a/docs/rtf/classtests_1_1test__commit__commands_1_1TestCommitCommands__coll__graph.svg b/docs/rtf/classtests_1_1test__commit__commands_1_1TestCommitCommands__coll__graph.svg new file mode 100644 index 0000000..71f1b91 --- /dev/null +++ b/docs/rtf/classtests_1_1test__commit__commands_1_1TestCommitCommands__coll__graph.svg @@ -0,0 +1,42 @@ + + + + + + +tests.test_commit_commands.TestCommitCommands + + + +Node1 + + +tests.test_commit_commands. +TestCommitCommands + + + ++ mock_api_client() ++ mock_llm_client() ++ mock_jira_client() ++ mock_commit_doc_gen() ++ mock_git_folder_search() ++ mock_print_functions() ++ test_commit_code_with +_llm_client() ++ test_commit_code_with +_jira_client() ++ test_commit_code_with +_jira_connection_failure() ++ test_commit_code_error +_handling() ++ test_setup_commit_parser() ++ test_handle_commit() + + + + + diff --git a/docs/rtf/classtests_1_1test__commit__commands_1_1TestCommitCommands_a43c2ff3707124aa48e8eb581106b8691_cgraph.md5 b/docs/rtf/classtests_1_1test__commit__commands_1_1TestCommitCommands_a43c2ff3707124aa48e8eb581106b8691_cgraph.md5 new file mode 100644 index 0000000..f317412 --- /dev/null +++ b/docs/rtf/classtests_1_1test__commit__commands_1_1TestCommitCommands_a43c2ff3707124aa48e8eb581106b8691_cgraph.md5 @@ -0,0 +1 @@ +fac6736890d3e6569a3e562221e2e80c \ No newline at end of file diff --git a/docs/rtf/classtests_1_1test__commit__commands_1_1TestCommitCommands_a43c2ff3707124aa48e8eb581106b8691_cgraph.svg b/docs/rtf/classtests_1_1test__commit__commands_1_1TestCommitCommands_a43c2ff3707124aa48e8eb581106b8691_cgraph.svg new file mode 100644 index 0000000..b9d2a82 --- /dev/null +++ b/docs/rtf/classtests_1_1test__commit__commands_1_1TestCommitCommands_a43c2ff3707124aa48e8eb581106b8691_cgraph.svg @@ -0,0 +1,156 @@ + + + + + + +tests.test_commit_commands.TestCommitCommands.test_commit_code_error_handling + + + +Node1 + + +tests.test_commit_commands. +TestCommitCommands.test +_commit_code_error_handling + + + + + +Node2 + + +penify_hook.commands.commit +_commands.commit_code + + + + + +Node1->Node2 + + + + + +Node3 + + +penify_hook.ui_utils.print +_error + + + + + +Node2->Node3 + + + + + +Node5 + + +penify_hook.ui_utils.print_info + + + + + +Node2->Node5 + + + + + +Node7 + + +penify_hook.ui_utils.print +_warning + + + + + +Node2->Node7 + + + + + +Node9 + + +penify_hook.utils.recursive +_search_git_folder + + + + + +Node2->Node9 + + + + + +Node4 + + +penify_hook.ui_utils.format +_error + + + + + +Node3->Node4 + + + + + +Node6 + + +penify_hook.ui_utils.format_info + + + + + +Node5->Node6 + + + + + +Node8 + + +penify_hook.ui_utils.format +_warning + + + + + +Node7->Node8 + + + + + +Node9->Node9 + + + + + diff --git a/docs/rtf/classtests_1_1test__commit__commands_1_1TestCommitCommands_a4d04b125e102190a768f65f1948f15bc_cgraph.md5 b/docs/rtf/classtests_1_1test__commit__commands_1_1TestCommitCommands_a4d04b125e102190a768f65f1948f15bc_cgraph.md5 new file mode 100644 index 0000000..6ec9086 --- /dev/null +++ b/docs/rtf/classtests_1_1test__commit__commands_1_1TestCommitCommands_a4d04b125e102190a768f65f1948f15bc_cgraph.md5 @@ -0,0 +1 @@ +cae6ed50d17895098d586359b58517cc \ No newline at end of file diff --git a/docs/rtf/classtests_1_1test__commit__commands_1_1TestCommitCommands_a4d04b125e102190a768f65f1948f15bc_cgraph.svg b/docs/rtf/classtests_1_1test__commit__commands_1_1TestCommitCommands_a4d04b125e102190a768f65f1948f15bc_cgraph.svg new file mode 100644 index 0000000..7f0ecd2 --- /dev/null +++ b/docs/rtf/classtests_1_1test__commit__commands_1_1TestCommitCommands_a4d04b125e102190a768f65f1948f15bc_cgraph.svg @@ -0,0 +1,40 @@ + + + + + + +tests.test_commit_commands.TestCommitCommands.test_setup_commit_parser + + + +Node1 + + +tests.test_commit_commands. +TestCommitCommands.test +_setup_commit_parser + + + + + +Node2 + + +penify_hook.commands.commit +_commands.setup_commit_parser + + + + + +Node1->Node2 + + + + + diff --git a/docs/rtf/classtests_1_1test__commit__commands_1_1TestCommitCommands_ac13e368262340af98b30fd8ebdac6597_cgraph.md5 b/docs/rtf/classtests_1_1test__commit__commands_1_1TestCommitCommands_ac13e368262340af98b30fd8ebdac6597_cgraph.md5 new file mode 100644 index 0000000..332ac4f --- /dev/null +++ b/docs/rtf/classtests_1_1test__commit__commands_1_1TestCommitCommands_ac13e368262340af98b30fd8ebdac6597_cgraph.md5 @@ -0,0 +1 @@ +ef8182faf1bcd63d3487614530947b10 \ No newline at end of file diff --git a/docs/rtf/classtests_1_1test__commit__commands_1_1TestCommitCommands_ac13e368262340af98b30fd8ebdac6597_cgraph.svg b/docs/rtf/classtests_1_1test__commit__commands_1_1TestCommitCommands_ac13e368262340af98b30fd8ebdac6597_cgraph.svg new file mode 100644 index 0000000..f1760ee --- /dev/null +++ b/docs/rtf/classtests_1_1test__commit__commands_1_1TestCommitCommands_ac13e368262340af98b30fd8ebdac6597_cgraph.svg @@ -0,0 +1,317 @@ + + + + + + +tests.test_commit_commands.TestCommitCommands.test_handle_commit + + + +Node1 + + +tests.test_commit_commands. +TestCommitCommands.test +_handle_commit + + + + + +Node2 + + +penify_hook.commands.commit +_commands.handle_commit + + + + + +Node1->Node2 + + + + + +Node3 + + +penify_hook.commands.commit +_commands.commit_code + + + + + +Node2->Node3 + + + + + +Node6 + + +penify_hook.ui_utils.print_info + + + + + +Node2->Node6 + + + + + +Node11 + + +penify_hook.commands.config +_commands.get_jira_config + + + + + +Node2->Node11 + + + + + +Node14 + + +penify_hook.commands.config +_commands.get_llm_config + + + + + +Node2->Node14 + + + + + +Node15 + + +penify_hook.commands.config +_commands.get_token + + + + + +Node2->Node15 + + + + + +Node4 + + +penify_hook.ui_utils.print +_error + + + + + +Node3->Node4 + + + + + +Node3->Node6 + + + + + +Node8 + + +penify_hook.ui_utils.print +_warning + + + + + +Node3->Node8 + + + + + +Node10 + + +penify_hook.utils.recursive +_search_git_folder + + + + + +Node3->Node10 + + + + + +Node5 + + +penify_hook.ui_utils.format +_error + + + + + +Node4->Node5 + + + + + +Node7 + + +penify_hook.ui_utils.format_info + + + + + +Node6->Node7 + + + + + +Node9 + + +penify_hook.ui_utils.format +_warning + + + + + +Node8->Node9 + + + + + +Node10->Node10 + + + + + +Node12 + + +penify_hook.commands.config +_commands.get_env_var_or +_default + + + + + +Node11->Node12 + + + + + +Node13 + + +penify_hook.commands.config +_commands.load_env_files + + + + + +Node11->Node13 + + + + + +Node13->Node10 + + + + + +Node13->Node13 + + + + + +Node14->Node12 + + + + + +Node14->Node13 + + + + + +Node15->Node12 + + + + + +Node15->Node13 + + + + + +Node16 + + +penify_hook.commands.config +_commands.get_penify_config + + + + + +Node15->Node16 + + + + + +Node16->Node10 + + + + + diff --git a/docs/rtf/classtests_1_1test__commit__commands_1_1TestCommitCommands_acc4b1e4189792a3f7c11d2a745f479c0_cgraph.md5 b/docs/rtf/classtests_1_1test__commit__commands_1_1TestCommitCommands_acc4b1e4189792a3f7c11d2a745f479c0_cgraph.md5 new file mode 100644 index 0000000..9c174cc --- /dev/null +++ b/docs/rtf/classtests_1_1test__commit__commands_1_1TestCommitCommands_acc4b1e4189792a3f7c11d2a745f479c0_cgraph.md5 @@ -0,0 +1 @@ +acd28568eb3edcfc33ca2521297fd075 \ No newline at end of file diff --git a/docs/rtf/classtests_1_1test__commit__commands_1_1TestCommitCommands_acc4b1e4189792a3f7c11d2a745f479c0_cgraph.svg b/docs/rtf/classtests_1_1test__commit__commands_1_1TestCommitCommands_acc4b1e4189792a3f7c11d2a745f479c0_cgraph.svg new file mode 100644 index 0000000..e81ff91 --- /dev/null +++ b/docs/rtf/classtests_1_1test__commit__commands_1_1TestCommitCommands_acc4b1e4189792a3f7c11d2a745f479c0_cgraph.svg @@ -0,0 +1,156 @@ + + + + + + +tests.test_commit_commands.TestCommitCommands.test_commit_code_with_llm_client + + + +Node1 + + +tests.test_commit_commands. +TestCommitCommands.test +_commit_code_with_llm_client + + + + + +Node2 + + +penify_hook.commands.commit +_commands.commit_code + + + + + +Node1->Node2 + + + + + +Node3 + + +penify_hook.ui_utils.print +_error + + + + + +Node2->Node3 + + + + + +Node5 + + +penify_hook.ui_utils.print_info + + + + + +Node2->Node5 + + + + + +Node7 + + +penify_hook.ui_utils.print +_warning + + + + + +Node2->Node7 + + + + + +Node9 + + +penify_hook.utils.recursive +_search_git_folder + + + + + +Node2->Node9 + + + + + +Node4 + + +penify_hook.ui_utils.format +_error + + + + + +Node3->Node4 + + + + + +Node6 + + +penify_hook.ui_utils.format_info + + + + + +Node5->Node6 + + + + + +Node8 + + +penify_hook.ui_utils.format +_warning + + + + + +Node7->Node8 + + + + + +Node9->Node9 + + + + + diff --git a/docs/rtf/classtests_1_1test__commit__commands_1_1TestCommitCommands_acea0d934ee0f2b914b0b893736e8fe4e_cgraph.md5 b/docs/rtf/classtests_1_1test__commit__commands_1_1TestCommitCommands_acea0d934ee0f2b914b0b893736e8fe4e_cgraph.md5 new file mode 100644 index 0000000..080d356 --- /dev/null +++ b/docs/rtf/classtests_1_1test__commit__commands_1_1TestCommitCommands_acea0d934ee0f2b914b0b893736e8fe4e_cgraph.md5 @@ -0,0 +1 @@ +8bc1cc2849f225faaeab1719b6c0a3d6 \ No newline at end of file diff --git a/docs/rtf/classtests_1_1test__commit__commands_1_1TestCommitCommands_acea0d934ee0f2b914b0b893736e8fe4e_cgraph.svg b/docs/rtf/classtests_1_1test__commit__commands_1_1TestCommitCommands_acea0d934ee0f2b914b0b893736e8fe4e_cgraph.svg new file mode 100644 index 0000000..60496ec --- /dev/null +++ b/docs/rtf/classtests_1_1test__commit__commands_1_1TestCommitCommands_acea0d934ee0f2b914b0b893736e8fe4e_cgraph.svg @@ -0,0 +1,157 @@ + + + + + + +tests.test_commit_commands.TestCommitCommands.test_commit_code_with_jira_connection_failure + + + +Node1 + + +tests.test_commit_commands. +TestCommitCommands.test +_commit_code_with_jira_connection +_failure + + + + + +Node2 + + +penify_hook.commands.commit +_commands.commit_code + + + + + +Node1->Node2 + + + + + +Node3 + + +penify_hook.ui_utils.print +_error + + + + + +Node2->Node3 + + + + + +Node5 + + +penify_hook.ui_utils.print_info + + + + + +Node2->Node5 + + + + + +Node7 + + +penify_hook.ui_utils.print +_warning + + + + + +Node2->Node7 + + + + + +Node9 + + +penify_hook.utils.recursive +_search_git_folder + + + + + +Node2->Node9 + + + + + +Node4 + + +penify_hook.ui_utils.format +_error + + + + + +Node3->Node4 + + + + + +Node6 + + +penify_hook.ui_utils.format_info + + + + + +Node5->Node6 + + + + + +Node8 + + +penify_hook.ui_utils.format +_warning + + + + + +Node7->Node8 + + + + + +Node9->Node9 + + + + + diff --git a/docs/rtf/classtests_1_1test__commit__commands_1_1TestCommitCommands_af9c09013055ec39ddde86b487aefcf8b_cgraph.md5 b/docs/rtf/classtests_1_1test__commit__commands_1_1TestCommitCommands_af9c09013055ec39ddde86b487aefcf8b_cgraph.md5 new file mode 100644 index 0000000..a77222b --- /dev/null +++ b/docs/rtf/classtests_1_1test__commit__commands_1_1TestCommitCommands_af9c09013055ec39ddde86b487aefcf8b_cgraph.md5 @@ -0,0 +1 @@ +2b4709da9a40be7a45efe895e73cc31f \ No newline at end of file diff --git a/docs/rtf/classtests_1_1test__commit__commands_1_1TestCommitCommands_af9c09013055ec39ddde86b487aefcf8b_cgraph.svg b/docs/rtf/classtests_1_1test__commit__commands_1_1TestCommitCommands_af9c09013055ec39ddde86b487aefcf8b_cgraph.svg new file mode 100644 index 0000000..6b812fa --- /dev/null +++ b/docs/rtf/classtests_1_1test__commit__commands_1_1TestCommitCommands_af9c09013055ec39ddde86b487aefcf8b_cgraph.svg @@ -0,0 +1,156 @@ + + + + + + +tests.test_commit_commands.TestCommitCommands.test_commit_code_with_jira_client + + + +Node1 + + +tests.test_commit_commands. +TestCommitCommands.test +_commit_code_with_jira_client + + + + + +Node2 + + +penify_hook.commands.commit +_commands.commit_code + + + + + +Node1->Node2 + + + + + +Node3 + + +penify_hook.ui_utils.print +_error + + + + + +Node2->Node3 + + + + + +Node5 + + +penify_hook.ui_utils.print_info + + + + + +Node2->Node5 + + + + + +Node7 + + +penify_hook.ui_utils.print +_warning + + + + + +Node2->Node7 + + + + + +Node9 + + +penify_hook.utils.recursive +_search_git_folder + + + + + +Node2->Node9 + + + + + +Node4 + + +penify_hook.ui_utils.format +_error + + + + + +Node3->Node4 + + + + + +Node6 + + +penify_hook.ui_utils.format_info + + + + + +Node5->Node6 + + + + + +Node8 + + +penify_hook.ui_utils.format +_warning + + + + + +Node7->Node8 + + + + + +Node9->Node9 + + + + + diff --git a/docs/rtf/classtests_1_1test__config__commands_1_1TestConfigCommands__coll__graph.md5 b/docs/rtf/classtests_1_1test__config__commands_1_1TestConfigCommands__coll__graph.md5 new file mode 100644 index 0000000..eb46690 --- /dev/null +++ b/docs/rtf/classtests_1_1test__config__commands_1_1TestConfigCommands__coll__graph.md5 @@ -0,0 +1 @@ +2db6cf58d997b43a776fb21752d4aa29 \ No newline at end of file diff --git a/docs/rtf/classtests_1_1test__config__commands_1_1TestConfigCommands__coll__graph.svg b/docs/rtf/classtests_1_1test__config__commands_1_1TestConfigCommands__coll__graph.svg new file mode 100644 index 0000000..9daa237 --- /dev/null +++ b/docs/rtf/classtests_1_1test__config__commands_1_1TestConfigCommands__coll__graph.svg @@ -0,0 +1,50 @@ + + + + + + +tests.test_config_commands.TestConfigCommands + + + +Node1 + + +tests.test_config_commands. +TestConfigCommands + + + ++ test_get_penify_config +_existing_dir() ++ test_get_penify_config +_new_dir() ++ test_get_llm_config +_exists() ++ test_get_llm_config +_empty() ++ test_get_llm_config +_invalid_json() ++ test_get_jira_config +_exists() ++ test_save_llm_config +_success() ++ test_save_llm_config +_failure() ++ test_save_jira_config +_success() ++ test_get_token_from +_env() ++ test_get_token_from +_config() ++ test_get_token_not +_found() + + + + + diff --git a/docs/rtf/classtests_1_1test__config__commands_1_1TestConfigCommands_a2e8162082bcdd5652bb37bdb14cf453a_cgraph.md5 b/docs/rtf/classtests_1_1test__config__commands_1_1TestConfigCommands_a2e8162082bcdd5652bb37bdb14cf453a_cgraph.md5 new file mode 100644 index 0000000..9e0bad2 --- /dev/null +++ b/docs/rtf/classtests_1_1test__config__commands_1_1TestConfigCommands_a2e8162082bcdd5652bb37bdb14cf453a_cgraph.md5 @@ -0,0 +1 @@ +fe055e22847261fb4e8e965247fa63e4 \ No newline at end of file diff --git a/docs/rtf/classtests_1_1test__config__commands_1_1TestConfigCommands_a2e8162082bcdd5652bb37bdb14cf453a_cgraph.svg b/docs/rtf/classtests_1_1test__config__commands_1_1TestConfigCommands_a2e8162082bcdd5652bb37bdb14cf453a_cgraph.svg new file mode 100644 index 0000000..c43c56a --- /dev/null +++ b/docs/rtf/classtests_1_1test__config__commands_1_1TestConfigCommands_a2e8162082bcdd5652bb37bdb14cf453a_cgraph.svg @@ -0,0 +1,62 @@ + + + + + + +tests.test_config_commands.TestConfigCommands.test_get_penify_config_existing_dir + + + +Node1 + + +tests.test_config_commands. +TestConfigCommands.test +_get_penify_config_existing_dir + + + + + +Node2 + + +penify_hook.commands.config +_commands.get_penify_config + + + + + +Node1->Node2 + + + + + +Node3 + + +penify_hook.utils.recursive +_search_git_folder + + + + + +Node2->Node3 + + + + + +Node3->Node3 + + + + + diff --git a/docs/rtf/classtests_1_1test__config__commands_1_1TestConfigCommands_a3355f7d313bebaa71694387cf2bc5232_cgraph.md5 b/docs/rtf/classtests_1_1test__config__commands_1_1TestConfigCommands_a3355f7d313bebaa71694387cf2bc5232_cgraph.md5 new file mode 100644 index 0000000..9cef76a --- /dev/null +++ b/docs/rtf/classtests_1_1test__config__commands_1_1TestConfigCommands_a3355f7d313bebaa71694387cf2bc5232_cgraph.md5 @@ -0,0 +1 @@ +28bc7f826bf5c37f1e543c6a2217c011 \ No newline at end of file diff --git a/docs/rtf/classtests_1_1test__config__commands_1_1TestConfigCommands_a3355f7d313bebaa71694387cf2bc5232_cgraph.svg b/docs/rtf/classtests_1_1test__config__commands_1_1TestConfigCommands_a3355f7d313bebaa71694387cf2bc5232_cgraph.svg new file mode 100644 index 0000000..c8128c0 --- /dev/null +++ b/docs/rtf/classtests_1_1test__config__commands_1_1TestConfigCommands_a3355f7d313bebaa71694387cf2bc5232_cgraph.svg @@ -0,0 +1,123 @@ + + + + + + +tests.test_config_commands.TestConfigCommands.test_get_token_from_env + + + +Node1 + + +tests.test_config_commands. +TestConfigCommands.test +_get_token_from_env + + + + + +Node2 + + +penify_hook.commands.config +_commands.get_token + + + + + +Node1->Node2 + + + + + +Node3 + + +penify_hook.commands.config +_commands.get_env_var_or +_default + + + + + +Node2->Node3 + + + + + +Node4 + + +penify_hook.commands.config +_commands.get_penify_config + + + + + +Node2->Node4 + + + + + +Node6 + + +penify_hook.commands.config +_commands.load_env_files + + + + + +Node2->Node6 + + + + + +Node5 + + +penify_hook.utils.recursive +_search_git_folder + + + + + +Node4->Node5 + + + + + +Node5->Node5 + + + + + +Node6->Node5 + + + + + +Node6->Node6 + + + + + diff --git a/docs/rtf/classtests_1_1test__config__commands_1_1TestConfigCommands_a33d4760eee3b67e1cde3aed755ebb948_cgraph.md5 b/docs/rtf/classtests_1_1test__config__commands_1_1TestConfigCommands_a33d4760eee3b67e1cde3aed755ebb948_cgraph.md5 new file mode 100644 index 0000000..179211c --- /dev/null +++ b/docs/rtf/classtests_1_1test__config__commands_1_1TestConfigCommands_a33d4760eee3b67e1cde3aed755ebb948_cgraph.md5 @@ -0,0 +1 @@ +66249d926cb6fd81bdf9ba46dc56d466 \ No newline at end of file diff --git a/docs/rtf/classtests_1_1test__config__commands_1_1TestConfigCommands_a33d4760eee3b67e1cde3aed755ebb948_cgraph.svg b/docs/rtf/classtests_1_1test__config__commands_1_1TestConfigCommands_a33d4760eee3b67e1cde3aed755ebb948_cgraph.svg new file mode 100644 index 0000000..3eded28 --- /dev/null +++ b/docs/rtf/classtests_1_1test__config__commands_1_1TestConfigCommands_a33d4760eee3b67e1cde3aed755ebb948_cgraph.svg @@ -0,0 +1,62 @@ + + + + + + +tests.test_config_commands.TestConfigCommands.test_get_penify_config_new_dir + + + +Node1 + + +tests.test_config_commands. +TestConfigCommands.test +_get_penify_config_new_dir + + + + + +Node2 + + +penify_hook.commands.config +_commands.get_penify_config + + + + + +Node1->Node2 + + + + + +Node3 + + +penify_hook.utils.recursive +_search_git_folder + + + + + +Node2->Node3 + + + + + +Node3->Node3 + + + + + diff --git a/docs/rtf/classtests_1_1test__config__commands_1_1TestConfigCommands_a400ca5d9fcdc159714e8df54920f9436_cgraph.md5 b/docs/rtf/classtests_1_1test__config__commands_1_1TestConfigCommands_a400ca5d9fcdc159714e8df54920f9436_cgraph.md5 new file mode 100644 index 0000000..494b2db --- /dev/null +++ b/docs/rtf/classtests_1_1test__config__commands_1_1TestConfigCommands_a400ca5d9fcdc159714e8df54920f9436_cgraph.md5 @@ -0,0 +1 @@ +fe3072609a9a0bf3d14e3143add0e6da \ No newline at end of file diff --git a/docs/rtf/classtests_1_1test__config__commands_1_1TestConfigCommands_a400ca5d9fcdc159714e8df54920f9436_cgraph.svg b/docs/rtf/classtests_1_1test__config__commands_1_1TestConfigCommands_a400ca5d9fcdc159714e8df54920f9436_cgraph.svg new file mode 100644 index 0000000..64b8b29 --- /dev/null +++ b/docs/rtf/classtests_1_1test__config__commands_1_1TestConfigCommands_a400ca5d9fcdc159714e8df54920f9436_cgraph.svg @@ -0,0 +1,123 @@ + + + + + + +tests.test_config_commands.TestConfigCommands.test_get_token_not_found + + + +Node1 + + +tests.test_config_commands. +TestConfigCommands.test +_get_token_not_found + + + + + +Node2 + + +penify_hook.commands.config +_commands.get_token + + + + + +Node1->Node2 + + + + + +Node3 + + +penify_hook.commands.config +_commands.get_env_var_or +_default + + + + + +Node2->Node3 + + + + + +Node4 + + +penify_hook.commands.config +_commands.get_penify_config + + + + + +Node2->Node4 + + + + + +Node6 + + +penify_hook.commands.config +_commands.load_env_files + + + + + +Node2->Node6 + + + + + +Node5 + + +penify_hook.utils.recursive +_search_git_folder + + + + + +Node4->Node5 + + + + + +Node5->Node5 + + + + + +Node6->Node5 + + + + + +Node6->Node6 + + + + + diff --git a/docs/rtf/classtests_1_1test__config__commands_1_1TestConfigCommands_a473984d31452b56acd6ce4011a1248bd_cgraph.md5 b/docs/rtf/classtests_1_1test__config__commands_1_1TestConfigCommands_a473984d31452b56acd6ce4011a1248bd_cgraph.md5 new file mode 100644 index 0000000..bdddb02 --- /dev/null +++ b/docs/rtf/classtests_1_1test__config__commands_1_1TestConfigCommands_a473984d31452b56acd6ce4011a1248bd_cgraph.md5 @@ -0,0 +1 @@ +6604e171883373f917ba1e50c7dcf2a8 \ No newline at end of file diff --git a/docs/rtf/classtests_1_1test__config__commands_1_1TestConfigCommands_a473984d31452b56acd6ce4011a1248bd_cgraph.svg b/docs/rtf/classtests_1_1test__config__commands_1_1TestConfigCommands_a473984d31452b56acd6ce4011a1248bd_cgraph.svg new file mode 100644 index 0000000..d06ccaf --- /dev/null +++ b/docs/rtf/classtests_1_1test__config__commands_1_1TestConfigCommands_a473984d31452b56acd6ce4011a1248bd_cgraph.svg @@ -0,0 +1,101 @@ + + + + + + +tests.test_config_commands.TestConfigCommands.test_get_llm_config_invalid_json + + + +Node1 + + +tests.test_config_commands. +TestConfigCommands.test +_get_llm_config_invalid_json + + + + + +Node2 + + +penify_hook.commands.config +_commands.get_llm_config + + + + + +Node1->Node2 + + + + + +Node3 + + +penify_hook.commands.config +_commands.get_env_var_or +_default + + + + + +Node2->Node3 + + + + + +Node4 + + +penify_hook.commands.config +_commands.load_env_files + + + + + +Node2->Node4 + + + + + +Node4->Node4 + + + + + +Node5 + + +penify_hook.utils.recursive +_search_git_folder + + + + + +Node4->Node5 + + + + + +Node5->Node5 + + + + + diff --git a/docs/rtf/classtests_1_1test__config__commands_1_1TestConfigCommands_a6c0207be563c3de59a6d16277805114c_cgraph.md5 b/docs/rtf/classtests_1_1test__config__commands_1_1TestConfigCommands_a6c0207be563c3de59a6d16277805114c_cgraph.md5 new file mode 100644 index 0000000..49db9b2 --- /dev/null +++ b/docs/rtf/classtests_1_1test__config__commands_1_1TestConfigCommands_a6c0207be563c3de59a6d16277805114c_cgraph.md5 @@ -0,0 +1 @@ +18a45266c6274df8d06c6771aea4d3ce \ No newline at end of file diff --git a/docs/rtf/classtests_1_1test__config__commands_1_1TestConfigCommands_a6c0207be563c3de59a6d16277805114c_cgraph.svg b/docs/rtf/classtests_1_1test__config__commands_1_1TestConfigCommands_a6c0207be563c3de59a6d16277805114c_cgraph.svg new file mode 100644 index 0000000..ac12bca --- /dev/null +++ b/docs/rtf/classtests_1_1test__config__commands_1_1TestConfigCommands_a6c0207be563c3de59a6d16277805114c_cgraph.svg @@ -0,0 +1,123 @@ + + + + + + +tests.test_config_commands.TestConfigCommands.test_get_token_from_config + + + +Node1 + + +tests.test_config_commands. +TestConfigCommands.test +_get_token_from_config + + + + + +Node2 + + +penify_hook.commands.config +_commands.get_token + + + + + +Node1->Node2 + + + + + +Node3 + + +penify_hook.commands.config +_commands.get_env_var_or +_default + + + + + +Node2->Node3 + + + + + +Node4 + + +penify_hook.commands.config +_commands.get_penify_config + + + + + +Node2->Node4 + + + + + +Node6 + + +penify_hook.commands.config +_commands.load_env_files + + + + + +Node2->Node6 + + + + + +Node5 + + +penify_hook.utils.recursive +_search_git_folder + + + + + +Node4->Node5 + + + + + +Node5->Node5 + + + + + +Node6->Node5 + + + + + +Node6->Node6 + + + + + diff --git a/docs/rtf/classtests_1_1test__config__commands_1_1TestConfigCommands_a73a264dfb21e16003e095b79f6eab2ac_cgraph.md5 b/docs/rtf/classtests_1_1test__config__commands_1_1TestConfigCommands_a73a264dfb21e16003e095b79f6eab2ac_cgraph.md5 new file mode 100644 index 0000000..d5a551d --- /dev/null +++ b/docs/rtf/classtests_1_1test__config__commands_1_1TestConfigCommands_a73a264dfb21e16003e095b79f6eab2ac_cgraph.md5 @@ -0,0 +1 @@ +2efae0628f3580e167ff4e2e9744ff76 \ No newline at end of file diff --git a/docs/rtf/classtests_1_1test__config__commands_1_1TestConfigCommands_a73a264dfb21e16003e095b79f6eab2ac_cgraph.svg b/docs/rtf/classtests_1_1test__config__commands_1_1TestConfigCommands_a73a264dfb21e16003e095b79f6eab2ac_cgraph.svg new file mode 100644 index 0000000..c7427eb --- /dev/null +++ b/docs/rtf/classtests_1_1test__config__commands_1_1TestConfigCommands_a73a264dfb21e16003e095b79f6eab2ac_cgraph.svg @@ -0,0 +1,62 @@ + + + + + + +tests.test_config_commands.TestConfigCommands.test_save_llm_config_failure + + + +Node1 + + +tests.test_config_commands. +TestConfigCommands.test +_save_llm_config_failure + + + + + +Node2 + + +penify_hook.commands.config +_commands.save_llm_config + + + + + +Node1->Node2 + + + + + +Node3 + + +penify_hook.utils.recursive +_search_git_folder + + + + + +Node2->Node3 + + + + + +Node3->Node3 + + + + + diff --git a/docs/rtf/classtests_1_1test__config__commands_1_1TestConfigCommands_abd12f028b89aa9cd1152c0b9ece5d3cd_cgraph.md5 b/docs/rtf/classtests_1_1test__config__commands_1_1TestConfigCommands_abd12f028b89aa9cd1152c0b9ece5d3cd_cgraph.md5 new file mode 100644 index 0000000..b6d0832 --- /dev/null +++ b/docs/rtf/classtests_1_1test__config__commands_1_1TestConfigCommands_abd12f028b89aa9cd1152c0b9ece5d3cd_cgraph.md5 @@ -0,0 +1 @@ +ccb36b28b36810b7debb14198aa8c840 \ No newline at end of file diff --git a/docs/rtf/classtests_1_1test__config__commands_1_1TestConfigCommands_abd12f028b89aa9cd1152c0b9ece5d3cd_cgraph.svg b/docs/rtf/classtests_1_1test__config__commands_1_1TestConfigCommands_abd12f028b89aa9cd1152c0b9ece5d3cd_cgraph.svg new file mode 100644 index 0000000..15e3aaa --- /dev/null +++ b/docs/rtf/classtests_1_1test__config__commands_1_1TestConfigCommands_abd12f028b89aa9cd1152c0b9ece5d3cd_cgraph.svg @@ -0,0 +1,101 @@ + + + + + + +tests.test_config_commands.TestConfigCommands.test_get_llm_config_empty + + + +Node1 + + +tests.test_config_commands. +TestConfigCommands.test +_get_llm_config_empty + + + + + +Node2 + + +penify_hook.commands.config +_commands.get_llm_config + + + + + +Node1->Node2 + + + + + +Node3 + + +penify_hook.commands.config +_commands.get_env_var_or +_default + + + + + +Node2->Node3 + + + + + +Node4 + + +penify_hook.commands.config +_commands.load_env_files + + + + + +Node2->Node4 + + + + + +Node4->Node4 + + + + + +Node5 + + +penify_hook.utils.recursive +_search_git_folder + + + + + +Node4->Node5 + + + + + +Node5->Node5 + + + + + diff --git a/docs/rtf/classtests_1_1test__config__commands_1_1TestConfigCommands_acd8df8219441b9e9871b903a681400d9_cgraph.md5 b/docs/rtf/classtests_1_1test__config__commands_1_1TestConfigCommands_acd8df8219441b9e9871b903a681400d9_cgraph.md5 new file mode 100644 index 0000000..616400e --- /dev/null +++ b/docs/rtf/classtests_1_1test__config__commands_1_1TestConfigCommands_acd8df8219441b9e9871b903a681400d9_cgraph.md5 @@ -0,0 +1 @@ +2dda560e911927ca62424d428f826e98 \ No newline at end of file diff --git a/docs/rtf/classtests_1_1test__config__commands_1_1TestConfigCommands_acd8df8219441b9e9871b903a681400d9_cgraph.svg b/docs/rtf/classtests_1_1test__config__commands_1_1TestConfigCommands_acd8df8219441b9e9871b903a681400d9_cgraph.svg new file mode 100644 index 0000000..094e23c --- /dev/null +++ b/docs/rtf/classtests_1_1test__config__commands_1_1TestConfigCommands_acd8df8219441b9e9871b903a681400d9_cgraph.svg @@ -0,0 +1,62 @@ + + + + + + +tests.test_config_commands.TestConfigCommands.test_save_llm_config_success + + + +Node1 + + +tests.test_config_commands. +TestConfigCommands.test +_save_llm_config_success + + + + + +Node2 + + +penify_hook.commands.config +_commands.save_llm_config + + + + + +Node1->Node2 + + + + + +Node3 + + +penify_hook.utils.recursive +_search_git_folder + + + + + +Node2->Node3 + + + + + +Node3->Node3 + + + + + diff --git a/docs/rtf/classtests_1_1test__config__commands_1_1TestConfigCommands_adf9f2233a3f4cc5725b9d4f05758b167_cgraph.md5 b/docs/rtf/classtests_1_1test__config__commands_1_1TestConfigCommands_adf9f2233a3f4cc5725b9d4f05758b167_cgraph.md5 new file mode 100644 index 0000000..5292fed --- /dev/null +++ b/docs/rtf/classtests_1_1test__config__commands_1_1TestConfigCommands_adf9f2233a3f4cc5725b9d4f05758b167_cgraph.md5 @@ -0,0 +1 @@ +8a521fb6ddaca64c6678d226bec595a0 \ No newline at end of file diff --git a/docs/rtf/classtests_1_1test__config__commands_1_1TestConfigCommands_adf9f2233a3f4cc5725b9d4f05758b167_cgraph.svg b/docs/rtf/classtests_1_1test__config__commands_1_1TestConfigCommands_adf9f2233a3f4cc5725b9d4f05758b167_cgraph.svg new file mode 100644 index 0000000..6141687 --- /dev/null +++ b/docs/rtf/classtests_1_1test__config__commands_1_1TestConfigCommands_adf9f2233a3f4cc5725b9d4f05758b167_cgraph.svg @@ -0,0 +1,101 @@ + + + + + + +tests.test_config_commands.TestConfigCommands.test_get_llm_config_exists + + + +Node1 + + +tests.test_config_commands. +TestConfigCommands.test +_get_llm_config_exists + + + + + +Node2 + + +penify_hook.commands.config +_commands.get_llm_config + + + + + +Node1->Node2 + + + + + +Node3 + + +penify_hook.commands.config +_commands.get_env_var_or +_default + + + + + +Node2->Node3 + + + + + +Node4 + + +penify_hook.commands.config +_commands.load_env_files + + + + + +Node2->Node4 + + + + + +Node4->Node4 + + + + + +Node5 + + +penify_hook.utils.recursive +_search_git_folder + + + + + +Node4->Node5 + + + + + +Node5->Node5 + + + + + diff --git a/docs/rtf/classtests_1_1test__config__commands_1_1TestConfigCommands_aee37b97432821d19758c6325d4c74bcf_cgraph.md5 b/docs/rtf/classtests_1_1test__config__commands_1_1TestConfigCommands_aee37b97432821d19758c6325d4c74bcf_cgraph.md5 new file mode 100644 index 0000000..904ab8d --- /dev/null +++ b/docs/rtf/classtests_1_1test__config__commands_1_1TestConfigCommands_aee37b97432821d19758c6325d4c74bcf_cgraph.md5 @@ -0,0 +1 @@ +6fbf377ddd24e2b0afa956a95f55e6c5 \ No newline at end of file diff --git a/docs/rtf/classtests_1_1test__config__commands_1_1TestConfigCommands_aee37b97432821d19758c6325d4c74bcf_cgraph.svg b/docs/rtf/classtests_1_1test__config__commands_1_1TestConfigCommands_aee37b97432821d19758c6325d4c74bcf_cgraph.svg new file mode 100644 index 0000000..57a064c --- /dev/null +++ b/docs/rtf/classtests_1_1test__config__commands_1_1TestConfigCommands_aee37b97432821d19758c6325d4c74bcf_cgraph.svg @@ -0,0 +1,101 @@ + + + + + + +tests.test_config_commands.TestConfigCommands.test_get_jira_config_exists + + + +Node1 + + +tests.test_config_commands. +TestConfigCommands.test +_get_jira_config_exists + + + + + +Node2 + + +penify_hook.commands.config +_commands.get_jira_config + + + + + +Node1->Node2 + + + + + +Node3 + + +penify_hook.commands.config +_commands.get_env_var_or +_default + + + + + +Node2->Node3 + + + + + +Node4 + + +penify_hook.commands.config +_commands.load_env_files + + + + + +Node2->Node4 + + + + + +Node4->Node4 + + + + + +Node5 + + +penify_hook.utils.recursive +_search_git_folder + + + + + +Node4->Node5 + + + + + +Node5->Node5 + + + + + diff --git a/docs/rtf/classtests_1_1test__config__commands_1_1TestConfigCommands_af8d62310da2d768e21770f8f01ff5375_cgraph.md5 b/docs/rtf/classtests_1_1test__config__commands_1_1TestConfigCommands_af8d62310da2d768e21770f8f01ff5375_cgraph.md5 new file mode 100644 index 0000000..68d6c1c --- /dev/null +++ b/docs/rtf/classtests_1_1test__config__commands_1_1TestConfigCommands_af8d62310da2d768e21770f8f01ff5375_cgraph.md5 @@ -0,0 +1 @@ +2e054bb79c0b6f45c4788678aac6e514 \ No newline at end of file diff --git a/docs/rtf/classtests_1_1test__config__commands_1_1TestConfigCommands_af8d62310da2d768e21770f8f01ff5375_cgraph.svg b/docs/rtf/classtests_1_1test__config__commands_1_1TestConfigCommands_af8d62310da2d768e21770f8f01ff5375_cgraph.svg new file mode 100644 index 0000000..8bd749b --- /dev/null +++ b/docs/rtf/classtests_1_1test__config__commands_1_1TestConfigCommands_af8d62310da2d768e21770f8f01ff5375_cgraph.svg @@ -0,0 +1,62 @@ + + + + + + +tests.test_config_commands.TestConfigCommands.test_save_jira_config_success + + + +Node1 + + +tests.test_config_commands. +TestConfigCommands.test +_save_jira_config_success + + + + + +Node2 + + +penify_hook.commands.config +_commands.save_jira_config + + + + + +Node1->Node2 + + + + + +Node3 + + +penify_hook.utils.recursive +_search_git_folder + + + + + +Node2->Node3 + + + + + +Node3->Node3 + + + + + diff --git a/docs/rtf/classtests_1_1test__web__config_1_1TestWebConfig__coll__graph.md5 b/docs/rtf/classtests_1_1test__web__config_1_1TestWebConfig__coll__graph.md5 new file mode 100644 index 0000000..f0a528b --- /dev/null +++ b/docs/rtf/classtests_1_1test__web__config_1_1TestWebConfig__coll__graph.md5 @@ -0,0 +1 @@ +ab8cbd57a4ebb302c58c19a4efbc1c6e \ No newline at end of file diff --git a/docs/rtf/classtests_1_1test__web__config_1_1TestWebConfig__coll__graph.svg b/docs/rtf/classtests_1_1test__web__config_1_1TestWebConfig__coll__graph.svg new file mode 100644 index 0000000..acbac22 --- /dev/null +++ b/docs/rtf/classtests_1_1test__web__config_1_1TestWebConfig__coll__graph.svg @@ -0,0 +1,30 @@ + + + + + + +tests.test_web_config.TestWebConfig + + + +Node1 + + +tests.test_web_config.Test +WebConfig + + + ++ test_config_llm_web +_server_setup() ++ test_config_jira_web +_server_setup() + + + + + diff --git a/docs/rtf/classtests_1_1test__web__config_1_1TestWebConfig_a06e600222e426b003850509cb1d3190a_cgraph.md5 b/docs/rtf/classtests_1_1test__web__config_1_1TestWebConfig_a06e600222e426b003850509cb1d3190a_cgraph.md5 new file mode 100644 index 0000000..064b512 --- /dev/null +++ b/docs/rtf/classtests_1_1test__web__config_1_1TestWebConfig_a06e600222e426b003850509cb1d3190a_cgraph.md5 @@ -0,0 +1 @@ +40be6a2b68a00531af40fd3546a6f158 \ No newline at end of file diff --git a/docs/rtf/classtests_1_1test__web__config_1_1TestWebConfig_a06e600222e426b003850509cb1d3190a_cgraph.svg b/docs/rtf/classtests_1_1test__web__config_1_1TestWebConfig_a06e600222e426b003850509cb1d3190a_cgraph.svg new file mode 100644 index 0000000..bf31fdb --- /dev/null +++ b/docs/rtf/classtests_1_1test__web__config_1_1TestWebConfig_a06e600222e426b003850509cb1d3190a_cgraph.svg @@ -0,0 +1,139 @@ + + + + + + +tests.test_web_config.TestWebConfig.test_config_jira_web_server_setup + + + +Node1 + + +tests.test_web_config.Test +WebConfig.test_config_jira +_web_server_setup + + + + + +Node2 + + +penify_hook.commands.config +_commands.config_jira_web + + + + + +Node1->Node2 + + + + + +Node3 + + +penify_hook.commands.config +_commands.get_jira_config + + + + + +Node2->Node3 + + + + + +Node7 + + +penify_hook.commands.config +_commands.save_jira_config + + + + + +Node2->Node7 + + + + + +Node4 + + +penify_hook.commands.config +_commands.get_env_var_or +_default + + + + + +Node3->Node4 + + + + + +Node5 + + +penify_hook.commands.config +_commands.load_env_files + + + + + +Node3->Node5 + + + + + +Node5->Node5 + + + + + +Node6 + + +penify_hook.utils.recursive +_search_git_folder + + + + + +Node5->Node6 + + + + + +Node6->Node6 + + + + + +Node7->Node6 + + + + + diff --git a/docs/rtf/classtests_1_1test__web__config_1_1TestWebConfig_afc6440352201d207ea8b4d26f8ccfa35_cgraph.md5 b/docs/rtf/classtests_1_1test__web__config_1_1TestWebConfig_afc6440352201d207ea8b4d26f8ccfa35_cgraph.md5 new file mode 100644 index 0000000..2632d9a --- /dev/null +++ b/docs/rtf/classtests_1_1test__web__config_1_1TestWebConfig_afc6440352201d207ea8b4d26f8ccfa35_cgraph.md5 @@ -0,0 +1 @@ +5ca25c9e4be6eb96370b0328e2a5e679 \ No newline at end of file diff --git a/docs/rtf/classtests_1_1test__web__config_1_1TestWebConfig_afc6440352201d207ea8b4d26f8ccfa35_cgraph.svg b/docs/rtf/classtests_1_1test__web__config_1_1TestWebConfig_afc6440352201d207ea8b4d26f8ccfa35_cgraph.svg new file mode 100644 index 0000000..1f3a16f --- /dev/null +++ b/docs/rtf/classtests_1_1test__web__config_1_1TestWebConfig_afc6440352201d207ea8b4d26f8ccfa35_cgraph.svg @@ -0,0 +1,40 @@ + + + + + + +tests.test_web_config.TestWebConfig.test_config_llm_web_server_setup + + + +Node1 + + +tests.test_web_config.Test +WebConfig.test_config_llm +_web_server_setup + + + + + +Node2 + + +penify_hook.commands.config +_commands.config_llm_web + + + + + +Node1->Node2 + + + + + diff --git a/docs/rtf/dir_063e2d5fe58a131099a7fe4200cca78c.rtf b/docs/rtf/dir_063e2d5fe58a131099a7fe4200cca78c.rtf new file mode 100644 index 0000000..d54cf96 --- /dev/null +++ b/docs/rtf/dir_063e2d5fe58a131099a7fe4200cca78c.rtf @@ -0,0 +1,137 @@ +{\rtf1\ansi\ansicpg1252\uc1 \deff0\deflang1033\deflangfe1033 +{\fonttbl {\f0\froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;} +{\f1\fswiss\fcharset0\fprq2{\*\panose 020b0604020202020204}Arial;} +{\f2\fmodern\fcharset0\fprq1{\*\panose 02070309020205020404}Courier New;} +{\f3\froman\fcharset2\fprq2{\*\panose 05050102010706020507}Symbol;} +} +{\colortbl;\red0\green0\blue0;\red0\green0\blue255;\red0\green255\blue255;\red0\green255\blue0;\red255\green0\blue255;\red255\green0\blue0;\red255\green255\blue0;\red255\green255\blue255;\red0\green0\blue128;\red0\green128\blue128;\red0\green128\blue0;\red128\green0\blue128;\red128\green0\blue0;\red128\green128\blue0;\red128\green128\blue128;\red192\green192\blue192;\red0\green128\blue0;\red96\green64\blue32;\rede0\green128\blue0;\red128\green0\blue0;\red128\green96\blue32;\red0\green32\blue128;\red0\green128\blue128;\red255\green0\blue255;\red0\green0\blue0;\red112\green0\blue112;\red255\green0\blue0;} +{\stylesheet +{\widctlpar\adjustright \fs20\cgrid \snext0 Normal;} +{\paperw11900\paperh16840\margl1800\margr1800\margt1440\margb1440\gutter0\ltrsect} +{\s1\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs36\kerning36\cgrid \sbasedon0 \snext0 heading 1;} +{\s2\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs28\kerning28\cgrid \sbasedon0 \snext0 heading 2;} +{\s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid \sbasedon0 \snext0 heading 3;} +{\s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid \sbasedon0 \snext0 heading 4;}{\*\cs10 \additive Default Paragraph Font;} +{\s5\sb90\sa30\keepn\widctlpar\adjustright \b\f1\fs20\cgrid \sbasedon0 \snext0 heading 5;}{\*\cs10 \additive Default Paragraph Font;} +{\s15\qc\sb240\sa60\widctlpar\outlinelevel0\adjustright \b\f1\fs32\kerning28\cgrid \sbasedon0 \snext15 Title;} +{\s16\qc\sa60\widctlpar\outlinelevel1\adjustright \f1\cgrid \sbasedon0 \snext16 Subtitle;} +{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid \sbasedon0 \snext17 BodyText;} +{\s18\widctlpar\fs22\cgrid \sbasedon0 \snext18 DenseText;} +{\s28\widctlpar\tqc\tx4320\tqr\tx8640\adjustright \fs20\cgrid \sbasedon0 \snext28 header;} +{\s29\widctlpar\tqc\tx4320\tqr\tx8640\qr\adjustright \fs20\cgrid \sbasedon0 \snext29 footer;} +{\s30\li360\sa60\sb120\keepn\widctlpar\adjustright \b\f1\fs20\cgrid \sbasedon0 \snext30 GroupHeader;} +{\s40\li0\widctlpar\adjustright \shading1000\cbpat8 \f2\fs16\cgrid \sbasedon0 \snext41 Code Example 0;} +{\s41\li360\widctlpar\adjustright \shading1000\cbpat8 \f2\fs16\cgrid \sbasedon0 \snext42 Code Example 1;} +{\s42\li720\widctlpar\adjustright \shading1000\cbpat8 \f2\fs16\cgrid \sbasedon0 \snext43 Code Example 2;} +{\s43\li1080\widctlpar\adjustright \shading1000\cbpat8 \f2\fs16\cgrid \sbasedon0 \snext44 Code Example 3;} +{\s44\li1440\widctlpar\adjustright \shading1000\cbpat8 \f2\fs16\cgrid \sbasedon0 \snext45 Code Example 4;} +{\s45\li1800\widctlpar\adjustright \shading1000\cbpat8 \f2\fs16\cgrid \sbasedon0 \snext46 Code Example 5;} +{\s46\li2160\widctlpar\adjustright \shading1000\cbpat8 \f2\fs16\cgrid \sbasedon0 \snext47 Code Example 6;} +{\s47\li2520\widctlpar\adjustright \shading1000\cbpat8 \f2\fs16\cgrid \sbasedon0 \snext48 Code Example 7;} +{\s48\li2880\widctlpar\adjustright \shading1000\cbpat8 \f2\fs16\cgrid \sbasedon0 \snext49 Code Example 8;} +{\s49\li3240\widctlpar\adjustright \shading1000\cbpat8 \f2\fs16\cgrid \sbasedon0 \snext50 Code Example 9;} +{\s50\li3600\widctlpar\adjustright \shading1000\cbpat8 \f2\fs16\cgrid \sbasedon0 \snext51 Code Example 10;} +{\s51\li3960\widctlpar\adjustright \shading1000\cbpat8 \f2\fs16\cgrid \sbasedon0 \snext52 Code Example 11;} +{\s52\li4320\widctlpar\adjustright \shading1000\cbpat8 \f2\fs16\cgrid \sbasedon0 \snext53 Code Example 12;} +{\s53\li4680\widctlpar\adjustright \shading1000\cbpat8 \f2\fs16\cgrid \sbasedon0 \snext53 Code Example 13;} +{\s60\li0\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid \sbasedon0 \snext61 List Continue 0;} +{\s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid \sbasedon0 \snext62 List Continue 1;} +{\s62\li720\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid \sbasedon0 \snext63 List Continue 2;} +{\s63\li1080\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid \sbasedon0 \snext64 List Continue 3;} +{\s64\li1440\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid \sbasedon0 \snext65 List Continue 4;} +{\s65\li1800\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid \sbasedon0 \snext66 List Continue 5;} +{\s66\li2160\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid \sbasedon0 \snext67 List Continue 6;} +{\s67\li2520\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid \sbasedon0 \snext68 List Continue 7;} +{\s68\li2880\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid \sbasedon0 \snext69 List Continue 8;} +{\s69\li3240\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid \sbasedon0 \snext70 List Continue 9;} +{\s70\li3600\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid \sbasedon0 \snext71 List Continue 10;} +{\s71\li3960\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid \sbasedon0 \snext72 List Continue 11;} +{\s72\li4320\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid \sbasedon0 \snext73 List Continue 12;} +{\s73\li4680\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid \sbasedon0 \snext73 List Continue 13;} +{\s80\li0\widctlpar\ql\adjustright \fs20\cgrid \sbasedon0 \snext81 DescContinue 0;} +{\s81\li360\widctlpar\ql\adjustright \fs20\cgrid \sbasedon0 \snext82 DescContinue 1;} +{\s82\li720\widctlpar\ql\adjustright \fs20\cgrid \sbasedon0 \snext83 DescContinue 2;} +{\s83\li1080\widctlpar\ql\adjustright \fs20\cgrid \sbasedon0 \snext84 DescContinue 3;} +{\s84\li1440\widctlpar\ql\adjustright \fs20\cgrid \sbasedon0 \snext85 DescContinue 4;} +{\s85\li1800\widctlpar\ql\adjustright \fs20\cgrid \sbasedon0 \snext86 DescContinue 5;} +{\s86\li2160\widctlpar\ql\adjustright \fs20\cgrid \sbasedon0 \snext87 DescContinue 6;} +{\s87\li2520\widctlpar\ql\adjustright \fs20\cgrid \sbasedon0 \snext88 DescContinue 7;} +{\s88\li2880\widctlpar\ql\adjustright \fs20\cgrid \sbasedon0 \snext89 DescContinue 8;} +{\s89\li3240\widctlpar\ql\adjustright \fs20\cgrid \sbasedon0 \snext90 DescContinue 9;} +{\s90\li3600\widctlpar\ql\adjustright \fs20\cgrid \sbasedon0 \snext91 DescContinue 10;} +{\s91\li3960\widctlpar\ql\adjustright \fs20\cgrid \sbasedon0 \snext92 DescContinue 11;} +{\s92\li4320\widctlpar\ql\adjustright \fs20\cgrid \sbasedon0 \snext93 DescContinue 12;} +{\s93\li4680\widctlpar\ql\adjustright \fs20\cgrid \sbasedon0 \snext93 DescContinue 13;} +{\s100\li0\sa30\sb30\widctlpar\tqr\tldot\tx8640\adjustright \fs20\cgrid \sbasedon0 \snext101 LatexTOC 0;} +{\s101\li360\sa27\sb27\widctlpar\tqr\tldot\tx8640\adjustright \fs20\cgrid \sbasedon0 \snext102 LatexTOC 1;} +{\s102\li720\sa24\sb24\widctlpar\tqr\tldot\tx8640\adjustright \fs20\cgrid \sbasedon0 \snext103 LatexTOC 2;} +{\s103\li1080\sa21\sb21\widctlpar\tqr\tldot\tx8640\adjustright \fs20\cgrid \sbasedon0 \snext104 LatexTOC 3;} +{\s104\li1440\sa18\sb18\widctlpar\tqr\tldot\tx8640\adjustright \fs20\cgrid \sbasedon0 \snext105 LatexTOC 4;} +{\s105\li1800\sa15\sb15\widctlpar\tqr\tldot\tx8640\adjustright \fs20\cgrid \sbasedon0 \snext106 LatexTOC 5;} +{\s106\li2160\sa12\sb12\widctlpar\tqr\tldot\tx8640\adjustright \fs20\cgrid \sbasedon0 \snext107 LatexTOC 6;} +{\s107\li2520\sa9\sb9\widctlpar\tqr\tldot\tx8640\adjustright \fs20\cgrid \sbasedon0 \snext108 LatexTOC 7;} +{\s108\li2880\sa6\sb6\widctlpar\tqr\tldot\tx8640\adjustright \fs20\cgrid \sbasedon0 \snext109 LatexTOC 8;} +{\s109\li3240\sa3\sb3\widctlpar\tqr\tldot\tx8640\adjustright \fs20\cgrid \sbasedon0 \snext110 LatexTOC 9;} +{\s110\li3600\sa3\sb3\widctlpar\tqr\tldot\tx8640\adjustright \fs20\cgrid \sbasedon0 \snext111 LatexTOC 10;} +{\s111\li3960\sa3\sb3\widctlpar\tqr\tldot\tx8640\adjustright \fs20\cgrid \sbasedon0 \snext112 LatexTOC 11;} +{\s112\li4320\sa3\sb3\widctlpar\tqr\tldot\tx8640\adjustright \fs20\cgrid \sbasedon0 \snext113 LatexTOC 12;} +{\s113\li4680\sa3\sb3\widctlpar\tqr\tldot\tx8640\adjustright \fs20\cgrid \sbasedon0 \snext113 LatexTOC 13;} +{\s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid \sbasedon0 \snext121 \sautoupd List Bullet 0;} +{\s121\fi-360\li720\widctlpar\jclisttab\tx720{\*\pn \pnlvlbody\ilvl0\ls2\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid \sbasedon0 \snext122 \sautoupd List Bullet 1;} +{\s122\fi-360\li1080\widctlpar\jclisttab\tx1080{\*\pn \pnlvlbody\ilvl0\ls3\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid \sbasedon0 \snext123 \sautoupd List Bullet 2;} +{\s123\fi-360\li1440\widctlpar\jclisttab\tx1440{\*\pn \pnlvlbody\ilvl0\ls4\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid \sbasedon0 \snext124 \sautoupd List Bullet 3;} +{\s124\fi-360\li1800\widctlpar\jclisttab\tx1800{\*\pn \pnlvlbody\ilvl0\ls5\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid \sbasedon0 \snext125 \sautoupd List Bullet 4;} +{\s125\fi-360\li2160\widctlpar\jclisttab\tx2160{\*\pn \pnlvlbody\ilvl0\ls6\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid \sbasedon0 \snext126 \sautoupd List Bullet 5;} +{\s126\fi-360\li2520\widctlpar\jclisttab\tx2520{\*\pn \pnlvlbody\ilvl0\ls7\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid \sbasedon0 \snext127 \sautoupd List Bullet 6;} +{\s127\fi-360\li2880\widctlpar\jclisttab\tx2880{\*\pn \pnlvlbody\ilvl0\ls8\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid \sbasedon0 \snext128 \sautoupd List Bullet 7;} +{\s128\fi-360\li3240\widctlpar\jclisttab\tx3240{\*\pn \pnlvlbody\ilvl0\ls9\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid \sbasedon0 \snext129 \sautoupd List Bullet 8;} +{\s129\fi-360\li3600\widctlpar\jclisttab\tx3600{\*\pn \pnlvlbody\ilvl0\ls10\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid \sbasedon0 \snext130 \sautoupd List Bullet 9;} +{\s130\fi-360\li3960\widctlpar\jclisttab\tx3960{\*\pn \pnlvlbody\ilvl0\ls11\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid \sbasedon0 \snext131 \sautoupd List Bullet 10;} +{\s131\fi-360\li4320\widctlpar\jclisttab\tx4320{\*\pn \pnlvlbody\ilvl0\ls12\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid \sbasedon0 \snext132 \sautoupd List Bullet 11;} +{\s132\fi-360\li4680\widctlpar\jclisttab\tx4680{\*\pn \pnlvlbody\ilvl0\ls13\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid \sbasedon0 \snext133 \sautoupd List Bullet 12;} +{\s133\fi-360\li5040\widctlpar\jclisttab\tx5040{\*\pn \pnlvlbody\ilvl0\ls14\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid \sbasedon0 \snext133 \sautoupd List Bullet 13;} +{\s140\fi-360\li360\widctlpar\fs20\cgrid \sbasedon0 \snext141 \sautoupd List Enum 0;} +{\s141\fi-360\li720\widctlpar\fs20\cgrid \sbasedon0 \snext142 \sautoupd List Enum 1;} +{\s142\fi-360\li1080\widctlpar\fs20\cgrid \sbasedon0 \snext143 \sautoupd List Enum 2;} +{\s143\fi-360\li1440\widctlpar\fs20\cgrid \sbasedon0 \snext144 \sautoupd List Enum 3;} +{\s144\fi-360\li1800\widctlpar\fs20\cgrid \sbasedon0 \snext145 \sautoupd List Enum 4;} +{\s145\fi-360\li2160\widctlpar\fs20\cgrid \sbasedon0 \snext146 \sautoupd List Enum 5;} +{\s146\fi-360\li2520\widctlpar\fs20\cgrid \sbasedon0 \snext147 \sautoupd List Enum 6;} +{\s147\fi-360\li2880\widctlpar\fs20\cgrid \sbasedon0 \snext148 \sautoupd List Enum 7;} +{\s148\fi-360\li3240\widctlpar\fs20\cgrid \sbasedon0 \snext149 \sautoupd List Enum 8;} +{\s149\fi-360\li3600\widctlpar\fs20\cgrid \sbasedon0 \snext150 \sautoupd List Enum 9;} +{\s150\fi-360\li3960\widctlpar\fs20\cgrid \sbasedon0 \snext151 \sautoupd List Enum 10;} +{\s151\fi-360\li4320\widctlpar\fs20\cgrid \sbasedon0 \snext152 \sautoupd List Enum 11;} +{\s152\fi-360\li4680\widctlpar\fs20\cgrid \sbasedon0 \snext153 \sautoupd List Enum 12;} +{\s153\fi-360\li5040\widctlpar\fs20\cgrid \sbasedon0 \snext153 \sautoupd List Enum 13;} +} +{\comment begin body} +\pard\plain \s2\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs28\kerning28\cgrid +/tmp/github_reposRepoArchDocGenContext/Penify-dev/penify-cli/tests Directory Reference\par \pard\plain +{\tc\tcl2 \v /tmp/github_reposRepoArchDocGenContext/Penify-dev/penify-cli/tests Directory Reference} +{\xe \v /tmp/github_reposRepoArchDocGenContext/Penify-dev/penify-cli/tests Directory Reference} +{\bkmkstart AAAAAAAAPA} +{\bkmkend AAAAAAAAPA} +Directory dependency graph for tests:{ +\pard\plain +\par\pard \qc {\field\flddirty {\*\fldinst INCLUDEPICTURE "dir_063e2d5fe58a131099a7fe4200cca78c_dep.svg" \\d \\*MERGEFORMAT}{\fldrslt IMAGE}}\par +} +\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid +Files\par +\pard\plain + +{ +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +file {\b __init__.py}\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +file {\b conftest.py}\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +file {\b test_commit_commands.py}\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +file {\b test_config_commands.py}\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +file {\b test_doc_commands.py}\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +file {\b test_web_config.py}\par +} +} \ No newline at end of file diff --git a/docs/rtf/dir_063e2d5fe58a131099a7fe4200cca78c_dep.md5 b/docs/rtf/dir_063e2d5fe58a131099a7fe4200cca78c_dep.md5 new file mode 100644 index 0000000..afb9081 --- /dev/null +++ b/docs/rtf/dir_063e2d5fe58a131099a7fe4200cca78c_dep.md5 @@ -0,0 +1 @@ +fdbdbdbe253c547a3b41063e5036418d \ No newline at end of file diff --git a/docs/rtf/dir_063e2d5fe58a131099a7fe4200cca78c_dep.svg b/docs/rtf/dir_063e2d5fe58a131099a7fe4200cca78c_dep.svg new file mode 100644 index 0000000..53f13f5 --- /dev/null +++ b/docs/rtf/dir_063e2d5fe58a131099a7fe4200cca78c_dep.svg @@ -0,0 +1,30 @@ + + + + + + +/tmp/github_reposRepoArchDocGenContext/Penify-dev/penify-cli/tests + + +clusterdir_b3b22d2ab7966b65f6b237e3231b41be + + +penify-cli + + + + + +dir_063e2d5fe58a131099a7fe4200cca78c + + +tests + + + + + diff --git a/docs/rtf/dir_1648a057408aae8db85b8e3797335623.rtf b/docs/rtf/dir_1648a057408aae8db85b8e3797335623.rtf new file mode 100644 index 0000000..32faca0 --- /dev/null +++ b/docs/rtf/dir_1648a057408aae8db85b8e3797335623.rtf @@ -0,0 +1,119 @@ +{\rtf1\ansi\ansicpg1252\uc1 \deff0\deflang1033\deflangfe1033 +{\fonttbl {\f0\froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;} +{\f1\fswiss\fcharset0\fprq2{\*\panose 020b0604020202020204}Arial;} +{\f2\fmodern\fcharset0\fprq1{\*\panose 02070309020205020404}Courier New;} +{\f3\froman\fcharset2\fprq2{\*\panose 05050102010706020507}Symbol;} +} +{\colortbl;\red0\green0\blue0;\red0\green0\blue255;\red0\green255\blue255;\red0\green255\blue0;\red255\green0\blue255;\red255\green0\blue0;\red255\green255\blue0;\red255\green255\blue255;\red0\green0\blue128;\red0\green128\blue128;\red0\green128\blue0;\red128\green0\blue128;\red128\green0\blue0;\red128\green128\blue0;\red128\green128\blue128;\red192\green192\blue192;\red0\green128\blue0;\red96\green64\blue32;\rede0\green128\blue0;\red128\green0\blue0;\red128\green96\blue32;\red0\green32\blue128;\red0\green128\blue128;\red255\green0\blue255;\red0\green0\blue0;\red112\green0\blue112;\red255\green0\blue0;} +{\stylesheet +{\widctlpar\adjustright \fs20\cgrid \snext0 Normal;} +{\paperw11900\paperh16840\margl1800\margr1800\margt1440\margb1440\gutter0\ltrsect} +{\s1\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs36\kerning36\cgrid \sbasedon0 \snext0 heading 1;} +{\s2\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs28\kerning28\cgrid \sbasedon0 \snext0 heading 2;} +{\s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid \sbasedon0 \snext0 heading 3;} +{\s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid \sbasedon0 \snext0 heading 4;}{\*\cs10 \additive Default Paragraph Font;} +{\s5\sb90\sa30\keepn\widctlpar\adjustright \b\f1\fs20\cgrid \sbasedon0 \snext0 heading 5;}{\*\cs10 \additive Default Paragraph Font;} +{\s15\qc\sb240\sa60\widctlpar\outlinelevel0\adjustright \b\f1\fs32\kerning28\cgrid \sbasedon0 \snext15 Title;} +{\s16\qc\sa60\widctlpar\outlinelevel1\adjustright \f1\cgrid \sbasedon0 \snext16 Subtitle;} +{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid \sbasedon0 \snext17 BodyText;} +{\s18\widctlpar\fs22\cgrid \sbasedon0 \snext18 DenseText;} +{\s28\widctlpar\tqc\tx4320\tqr\tx8640\adjustright \fs20\cgrid \sbasedon0 \snext28 header;} +{\s29\widctlpar\tqc\tx4320\tqr\tx8640\qr\adjustright \fs20\cgrid \sbasedon0 \snext29 footer;} +{\s30\li360\sa60\sb120\keepn\widctlpar\adjustright \b\f1\fs20\cgrid \sbasedon0 \snext30 GroupHeader;} +{\s40\li0\widctlpar\adjustright \shading1000\cbpat8 \f2\fs16\cgrid \sbasedon0 \snext41 Code Example 0;} +{\s41\li360\widctlpar\adjustright \shading1000\cbpat8 \f2\fs16\cgrid \sbasedon0 \snext42 Code Example 1;} +{\s42\li720\widctlpar\adjustright \shading1000\cbpat8 \f2\fs16\cgrid \sbasedon0 \snext43 Code Example 2;} +{\s43\li1080\widctlpar\adjustright \shading1000\cbpat8 \f2\fs16\cgrid \sbasedon0 \snext44 Code Example 3;} +{\s44\li1440\widctlpar\adjustright \shading1000\cbpat8 \f2\fs16\cgrid \sbasedon0 \snext45 Code Example 4;} +{\s45\li1800\widctlpar\adjustright \shading1000\cbpat8 \f2\fs16\cgrid \sbasedon0 \snext46 Code Example 5;} +{\s46\li2160\widctlpar\adjustright \shading1000\cbpat8 \f2\fs16\cgrid \sbasedon0 \snext47 Code Example 6;} +{\s47\li2520\widctlpar\adjustright \shading1000\cbpat8 \f2\fs16\cgrid \sbasedon0 \snext48 Code Example 7;} +{\s48\li2880\widctlpar\adjustright \shading1000\cbpat8 \f2\fs16\cgrid \sbasedon0 \snext49 Code Example 8;} +{\s49\li3240\widctlpar\adjustright \shading1000\cbpat8 \f2\fs16\cgrid \sbasedon0 \snext50 Code Example 9;} +{\s50\li3600\widctlpar\adjustright \shading1000\cbpat8 \f2\fs16\cgrid \sbasedon0 \snext51 Code Example 10;} +{\s51\li3960\widctlpar\adjustright \shading1000\cbpat8 \f2\fs16\cgrid \sbasedon0 \snext52 Code Example 11;} +{\s52\li4320\widctlpar\adjustright \shading1000\cbpat8 \f2\fs16\cgrid \sbasedon0 \snext53 Code Example 12;} +{\s53\li4680\widctlpar\adjustright \shading1000\cbpat8 \f2\fs16\cgrid \sbasedon0 \snext53 Code Example 13;} +{\s60\li0\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid \sbasedon0 \snext61 List Continue 0;} +{\s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid \sbasedon0 \snext62 List Continue 1;} +{\s62\li720\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid \sbasedon0 \snext63 List Continue 2;} +{\s63\li1080\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid \sbasedon0 \snext64 List Continue 3;} +{\s64\li1440\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid \sbasedon0 \snext65 List Continue 4;} +{\s65\li1800\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid \sbasedon0 \snext66 List Continue 5;} +{\s66\li2160\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid \sbasedon0 \snext67 List Continue 6;} +{\s67\li2520\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid \sbasedon0 \snext68 List Continue 7;} +{\s68\li2880\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid \sbasedon0 \snext69 List Continue 8;} +{\s69\li3240\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid \sbasedon0 \snext70 List Continue 9;} +{\s70\li3600\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid \sbasedon0 \snext71 List Continue 10;} +{\s71\li3960\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid \sbasedon0 \snext72 List Continue 11;} +{\s72\li4320\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid \sbasedon0 \snext73 List Continue 12;} +{\s73\li4680\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid \sbasedon0 \snext73 List Continue 13;} +{\s80\li0\widctlpar\ql\adjustright \fs20\cgrid \sbasedon0 \snext81 DescContinue 0;} +{\s81\li360\widctlpar\ql\adjustright \fs20\cgrid \sbasedon0 \snext82 DescContinue 1;} +{\s82\li720\widctlpar\ql\adjustright \fs20\cgrid \sbasedon0 \snext83 DescContinue 2;} +{\s83\li1080\widctlpar\ql\adjustright \fs20\cgrid \sbasedon0 \snext84 DescContinue 3;} +{\s84\li1440\widctlpar\ql\adjustright \fs20\cgrid \sbasedon0 \snext85 DescContinue 4;} +{\s85\li1800\widctlpar\ql\adjustright \fs20\cgrid \sbasedon0 \snext86 DescContinue 5;} +{\s86\li2160\widctlpar\ql\adjustright \fs20\cgrid \sbasedon0 \snext87 DescContinue 6;} +{\s87\li2520\widctlpar\ql\adjustright \fs20\cgrid \sbasedon0 \snext88 DescContinue 7;} +{\s88\li2880\widctlpar\ql\adjustright \fs20\cgrid \sbasedon0 \snext89 DescContinue 8;} +{\s89\li3240\widctlpar\ql\adjustright \fs20\cgrid \sbasedon0 \snext90 DescContinue 9;} +{\s90\li3600\widctlpar\ql\adjustright \fs20\cgrid \sbasedon0 \snext91 DescContinue 10;} +{\s91\li3960\widctlpar\ql\adjustright \fs20\cgrid \sbasedon0 \snext92 DescContinue 11;} +{\s92\li4320\widctlpar\ql\adjustright \fs20\cgrid \sbasedon0 \snext93 DescContinue 12;} +{\s93\li4680\widctlpar\ql\adjustright \fs20\cgrid \sbasedon0 \snext93 DescContinue 13;} +{\s100\li0\sa30\sb30\widctlpar\tqr\tldot\tx8640\adjustright \fs20\cgrid \sbasedon0 \snext101 LatexTOC 0;} +{\s101\li360\sa27\sb27\widctlpar\tqr\tldot\tx8640\adjustright \fs20\cgrid \sbasedon0 \snext102 LatexTOC 1;} +{\s102\li720\sa24\sb24\widctlpar\tqr\tldot\tx8640\adjustright \fs20\cgrid \sbasedon0 \snext103 LatexTOC 2;} +{\s103\li1080\sa21\sb21\widctlpar\tqr\tldot\tx8640\adjustright \fs20\cgrid \sbasedon0 \snext104 LatexTOC 3;} +{\s104\li1440\sa18\sb18\widctlpar\tqr\tldot\tx8640\adjustright \fs20\cgrid \sbasedon0 \snext105 LatexTOC 4;} +{\s105\li1800\sa15\sb15\widctlpar\tqr\tldot\tx8640\adjustright \fs20\cgrid \sbasedon0 \snext106 LatexTOC 5;} +{\s106\li2160\sa12\sb12\widctlpar\tqr\tldot\tx8640\adjustright \fs20\cgrid \sbasedon0 \snext107 LatexTOC 6;} +{\s107\li2520\sa9\sb9\widctlpar\tqr\tldot\tx8640\adjustright \fs20\cgrid \sbasedon0 \snext108 LatexTOC 7;} +{\s108\li2880\sa6\sb6\widctlpar\tqr\tldot\tx8640\adjustright \fs20\cgrid \sbasedon0 \snext109 LatexTOC 8;} +{\s109\li3240\sa3\sb3\widctlpar\tqr\tldot\tx8640\adjustright \fs20\cgrid \sbasedon0 \snext110 LatexTOC 9;} +{\s110\li3600\sa3\sb3\widctlpar\tqr\tldot\tx8640\adjustright \fs20\cgrid \sbasedon0 \snext111 LatexTOC 10;} +{\s111\li3960\sa3\sb3\widctlpar\tqr\tldot\tx8640\adjustright \fs20\cgrid \sbasedon0 \snext112 LatexTOC 11;} +{\s112\li4320\sa3\sb3\widctlpar\tqr\tldot\tx8640\adjustright \fs20\cgrid \sbasedon0 \snext113 LatexTOC 12;} +{\s113\li4680\sa3\sb3\widctlpar\tqr\tldot\tx8640\adjustright \fs20\cgrid \sbasedon0 \snext113 LatexTOC 13;} +{\s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid \sbasedon0 \snext121 \sautoupd List Bullet 0;} +{\s121\fi-360\li720\widctlpar\jclisttab\tx720{\*\pn \pnlvlbody\ilvl0\ls2\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid \sbasedon0 \snext122 \sautoupd List Bullet 1;} +{\s122\fi-360\li1080\widctlpar\jclisttab\tx1080{\*\pn \pnlvlbody\ilvl0\ls3\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid \sbasedon0 \snext123 \sautoupd List Bullet 2;} +{\s123\fi-360\li1440\widctlpar\jclisttab\tx1440{\*\pn \pnlvlbody\ilvl0\ls4\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid \sbasedon0 \snext124 \sautoupd List Bullet 3;} +{\s124\fi-360\li1800\widctlpar\jclisttab\tx1800{\*\pn \pnlvlbody\ilvl0\ls5\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid \sbasedon0 \snext125 \sautoupd List Bullet 4;} +{\s125\fi-360\li2160\widctlpar\jclisttab\tx2160{\*\pn \pnlvlbody\ilvl0\ls6\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid \sbasedon0 \snext126 \sautoupd List Bullet 5;} +{\s126\fi-360\li2520\widctlpar\jclisttab\tx2520{\*\pn \pnlvlbody\ilvl0\ls7\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid \sbasedon0 \snext127 \sautoupd List Bullet 6;} +{\s127\fi-360\li2880\widctlpar\jclisttab\tx2880{\*\pn \pnlvlbody\ilvl0\ls8\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid \sbasedon0 \snext128 \sautoupd List Bullet 7;} +{\s128\fi-360\li3240\widctlpar\jclisttab\tx3240{\*\pn \pnlvlbody\ilvl0\ls9\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid \sbasedon0 \snext129 \sautoupd List Bullet 8;} +{\s129\fi-360\li3600\widctlpar\jclisttab\tx3600{\*\pn \pnlvlbody\ilvl0\ls10\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid \sbasedon0 \snext130 \sautoupd List Bullet 9;} +{\s130\fi-360\li3960\widctlpar\jclisttab\tx3960{\*\pn \pnlvlbody\ilvl0\ls11\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid \sbasedon0 \snext131 \sautoupd List Bullet 10;} +{\s131\fi-360\li4320\widctlpar\jclisttab\tx4320{\*\pn \pnlvlbody\ilvl0\ls12\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid \sbasedon0 \snext132 \sautoupd List Bullet 11;} +{\s132\fi-360\li4680\widctlpar\jclisttab\tx4680{\*\pn \pnlvlbody\ilvl0\ls13\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid \sbasedon0 \snext133 \sautoupd List Bullet 12;} +{\s133\fi-360\li5040\widctlpar\jclisttab\tx5040{\*\pn \pnlvlbody\ilvl0\ls14\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid \sbasedon0 \snext133 \sautoupd List Bullet 13;} +{\s140\fi-360\li360\widctlpar\fs20\cgrid \sbasedon0 \snext141 \sautoupd List Enum 0;} +{\s141\fi-360\li720\widctlpar\fs20\cgrid \sbasedon0 \snext142 \sautoupd List Enum 1;} +{\s142\fi-360\li1080\widctlpar\fs20\cgrid \sbasedon0 \snext143 \sautoupd List Enum 2;} +{\s143\fi-360\li1440\widctlpar\fs20\cgrid \sbasedon0 \snext144 \sautoupd List Enum 3;} +{\s144\fi-360\li1800\widctlpar\fs20\cgrid \sbasedon0 \snext145 \sautoupd List Enum 4;} +{\s145\fi-360\li2160\widctlpar\fs20\cgrid \sbasedon0 \snext146 \sautoupd List Enum 5;} +{\s146\fi-360\li2520\widctlpar\fs20\cgrid \sbasedon0 \snext147 \sautoupd List Enum 6;} +{\s147\fi-360\li2880\widctlpar\fs20\cgrid \sbasedon0 \snext148 \sautoupd List Enum 7;} +{\s148\fi-360\li3240\widctlpar\fs20\cgrid \sbasedon0 \snext149 \sautoupd List Enum 8;} +{\s149\fi-360\li3600\widctlpar\fs20\cgrid \sbasedon0 \snext150 \sautoupd List Enum 9;} +{\s150\fi-360\li3960\widctlpar\fs20\cgrid \sbasedon0 \snext151 \sautoupd List Enum 10;} +{\s151\fi-360\li4320\widctlpar\fs20\cgrid \sbasedon0 \snext152 \sautoupd List Enum 11;} +{\s152\fi-360\li4680\widctlpar\fs20\cgrid \sbasedon0 \snext153 \sautoupd List Enum 12;} +{\s153\fi-360\li5040\widctlpar\fs20\cgrid \sbasedon0 \snext153 \sautoupd List Enum 13;} +} +{\comment begin body} +\pard\plain \s2\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs28\kerning28\cgrid +/tmp/github_reposRepoArchDocGenContext/Penify-dev/penify-cli/docs Directory Reference\par \pard\plain +{\tc\tcl2 \v /tmp/github_reposRepoArchDocGenContext/Penify-dev/penify-cli/docs Directory Reference} +{\xe \v /tmp/github_reposRepoArchDocGenContext/Penify-dev/penify-cli/docs Directory Reference} +{\bkmkstart AAAAAAAAOX} +{\bkmkend AAAAAAAAOX} +Directory dependency graph for docs:{ +\pard\plain +\par\pard \qc {\field\flddirty {\*\fldinst INCLUDEPICTURE "dir_1648a057408aae8db85b8e3797335623_dep.svg" \\d \\*MERGEFORMAT}{\fldrslt IMAGE}}\par +} +} \ No newline at end of file diff --git a/docs/rtf/dir_1648a057408aae8db85b8e3797335623_dep.md5 b/docs/rtf/dir_1648a057408aae8db85b8e3797335623_dep.md5 new file mode 100644 index 0000000..2214ec5 --- /dev/null +++ b/docs/rtf/dir_1648a057408aae8db85b8e3797335623_dep.md5 @@ -0,0 +1 @@ +103c12b563793db32ed50b111f45bada \ No newline at end of file diff --git a/docs/rtf/dir_1648a057408aae8db85b8e3797335623_dep.svg b/docs/rtf/dir_1648a057408aae8db85b8e3797335623_dep.svg new file mode 100644 index 0000000..b859cd6 --- /dev/null +++ b/docs/rtf/dir_1648a057408aae8db85b8e3797335623_dep.svg @@ -0,0 +1,30 @@ + + + + + + +/tmp/github_reposRepoArchDocGenContext/Penify-dev/penify-cli/docs + + +clusterdir_b3b22d2ab7966b65f6b237e3231b41be + + +penify-cli + + + + + +dir_1648a057408aae8db85b8e3797335623 + + +docs + + + + + diff --git a/docs/rtf/dir_624fa2a8bce97f0444ac5cca335d4e23.rtf b/docs/rtf/dir_624fa2a8bce97f0444ac5cca335d4e23.rtf new file mode 100644 index 0000000..8e7a5c7 --- /dev/null +++ b/docs/rtf/dir_624fa2a8bce97f0444ac5cca335d4e23.rtf @@ -0,0 +1,137 @@ +{\rtf1\ansi\ansicpg1252\uc1 \deff0\deflang1033\deflangfe1033 +{\fonttbl {\f0\froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;} +{\f1\fswiss\fcharset0\fprq2{\*\panose 020b0604020202020204}Arial;} +{\f2\fmodern\fcharset0\fprq1{\*\panose 02070309020205020404}Courier New;} +{\f3\froman\fcharset2\fprq2{\*\panose 05050102010706020507}Symbol;} +} +{\colortbl;\red0\green0\blue0;\red0\green0\blue255;\red0\green255\blue255;\red0\green255\blue0;\red255\green0\blue255;\red255\green0\blue0;\red255\green255\blue0;\red255\green255\blue255;\red0\green0\blue128;\red0\green128\blue128;\red0\green128\blue0;\red128\green0\blue128;\red128\green0\blue0;\red128\green128\blue0;\red128\green128\blue128;\red192\green192\blue192;\red0\green128\blue0;\red96\green64\blue32;\rede0\green128\blue0;\red128\green0\blue0;\red128\green96\blue32;\red0\green32\blue128;\red0\green128\blue128;\red255\green0\blue255;\red0\green0\blue0;\red112\green0\blue112;\red255\green0\blue0;} +{\stylesheet +{\widctlpar\adjustright \fs20\cgrid \snext0 Normal;} +{\paperw11900\paperh16840\margl1800\margr1800\margt1440\margb1440\gutter0\ltrsect} +{\s1\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs36\kerning36\cgrid \sbasedon0 \snext0 heading 1;} +{\s2\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs28\kerning28\cgrid \sbasedon0 \snext0 heading 2;} +{\s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid \sbasedon0 \snext0 heading 3;} +{\s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid \sbasedon0 \snext0 heading 4;}{\*\cs10 \additive Default Paragraph Font;} +{\s5\sb90\sa30\keepn\widctlpar\adjustright \b\f1\fs20\cgrid \sbasedon0 \snext0 heading 5;}{\*\cs10 \additive Default Paragraph Font;} +{\s15\qc\sb240\sa60\widctlpar\outlinelevel0\adjustright \b\f1\fs32\kerning28\cgrid \sbasedon0 \snext15 Title;} +{\s16\qc\sa60\widctlpar\outlinelevel1\adjustright \f1\cgrid \sbasedon0 \snext16 Subtitle;} +{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid \sbasedon0 \snext17 BodyText;} +{\s18\widctlpar\fs22\cgrid \sbasedon0 \snext18 DenseText;} +{\s28\widctlpar\tqc\tx4320\tqr\tx8640\adjustright \fs20\cgrid \sbasedon0 \snext28 header;} +{\s29\widctlpar\tqc\tx4320\tqr\tx8640\qr\adjustright \fs20\cgrid \sbasedon0 \snext29 footer;} +{\s30\li360\sa60\sb120\keepn\widctlpar\adjustright \b\f1\fs20\cgrid \sbasedon0 \snext30 GroupHeader;} +{\s40\li0\widctlpar\adjustright \shading1000\cbpat8 \f2\fs16\cgrid \sbasedon0 \snext41 Code Example 0;} +{\s41\li360\widctlpar\adjustright \shading1000\cbpat8 \f2\fs16\cgrid \sbasedon0 \snext42 Code Example 1;} +{\s42\li720\widctlpar\adjustright \shading1000\cbpat8 \f2\fs16\cgrid \sbasedon0 \snext43 Code Example 2;} +{\s43\li1080\widctlpar\adjustright \shading1000\cbpat8 \f2\fs16\cgrid \sbasedon0 \snext44 Code Example 3;} +{\s44\li1440\widctlpar\adjustright \shading1000\cbpat8 \f2\fs16\cgrid \sbasedon0 \snext45 Code Example 4;} +{\s45\li1800\widctlpar\adjustright \shading1000\cbpat8 \f2\fs16\cgrid \sbasedon0 \snext46 Code Example 5;} +{\s46\li2160\widctlpar\adjustright \shading1000\cbpat8 \f2\fs16\cgrid \sbasedon0 \snext47 Code Example 6;} +{\s47\li2520\widctlpar\adjustright \shading1000\cbpat8 \f2\fs16\cgrid \sbasedon0 \snext48 Code Example 7;} +{\s48\li2880\widctlpar\adjustright \shading1000\cbpat8 \f2\fs16\cgrid \sbasedon0 \snext49 Code Example 8;} +{\s49\li3240\widctlpar\adjustright \shading1000\cbpat8 \f2\fs16\cgrid \sbasedon0 \snext50 Code Example 9;} +{\s50\li3600\widctlpar\adjustright \shading1000\cbpat8 \f2\fs16\cgrid \sbasedon0 \snext51 Code Example 10;} +{\s51\li3960\widctlpar\adjustright \shading1000\cbpat8 \f2\fs16\cgrid \sbasedon0 \snext52 Code Example 11;} +{\s52\li4320\widctlpar\adjustright \shading1000\cbpat8 \f2\fs16\cgrid \sbasedon0 \snext53 Code Example 12;} +{\s53\li4680\widctlpar\adjustright \shading1000\cbpat8 \f2\fs16\cgrid \sbasedon0 \snext53 Code Example 13;} +{\s60\li0\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid \sbasedon0 \snext61 List Continue 0;} +{\s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid \sbasedon0 \snext62 List Continue 1;} +{\s62\li720\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid \sbasedon0 \snext63 List Continue 2;} +{\s63\li1080\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid \sbasedon0 \snext64 List Continue 3;} +{\s64\li1440\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid \sbasedon0 \snext65 List Continue 4;} +{\s65\li1800\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid \sbasedon0 \snext66 List Continue 5;} +{\s66\li2160\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid \sbasedon0 \snext67 List Continue 6;} +{\s67\li2520\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid \sbasedon0 \snext68 List Continue 7;} +{\s68\li2880\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid \sbasedon0 \snext69 List Continue 8;} +{\s69\li3240\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid \sbasedon0 \snext70 List Continue 9;} +{\s70\li3600\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid \sbasedon0 \snext71 List Continue 10;} +{\s71\li3960\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid \sbasedon0 \snext72 List Continue 11;} +{\s72\li4320\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid \sbasedon0 \snext73 List Continue 12;} +{\s73\li4680\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid \sbasedon0 \snext73 List Continue 13;} +{\s80\li0\widctlpar\ql\adjustright \fs20\cgrid \sbasedon0 \snext81 DescContinue 0;} +{\s81\li360\widctlpar\ql\adjustright \fs20\cgrid \sbasedon0 \snext82 DescContinue 1;} +{\s82\li720\widctlpar\ql\adjustright \fs20\cgrid \sbasedon0 \snext83 DescContinue 2;} +{\s83\li1080\widctlpar\ql\adjustright \fs20\cgrid \sbasedon0 \snext84 DescContinue 3;} +{\s84\li1440\widctlpar\ql\adjustright \fs20\cgrid \sbasedon0 \snext85 DescContinue 4;} +{\s85\li1800\widctlpar\ql\adjustright \fs20\cgrid \sbasedon0 \snext86 DescContinue 5;} +{\s86\li2160\widctlpar\ql\adjustright \fs20\cgrid \sbasedon0 \snext87 DescContinue 6;} +{\s87\li2520\widctlpar\ql\adjustright \fs20\cgrid \sbasedon0 \snext88 DescContinue 7;} +{\s88\li2880\widctlpar\ql\adjustright \fs20\cgrid \sbasedon0 \snext89 DescContinue 8;} +{\s89\li3240\widctlpar\ql\adjustright \fs20\cgrid \sbasedon0 \snext90 DescContinue 9;} +{\s90\li3600\widctlpar\ql\adjustright \fs20\cgrid \sbasedon0 \snext91 DescContinue 10;} +{\s91\li3960\widctlpar\ql\adjustright \fs20\cgrid \sbasedon0 \snext92 DescContinue 11;} +{\s92\li4320\widctlpar\ql\adjustright \fs20\cgrid \sbasedon0 \snext93 DescContinue 12;} +{\s93\li4680\widctlpar\ql\adjustright \fs20\cgrid \sbasedon0 \snext93 DescContinue 13;} +{\s100\li0\sa30\sb30\widctlpar\tqr\tldot\tx8640\adjustright \fs20\cgrid \sbasedon0 \snext101 LatexTOC 0;} +{\s101\li360\sa27\sb27\widctlpar\tqr\tldot\tx8640\adjustright \fs20\cgrid \sbasedon0 \snext102 LatexTOC 1;} +{\s102\li720\sa24\sb24\widctlpar\tqr\tldot\tx8640\adjustright \fs20\cgrid \sbasedon0 \snext103 LatexTOC 2;} +{\s103\li1080\sa21\sb21\widctlpar\tqr\tldot\tx8640\adjustright \fs20\cgrid \sbasedon0 \snext104 LatexTOC 3;} +{\s104\li1440\sa18\sb18\widctlpar\tqr\tldot\tx8640\adjustright \fs20\cgrid \sbasedon0 \snext105 LatexTOC 4;} +{\s105\li1800\sa15\sb15\widctlpar\tqr\tldot\tx8640\adjustright \fs20\cgrid \sbasedon0 \snext106 LatexTOC 5;} +{\s106\li2160\sa12\sb12\widctlpar\tqr\tldot\tx8640\adjustright \fs20\cgrid \sbasedon0 \snext107 LatexTOC 6;} +{\s107\li2520\sa9\sb9\widctlpar\tqr\tldot\tx8640\adjustright \fs20\cgrid \sbasedon0 \snext108 LatexTOC 7;} +{\s108\li2880\sa6\sb6\widctlpar\tqr\tldot\tx8640\adjustright \fs20\cgrid \sbasedon0 \snext109 LatexTOC 8;} +{\s109\li3240\sa3\sb3\widctlpar\tqr\tldot\tx8640\adjustright \fs20\cgrid \sbasedon0 \snext110 LatexTOC 9;} +{\s110\li3600\sa3\sb3\widctlpar\tqr\tldot\tx8640\adjustright \fs20\cgrid \sbasedon0 \snext111 LatexTOC 10;} +{\s111\li3960\sa3\sb3\widctlpar\tqr\tldot\tx8640\adjustright \fs20\cgrid \sbasedon0 \snext112 LatexTOC 11;} +{\s112\li4320\sa3\sb3\widctlpar\tqr\tldot\tx8640\adjustright \fs20\cgrid \sbasedon0 \snext113 LatexTOC 12;} +{\s113\li4680\sa3\sb3\widctlpar\tqr\tldot\tx8640\adjustright \fs20\cgrid \sbasedon0 \snext113 LatexTOC 13;} +{\s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid \sbasedon0 \snext121 \sautoupd List Bullet 0;} +{\s121\fi-360\li720\widctlpar\jclisttab\tx720{\*\pn \pnlvlbody\ilvl0\ls2\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid \sbasedon0 \snext122 \sautoupd List Bullet 1;} +{\s122\fi-360\li1080\widctlpar\jclisttab\tx1080{\*\pn \pnlvlbody\ilvl0\ls3\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid \sbasedon0 \snext123 \sautoupd List Bullet 2;} +{\s123\fi-360\li1440\widctlpar\jclisttab\tx1440{\*\pn \pnlvlbody\ilvl0\ls4\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid \sbasedon0 \snext124 \sautoupd List Bullet 3;} +{\s124\fi-360\li1800\widctlpar\jclisttab\tx1800{\*\pn \pnlvlbody\ilvl0\ls5\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid \sbasedon0 \snext125 \sautoupd List Bullet 4;} +{\s125\fi-360\li2160\widctlpar\jclisttab\tx2160{\*\pn \pnlvlbody\ilvl0\ls6\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid \sbasedon0 \snext126 \sautoupd List Bullet 5;} +{\s126\fi-360\li2520\widctlpar\jclisttab\tx2520{\*\pn \pnlvlbody\ilvl0\ls7\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid \sbasedon0 \snext127 \sautoupd List Bullet 6;} +{\s127\fi-360\li2880\widctlpar\jclisttab\tx2880{\*\pn \pnlvlbody\ilvl0\ls8\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid \sbasedon0 \snext128 \sautoupd List Bullet 7;} +{\s128\fi-360\li3240\widctlpar\jclisttab\tx3240{\*\pn \pnlvlbody\ilvl0\ls9\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid \sbasedon0 \snext129 \sautoupd List Bullet 8;} +{\s129\fi-360\li3600\widctlpar\jclisttab\tx3600{\*\pn \pnlvlbody\ilvl0\ls10\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid \sbasedon0 \snext130 \sautoupd List Bullet 9;} +{\s130\fi-360\li3960\widctlpar\jclisttab\tx3960{\*\pn \pnlvlbody\ilvl0\ls11\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid \sbasedon0 \snext131 \sautoupd List Bullet 10;} +{\s131\fi-360\li4320\widctlpar\jclisttab\tx4320{\*\pn \pnlvlbody\ilvl0\ls12\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid \sbasedon0 \snext132 \sautoupd List Bullet 11;} +{\s132\fi-360\li4680\widctlpar\jclisttab\tx4680{\*\pn \pnlvlbody\ilvl0\ls13\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid \sbasedon0 \snext133 \sautoupd List Bullet 12;} +{\s133\fi-360\li5040\widctlpar\jclisttab\tx5040{\*\pn \pnlvlbody\ilvl0\ls14\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid \sbasedon0 \snext133 \sautoupd List Bullet 13;} +{\s140\fi-360\li360\widctlpar\fs20\cgrid \sbasedon0 \snext141 \sautoupd List Enum 0;} +{\s141\fi-360\li720\widctlpar\fs20\cgrid \sbasedon0 \snext142 \sautoupd List Enum 1;} +{\s142\fi-360\li1080\widctlpar\fs20\cgrid \sbasedon0 \snext143 \sautoupd List Enum 2;} +{\s143\fi-360\li1440\widctlpar\fs20\cgrid \sbasedon0 \snext144 \sautoupd List Enum 3;} +{\s144\fi-360\li1800\widctlpar\fs20\cgrid \sbasedon0 \snext145 \sautoupd List Enum 4;} +{\s145\fi-360\li2160\widctlpar\fs20\cgrid \sbasedon0 \snext146 \sautoupd List Enum 5;} +{\s146\fi-360\li2520\widctlpar\fs20\cgrid \sbasedon0 \snext147 \sautoupd List Enum 6;} +{\s147\fi-360\li2880\widctlpar\fs20\cgrid \sbasedon0 \snext148 \sautoupd List Enum 7;} +{\s148\fi-360\li3240\widctlpar\fs20\cgrid \sbasedon0 \snext149 \sautoupd List Enum 8;} +{\s149\fi-360\li3600\widctlpar\fs20\cgrid \sbasedon0 \snext150 \sautoupd List Enum 9;} +{\s150\fi-360\li3960\widctlpar\fs20\cgrid \sbasedon0 \snext151 \sautoupd List Enum 10;} +{\s151\fi-360\li4320\widctlpar\fs20\cgrid \sbasedon0 \snext152 \sautoupd List Enum 11;} +{\s152\fi-360\li4680\widctlpar\fs20\cgrid \sbasedon0 \snext153 \sautoupd List Enum 12;} +{\s153\fi-360\li5040\widctlpar\fs20\cgrid \sbasedon0 \snext153 \sautoupd List Enum 13;} +} +{\comment begin body} +\pard\plain \s2\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs28\kerning28\cgrid +/tmp/github_reposRepoArchDocGenContext/Penify-dev/penify-cli/penify_hook/commands Directory Reference\par \pard\plain +{\tc\tcl2 \v /tmp/github_reposRepoArchDocGenContext/Penify-dev/penify-cli/penify_hook/commands Directory Reference} +{\xe \v /tmp/github_reposRepoArchDocGenContext/Penify-dev/penify-cli/penify_hook/commands Directory Reference} +{\bkmkstart AAAAAAAAOW} +{\bkmkend AAAAAAAAOW} +Directory dependency graph for commands:{ +\pard\plain +\par\pard \qc {\field\flddirty {\*\fldinst INCLUDEPICTURE "dir_624fa2a8bce97f0444ac5cca335d4e23_dep.svg" \\d \\*MERGEFORMAT}{\fldrslt IMAGE}}\par +} +\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid +Files\par +\pard\plain + +{ +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +file {\b __init__.py}\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +file {\b auth_commands.py}\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +file {\b commit_commands.py}\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +file {\b config_commands.py}\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +file {\b doc_commands.py}\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +file {\b hook_commands.py}\par +} +} \ No newline at end of file diff --git a/docs/rtf/dir_624fa2a8bce97f0444ac5cca335d4e23_dep.md5 b/docs/rtf/dir_624fa2a8bce97f0444ac5cca335d4e23_dep.md5 new file mode 100644 index 0000000..597f466 --- /dev/null +++ b/docs/rtf/dir_624fa2a8bce97f0444ac5cca335d4e23_dep.md5 @@ -0,0 +1 @@ +1c8b9302d49050442030c2a1fe004137 \ No newline at end of file diff --git a/docs/rtf/dir_624fa2a8bce97f0444ac5cca335d4e23_dep.svg b/docs/rtf/dir_624fa2a8bce97f0444ac5cca335d4e23_dep.svg new file mode 100644 index 0000000..a17413c --- /dev/null +++ b/docs/rtf/dir_624fa2a8bce97f0444ac5cca335d4e23_dep.svg @@ -0,0 +1,30 @@ + + + + + + +/tmp/github_reposRepoArchDocGenContext/Penify-dev/penify-cli/penify_hook/commands + + +clusterdir_f88c3381c1861b3f7ca1f3d63cf244b5 + + +penify_hook + + + + + +dir_624fa2a8bce97f0444ac5cca335d4e23 + + +commands + + + + + diff --git a/docs/rtf/dir_b3b22d2ab7966b65f6b237e3231b41be.rtf b/docs/rtf/dir_b3b22d2ab7966b65f6b237e3231b41be.rtf new file mode 100644 index 0000000..4689fd1 --- /dev/null +++ b/docs/rtf/dir_b3b22d2ab7966b65f6b237e3231b41be.rtf @@ -0,0 +1,135 @@ +{\rtf1\ansi\ansicpg1252\uc1 \deff0\deflang1033\deflangfe1033 +{\fonttbl {\f0\froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;} +{\f1\fswiss\fcharset0\fprq2{\*\panose 020b0604020202020204}Arial;} +{\f2\fmodern\fcharset0\fprq1{\*\panose 02070309020205020404}Courier New;} +{\f3\froman\fcharset2\fprq2{\*\panose 05050102010706020507}Symbol;} +} +{\colortbl;\red0\green0\blue0;\red0\green0\blue255;\red0\green255\blue255;\red0\green255\blue0;\red255\green0\blue255;\red255\green0\blue0;\red255\green255\blue0;\red255\green255\blue255;\red0\green0\blue128;\red0\green128\blue128;\red0\green128\blue0;\red128\green0\blue128;\red128\green0\blue0;\red128\green128\blue0;\red128\green128\blue128;\red192\green192\blue192;\red0\green128\blue0;\red96\green64\blue32;\rede0\green128\blue0;\red128\green0\blue0;\red128\green96\blue32;\red0\green32\blue128;\red0\green128\blue128;\red255\green0\blue255;\red0\green0\blue0;\red112\green0\blue112;\red255\green0\blue0;} +{\stylesheet +{\widctlpar\adjustright \fs20\cgrid \snext0 Normal;} +{\paperw11900\paperh16840\margl1800\margr1800\margt1440\margb1440\gutter0\ltrsect} +{\s1\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs36\kerning36\cgrid \sbasedon0 \snext0 heading 1;} +{\s2\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs28\kerning28\cgrid \sbasedon0 \snext0 heading 2;} +{\s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid \sbasedon0 \snext0 heading 3;} +{\s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid \sbasedon0 \snext0 heading 4;}{\*\cs10 \additive Default Paragraph Font;} +{\s5\sb90\sa30\keepn\widctlpar\adjustright \b\f1\fs20\cgrid \sbasedon0 \snext0 heading 5;}{\*\cs10 \additive Default Paragraph Font;} +{\s15\qc\sb240\sa60\widctlpar\outlinelevel0\adjustright \b\f1\fs32\kerning28\cgrid \sbasedon0 \snext15 Title;} +{\s16\qc\sa60\widctlpar\outlinelevel1\adjustright \f1\cgrid \sbasedon0 \snext16 Subtitle;} +{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid \sbasedon0 \snext17 BodyText;} +{\s18\widctlpar\fs22\cgrid \sbasedon0 \snext18 DenseText;} +{\s28\widctlpar\tqc\tx4320\tqr\tx8640\adjustright \fs20\cgrid \sbasedon0 \snext28 header;} +{\s29\widctlpar\tqc\tx4320\tqr\tx8640\qr\adjustright \fs20\cgrid \sbasedon0 \snext29 footer;} +{\s30\li360\sa60\sb120\keepn\widctlpar\adjustright \b\f1\fs20\cgrid \sbasedon0 \snext30 GroupHeader;} +{\s40\li0\widctlpar\adjustright \shading1000\cbpat8 \f2\fs16\cgrid \sbasedon0 \snext41 Code Example 0;} +{\s41\li360\widctlpar\adjustright \shading1000\cbpat8 \f2\fs16\cgrid \sbasedon0 \snext42 Code Example 1;} +{\s42\li720\widctlpar\adjustright \shading1000\cbpat8 \f2\fs16\cgrid \sbasedon0 \snext43 Code Example 2;} +{\s43\li1080\widctlpar\adjustright \shading1000\cbpat8 \f2\fs16\cgrid \sbasedon0 \snext44 Code Example 3;} +{\s44\li1440\widctlpar\adjustright \shading1000\cbpat8 \f2\fs16\cgrid \sbasedon0 \snext45 Code Example 4;} +{\s45\li1800\widctlpar\adjustright \shading1000\cbpat8 \f2\fs16\cgrid \sbasedon0 \snext46 Code Example 5;} +{\s46\li2160\widctlpar\adjustright \shading1000\cbpat8 \f2\fs16\cgrid \sbasedon0 \snext47 Code Example 6;} +{\s47\li2520\widctlpar\adjustright \shading1000\cbpat8 \f2\fs16\cgrid \sbasedon0 \snext48 Code Example 7;} +{\s48\li2880\widctlpar\adjustright \shading1000\cbpat8 \f2\fs16\cgrid \sbasedon0 \snext49 Code Example 8;} +{\s49\li3240\widctlpar\adjustright \shading1000\cbpat8 \f2\fs16\cgrid \sbasedon0 \snext50 Code Example 9;} +{\s50\li3600\widctlpar\adjustright \shading1000\cbpat8 \f2\fs16\cgrid \sbasedon0 \snext51 Code Example 10;} +{\s51\li3960\widctlpar\adjustright \shading1000\cbpat8 \f2\fs16\cgrid \sbasedon0 \snext52 Code Example 11;} +{\s52\li4320\widctlpar\adjustright \shading1000\cbpat8 \f2\fs16\cgrid \sbasedon0 \snext53 Code Example 12;} +{\s53\li4680\widctlpar\adjustright \shading1000\cbpat8 \f2\fs16\cgrid \sbasedon0 \snext53 Code Example 13;} +{\s60\li0\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid \sbasedon0 \snext61 List Continue 0;} +{\s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid \sbasedon0 \snext62 List Continue 1;} +{\s62\li720\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid \sbasedon0 \snext63 List Continue 2;} +{\s63\li1080\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid \sbasedon0 \snext64 List Continue 3;} +{\s64\li1440\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid \sbasedon0 \snext65 List Continue 4;} +{\s65\li1800\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid \sbasedon0 \snext66 List Continue 5;} +{\s66\li2160\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid \sbasedon0 \snext67 List Continue 6;} +{\s67\li2520\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid \sbasedon0 \snext68 List Continue 7;} +{\s68\li2880\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid \sbasedon0 \snext69 List Continue 8;} +{\s69\li3240\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid \sbasedon0 \snext70 List Continue 9;} +{\s70\li3600\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid \sbasedon0 \snext71 List Continue 10;} +{\s71\li3960\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid \sbasedon0 \snext72 List Continue 11;} +{\s72\li4320\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid \sbasedon0 \snext73 List Continue 12;} +{\s73\li4680\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid \sbasedon0 \snext73 List Continue 13;} +{\s80\li0\widctlpar\ql\adjustright \fs20\cgrid \sbasedon0 \snext81 DescContinue 0;} +{\s81\li360\widctlpar\ql\adjustright \fs20\cgrid \sbasedon0 \snext82 DescContinue 1;} +{\s82\li720\widctlpar\ql\adjustright \fs20\cgrid \sbasedon0 \snext83 DescContinue 2;} +{\s83\li1080\widctlpar\ql\adjustright \fs20\cgrid \sbasedon0 \snext84 DescContinue 3;} +{\s84\li1440\widctlpar\ql\adjustright \fs20\cgrid \sbasedon0 \snext85 DescContinue 4;} +{\s85\li1800\widctlpar\ql\adjustright \fs20\cgrid \sbasedon0 \snext86 DescContinue 5;} +{\s86\li2160\widctlpar\ql\adjustright \fs20\cgrid \sbasedon0 \snext87 DescContinue 6;} +{\s87\li2520\widctlpar\ql\adjustright \fs20\cgrid \sbasedon0 \snext88 DescContinue 7;} +{\s88\li2880\widctlpar\ql\adjustright \fs20\cgrid \sbasedon0 \snext89 DescContinue 8;} +{\s89\li3240\widctlpar\ql\adjustright \fs20\cgrid \sbasedon0 \snext90 DescContinue 9;} +{\s90\li3600\widctlpar\ql\adjustright \fs20\cgrid \sbasedon0 \snext91 DescContinue 10;} +{\s91\li3960\widctlpar\ql\adjustright \fs20\cgrid \sbasedon0 \snext92 DescContinue 11;} +{\s92\li4320\widctlpar\ql\adjustright \fs20\cgrid \sbasedon0 \snext93 DescContinue 12;} +{\s93\li4680\widctlpar\ql\adjustright \fs20\cgrid \sbasedon0 \snext93 DescContinue 13;} +{\s100\li0\sa30\sb30\widctlpar\tqr\tldot\tx8640\adjustright \fs20\cgrid \sbasedon0 \snext101 LatexTOC 0;} +{\s101\li360\sa27\sb27\widctlpar\tqr\tldot\tx8640\adjustright \fs20\cgrid \sbasedon0 \snext102 LatexTOC 1;} +{\s102\li720\sa24\sb24\widctlpar\tqr\tldot\tx8640\adjustright \fs20\cgrid \sbasedon0 \snext103 LatexTOC 2;} +{\s103\li1080\sa21\sb21\widctlpar\tqr\tldot\tx8640\adjustright \fs20\cgrid \sbasedon0 \snext104 LatexTOC 3;} +{\s104\li1440\sa18\sb18\widctlpar\tqr\tldot\tx8640\adjustright \fs20\cgrid \sbasedon0 \snext105 LatexTOC 4;} +{\s105\li1800\sa15\sb15\widctlpar\tqr\tldot\tx8640\adjustright \fs20\cgrid \sbasedon0 \snext106 LatexTOC 5;} +{\s106\li2160\sa12\sb12\widctlpar\tqr\tldot\tx8640\adjustright \fs20\cgrid \sbasedon0 \snext107 LatexTOC 6;} +{\s107\li2520\sa9\sb9\widctlpar\tqr\tldot\tx8640\adjustright \fs20\cgrid \sbasedon0 \snext108 LatexTOC 7;} +{\s108\li2880\sa6\sb6\widctlpar\tqr\tldot\tx8640\adjustright \fs20\cgrid \sbasedon0 \snext109 LatexTOC 8;} +{\s109\li3240\sa3\sb3\widctlpar\tqr\tldot\tx8640\adjustright \fs20\cgrid \sbasedon0 \snext110 LatexTOC 9;} +{\s110\li3600\sa3\sb3\widctlpar\tqr\tldot\tx8640\adjustright \fs20\cgrid \sbasedon0 \snext111 LatexTOC 10;} +{\s111\li3960\sa3\sb3\widctlpar\tqr\tldot\tx8640\adjustright \fs20\cgrid \sbasedon0 \snext112 LatexTOC 11;} +{\s112\li4320\sa3\sb3\widctlpar\tqr\tldot\tx8640\adjustright \fs20\cgrid \sbasedon0 \snext113 LatexTOC 12;} +{\s113\li4680\sa3\sb3\widctlpar\tqr\tldot\tx8640\adjustright \fs20\cgrid \sbasedon0 \snext113 LatexTOC 13;} +{\s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid \sbasedon0 \snext121 \sautoupd List Bullet 0;} +{\s121\fi-360\li720\widctlpar\jclisttab\tx720{\*\pn \pnlvlbody\ilvl0\ls2\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid \sbasedon0 \snext122 \sautoupd List Bullet 1;} +{\s122\fi-360\li1080\widctlpar\jclisttab\tx1080{\*\pn \pnlvlbody\ilvl0\ls3\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid \sbasedon0 \snext123 \sautoupd List Bullet 2;} +{\s123\fi-360\li1440\widctlpar\jclisttab\tx1440{\*\pn \pnlvlbody\ilvl0\ls4\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid \sbasedon0 \snext124 \sautoupd List Bullet 3;} +{\s124\fi-360\li1800\widctlpar\jclisttab\tx1800{\*\pn \pnlvlbody\ilvl0\ls5\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid \sbasedon0 \snext125 \sautoupd List Bullet 4;} +{\s125\fi-360\li2160\widctlpar\jclisttab\tx2160{\*\pn \pnlvlbody\ilvl0\ls6\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid \sbasedon0 \snext126 \sautoupd List Bullet 5;} +{\s126\fi-360\li2520\widctlpar\jclisttab\tx2520{\*\pn \pnlvlbody\ilvl0\ls7\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid \sbasedon0 \snext127 \sautoupd List Bullet 6;} +{\s127\fi-360\li2880\widctlpar\jclisttab\tx2880{\*\pn \pnlvlbody\ilvl0\ls8\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid \sbasedon0 \snext128 \sautoupd List Bullet 7;} +{\s128\fi-360\li3240\widctlpar\jclisttab\tx3240{\*\pn \pnlvlbody\ilvl0\ls9\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid \sbasedon0 \snext129 \sautoupd List Bullet 8;} +{\s129\fi-360\li3600\widctlpar\jclisttab\tx3600{\*\pn \pnlvlbody\ilvl0\ls10\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid \sbasedon0 \snext130 \sautoupd List Bullet 9;} +{\s130\fi-360\li3960\widctlpar\jclisttab\tx3960{\*\pn \pnlvlbody\ilvl0\ls11\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid \sbasedon0 \snext131 \sautoupd List Bullet 10;} +{\s131\fi-360\li4320\widctlpar\jclisttab\tx4320{\*\pn \pnlvlbody\ilvl0\ls12\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid \sbasedon0 \snext132 \sautoupd List Bullet 11;} +{\s132\fi-360\li4680\widctlpar\jclisttab\tx4680{\*\pn \pnlvlbody\ilvl0\ls13\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid \sbasedon0 \snext133 \sautoupd List Bullet 12;} +{\s133\fi-360\li5040\widctlpar\jclisttab\tx5040{\*\pn \pnlvlbody\ilvl0\ls14\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid \sbasedon0 \snext133 \sautoupd List Bullet 13;} +{\s140\fi-360\li360\widctlpar\fs20\cgrid \sbasedon0 \snext141 \sautoupd List Enum 0;} +{\s141\fi-360\li720\widctlpar\fs20\cgrid \sbasedon0 \snext142 \sautoupd List Enum 1;} +{\s142\fi-360\li1080\widctlpar\fs20\cgrid \sbasedon0 \snext143 \sautoupd List Enum 2;} +{\s143\fi-360\li1440\widctlpar\fs20\cgrid \sbasedon0 \snext144 \sautoupd List Enum 3;} +{\s144\fi-360\li1800\widctlpar\fs20\cgrid \sbasedon0 \snext145 \sautoupd List Enum 4;} +{\s145\fi-360\li2160\widctlpar\fs20\cgrid \sbasedon0 \snext146 \sautoupd List Enum 5;} +{\s146\fi-360\li2520\widctlpar\fs20\cgrid \sbasedon0 \snext147 \sautoupd List Enum 6;} +{\s147\fi-360\li2880\widctlpar\fs20\cgrid \sbasedon0 \snext148 \sautoupd List Enum 7;} +{\s148\fi-360\li3240\widctlpar\fs20\cgrid \sbasedon0 \snext149 \sautoupd List Enum 8;} +{\s149\fi-360\li3600\widctlpar\fs20\cgrid \sbasedon0 \snext150 \sautoupd List Enum 9;} +{\s150\fi-360\li3960\widctlpar\fs20\cgrid \sbasedon0 \snext151 \sautoupd List Enum 10;} +{\s151\fi-360\li4320\widctlpar\fs20\cgrid \sbasedon0 \snext152 \sautoupd List Enum 11;} +{\s152\fi-360\li4680\widctlpar\fs20\cgrid \sbasedon0 \snext153 \sautoupd List Enum 12;} +{\s153\fi-360\li5040\widctlpar\fs20\cgrid \sbasedon0 \snext153 \sautoupd List Enum 13;} +} +{\comment begin body} +\pard\plain \s2\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs28\kerning28\cgrid +/tmp/github_reposRepoArchDocGenContext/Penify-dev/penify-cli Directory Reference\par \pard\plain +{\tc\tcl2 \v /tmp/github_reposRepoArchDocGenContext/Penify-dev/penify-cli Directory Reference} +{\xe \v /tmp/github_reposRepoArchDocGenContext/Penify-dev/penify-cli Directory Reference} +{\bkmkstart AAAAAAAAOY} +{\bkmkend AAAAAAAAOY} +\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid +Directories\par +\pard\plain + +{ +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +directory {\b docs}\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +directory {\b penify_hook}\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +directory {\b tests}\par +} +\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid +Files\par +\pard\plain + +{ +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +file {\b setup.py}\par +} +} \ No newline at end of file diff --git a/docs/rtf/dir_f88c3381c1861b3f7ca1f3d63cf244b5.rtf b/docs/rtf/dir_f88c3381c1861b3f7ca1f3d63cf244b5.rtf new file mode 100644 index 0000000..8874f23 --- /dev/null +++ b/docs/rtf/dir_f88c3381c1861b3f7ca1f3d63cf244b5.rtf @@ -0,0 +1,163 @@ +{\rtf1\ansi\ansicpg1252\uc1 \deff0\deflang1033\deflangfe1033 +{\fonttbl {\f0\froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;} +{\f1\fswiss\fcharset0\fprq2{\*\panose 020b0604020202020204}Arial;} +{\f2\fmodern\fcharset0\fprq1{\*\panose 02070309020205020404}Courier New;} +{\f3\froman\fcharset2\fprq2{\*\panose 05050102010706020507}Symbol;} +} +{\colortbl;\red0\green0\blue0;\red0\green0\blue255;\red0\green255\blue255;\red0\green255\blue0;\red255\green0\blue255;\red255\green0\blue0;\red255\green255\blue0;\red255\green255\blue255;\red0\green0\blue128;\red0\green128\blue128;\red0\green128\blue0;\red128\green0\blue128;\red128\green0\blue0;\red128\green128\blue0;\red128\green128\blue128;\red192\green192\blue192;\red0\green128\blue0;\red96\green64\blue32;\rede0\green128\blue0;\red128\green0\blue0;\red128\green96\blue32;\red0\green32\blue128;\red0\green128\blue128;\red255\green0\blue255;\red0\green0\blue0;\red112\green0\blue112;\red255\green0\blue0;} +{\stylesheet +{\widctlpar\adjustright \fs20\cgrid \snext0 Normal;} +{\paperw11900\paperh16840\margl1800\margr1800\margt1440\margb1440\gutter0\ltrsect} +{\s1\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs36\kerning36\cgrid \sbasedon0 \snext0 heading 1;} +{\s2\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs28\kerning28\cgrid \sbasedon0 \snext0 heading 2;} +{\s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid \sbasedon0 \snext0 heading 3;} +{\s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid \sbasedon0 \snext0 heading 4;}{\*\cs10 \additive Default Paragraph Font;} +{\s5\sb90\sa30\keepn\widctlpar\adjustright \b\f1\fs20\cgrid \sbasedon0 \snext0 heading 5;}{\*\cs10 \additive Default Paragraph Font;} +{\s15\qc\sb240\sa60\widctlpar\outlinelevel0\adjustright \b\f1\fs32\kerning28\cgrid \sbasedon0 \snext15 Title;} +{\s16\qc\sa60\widctlpar\outlinelevel1\adjustright \f1\cgrid \sbasedon0 \snext16 Subtitle;} +{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid \sbasedon0 \snext17 BodyText;} +{\s18\widctlpar\fs22\cgrid \sbasedon0 \snext18 DenseText;} +{\s28\widctlpar\tqc\tx4320\tqr\tx8640\adjustright \fs20\cgrid \sbasedon0 \snext28 header;} +{\s29\widctlpar\tqc\tx4320\tqr\tx8640\qr\adjustright \fs20\cgrid \sbasedon0 \snext29 footer;} +{\s30\li360\sa60\sb120\keepn\widctlpar\adjustright \b\f1\fs20\cgrid \sbasedon0 \snext30 GroupHeader;} +{\s40\li0\widctlpar\adjustright \shading1000\cbpat8 \f2\fs16\cgrid \sbasedon0 \snext41 Code Example 0;} +{\s41\li360\widctlpar\adjustright \shading1000\cbpat8 \f2\fs16\cgrid \sbasedon0 \snext42 Code Example 1;} +{\s42\li720\widctlpar\adjustright \shading1000\cbpat8 \f2\fs16\cgrid \sbasedon0 \snext43 Code Example 2;} +{\s43\li1080\widctlpar\adjustright \shading1000\cbpat8 \f2\fs16\cgrid \sbasedon0 \snext44 Code Example 3;} +{\s44\li1440\widctlpar\adjustright \shading1000\cbpat8 \f2\fs16\cgrid \sbasedon0 \snext45 Code Example 4;} +{\s45\li1800\widctlpar\adjustright \shading1000\cbpat8 \f2\fs16\cgrid \sbasedon0 \snext46 Code Example 5;} +{\s46\li2160\widctlpar\adjustright \shading1000\cbpat8 \f2\fs16\cgrid \sbasedon0 \snext47 Code Example 6;} +{\s47\li2520\widctlpar\adjustright \shading1000\cbpat8 \f2\fs16\cgrid \sbasedon0 \snext48 Code Example 7;} +{\s48\li2880\widctlpar\adjustright \shading1000\cbpat8 \f2\fs16\cgrid \sbasedon0 \snext49 Code Example 8;} +{\s49\li3240\widctlpar\adjustright \shading1000\cbpat8 \f2\fs16\cgrid \sbasedon0 \snext50 Code Example 9;} +{\s50\li3600\widctlpar\adjustright \shading1000\cbpat8 \f2\fs16\cgrid \sbasedon0 \snext51 Code Example 10;} +{\s51\li3960\widctlpar\adjustright \shading1000\cbpat8 \f2\fs16\cgrid \sbasedon0 \snext52 Code Example 11;} +{\s52\li4320\widctlpar\adjustright \shading1000\cbpat8 \f2\fs16\cgrid \sbasedon0 \snext53 Code Example 12;} +{\s53\li4680\widctlpar\adjustright \shading1000\cbpat8 \f2\fs16\cgrid \sbasedon0 \snext53 Code Example 13;} +{\s60\li0\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid \sbasedon0 \snext61 List Continue 0;} +{\s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid \sbasedon0 \snext62 List Continue 1;} +{\s62\li720\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid \sbasedon0 \snext63 List Continue 2;} +{\s63\li1080\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid \sbasedon0 \snext64 List Continue 3;} +{\s64\li1440\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid \sbasedon0 \snext65 List Continue 4;} +{\s65\li1800\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid \sbasedon0 \snext66 List Continue 5;} +{\s66\li2160\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid \sbasedon0 \snext67 List Continue 6;} +{\s67\li2520\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid \sbasedon0 \snext68 List Continue 7;} +{\s68\li2880\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid \sbasedon0 \snext69 List Continue 8;} +{\s69\li3240\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid \sbasedon0 \snext70 List Continue 9;} +{\s70\li3600\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid \sbasedon0 \snext71 List Continue 10;} +{\s71\li3960\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid \sbasedon0 \snext72 List Continue 11;} +{\s72\li4320\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid \sbasedon0 \snext73 List Continue 12;} +{\s73\li4680\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid \sbasedon0 \snext73 List Continue 13;} +{\s80\li0\widctlpar\ql\adjustright \fs20\cgrid \sbasedon0 \snext81 DescContinue 0;} +{\s81\li360\widctlpar\ql\adjustright \fs20\cgrid \sbasedon0 \snext82 DescContinue 1;} +{\s82\li720\widctlpar\ql\adjustright \fs20\cgrid \sbasedon0 \snext83 DescContinue 2;} +{\s83\li1080\widctlpar\ql\adjustright \fs20\cgrid \sbasedon0 \snext84 DescContinue 3;} +{\s84\li1440\widctlpar\ql\adjustright \fs20\cgrid \sbasedon0 \snext85 DescContinue 4;} +{\s85\li1800\widctlpar\ql\adjustright \fs20\cgrid \sbasedon0 \snext86 DescContinue 5;} +{\s86\li2160\widctlpar\ql\adjustright \fs20\cgrid \sbasedon0 \snext87 DescContinue 6;} +{\s87\li2520\widctlpar\ql\adjustright \fs20\cgrid \sbasedon0 \snext88 DescContinue 7;} +{\s88\li2880\widctlpar\ql\adjustright \fs20\cgrid \sbasedon0 \snext89 DescContinue 8;} +{\s89\li3240\widctlpar\ql\adjustright \fs20\cgrid \sbasedon0 \snext90 DescContinue 9;} +{\s90\li3600\widctlpar\ql\adjustright \fs20\cgrid \sbasedon0 \snext91 DescContinue 10;} +{\s91\li3960\widctlpar\ql\adjustright \fs20\cgrid \sbasedon0 \snext92 DescContinue 11;} +{\s92\li4320\widctlpar\ql\adjustright \fs20\cgrid \sbasedon0 \snext93 DescContinue 12;} +{\s93\li4680\widctlpar\ql\adjustright \fs20\cgrid \sbasedon0 \snext93 DescContinue 13;} +{\s100\li0\sa30\sb30\widctlpar\tqr\tldot\tx8640\adjustright \fs20\cgrid \sbasedon0 \snext101 LatexTOC 0;} +{\s101\li360\sa27\sb27\widctlpar\tqr\tldot\tx8640\adjustright \fs20\cgrid \sbasedon0 \snext102 LatexTOC 1;} +{\s102\li720\sa24\sb24\widctlpar\tqr\tldot\tx8640\adjustright \fs20\cgrid \sbasedon0 \snext103 LatexTOC 2;} +{\s103\li1080\sa21\sb21\widctlpar\tqr\tldot\tx8640\adjustright \fs20\cgrid \sbasedon0 \snext104 LatexTOC 3;} +{\s104\li1440\sa18\sb18\widctlpar\tqr\tldot\tx8640\adjustright \fs20\cgrid \sbasedon0 \snext105 LatexTOC 4;} +{\s105\li1800\sa15\sb15\widctlpar\tqr\tldot\tx8640\adjustright \fs20\cgrid \sbasedon0 \snext106 LatexTOC 5;} +{\s106\li2160\sa12\sb12\widctlpar\tqr\tldot\tx8640\adjustright \fs20\cgrid \sbasedon0 \snext107 LatexTOC 6;} +{\s107\li2520\sa9\sb9\widctlpar\tqr\tldot\tx8640\adjustright \fs20\cgrid \sbasedon0 \snext108 LatexTOC 7;} +{\s108\li2880\sa6\sb6\widctlpar\tqr\tldot\tx8640\adjustright \fs20\cgrid \sbasedon0 \snext109 LatexTOC 8;} +{\s109\li3240\sa3\sb3\widctlpar\tqr\tldot\tx8640\adjustright \fs20\cgrid \sbasedon0 \snext110 LatexTOC 9;} +{\s110\li3600\sa3\sb3\widctlpar\tqr\tldot\tx8640\adjustright \fs20\cgrid \sbasedon0 \snext111 LatexTOC 10;} +{\s111\li3960\sa3\sb3\widctlpar\tqr\tldot\tx8640\adjustright \fs20\cgrid \sbasedon0 \snext112 LatexTOC 11;} +{\s112\li4320\sa3\sb3\widctlpar\tqr\tldot\tx8640\adjustright \fs20\cgrid \sbasedon0 \snext113 LatexTOC 12;} +{\s113\li4680\sa3\sb3\widctlpar\tqr\tldot\tx8640\adjustright \fs20\cgrid \sbasedon0 \snext113 LatexTOC 13;} +{\s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid \sbasedon0 \snext121 \sautoupd List Bullet 0;} +{\s121\fi-360\li720\widctlpar\jclisttab\tx720{\*\pn \pnlvlbody\ilvl0\ls2\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid \sbasedon0 \snext122 \sautoupd List Bullet 1;} +{\s122\fi-360\li1080\widctlpar\jclisttab\tx1080{\*\pn \pnlvlbody\ilvl0\ls3\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid \sbasedon0 \snext123 \sautoupd List Bullet 2;} +{\s123\fi-360\li1440\widctlpar\jclisttab\tx1440{\*\pn \pnlvlbody\ilvl0\ls4\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid \sbasedon0 \snext124 \sautoupd List Bullet 3;} +{\s124\fi-360\li1800\widctlpar\jclisttab\tx1800{\*\pn \pnlvlbody\ilvl0\ls5\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid \sbasedon0 \snext125 \sautoupd List Bullet 4;} +{\s125\fi-360\li2160\widctlpar\jclisttab\tx2160{\*\pn \pnlvlbody\ilvl0\ls6\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid \sbasedon0 \snext126 \sautoupd List Bullet 5;} +{\s126\fi-360\li2520\widctlpar\jclisttab\tx2520{\*\pn \pnlvlbody\ilvl0\ls7\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid \sbasedon0 \snext127 \sautoupd List Bullet 6;} +{\s127\fi-360\li2880\widctlpar\jclisttab\tx2880{\*\pn \pnlvlbody\ilvl0\ls8\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid \sbasedon0 \snext128 \sautoupd List Bullet 7;} +{\s128\fi-360\li3240\widctlpar\jclisttab\tx3240{\*\pn \pnlvlbody\ilvl0\ls9\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid \sbasedon0 \snext129 \sautoupd List Bullet 8;} +{\s129\fi-360\li3600\widctlpar\jclisttab\tx3600{\*\pn \pnlvlbody\ilvl0\ls10\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid \sbasedon0 \snext130 \sautoupd List Bullet 9;} +{\s130\fi-360\li3960\widctlpar\jclisttab\tx3960{\*\pn \pnlvlbody\ilvl0\ls11\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid \sbasedon0 \snext131 \sautoupd List Bullet 10;} +{\s131\fi-360\li4320\widctlpar\jclisttab\tx4320{\*\pn \pnlvlbody\ilvl0\ls12\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid \sbasedon0 \snext132 \sautoupd List Bullet 11;} +{\s132\fi-360\li4680\widctlpar\jclisttab\tx4680{\*\pn \pnlvlbody\ilvl0\ls13\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid \sbasedon0 \snext133 \sautoupd List Bullet 12;} +{\s133\fi-360\li5040\widctlpar\jclisttab\tx5040{\*\pn \pnlvlbody\ilvl0\ls14\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid \sbasedon0 \snext133 \sautoupd List Bullet 13;} +{\s140\fi-360\li360\widctlpar\fs20\cgrid \sbasedon0 \snext141 \sautoupd List Enum 0;} +{\s141\fi-360\li720\widctlpar\fs20\cgrid \sbasedon0 \snext142 \sautoupd List Enum 1;} +{\s142\fi-360\li1080\widctlpar\fs20\cgrid \sbasedon0 \snext143 \sautoupd List Enum 2;} +{\s143\fi-360\li1440\widctlpar\fs20\cgrid \sbasedon0 \snext144 \sautoupd List Enum 3;} +{\s144\fi-360\li1800\widctlpar\fs20\cgrid \sbasedon0 \snext145 \sautoupd List Enum 4;} +{\s145\fi-360\li2160\widctlpar\fs20\cgrid \sbasedon0 \snext146 \sautoupd List Enum 5;} +{\s146\fi-360\li2520\widctlpar\fs20\cgrid \sbasedon0 \snext147 \sautoupd List Enum 6;} +{\s147\fi-360\li2880\widctlpar\fs20\cgrid \sbasedon0 \snext148 \sautoupd List Enum 7;} +{\s148\fi-360\li3240\widctlpar\fs20\cgrid \sbasedon0 \snext149 \sautoupd List Enum 8;} +{\s149\fi-360\li3600\widctlpar\fs20\cgrid \sbasedon0 \snext150 \sautoupd List Enum 9;} +{\s150\fi-360\li3960\widctlpar\fs20\cgrid \sbasedon0 \snext151 \sautoupd List Enum 10;} +{\s151\fi-360\li4320\widctlpar\fs20\cgrid \sbasedon0 \snext152 \sautoupd List Enum 11;} +{\s152\fi-360\li4680\widctlpar\fs20\cgrid \sbasedon0 \snext153 \sautoupd List Enum 12;} +{\s153\fi-360\li5040\widctlpar\fs20\cgrid \sbasedon0 \snext153 \sautoupd List Enum 13;} +} +{\comment begin body} +\pard\plain \s2\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs28\kerning28\cgrid +/tmp/github_reposRepoArchDocGenContext/Penify-dev/penify-cli/penify_hook Directory Reference\par \pard\plain +{\tc\tcl2 \v /tmp/github_reposRepoArchDocGenContext/Penify-dev/penify-cli/penify_hook Directory Reference} +{\xe \v /tmp/github_reposRepoArchDocGenContext/Penify-dev/penify-cli/penify_hook Directory Reference} +{\bkmkstart AAAAAAAAOZ} +{\bkmkend AAAAAAAAOZ} +Directory dependency graph for penify_hook:{ +\pard\plain +\par\pard \qc {\field\flddirty {\*\fldinst INCLUDEPICTURE "dir_f88c3381c1861b3f7ca1f3d63cf244b5_dep.svg" \\d \\*MERGEFORMAT}{\fldrslt IMAGE}}\par +} +\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid +Directories\par +\pard\plain + +{ +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +directory {\b commands}\par +} +\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid +Files\par +\pard\plain + +{ +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +file {\b __init__.py}\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +file {\b api_client.py}\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +file {\b base_analyzer.py}\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +file {\b commit_analyzer.py}\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +file {\b config_command.py}\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +file {\b constants.py}\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +file {\b file_analyzer.py}\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +file {\b folder_analyzer.py}\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +file {\b git_analyzer.py}\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +file {\b jira_client.py}\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +file {\b llm_client.py}\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +file {\b login_command.py}\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +file {\b main.py}\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +file {\b ui_utils.py}\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +file {\b utils.py}\par +} +} \ No newline at end of file diff --git a/docs/rtf/dir_f88c3381c1861b3f7ca1f3d63cf244b5_dep.md5 b/docs/rtf/dir_f88c3381c1861b3f7ca1f3d63cf244b5_dep.md5 new file mode 100644 index 0000000..577134d --- /dev/null +++ b/docs/rtf/dir_f88c3381c1861b3f7ca1f3d63cf244b5_dep.md5 @@ -0,0 +1 @@ +81055f3442546e3f091686cb9eef1bc5 \ No newline at end of file diff --git a/docs/rtf/dir_f88c3381c1861b3f7ca1f3d63cf244b5_dep.svg b/docs/rtf/dir_f88c3381c1861b3f7ca1f3d63cf244b5_dep.svg new file mode 100644 index 0000000..5b913db --- /dev/null +++ b/docs/rtf/dir_f88c3381c1861b3f7ca1f3d63cf244b5_dep.svg @@ -0,0 +1,42 @@ + + + + + + +/tmp/github_reposRepoArchDocGenContext/Penify-dev/penify-cli/penify_hook + + +clusterdir_b3b22d2ab7966b65f6b237e3231b41be + + +penify-cli + + + + +clusterdir_f88c3381c1861b3f7ca1f3d63cf244b5 + + + + + + + +dir_f88c3381c1861b3f7ca1f3d63cf244b5 +penify_hook + + + +dir_624fa2a8bce97f0444ac5cca335d4e23 + + +commands + + + + + diff --git a/docs/rtf/namespacepenify__hook_1_1commands_1_1auth__commands_a78f375c58bb6f69f98675e6a9ac84655_cgraph.md5 b/docs/rtf/namespacepenify__hook_1_1commands_1_1auth__commands_a78f375c58bb6f69f98675e6a9ac84655_cgraph.md5 new file mode 100644 index 0000000..3843ca4 --- /dev/null +++ b/docs/rtf/namespacepenify__hook_1_1commands_1_1auth__commands_a78f375c58bb6f69f98675e6a9ac84655_cgraph.md5 @@ -0,0 +1 @@ +8ad325585e8efe43cb16f6c7070d7d0a \ No newline at end of file diff --git a/docs/rtf/namespacepenify__hook_1_1commands_1_1auth__commands_a78f375c58bb6f69f98675e6a9ac84655_cgraph.svg b/docs/rtf/namespacepenify__hook_1_1commands_1_1auth__commands_a78f375c58bb6f69f98675e6a9ac84655_cgraph.svg new file mode 100644 index 0000000..7efc66a --- /dev/null +++ b/docs/rtf/namespacepenify__hook_1_1commands_1_1auth__commands_a78f375c58bb6f69f98675e6a9ac84655_cgraph.svg @@ -0,0 +1,61 @@ + + + + + + +penify_hook.commands.auth_commands.login + + + +Node1 + + +penify_hook.commands.auth +_commands.login + + + + + +Node2 + + +penify_hook.commands.auth +_commands.save_credentials + + + + + +Node1->Node2 + + + + + +Node3 + + +penify_hook.utils.recursive +_search_git_folder + + + + + +Node2->Node3 + + + + + +Node3->Node3 + + + + + diff --git a/docs/rtf/namespacepenify__hook_1_1commands_1_1auth__commands_a78f375c58bb6f69f98675e6a9ac84655_icgraph.md5 b/docs/rtf/namespacepenify__hook_1_1commands_1_1auth__commands_a78f375c58bb6f69f98675e6a9ac84655_icgraph.md5 new file mode 100644 index 0000000..a7db012 --- /dev/null +++ b/docs/rtf/namespacepenify__hook_1_1commands_1_1auth__commands_a78f375c58bb6f69f98675e6a9ac84655_icgraph.md5 @@ -0,0 +1 @@ +65e495614449516908c997067ca3d2d2 \ No newline at end of file diff --git a/docs/rtf/namespacepenify__hook_1_1commands_1_1auth__commands_a78f375c58bb6f69f98675e6a9ac84655_icgraph.svg b/docs/rtf/namespacepenify__hook_1_1commands_1_1auth__commands_a78f375c58bb6f69f98675e6a9ac84655_icgraph.svg new file mode 100644 index 0000000..42af25d --- /dev/null +++ b/docs/rtf/namespacepenify__hook_1_1commands_1_1auth__commands_a78f375c58bb6f69f98675e6a9ac84655_icgraph.svg @@ -0,0 +1,60 @@ + + + + + + +penify_hook.commands.auth_commands.login + + + +Node1 + + +penify_hook.commands.auth +_commands.login + + + + + +Node2 + + +penify_hook.login_command.handle +_login + + + + + +Node1->Node2 + + + + + +Node3 + + +penify_hook.main.main + + + + + +Node2->Node3 + + + + + +Node3->Node3 + + + + + diff --git a/docs/rtf/namespacepenify__hook_1_1commands_1_1auth__commands_aa3956ca1749d4218ea1dc6e5b6218b24_cgraph.md5 b/docs/rtf/namespacepenify__hook_1_1commands_1_1auth__commands_aa3956ca1749d4218ea1dc6e5b6218b24_cgraph.md5 new file mode 100644 index 0000000..17fadc1 --- /dev/null +++ b/docs/rtf/namespacepenify__hook_1_1commands_1_1auth__commands_aa3956ca1749d4218ea1dc6e5b6218b24_cgraph.md5 @@ -0,0 +1 @@ +31a51591f0a8f9ef897c4a08daac5829 \ No newline at end of file diff --git a/docs/rtf/namespacepenify__hook_1_1commands_1_1auth__commands_aa3956ca1749d4218ea1dc6e5b6218b24_cgraph.svg b/docs/rtf/namespacepenify__hook_1_1commands_1_1auth__commands_aa3956ca1749d4218ea1dc6e5b6218b24_cgraph.svg new file mode 100644 index 0000000..c94169d --- /dev/null +++ b/docs/rtf/namespacepenify__hook_1_1commands_1_1auth__commands_aa3956ca1749d4218ea1dc6e5b6218b24_cgraph.svg @@ -0,0 +1,45 @@ + + + + + + +penify_hook.commands.auth_commands.save_credentials + + + +Node1 + + +penify_hook.commands.auth +_commands.save_credentials + + + + + +Node2 + + +penify_hook.utils.recursive +_search_git_folder + + + + + +Node1->Node2 + + + + + +Node2->Node2 + + + + + diff --git a/docs/rtf/namespacepenify__hook_1_1commands_1_1auth__commands_aa3956ca1749d4218ea1dc6e5b6218b24_icgraph.md5 b/docs/rtf/namespacepenify__hook_1_1commands_1_1auth__commands_aa3956ca1749d4218ea1dc6e5b6218b24_icgraph.md5 new file mode 100644 index 0000000..051c10c --- /dev/null +++ b/docs/rtf/namespacepenify__hook_1_1commands_1_1auth__commands_aa3956ca1749d4218ea1dc6e5b6218b24_icgraph.md5 @@ -0,0 +1 @@ +ec7d7c899a70e1c68057353448e9a6d9 \ No newline at end of file diff --git a/docs/rtf/namespacepenify__hook_1_1commands_1_1auth__commands_aa3956ca1749d4218ea1dc6e5b6218b24_icgraph.svg b/docs/rtf/namespacepenify__hook_1_1commands_1_1auth__commands_aa3956ca1749d4218ea1dc6e5b6218b24_icgraph.svg new file mode 100644 index 0000000..9b6688c --- /dev/null +++ b/docs/rtf/namespacepenify__hook_1_1commands_1_1auth__commands_aa3956ca1749d4218ea1dc6e5b6218b24_icgraph.svg @@ -0,0 +1,76 @@ + + + + + + +penify_hook.commands.auth_commands.save_credentials + + + +Node1 + + +penify_hook.commands.auth +_commands.save_credentials + + + + + +Node2 + + +penify_hook.commands.auth +_commands.login + + + + + +Node1->Node2 + + + + + +Node3 + + +penify_hook.login_command.handle +_login + + + + + +Node2->Node3 + + + + + +Node4 + + +penify_hook.main.main + + + + + +Node3->Node4 + + + + + +Node4->Node4 + + + + + diff --git a/docs/rtf/namespacepenify__hook_1_1commands_1_1commit__commands_a62564c4e8ad59fc46d56cb0f9122a71a_cgraph.md5 b/docs/rtf/namespacepenify__hook_1_1commands_1_1commit__commands_a62564c4e8ad59fc46d56cb0f9122a71a_cgraph.md5 new file mode 100644 index 0000000..f0df322 --- /dev/null +++ b/docs/rtf/namespacepenify__hook_1_1commands_1_1commit__commands_a62564c4e8ad59fc46d56cb0f9122a71a_cgraph.md5 @@ -0,0 +1 @@ +ebbb356587ab923660dadd713f529935 \ No newline at end of file diff --git a/docs/rtf/namespacepenify__hook_1_1commands_1_1commit__commands_a62564c4e8ad59fc46d56cb0f9122a71a_cgraph.svg b/docs/rtf/namespacepenify__hook_1_1commands_1_1commit__commands_a62564c4e8ad59fc46d56cb0f9122a71a_cgraph.svg new file mode 100644 index 0000000..a8d9791 --- /dev/null +++ b/docs/rtf/namespacepenify__hook_1_1commands_1_1commit__commands_a62564c4e8ad59fc46d56cb0f9122a71a_cgraph.svg @@ -0,0 +1,139 @@ + + + + + + +penify_hook.commands.commit_commands.commit_code + + + +Node1 + + +penify_hook.commands.commit +_commands.commit_code + + + + + +Node2 + + +penify_hook.ui_utils.print +_error + + + + + +Node1->Node2 + + + + + +Node4 + + +penify_hook.ui_utils.print_info + + + + + +Node1->Node4 + + + + + +Node6 + + +penify_hook.ui_utils.print +_warning + + + + + +Node1->Node6 + + + + + +Node8 + + +penify_hook.utils.recursive +_search_git_folder + + + + + +Node1->Node8 + + + + + +Node3 + + +penify_hook.ui_utils.format +_error + + + + + +Node2->Node3 + + + + + +Node5 + + +penify_hook.ui_utils.format_info + + + + + +Node4->Node5 + + + + + +Node7 + + +penify_hook.ui_utils.format +_warning + + + + + +Node6->Node7 + + + + + +Node8->Node8 + + + + + diff --git a/docs/rtf/namespacepenify__hook_1_1commands_1_1commit__commands_a62564c4e8ad59fc46d56cb0f9122a71a_icgraph.md5 b/docs/rtf/namespacepenify__hook_1_1commands_1_1commit__commands_a62564c4e8ad59fc46d56cb0f9122a71a_icgraph.md5 new file mode 100644 index 0000000..30b2f36 --- /dev/null +++ b/docs/rtf/namespacepenify__hook_1_1commands_1_1commit__commands_a62564c4e8ad59fc46d56cb0f9122a71a_icgraph.md5 @@ -0,0 +1 @@ +b42af33551c96c0ccabd26bf5dac7901 \ No newline at end of file diff --git a/docs/rtf/namespacepenify__hook_1_1commands_1_1commit__commands_a62564c4e8ad59fc46d56cb0f9122a71a_icgraph.svg b/docs/rtf/namespacepenify__hook_1_1commands_1_1commit__commands_a62564c4e8ad59fc46d56cb0f9122a71a_icgraph.svg new file mode 100644 index 0000000..35f0b28 --- /dev/null +++ b/docs/rtf/namespacepenify__hook_1_1commands_1_1commit__commands_a62564c4e8ad59fc46d56cb0f9122a71a_icgraph.svg @@ -0,0 +1,146 @@ + + + + + + +penify_hook.commands.commit_commands.commit_code + + + +Node1 + + +penify_hook.commands.commit +_commands.commit_code + + + + + +Node2 + + +penify_hook.commands.commit +_commands.handle_commit + + + + + +Node1->Node2 + + + + + +Node5 + + +tests.test_commit_commands. +TestCommitCommands.test +_commit_code_error_handling + + + + + +Node1->Node5 + + + + + +Node6 + + +tests.test_commit_commands. +TestCommitCommands.test +_commit_code_with_jira_client + + + + + +Node1->Node6 + + + + + +Node7 + + +tests.test_commit_commands. +TestCommitCommands.test +_commit_code_with_jira_connection +_failure + + + + + +Node1->Node7 + + + + + +Node8 + + +tests.test_commit_commands. +TestCommitCommands.test +_commit_code_with_llm_client + + + + + +Node1->Node8 + + + + + +Node3 + + +penify_hook.main.main + + + + + +Node2->Node3 + + + + + +Node4 + + +tests.test_commit_commands. +TestCommitCommands.test +_handle_commit + + + + + +Node2->Node4 + + + + + +Node3->Node3 + + + + + diff --git a/docs/rtf/namespacepenify__hook_1_1commands_1_1commit__commands_a8627583116eb78e31a4d3cdc16d2f15c_icgraph.md5 b/docs/rtf/namespacepenify__hook_1_1commands_1_1commit__commands_a8627583116eb78e31a4d3cdc16d2f15c_icgraph.md5 new file mode 100644 index 0000000..c49ca59 --- /dev/null +++ b/docs/rtf/namespacepenify__hook_1_1commands_1_1commit__commands_a8627583116eb78e31a4d3cdc16d2f15c_icgraph.md5 @@ -0,0 +1 @@ +9d31c6bce57180d0019639c06f0a64c6 \ No newline at end of file diff --git a/docs/rtf/namespacepenify__hook_1_1commands_1_1commit__commands_a8627583116eb78e31a4d3cdc16d2f15c_icgraph.svg b/docs/rtf/namespacepenify__hook_1_1commands_1_1commit__commands_a8627583116eb78e31a4d3cdc16d2f15c_icgraph.svg new file mode 100644 index 0000000..fd13edd --- /dev/null +++ b/docs/rtf/namespacepenify__hook_1_1commands_1_1commit__commands_a8627583116eb78e31a4d3cdc16d2f15c_icgraph.svg @@ -0,0 +1,61 @@ + + + + + + +penify_hook.commands.commit_commands.setup_commit_parser + + + +Node1 + + +penify_hook.commands.commit +_commands.setup_commit_parser + + + + + +Node2 + + +penify_hook.main.main + + + + + +Node1->Node2 + + + + + +Node3 + + +tests.test_commit_commands. +TestCommitCommands.test +_setup_commit_parser + + + + + +Node1->Node3 + + + + + +Node2->Node2 + + + + + diff --git a/docs/rtf/namespacepenify__hook_1_1commands_1_1commit__commands_af4f739f524c38b437e4e47673d683e23_cgraph.md5 b/docs/rtf/namespacepenify__hook_1_1commands_1_1commit__commands_af4f739f524c38b437e4e47673d683e23_cgraph.md5 new file mode 100644 index 0000000..9c1af92 --- /dev/null +++ b/docs/rtf/namespacepenify__hook_1_1commands_1_1commit__commands_af4f739f524c38b437e4e47673d683e23_cgraph.md5 @@ -0,0 +1 @@ +76b990698c4e374b742a1a611bfd524b \ No newline at end of file diff --git a/docs/rtf/namespacepenify__hook_1_1commands_1_1commit__commands_af4f739f524c38b437e4e47673d683e23_cgraph.svg b/docs/rtf/namespacepenify__hook_1_1commands_1_1commit__commands_af4f739f524c38b437e4e47673d683e23_cgraph.svg new file mode 100644 index 0000000..9299eb7 --- /dev/null +++ b/docs/rtf/namespacepenify__hook_1_1commands_1_1commit__commands_af4f739f524c38b437e4e47673d683e23_cgraph.svg @@ -0,0 +1,300 @@ + + + + + + +penify_hook.commands.commit_commands.handle_commit + + + +Node1 + + +penify_hook.commands.commit +_commands.handle_commit + + + + + +Node2 + + +penify_hook.commands.commit +_commands.commit_code + + + + + +Node1->Node2 + + + + + +Node5 + + +penify_hook.ui_utils.print_info + + + + + +Node1->Node5 + + + + + +Node10 + + +penify_hook.commands.config +_commands.get_jira_config + + + + + +Node1->Node10 + + + + + +Node13 + + +penify_hook.commands.config +_commands.get_llm_config + + + + + +Node1->Node13 + + + + + +Node14 + + +penify_hook.commands.config +_commands.get_token + + + + + +Node1->Node14 + + + + + +Node3 + + +penify_hook.ui_utils.print +_error + + + + + +Node2->Node3 + + + + + +Node2->Node5 + + + + + +Node7 + + +penify_hook.ui_utils.print +_warning + + + + + +Node2->Node7 + + + + + +Node9 + + +penify_hook.utils.recursive +_search_git_folder + + + + + +Node2->Node9 + + + + + +Node4 + + +penify_hook.ui_utils.format +_error + + + + + +Node3->Node4 + + + + + +Node6 + + +penify_hook.ui_utils.format_info + + + + + +Node5->Node6 + + + + + +Node8 + + +penify_hook.ui_utils.format +_warning + + + + + +Node7->Node8 + + + + + +Node9->Node9 + + + + + +Node11 + + +penify_hook.commands.config +_commands.get_env_var_or +_default + + + + + +Node10->Node11 + + + + + +Node12 + + +penify_hook.commands.config +_commands.load_env_files + + + + + +Node10->Node12 + + + + + +Node12->Node9 + + + + + +Node12->Node12 + + + + + +Node13->Node11 + + + + + +Node13->Node12 + + + + + +Node14->Node11 + + + + + +Node14->Node12 + + + + + +Node15 + + +penify_hook.commands.config +_commands.get_penify_config + + + + + +Node14->Node15 + + + + + +Node15->Node9 + + + + + diff --git a/docs/rtf/namespacepenify__hook_1_1commands_1_1commit__commands_af4f739f524c38b437e4e47673d683e23_icgraph.md5 b/docs/rtf/namespacepenify__hook_1_1commands_1_1commit__commands_af4f739f524c38b437e4e47673d683e23_icgraph.md5 new file mode 100644 index 0000000..47a6cde --- /dev/null +++ b/docs/rtf/namespacepenify__hook_1_1commands_1_1commit__commands_af4f739f524c38b437e4e47673d683e23_icgraph.md5 @@ -0,0 +1 @@ +a8800179f1f560b476cc721ea33d08f7 \ No newline at end of file diff --git a/docs/rtf/namespacepenify__hook_1_1commands_1_1commit__commands_af4f739f524c38b437e4e47673d683e23_icgraph.svg b/docs/rtf/namespacepenify__hook_1_1commands_1_1commit__commands_af4f739f524c38b437e4e47673d683e23_icgraph.svg new file mode 100644 index 0000000..a93e9a1 --- /dev/null +++ b/docs/rtf/namespacepenify__hook_1_1commands_1_1commit__commands_af4f739f524c38b437e4e47673d683e23_icgraph.svg @@ -0,0 +1,61 @@ + + + + + + +penify_hook.commands.commit_commands.handle_commit + + + +Node1 + + +penify_hook.commands.commit +_commands.handle_commit + + + + + +Node2 + + +penify_hook.main.main + + + + + +Node1->Node2 + + + + + +Node3 + + +tests.test_commit_commands. +TestCommitCommands.test +_handle_commit + + + + + +Node1->Node3 + + + + + +Node2->Node2 + + + + + diff --git a/docs/rtf/namespacepenify__hook_1_1commands_1_1config__commands_a15bf3685c4dcb5c15ba6a4055e484cf2_cgraph.md5 b/docs/rtf/namespacepenify__hook_1_1commands_1_1config__commands_a15bf3685c4dcb5c15ba6a4055e484cf2_cgraph.md5 new file mode 100644 index 0000000..8a855e7 --- /dev/null +++ b/docs/rtf/namespacepenify__hook_1_1commands_1_1config__commands_a15bf3685c4dcb5c15ba6a4055e484cf2_cgraph.md5 @@ -0,0 +1 @@ +168858f3e9d4759f99db4c52c229e797 \ No newline at end of file diff --git a/docs/rtf/namespacepenify__hook_1_1commands_1_1config__commands_a15bf3685c4dcb5c15ba6a4055e484cf2_cgraph.svg b/docs/rtf/namespacepenify__hook_1_1commands_1_1config__commands_a15bf3685c4dcb5c15ba6a4055e484cf2_cgraph.svg new file mode 100644 index 0000000..cb6e77a --- /dev/null +++ b/docs/rtf/namespacepenify__hook_1_1commands_1_1config__commands_a15bf3685c4dcb5c15ba6a4055e484cf2_cgraph.svg @@ -0,0 +1,84 @@ + + + + + + +penify_hook.commands.config_commands.get_jira_config + + + +Node1 + + +penify_hook.commands.config +_commands.get_jira_config + + + + + +Node2 + + +penify_hook.commands.config +_commands.get_env_var_or +_default + + + + + +Node1->Node2 + + + + + +Node3 + + +penify_hook.commands.config +_commands.load_env_files + + + + + +Node1->Node3 + + + + + +Node3->Node3 + + + + + +Node4 + + +penify_hook.utils.recursive +_search_git_folder + + + + + +Node3->Node4 + + + + + +Node4->Node4 + + + + + diff --git a/docs/rtf/namespacepenify__hook_1_1commands_1_1config__commands_a15bf3685c4dcb5c15ba6a4055e484cf2_icgraph.md5 b/docs/rtf/namespacepenify__hook_1_1commands_1_1config__commands_a15bf3685c4dcb5c15ba6a4055e484cf2_icgraph.md5 new file mode 100644 index 0000000..3595ee0 --- /dev/null +++ b/docs/rtf/namespacepenify__hook_1_1commands_1_1config__commands_a15bf3685c4dcb5c15ba6a4055e484cf2_icgraph.md5 @@ -0,0 +1 @@ +543187d5c63c1c460ff6dd5d57c6a646 \ No newline at end of file diff --git a/docs/rtf/namespacepenify__hook_1_1commands_1_1config__commands_a15bf3685c4dcb5c15ba6a4055e484cf2_icgraph.svg b/docs/rtf/namespacepenify__hook_1_1commands_1_1config__commands_a15bf3685c4dcb5c15ba6a4055e484cf2_icgraph.svg new file mode 100644 index 0000000..1f7e932 --- /dev/null +++ b/docs/rtf/namespacepenify__hook_1_1commands_1_1config__commands_a15bf3685c4dcb5c15ba6a4055e484cf2_icgraph.svg @@ -0,0 +1,149 @@ + + + + + + +penify_hook.commands.config_commands.get_jira_config + + + +Node1 + + +penify_hook.commands.config +_commands.get_jira_config + + + + + +Node2 + + +penify_hook.commands.config +_commands.config_jira_web + + + + + +Node1->Node2 + + + + + +Node6 + + +penify_hook.commands.commit +_commands.handle_commit + + + + + +Node1->Node6 + + + + + +Node8 + + +tests.test_config_commands. +TestConfigCommands.test +_get_jira_config_exists + + + + + +Node1->Node8 + + + + + +Node3 + + +penify_hook.config +_command.handle_config + + + + + +Node2->Node3 + + + + + +Node5 + + +tests.test_web_config.Test +WebConfig.test_config_jira +_web_server_setup + + + + + +Node2->Node5 + + + + + +Node4 + + +penify_hook.main.main + + + + + +Node3->Node4 + + + + + +Node4->Node4 + + + + + +Node6->Node4 + + + + + +Node7 + + +tests.test_commit_commands. +TestCommitCommands.test +_handle_commit + + + + + +Node6->Node7 + + + + + diff --git a/docs/rtf/namespacepenify__hook_1_1commands_1_1config__commands_a185dfc34a655ed80e6c95939b6f3c35c_icgraph.md5 b/docs/rtf/namespacepenify__hook_1_1commands_1_1config__commands_a185dfc34a655ed80e6c95939b6f3c35c_icgraph.md5 new file mode 100644 index 0000000..fd6eb21 --- /dev/null +++ b/docs/rtf/namespacepenify__hook_1_1commands_1_1config__commands_a185dfc34a655ed80e6c95939b6f3c35c_icgraph.md5 @@ -0,0 +1 @@ +91a6c2c6a25f3c8c1d38cd6f5f5c3f25 \ No newline at end of file diff --git a/docs/rtf/namespacepenify__hook_1_1commands_1_1config__commands_a185dfc34a655ed80e6c95939b6f3c35c_icgraph.svg b/docs/rtf/namespacepenify__hook_1_1commands_1_1config__commands_a185dfc34a655ed80e6c95939b6f3c35c_icgraph.svg new file mode 100644 index 0000000..15152bf --- /dev/null +++ b/docs/rtf/namespacepenify__hook_1_1commands_1_1config__commands_a185dfc34a655ed80e6c95939b6f3c35c_icgraph.svg @@ -0,0 +1,77 @@ + + + + + + +penify_hook.commands.config_commands.config_llm_web + + + +Node1 + + +penify_hook.commands.config +_commands.config_llm_web + + + + + +Node2 + + +penify_hook.config +_command.handle_config + + + + + +Node1->Node2 + + + + + +Node4 + + +tests.test_web_config.Test +WebConfig.test_config_llm +_web_server_setup + + + + + +Node1->Node4 + + + + + +Node3 + + +penify_hook.main.main + + + + + +Node2->Node3 + + + + + +Node3->Node3 + + + + + diff --git a/docs/rtf/namespacepenify__hook_1_1commands_1_1config__commands_a3caf2b062dd33b1f1d7ddc7224f0ff87_icgraph.md5 b/docs/rtf/namespacepenify__hook_1_1commands_1_1config__commands_a3caf2b062dd33b1f1d7ddc7224f0ff87_icgraph.md5 new file mode 100644 index 0000000..f9c067a --- /dev/null +++ b/docs/rtf/namespacepenify__hook_1_1commands_1_1config__commands_a3caf2b062dd33b1f1d7ddc7224f0ff87_icgraph.md5 @@ -0,0 +1 @@ +78a315f2a9f5ef12496dc5b4a1f2f578 \ No newline at end of file diff --git a/docs/rtf/namespacepenify__hook_1_1commands_1_1config__commands_a3caf2b062dd33b1f1d7ddc7224f0ff87_icgraph.svg b/docs/rtf/namespacepenify__hook_1_1commands_1_1config__commands_a3caf2b062dd33b1f1d7ddc7224f0ff87_icgraph.svg new file mode 100644 index 0000000..2575f6a --- /dev/null +++ b/docs/rtf/namespacepenify__hook_1_1commands_1_1config__commands_a3caf2b062dd33b1f1d7ddc7224f0ff87_icgraph.svg @@ -0,0 +1,398 @@ + + + + + + +penify_hook.commands.config_commands.get_env_var_or_default + + + +Node1 + + +penify_hook.commands.config +_commands.get_env_var_or +_default + + + + + +Node2 + + +penify_hook.commands.config +_commands.get_jira_config + + + + + +Node1->Node2 + + + + + +Node10 + + +penify_hook.commands.config +_commands.get_llm_config + + + + + +Node1->Node10 + + + + + +Node14 + + +penify_hook.commands.config +_commands.get_token + + + + + +Node1->Node14 + + + + + +Node3 + + +penify_hook.commands.config +_commands.config_jira_web + + + + + +Node2->Node3 + + + + + +Node7 + + +penify_hook.commands.commit +_commands.handle_commit + + + + + +Node2->Node7 + + + + + +Node9 + + +tests.test_config_commands. +TestConfigCommands.test +_get_jira_config_exists + + + + + +Node2->Node9 + + + + + +Node4 + + +penify_hook.config +_command.handle_config + + + + + +Node3->Node4 + + + + + +Node6 + + +tests.test_web_config.Test +WebConfig.test_config_jira +_web_server_setup + + + + + +Node3->Node6 + + + + + +Node5 + + +penify_hook.main.main + + + + + +Node4->Node5 + + + + + +Node5->Node5 + + + + + +Node7->Node5 + + + + + +Node8 + + +tests.test_commit_commands. +TestCommitCommands.test +_handle_commit + + + + + +Node7->Node8 + + + + + +Node10->Node7 + + + + + +Node11 + + +tests.test_config_commands. +TestConfigCommands.test +_get_llm_config_empty + + + + + +Node10->Node11 + + + + + +Node12 + + +tests.test_config_commands. +TestConfigCommands.test +_get_llm_config_exists + + + + + +Node10->Node12 + + + + + +Node13 + + +tests.test_config_commands. +TestConfigCommands.test +_get_llm_config_invalid_json + + + + + +Node10->Node13 + + + + + +Node14->Node7 + + + + + +Node15 + + +penify_hook.commands.doc +_commands.handle_docgen + + + + + +Node14->Node15 + + + + + +Node20 + + +tests.test_config_commands. +TestConfigCommands.test +_get_token_from_config + + + + + +Node14->Node20 + + + + + +Node21 + + +tests.test_config_commands. +TestConfigCommands.test +_get_token_from_env + + + + + +Node14->Node21 + + + + + +Node22 + + +tests.test_config_commands. +TestConfigCommands.test +_get_token_not_found + + + + + +Node14->Node22 + + + + + +Node15->Node5 + + + + + +Node16 + + +tests.test_doc_commands.test +_handle_docgen_generate + + + + + +Node15->Node16 + + + + + +Node17 + + +tests.test_doc_commands.test +_handle_docgen_install_hook + + + + + +Node15->Node17 + + + + + +Node18 + + +tests.test_doc_commands.test +_handle_docgen_no_token + + + + + +Node15->Node18 + + + + + +Node19 + + +tests.test_doc_commands.test +_handle_docgen_uninstall_hook + + + + + +Node15->Node19 + + + + + diff --git a/docs/rtf/namespacepenify__hook_1_1commands_1_1config__commands_a4617bc5956e502c9555dc0dda0376df4_cgraph.md5 b/docs/rtf/namespacepenify__hook_1_1commands_1_1config__commands_a4617bc5956e502c9555dc0dda0376df4_cgraph.md5 new file mode 100644 index 0000000..1d6bd9c --- /dev/null +++ b/docs/rtf/namespacepenify__hook_1_1commands_1_1config__commands_a4617bc5956e502c9555dc0dda0376df4_cgraph.md5 @@ -0,0 +1 @@ +1312bc7ffa0a3c4b3d914591e46647ea \ No newline at end of file diff --git a/docs/rtf/namespacepenify__hook_1_1commands_1_1config__commands_a4617bc5956e502c9555dc0dda0376df4_cgraph.svg b/docs/rtf/namespacepenify__hook_1_1commands_1_1config__commands_a4617bc5956e502c9555dc0dda0376df4_cgraph.svg new file mode 100644 index 0000000..b5caeb1 --- /dev/null +++ b/docs/rtf/namespacepenify__hook_1_1commands_1_1config__commands_a4617bc5956e502c9555dc0dda0376df4_cgraph.svg @@ -0,0 +1,45 @@ + + + + + + +penify_hook.commands.config_commands.save_llm_config + + + +Node1 + + +penify_hook.commands.config +_commands.save_llm_config + + + + + +Node2 + + +penify_hook.utils.recursive +_search_git_folder + + + + + +Node1->Node2 + + + + + +Node2->Node2 + + + + + diff --git a/docs/rtf/namespacepenify__hook_1_1commands_1_1config__commands_a4617bc5956e502c9555dc0dda0376df4_icgraph.md5 b/docs/rtf/namespacepenify__hook_1_1commands_1_1config__commands_a4617bc5956e502c9555dc0dda0376df4_icgraph.md5 new file mode 100644 index 0000000..4427799 --- /dev/null +++ b/docs/rtf/namespacepenify__hook_1_1commands_1_1config__commands_a4617bc5956e502c9555dc0dda0376df4_icgraph.md5 @@ -0,0 +1 @@ +64e3e5d1614b987e9beaa7b1002e49e6 \ No newline at end of file diff --git a/docs/rtf/namespacepenify__hook_1_1commands_1_1config__commands_a4617bc5956e502c9555dc0dda0376df4_icgraph.svg b/docs/rtf/namespacepenify__hook_1_1commands_1_1config__commands_a4617bc5956e502c9555dc0dda0376df4_icgraph.svg new file mode 100644 index 0000000..a6fab0f --- /dev/null +++ b/docs/rtf/namespacepenify__hook_1_1commands_1_1config__commands_a4617bc5956e502c9555dc0dda0376df4_icgraph.svg @@ -0,0 +1,94 @@ + + + + + + +penify_hook.commands.config_commands.save_llm_config + + + +Node1 + + +penify_hook.commands.config +_commands.save_llm_config + + + + + +Node2 + + +penify_hook.config +_command.handle_config + + + + + +Node1->Node2 + + + + + +Node4 + + +tests.test_config_commands. +TestConfigCommands.test +_save_llm_config_failure + + + + + +Node1->Node4 + + + + + +Node5 + + +tests.test_config_commands. +TestConfigCommands.test +_save_llm_config_success + + + + + +Node1->Node5 + + + + + +Node3 + + +penify_hook.main.main + + + + + +Node2->Node3 + + + + + +Node3->Node3 + + + + + diff --git a/docs/rtf/namespacepenify__hook_1_1commands_1_1config__commands_a5503d51c905e2f1b299b12d2a73bd812_cgraph.md5 b/docs/rtf/namespacepenify__hook_1_1commands_1_1config__commands_a5503d51c905e2f1b299b12d2a73bd812_cgraph.md5 new file mode 100644 index 0000000..47f24a6 --- /dev/null +++ b/docs/rtf/namespacepenify__hook_1_1commands_1_1config__commands_a5503d51c905e2f1b299b12d2a73bd812_cgraph.md5 @@ -0,0 +1 @@ +e227b3587529f3c7fa14501fb496ccc8 \ No newline at end of file diff --git a/docs/rtf/namespacepenify__hook_1_1commands_1_1config__commands_a5503d51c905e2f1b299b12d2a73bd812_cgraph.svg b/docs/rtf/namespacepenify__hook_1_1commands_1_1config__commands_a5503d51c905e2f1b299b12d2a73bd812_cgraph.svg new file mode 100644 index 0000000..036847e --- /dev/null +++ b/docs/rtf/namespacepenify__hook_1_1commands_1_1config__commands_a5503d51c905e2f1b299b12d2a73bd812_cgraph.svg @@ -0,0 +1,106 @@ + + + + + + +penify_hook.commands.config_commands.get_token + + + +Node1 + + +penify_hook.commands.config +_commands.get_token + + + + + +Node2 + + +penify_hook.commands.config +_commands.get_env_var_or +_default + + + + + +Node1->Node2 + + + + + +Node3 + + +penify_hook.commands.config +_commands.get_penify_config + + + + + +Node1->Node3 + + + + + +Node5 + + +penify_hook.commands.config +_commands.load_env_files + + + + + +Node1->Node5 + + + + + +Node4 + + +penify_hook.utils.recursive +_search_git_folder + + + + + +Node3->Node4 + + + + + +Node4->Node4 + + + + + +Node5->Node4 + + + + + +Node5->Node5 + + + + + diff --git a/docs/rtf/namespacepenify__hook_1_1commands_1_1config__commands_a5503d51c905e2f1b299b12d2a73bd812_icgraph.md5 b/docs/rtf/namespacepenify__hook_1_1commands_1_1config__commands_a5503d51c905e2f1b299b12d2a73bd812_icgraph.md5 new file mode 100644 index 0000000..5a5a866 --- /dev/null +++ b/docs/rtf/namespacepenify__hook_1_1commands_1_1config__commands_a5503d51c905e2f1b299b12d2a73bd812_icgraph.md5 @@ -0,0 +1 @@ +9c6b048bd5412b617ea890b1f88c2104 \ No newline at end of file diff --git a/docs/rtf/namespacepenify__hook_1_1commands_1_1config__commands_a5503d51c905e2f1b299b12d2a73bd812_icgraph.svg b/docs/rtf/namespacepenify__hook_1_1commands_1_1config__commands_a5503d51c905e2f1b299b12d2a73bd812_icgraph.svg new file mode 100644 index 0000000..0a189a5 --- /dev/null +++ b/docs/rtf/namespacepenify__hook_1_1commands_1_1config__commands_a5503d51c905e2f1b299b12d2a73bd812_icgraph.svg @@ -0,0 +1,214 @@ + + + + + + +penify_hook.commands.config_commands.get_token + + + +Node1 + + +penify_hook.commands.config +_commands.get_token + + + + + +Node2 + + +penify_hook.commands.commit +_commands.handle_commit + + + + + +Node1->Node2 + + + + + +Node5 + + +penify_hook.commands.doc +_commands.handle_docgen + + + + + +Node1->Node5 + + + + + +Node10 + + +tests.test_config_commands. +TestConfigCommands.test +_get_token_from_config + + + + + +Node1->Node10 + + + + + +Node11 + + +tests.test_config_commands. +TestConfigCommands.test +_get_token_from_env + + + + + +Node1->Node11 + + + + + +Node12 + + +tests.test_config_commands. +TestConfigCommands.test +_get_token_not_found + + + + + +Node1->Node12 + + + + + +Node3 + + +penify_hook.main.main + + + + + +Node2->Node3 + + + + + +Node4 + + +tests.test_commit_commands. +TestCommitCommands.test +_handle_commit + + + + + +Node2->Node4 + + + + + +Node3->Node3 + + + + + +Node5->Node3 + + + + + +Node6 + + +tests.test_doc_commands.test +_handle_docgen_generate + + + + + +Node5->Node6 + + + + + +Node7 + + +tests.test_doc_commands.test +_handle_docgen_install_hook + + + + + +Node5->Node7 + + + + + +Node8 + + +tests.test_doc_commands.test +_handle_docgen_no_token + + + + + +Node5->Node8 + + + + + +Node9 + + +tests.test_doc_commands.test +_handle_docgen_uninstall_hook + + + + + +Node5->Node9 + + + + + diff --git a/docs/rtf/namespacepenify__hook_1_1commands_1_1config__commands_a6492bc8e7df6e38bb06ad05e572d4cc0_cgraph.md5 b/docs/rtf/namespacepenify__hook_1_1commands_1_1config__commands_a6492bc8e7df6e38bb06ad05e572d4cc0_cgraph.md5 new file mode 100644 index 0000000..c4b9ce2 --- /dev/null +++ b/docs/rtf/namespacepenify__hook_1_1commands_1_1config__commands_a6492bc8e7df6e38bb06ad05e572d4cc0_cgraph.md5 @@ -0,0 +1 @@ +67c138c843a1f5d8ab7592c326643328 \ No newline at end of file diff --git a/docs/rtf/namespacepenify__hook_1_1commands_1_1config__commands_a6492bc8e7df6e38bb06ad05e572d4cc0_cgraph.svg b/docs/rtf/namespacepenify__hook_1_1commands_1_1config__commands_a6492bc8e7df6e38bb06ad05e572d4cc0_cgraph.svg new file mode 100644 index 0000000..4cb30cf --- /dev/null +++ b/docs/rtf/namespacepenify__hook_1_1commands_1_1config__commands_a6492bc8e7df6e38bb06ad05e572d4cc0_cgraph.svg @@ -0,0 +1,84 @@ + + + + + + +penify_hook.commands.config_commands.get_llm_config + + + +Node1 + + +penify_hook.commands.config +_commands.get_llm_config + + + + + +Node2 + + +penify_hook.commands.config +_commands.get_env_var_or +_default + + + + + +Node1->Node2 + + + + + +Node3 + + +penify_hook.commands.config +_commands.load_env_files + + + + + +Node1->Node3 + + + + + +Node3->Node3 + + + + + +Node4 + + +penify_hook.utils.recursive +_search_git_folder + + + + + +Node3->Node4 + + + + + +Node4->Node4 + + + + + diff --git a/docs/rtf/namespacepenify__hook_1_1commands_1_1config__commands_a6492bc8e7df6e38bb06ad05e572d4cc0_icgraph.md5 b/docs/rtf/namespacepenify__hook_1_1commands_1_1config__commands_a6492bc8e7df6e38bb06ad05e572d4cc0_icgraph.md5 new file mode 100644 index 0000000..280df61 --- /dev/null +++ b/docs/rtf/namespacepenify__hook_1_1commands_1_1config__commands_a6492bc8e7df6e38bb06ad05e572d4cc0_icgraph.md5 @@ -0,0 +1 @@ +32e055c0ae757bbecf2b86db164d29df \ No newline at end of file diff --git a/docs/rtf/namespacepenify__hook_1_1commands_1_1config__commands_a6492bc8e7df6e38bb06ad05e572d4cc0_icgraph.svg b/docs/rtf/namespacepenify__hook_1_1commands_1_1config__commands_a6492bc8e7df6e38bb06ad05e572d4cc0_icgraph.svg new file mode 100644 index 0000000..89ccd03 --- /dev/null +++ b/docs/rtf/namespacepenify__hook_1_1commands_1_1config__commands_a6492bc8e7df6e38bb06ad05e572d4cc0_icgraph.svg @@ -0,0 +1,128 @@ + + + + + + +penify_hook.commands.config_commands.get_llm_config + + + +Node1 + + +penify_hook.commands.config +_commands.get_llm_config + + + + + +Node2 + + +penify_hook.commands.commit +_commands.handle_commit + + + + + +Node1->Node2 + + + + + +Node5 + + +tests.test_config_commands. +TestConfigCommands.test +_get_llm_config_empty + + + + + +Node1->Node5 + + + + + +Node6 + + +tests.test_config_commands. +TestConfigCommands.test +_get_llm_config_exists + + + + + +Node1->Node6 + + + + + +Node7 + + +tests.test_config_commands. +TestConfigCommands.test +_get_llm_config_invalid_json + + + + + +Node1->Node7 + + + + + +Node3 + + +penify_hook.main.main + + + + + +Node2->Node3 + + + + + +Node4 + + +tests.test_commit_commands. +TestCommitCommands.test +_handle_commit + + + + + +Node2->Node4 + + + + + +Node3->Node3 + + + + + diff --git a/docs/rtf/namespacepenify__hook_1_1commands_1_1config__commands_a6559a82d0bf727703d550d1003d3ed20_cgraph.md5 b/docs/rtf/namespacepenify__hook_1_1commands_1_1config__commands_a6559a82d0bf727703d550d1003d3ed20_cgraph.md5 new file mode 100644 index 0000000..6643612 --- /dev/null +++ b/docs/rtf/namespacepenify__hook_1_1commands_1_1config__commands_a6559a82d0bf727703d550d1003d3ed20_cgraph.md5 @@ -0,0 +1 @@ +69777adad7caeabd935b90d3f0ca21e8 \ No newline at end of file diff --git a/docs/rtf/namespacepenify__hook_1_1commands_1_1config__commands_a6559a82d0bf727703d550d1003d3ed20_cgraph.svg b/docs/rtf/namespacepenify__hook_1_1commands_1_1config__commands_a6559a82d0bf727703d550d1003d3ed20_cgraph.svg new file mode 100644 index 0000000..c7e939c --- /dev/null +++ b/docs/rtf/namespacepenify__hook_1_1commands_1_1config__commands_a6559a82d0bf727703d550d1003d3ed20_cgraph.svg @@ -0,0 +1,45 @@ + + + + + + +penify_hook.commands.config_commands.get_penify_config + + + +Node1 + + +penify_hook.commands.config +_commands.get_penify_config + + + + + +Node2 + + +penify_hook.utils.recursive +_search_git_folder + + + + + +Node1->Node2 + + + + + +Node2->Node2 + + + + + diff --git a/docs/rtf/namespacepenify__hook_1_1commands_1_1config__commands_a6559a82d0bf727703d550d1003d3ed20_icgraph.md5 b/docs/rtf/namespacepenify__hook_1_1commands_1_1config__commands_a6559a82d0bf727703d550d1003d3ed20_icgraph.md5 new file mode 100644 index 0000000..3e643ef --- /dev/null +++ b/docs/rtf/namespacepenify__hook_1_1commands_1_1config__commands_a6559a82d0bf727703d550d1003d3ed20_icgraph.md5 @@ -0,0 +1 @@ +4f8f2c5d878438fd8fa2e1f0ca1dbc52 \ No newline at end of file diff --git a/docs/rtf/namespacepenify__hook_1_1commands_1_1config__commands_a6559a82d0bf727703d550d1003d3ed20_icgraph.svg b/docs/rtf/namespacepenify__hook_1_1commands_1_1config__commands_a6559a82d0bf727703d550d1003d3ed20_icgraph.svg new file mode 100644 index 0000000..150e9b7 --- /dev/null +++ b/docs/rtf/namespacepenify__hook_1_1commands_1_1config__commands_a6559a82d0bf727703d550d1003d3ed20_icgraph.svg @@ -0,0 +1,264 @@ + + + + + + +penify_hook.commands.config_commands.get_penify_config + + + +Node1 + + +penify_hook.commands.config +_commands.get_penify_config + + + + + +Node2 + + +penify_hook.commands.config +_commands.get_token + + + + + +Node1->Node2 + + + + + +Node14 + + +tests.test_config_commands. +TestConfigCommands.test +_get_penify_config_existing_dir + + + + + +Node1->Node14 + + + + + +Node15 + + +tests.test_config_commands. +TestConfigCommands.test +_get_penify_config_new_dir + + + + + +Node1->Node15 + + + + + +Node3 + + +penify_hook.commands.commit +_commands.handle_commit + + + + + +Node2->Node3 + + + + + +Node6 + + +penify_hook.commands.doc +_commands.handle_docgen + + + + + +Node2->Node6 + + + + + +Node11 + + +tests.test_config_commands. +TestConfigCommands.test +_get_token_from_config + + + + + +Node2->Node11 + + + + + +Node12 + + +tests.test_config_commands. +TestConfigCommands.test +_get_token_from_env + + + + + +Node2->Node12 + + + + + +Node13 + + +tests.test_config_commands. +TestConfigCommands.test +_get_token_not_found + + + + + +Node2->Node13 + + + + + +Node4 + + +penify_hook.main.main + + + + + +Node3->Node4 + + + + + +Node5 + + +tests.test_commit_commands. +TestCommitCommands.test +_handle_commit + + + + + +Node3->Node5 + + + + + +Node4->Node4 + + + + + +Node6->Node4 + + + + + +Node7 + + +tests.test_doc_commands.test +_handle_docgen_generate + + + + + +Node6->Node7 + + + + + +Node8 + + +tests.test_doc_commands.test +_handle_docgen_install_hook + + + + + +Node6->Node8 + + + + + +Node9 + + +tests.test_doc_commands.test +_handle_docgen_no_token + + + + + +Node6->Node9 + + + + + +Node10 + + +tests.test_doc_commands.test +_handle_docgen_uninstall_hook + + + + + +Node6->Node10 + + + + + diff --git a/docs/rtf/namespacepenify__hook_1_1commands_1_1config__commands_aabe277132ce0bc0aacef951cf1dee2ae_cgraph.md5 b/docs/rtf/namespacepenify__hook_1_1commands_1_1config__commands_aabe277132ce0bc0aacef951cf1dee2ae_cgraph.md5 new file mode 100644 index 0000000..26009b0 --- /dev/null +++ b/docs/rtf/namespacepenify__hook_1_1commands_1_1config__commands_aabe277132ce0bc0aacef951cf1dee2ae_cgraph.md5 @@ -0,0 +1 @@ +91b1c0b60f8171163e43b782cfdc5e4b \ No newline at end of file diff --git a/docs/rtf/namespacepenify__hook_1_1commands_1_1config__commands_aabe277132ce0bc0aacef951cf1dee2ae_cgraph.svg b/docs/rtf/namespacepenify__hook_1_1commands_1_1config__commands_aabe277132ce0bc0aacef951cf1dee2ae_cgraph.svg new file mode 100644 index 0000000..1c3e84e --- /dev/null +++ b/docs/rtf/namespacepenify__hook_1_1commands_1_1config__commands_aabe277132ce0bc0aacef951cf1dee2ae_cgraph.svg @@ -0,0 +1,51 @@ + + + + + + +penify_hook.commands.config_commands.load_env_files + + + +Node1 + + +penify_hook.commands.config +_commands.load_env_files + + + + + +Node1->Node1 + + + + + +Node2 + + +penify_hook.utils.recursive +_search_git_folder + + + + + +Node1->Node2 + + + + + +Node2->Node2 + + + + + diff --git a/docs/rtf/namespacepenify__hook_1_1commands_1_1config__commands_aabe277132ce0bc0aacef951cf1dee2ae_icgraph.md5 b/docs/rtf/namespacepenify__hook_1_1commands_1_1config__commands_aabe277132ce0bc0aacef951cf1dee2ae_icgraph.md5 new file mode 100644 index 0000000..a2245b9 --- /dev/null +++ b/docs/rtf/namespacepenify__hook_1_1commands_1_1config__commands_aabe277132ce0bc0aacef951cf1dee2ae_icgraph.md5 @@ -0,0 +1 @@ +e208c1be2bea05a2824626f2971c2bf3 \ No newline at end of file diff --git a/docs/rtf/namespacepenify__hook_1_1commands_1_1config__commands_aabe277132ce0bc0aacef951cf1dee2ae_icgraph.svg b/docs/rtf/namespacepenify__hook_1_1commands_1_1config__commands_aabe277132ce0bc0aacef951cf1dee2ae_icgraph.svg new file mode 100644 index 0000000..5f08f28 --- /dev/null +++ b/docs/rtf/namespacepenify__hook_1_1commands_1_1config__commands_aabe277132ce0bc0aacef951cf1dee2ae_icgraph.svg @@ -0,0 +1,403 @@ + + + + + + +penify_hook.commands.config_commands.load_env_files + + + +Node1 + + +penify_hook.commands.config +_commands.load_env_files + + + + + +Node1->Node1 + + + + + +Node2 + + +penify_hook.commands.config +_commands.get_jira_config + + + + + +Node1->Node2 + + + + + +Node10 + + +penify_hook.commands.config +_commands.get_llm_config + + + + + +Node1->Node10 + + + + + +Node14 + + +penify_hook.commands.config +_commands.get_token + + + + + +Node1->Node14 + + + + + +Node3 + + +penify_hook.commands.config +_commands.config_jira_web + + + + + +Node2->Node3 + + + + + +Node7 + + +penify_hook.commands.commit +_commands.handle_commit + + + + + +Node2->Node7 + + + + + +Node9 + + +tests.test_config_commands. +TestConfigCommands.test +_get_jira_config_exists + + + + + +Node2->Node9 + + + + + +Node4 + + +penify_hook.config +_command.handle_config + + + + + +Node3->Node4 + + + + + +Node6 + + +tests.test_web_config.Test +WebConfig.test_config_jira +_web_server_setup + + + + + +Node3->Node6 + + + + + +Node5 + + +penify_hook.main.main + + + + + +Node4->Node5 + + + + + +Node5->Node5 + + + + + +Node7->Node5 + + + + + +Node8 + + +tests.test_commit_commands. +TestCommitCommands.test +_handle_commit + + + + + +Node7->Node8 + + + + + +Node10->Node7 + + + + + +Node11 + + +tests.test_config_commands. +TestConfigCommands.test +_get_llm_config_empty + + + + + +Node10->Node11 + + + + + +Node12 + + +tests.test_config_commands. +TestConfigCommands.test +_get_llm_config_exists + + + + + +Node10->Node12 + + + + + +Node13 + + +tests.test_config_commands. +TestConfigCommands.test +_get_llm_config_invalid_json + + + + + +Node10->Node13 + + + + + +Node14->Node7 + + + + + +Node15 + + +penify_hook.commands.doc +_commands.handle_docgen + + + + + +Node14->Node15 + + + + + +Node20 + + +tests.test_config_commands. +TestConfigCommands.test +_get_token_from_config + + + + + +Node14->Node20 + + + + + +Node21 + + +tests.test_config_commands. +TestConfigCommands.test +_get_token_from_env + + + + + +Node14->Node21 + + + + + +Node22 + + +tests.test_config_commands. +TestConfigCommands.test +_get_token_not_found + + + + + +Node14->Node22 + + + + + +Node15->Node5 + + + + + +Node16 + + +tests.test_doc_commands.test +_handle_docgen_generate + + + + + +Node15->Node16 + + + + + +Node17 + + +tests.test_doc_commands.test +_handle_docgen_install_hook + + + + + +Node15->Node17 + + + + + +Node18 + + +tests.test_doc_commands.test +_handle_docgen_no_token + + + + + +Node15->Node18 + + + + + +Node19 + + +tests.test_doc_commands.test +_handle_docgen_uninstall_hook + + + + + +Node15->Node19 + + + + + diff --git a/docs/rtf/namespacepenify__hook_1_1commands_1_1config__commands_ab2486ac2bf16b4a671e49625bfa4f9b4_cgraph.md5 b/docs/rtf/namespacepenify__hook_1_1commands_1_1config__commands_ab2486ac2bf16b4a671e49625bfa4f9b4_cgraph.md5 new file mode 100644 index 0000000..9c2e575 --- /dev/null +++ b/docs/rtf/namespacepenify__hook_1_1commands_1_1config__commands_ab2486ac2bf16b4a671e49625bfa4f9b4_cgraph.md5 @@ -0,0 +1 @@ +68e4fb55d25659f523e8547c8cb01464 \ No newline at end of file diff --git a/docs/rtf/namespacepenify__hook_1_1commands_1_1config__commands_ab2486ac2bf16b4a671e49625bfa4f9b4_cgraph.svg b/docs/rtf/namespacepenify__hook_1_1commands_1_1config__commands_ab2486ac2bf16b4a671e49625bfa4f9b4_cgraph.svg new file mode 100644 index 0000000..ce47665 --- /dev/null +++ b/docs/rtf/namespacepenify__hook_1_1commands_1_1config__commands_ab2486ac2bf16b4a671e49625bfa4f9b4_cgraph.svg @@ -0,0 +1,45 @@ + + + + + + +penify_hook.commands.config_commands.save_jira_config + + + +Node1 + + +penify_hook.commands.config +_commands.save_jira_config + + + + + +Node2 + + +penify_hook.utils.recursive +_search_git_folder + + + + + +Node1->Node2 + + + + + +Node2->Node2 + + + + + diff --git a/docs/rtf/namespacepenify__hook_1_1commands_1_1config__commands_ab2486ac2bf16b4a671e49625bfa4f9b4_icgraph.md5 b/docs/rtf/namespacepenify__hook_1_1commands_1_1config__commands_ab2486ac2bf16b4a671e49625bfa4f9b4_icgraph.md5 new file mode 100644 index 0000000..1f53baa --- /dev/null +++ b/docs/rtf/namespacepenify__hook_1_1commands_1_1config__commands_ab2486ac2bf16b4a671e49625bfa4f9b4_icgraph.md5 @@ -0,0 +1 @@ +d1ffd3debe0bd71ea914f1dd47c727ad \ No newline at end of file diff --git a/docs/rtf/namespacepenify__hook_1_1commands_1_1config__commands_ab2486ac2bf16b4a671e49625bfa4f9b4_icgraph.svg b/docs/rtf/namespacepenify__hook_1_1commands_1_1config__commands_ab2486ac2bf16b4a671e49625bfa4f9b4_icgraph.svg new file mode 100644 index 0000000..d4a9fb5 --- /dev/null +++ b/docs/rtf/namespacepenify__hook_1_1commands_1_1config__commands_ab2486ac2bf16b4a671e49625bfa4f9b4_icgraph.svg @@ -0,0 +1,116 @@ + + + + + + +penify_hook.commands.config_commands.save_jira_config + + + +Node1 + + +penify_hook.commands.config +_commands.save_jira_config + + + + + +Node2 + + +penify_hook.commands.config +_commands.config_jira_web + + + + + +Node1->Node2 + + + + + +Node3 + + +penify_hook.config +_command.handle_config + + + + + +Node1->Node3 + + + + + +Node6 + + +tests.test_config_commands. +TestConfigCommands.test +_save_jira_config_success + + + + + +Node1->Node6 + + + + + +Node2->Node3 + + + + + +Node5 + + +tests.test_web_config.Test +WebConfig.test_config_jira +_web_server_setup + + + + + +Node2->Node5 + + + + + +Node4 + + +penify_hook.main.main + + + + + +Node3->Node4 + + + + + +Node4->Node4 + + + + + diff --git a/docs/rtf/namespacepenify__hook_1_1commands_1_1config__commands_af115198ea5d6808ccb98733957f50b06_cgraph.md5 b/docs/rtf/namespacepenify__hook_1_1commands_1_1config__commands_af115198ea5d6808ccb98733957f50b06_cgraph.md5 new file mode 100644 index 0000000..7795142 --- /dev/null +++ b/docs/rtf/namespacepenify__hook_1_1commands_1_1config__commands_af115198ea5d6808ccb98733957f50b06_cgraph.md5 @@ -0,0 +1 @@ +e83a80d18918d47faae41628fcd92c7a \ No newline at end of file diff --git a/docs/rtf/namespacepenify__hook_1_1commands_1_1config__commands_af115198ea5d6808ccb98733957f50b06_cgraph.svg b/docs/rtf/namespacepenify__hook_1_1commands_1_1config__commands_af115198ea5d6808ccb98733957f50b06_cgraph.svg new file mode 100644 index 0000000..ad6fa7d --- /dev/null +++ b/docs/rtf/namespacepenify__hook_1_1commands_1_1config__commands_af115198ea5d6808ccb98733957f50b06_cgraph.svg @@ -0,0 +1,122 @@ + + + + + + +penify_hook.commands.config_commands.config_jira_web + + + +Node1 + + +penify_hook.commands.config +_commands.config_jira_web + + + + + +Node2 + + +penify_hook.commands.config +_commands.get_jira_config + + + + + +Node1->Node2 + + + + + +Node6 + + +penify_hook.commands.config +_commands.save_jira_config + + + + + +Node1->Node6 + + + + + +Node3 + + +penify_hook.commands.config +_commands.get_env_var_or +_default + + + + + +Node2->Node3 + + + + + +Node4 + + +penify_hook.commands.config +_commands.load_env_files + + + + + +Node2->Node4 + + + + + +Node4->Node4 + + + + + +Node5 + + +penify_hook.utils.recursive +_search_git_folder + + + + + +Node4->Node5 + + + + + +Node5->Node5 + + + + + +Node6->Node5 + + + + + diff --git a/docs/rtf/namespacepenify__hook_1_1commands_1_1config__commands_af115198ea5d6808ccb98733957f50b06_icgraph.md5 b/docs/rtf/namespacepenify__hook_1_1commands_1_1config__commands_af115198ea5d6808ccb98733957f50b06_icgraph.md5 new file mode 100644 index 0000000..166f9b7 --- /dev/null +++ b/docs/rtf/namespacepenify__hook_1_1commands_1_1config__commands_af115198ea5d6808ccb98733957f50b06_icgraph.md5 @@ -0,0 +1 @@ +e627346d77982130e6685bfc2c553220 \ No newline at end of file diff --git a/docs/rtf/namespacepenify__hook_1_1commands_1_1config__commands_af115198ea5d6808ccb98733957f50b06_icgraph.svg b/docs/rtf/namespacepenify__hook_1_1commands_1_1config__commands_af115198ea5d6808ccb98733957f50b06_icgraph.svg new file mode 100644 index 0000000..2e29aa1 --- /dev/null +++ b/docs/rtf/namespacepenify__hook_1_1commands_1_1config__commands_af115198ea5d6808ccb98733957f50b06_icgraph.svg @@ -0,0 +1,77 @@ + + + + + + +penify_hook.commands.config_commands.config_jira_web + + + +Node1 + + +penify_hook.commands.config +_commands.config_jira_web + + + + + +Node2 + + +penify_hook.config +_command.handle_config + + + + + +Node1->Node2 + + + + + +Node4 + + +tests.test_web_config.Test +WebConfig.test_config_jira +_web_server_setup + + + + + +Node1->Node4 + + + + + +Node3 + + +penify_hook.main.main + + + + + +Node2->Node3 + + + + + +Node3->Node3 + + + + + diff --git a/docs/rtf/namespacepenify__hook_1_1commands_1_1doc__commands_a2006ab13bff718ef783868a910c0b704_cgraph.md5 b/docs/rtf/namespacepenify__hook_1_1commands_1_1doc__commands_a2006ab13bff718ef783868a910c0b704_cgraph.md5 new file mode 100644 index 0000000..472a430 --- /dev/null +++ b/docs/rtf/namespacepenify__hook_1_1commands_1_1doc__commands_a2006ab13bff718ef783868a910c0b704_cgraph.md5 @@ -0,0 +1 @@ +d7ee1e07127beb9f489b974a61acce5d \ No newline at end of file diff --git a/docs/rtf/namespacepenify__hook_1_1commands_1_1doc__commands_a2006ab13bff718ef783868a910c0b704_cgraph.svg b/docs/rtf/namespacepenify__hook_1_1commands_1_1doc__commands_a2006ab13bff718ef783868a910c0b704_cgraph.svg new file mode 100644 index 0000000..8fa410b --- /dev/null +++ b/docs/rtf/namespacepenify__hook_1_1commands_1_1doc__commands_a2006ab13bff718ef783868a910c0b704_cgraph.svg @@ -0,0 +1,170 @@ + + + + + + +penify_hook.commands.doc_commands.handle_docgen + + + +Node1 + + +penify_hook.commands.doc +_commands.handle_docgen + + + + + +Node2 + + +penify_hook.commands.doc +_commands.generate_doc + + + + + +Node1->Node2 + + + + + +Node3 + + +penify_hook.commands.config +_commands.get_token + + + + + +Node1->Node3 + + + + + +Node8 + + +penify_hook.commands.hook +_commands.install_git_hook + + + + + +Node1->Node8 + + + + + +Node9 + + +penify_hook.commands.hook +_commands.uninstall_git_hook + + + + + +Node1->Node9 + + + + + +Node4 + + +penify_hook.commands.config +_commands.get_env_var_or +_default + + + + + +Node3->Node4 + + + + + +Node5 + + +penify_hook.commands.config +_commands.get_penify_config + + + + + +Node3->Node5 + + + + + +Node7 + + +penify_hook.commands.config +_commands.load_env_files + + + + + +Node3->Node7 + + + + + +Node6 + + +penify_hook.utils.recursive +_search_git_folder + + + + + +Node5->Node6 + + + + + +Node6->Node6 + + + + + +Node7->Node6 + + + + + +Node7->Node7 + + + + + diff --git a/docs/rtf/namespacepenify__hook_1_1commands_1_1doc__commands_a2006ab13bff718ef783868a910c0b704_icgraph.md5 b/docs/rtf/namespacepenify__hook_1_1commands_1_1doc__commands_a2006ab13bff718ef783868a910c0b704_icgraph.md5 new file mode 100644 index 0000000..9d429ee --- /dev/null +++ b/docs/rtf/namespacepenify__hook_1_1commands_1_1doc__commands_a2006ab13bff718ef783868a910c0b704_icgraph.md5 @@ -0,0 +1 @@ +ed70390d069e80c493faf1a14a7c6fff \ No newline at end of file diff --git a/docs/rtf/namespacepenify__hook_1_1commands_1_1doc__commands_a2006ab13bff718ef783868a910c0b704_icgraph.svg b/docs/rtf/namespacepenify__hook_1_1commands_1_1doc__commands_a2006ab13bff718ef783868a910c0b704_icgraph.svg new file mode 100644 index 0000000..c8b3178 --- /dev/null +++ b/docs/rtf/namespacepenify__hook_1_1commands_1_1doc__commands_a2006ab13bff718ef783868a910c0b704_icgraph.svg @@ -0,0 +1,108 @@ + + + + + + +penify_hook.commands.doc_commands.handle_docgen + + + +Node1 + + +penify_hook.commands.doc +_commands.handle_docgen + + + + + +Node2 + + +penify_hook.main.main + + + + + +Node1->Node2 + + + + + +Node3 + + +tests.test_doc_commands.test +_handle_docgen_generate + + + + + +Node1->Node3 + + + + + +Node4 + + +tests.test_doc_commands.test +_handle_docgen_install_hook + + + + + +Node1->Node4 + + + + + +Node5 + + +tests.test_doc_commands.test +_handle_docgen_no_token + + + + + +Node1->Node5 + + + + + +Node6 + + +tests.test_doc_commands.test +_handle_docgen_uninstall_hook + + + + + +Node1->Node6 + + + + + +Node2->Node2 + + + + + diff --git a/docs/rtf/namespacepenify__hook_1_1commands_1_1doc__commands_a4daac68bc563432bf25c85dc78081a25_icgraph.md5 b/docs/rtf/namespacepenify__hook_1_1commands_1_1doc__commands_a4daac68bc563432bf25c85dc78081a25_icgraph.md5 new file mode 100644 index 0000000..171b82e --- /dev/null +++ b/docs/rtf/namespacepenify__hook_1_1commands_1_1doc__commands_a4daac68bc563432bf25c85dc78081a25_icgraph.md5 @@ -0,0 +1 @@ +5e9faa5a79a60188abcf0c90efae69aa \ No newline at end of file diff --git a/docs/rtf/namespacepenify__hook_1_1commands_1_1doc__commands_a4daac68bc563432bf25c85dc78081a25_icgraph.svg b/docs/rtf/namespacepenify__hook_1_1commands_1_1doc__commands_a4daac68bc563432bf25c85dc78081a25_icgraph.svg new file mode 100644 index 0000000..0ae8a84 --- /dev/null +++ b/docs/rtf/namespacepenify__hook_1_1commands_1_1doc__commands_a4daac68bc563432bf25c85dc78081a25_icgraph.svg @@ -0,0 +1,221 @@ + + + + + + +penify_hook.commands.doc_commands.generate_doc + + + +Node1 + + +penify_hook.commands.doc +_commands.generate_doc + + + + + +Node2 + + +penify_hook.commands.doc +_commands.handle_docgen + + + + + +Node1->Node2 + + + + + +Node8 + + +tests.test_doc_commands.test +_generate_doc_error_handling + + + + + +Node1->Node8 + + + + + +Node9 + + +tests.test_doc_commands.test +_generate_doc_file_location + + + + + +Node1->Node9 + + + + + +Node10 + + +tests.test_doc_commands.test +_generate_doc_folder_location + + + + + +Node1->Node10 + + + + + +Node11 + + +tests.test_doc_commands.test +_generate_doc_no_location + + + + + +Node1->Node11 + + + + + +Node12 + + +tests.test_doc_commands.test +_generate_doc_with_file_exception + + + + + +Node1->Node12 + + + + + +Node13 + + +tests.test_doc_commands.test +_generate_doc_with_folder +_exception + + + + + +Node1->Node13 + + + + + +Node3 + + +penify_hook.main.main + + + + + +Node2->Node3 + + + + + +Node4 + + +tests.test_doc_commands.test +_handle_docgen_generate + + + + + +Node2->Node4 + + + + + +Node5 + + +tests.test_doc_commands.test +_handle_docgen_install_hook + + + + + +Node2->Node5 + + + + + +Node6 + + +tests.test_doc_commands.test +_handle_docgen_no_token + + + + + +Node2->Node6 + + + + + +Node7 + + +tests.test_doc_commands.test +_handle_docgen_uninstall_hook + + + + + +Node2->Node7 + + + + + +Node3->Node3 + + + + + diff --git a/docs/rtf/namespacepenify__hook_1_1commands_1_1doc__commands_acc7f4ead1b11951d885fa5c151c2cbe0_icgraph.md5 b/docs/rtf/namespacepenify__hook_1_1commands_1_1doc__commands_acc7f4ead1b11951d885fa5c151c2cbe0_icgraph.md5 new file mode 100644 index 0000000..0dc7e32 --- /dev/null +++ b/docs/rtf/namespacepenify__hook_1_1commands_1_1doc__commands_acc7f4ead1b11951d885fa5c151c2cbe0_icgraph.md5 @@ -0,0 +1 @@ +0fa78969e5f8672d0da52972dd124680 \ No newline at end of file diff --git a/docs/rtf/namespacepenify__hook_1_1commands_1_1doc__commands_acc7f4ead1b11951d885fa5c151c2cbe0_icgraph.svg b/docs/rtf/namespacepenify__hook_1_1commands_1_1doc__commands_acc7f4ead1b11951d885fa5c151c2cbe0_icgraph.svg new file mode 100644 index 0000000..c570dfd --- /dev/null +++ b/docs/rtf/namespacepenify__hook_1_1commands_1_1doc__commands_acc7f4ead1b11951d885fa5c151c2cbe0_icgraph.svg @@ -0,0 +1,60 @@ + + + + + + +penify_hook.commands.doc_commands.setup_docgen_parser + + + +Node1 + + +penify_hook.commands.doc +_commands.setup_docgen_parser + + + + + +Node2 + + +penify_hook.main.main + + + + + +Node1->Node2 + + + + + +Node3 + + +tests.test_doc_commands.test +_setup_docgen_parser + + + + + +Node1->Node3 + + + + + +Node2->Node2 + + + + + diff --git a/docs/rtf/namespacepenify__hook_1_1commands_1_1hook__commands_a81543eb5fa835fd1237f24e8bce6201d_icgraph.md5 b/docs/rtf/namespacepenify__hook_1_1commands_1_1hook__commands_a81543eb5fa835fd1237f24e8bce6201d_icgraph.md5 new file mode 100644 index 0000000..197f108 --- /dev/null +++ b/docs/rtf/namespacepenify__hook_1_1commands_1_1hook__commands_a81543eb5fa835fd1237f24e8bce6201d_icgraph.md5 @@ -0,0 +1 @@ +25f36344702d0e8ec428aac2f670078e \ No newline at end of file diff --git a/docs/rtf/namespacepenify__hook_1_1commands_1_1hook__commands_a81543eb5fa835fd1237f24e8bce6201d_icgraph.svg b/docs/rtf/namespacepenify__hook_1_1commands_1_1hook__commands_a81543eb5fa835fd1237f24e8bce6201d_icgraph.svg new file mode 100644 index 0000000..12ed4ff --- /dev/null +++ b/docs/rtf/namespacepenify__hook_1_1commands_1_1hook__commands_a81543eb5fa835fd1237f24e8bce6201d_icgraph.svg @@ -0,0 +1,124 @@ + + + + + + +penify_hook.commands.hook_commands.uninstall_git_hook + + + +Node1 + + +penify_hook.commands.hook +_commands.uninstall_git_hook + + + + + +Node2 + + +penify_hook.commands.doc +_commands.handle_docgen + + + + + +Node1->Node2 + + + + + +Node3 + + +penify_hook.main.main + + + + + +Node2->Node3 + + + + + +Node4 + + +tests.test_doc_commands.test +_handle_docgen_generate + + + + + +Node2->Node4 + + + + + +Node5 + + +tests.test_doc_commands.test +_handle_docgen_install_hook + + + + + +Node2->Node5 + + + + + +Node6 + + +tests.test_doc_commands.test +_handle_docgen_no_token + + + + + +Node2->Node6 + + + + + +Node7 + + +tests.test_doc_commands.test +_handle_docgen_uninstall_hook + + + + + +Node2->Node7 + + + + + +Node3->Node3 + + + + + diff --git a/docs/rtf/namespacepenify__hook_1_1commands_1_1hook__commands_adff8f5d3bf1c3795974a391ee95b72b2_icgraph.md5 b/docs/rtf/namespacepenify__hook_1_1commands_1_1hook__commands_adff8f5d3bf1c3795974a391ee95b72b2_icgraph.md5 new file mode 100644 index 0000000..333d2ec --- /dev/null +++ b/docs/rtf/namespacepenify__hook_1_1commands_1_1hook__commands_adff8f5d3bf1c3795974a391ee95b72b2_icgraph.md5 @@ -0,0 +1 @@ +3ec2e3ff4462cc865b4cb6fd3a62753d \ No newline at end of file diff --git a/docs/rtf/namespacepenify__hook_1_1commands_1_1hook__commands_adff8f5d3bf1c3795974a391ee95b72b2_icgraph.svg b/docs/rtf/namespacepenify__hook_1_1commands_1_1hook__commands_adff8f5d3bf1c3795974a391ee95b72b2_icgraph.svg new file mode 100644 index 0000000..712e836 --- /dev/null +++ b/docs/rtf/namespacepenify__hook_1_1commands_1_1hook__commands_adff8f5d3bf1c3795974a391ee95b72b2_icgraph.svg @@ -0,0 +1,124 @@ + + + + + + +penify_hook.commands.hook_commands.install_git_hook + + + +Node1 + + +penify_hook.commands.hook +_commands.install_git_hook + + + + + +Node2 + + +penify_hook.commands.doc +_commands.handle_docgen + + + + + +Node1->Node2 + + + + + +Node3 + + +penify_hook.main.main + + + + + +Node2->Node3 + + + + + +Node4 + + +tests.test_doc_commands.test +_handle_docgen_generate + + + + + +Node2->Node4 + + + + + +Node5 + + +tests.test_doc_commands.test +_handle_docgen_install_hook + + + + + +Node2->Node5 + + + + + +Node6 + + +tests.test_doc_commands.test +_handle_docgen_no_token + + + + + +Node2->Node6 + + + + + +Node7 + + +tests.test_doc_commands.test +_handle_docgen_uninstall_hook + + + + + +Node2->Node7 + + + + + +Node3->Node3 + + + + + diff --git a/docs/rtf/namespacepenify__hook_1_1config__command_a240e5331681eb574ac319d7458783bde_cgraph.md5 b/docs/rtf/namespacepenify__hook_1_1config__command_a240e5331681eb574ac319d7458783bde_cgraph.md5 new file mode 100644 index 0000000..1e009e6 --- /dev/null +++ b/docs/rtf/namespacepenify__hook_1_1config__command_a240e5331681eb574ac319d7458783bde_cgraph.md5 @@ -0,0 +1 @@ +4f75720d323fed0e1cf98ec14ae8f6e9 \ No newline at end of file diff --git a/docs/rtf/namespacepenify__hook_1_1config__command_a240e5331681eb574ac319d7458783bde_cgraph.svg b/docs/rtf/namespacepenify__hook_1_1config__command_a240e5331681eb574ac319d7458783bde_cgraph.svg new file mode 100644 index 0000000..ba2ae8f --- /dev/null +++ b/docs/rtf/namespacepenify__hook_1_1config__command_a240e5331681eb574ac319d7458783bde_cgraph.svg @@ -0,0 +1,182 @@ + + + + + + +penify_hook.config_command.handle_config + + + +Node1 + + +penify_hook.config +_command.handle_config + + + + + +Node2 + + +penify_hook.commands.config +_commands.config_jira_web + + + + + +Node1->Node2 + + + + + +Node7 + + +penify_hook.commands.config +_commands.save_jira_config + + + + + +Node1->Node7 + + + + + +Node8 + + +penify_hook.commands.config +_commands.config_llm_web + + + + + +Node1->Node8 + + + + + +Node9 + + +penify_hook.commands.config +_commands.save_llm_config + + + + + +Node1->Node9 + + + + + +Node3 + + +penify_hook.commands.config +_commands.get_jira_config + + + + + +Node2->Node3 + + + + + +Node2->Node7 + + + + + +Node4 + + +penify_hook.commands.config +_commands.get_env_var_or +_default + + + + + +Node3->Node4 + + + + + +Node5 + + +penify_hook.commands.config +_commands.load_env_files + + + + + +Node3->Node5 + + + + + +Node5->Node5 + + + + + +Node6 + + +penify_hook.utils.recursive +_search_git_folder + + + + + +Node5->Node6 + + + + + +Node6->Node6 + + + + + +Node7->Node6 + + + + + +Node9->Node6 + + + + + diff --git a/docs/rtf/namespacepenify__hook_1_1config__command_a240e5331681eb574ac319d7458783bde_icgraph.md5 b/docs/rtf/namespacepenify__hook_1_1config__command_a240e5331681eb574ac319d7458783bde_icgraph.md5 new file mode 100644 index 0000000..a09bdd4 --- /dev/null +++ b/docs/rtf/namespacepenify__hook_1_1config__command_a240e5331681eb574ac319d7458783bde_icgraph.md5 @@ -0,0 +1 @@ +f35e472a3767aa0a0b09219e96174cf9 \ No newline at end of file diff --git a/docs/rtf/namespacepenify__hook_1_1config__command_a240e5331681eb574ac319d7458783bde_icgraph.svg b/docs/rtf/namespacepenify__hook_1_1config__command_a240e5331681eb574ac319d7458783bde_icgraph.svg new file mode 100644 index 0000000..9d7881e --- /dev/null +++ b/docs/rtf/namespacepenify__hook_1_1config__command_a240e5331681eb574ac319d7458783bde_icgraph.svg @@ -0,0 +1,44 @@ + + + + + + +penify_hook.config_command.handle_config + + + +Node1 + + +penify_hook.config +_command.handle_config + + + + + +Node2 + + +penify_hook.main.main + + + + + +Node1->Node2 + + + + + +Node2->Node2 + + + + + diff --git a/docs/rtf/namespacepenify__hook_1_1config__command_a4f3eb92164a69df1446d745f8a09285e_icgraph.md5 b/docs/rtf/namespacepenify__hook_1_1config__command_a4f3eb92164a69df1446d745f8a09285e_icgraph.md5 new file mode 100644 index 0000000..48311b5 --- /dev/null +++ b/docs/rtf/namespacepenify__hook_1_1config__command_a4f3eb92164a69df1446d745f8a09285e_icgraph.md5 @@ -0,0 +1 @@ +a17b5eb406ca6a74de12d7201d9bcee7 \ No newline at end of file diff --git a/docs/rtf/namespacepenify__hook_1_1config__command_a4f3eb92164a69df1446d745f8a09285e_icgraph.svg b/docs/rtf/namespacepenify__hook_1_1config__command_a4f3eb92164a69df1446d745f8a09285e_icgraph.svg new file mode 100644 index 0000000..89dc211 --- /dev/null +++ b/docs/rtf/namespacepenify__hook_1_1config__command_a4f3eb92164a69df1446d745f8a09285e_icgraph.svg @@ -0,0 +1,45 @@ + + + + + + +penify_hook.config_command.setup_config_parser + + + +Node1 + + +penify_hook.config +_command.setup_config +_parser + + + + + +Node2 + + +penify_hook.main.main + + + + + +Node1->Node2 + + + + + +Node2->Node2 + + + + + diff --git a/docs/rtf/namespacepenify__hook_1_1login__command_aae63db4c484797bead34b7d874020c6a_icgraph.md5 b/docs/rtf/namespacepenify__hook_1_1login__command_aae63db4c484797bead34b7d874020c6a_icgraph.md5 new file mode 100644 index 0000000..2daae41 --- /dev/null +++ b/docs/rtf/namespacepenify__hook_1_1login__command_aae63db4c484797bead34b7d874020c6a_icgraph.md5 @@ -0,0 +1 @@ +34cbd1a77d726e3937d67455d405b0ba \ No newline at end of file diff --git a/docs/rtf/namespacepenify__hook_1_1login__command_aae63db4c484797bead34b7d874020c6a_icgraph.svg b/docs/rtf/namespacepenify__hook_1_1login__command_aae63db4c484797bead34b7d874020c6a_icgraph.svg new file mode 100644 index 0000000..7743579 --- /dev/null +++ b/docs/rtf/namespacepenify__hook_1_1login__command_aae63db4c484797bead34b7d874020c6a_icgraph.svg @@ -0,0 +1,44 @@ + + + + + + +penify_hook.login_command.setup_login_parser + + + +Node1 + + +penify_hook.login_command.setup +_login_parser + + + + + +Node2 + + +penify_hook.main.main + + + + + +Node1->Node2 + + + + + +Node2->Node2 + + + + + diff --git a/docs/rtf/namespacepenify__hook_1_1login__command_ae4bf932fbafeff834b0a0c5a37f74ccd_cgraph.md5 b/docs/rtf/namespacepenify__hook_1_1login__command_ae4bf932fbafeff834b0a0c5a37f74ccd_cgraph.md5 new file mode 100644 index 0000000..ad91965 --- /dev/null +++ b/docs/rtf/namespacepenify__hook_1_1login__command_ae4bf932fbafeff834b0a0c5a37f74ccd_cgraph.md5 @@ -0,0 +1 @@ +6a1ceeef99a0101ba5882e9e71fa9bce \ No newline at end of file diff --git a/docs/rtf/namespacepenify__hook_1_1login__command_ae4bf932fbafeff834b0a0c5a37f74ccd_cgraph.svg b/docs/rtf/namespacepenify__hook_1_1login__command_ae4bf932fbafeff834b0a0c5a37f74ccd_cgraph.svg new file mode 100644 index 0000000..1ef455e --- /dev/null +++ b/docs/rtf/namespacepenify__hook_1_1login__command_ae4bf932fbafeff834b0a0c5a37f74ccd_cgraph.svg @@ -0,0 +1,77 @@ + + + + + + +penify_hook.login_command.handle_login + + + +Node1 + + +penify_hook.login_command.handle +_login + + + + + +Node2 + + +penify_hook.commands.auth +_commands.login + + + + + +Node1->Node2 + + + + + +Node3 + + +penify_hook.commands.auth +_commands.save_credentials + + + + + +Node2->Node3 + + + + + +Node4 + + +penify_hook.utils.recursive +_search_git_folder + + + + + +Node3->Node4 + + + + + +Node4->Node4 + + + + + diff --git a/docs/rtf/namespacepenify__hook_1_1login__command_ae4bf932fbafeff834b0a0c5a37f74ccd_icgraph.md5 b/docs/rtf/namespacepenify__hook_1_1login__command_ae4bf932fbafeff834b0a0c5a37f74ccd_icgraph.md5 new file mode 100644 index 0000000..7a114f5 --- /dev/null +++ b/docs/rtf/namespacepenify__hook_1_1login__command_ae4bf932fbafeff834b0a0c5a37f74ccd_icgraph.md5 @@ -0,0 +1 @@ +1f6ec32e02e9919f90ba1a6a23743cb6 \ No newline at end of file diff --git a/docs/rtf/namespacepenify__hook_1_1login__command_ae4bf932fbafeff834b0a0c5a37f74ccd_icgraph.svg b/docs/rtf/namespacepenify__hook_1_1login__command_ae4bf932fbafeff834b0a0c5a37f74ccd_icgraph.svg new file mode 100644 index 0000000..5ef77f9 --- /dev/null +++ b/docs/rtf/namespacepenify__hook_1_1login__command_ae4bf932fbafeff834b0a0c5a37f74ccd_icgraph.svg @@ -0,0 +1,44 @@ + + + + + + +penify_hook.login_command.handle_login + + + +Node1 + + +penify_hook.login_command.handle +_login + + + + + +Node2 + + +penify_hook.main.main + + + + + +Node1->Node2 + + + + + +Node2->Node2 + + + + + diff --git a/docs/rtf/namespacepenify__hook_1_1main_a16838b20df4bd14ee4b5e1dd2906738f_cgraph.md5 b/docs/rtf/namespacepenify__hook_1_1main_a16838b20df4bd14ee4b5e1dd2906738f_cgraph.md5 new file mode 100644 index 0000000..304cb74 --- /dev/null +++ b/docs/rtf/namespacepenify__hook_1_1main_a16838b20df4bd14ee4b5e1dd2906738f_cgraph.md5 @@ -0,0 +1 @@ +73631f13dbb5d5f90aafdead88d96c1c \ No newline at end of file diff --git a/docs/rtf/namespacepenify__hook_1_1main_a16838b20df4bd14ee4b5e1dd2906738f_cgraph.svg b/docs/rtf/namespacepenify__hook_1_1main_a16838b20df4bd14ee4b5e1dd2906738f_cgraph.svg new file mode 100644 index 0000000..06f8a9c --- /dev/null +++ b/docs/rtf/namespacepenify__hook_1_1main_a16838b20df4bd14ee4b5e1dd2906738f_cgraph.svg @@ -0,0 +1,620 @@ + + + + + + +penify_hook.main.main + + + +Node1 + + +penify_hook.main.main + + + + + +Node1->Node1 + + + + + +Node2 + + +penify_hook.commands.commit +_commands.handle_commit + + + + + +Node1->Node2 + + + + + +Node6 + + +penify_hook.ui_utils.print_info + + + + + +Node1->Node6 + + + + + +Node17 + + +penify_hook.config +_command.handle_config + + + + + +Node1->Node17 + + + + + +Node22 + + +penify_hook.commands.doc +_commands.handle_docgen + + + + + +Node1->Node22 + + + + + +Node26 + + +penify_hook.login_command.handle +_login + + + + + +Node1->Node26 + + + + + +Node29 + + +penify_hook.commands.commit +_commands.setup_commit_parser + + + + + +Node1->Node29 + + + + + +Node30 + + +penify_hook.config +_command.setup_config +_parser + + + + + +Node1->Node30 + + + + + +Node31 + + +penify_hook.commands.doc +_commands.setup_docgen_parser + + + + + +Node1->Node31 + + + + + +Node32 + + +penify_hook.login_command.setup +_login_parser + + + + + +Node1->Node32 + + + + + +Node3 + + +penify_hook.commands.commit +_commands.commit_code + + + + + +Node2->Node3 + + + + + +Node2->Node6 + + + + + +Node11 + + +penify_hook.commands.config +_commands.get_jira_config + + + + + +Node2->Node11 + + + + + +Node14 + + +penify_hook.commands.config +_commands.get_llm_config + + + + + +Node2->Node14 + + + + + +Node15 + + +penify_hook.commands.config +_commands.get_token + + + + + +Node2->Node15 + + + + + +Node4 + + +penify_hook.ui_utils.print +_error + + + + + +Node3->Node4 + + + + + +Node3->Node6 + + + + + +Node8 + + +penify_hook.ui_utils.print +_warning + + + + + +Node3->Node8 + + + + + +Node10 + + +penify_hook.utils.recursive +_search_git_folder + + + + + +Node3->Node10 + + + + + +Node5 + + +penify_hook.ui_utils.format +_error + + + + + +Node4->Node5 + + + + + +Node7 + + +penify_hook.ui_utils.format_info + + + + + +Node6->Node7 + + + + + +Node9 + + +penify_hook.ui_utils.format +_warning + + + + + +Node8->Node9 + + + + + +Node10->Node10 + + + + + +Node12 + + +penify_hook.commands.config +_commands.get_env_var_or +_default + + + + + +Node11->Node12 + + + + + +Node13 + + +penify_hook.commands.config +_commands.load_env_files + + + + + +Node11->Node13 + + + + + +Node13->Node10 + + + + + +Node13->Node13 + + + + + +Node14->Node12 + + + + + +Node14->Node13 + + + + + +Node15->Node12 + + + + + +Node15->Node13 + + + + + +Node16 + + +penify_hook.commands.config +_commands.get_penify_config + + + + + +Node15->Node16 + + + + + +Node16->Node10 + + + + + +Node18 + + +penify_hook.commands.config +_commands.config_jira_web + + + + + +Node17->Node18 + + + + + +Node19 + + +penify_hook.commands.config +_commands.save_jira_config + + + + + +Node17->Node19 + + + + + +Node20 + + +penify_hook.commands.config +_commands.config_llm_web + + + + + +Node17->Node20 + + + + + +Node21 + + +penify_hook.commands.config +_commands.save_llm_config + + + + + +Node17->Node21 + + + + + +Node18->Node11 + + + + + +Node18->Node19 + + + + + +Node19->Node10 + + + + + +Node21->Node10 + + + + + +Node22->Node15 + + + + + +Node23 + + +penify_hook.commands.doc +_commands.generate_doc + + + + + +Node22->Node23 + + + + + +Node24 + + +penify_hook.commands.hook +_commands.install_git_hook + + + + + +Node22->Node24 + + + + + +Node25 + + +penify_hook.commands.hook +_commands.uninstall_git_hook + + + + + +Node22->Node25 + + + + + +Node27 + + +penify_hook.commands.auth +_commands.login + + + + + +Node26->Node27 + + + + + +Node28 + + +penify_hook.commands.auth +_commands.save_credentials + + + + + +Node27->Node28 + + + + + +Node28->Node10 + + + + + diff --git a/docs/rtf/namespacepenify__hook_1_1main_a16838b20df4bd14ee4b5e1dd2906738f_icgraph.md5 b/docs/rtf/namespacepenify__hook_1_1main_a16838b20df4bd14ee4b5e1dd2906738f_icgraph.md5 new file mode 100644 index 0000000..4bf17ac --- /dev/null +++ b/docs/rtf/namespacepenify__hook_1_1main_a16838b20df4bd14ee4b5e1dd2906738f_icgraph.md5 @@ -0,0 +1 @@ +3a9435159e82b3293bbcf47f41f2b41c \ No newline at end of file diff --git a/docs/rtf/namespacepenify__hook_1_1main_a16838b20df4bd14ee4b5e1dd2906738f_icgraph.svg b/docs/rtf/namespacepenify__hook_1_1main_a16838b20df4bd14ee4b5e1dd2906738f_icgraph.svg new file mode 100644 index 0000000..5001f6b --- /dev/null +++ b/docs/rtf/namespacepenify__hook_1_1main_a16838b20df4bd14ee4b5e1dd2906738f_icgraph.svg @@ -0,0 +1,28 @@ + + + + + + +penify_hook.main.main + + + +Node1 + + +penify_hook.main.main + + + + + +Node1->Node1 + + + + + diff --git a/docs/rtf/namespacepenify__hook_1_1ui__utils_a0a6fd2613c6fe053b6e4356cd9e5cda2_icgraph.md5 b/docs/rtf/namespacepenify__hook_1_1ui__utils_a0a6fd2613c6fe053b6e4356cd9e5cda2_icgraph.md5 new file mode 100644 index 0000000..e8c2c22 --- /dev/null +++ b/docs/rtf/namespacepenify__hook_1_1ui__utils_a0a6fd2613c6fe053b6e4356cd9e5cda2_icgraph.md5 @@ -0,0 +1 @@ +e844738072248c6c64fdcc2330f4e553 \ No newline at end of file diff --git a/docs/rtf/namespacepenify__hook_1_1ui__utils_a0a6fd2613c6fe053b6e4356cd9e5cda2_icgraph.svg b/docs/rtf/namespacepenify__hook_1_1ui__utils_a0a6fd2613c6fe053b6e4356cd9e5cda2_icgraph.svg new file mode 100644 index 0000000..54903a7 --- /dev/null +++ b/docs/rtf/namespacepenify__hook_1_1ui__utils_a0a6fd2613c6fe053b6e4356cd9e5cda2_icgraph.svg @@ -0,0 +1,259 @@ + + + + + + +penify_hook.ui_utils.format_warning + + + +Node1 + + +penify_hook.ui_utils.format +_warning + + + + + +Node2 + + +penify_hook.ui_utils.print +_warning + + + + + +Node1->Node2 + + + + + +Node3 + + +penify_hook.commands.commit +_commands.commit_code + + + + + +Node2->Node3 + + + + + +Node11 + + +penify_hook.file_analyzer. +FileAnalyzerGenHook.process_file + + + + + +Node2->Node11 + + + + + +Node14 + + +penify_hook.commit +_analyzer.CommitDocGenHook.process +_jira_integration + + + + + +Node2->Node14 + + + + + +Node4 + + +penify_hook.commands.commit +_commands.handle_commit + + + + + +Node3->Node4 + + + + + +Node7 + + +tests.test_commit_commands. +TestCommitCommands.test +_commit_code_error_handling + + + + + +Node3->Node7 + + + + + +Node8 + + +tests.test_commit_commands. +TestCommitCommands.test +_commit_code_with_jira_client + + + + + +Node3->Node8 + + + + + +Node9 + + +tests.test_commit_commands. +TestCommitCommands.test +_commit_code_with_jira_connection +_failure + + + + + +Node3->Node9 + + + + + +Node10 + + +tests.test_commit_commands. +TestCommitCommands.test +_commit_code_with_llm_client + + + + + +Node3->Node10 + + + + + +Node5 + + +penify_hook.main.main + + + + + +Node4->Node5 + + + + + +Node6 + + +tests.test_commit_commands. +TestCommitCommands.test +_handle_commit + + + + + +Node4->Node6 + + + + + +Node5->Node5 + + + + + +Node12 + + +penify_hook.file_analyzer. +FileAnalyzerGenHook.run + + + + + +Node11->Node12 + + + + + +Node13 + + +penify_hook.git_analyzer. +GitDocGenHook.run + + + + + +Node11->Node13 + + + + + +Node15 + + +penify_hook.commit +_analyzer.CommitDocGenHook.run + + + + + +Node14->Node15 + + + + + diff --git a/docs/rtf/namespacepenify__hook_1_1ui__utils_a12b92532b1458af94f3649d411b5505c_cgraph.md5 b/docs/rtf/namespacepenify__hook_1_1ui__utils_a12b92532b1458af94f3649d411b5505c_cgraph.md5 new file mode 100644 index 0000000..61c5559 --- /dev/null +++ b/docs/rtf/namespacepenify__hook_1_1ui__utils_a12b92532b1458af94f3649d411b5505c_cgraph.md5 @@ -0,0 +1 @@ +107c8ab941ac9fce368d49be27d3ad77 \ No newline at end of file diff --git a/docs/rtf/namespacepenify__hook_1_1ui__utils_a12b92532b1458af94f3649d411b5505c_cgraph.svg b/docs/rtf/namespacepenify__hook_1_1ui__utils_a12b92532b1458af94f3649d411b5505c_cgraph.svg new file mode 100644 index 0000000..725dce6 --- /dev/null +++ b/docs/rtf/namespacepenify__hook_1_1ui__utils_a12b92532b1458af94f3649d411b5505c_cgraph.svg @@ -0,0 +1,38 @@ + + + + + + +penify_hook.ui_utils.create_progress_bar + + + +Node1 + + +penify_hook.ui_utils.create +_progress_bar + + + + + +Node2 + + +penify_hook.ui_utils.format_info + + + + + +Node1->Node2 + + + + + diff --git a/docs/rtf/namespacepenify__hook_1_1ui__utils_a12b92532b1458af94f3649d411b5505c_icgraph.md5 b/docs/rtf/namespacepenify__hook_1_1ui__utils_a12b92532b1458af94f3649d411b5505c_icgraph.md5 new file mode 100644 index 0000000..28e733d --- /dev/null +++ b/docs/rtf/namespacepenify__hook_1_1ui__utils_a12b92532b1458af94f3649d411b5505c_icgraph.md5 @@ -0,0 +1 @@ +31face48bece50b969dd777e2fc02655 \ No newline at end of file diff --git a/docs/rtf/namespacepenify__hook_1_1ui__utils_a12b92532b1458af94f3649d411b5505c_icgraph.svg b/docs/rtf/namespacepenify__hook_1_1ui__utils_a12b92532b1458af94f3649d411b5505c_icgraph.svg new file mode 100644 index 0000000..5f29536 --- /dev/null +++ b/docs/rtf/namespacepenify__hook_1_1ui__utils_a12b92532b1458af94f3649d411b5505c_icgraph.svg @@ -0,0 +1,39 @@ + + + + + + +penify_hook.ui_utils.create_progress_bar + + + +Node1 + + +penify_hook.ui_utils.create +_progress_bar + + + + + +Node2 + + +penify_hook.git_analyzer. +GitDocGenHook.run + + + + + +Node1->Node2 + + + + + diff --git a/docs/rtf/namespacepenify__hook_1_1ui__utils_a1ffbb9671dbe233770268e2dd66a67fa_cgraph.md5 b/docs/rtf/namespacepenify__hook_1_1ui__utils_a1ffbb9671dbe233770268e2dd66a67fa_cgraph.md5 new file mode 100644 index 0000000..95113cf --- /dev/null +++ b/docs/rtf/namespacepenify__hook_1_1ui__utils_a1ffbb9671dbe233770268e2dd66a67fa_cgraph.md5 @@ -0,0 +1 @@ +dc9c89eee18a938f2f9191abf1d0c4e3 \ No newline at end of file diff --git a/docs/rtf/namespacepenify__hook_1_1ui__utils_a1ffbb9671dbe233770268e2dd66a67fa_cgraph.svg b/docs/rtf/namespacepenify__hook_1_1ui__utils_a1ffbb9671dbe233770268e2dd66a67fa_cgraph.svg new file mode 100644 index 0000000..0913177 --- /dev/null +++ b/docs/rtf/namespacepenify__hook_1_1ui__utils_a1ffbb9671dbe233770268e2dd66a67fa_cgraph.svg @@ -0,0 +1,39 @@ + + + + + + +penify_hook.ui_utils.print_warning + + + +Node1 + + +penify_hook.ui_utils.print +_warning + + + + + +Node2 + + +penify_hook.ui_utils.format +_warning + + + + + +Node1->Node2 + + + + + diff --git a/docs/rtf/namespacepenify__hook_1_1ui__utils_a1ffbb9671dbe233770268e2dd66a67fa_icgraph.md5 b/docs/rtf/namespacepenify__hook_1_1ui__utils_a1ffbb9671dbe233770268e2dd66a67fa_icgraph.md5 new file mode 100644 index 0000000..cd55665 --- /dev/null +++ b/docs/rtf/namespacepenify__hook_1_1ui__utils_a1ffbb9671dbe233770268e2dd66a67fa_icgraph.md5 @@ -0,0 +1 @@ +9fb882734b6d928eec5be79c1f8ddcfd \ No newline at end of file diff --git a/docs/rtf/namespacepenify__hook_1_1ui__utils_a1ffbb9671dbe233770268e2dd66a67fa_icgraph.svg b/docs/rtf/namespacepenify__hook_1_1ui__utils_a1ffbb9671dbe233770268e2dd66a67fa_icgraph.svg new file mode 100644 index 0000000..45e4d85 --- /dev/null +++ b/docs/rtf/namespacepenify__hook_1_1ui__utils_a1ffbb9671dbe233770268e2dd66a67fa_icgraph.svg @@ -0,0 +1,243 @@ + + + + + + +penify_hook.ui_utils.print_warning + + + +Node1 + + +penify_hook.ui_utils.print +_warning + + + + + +Node2 + + +penify_hook.commands.commit +_commands.commit_code + + + + + +Node1->Node2 + + + + + +Node10 + + +penify_hook.file_analyzer. +FileAnalyzerGenHook.process_file + + + + + +Node1->Node10 + + + + + +Node13 + + +penify_hook.commit +_analyzer.CommitDocGenHook.process +_jira_integration + + + + + +Node1->Node13 + + + + + +Node3 + + +penify_hook.commands.commit +_commands.handle_commit + + + + + +Node2->Node3 + + + + + +Node6 + + +tests.test_commit_commands. +TestCommitCommands.test +_commit_code_error_handling + + + + + +Node2->Node6 + + + + + +Node7 + + +tests.test_commit_commands. +TestCommitCommands.test +_commit_code_with_jira_client + + + + + +Node2->Node7 + + + + + +Node8 + + +tests.test_commit_commands. +TestCommitCommands.test +_commit_code_with_jira_connection +_failure + + + + + +Node2->Node8 + + + + + +Node9 + + +tests.test_commit_commands. +TestCommitCommands.test +_commit_code_with_llm_client + + + + + +Node2->Node9 + + + + + +Node4 + + +penify_hook.main.main + + + + + +Node3->Node4 + + + + + +Node5 + + +tests.test_commit_commands. +TestCommitCommands.test +_handle_commit + + + + + +Node3->Node5 + + + + + +Node4->Node4 + + + + + +Node11 + + +penify_hook.file_analyzer. +FileAnalyzerGenHook.run + + + + + +Node10->Node11 + + + + + +Node12 + + +penify_hook.git_analyzer. +GitDocGenHook.run + + + + + +Node10->Node12 + + + + + +Node14 + + +penify_hook.commit +_analyzer.CommitDocGenHook.run + + + + + +Node13->Node14 + + + + + diff --git a/docs/rtf/namespacepenify__hook_1_1ui__utils_a2b16aa6b68a9edea5f29f84f1c4be79a_cgraph.md5 b/docs/rtf/namespacepenify__hook_1_1ui__utils_a2b16aa6b68a9edea5f29f84f1c4be79a_cgraph.md5 new file mode 100644 index 0000000..2cb272d --- /dev/null +++ b/docs/rtf/namespacepenify__hook_1_1ui__utils_a2b16aa6b68a9edea5f29f84f1c4be79a_cgraph.md5 @@ -0,0 +1 @@ +86ecc3cd8eb77718a70cf2d0a033d81b \ No newline at end of file diff --git a/docs/rtf/namespacepenify__hook_1_1ui__utils_a2b16aa6b68a9edea5f29f84f1c4be79a_cgraph.svg b/docs/rtf/namespacepenify__hook_1_1ui__utils_a2b16aa6b68a9edea5f29f84f1c4be79a_cgraph.svg new file mode 100644 index 0000000..c5c8ad0 --- /dev/null +++ b/docs/rtf/namespacepenify__hook_1_1ui__utils_a2b16aa6b68a9edea5f29f84f1c4be79a_cgraph.svg @@ -0,0 +1,39 @@ + + + + + + +penify_hook.ui_utils.print_success + + + +Node1 + + +penify_hook.ui_utils.print +_success + + + + + +Node2 + + +penify_hook.ui_utils.format +_success + + + + + +Node1->Node2 + + + + + diff --git a/docs/rtf/namespacepenify__hook_1_1ui__utils_a2b16aa6b68a9edea5f29f84f1c4be79a_icgraph.md5 b/docs/rtf/namespacepenify__hook_1_1ui__utils_a2b16aa6b68a9edea5f29f84f1c4be79a_icgraph.md5 new file mode 100644 index 0000000..aeb43db --- /dev/null +++ b/docs/rtf/namespacepenify__hook_1_1ui__utils_a2b16aa6b68a9edea5f29f84f1c4be79a_icgraph.md5 @@ -0,0 +1 @@ +5a5f4e31cb2a03012aa538af45b7c2f7 \ No newline at end of file diff --git a/docs/rtf/namespacepenify__hook_1_1ui__utils_a2b16aa6b68a9edea5f29f84f1c4be79a_icgraph.svg b/docs/rtf/namespacepenify__hook_1_1ui__utils_a2b16aa6b68a9edea5f29f84f1c4be79a_icgraph.svg new file mode 100644 index 0000000..1be6b94 --- /dev/null +++ b/docs/rtf/namespacepenify__hook_1_1ui__utils_a2b16aa6b68a9edea5f29f84f1c4be79a_icgraph.svg @@ -0,0 +1,71 @@ + + + + + + +penify_hook.ui_utils.print_success + + + +Node1 + + +penify_hook.ui_utils.print +_success + + + + + +Node2 + + +penify_hook.file_analyzer. +FileAnalyzerGenHook.run + + + + + +Node1->Node2 + + + + + +Node3 + + +penify_hook.git_analyzer. +GitDocGenHook.run + + + + + +Node1->Node3 + + + + + +Node4 + + +penify_hook.commit +_analyzer.CommitDocGenHook.run + + + + + +Node1->Node4 + + + + + diff --git a/docs/rtf/namespacepenify__hook_1_1ui__utils_a3da02cd1140179a9ce60f62c85fccfef_cgraph.md5 b/docs/rtf/namespacepenify__hook_1_1ui__utils_a3da02cd1140179a9ce60f62c85fccfef_cgraph.md5 new file mode 100644 index 0000000..13a3f9b --- /dev/null +++ b/docs/rtf/namespacepenify__hook_1_1ui__utils_a3da02cd1140179a9ce60f62c85fccfef_cgraph.md5 @@ -0,0 +1 @@ +07bb20aff57367351bd025b6bbac0225 \ No newline at end of file diff --git a/docs/rtf/namespacepenify__hook_1_1ui__utils_a3da02cd1140179a9ce60f62c85fccfef_cgraph.svg b/docs/rtf/namespacepenify__hook_1_1ui__utils_a3da02cd1140179a9ce60f62c85fccfef_cgraph.svg new file mode 100644 index 0000000..344f55a --- /dev/null +++ b/docs/rtf/namespacepenify__hook_1_1ui__utils_a3da02cd1140179a9ce60f62c85fccfef_cgraph.svg @@ -0,0 +1,38 @@ + + + + + + +penify_hook.ui_utils.create_stage_progress_bar + + + +Node1 + + +penify_hook.ui_utils.create +_stage_progress_bar + + + + + +Node2 + + +penify_hook.ui_utils.format_info + + + + + +Node1->Node2 + + + + + diff --git a/docs/rtf/namespacepenify__hook_1_1ui__utils_a3da02cd1140179a9ce60f62c85fccfef_icgraph.md5 b/docs/rtf/namespacepenify__hook_1_1ui__utils_a3da02cd1140179a9ce60f62c85fccfef_icgraph.md5 new file mode 100644 index 0000000..2972d31 --- /dev/null +++ b/docs/rtf/namespacepenify__hook_1_1ui__utils_a3da02cd1140179a9ce60f62c85fccfef_icgraph.md5 @@ -0,0 +1 @@ +c7fe8cba89008798c4a6df0ce478844e \ No newline at end of file diff --git a/docs/rtf/namespacepenify__hook_1_1ui__utils_a3da02cd1140179a9ce60f62c85fccfef_icgraph.svg b/docs/rtf/namespacepenify__hook_1_1ui__utils_a3da02cd1140179a9ce60f62c85fccfef_icgraph.svg new file mode 100644 index 0000000..9b30dd3 --- /dev/null +++ b/docs/rtf/namespacepenify__hook_1_1ui__utils_a3da02cd1140179a9ce60f62c85fccfef_icgraph.svg @@ -0,0 +1,39 @@ + + + + + + +penify_hook.ui_utils.create_stage_progress_bar + + + +Node1 + + +penify_hook.ui_utils.create +_stage_progress_bar + + + + + +Node2 + + +penify_hook.file_analyzer. +FileAnalyzerGenHook.run + + + + + +Node1->Node2 + + + + + diff --git a/docs/rtf/namespacepenify__hook_1_1ui__utils_a4dd934568897433fa73f9cc182ac4a3e_icgraph.md5 b/docs/rtf/namespacepenify__hook_1_1ui__utils_a4dd934568897433fa73f9cc182ac4a3e_icgraph.md5 new file mode 100644 index 0000000..69b06bc --- /dev/null +++ b/docs/rtf/namespacepenify__hook_1_1ui__utils_a4dd934568897433fa73f9cc182ac4a3e_icgraph.md5 @@ -0,0 +1 @@ +e9b17f53f8eea3fa235635a840d97fb5 \ No newline at end of file diff --git a/docs/rtf/namespacepenify__hook_1_1ui__utils_a4dd934568897433fa73f9cc182ac4a3e_icgraph.svg b/docs/rtf/namespacepenify__hook_1_1ui__utils_a4dd934568897433fa73f9cc182ac4a3e_icgraph.svg new file mode 100644 index 0000000..75f49e6 --- /dev/null +++ b/docs/rtf/namespacepenify__hook_1_1ui__utils_a4dd934568897433fa73f9cc182ac4a3e_icgraph.svg @@ -0,0 +1,178 @@ + + + + + + +penify_hook.ui_utils.format_error + + + +Node1 + + +penify_hook.ui_utils.format +_error + + + + + +Node2 + + +penify_hook.ui_utils.print +_error + + + + + +Node1->Node2 + + + + + +Node3 + + +penify_hook.commands.commit +_commands.commit_code + + + + + +Node2->Node3 + + + + + +Node4 + + +penify_hook.commands.commit +_commands.handle_commit + + + + + +Node3->Node4 + + + + + +Node7 + + +tests.test_commit_commands. +TestCommitCommands.test +_commit_code_error_handling + + + + + +Node3->Node7 + + + + + +Node8 + + +tests.test_commit_commands. +TestCommitCommands.test +_commit_code_with_jira_client + + + + + +Node3->Node8 + + + + + +Node9 + + +tests.test_commit_commands. +TestCommitCommands.test +_commit_code_with_jira_connection +_failure + + + + + +Node3->Node9 + + + + + +Node10 + + +tests.test_commit_commands. +TestCommitCommands.test +_commit_code_with_llm_client + + + + + +Node3->Node10 + + + + + +Node5 + + +penify_hook.main.main + + + + + +Node4->Node5 + + + + + +Node6 + + +tests.test_commit_commands. +TestCommitCommands.test +_handle_commit + + + + + +Node4->Node6 + + + + + +Node5->Node5 + + + + + diff --git a/docs/rtf/namespacepenify__hook_1_1ui__utils_a532cdb4de7c679ce8b29c3e9116c4776_icgraph.md5 b/docs/rtf/namespacepenify__hook_1_1ui__utils_a532cdb4de7c679ce8b29c3e9116c4776_icgraph.md5 new file mode 100644 index 0000000..5199573 --- /dev/null +++ b/docs/rtf/namespacepenify__hook_1_1ui__utils_a532cdb4de7c679ce8b29c3e9116c4776_icgraph.md5 @@ -0,0 +1 @@ +e25efaa5775be3034819eb11f9cbeeb3 \ No newline at end of file diff --git a/docs/rtf/namespacepenify__hook_1_1ui__utils_a532cdb4de7c679ce8b29c3e9116c4776_icgraph.svg b/docs/rtf/namespacepenify__hook_1_1ui__utils_a532cdb4de7c679ce8b29c3e9116c4776_icgraph.svg new file mode 100644 index 0000000..75e6afd --- /dev/null +++ b/docs/rtf/namespacepenify__hook_1_1ui__utils_a532cdb4de7c679ce8b29c3e9116c4776_icgraph.svg @@ -0,0 +1,87 @@ + + + + + + +penify_hook.ui_utils.format_success + + + +Node1 + + +penify_hook.ui_utils.format +_success + + + + + +Node2 + + +penify_hook.ui_utils.print +_success + + + + + +Node1->Node2 + + + + + +Node3 + + +penify_hook.file_analyzer. +FileAnalyzerGenHook.run + + + + + +Node2->Node3 + + + + + +Node4 + + +penify_hook.git_analyzer. +GitDocGenHook.run + + + + + +Node2->Node4 + + + + + +Node5 + + +penify_hook.commit +_analyzer.CommitDocGenHook.run + + + + + +Node2->Node5 + + + + + diff --git a/docs/rtf/namespacepenify__hook_1_1ui__utils_a5a7340d0fc60fb80f17514d60bf45f1d_icgraph.md5 b/docs/rtf/namespacepenify__hook_1_1ui__utils_a5a7340d0fc60fb80f17514d60bf45f1d_icgraph.md5 new file mode 100644 index 0000000..882dba5 --- /dev/null +++ b/docs/rtf/namespacepenify__hook_1_1ui__utils_a5a7340d0fc60fb80f17514d60bf45f1d_icgraph.md5 @@ -0,0 +1 @@ +3b447097b4d45a9b7a66bc911d7dd54f \ No newline at end of file diff --git a/docs/rtf/namespacepenify__hook_1_1ui__utils_a5a7340d0fc60fb80f17514d60bf45f1d_icgraph.svg b/docs/rtf/namespacepenify__hook_1_1ui__utils_a5a7340d0fc60fb80f17514d60bf45f1d_icgraph.svg new file mode 100644 index 0000000..49f0a57 --- /dev/null +++ b/docs/rtf/namespacepenify__hook_1_1ui__utils_a5a7340d0fc60fb80f17514d60bf45f1d_icgraph.svg @@ -0,0 +1,77 @@ + + + + + + +penify_hook.ui_utils.update_stage + + + +Node1 + + +penify_hook.ui_utils.update +_stage + + + + + +Node2 + + +penify_hook.file_analyzer. +FileAnalyzerGenHook.process_file + + + + + +Node1->Node2 + + + + + +Node3 + + +penify_hook.file_analyzer. +FileAnalyzerGenHook.run + + + + + +Node1->Node3 + + + + + +Node2->Node3 + + + + + +Node4 + + +penify_hook.git_analyzer. +GitDocGenHook.run + + + + + +Node2->Node4 + + + + + diff --git a/docs/rtf/namespacepenify__hook_1_1ui__utils_a6f0acd7dd91abfe67d0807803bc3b65f_cgraph.md5 b/docs/rtf/namespacepenify__hook_1_1ui__utils_a6f0acd7dd91abfe67d0807803bc3b65f_cgraph.md5 new file mode 100644 index 0000000..e14594c --- /dev/null +++ b/docs/rtf/namespacepenify__hook_1_1ui__utils_a6f0acd7dd91abfe67d0807803bc3b65f_cgraph.md5 @@ -0,0 +1 @@ +f7f77cf41919f414860683374ddefc0a \ No newline at end of file diff --git a/docs/rtf/namespacepenify__hook_1_1ui__utils_a6f0acd7dd91abfe67d0807803bc3b65f_cgraph.svg b/docs/rtf/namespacepenify__hook_1_1ui__utils_a6f0acd7dd91abfe67d0807803bc3b65f_cgraph.svg new file mode 100644 index 0000000..e5601e4 --- /dev/null +++ b/docs/rtf/namespacepenify__hook_1_1ui__utils_a6f0acd7dd91abfe67d0807803bc3b65f_cgraph.svg @@ -0,0 +1,39 @@ + + + + + + +penify_hook.ui_utils.print_error + + + +Node1 + + +penify_hook.ui_utils.print +_error + + + + + +Node2 + + +penify_hook.ui_utils.format +_error + + + + + +Node1->Node2 + + + + + diff --git a/docs/rtf/namespacepenify__hook_1_1ui__utils_a6f0acd7dd91abfe67d0807803bc3b65f_icgraph.md5 b/docs/rtf/namespacepenify__hook_1_1ui__utils_a6f0acd7dd91abfe67d0807803bc3b65f_icgraph.md5 new file mode 100644 index 0000000..8538194 --- /dev/null +++ b/docs/rtf/namespacepenify__hook_1_1ui__utils_a6f0acd7dd91abfe67d0807803bc3b65f_icgraph.md5 @@ -0,0 +1 @@ +9c27aeee4681a41d96bdc9cb1c2cd259 \ No newline at end of file diff --git a/docs/rtf/namespacepenify__hook_1_1ui__utils_a6f0acd7dd91abfe67d0807803bc3b65f_icgraph.svg b/docs/rtf/namespacepenify__hook_1_1ui__utils_a6f0acd7dd91abfe67d0807803bc3b65f_icgraph.svg new file mode 100644 index 0000000..12b58a6 --- /dev/null +++ b/docs/rtf/namespacepenify__hook_1_1ui__utils_a6f0acd7dd91abfe67d0807803bc3b65f_icgraph.svg @@ -0,0 +1,162 @@ + + + + + + +penify_hook.ui_utils.print_error + + + +Node1 + + +penify_hook.ui_utils.print +_error + + + + + +Node2 + + +penify_hook.commands.commit +_commands.commit_code + + + + + +Node1->Node2 + + + + + +Node3 + + +penify_hook.commands.commit +_commands.handle_commit + + + + + +Node2->Node3 + + + + + +Node6 + + +tests.test_commit_commands. +TestCommitCommands.test +_commit_code_error_handling + + + + + +Node2->Node6 + + + + + +Node7 + + +tests.test_commit_commands. +TestCommitCommands.test +_commit_code_with_jira_client + + + + + +Node2->Node7 + + + + + +Node8 + + +tests.test_commit_commands. +TestCommitCommands.test +_commit_code_with_jira_connection +_failure + + + + + +Node2->Node8 + + + + + +Node9 + + +tests.test_commit_commands. +TestCommitCommands.test +_commit_code_with_llm_client + + + + + +Node2->Node9 + + + + + +Node4 + + +penify_hook.main.main + + + + + +Node3->Node4 + + + + + +Node5 + + +tests.test_commit_commands. +TestCommitCommands.test +_handle_commit + + + + + +Node3->Node5 + + + + + +Node4->Node4 + + + + + diff --git a/docs/rtf/namespacepenify__hook_1_1ui__utils_a811f0adf6e9bf71510c379b6fa155e44_cgraph.md5 b/docs/rtf/namespacepenify__hook_1_1ui__utils_a811f0adf6e9bf71510c379b6fa155e44_cgraph.md5 new file mode 100644 index 0000000..f566c4a --- /dev/null +++ b/docs/rtf/namespacepenify__hook_1_1ui__utils_a811f0adf6e9bf71510c379b6fa155e44_cgraph.md5 @@ -0,0 +1 @@ +0ee2c99f818d114be866466bd3ca67e3 \ No newline at end of file diff --git a/docs/rtf/namespacepenify__hook_1_1ui__utils_a811f0adf6e9bf71510c379b6fa155e44_cgraph.svg b/docs/rtf/namespacepenify__hook_1_1ui__utils_a811f0adf6e9bf71510c379b6fa155e44_cgraph.svg new file mode 100644 index 0000000..66b23f8 --- /dev/null +++ b/docs/rtf/namespacepenify__hook_1_1ui__utils_a811f0adf6e9bf71510c379b6fa155e44_cgraph.svg @@ -0,0 +1,37 @@ + + + + + + +penify_hook.ui_utils.print_info + + + +Node1 + + +penify_hook.ui_utils.print_info + + + + + +Node2 + + +penify_hook.ui_utils.format_info + + + + + +Node1->Node2 + + + + + diff --git a/docs/rtf/namespacepenify__hook_1_1ui__utils_a811f0adf6e9bf71510c379b6fa155e44_icgraph.md5 b/docs/rtf/namespacepenify__hook_1_1ui__utils_a811f0adf6e9bf71510c379b6fa155e44_icgraph.md5 new file mode 100644 index 0000000..9d7b6fc --- /dev/null +++ b/docs/rtf/namespacepenify__hook_1_1ui__utils_a811f0adf6e9bf71510c379b6fa155e44_icgraph.md5 @@ -0,0 +1 @@ +4693bdcc77b647a09f27d1c12b6cf38a \ No newline at end of file diff --git a/docs/rtf/namespacepenify__hook_1_1ui__utils_a811f0adf6e9bf71510c379b6fa155e44_icgraph.svg b/docs/rtf/namespacepenify__hook_1_1ui__utils_a811f0adf6e9bf71510c379b6fa155e44_icgraph.svg new file mode 100644 index 0000000..eca3aa9 --- /dev/null +++ b/docs/rtf/namespacepenify__hook_1_1ui__utils_a811f0adf6e9bf71510c379b6fa155e44_icgraph.svg @@ -0,0 +1,268 @@ + + + + + + +penify_hook.ui_utils.print_info + + + +Node1 + + +penify_hook.ui_utils.print_info + + + + + +Node2 + + +penify_hook.commands.commit +_commands.commit_code + + + + + +Node1->Node2 + + + + + +Node3 + + +penify_hook.commands.commit +_commands.handle_commit + + + + + +Node1->Node3 + + + + + +Node4 + + +penify_hook.main.main + + + + + +Node1->Node4 + + + + + +Node10 + + +penify_hook.jira_client. +JiraClient.extract_issue +_keys_from_branch + + + + + +Node1->Node10 + + + + + +Node11 + + +penify_hook.commit +_analyzer.CommitDocGenHook.get +_summary + + + + + +Node1->Node11 + + + + + +Node12 + + +penify_hook.commit +_analyzer.CommitDocGenHook.run + + + + + +Node1->Node12 + + + + + +Node13 + + +penify_hook.commit +_analyzer.CommitDocGenHook.process +_jira_integration + + + + + +Node1->Node13 + + + + + +Node14 + + +penify_hook.git_analyzer. +GitDocGenHook.run + + + + + +Node1->Node14 + + + + + +Node2->Node3 + + + + + +Node6 + + +tests.test_commit_commands. +TestCommitCommands.test +_commit_code_error_handling + + + + + +Node2->Node6 + + + + + +Node7 + + +tests.test_commit_commands. +TestCommitCommands.test +_commit_code_with_jira_client + + + + + +Node2->Node7 + + + + + +Node8 + + +tests.test_commit_commands. +TestCommitCommands.test +_commit_code_with_jira_connection +_failure + + + + + +Node2->Node8 + + + + + +Node9 + + +tests.test_commit_commands. +TestCommitCommands.test +_commit_code_with_llm_client + + + + + +Node2->Node9 + + + + + +Node3->Node4 + + + + + +Node5 + + +tests.test_commit_commands. +TestCommitCommands.test +_handle_commit + + + + + +Node3->Node5 + + + + + +Node4->Node4 + + + + + +Node11->Node12 + + + + + +Node13->Node12 + + + + + diff --git a/docs/rtf/namespacepenify__hook_1_1ui__utils_a92c3e466d1912058167be2eacf85b9f6_icgraph.md5 b/docs/rtf/namespacepenify__hook_1_1ui__utils_a92c3e466d1912058167be2eacf85b9f6_icgraph.md5 new file mode 100644 index 0000000..0acebf0 --- /dev/null +++ b/docs/rtf/namespacepenify__hook_1_1ui__utils_a92c3e466d1912058167be2eacf85b9f6_icgraph.md5 @@ -0,0 +1 @@ +ebb2d3fbd74327cb6297532859329884 \ No newline at end of file diff --git a/docs/rtf/namespacepenify__hook_1_1ui__utils_a92c3e466d1912058167be2eacf85b9f6_icgraph.svg b/docs/rtf/namespacepenify__hook_1_1ui__utils_a92c3e466d1912058167be2eacf85b9f6_icgraph.svg new file mode 100644 index 0000000..64e8b48 --- /dev/null +++ b/docs/rtf/namespacepenify__hook_1_1ui__utils_a92c3e466d1912058167be2eacf85b9f6_icgraph.svg @@ -0,0 +1,337 @@ + + + + + + +penify_hook.ui_utils.format_info + + + +Node1 + + +penify_hook.ui_utils.format_info + + + + + +Node2 + + +penify_hook.ui_utils.create +_progress_bar + + + + + +Node1->Node2 + + + + + +Node4 + + +penify_hook.ui_utils.create +_stage_progress_bar + + + + + +Node1->Node4 + + + + + +Node6 + + +penify_hook.ui_utils.print_info + + + + + +Node1->Node6 + + + + + +Node3 + + +penify_hook.git_analyzer. +GitDocGenHook.run + + + + + +Node2->Node3 + + + + + +Node5 + + +penify_hook.file_analyzer. +FileAnalyzerGenHook.run + + + + + +Node4->Node5 + + + + + +Node6->Node3 + + + + + +Node7 + + +penify_hook.commands.commit +_commands.commit_code + + + + + +Node6->Node7 + + + + + +Node8 + + +penify_hook.commands.commit +_commands.handle_commit + + + + + +Node6->Node8 + + + + + +Node9 + + +penify_hook.main.main + + + + + +Node6->Node9 + + + + + +Node15 + + +penify_hook.jira_client. +JiraClient.extract_issue +_keys_from_branch + + + + + +Node6->Node15 + + + + + +Node16 + + +penify_hook.commit +_analyzer.CommitDocGenHook.get +_summary + + + + + +Node6->Node16 + + + + + +Node17 + + +penify_hook.commit +_analyzer.CommitDocGenHook.run + + + + + +Node6->Node17 + + + + + +Node18 + + +penify_hook.commit +_analyzer.CommitDocGenHook.process +_jira_integration + + + + + +Node6->Node18 + + + + + +Node7->Node8 + + + + + +Node11 + + +tests.test_commit_commands. +TestCommitCommands.test +_commit_code_error_handling + + + + + +Node7->Node11 + + + + + +Node12 + + +tests.test_commit_commands. +TestCommitCommands.test +_commit_code_with_jira_client + + + + + +Node7->Node12 + + + + + +Node13 + + +tests.test_commit_commands. +TestCommitCommands.test +_commit_code_with_jira_connection +_failure + + + + + +Node7->Node13 + + + + + +Node14 + + +tests.test_commit_commands. +TestCommitCommands.test +_commit_code_with_llm_client + + + + + +Node7->Node14 + + + + + +Node8->Node9 + + + + + +Node10 + + +tests.test_commit_commands. +TestCommitCommands.test +_handle_commit + + + + + +Node8->Node10 + + + + + +Node9->Node9 + + + + + +Node16->Node17 + + + + + +Node18->Node17 + + + + + diff --git a/docs/rtf/namespacepenify__hook_1_1ui__utils_aa6e684c00e26199440137a87ed9b195c_icgraph.md5 b/docs/rtf/namespacepenify__hook_1_1ui__utils_aa6e684c00e26199440137a87ed9b195c_icgraph.md5 new file mode 100644 index 0000000..fc03531 --- /dev/null +++ b/docs/rtf/namespacepenify__hook_1_1ui__utils_aa6e684c00e26199440137a87ed9b195c_icgraph.md5 @@ -0,0 +1 @@ +cb2ef693a136057440c77b2ffc5fc5cc \ No newline at end of file diff --git a/docs/rtf/namespacepenify__hook_1_1ui__utils_aa6e684c00e26199440137a87ed9b195c_icgraph.svg b/docs/rtf/namespacepenify__hook_1_1ui__utils_aa6e684c00e26199440137a87ed9b195c_icgraph.svg new file mode 100644 index 0000000..d2fcc11 --- /dev/null +++ b/docs/rtf/namespacepenify__hook_1_1ui__utils_aa6e684c00e26199440137a87ed9b195c_icgraph.svg @@ -0,0 +1,55 @@ + + + + + + +penify_hook.ui_utils.print_status + + + +Node1 + + +penify_hook.ui_utils.print +_status + + + + + +Node2 + + +penify_hook.file_analyzer. +FileAnalyzerGenHook.run + + + + + +Node1->Node2 + + + + + +Node3 + + +penify_hook.git_analyzer. +GitDocGenHook.run + + + + + +Node1->Node3 + + + + + diff --git a/docs/rtf/namespacepenify__hook_1_1ui__utils_adfcbbfe39029ab6d1dd33e7bf75ae115_cgraph.md5 b/docs/rtf/namespacepenify__hook_1_1ui__utils_adfcbbfe39029ab6d1dd33e7bf75ae115_cgraph.md5 new file mode 100644 index 0000000..c14d515 --- /dev/null +++ b/docs/rtf/namespacepenify__hook_1_1ui__utils_adfcbbfe39029ab6d1dd33e7bf75ae115_cgraph.md5 @@ -0,0 +1 @@ +65fe82e63024fcc065fa65dce2c0c8fb \ No newline at end of file diff --git a/docs/rtf/namespacepenify__hook_1_1ui__utils_adfcbbfe39029ab6d1dd33e7bf75ae115_cgraph.svg b/docs/rtf/namespacepenify__hook_1_1ui__utils_adfcbbfe39029ab6d1dd33e7bf75ae115_cgraph.svg new file mode 100644 index 0000000..5d98bf8 --- /dev/null +++ b/docs/rtf/namespacepenify__hook_1_1ui__utils_adfcbbfe39029ab6d1dd33e7bf75ae115_cgraph.svg @@ -0,0 +1,39 @@ + + + + + + +penify_hook.ui_utils.print_processing + + + +Node1 + + +penify_hook.ui_utils.print +_processing + + + + + +Node2 + + +penify_hook.ui_utils.format +_file_path + + + + + +Node1->Node2 + + + + + diff --git a/docs/rtf/namespacepenify__hook_1_1ui__utils_adfcbbfe39029ab6d1dd33e7bf75ae115_icgraph.md5 b/docs/rtf/namespacepenify__hook_1_1ui__utils_adfcbbfe39029ab6d1dd33e7bf75ae115_icgraph.md5 new file mode 100644 index 0000000..568301c --- /dev/null +++ b/docs/rtf/namespacepenify__hook_1_1ui__utils_adfcbbfe39029ab6d1dd33e7bf75ae115_icgraph.md5 @@ -0,0 +1 @@ +34c0d184b1a914e69d4b0bdacbaaff04 \ No newline at end of file diff --git a/docs/rtf/namespacepenify__hook_1_1ui__utils_adfcbbfe39029ab6d1dd33e7bf75ae115_icgraph.svg b/docs/rtf/namespacepenify__hook_1_1ui__utils_adfcbbfe39029ab6d1dd33e7bf75ae115_icgraph.svg new file mode 100644 index 0000000..4185c69 --- /dev/null +++ b/docs/rtf/namespacepenify__hook_1_1ui__utils_adfcbbfe39029ab6d1dd33e7bf75ae115_icgraph.svg @@ -0,0 +1,39 @@ + + + + + + +penify_hook.ui_utils.print_processing + + + +Node1 + + +penify_hook.ui_utils.print +_processing + + + + + +Node2 + + +penify_hook.git_analyzer. +GitDocGenHook.run + + + + + +Node1->Node2 + + + + + diff --git a/docs/rtf/namespacepenify__hook_1_1ui__utils_af3441fb3c2c3850b8b3b6455a9fdaba4_icgraph.md5 b/docs/rtf/namespacepenify__hook_1_1ui__utils_af3441fb3c2c3850b8b3b6455a9fdaba4_icgraph.md5 new file mode 100644 index 0000000..354e231 --- /dev/null +++ b/docs/rtf/namespacepenify__hook_1_1ui__utils_af3441fb3c2c3850b8b3b6455a9fdaba4_icgraph.md5 @@ -0,0 +1 @@ +788f6631fd68b88312b14eace530bcf4 \ No newline at end of file diff --git a/docs/rtf/namespacepenify__hook_1_1ui__utils_af3441fb3c2c3850b8b3b6455a9fdaba4_icgraph.svg b/docs/rtf/namespacepenify__hook_1_1ui__utils_af3441fb3c2c3850b8b3b6455a9fdaba4_icgraph.svg new file mode 100644 index 0000000..aca9e47 --- /dev/null +++ b/docs/rtf/namespacepenify__hook_1_1ui__utils_af3441fb3c2c3850b8b3b6455a9fdaba4_icgraph.svg @@ -0,0 +1,72 @@ + + + + + + +penify_hook.ui_utils.format_file_path + + + +Node1 + + +penify_hook.ui_utils.format +_file_path + + + + + +Node2 + + +penify_hook.ui_utils.print +_processing + + + + + +Node1->Node2 + + + + + +Node4 + + +penify_hook.file_analyzer. +FileAnalyzerGenHook.print +_processing + + + + + +Node1->Node4 + + + + + +Node3 + + +penify_hook.git_analyzer. +GitDocGenHook.run + + + + + +Node2->Node3 + + + + + diff --git a/docs/rtf/namespacepenify__hook_1_1utils_a95c3f9c80860d6a2e2d061d2fb660a3f_cgraph.md5 b/docs/rtf/namespacepenify__hook_1_1utils_a95c3f9c80860d6a2e2d061d2fb660a3f_cgraph.md5 new file mode 100644 index 0000000..1431c94 --- /dev/null +++ b/docs/rtf/namespacepenify__hook_1_1utils_a95c3f9c80860d6a2e2d061d2fb660a3f_cgraph.md5 @@ -0,0 +1 @@ +dd726258fb2e799d709d2647521b3371 \ No newline at end of file diff --git a/docs/rtf/namespacepenify__hook_1_1utils_a95c3f9c80860d6a2e2d061d2fb660a3f_cgraph.svg b/docs/rtf/namespacepenify__hook_1_1utils_a95c3f9c80860d6a2e2d061d2fb660a3f_cgraph.svg new file mode 100644 index 0000000..058cc5f --- /dev/null +++ b/docs/rtf/namespacepenify__hook_1_1utils_a95c3f9c80860d6a2e2d061d2fb660a3f_cgraph.svg @@ -0,0 +1,29 @@ + + + + + + +penify_hook.utils.recursive_search_git_folder + + + +Node1 + + +penify_hook.utils.recursive +_search_git_folder + + + + + +Node1->Node1 + + + + + diff --git a/docs/rtf/namespacepenify__hook_1_1utils_a95c3f9c80860d6a2e2d061d2fb660a3f_icgraph.md5 b/docs/rtf/namespacepenify__hook_1_1utils_a95c3f9c80860d6a2e2d061d2fb660a3f_icgraph.md5 new file mode 100644 index 0000000..768ce43 --- /dev/null +++ b/docs/rtf/namespacepenify__hook_1_1utils_a95c3f9c80860d6a2e2d061d2fb660a3f_icgraph.md5 @@ -0,0 +1 @@ +7f750ca69d16550b240f7065f5db45d2 \ No newline at end of file diff --git a/docs/rtf/namespacepenify__hook_1_1utils_a95c3f9c80860d6a2e2d061d2fb660a3f_icgraph.svg b/docs/rtf/namespacepenify__hook_1_1utils_a95c3f9c80860d6a2e2d061d2fb660a3f_icgraph.svg new file mode 100644 index 0000000..a31134c --- /dev/null +++ b/docs/rtf/namespacepenify__hook_1_1utils_a95c3f9c80860d6a2e2d061d2fb660a3f_icgraph.svg @@ -0,0 +1,727 @@ + + + + + + +penify_hook.utils.recursive_search_git_folder + + + +Node1 + + +penify_hook.utils.recursive +_search_git_folder + + + + + +Node1->Node1 + + + + + +Node2 + + +penify_hook.commands.commit +_commands.commit_code + + + + + +Node1->Node2 + + + + + +Node10 + + +penify_hook.commands.config +_commands.get_penify_config + + + + + +Node1->Node10 + + + + + +Node22 + + +penify_hook.commands.config +_commands.load_env_files + + + + + +Node1->Node22 + + + + + +Node32 + + +penify_hook.commands.auth +_commands.save_credentials + + + + + +Node1->Node32 + + + + + +Node35 + + +penify_hook.commands.config +_commands.save_jira_config + + + + + +Node1->Node35 + + + + + +Node37 + + +penify_hook.commands.config +_commands.save_llm_config + + + + + +Node1->Node37 + + + + + +Node3 + + +penify_hook.commands.commit +_commands.handle_commit + + + + + +Node2->Node3 + + + + + +Node6 + + +tests.test_commit_commands. +TestCommitCommands.test +_commit_code_error_handling + + + + + +Node2->Node6 + + + + + +Node7 + + +tests.test_commit_commands. +TestCommitCommands.test +_commit_code_with_jira_client + + + + + +Node2->Node7 + + + + + +Node8 + + +tests.test_commit_commands. +TestCommitCommands.test +_commit_code_with_jira_connection +_failure + + + + + +Node2->Node8 + + + + + +Node9 + + +tests.test_commit_commands. +TestCommitCommands.test +_commit_code_with_llm_client + + + + + +Node2->Node9 + + + + + +Node4 + + +penify_hook.main.main + + + + + +Node3->Node4 + + + + + +Node5 + + +tests.test_commit_commands. +TestCommitCommands.test +_handle_commit + + + + + +Node3->Node5 + + + + + +Node4->Node4 + + + + + +Node11 + + +penify_hook.commands.config +_commands.get_token + + + + + +Node10->Node11 + + + + + +Node20 + + +tests.test_config_commands. +TestConfigCommands.test +_get_penify_config_existing_dir + + + + + +Node10->Node20 + + + + + +Node21 + + +tests.test_config_commands. +TestConfigCommands.test +_get_penify_config_new_dir + + + + + +Node10->Node21 + + + + + +Node11->Node3 + + + + + +Node12 + + +penify_hook.commands.doc +_commands.handle_docgen + + + + + +Node11->Node12 + + + + + +Node17 + + +tests.test_config_commands. +TestConfigCommands.test +_get_token_from_config + + + + + +Node11->Node17 + + + + + +Node18 + + +tests.test_config_commands. +TestConfigCommands.test +_get_token_from_env + + + + + +Node11->Node18 + + + + + +Node19 + + +tests.test_config_commands. +TestConfigCommands.test +_get_token_not_found + + + + + +Node11->Node19 + + + + + +Node12->Node4 + + + + + +Node13 + + +tests.test_doc_commands.test +_handle_docgen_generate + + + + + +Node12->Node13 + + + + + +Node14 + + +tests.test_doc_commands.test +_handle_docgen_install_hook + + + + + +Node12->Node14 + + + + + +Node15 + + +tests.test_doc_commands.test +_handle_docgen_no_token + + + + + +Node12->Node15 + + + + + +Node16 + + +tests.test_doc_commands.test +_handle_docgen_uninstall_hook + + + + + +Node12->Node16 + + + + + +Node22->Node11 + + + + + +Node22->Node22 + + + + + +Node23 + + +penify_hook.commands.config +_commands.get_jira_config + + + + + +Node22->Node23 + + + + + +Node28 + + +penify_hook.commands.config +_commands.get_llm_config + + + + + +Node22->Node28 + + + + + +Node23->Node3 + + + + + +Node24 + + +penify_hook.commands.config +_commands.config_jira_web + + + + + +Node23->Node24 + + + + + +Node27 + + +tests.test_config_commands. +TestConfigCommands.test +_get_jira_config_exists + + + + + +Node23->Node27 + + + + + +Node25 + + +penify_hook.config +_command.handle_config + + + + + +Node24->Node25 + + + + + +Node26 + + +tests.test_web_config.Test +WebConfig.test_config_jira +_web_server_setup + + + + + +Node24->Node26 + + + + + +Node25->Node4 + + + + + +Node28->Node3 + + + + + +Node29 + + +tests.test_config_commands. +TestConfigCommands.test +_get_llm_config_empty + + + + + +Node28->Node29 + + + + + +Node30 + + +tests.test_config_commands. +TestConfigCommands.test +_get_llm_config_exists + + + + + +Node28->Node30 + + + + + +Node31 + + +tests.test_config_commands. +TestConfigCommands.test +_get_llm_config_invalid_json + + + + + +Node28->Node31 + + + + + +Node33 + + +penify_hook.commands.auth +_commands.login + + + + + +Node32->Node33 + + + + + +Node34 + + +penify_hook.login_command.handle +_login + + + + + +Node33->Node34 + + + + + +Node34->Node4 + + + + + +Node35->Node24 + + + + + +Node35->Node25 + + + + + +Node36 + + +tests.test_config_commands. +TestConfigCommands.test +_save_jira_config_success + + + + + +Node35->Node36 + + + + + +Node37->Node25 + + + + + +Node38 + + +tests.test_config_commands. +TestConfigCommands.test +_save_llm_config_failure + + + + + +Node37->Node38 + + + + + +Node39 + + +tests.test_config_commands. +TestConfigCommands.test +_save_llm_config_success + + + + + +Node37->Node39 + + + + + diff --git a/docs/rtf/namespacetests_1_1test__doc__commands_a0e74c920f258f442914771164fe26b45_cgraph.md5 b/docs/rtf/namespacetests_1_1test__doc__commands_a0e74c920f258f442914771164fe26b45_cgraph.md5 new file mode 100644 index 0000000..b280dc5 --- /dev/null +++ b/docs/rtf/namespacetests_1_1test__doc__commands_a0e74c920f258f442914771164fe26b45_cgraph.md5 @@ -0,0 +1 @@ +28c17f21f2a2a250d23b14c68e3e5d3a \ No newline at end of file diff --git a/docs/rtf/namespacetests_1_1test__doc__commands_a0e74c920f258f442914771164fe26b45_cgraph.svg b/docs/rtf/namespacetests_1_1test__doc__commands_a0e74c920f258f442914771164fe26b45_cgraph.svg new file mode 100644 index 0000000..fc67c78 --- /dev/null +++ b/docs/rtf/namespacetests_1_1test__doc__commands_a0e74c920f258f442914771164fe26b45_cgraph.svg @@ -0,0 +1,39 @@ + + + + + + +tests.test_doc_commands.test_generate_doc_file_location + + + +Node1 + + +tests.test_doc_commands.test +_generate_doc_file_location + + + + + +Node2 + + +penify_hook.commands.doc +_commands.generate_doc + + + + + +Node1->Node2 + + + + + diff --git a/docs/rtf/namespacetests_1_1test__doc__commands_a0f27751d0ba2acfe40ef7e85bccf47d7_cgraph.md5 b/docs/rtf/namespacetests_1_1test__doc__commands_a0f27751d0ba2acfe40ef7e85bccf47d7_cgraph.md5 new file mode 100644 index 0000000..53e2e0a --- /dev/null +++ b/docs/rtf/namespacetests_1_1test__doc__commands_a0f27751d0ba2acfe40ef7e85bccf47d7_cgraph.md5 @@ -0,0 +1 @@ +192fbe5412db3710d1849692c54ac106 \ No newline at end of file diff --git a/docs/rtf/namespacetests_1_1test__doc__commands_a0f27751d0ba2acfe40ef7e85bccf47d7_cgraph.svg b/docs/rtf/namespacetests_1_1test__doc__commands_a0f27751d0ba2acfe40ef7e85bccf47d7_cgraph.svg new file mode 100644 index 0000000..0c38fcf --- /dev/null +++ b/docs/rtf/namespacetests_1_1test__doc__commands_a0f27751d0ba2acfe40ef7e85bccf47d7_cgraph.svg @@ -0,0 +1,39 @@ + + + + + + +tests.test_doc_commands.test_setup_docgen_parser + + + +Node1 + + +tests.test_doc_commands.test +_setup_docgen_parser + + + + + +Node2 + + +penify_hook.commands.doc +_commands.setup_docgen_parser + + + + + +Node1->Node2 + + + + + diff --git a/docs/rtf/namespacetests_1_1test__doc__commands_a1458af9ad0128c3ca1263b552fd5e482_cgraph.md5 b/docs/rtf/namespacetests_1_1test__doc__commands_a1458af9ad0128c3ca1263b552fd5e482_cgraph.md5 new file mode 100644 index 0000000..300f399 --- /dev/null +++ b/docs/rtf/namespacetests_1_1test__doc__commands_a1458af9ad0128c3ca1263b552fd5e482_cgraph.md5 @@ -0,0 +1 @@ +aef759552fc6cc4d80899b0b13739a5e \ No newline at end of file diff --git a/docs/rtf/namespacetests_1_1test__doc__commands_a1458af9ad0128c3ca1263b552fd5e482_cgraph.svg b/docs/rtf/namespacetests_1_1test__doc__commands_a1458af9ad0128c3ca1263b552fd5e482_cgraph.svg new file mode 100644 index 0000000..4d2e365 --- /dev/null +++ b/docs/rtf/namespacetests_1_1test__doc__commands_a1458af9ad0128c3ca1263b552fd5e482_cgraph.svg @@ -0,0 +1,186 @@ + + + + + + +tests.test_doc_commands.test_handle_docgen_uninstall_hook + + + +Node1 + + +tests.test_doc_commands.test +_handle_docgen_uninstall_hook + + + + + +Node2 + + +penify_hook.commands.doc +_commands.handle_docgen + + + + + +Node1->Node2 + + + + + +Node3 + + +penify_hook.commands.doc +_commands.generate_doc + + + + + +Node2->Node3 + + + + + +Node4 + + +penify_hook.commands.config +_commands.get_token + + + + + +Node2->Node4 + + + + + +Node9 + + +penify_hook.commands.hook +_commands.install_git_hook + + + + + +Node2->Node9 + + + + + +Node10 + + +penify_hook.commands.hook +_commands.uninstall_git_hook + + + + + +Node2->Node10 + + + + + +Node5 + + +penify_hook.commands.config +_commands.get_env_var_or +_default + + + + + +Node4->Node5 + + + + + +Node6 + + +penify_hook.commands.config +_commands.get_penify_config + + + + + +Node4->Node6 + + + + + +Node8 + + +penify_hook.commands.config +_commands.load_env_files + + + + + +Node4->Node8 + + + + + +Node7 + + +penify_hook.utils.recursive +_search_git_folder + + + + + +Node6->Node7 + + + + + +Node7->Node7 + + + + + +Node8->Node7 + + + + + +Node8->Node8 + + + + + diff --git a/docs/rtf/namespacetests_1_1test__doc__commands_a335e7fd4912192c7276cf31bbebc6eb0_cgraph.md5 b/docs/rtf/namespacetests_1_1test__doc__commands_a335e7fd4912192c7276cf31bbebc6eb0_cgraph.md5 new file mode 100644 index 0000000..ef64a42 --- /dev/null +++ b/docs/rtf/namespacetests_1_1test__doc__commands_a335e7fd4912192c7276cf31bbebc6eb0_cgraph.md5 @@ -0,0 +1 @@ +10d76966ac7089e8706fb1aec3e4f9d6 \ No newline at end of file diff --git a/docs/rtf/namespacetests_1_1test__doc__commands_a335e7fd4912192c7276cf31bbebc6eb0_cgraph.svg b/docs/rtf/namespacetests_1_1test__doc__commands_a335e7fd4912192c7276cf31bbebc6eb0_cgraph.svg new file mode 100644 index 0000000..2445c23 --- /dev/null +++ b/docs/rtf/namespacetests_1_1test__doc__commands_a335e7fd4912192c7276cf31bbebc6eb0_cgraph.svg @@ -0,0 +1,39 @@ + + + + + + +tests.test_doc_commands.test_generate_doc_with_file_exception + + + +Node1 + + +tests.test_doc_commands.test +_generate_doc_with_file_exception + + + + + +Node2 + + +penify_hook.commands.doc +_commands.generate_doc + + + + + +Node1->Node2 + + + + + diff --git a/docs/rtf/namespacetests_1_1test__doc__commands_a4bb75610e40d94d42bc169b25403c186_cgraph.md5 b/docs/rtf/namespacetests_1_1test__doc__commands_a4bb75610e40d94d42bc169b25403c186_cgraph.md5 new file mode 100644 index 0000000..076630a --- /dev/null +++ b/docs/rtf/namespacetests_1_1test__doc__commands_a4bb75610e40d94d42bc169b25403c186_cgraph.md5 @@ -0,0 +1 @@ +064f1a8c9470887507dea5cf5dd184eb \ No newline at end of file diff --git a/docs/rtf/namespacetests_1_1test__doc__commands_a4bb75610e40d94d42bc169b25403c186_cgraph.svg b/docs/rtf/namespacetests_1_1test__doc__commands_a4bb75610e40d94d42bc169b25403c186_cgraph.svg new file mode 100644 index 0000000..d0a2d25 --- /dev/null +++ b/docs/rtf/namespacetests_1_1test__doc__commands_a4bb75610e40d94d42bc169b25403c186_cgraph.svg @@ -0,0 +1,39 @@ + + + + + + +tests.test_doc_commands.test_generate_doc_folder_location + + + +Node1 + + +tests.test_doc_commands.test +_generate_doc_folder_location + + + + + +Node2 + + +penify_hook.commands.doc +_commands.generate_doc + + + + + +Node1->Node2 + + + + + diff --git a/docs/rtf/namespacetests_1_1test__doc__commands_a64165ddfdb3071a88422f080f0e529a3_cgraph.md5 b/docs/rtf/namespacetests_1_1test__doc__commands_a64165ddfdb3071a88422f080f0e529a3_cgraph.md5 new file mode 100644 index 0000000..314f15d --- /dev/null +++ b/docs/rtf/namespacetests_1_1test__doc__commands_a64165ddfdb3071a88422f080f0e529a3_cgraph.md5 @@ -0,0 +1 @@ +e42b926dad2f0ff5205af415d972f1da \ No newline at end of file diff --git a/docs/rtf/namespacetests_1_1test__doc__commands_a64165ddfdb3071a88422f080f0e529a3_cgraph.svg b/docs/rtf/namespacetests_1_1test__doc__commands_a64165ddfdb3071a88422f080f0e529a3_cgraph.svg new file mode 100644 index 0000000..e97c365 --- /dev/null +++ b/docs/rtf/namespacetests_1_1test__doc__commands_a64165ddfdb3071a88422f080f0e529a3_cgraph.svg @@ -0,0 +1,40 @@ + + + + + + +tests.test_doc_commands.test_generate_doc_with_folder_exception + + + +Node1 + + +tests.test_doc_commands.test +_generate_doc_with_folder +_exception + + + + + +Node2 + + +penify_hook.commands.doc +_commands.generate_doc + + + + + +Node1->Node2 + + + + + diff --git a/docs/rtf/namespacetests_1_1test__doc__commands_a806110833eb0aad547156faf014b31d8_cgraph.md5 b/docs/rtf/namespacetests_1_1test__doc__commands_a806110833eb0aad547156faf014b31d8_cgraph.md5 new file mode 100644 index 0000000..99c08a9 --- /dev/null +++ b/docs/rtf/namespacetests_1_1test__doc__commands_a806110833eb0aad547156faf014b31d8_cgraph.md5 @@ -0,0 +1 @@ +d4d1f9d92eb42ae249ce3409ab7627ac \ No newline at end of file diff --git a/docs/rtf/namespacetests_1_1test__doc__commands_a806110833eb0aad547156faf014b31d8_cgraph.svg b/docs/rtf/namespacetests_1_1test__doc__commands_a806110833eb0aad547156faf014b31d8_cgraph.svg new file mode 100644 index 0000000..46d7331 --- /dev/null +++ b/docs/rtf/namespacetests_1_1test__doc__commands_a806110833eb0aad547156faf014b31d8_cgraph.svg @@ -0,0 +1,39 @@ + + + + + + +tests.test_doc_commands.test_generate_doc_no_location + + + +Node1 + + +tests.test_doc_commands.test +_generate_doc_no_location + + + + + +Node2 + + +penify_hook.commands.doc +_commands.generate_doc + + + + + +Node1->Node2 + + + + + diff --git a/docs/rtf/namespacetests_1_1test__doc__commands_ab158ffa48469b6c097a7a55fcb20c21a_cgraph.md5 b/docs/rtf/namespacetests_1_1test__doc__commands_ab158ffa48469b6c097a7a55fcb20c21a_cgraph.md5 new file mode 100644 index 0000000..28ac74a --- /dev/null +++ b/docs/rtf/namespacetests_1_1test__doc__commands_ab158ffa48469b6c097a7a55fcb20c21a_cgraph.md5 @@ -0,0 +1 @@ +810237d2c8640fcab5bd4448f12a9692 \ No newline at end of file diff --git a/docs/rtf/namespacetests_1_1test__doc__commands_ab158ffa48469b6c097a7a55fcb20c21a_cgraph.svg b/docs/rtf/namespacetests_1_1test__doc__commands_ab158ffa48469b6c097a7a55fcb20c21a_cgraph.svg new file mode 100644 index 0000000..6706a8c --- /dev/null +++ b/docs/rtf/namespacetests_1_1test__doc__commands_ab158ffa48469b6c097a7a55fcb20c21a_cgraph.svg @@ -0,0 +1,186 @@ + + + + + + +tests.test_doc_commands.test_handle_docgen_generate + + + +Node1 + + +tests.test_doc_commands.test +_handle_docgen_generate + + + + + +Node2 + + +penify_hook.commands.doc +_commands.handle_docgen + + + + + +Node1->Node2 + + + + + +Node3 + + +penify_hook.commands.doc +_commands.generate_doc + + + + + +Node2->Node3 + + + + + +Node4 + + +penify_hook.commands.config +_commands.get_token + + + + + +Node2->Node4 + + + + + +Node9 + + +penify_hook.commands.hook +_commands.install_git_hook + + + + + +Node2->Node9 + + + + + +Node10 + + +penify_hook.commands.hook +_commands.uninstall_git_hook + + + + + +Node2->Node10 + + + + + +Node5 + + +penify_hook.commands.config +_commands.get_env_var_or +_default + + + + + +Node4->Node5 + + + + + +Node6 + + +penify_hook.commands.config +_commands.get_penify_config + + + + + +Node4->Node6 + + + + + +Node8 + + +penify_hook.commands.config +_commands.load_env_files + + + + + +Node4->Node8 + + + + + +Node7 + + +penify_hook.utils.recursive +_search_git_folder + + + + + +Node6->Node7 + + + + + +Node7->Node7 + + + + + +Node8->Node7 + + + + + +Node8->Node8 + + + + + diff --git a/docs/rtf/namespacetests_1_1test__doc__commands_ab74688baa8c9b5ba302c2877a9789d05_cgraph.md5 b/docs/rtf/namespacetests_1_1test__doc__commands_ab74688baa8c9b5ba302c2877a9789d05_cgraph.md5 new file mode 100644 index 0000000..56e1467 --- /dev/null +++ b/docs/rtf/namespacetests_1_1test__doc__commands_ab74688baa8c9b5ba302c2877a9789d05_cgraph.md5 @@ -0,0 +1 @@ +dc60bba75d6f8dafbd4701e4ac271385 \ No newline at end of file diff --git a/docs/rtf/namespacetests_1_1test__doc__commands_ab74688baa8c9b5ba302c2877a9789d05_cgraph.svg b/docs/rtf/namespacetests_1_1test__doc__commands_ab74688baa8c9b5ba302c2877a9789d05_cgraph.svg new file mode 100644 index 0000000..b4c88c5 --- /dev/null +++ b/docs/rtf/namespacetests_1_1test__doc__commands_ab74688baa8c9b5ba302c2877a9789d05_cgraph.svg @@ -0,0 +1,186 @@ + + + + + + +tests.test_doc_commands.test_handle_docgen_install_hook + + + +Node1 + + +tests.test_doc_commands.test +_handle_docgen_install_hook + + + + + +Node2 + + +penify_hook.commands.doc +_commands.handle_docgen + + + + + +Node1->Node2 + + + + + +Node3 + + +penify_hook.commands.doc +_commands.generate_doc + + + + + +Node2->Node3 + + + + + +Node4 + + +penify_hook.commands.config +_commands.get_token + + + + + +Node2->Node4 + + + + + +Node9 + + +penify_hook.commands.hook +_commands.install_git_hook + + + + + +Node2->Node9 + + + + + +Node10 + + +penify_hook.commands.hook +_commands.uninstall_git_hook + + + + + +Node2->Node10 + + + + + +Node5 + + +penify_hook.commands.config +_commands.get_env_var_or +_default + + + + + +Node4->Node5 + + + + + +Node6 + + +penify_hook.commands.config +_commands.get_penify_config + + + + + +Node4->Node6 + + + + + +Node8 + + +penify_hook.commands.config +_commands.load_env_files + + + + + +Node4->Node8 + + + + + +Node7 + + +penify_hook.utils.recursive +_search_git_folder + + + + + +Node6->Node7 + + + + + +Node7->Node7 + + + + + +Node8->Node7 + + + + + +Node8->Node8 + + + + + diff --git a/docs/rtf/namespacetests_1_1test__doc__commands_aec76cc25c23476794234cdadbcaef0c0_cgraph.md5 b/docs/rtf/namespacetests_1_1test__doc__commands_aec76cc25c23476794234cdadbcaef0c0_cgraph.md5 new file mode 100644 index 0000000..ef9f04c --- /dev/null +++ b/docs/rtf/namespacetests_1_1test__doc__commands_aec76cc25c23476794234cdadbcaef0c0_cgraph.md5 @@ -0,0 +1 @@ +7930a342103b95a29b43ca93e1212cff \ No newline at end of file diff --git a/docs/rtf/namespacetests_1_1test__doc__commands_aec76cc25c23476794234cdadbcaef0c0_cgraph.svg b/docs/rtf/namespacetests_1_1test__doc__commands_aec76cc25c23476794234cdadbcaef0c0_cgraph.svg new file mode 100644 index 0000000..6172b6f --- /dev/null +++ b/docs/rtf/namespacetests_1_1test__doc__commands_aec76cc25c23476794234cdadbcaef0c0_cgraph.svg @@ -0,0 +1,39 @@ + + + + + + +tests.test_doc_commands.test_generate_doc_error_handling + + + +Node1 + + +tests.test_doc_commands.test +_generate_doc_error_handling + + + + + +Node2 + + +penify_hook.commands.doc +_commands.generate_doc + + + + + +Node1->Node2 + + + + + diff --git a/docs/rtf/namespacetests_1_1test__doc__commands_af9b01e5fc89255cac96747fa081c442c_cgraph.md5 b/docs/rtf/namespacetests_1_1test__doc__commands_af9b01e5fc89255cac96747fa081c442c_cgraph.md5 new file mode 100644 index 0000000..8969799 --- /dev/null +++ b/docs/rtf/namespacetests_1_1test__doc__commands_af9b01e5fc89255cac96747fa081c442c_cgraph.md5 @@ -0,0 +1 @@ +4dfa85ad92a13ab307edd504ab65bb1a \ No newline at end of file diff --git a/docs/rtf/namespacetests_1_1test__doc__commands_af9b01e5fc89255cac96747fa081c442c_cgraph.svg b/docs/rtf/namespacetests_1_1test__doc__commands_af9b01e5fc89255cac96747fa081c442c_cgraph.svg new file mode 100644 index 0000000..e5d09f9 --- /dev/null +++ b/docs/rtf/namespacetests_1_1test__doc__commands_af9b01e5fc89255cac96747fa081c442c_cgraph.svg @@ -0,0 +1,186 @@ + + + + + + +tests.test_doc_commands.test_handle_docgen_no_token + + + +Node1 + + +tests.test_doc_commands.test +_handle_docgen_no_token + + + + + +Node2 + + +penify_hook.commands.doc +_commands.handle_docgen + + + + + +Node1->Node2 + + + + + +Node3 + + +penify_hook.commands.doc +_commands.generate_doc + + + + + +Node2->Node3 + + + + + +Node4 + + +penify_hook.commands.config +_commands.get_token + + + + + +Node2->Node4 + + + + + +Node9 + + +penify_hook.commands.hook +_commands.install_git_hook + + + + + +Node2->Node9 + + + + + +Node10 + + +penify_hook.commands.hook +_commands.uninstall_git_hook + + + + + +Node2->Node10 + + + + + +Node5 + + +penify_hook.commands.config +_commands.get_env_var_or +_default + + + + + +Node4->Node5 + + + + + +Node6 + + +penify_hook.commands.config +_commands.get_penify_config + + + + + +Node4->Node6 + + + + + +Node8 + + +penify_hook.commands.config +_commands.load_env_files + + + + + +Node4->Node8 + + + + + +Node7 + + +penify_hook.utils.recursive +_search_git_folder + + + + + +Node6->Node7 + + + + + +Node7->Node7 + + + + + +Node8->Node7 + + + + + +Node8->Node8 + + + + + diff --git a/docs/rtf/refman.rtf b/docs/rtf/refman.rtf new file mode 100644 index 0000000..7ca2dc0 --- /dev/null +++ b/docs/rtf/refman.rtf @@ -0,0 +1,8871 @@ +{\rtf1\ansi\ansicpg1252\uc1 \deff0\deflang1033\deflangfe1033 +{\fonttbl {\f0\froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;} +{\f1\fswiss\fcharset0\fprq2{\*\panose 020b0604020202020204}Arial;} +{\f2\fmodern\fcharset0\fprq1{\*\panose 02070309020205020404}Courier New;} +{\f3\froman\fcharset2\fprq2{\*\panose 05050102010706020507}Symbol;} +} +{\colortbl;\red0\green0\blue0;\red0\green0\blue255;\red0\green255\blue255;\red0\green255\blue0;\red255\green0\blue255;\red255\green0\blue0;\red255\green255\blue0;\red255\green255\blue255;\red0\green0\blue128;\red0\green128\blue128;\red0\green128\blue0;\red128\green0\blue128;\red128\green0\blue0;\red128\green128\blue0;\red128\green128\blue128;\red192\green192\blue192;\red0\green128\blue0;\red96\green64\blue32;\rede0\green128\blue0;\red128\green0\blue0;\red128\green96\blue32;\red0\green32\blue128;\red0\green128\blue128;\red255\green0\blue255;\red0\green0\blue0;\red112\green0\blue112;\red255\green0\blue0;} +{\stylesheet +{\widctlpar\adjustright \fs20\cgrid \snext0 Normal;} +{\paperw11900\paperh16840\margl1800\margr1800\margt1440\margb1440\gutter0\ltrsect} +{\s1\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs36\kerning36\cgrid \sbasedon0 \snext0 heading 1;} +{\s2\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs28\kerning28\cgrid \sbasedon0 \snext0 heading 2;} +{\s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid \sbasedon0 \snext0 heading 3;} +{\s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid \sbasedon0 \snext0 heading 4;}{\*\cs10 \additive Default Paragraph Font;} +{\s5\sb90\sa30\keepn\widctlpar\adjustright \b\f1\fs20\cgrid \sbasedon0 \snext0 heading 5;}{\*\cs10 \additive Default Paragraph Font;} +{\s15\qc\sb240\sa60\widctlpar\outlinelevel0\adjustright \b\f1\fs32\kerning28\cgrid \sbasedon0 \snext15 Title;} +{\s16\qc\sa60\widctlpar\outlinelevel1\adjustright \f1\cgrid \sbasedon0 \snext16 Subtitle;} +{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid \sbasedon0 \snext17 BodyText;} +{\s18\widctlpar\fs22\cgrid \sbasedon0 \snext18 DenseText;} +{\s28\widctlpar\tqc\tx4320\tqr\tx8640\adjustright \fs20\cgrid \sbasedon0 \snext28 header;} +{\s29\widctlpar\tqc\tx4320\tqr\tx8640\qr\adjustright \fs20\cgrid \sbasedon0 \snext29 footer;} +{\s30\li360\sa60\sb120\keepn\widctlpar\adjustright \b\f1\fs20\cgrid \sbasedon0 \snext30 GroupHeader;} +{\s40\li0\widctlpar\adjustright \shading1000\cbpat8 \f2\fs16\cgrid \sbasedon0 \snext41 Code Example 0;} +{\s41\li360\widctlpar\adjustright \shading1000\cbpat8 \f2\fs16\cgrid \sbasedon0 \snext42 Code Example 1;} +{\s42\li720\widctlpar\adjustright \shading1000\cbpat8 \f2\fs16\cgrid \sbasedon0 \snext43 Code Example 2;} +{\s43\li1080\widctlpar\adjustright \shading1000\cbpat8 \f2\fs16\cgrid \sbasedon0 \snext44 Code Example 3;} +{\s44\li1440\widctlpar\adjustright \shading1000\cbpat8 \f2\fs16\cgrid \sbasedon0 \snext45 Code Example 4;} +{\s45\li1800\widctlpar\adjustright \shading1000\cbpat8 \f2\fs16\cgrid \sbasedon0 \snext46 Code Example 5;} +{\s46\li2160\widctlpar\adjustright \shading1000\cbpat8 \f2\fs16\cgrid \sbasedon0 \snext47 Code Example 6;} +{\s47\li2520\widctlpar\adjustright \shading1000\cbpat8 \f2\fs16\cgrid \sbasedon0 \snext48 Code Example 7;} +{\s48\li2880\widctlpar\adjustright \shading1000\cbpat8 \f2\fs16\cgrid \sbasedon0 \snext49 Code Example 8;} +{\s49\li3240\widctlpar\adjustright \shading1000\cbpat8 \f2\fs16\cgrid \sbasedon0 \snext50 Code Example 9;} +{\s50\li3600\widctlpar\adjustright \shading1000\cbpat8 \f2\fs16\cgrid \sbasedon0 \snext51 Code Example 10;} +{\s51\li3960\widctlpar\adjustright \shading1000\cbpat8 \f2\fs16\cgrid \sbasedon0 \snext52 Code Example 11;} +{\s52\li4320\widctlpar\adjustright \shading1000\cbpat8 \f2\fs16\cgrid \sbasedon0 \snext53 Code Example 12;} +{\s53\li4680\widctlpar\adjustright \shading1000\cbpat8 \f2\fs16\cgrid \sbasedon0 \snext53 Code Example 13;} +{\s60\li0\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid \sbasedon0 \snext61 List Continue 0;} +{\s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid \sbasedon0 \snext62 List Continue 1;} +{\s62\li720\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid \sbasedon0 \snext63 List Continue 2;} +{\s63\li1080\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid \sbasedon0 \snext64 List Continue 3;} +{\s64\li1440\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid \sbasedon0 \snext65 List Continue 4;} +{\s65\li1800\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid \sbasedon0 \snext66 List Continue 5;} +{\s66\li2160\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid \sbasedon0 \snext67 List Continue 6;} +{\s67\li2520\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid \sbasedon0 \snext68 List Continue 7;} +{\s68\li2880\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid \sbasedon0 \snext69 List Continue 8;} +{\s69\li3240\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid \sbasedon0 \snext70 List Continue 9;} +{\s70\li3600\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid \sbasedon0 \snext71 List Continue 10;} +{\s71\li3960\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid \sbasedon0 \snext72 List Continue 11;} +{\s72\li4320\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid \sbasedon0 \snext73 List Continue 12;} +{\s73\li4680\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid \sbasedon0 \snext73 List Continue 13;} +{\s80\li0\widctlpar\ql\adjustright \fs20\cgrid \sbasedon0 \snext81 DescContinue 0;} +{\s81\li360\widctlpar\ql\adjustright \fs20\cgrid \sbasedon0 \snext82 DescContinue 1;} +{\s82\li720\widctlpar\ql\adjustright \fs20\cgrid \sbasedon0 \snext83 DescContinue 2;} +{\s83\li1080\widctlpar\ql\adjustright \fs20\cgrid \sbasedon0 \snext84 DescContinue 3;} +{\s84\li1440\widctlpar\ql\adjustright \fs20\cgrid \sbasedon0 \snext85 DescContinue 4;} +{\s85\li1800\widctlpar\ql\adjustright \fs20\cgrid \sbasedon0 \snext86 DescContinue 5;} +{\s86\li2160\widctlpar\ql\adjustright \fs20\cgrid \sbasedon0 \snext87 DescContinue 6;} +{\s87\li2520\widctlpar\ql\adjustright \fs20\cgrid \sbasedon0 \snext88 DescContinue 7;} +{\s88\li2880\widctlpar\ql\adjustright \fs20\cgrid \sbasedon0 \snext89 DescContinue 8;} +{\s89\li3240\widctlpar\ql\adjustright \fs20\cgrid \sbasedon0 \snext90 DescContinue 9;} +{\s90\li3600\widctlpar\ql\adjustright \fs20\cgrid \sbasedon0 \snext91 DescContinue 10;} +{\s91\li3960\widctlpar\ql\adjustright \fs20\cgrid \sbasedon0 \snext92 DescContinue 11;} +{\s92\li4320\widctlpar\ql\adjustright \fs20\cgrid \sbasedon0 \snext93 DescContinue 12;} +{\s93\li4680\widctlpar\ql\adjustright \fs20\cgrid \sbasedon0 \snext93 DescContinue 13;} +{\s100\li0\sa30\sb30\widctlpar\tqr\tldot\tx8640\adjustright \fs20\cgrid \sbasedon0 \snext101 LatexTOC 0;} +{\s101\li360\sa27\sb27\widctlpar\tqr\tldot\tx8640\adjustright \fs20\cgrid \sbasedon0 \snext102 LatexTOC 1;} +{\s102\li720\sa24\sb24\widctlpar\tqr\tldot\tx8640\adjustright \fs20\cgrid \sbasedon0 \snext103 LatexTOC 2;} +{\s103\li1080\sa21\sb21\widctlpar\tqr\tldot\tx8640\adjustright \fs20\cgrid \sbasedon0 \snext104 LatexTOC 3;} +{\s104\li1440\sa18\sb18\widctlpar\tqr\tldot\tx8640\adjustright \fs20\cgrid \sbasedon0 \snext105 LatexTOC 4;} +{\s105\li1800\sa15\sb15\widctlpar\tqr\tldot\tx8640\adjustright \fs20\cgrid \sbasedon0 \snext106 LatexTOC 5;} +{\s106\li2160\sa12\sb12\widctlpar\tqr\tldot\tx8640\adjustright \fs20\cgrid \sbasedon0 \snext107 LatexTOC 6;} +{\s107\li2520\sa9\sb9\widctlpar\tqr\tldot\tx8640\adjustright \fs20\cgrid \sbasedon0 \snext108 LatexTOC 7;} +{\s108\li2880\sa6\sb6\widctlpar\tqr\tldot\tx8640\adjustright \fs20\cgrid \sbasedon0 \snext109 LatexTOC 8;} +{\s109\li3240\sa3\sb3\widctlpar\tqr\tldot\tx8640\adjustright \fs20\cgrid \sbasedon0 \snext110 LatexTOC 9;} +{\s110\li3600\sa3\sb3\widctlpar\tqr\tldot\tx8640\adjustright \fs20\cgrid \sbasedon0 \snext111 LatexTOC 10;} +{\s111\li3960\sa3\sb3\widctlpar\tqr\tldot\tx8640\adjustright \fs20\cgrid \sbasedon0 \snext112 LatexTOC 11;} +{\s112\li4320\sa3\sb3\widctlpar\tqr\tldot\tx8640\adjustright \fs20\cgrid \sbasedon0 \snext113 LatexTOC 12;} +{\s113\li4680\sa3\sb3\widctlpar\tqr\tldot\tx8640\adjustright \fs20\cgrid \sbasedon0 \snext113 LatexTOC 13;} +{\s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid \sbasedon0 \snext121 \sautoupd List Bullet 0;} +{\s121\fi-360\li720\widctlpar\jclisttab\tx720{\*\pn \pnlvlbody\ilvl0\ls2\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid \sbasedon0 \snext122 \sautoupd List Bullet 1;} +{\s122\fi-360\li1080\widctlpar\jclisttab\tx1080{\*\pn \pnlvlbody\ilvl0\ls3\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid \sbasedon0 \snext123 \sautoupd List Bullet 2;} +{\s123\fi-360\li1440\widctlpar\jclisttab\tx1440{\*\pn \pnlvlbody\ilvl0\ls4\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid \sbasedon0 \snext124 \sautoupd List Bullet 3;} +{\s124\fi-360\li1800\widctlpar\jclisttab\tx1800{\*\pn \pnlvlbody\ilvl0\ls5\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid \sbasedon0 \snext125 \sautoupd List Bullet 4;} +{\s125\fi-360\li2160\widctlpar\jclisttab\tx2160{\*\pn \pnlvlbody\ilvl0\ls6\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid \sbasedon0 \snext126 \sautoupd List Bullet 5;} +{\s126\fi-360\li2520\widctlpar\jclisttab\tx2520{\*\pn \pnlvlbody\ilvl0\ls7\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid \sbasedon0 \snext127 \sautoupd List Bullet 6;} +{\s127\fi-360\li2880\widctlpar\jclisttab\tx2880{\*\pn \pnlvlbody\ilvl0\ls8\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid \sbasedon0 \snext128 \sautoupd List Bullet 7;} +{\s128\fi-360\li3240\widctlpar\jclisttab\tx3240{\*\pn \pnlvlbody\ilvl0\ls9\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid \sbasedon0 \snext129 \sautoupd List Bullet 8;} +{\s129\fi-360\li3600\widctlpar\jclisttab\tx3600{\*\pn \pnlvlbody\ilvl0\ls10\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid \sbasedon0 \snext130 \sautoupd List Bullet 9;} +{\s130\fi-360\li3960\widctlpar\jclisttab\tx3960{\*\pn \pnlvlbody\ilvl0\ls11\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid \sbasedon0 \snext131 \sautoupd List Bullet 10;} +{\s131\fi-360\li4320\widctlpar\jclisttab\tx4320{\*\pn \pnlvlbody\ilvl0\ls12\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid \sbasedon0 \snext132 \sautoupd List Bullet 11;} +{\s132\fi-360\li4680\widctlpar\jclisttab\tx4680{\*\pn \pnlvlbody\ilvl0\ls13\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid \sbasedon0 \snext133 \sautoupd List Bullet 12;} +{\s133\fi-360\li5040\widctlpar\jclisttab\tx5040{\*\pn \pnlvlbody\ilvl0\ls14\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid \sbasedon0 \snext133 \sautoupd List Bullet 13;} +{\s140\fi-360\li360\widctlpar\fs20\cgrid \sbasedon0 \snext141 \sautoupd List Enum 0;} +{\s141\fi-360\li720\widctlpar\fs20\cgrid \sbasedon0 \snext142 \sautoupd List Enum 1;} +{\s142\fi-360\li1080\widctlpar\fs20\cgrid \sbasedon0 \snext143 \sautoupd List Enum 2;} +{\s143\fi-360\li1440\widctlpar\fs20\cgrid \sbasedon0 \snext144 \sautoupd List Enum 3;} +{\s144\fi-360\li1800\widctlpar\fs20\cgrid \sbasedon0 \snext145 \sautoupd List Enum 4;} +{\s145\fi-360\li2160\widctlpar\fs20\cgrid \sbasedon0 \snext146 \sautoupd List Enum 5;} +{\s146\fi-360\li2520\widctlpar\fs20\cgrid \sbasedon0 \snext147 \sautoupd List Enum 6;} +{\s147\fi-360\li2880\widctlpar\fs20\cgrid \sbasedon0 \snext148 \sautoupd List Enum 7;} +{\s148\fi-360\li3240\widctlpar\fs20\cgrid \sbasedon0 \snext149 \sautoupd List Enum 8;} +{\s149\fi-360\li3600\widctlpar\fs20\cgrid \sbasedon0 \snext150 \sautoupd List Enum 9;} +{\s150\fi-360\li3960\widctlpar\fs20\cgrid \sbasedon0 \snext151 \sautoupd List Enum 10;} +{\s151\fi-360\li4320\widctlpar\fs20\cgrid \sbasedon0 \snext152 \sautoupd List Enum 11;} +{\s152\fi-360\li4680\widctlpar\fs20\cgrid \sbasedon0 \snext153 \sautoupd List Enum 12;} +{\s153\fi-360\li5040\widctlpar\fs20\cgrid \sbasedon0 \snext153 \sautoupd List Enum 13;} +} +{\info +{\title {\comment penify-cli }penify-cli} +{\comment Generated by doxygen 1.9.4.} +{\creatim \yr2025\mo5\dy15\hr8\min8\sec59} +}\pard\plain +\sectd\pgnlcrm +{\footer \s29\widctlpar\tqc\tx4320\tqr\tx8640\qr\adjustright \fs20\cgrid {\chpgn}} +\pard\plain \s16\qc\sa60\widctlpar\outlinelevel1\adjustright \f1\cgrid +\vertalc\qc\par\par\par\par\par\par\par +\pard\plain \s15\qc\sb240\sa60\widctlpar\outlinelevel0\adjustright \b\f1\fs32\kerning28\cgrid +{\field\fldedit {\*\fldinst TITLE \\*MERGEFORMAT}{\fldrslt penify-cli}}\par +\pard\plain \s16\qc\sa60\widctlpar\outlinelevel1\adjustright \f1\cgrid +\par +\par\par\par\par\par\par\par\par\par\par\par\par +\pard\plain \s16\qc\sa60\widctlpar\outlinelevel1\adjustright \f1\cgrid +{\field\fldedit {\*\fldinst AUTHOR \\*MERGEFORMAT}{\fldrslt AUTHOR}}\par +Version \par{\field\fldedit {\*\fldinst CREATEDATE \\*MERGEFORMAT}{\fldrslt Thu May 15 2025 }}\par +\page\page\vertalt +\pard\plain +\s1\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs36\kerning36\cgrid Table of Contents\par +\pard\plain \par +{\field\fldedit {\*\fldinst TOC \\f \\*MERGEFORMAT}{\fldrslt Table of contents}}\par +\pard\plain +\sect \sbkpage \pgndec \pgnrestart +\sect \sectd \sbknone +{\footer \s29\widctlpar\tqc\tx4320\tqr\tx8640\qr\adjustright \fs20\cgrid {\chpgn}} + +\pard\plain \sect\sbkpage +\s1\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs36\kerning36\cgrid +Penify CLI - Commit Commands{\tc \v Penify CLI - Commit Commands}\par \pard\plain +{\bkmkstart AAAAAAAAPB} +{\bkmkend AAAAAAAAPB} +\par \pard\plain +{ +\pard\plain \s17\sa60\sb30\widctlpar\qj \fs22\cgrid {\s17\sa60\sb30\widctlpar\qj \fs22\cgrid +The {\f2 commit} command allows you to generate smart, AI-powered commit messages for your Git changes. This document explains all available options and combinations.\par +{\bkmkstart AAAAAAAABJ} +{\bkmkend AAAAAAAABJ} +{{\pard\plain \s2\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs28\kerning28\cgrid +Basic Usage +\par} +{\tc\tcl2 \v Basic Usage} +{ +\par +\pard\plain \s40\li0\widctlpar\adjustright \shading1000\cbpat8 \f2\fs16\cgrid penify commit\par +} +\par +By default, this command:{ +\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +Analyzes your staged Git changes\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +Generates a concise commit title only\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +Uses local LLM if configured, or falls back to Penify API\par} +\par +\par} +{\bkmkstart AAAAAAAABK} +{\bkmkend AAAAAAAABK} +{{\pard\plain \s2\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs28\kerning28\cgrid +Command Options +\par} +{\tc\tcl2 \v Command Options} +{\bkmkstart AAAAAAAABL} +{\bkmkend AAAAAAAABL} +{{\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid +-m, --message +\par} +{\tc\tcl3 \v -m, --message} +Provide context for the commit message generation:\par +{ +\par +\pard\plain \s40\li0\widctlpar\adjustright \shading1000\cbpat8 \f2\fs16\cgrid penify commit -m "Fix login flow"\par +} +\par +This hint helps the AI understand your intention and improves the quality of the generated message.\par} +{\bkmkstart AAAAAAAABM} +{\bkmkend AAAAAAAABM} +{{\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid +-e, --terminal +\par} +{\tc\tcl3 \v -e, --terminal} +Open an editor to review and edit the generated commit message before committing:\par +{ +\par +\pard\plain \s40\li0\widctlpar\adjustright \shading1000\cbpat8 \f2\fs16\cgrid penify commit -e\par +} +\par +This opens your default Git editor with the generated message for review.\par} +{\bkmkstart AAAAAAAABN} +{\bkmkend AAAAAAAABN} +{{\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid +-d, --description +\par} +{\tc\tcl3 \v -d, --description} +Generate a detailed commit message with both title and description:\par +{ +\par +\pard\plain \s40\li0\widctlpar\adjustright \shading1000\cbpat8 \f2\fs16\cgrid penify commit -d\par +} +\par +Without this flag, only the commit title is generated.\par} +\par} +{\bkmkstart AAAAAAAABO} +{\bkmkend AAAAAAAABO} +{{\pard\plain \s2\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs28\kerning28\cgrid +Option Combinations +\par} +{\tc\tcl2 \v Option Combinations} +You can combine these options for different workflows:\par +{\bkmkstart AAAAAAAABP} +{\bkmkend AAAAAAAABP} +{{\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid +Generate Title Only with Context +\par} +{\tc\tcl3 \v Generate Title Only with Context} +{ +\par +\pard\plain \s40\li0\widctlpar\adjustright \shading1000\cbpat8 \f2\fs16\cgrid penify commit -m "Update login UI"\par +} +\par} +{\bkmkstart AAAAAAAABQ} +{\bkmkend AAAAAAAABQ} +{{\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid +Generate Title and Description with Context +\par} +{\tc\tcl3 \v Generate Title and Description with Context} +{ +\par +\pard\plain \s40\li0\widctlpar\adjustright \shading1000\cbpat8 \f2\fs16\cgrid penify commit -m "Update login UI" -d\par +} +\par} +{\bkmkstart AAAAAAAABR} +{\bkmkend AAAAAAAABR} +{{\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid +Generate and Edit Full Commit Message +\par} +{\tc\tcl3 \v Generate and Edit Full Commit Message} +{ +\par +\pard\plain \s40\li0\widctlpar\adjustright \shading1000\cbpat8 \f2\fs16\cgrid penify commit -d -e\par +} +\par} +{\bkmkstart AAAAAAAABS} +{\bkmkend AAAAAAAABS} +{{\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid +Generate, Edit, and Provide Context +\par} +{\tc\tcl3 \v Generate, Edit, and Provide Context} +{ +\par +\pard\plain \s40\li0\widctlpar\adjustright \shading1000\cbpat8 \f2\fs16\cgrid penify commit -m "Refactor authentication" -d -e\par +} +\par} +\par} +{\bkmkstart AAAAAAAABT} +{\bkmkend AAAAAAAABT} +{{\pard\plain \s2\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs28\kerning28\cgrid +LLM and JIRA Integration +\par} +{\tc\tcl2 \v LLM and JIRA Integration} +{\bkmkstart AAAAAAAABU} +{\bkmkend AAAAAAAABU} +{{\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid +Using Local LLM +\par} +{\tc\tcl3 \v Using Local LLM} +If you've configured a local LLM using {\f2 penify config llm} , the commit command will automatically use it for message generation.\par +Benefits:{ +\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +Privacy: your code changes don't leave your machine\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +Speed: no network latency\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +Works offline\par} +\par +\par} +{\bkmkstart AAAAAAAABV} +{\bkmkend AAAAAAAABV} +{{\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid +JIRA Enhancement +\par} +{\tc\tcl3 \v JIRA Enhancement} +If you've configured JIRA integration using {\f2 penify config jira} , the commit command will:\par +{ +\par +\pard\plain \s140\fi-360\li360\widctlpar\fs20\cgrid +1.\tab Detect JIRA issue references in your changes\par +\pard\plain \s140\fi-360\li360\widctlpar\fs20\cgrid +2.\tab Fetch issue details from your JIRA instance\par +\pard\plain \s140\fi-360\li360\widctlpar\fs20\cgrid +3.\tab Include issue information in the commit message\par +\pard\plain \s140\fi-360\li360\widctlpar\fs20\cgrid +4.\tab Format the commit message according to JIRA's smart commit format\par} +\par +Example output: { +\par +\pard\plain \s40\li0\widctlpar\adjustright \shading1000\cbpat8 \f2\fs16\cgrid PROJ-123: Fix authentication bug in login flow\par +\par +- Updated OAuth token validation\par +- Fixed session timeout handling\par +- Added unit tests for edge cases\par +\par +[PROJ-123]\par +} +\par} +\par} +{\bkmkstart AAAAAAAABW} +{\bkmkend AAAAAAAABW} +{{\pard\plain \s2\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs28\kerning28\cgrid +Configuration Requirements +\par} +{\tc\tcl2 \v Configuration Requirements} +For the {\f2 commit} command to work:\par +{ +\par +\pard\plain \s140\fi-360\li360\widctlpar\fs20\cgrid +1.\tab You must have configured either:{ +\par +\pard\plain \s121\fi-360\li720\widctlpar\jclisttab\tx720{\*\pn \pnlvlbody\ilvl0\ls2\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +Local LLM via {\f2 penify config llm} , OR\par +\pard\plain \s121\fi-360\li720\widctlpar\jclisttab\tx720{\*\pn \pnlvlbody\ilvl0\ls2\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +Logged in via {\f2 penify login} \par} +\pard\plain \s140\fi-360\li360\widctlpar\fs20\cgrid +2.\tab For JIRA enhancement (optional):{ +\par +\pard\plain \s121\fi-360\li720\widctlpar\jclisttab\tx720{\*\pn \pnlvlbody\ilvl0\ls2\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +Configure JIRA via {\f2 penify config jira} \par} +} +\par +\par} +{\bkmkstart AAAAAAAABX} +{\bkmkend AAAAAAAABX} +{{\pard\plain \s2\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs28\kerning28\cgrid +Examples +\par} +{\tc\tcl2 \v Examples} +{\bkmkstart AAAAAAAABY} +{\bkmkend AAAAAAAABY} +{{\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid +Basic Commit with Default Settings +\par} +{\tc\tcl3 \v Basic Commit with Default Settings} +{ +\par +\pard\plain \s40\li0\widctlpar\adjustright \shading1000\cbpat8 \f2\fs16\cgrid # Stage your changes\par +git add .\par +\par +# Generate commit message\par +penify commit\par +\par +# Commit with the generated message\par +git commit -m "Generated message here"\par +} +\par} +{\bkmkstart AAAAAAAABZ} +{\bkmkend AAAAAAAABZ} +{{\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid +Full Workflow with All Features +\par} +{\tc\tcl3 \v Full Workflow with All Features} +{ +\par +\pard\plain \s40\li0\widctlpar\adjustright \shading1000\cbpat8 \f2\fs16\cgrid # Stage your changes\par +git add .\par +\par +# Generate detailed commit message with JIRA integration, \par +# provide context, and open editor for review\par +penify commit -m "Fix login issue" -d -e\par +\par +# The commit is automatically completed after you save and exit the editor\par +} +\par} +\par} +{\bkmkstart AAAAAAAACA} +{\bkmkend AAAAAAAACA} +{{\pard\plain \s2\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs28\kerning28\cgrid +Troubleshooting +\par} +{\tc\tcl2 \v Troubleshooting} +{\bkmkstart AAAAAAAACB} +{\bkmkend AAAAAAAACB} +{{\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid +Common Issues +\par} +{\tc\tcl3 \v Common Issues} +{ +\par +\pard\plain \s140\fi-360\li360\widctlpar\fs20\cgrid +1.\tab **"No LLM model or API token provided"**{ +\par +\pard\plain \s121\fi-360\li720\widctlpar\jclisttab\tx720{\*\pn \pnlvlbody\ilvl0\ls2\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +Run {\f2 penify config llm} to configure a local LLM, or\par +\pard\plain \s121\fi-360\li720\widctlpar\jclisttab\tx720{\*\pn \pnlvlbody\ilvl0\ls2\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +Run {\f2 penify login} to authenticate with Penify\par} +\pard\plain \s140\fi-360\li360\widctlpar\fs20\cgrid +2.\tab **"Failed to connect to JIRA"**{ +\par +\pard\plain \s121\fi-360\li720\widctlpar\jclisttab\tx720{\*\pn \pnlvlbody\ilvl0\ls2\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +Check your JIRA configuration with {\f2 cat ~/.penify} \par +\pard\plain \s121\fi-360\li720\widctlpar\jclisttab\tx720{\*\pn \pnlvlbody\ilvl0\ls2\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +Verify your network connection\par +\pard\plain \s121\fi-360\li720\widctlpar\jclisttab\tx720{\*\pn \pnlvlbody\ilvl0\ls2\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +Ensure your JIRA credentials are valid\par} +\pard\plain \s140\fi-360\li360\widctlpar\fs20\cgrid +3.\tab **"Error initializing LLM client"**{ +\par +\pard\plain \s121\fi-360\li720\widctlpar\jclisttab\tx720{\*\pn \pnlvlbody\ilvl0\ls2\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +Verify your LLM configuration settings\par +\pard\plain \s121\fi-360\li720\widctlpar\jclisttab\tx720{\*\pn \pnlvlbody\ilvl0\ls2\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +Ensure the LLM API is accessible \par} +} +\par +\par} +\par} +}} + +\pard\plain \sect\sbkpage +\s1\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs36\kerning36\cgrid +Penify CLI - Configuration Commands{\tc \v Penify CLI - Configuration Commands}\par \pard\plain +{\bkmkstart AAAAAAAAPC} +{\bkmkend AAAAAAAAPC} +{ +\pard\plain \s17\sa60\sb30\widctlpar\qj \fs22\cgrid {\s17\sa60\sb30\widctlpar\qj \fs22\cgrid +The {\f2 config} command allows you to set up and manage configuration settings for Penify CLI. This document explains all available configuration options and how to use them.\par +{\bkmkstart AAAAAAAACC} +{\bkmkend AAAAAAAACC} +{{\pard\plain \s2\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs28\kerning28\cgrid +Configuration Overview +\par} +{\tc\tcl2 \v Configuration Overview} +Penify CLI stores configuration in a JSON file at {\f2 ~/.penify/config.json} . The configuration includes:\par +{ +\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +LLM (Large Language Model) settings for local commit message generation\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +JIRA integration settings for enhanced commit messages\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +API tokens and other credentials\par} +\par +\par} +{\bkmkstart AAAAAAAACD} +{\bkmkend AAAAAAAACD} +{{\pard\plain \s2\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs28\kerning28\cgrid +Basic Usage +\par} +{\tc\tcl2 \v Basic Usage} +{ +\par +\pard\plain \s40\li0\widctlpar\adjustright \shading1000\cbpat8 \f2\fs16\cgrid # Configure LLM settings\par +penify config llm\par +\par +# Configure JIRA integration\par +penify config jira\par +} +\par} +{\bkmkstart AAAAAAAACE} +{\bkmkend AAAAAAAACE} +{{\pard\plain \s2\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs28\kerning28\cgrid +LLM Configuration +\par} +{\tc\tcl2 \v LLM Configuration} +{\bkmkstart AAAAAAAACF} +{\bkmkend AAAAAAAACF} +{{\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid +Web Interface +\par} +{\tc\tcl3 \v Web Interface} +Running {\f2 penify config llm} opens a web interface in your browser where you can configure:\par +{ +\par +\pard\plain \s140\fi-360\li360\widctlpar\fs20\cgrid +1.\tab {\b Model} : The LLM model to use (e.g., {\f2 gpt-3.5-turbo} )\par +\pard\plain \s140\fi-360\li360\widctlpar\fs20\cgrid +2.\tab {\b API Base URL} : The endpoint URL for your LLM API (e.g., {\f2 {\f2 https://api.openai.com/v1}} )\par +\pard\plain \s140\fi-360\li360\widctlpar\fs20\cgrid +3.\tab {\b API Key} : Your authentication key for the LLM API\par} +\par +\par} +{\bkmkstart AAAAAAAACG} +{\bkmkend AAAAAAAACG} +{{\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid +Supported LLMs +\par} +{\tc\tcl3 \v Supported LLMs} +Penify CLI supports various LLM providers:\par +{\bkmkstart AAAAAAAACH} +{\bkmkend AAAAAAAACH} +{{\pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid +OpenAI +\par} +{\tc\tcl4 \v OpenAI} +{ +\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +Model: {\f2 gpt-3.5-turbo} or {\f2 gpt-4} \par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +API Base: {\f2 {\f2 https://api.openai.com/v1}} \par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +API Key: Your OpenAI API key\par} +\par +\par} +{\bkmkstart AAAAAAAACI} +{\bkmkend AAAAAAAACI} +{{\pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid +Anthropic +\par} +{\tc\tcl4 \v Anthropic} +{ +\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +Model: {\f2 claude-instant-1} or {\f2 claude-2} \par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +API Base: {\f2 {\f2 https://api.anthropic.com/v1}} \par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +API Key: Your Anthropic API key\par} +\par +\par} +{\bkmkstart AAAAAAAACJ} +{\bkmkend AAAAAAAACJ} +{{\pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid +Ollama (Local) +\par} +{\tc\tcl4 \v Ollama (Local)} +{ +\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +Model: {\f2 llama2} or any model you have installed\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +API Base: {\f2 {\f2 http://localhost:11434}} \par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +API Key: (leave blank)\par} +\par +\par} +{\bkmkstart AAAAAAAACK} +{\bkmkend AAAAAAAACK} +{{\pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid +Azure OpenAI +\par} +{\tc\tcl4 \v Azure OpenAI} +{ +\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +Model: Your deployed model name\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +API Base: Your Azure endpoint\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +API Key: Your Azure API key\par} +\par +\par} +\par} +{\bkmkstart AAAAAAAACL} +{\bkmkend AAAAAAAACL} +{{\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid +Configuration File Structure +\par} +{\tc\tcl3 \v Configuration File Structure} +After configuration, your {\f2 ~/.penify/config.json} will contain:\par +{ +\par +\pard\plain \s40\li0\widctlpar\adjustright \shading1000\cbpat8 \f2\fs16\cgrid \{\par + "llm": \{\par + "model": "gpt-3.5-turbo",\par + "api_base": "https://api.openai.com/v1",\par + "api_key": "sk-..."\par + \}\par +\}\par +} +\par} +\par} +{\bkmkstart AAAAAAAACM} +{\bkmkend AAAAAAAACM} +{{\pard\plain \s2\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs28\kerning28\cgrid +JIRA Configuration +\par} +{\tc\tcl2 \v JIRA Configuration} +{\bkmkstart AAAAAAAACN} +{\bkmkend AAAAAAAACN} +{{\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid +Web Interface +\par} +{\tc\tcl3 \v Web Interface} +Running {\f2 penify config jira} opens a web interface where you can configure:\par +{ +\par +\pard\plain \s140\fi-360\li360\widctlpar\fs20\cgrid +1.\tab {\b JIRA URL} : Your JIRA instance URL (e.g., {\f2 {\f2 https://yourcompany.atlassian.net}} )\par +\pard\plain \s140\fi-360\li360\widctlpar\fs20\cgrid +2.\tab {\b Username} : Your JIRA username (typically your email)\par +\pard\plain \s140\fi-360\li360\widctlpar\fs20\cgrid +3.\tab {\b API Token} : Your JIRA API token\par} +\par +\par} +{\bkmkstart AAAAAAAACO} +{\bkmkend AAAAAAAACO} +{{\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid +Creating a JIRA API Token +\par} +{\tc\tcl3 \v Creating a JIRA API Token} +{ +\par +\pard\plain \s140\fi-360\li360\widctlpar\fs20\cgrid +1.\tab Log in to {\f2 https://id.atlassian.com/manage-profile/security/api-tokens}\par +\pard\plain \s140\fi-360\li360\widctlpar\fs20\cgrid +2.\tab Click "Create API token"\par +\pard\plain \s140\fi-360\li360\widctlpar\fs20\cgrid +3.\tab Give it a name (e.g., "Penify CLI")\par +\pard\plain \s140\fi-360\li360\widctlpar\fs20\cgrid +4.\tab Copy the generated token and paste it into the configuration\par} +\par +\par} +{\bkmkstart AAAAAAAACP} +{\bkmkend AAAAAAAACP} +{{\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid +Configuration File Structure +\par} +{\tc\tcl3 \v Configuration File Structure} +After configuration, your {\f2 ~/.penify/config.json} will contain:\par +{ +\par +\pard\plain \s40\li0\widctlpar\adjustright \shading1000\cbpat8 \f2\fs16\cgrid \{\par + "jira": \{\par + "url": "https://yourcompany.atlassian.net",\par + "username": "your.email@example.com",\par + "api_token": "your-jira-api-token"\par + \}\par +\}\par +} +\par} +\par} +{\bkmkstart AAAAAAAACQ} +{\bkmkend AAAAAAAACQ} +{{\pard\plain \s2\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs28\kerning28\cgrid +Configuration Locations +\par} +{\tc\tcl2 \v Configuration Locations} +Penify CLI looks for configuration in multiple locations:\par +{ +\par +\pard\plain \s140\fi-360\li360\widctlpar\fs20\cgrid +1.\tab Project-specific: {\f2 .penify/config.json} in the Git repository root\par +\pard\plain \s140\fi-360\li360\widctlpar\fs20\cgrid +2.\tab User-specific: {\f2 ~/.penify/config.json} in your home directory\par} +\par +The project-specific configuration takes precedence if both exist.\par} +{\bkmkstart AAAAAAAACR} +{\bkmkend AAAAAAAACR} +{{\pard\plain \s2\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs28\kerning28\cgrid +Environment Variables +\par} +{\tc\tcl2 \v Environment Variables} +You can override configuration settings using environment variables:\par +{ +\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +{\f2 PENIFY_API_TOKEN} : Override the stored API token\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +{\f2 PENIFY_LLM_MODEL} : Override the configured LLM model\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +{\f2 PENIFY_LLM_API_BASE} : Override the configured LLM API base URL\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +{\f2 PENIFY_LLM_API_KEY} : Override the configured LLM API key\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +{\f2 PENIFY_JIRA_URL} : Override the configured JIRA URL\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +{\f2 PENIFY_JIRA_USER} : Override the configured JIRA username\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +{\f2 PENIFY_JIRA_TOKEN} : Override the configured JIRA API token\par} +\par +Example: { +\par +\pard\plain \s40\li0\widctlpar\adjustright \shading1000\cbpat8 \f2\fs16\cgrid export PENIFY_LLM_MODEL="gpt-4"\par +penify commit\par +} +\par} +{\bkmkstart AAAAAAAACS} +{\bkmkend AAAAAAAACS} +{{\pard\plain \s2\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs28\kerning28\cgrid +Command-Line Configuration +\par} +{\tc\tcl2 \v Command-Line Configuration} +For advanced users or scripting, you can directly edit the configuration file:\par +{ +\par +\pard\plain \s40\li0\widctlpar\adjustright \shading1000\cbpat8 \f2\fs16\cgrid # View current configuration\par +cat ~/.penify/config.json\par +\par +# Edit configuration with your preferred editor\par +nano ~/.penify/config.json\par +} +\par} +{\bkmkstart AAAAAAAACT} +{\bkmkend AAAAAAAACT} +{{\pard\plain \s2\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs28\kerning28\cgrid +Sharing Configuration +\par} +{\tc\tcl2 \v Sharing Configuration} +You can share configuration between machines by copying the {\f2 .penify/config.json} file. However, be cautious with API keys and credentials.\par +For team settings, consider:{ +\par +\pard\plain \s140\fi-360\li360\widctlpar\fs20\cgrid +1.\tab Using a project-specific {\f2 .penify/config.json} with shared settings\par +\pard\plain \s140\fi-360\li360\widctlpar\fs20\cgrid +2.\tab Excluding API keys from shared configuration\par +\pard\plain \s140\fi-360\li360\widctlpar\fs20\cgrid +3.\tab Using environment variables for sensitive credentials\par} +\par +\par} +{\bkmkstart AAAAAAAACU} +{\bkmkend AAAAAAAACU} +{{\pard\plain \s2\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs28\kerning28\cgrid +Troubleshooting +\par} +{\tc\tcl2 \v Troubleshooting} +{\bkmkstart AAAAAAAACV} +{\bkmkend AAAAAAAACV} +{{\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid +Common Issues +\par} +{\tc\tcl3 \v Common Issues} +{ +\par +\pard\plain \s140\fi-360\li360\widctlpar\fs20\cgrid +1.\tab **"Error reading configuration file"**{ +\par +\pard\plain \s121\fi-360\li720\widctlpar\jclisttab\tx720{\*\pn \pnlvlbody\ilvl0\ls2\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +Check if the file exists: {\f2 ls -la ~/.penify} \par +\pard\plain \s121\fi-360\li720\widctlpar\jclisttab\tx720{\*\pn \pnlvlbody\ilvl0\ls2\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +Ensure it contains valid JSON: {\f2 cat ~/.penify/config.json} \par} +\pard\plain \s140\fi-360\li360\widctlpar\fs20\cgrid +2.\tab **"Failed to connect to LLM API"**{ +\par +\pard\plain \s121\fi-360\li720\widctlpar\jclisttab\tx720{\*\pn \pnlvlbody\ilvl0\ls2\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +Verify API base URL and API key\par +\pard\plain \s121\fi-360\li720\widctlpar\jclisttab\tx720{\*\pn \pnlvlbody\ilvl0\ls2\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +Check network connectivity to the API endpoint\par +\pard\plain \s121\fi-360\li720\widctlpar\jclisttab\tx720{\*\pn \pnlvlbody\ilvl0\ls2\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +Ensure your account has access to the specified model\par} +\pard\plain \s140\fi-360\li360\widctlpar\fs20\cgrid +3.\tab **"Failed to connect to JIRA"**{ +\par +\pard\plain \s121\fi-360\li720\widctlpar\jclisttab\tx720{\*\pn \pnlvlbody\ilvl0\ls2\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +Check JIRA URL format (should include {\f2 {\f2 https://}} )\par +\pard\plain \s121\fi-360\li720\widctlpar\jclisttab\tx720{\*\pn \pnlvlbody\ilvl0\ls2\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +Verify username and API token\par +\pard\plain \s121\fi-360\li720\widctlpar\jclisttab\tx720{\*\pn \pnlvlbody\ilvl0\ls2\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +Ensure your JIRA account has API access permissions \par} +} +\par +\par} +\par} +}} + +\pard\plain \sect\sbkpage +\s1\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs36\kerning36\cgrid +Penify CLI - Detailed Usage Guide{\tc \v Penify CLI - Detailed Usage Guide}\par \pard\plain +{\bkmkstart AAAAAAAAPD} +{\bkmkend AAAAAAAAPD} +{ +\pard\plain \s17\sa60\sb30\widctlpar\qj \fs22\cgrid {\s17\sa60\sb30\widctlpar\qj \fs22\cgrid +This document provides in-depth information about all features and capabilities of the Penify CLI tool.\par +{\bkmkstart AAAAAAAACW} +{\bkmkend AAAAAAAACW} +{{\pard\plain \s2\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs28\kerning28\cgrid +Table of Contents +\par} +{\tc\tcl2 \v Table of Contents} +{ +\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +Penify CLI - Detailed Usage Guide{ +\par +\pard\plain \s121\fi-360\li720\widctlpar\jclisttab\tx720{\*\pn \pnlvlbody\ilvl0\ls2\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +Table of Contents\par +\pard\plain \s121\fi-360\li720\widctlpar\jclisttab\tx720{\*\pn \pnlvlbody\ilvl0\ls2\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +Authentication{ +\par +\pard\plain \s122\fi-360\li1080\widctlpar\jclisttab\tx1080{\*\pn \pnlvlbody\ilvl0\ls3\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +Login Process\par +\pard\plain \s122\fi-360\li1080\widctlpar\jclisttab\tx1080{\*\pn \pnlvlbody\ilvl0\ls3\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +API Token Storage\par +\pard\plain \s122\fi-360\li1080\widctlpar\jclisttab\tx1080{\*\pn \pnlvlbody\ilvl0\ls3\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +Token Precedence\par} +\pard\plain \s121\fi-360\li720\widctlpar\jclisttab\tx720{\*\pn \pnlvlbody\ilvl0\ls2\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +Command Overview\par +\pard\plain \s121\fi-360\li720\widctlpar\jclisttab\tx720{\*\pn \pnlvlbody\ilvl0\ls2\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +Commit Message Generation\par +\pard\plain \s121\fi-360\li720\widctlpar\jclisttab\tx720{\*\pn \pnlvlbody\ilvl0\ls2\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +Code Documentation Generation{ +\par +\pard\plain \s122\fi-360\li1080\widctlpar\jclisttab\tx1080{\*\pn \pnlvlbody\ilvl0\ls3\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +Use Cases\par +\pard\plain \s122\fi-360\li1080\widctlpar\jclisttab\tx1080{\*\pn \pnlvlbody\ilvl0\ls3\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +Authentication Requirement\par} +\pard\plain \s121\fi-360\li720\widctlpar\jclisttab\tx720{\*\pn \pnlvlbody\ilvl0\ls2\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +Configuration Settings\par +\pard\plain \s121\fi-360\li720\widctlpar\jclisttab\tx720{\*\pn \pnlvlbody\ilvl0\ls2\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +Git Hooks{ +\par +\pard\plain \s122\fi-360\li1080\widctlpar\jclisttab\tx1080{\*\pn \pnlvlbody\ilvl0\ls3\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +Post-Commit Hook\par +\pard\plain \s122\fi-360\li1080\widctlpar\jclisttab\tx1080{\*\pn \pnlvlbody\ilvl0\ls3\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +Custom Hook Location\par} +\pard\plain \s121\fi-360\li720\widctlpar\jclisttab\tx720{\*\pn \pnlvlbody\ilvl0\ls2\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +Advanced Use Cases{ +\par +\pard\plain \s122\fi-360\li1080\widctlpar\jclisttab\tx1080{\*\pn \pnlvlbody\ilvl0\ls3\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +CI/CD Integration\par +\pard\plain \s122\fi-360\li1080\widctlpar\jclisttab\tx1080{\*\pn \pnlvlbody\ilvl0\ls3\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +Remote Repository Documentation\par} +\pard\plain \s121\fi-360\li720\widctlpar\jclisttab\tx720{\*\pn \pnlvlbody\ilvl0\ls2\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +Troubleshooting{ +\par +\pard\plain \s122\fi-360\li1080\widctlpar\jclisttab\tx1080{\*\pn \pnlvlbody\ilvl0\ls3\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +Common Issues\par +\pard\plain \s122\fi-360\li1080\widctlpar\jclisttab\tx1080{\*\pn \pnlvlbody\ilvl0\ls3\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +Logs\par +\pard\plain \s122\fi-360\li1080\widctlpar\jclisttab\tx1080{\*\pn \pnlvlbody\ilvl0\ls3\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +Support\par} +} +} +\par +\par} +{\bkmkstart AAAAAAAACX} +{\bkmkend AAAAAAAACX} +{{\pard\plain \s2\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs28\kerning28\cgrid +Authentication +\par} +{\tc\tcl2 \v Authentication} +{\bkmkstart AAAAAAAACY} +{\bkmkend AAAAAAAACY} +{{\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid +Login Process +\par} +{\tc\tcl3 \v Login Process} +When you run {\f2 penify login} , the tool:\par +{ +\par +\pard\plain \s140\fi-360\li360\widctlpar\fs20\cgrid +1.\tab Opens your default web browser\par +\pard\plain \s140\fi-360\li360\widctlpar\fs20\cgrid +2.\tab Redirects you to Penify's login page\par +\pard\plain \s140\fi-360\li360\widctlpar\fs20\cgrid +3.\tab Captures the authentication token after successful login\par +\pard\plain \s140\fi-360\li360\widctlpar\fs20\cgrid +4.\tab Saves the token in {\f2 ~/.penify} file\par} +\par +\par} +{\bkmkstart AAAAAAAACZ} +{\bkmkend AAAAAAAACZ} +{{\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid +API Token Storage +\par} +{\tc\tcl3 \v API Token Storage} +API tokens are stored in your home directory in the {\f2 .penify} file. This JSON file contains:\par +{ +\par +\pard\plain \s40\li0\widctlpar\adjustright \shading1000\cbpat8 \f2\fs16\cgrid \{\par + "api_keys": "your-api-token",\par + "llm": \{ "model": "...", "api_base": "...", "api_key": "..." \},\par + "jira": \{ "url": "...", "username": "...", "api_token": "..." \}\par +\}\par +} +\par} +{\bkmkstart AAAAAAAADA} +{\bkmkend AAAAAAAADA} +{{\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid +Token Precedence +\par} +{\tc\tcl3 \v Token Precedence} +{ +\par +\pard\plain \s140\fi-360\li360\widctlpar\fs20\cgrid +1.\tab Environment variable {\f2 PENIFY_API_TOKEN} (highest priority)\par +\pard\plain \s140\fi-360\li360\widctlpar\fs20\cgrid +2.\tab Token in {\f2 ~/.penify} file\par} +\par +\par} +\par} +{\bkmkstart AAAAAAAADB} +{\bkmkend AAAAAAAADB} +{{\pard\plain \s2\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs28\kerning28\cgrid +Command Overview +\par} +{\tc\tcl2 \v Command Overview} +{ +\par +\pard\plain \s40\li0\widctlpar\adjustright \shading1000\cbpat8 \f2\fs16\cgrid penify\par +\'E2\'94\'9C\'E2\'94\'80\'E2\'94\'80 commit Generate smart commit messages\par +\'E2\'94\'9C\'E2\'94\'80\'E2\'94\'80 config Configure local LLM and JIRA\par +\'E2\'94\'82 \'E2\'94\'9C\'E2\'94\'80\'E2\'94\'80 llm Configure local LLM settings\par +\'E2\'94\'82 \'E2\'94\'94\'E2\'94\'80\'E2\'94\'80 jira Configure JIRA integration\par +\'E2\'94\'9C\'E2\'94\'80\'E2\'94\'80 login Log in to Penify account\par +\'E2\'94\'94\'E2\'94\'80\'E2\'94\'80 docgen Generate code documentation\par + \'E2\'94\'9C\'E2\'94\'80\'E2\'94\'80 install-hook Install Git post-commit hook\par + \'E2\'94\'94\'E2\'94\'80\'E2\'94\'80 uninstall-hook Remove Git post-commit hook\par +} +\par} +{\bkmkstart AAAAAAAADC} +{\bkmkend AAAAAAAADC} +{{\pard\plain \s2\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs28\kerning28\cgrid +Commit Message Generation +\par} +{\tc\tcl2 \v Commit Message Generation} +The {\f2 commit} command analyzes your staged changes and generates meaningful commit messages. It can:\par +{ +\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +Use a local LLM if configured\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +Enhance messages with JIRA issue details\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +Provide both title and description\par} +\par +For specific options and examples, see {\b docs/commit-commands.md}.\par} +{\bkmkstart AAAAAAAADD} +{\bkmkend AAAAAAAADD} +{{\pard\plain \s2\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs28\kerning28\cgrid +Code Documentation Generation +\par} +{\tc\tcl2 \v Code Documentation Generation} +The {\f2 docgen} command generates documentation for your code:\par +{\bkmkstart AAAAAAAADE} +{\bkmkend AAAAAAAADE} +{{\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid +Use Cases +\par} +{\tc\tcl3 \v Use Cases} +{ +\par +\pard\plain \s140\fi-360\li360\widctlpar\fs20\cgrid +1.\tab {\b Current Git Diff} : Default behavior, documents only changed files\par +\pard\plain \s140\fi-360\li360\widctlpar\fs20\cgrid +2.\tab {\b Specific File} : Pass a file path with {\f2 -l path/to/file.py} \par +\pard\plain \s140\fi-360\li360\widctlpar\fs20\cgrid +3.\tab {\b Entire Folder} : Pass a folder path with {\f2 -l path/to/folder} \par} +\par +\par} +{\bkmkstart AAAAAAAADF} +{\bkmkend AAAAAAAADF} +{{\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid +Authentication Requirement +\par} +{\tc\tcl3 \v Authentication Requirement} +This feature requires authentication with a Penify account. Run {\f2 penify login} before using documentation features.\par} +\par} +{\bkmkstart AAAAAAAADG} +{\bkmkend AAAAAAAADG} +{{\pard\plain \s2\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs28\kerning28\cgrid +Configuration Settings +\par} +{\tc\tcl2 \v Configuration Settings} +Configure local settings using the {\f2 config} command:\par +{ +\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +{\b LLM Settings} : Configure a local LLM for commit message generation\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +{\b JIRA Settings} : Set up JIRA integration for enhanced commit messages\par} +\par +For detailed configuration options, see {\b docs/config-commands.md}.\par} +{\bkmkstart AAAAAAAADH} +{\bkmkend AAAAAAAADH} +{{\pard\plain \s2\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs28\kerning28\cgrid +Git Hooks +\par} +{\tc\tcl2 \v Git Hooks} +Penify can install Git hooks to automate documentation generation:\par +{\bkmkstart AAAAAAAADI} +{\bkmkend AAAAAAAADI} +{{\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid +Post-Commit Hook +\par} +{\tc\tcl3 \v Post-Commit Hook} +{ +\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +{\b Install} : {\f2 penify docgen install-hook} \par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +{\b What it does} : Automatically generates documentation for changed files after each commit\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +{\b Uninstall} : {\f2 penify docgen uninstall-hook} \par} +\par +\par} +{\bkmkstart AAAAAAAADJ} +{\bkmkend AAAAAAAADJ} +{{\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid +Custom Hook Location +\par} +{\tc\tcl3 \v Custom Hook Location} +You can specify a custom location for Git hooks:\par +{ +\par +\pard\plain \s40\li0\widctlpar\adjustright \shading1000\cbpat8 \f2\fs16\cgrid penify docgen install-hook -l /path/to/git/repo\par +} +\par} +\par} +{\bkmkstart AAAAAAAADK} +{\bkmkend AAAAAAAADK} +{{\pard\plain \s2\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs28\kerning28\cgrid +Advanced Use Cases +\par} +{\tc\tcl2 \v Advanced Use Cases} +{\bkmkstart AAAAAAAADL} +{\bkmkend AAAAAAAADL} +{{\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid +CI/CD Integration +\par} +{\tc\tcl3 \v CI/CD Integration} +For CI/CD pipelines:\par +{ +\par +\pard\plain \s140\fi-360\li360\widctlpar\fs20\cgrid +1.\tab Set {\f2 PENIFY_API_TOKEN} as an environment variable\par +\pard\plain \s140\fi-360\li360\widctlpar\fs20\cgrid +2.\tab Run commands without requiring interactive login\par} +\par +\par} +{\bkmkstart AAAAAAAADM} +{\bkmkend AAAAAAAADM} +{{\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid +Remote Repository Documentation +\par} +{\tc\tcl3 \v Remote Repository Documentation} +Generate documentation for an entire repository:\par +{ +\par +\pard\plain \s40\li0\widctlpar\adjustright \shading1000\cbpat8 \f2\fs16\cgrid git clone https://github.com/user/repo\par +cd repo\par +penify docgen -l .\par +} +\par} +\par} +{\bkmkstart AAAAAAAADN} +{\bkmkend AAAAAAAADN} +{{\pard\plain \s2\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs28\kerning28\cgrid +Troubleshooting +\par} +{\tc\tcl2 \v Troubleshooting} +{\bkmkstart AAAAAAAADO} +{\bkmkend AAAAAAAADO} +{{\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid +Common Issues +\par} +{\tc\tcl3 \v Common Issues} +{ +\par +\pard\plain \s140\fi-360\li360\widctlpar\fs20\cgrid +1.\tab {\b API Key Errors} : Ensure you've run {\f2 penify login} or set {\f2 PENIFY_API_TOKEN} \par +\pard\plain \s140\fi-360\li360\widctlpar\fs20\cgrid +2.\tab {\b LLM Configuration} : Check your LLM settings with {\f2 cat ~/.penify} \par +\pard\plain \s140\fi-360\li360\widctlpar\fs20\cgrid +3.\tab {\b JIRA Integration} : Verify JIRA credentials in your configuration\par} +\par +\par} +{\bkmkstart AAAAAAAADP} +{\bkmkend AAAAAAAADP} +{{\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid +Logs +\par} +{\tc\tcl3 \v Logs} +For more detailed logs, you can set the environment variable:\par +{ +\par +\pard\plain \s40\li0\widctlpar\adjustright \shading1000\cbpat8 \f2\fs16\cgrid export PENIFY_DEBUG=1\par +} +\par} +{\bkmkstart AAAAAAAADQ} +{\bkmkend AAAAAAAADQ} +{{\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid +Support +\par} +{\tc\tcl3 \v Support} +For additional help, visit {\f2 https://docs.penify.dev/} or contact {\f2 support@penify.dev} \par} +\par} +}} + +\pard\plain \sect\sbkpage +\s1\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs36\kerning36\cgrid +Penify CLI - Documentation Generation Commands{\tc \v Penify CLI - Documentation Generation Commands}\par \pard\plain +{\bkmkstart AAAAAAAAPE} +{\bkmkend AAAAAAAAPE} +{ +\pard\plain \s17\sa60\sb30\widctlpar\qj \fs22\cgrid {\s17\sa60\sb30\widctlpar\qj \fs22\cgrid +This document provides a detailed guide to all permutations and combinations of the {\f2 docgen} command, including extensive information about Git hook commands for automating documentation generation.\par +{\bkmkstart AAAAAAAADR} +{\bkmkend AAAAAAAADR} +{{\pard\plain \s2\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs28\kerning28\cgrid +Table of Contents +\par} +{\tc\tcl2 \v Table of Contents} +{ +\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +Basic Usage\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +Command Options\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +Option Combinations\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +Git Hook Commands{ +\par +\pard\plain \s121\fi-360\li720\widctlpar\jclisttab\tx720{\*\pn \pnlvlbody\ilvl0\ls2\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +Hook Installation\par +\pard\plain \s121\fi-360\li720\widctlpar\jclisttab\tx720{\*\pn \pnlvlbody\ilvl0\ls2\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +Hook Customization\par +\pard\plain \s121\fi-360\li720\widctlpar\jclisttab\tx720{\*\pn \pnlvlbody\ilvl0\ls2\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +Hook Uninstallation\par} +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +Advanced Use Cases\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +Troubleshooting\par} +\par +\par} +{\bkmkstart AAAAAAAADS} +{\bkmkend AAAAAAAADS} +{{\pard\plain \s2\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs28\kerning28\cgrid +Basic Usage +\par} +{\tc\tcl2 \v Basic Usage} +{ +\par +\pard\plain \s40\li0\widctlpar\adjustright \shading1000\cbpat8 \f2\fs16\cgrid penify docgen\par +} +\par +By default, this command:{ +\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +Analyzes the current Git diff (changes since last commit)\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +Generates documentation for changed files only\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +Requires authentication via {\f2 penify login} \par} +\par +\par} +{\bkmkstart AAAAAAAADT} +{\bkmkend AAAAAAAADT} +{{\pard\plain \s2\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs28\kerning28\cgrid +Command Options +\par} +{\tc\tcl2 \v Command Options} +{\bkmkstart AAAAAAAADU} +{\bkmkend AAAAAAAADU} +{{\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid +-l, --location +\par} +{\tc\tcl3 \v -l, --location} +Specify a target for documentation generation:\par +{ +\par +\pard\plain \s40\li0\widctlpar\adjustright \shading1000\cbpat8 \f2\fs16\cgrid # Generate documentation for a specific file\par +penify docgen -l path/to/file.py\par +\par +# Generate documentation for a specific folder\par +penify docgen -l path/to/folder\par +} +\par +Without this flag, Penify analyzes only Git-tracked modified files.\par} +{\bkmkstart AAAAAAAADV} +{\bkmkend AAAAAAAADV} +{{\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid +Subcommands +\par} +{\tc\tcl3 \v Subcommands} +{\bkmkstart AAAAAAAADW} +{\bkmkend AAAAAAAADW} +{{\pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid +install-hook +\par} +{\tc\tcl4 \v install-hook} +Install a Git post-commit hook to automatically generate documentation:\par +{ +\par +\pard\plain \s40\li0\widctlpar\adjustright \shading1000\cbpat8 \f2\fs16\cgrid penify docgen install-hook\par +} +\par} +{\bkmkstart AAAAAAAADX} +{\bkmkend AAAAAAAADX} +{{\pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid +uninstall-hook +\par} +{\tc\tcl4 \v uninstall-hook} +Remove the Git post-commit hook:\par +{ +\par +\pard\plain \s40\li0\widctlpar\adjustright \shading1000\cbpat8 \f2\fs16\cgrid penify docgen uninstall-hook\par +} +\par} +\par} +\par} +{\bkmkstart AAAAAAAADY} +{\bkmkend AAAAAAAADY} +{{\pard\plain \s2\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs28\kerning28\cgrid +Option Combinations +\par} +{\tc\tcl2 \v Option Combinations} +{\bkmkstart AAAAAAAADZ} +{\bkmkend AAAAAAAADZ} +{{\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid +Generate Documentation for Current Git Diff +\par} +{\tc\tcl3 \v Generate Documentation for Current Git Diff} +{ +\par +\pard\plain \s40\li0\widctlpar\adjustright \shading1000\cbpat8 \f2\fs16\cgrid # Basic usage - current Git diff\par +penify docgen\par +} +\par} +{\bkmkstart AAAAAAAAEA} +{\bkmkend AAAAAAAAEA} +{{\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid +Generate Documentation for a Specific File +\par} +{\tc\tcl3 \v Generate Documentation for a Specific File} +{ +\par +\pard\plain \s40\li0\widctlpar\adjustright \shading1000\cbpat8 \f2\fs16\cgrid # Single file documentation\par +penify docgen -l src/main.py\par +} +\par} +{\bkmkstart AAAAAAAAEB} +{\bkmkend AAAAAAAAEB} +{{\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid +Generate Documentation for a Folder +\par} +{\tc\tcl3 \v Generate Documentation for a Folder} +{ +\par +\pard\plain \s40\li0\widctlpar\adjustright \shading1000\cbpat8 \f2\fs16\cgrid # Folder documentation\par +penify docgen -l src/models/\par +} +\par} +{\bkmkstart AAAAAAAAEC} +{\bkmkend AAAAAAAAEC} +{{\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid +Install Hook in Current Repository +\par} +{\tc\tcl3 \v Install Hook in Current Repository} +{ +\par +\pard\plain \s40\li0\widctlpar\adjustright \shading1000\cbpat8 \f2\fs16\cgrid # Install hook in current Git repository\par +penify docgen install-hook\par +} +\par} +{\bkmkstart AAAAAAAAED} +{\bkmkend AAAAAAAAED} +{{\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid +Install Hook in Specific Repository +\par} +{\tc\tcl3 \v Install Hook in Specific Repository} +{ +\par +\pard\plain \s40\li0\widctlpar\adjustright \shading1000\cbpat8 \f2\fs16\cgrid # Install hook in a specific Git repository\par +penify docgen install-hook -l /path/to/repo\par +} +\par} +{\bkmkstart AAAAAAAAEE} +{\bkmkend AAAAAAAAEE} +{{\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid +Uninstall Hook from Current Repository +\par} +{\tc\tcl3 \v Uninstall Hook from Current Repository} +{ +\par +\pard\plain \s40\li0\widctlpar\adjustright \shading1000\cbpat8 \f2\fs16\cgrid # Uninstall hook from current Git repository\par +penify docgen uninstall-hook\par +} +\par} +{\bkmkstart AAAAAAAAEF} +{\bkmkend AAAAAAAAEF} +{{\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid +Uninstall Hook from Specific Repository +\par} +{\tc\tcl3 \v Uninstall Hook from Specific Repository} +{ +\par +\pard\plain \s40\li0\widctlpar\adjustright \shading1000\cbpat8 \f2\fs16\cgrid # Uninstall hook from a specific Git repository\par +penify docgen uninstall-hook -l /path/to/repo\par +} +\par} +\par} +{\bkmkstart AAAAAAAAEG} +{\bkmkend AAAAAAAAEG} +{{\pard\plain \s2\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs28\kerning28\cgrid +Git Hook Commands +\par} +{\tc\tcl2 \v Git Hook Commands} +Penify provides Git hook commands to automate documentation generation as part of your Git workflow.\par +{\bkmkstart AAAAAAAAEH} +{\bkmkend AAAAAAAAEH} +{{\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid +Hook Installation +\par} +{\tc\tcl3 \v Hook Installation} +{\bkmkstart AAAAAAAAEI} +{\bkmkend AAAAAAAAEI} +{{\pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid +How Hooks Work +\par} +{\tc\tcl4 \v How Hooks Work} +When you install a Git hook with {\f2 penify docgen install-hook} , Penify:\par +{ +\par +\pard\plain \s140\fi-360\li360\widctlpar\fs20\cgrid +1.\tab Creates a post-commit hook script in the {\f2 .git/hooks} directory\par +\pard\plain \s140\fi-360\li360\widctlpar\fs20\cgrid +2.\tab Makes the script executable\par +\pard\plain \s140\fi-360\li360\widctlpar\fs20\cgrid +3.\tab Configures the hook to run {\f2 penify docgen} after each commit\par} +\par +\par} +{\bkmkstart AAAAAAAAEJ} +{\bkmkend AAAAAAAAEJ} +{{\pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid +Hook Script Content +\par} +{\tc\tcl4 \v Hook Script Content} +The generated post-commit hook contains:\par +{ +\par +\pard\plain \s40\li0\widctlpar\adjustright \shading1000\cbpat8 \f2\fs16\cgrid #!/bin/sh\par +# This is a post-commit hook generated by penify.\par +# Automatically generates documentation for changed files after each commit.\par +\par +penify docgen -gf /path/to/git/repository -t your_api_token\par +} +\par} +{\bkmkstart AAAAAAAAEK} +{\bkmkend AAAAAAAAEK} +{{\pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid +Installation Location +\par} +{\tc\tcl4 \v Installation Location} +By default, hooks are installed in the current Git repository. You can specify a different location:\par +{ +\par +\pard\plain \s40\li0\widctlpar\adjustright \shading1000\cbpat8 \f2\fs16\cgrid penify docgen install-hook -l /path/to/repo\par +} +\par} +{\bkmkstart AAAAAAAAEL} +{\bkmkend AAAAAAAAEL} +{{\pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid +Installation Requirements +\par} +{\tc\tcl4 \v Installation Requirements} +To install hooks, you need:{ +\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +A valid Penify API token (login first with {\f2 penify login} )\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +Write permissions to the {\f2 .git/hooks} directory\par} +\par +\par} +{\bkmkstart AAAAAAAAEM} +{\bkmkend AAAAAAAAEM} +{{\pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid +Verifying Installation +\par} +{\tc\tcl4 \v Verifying Installation} +After installation, you can verify that the hook is installed:\par +{ +\par +\pard\plain \s40\li0\widctlpar\adjustright \shading1000\cbpat8 \f2\fs16\cgrid cat .git/hooks/post-commit\par +} +\par} +\par} +{\bkmkstart AAAAAAAAEN} +{\bkmkend AAAAAAAAEN} +{{\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid +Hook Customization +\par} +{\tc\tcl3 \v Hook Customization} +You can customize the post-commit hook after installation:\par +{\bkmkstart AAAAAAAAEO} +{\bkmkend AAAAAAAAEO} +{{\pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid +Modifying Hook Behavior +\par} +{\tc\tcl4 \v Modifying Hook Behavior} +{ +\par +\pard\plain \s140\fi-360\li360\widctlpar\fs20\cgrid +1.\tab Edit the {\f2 .git/hooks/post-commit} file\par +\pard\plain \s140\fi-360\li360\widctlpar\fs20\cgrid +2.\tab Add additional options to the {\f2 penify docgen} command\par +\pard\plain \s140\fi-360\li360\widctlpar\fs20\cgrid +3.\tab Add other commands to run after commit\par} +\par +Example of a customized hook:\par +{ +\par +\pard\plain \s40\li0\widctlpar\adjustright \shading1000\cbpat8 \f2\fs16\cgrid #!/bin/sh\par +# This is a post-commit hook generated by penify.\par +# Automatically generates documentation for changed files after each commit.\par +\par +# Generate documentation\par +penify docgen -gf /path/to/git/repository -t your_api_token\par +\par +# Additional custom commands\par +echo "Documentation generation complete!"\par +} +\par} +{\bkmkstart AAAAAAAAEP} +{\bkmkend AAAAAAAAEP} +{{\pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid +Advanced Hook Scenarios +\par} +{\tc\tcl4 \v Advanced Hook Scenarios} +{\b Conditional Documentation Generation} :\par +{ +\par +\pard\plain \s40\li0\widctlpar\adjustright \shading1000\cbpat8 \f2\fs16\cgrid #!/bin/sh\par +# Only generate documentation for commits to the main branch\par +BRANCH=$(git rev-parse --abbrev-ref HEAD)\par +if [ "$BRANCH" = "main" ]; then\par + penify docgen -gf /path/to/git/repository -t your_api_token\par +fi\par +} +\par +{\b Documenting Specific Files/Folders} :\par +{ +\par +\pard\plain \s40\li0\widctlpar\adjustright \shading1000\cbpat8 \f2\fs16\cgrid #!/bin/sh\par +# Only document Python files in the src directory\par +penify docgen -l src/ -gf /path/to/git/repository -t your_api_token\par +} +\par} +\par} +{\bkmkstart AAAAAAAAEQ} +{\bkmkend AAAAAAAAEQ} +{{\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid +Hook Uninstallation +\par} +{\tc\tcl3 \v Hook Uninstallation} +{\bkmkstart AAAAAAAAER} +{\bkmkend AAAAAAAAER} +{{\pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid +Standard Uninstallation +\par} +{\tc\tcl4 \v Standard Uninstallation} +To remove a hook from the current repository:\par +{ +\par +\pard\plain \s40\li0\widctlpar\adjustright \shading1000\cbpat8 \f2\fs16\cgrid penify docgen uninstall-hook\par +} +\par} +{\bkmkstart AAAAAAAAES} +{\bkmkend AAAAAAAAES} +{{\pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid +Specific Repository Uninstallation +\par} +{\tc\tcl4 \v Specific Repository Uninstallation} +To remove a hook from a specific repository:\par +{ +\par +\pard\plain \s40\li0\widctlpar\adjustright \shading1000\cbpat8 \f2\fs16\cgrid penify docgen uninstall-hook -l /path/to/repo\par +} +\par} +{\bkmkstart AAAAAAAAET} +{\bkmkend AAAAAAAAET} +{{\pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid +Manual Hook Removal +\par} +{\tc\tcl4 \v Manual Hook Removal} +If needed, you can manually remove the hook:\par +{ +\par +\pard\plain \s40\li0\widctlpar\adjustright \shading1000\cbpat8 \f2\fs16\cgrid rm .git/hooks/post-commit\par +} +\par} +{\bkmkstart AAAAAAAAEU} +{\bkmkend AAAAAAAAEU} +{{\pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid +Verifying Uninstallation +\par} +{\tc\tcl4 \v Verifying Uninstallation} +Check that the hook was successfully removed:\par +{ +\par +\pard\plain \s40\li0\widctlpar\adjustright \shading1000\cbpat8 \f2\fs16\cgrid ls -la .git/hooks/post-commit # Should return "No such file or directory"\par +} +\par} +\par} +\par} +{\bkmkstart AAAAAAAAEV} +{\bkmkend AAAAAAAAEV} +{{\pard\plain \s2\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs28\kerning28\cgrid +Advanced Use Cases +\par} +{\tc\tcl2 \v Advanced Use Cases} +{\bkmkstart AAAAAAAAEW} +{\bkmkend AAAAAAAAEW} +{{\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid +Continuous Integration +\par} +{\tc\tcl3 \v Continuous Integration} +Run documentation generation in CI pipelines:\par +{ +\par +\pard\plain \s40\li0\widctlpar\adjustright \shading1000\cbpat8 \f2\fs16\cgrid # In your CI script\par +export PENIFY_API_TOKEN=your_api_token\par +penify docgen -l src/\par +} +\par} +{\bkmkstart AAAAAAAAEX} +{\bkmkend AAAAAAAAEX} +{{\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid +Batch Documentation +\par} +{\tc\tcl3 \v Batch Documentation} +Generate documentation for multiple repositories:\par +{ +\par +\pard\plain \s40\li0\widctlpar\adjustright \shading1000\cbpat8 \f2\fs16\cgrid # Bash script for batch documentation\par +for repo in repo1 repo2 repo3; do\par + cd /path/to/$repo\par + penify docgen -l .\par +done\par +} +\par} +{\bkmkstart AAAAAAAAEY} +{\bkmkend AAAAAAAAEY} +{{\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid +Custom Git Hook Integration +\par} +{\tc\tcl3 \v Custom Git Hook Integration} +Integrate with other Git hooks:\par +{ +\par +\pard\plain \s40\li0\widctlpar\adjustright \shading1000\cbpat8 \f2\fs16\cgrid # In .git/hooks/pre-push\par +penify docgen -l src/\par +} +\par} +{\bkmkstart AAAAAAAAEZ} +{\bkmkend AAAAAAAAEZ} +{{\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid +Documenting Release Tags +\par} +{\tc\tcl3 \v Documenting Release Tags} +Generate documentation when creating a release tag:\par +{ +\par +\pard\plain \s40\li0\widctlpar\adjustright \shading1000\cbpat8 \f2\fs16\cgrid # Document everything when creating a tag\par +git tag -a v1.0.0\par +penify docgen -l . # Document entire codebase\par +git commit --amend -m "Release v1.0.0 with updated documentation"\par +} +\par} +\par} +{\bkmkstart AAAAAAAAFA} +{\bkmkend AAAAAAAAFA} +{{\pard\plain \s2\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs28\kerning28\cgrid +Troubleshooting +\par} +{\tc\tcl2 \v Troubleshooting} +{\bkmkstart AAAAAAAAFB} +{\bkmkend AAAAAAAAFB} +{{\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid +Common Issues +\par} +{\tc\tcl3 \v Common Issues} +{ +\par +\pard\plain \s140\fi-360\li360\widctlpar\fs20\cgrid +1.\tab **"Authentication required"**{ +\par +\pard\plain \s121\fi-360\li720\widctlpar\jclisttab\tx720{\*\pn \pnlvlbody\ilvl0\ls2\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +Run {\f2 penify login} before using documentation features\par +\pard\plain \s121\fi-360\li720\widctlpar\jclisttab\tx720{\*\pn \pnlvlbody\ilvl0\ls2\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +Check your API token with {\f2 cat ~/.penify} \par} +\pard\plain \s140\fi-360\li360\widctlpar\fs20\cgrid +2.\tab **"Permission denied when installing hook"**{ +\par +\pard\plain \s121\fi-360\li720\widctlpar\jclisttab\tx720{\*\pn \pnlvlbody\ilvl0\ls2\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +Check Git repository permissions\par +\pard\plain \s121\fi-360\li720\widctlpar\jclisttab\tx720{\*\pn \pnlvlbody\ilvl0\ls2\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +Try running with sudo (if appropriate for your environment)\par +\pard\plain \s121\fi-360\li720\widctlpar\jclisttab\tx720{\*\pn \pnlvlbody\ilvl0\ls2\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +Ensure the {\f2 .git/hooks} directory exists\par} +\pard\plain \s140\fi-360\li360\widctlpar\fs20\cgrid +3.\tab **"Hook installed but not running"**{ +\par +\pard\plain \s121\fi-360\li720\widctlpar\jclisttab\tx720{\*\pn \pnlvlbody\ilvl0\ls2\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +Check if the hook is executable: {\f2 ls -la .git/hooks/post-commit} \par +\pard\plain \s121\fi-360\li720\widctlpar\jclisttab\tx720{\*\pn \pnlvlbody\ilvl0\ls2\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +Make it executable if needed: {\f2 chmod +x .git/hooks/post-commit} \par +\pard\plain \s121\fi-360\li720\widctlpar\jclisttab\tx720{\*\pn \pnlvlbody\ilvl0\ls2\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +Check for syntax errors in the hook script\par} +\pard\plain \s140\fi-360\li360\widctlpar\fs20\cgrid +4.\tab **"File or directory not found"**{ +\par +\pard\plain \s121\fi-360\li720\widctlpar\jclisttab\tx720{\*\pn \pnlvlbody\ilvl0\ls2\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +Verify the path provided to the {\f2 -l} option\par +\pard\plain \s121\fi-360\li720\widctlpar\jclisttab\tx720{\*\pn \pnlvlbody\ilvl0\ls2\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +Ensure you're running the command from the correct directory\par} +\pard\plain \s140\fi-360\li360\widctlpar\fs20\cgrid +5.\tab **"Hook uninstallation failed"**{ +\par +\pard\plain \s121\fi-360\li720\widctlpar\jclisttab\tx720{\*\pn \pnlvlbody\ilvl0\ls2\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +Check permissions on the {\f2 .git/hooks} directory\par +\pard\plain \s121\fi-360\li720\widctlpar\jclisttab\tx720{\*\pn \pnlvlbody\ilvl0\ls2\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +Try manual removal: {\f2 rm .git/hooks/post-commit} \par} +} +\par +\par} +{\bkmkstart AAAAAAAAFC} +{\bkmkend AAAAAAAAFC} +{{\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid +Debugging +\par} +{\tc\tcl3 \v Debugging} +For detailed output when running documentation commands:\par +{ +\par +\pard\plain \s40\li0\widctlpar\adjustright \shading1000\cbpat8 \f2\fs16\cgrid export PENIFY_DEBUG=1\par +penify docgen -l src/\par +} +\par} +{\bkmkstart AAAAAAAAFD} +{\bkmkend AAAAAAAAFD} +{{\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid +Getting Help +\par} +{\tc\tcl3 \v Getting Help} +For command-specific help:\par +{ +\par +\pard\plain \s40\li0\widctlpar\adjustright \shading1000\cbpat8 \f2\fs16\cgrid penify docgen --help\par +penify docgen install-hook --help\par +penify docgen uninstall-hook --help\par +} + \par} +\par} +}} + +\pard\plain \sect\sbkpage +\s1\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs36\kerning36\cgrid +Penify CLI Example Workflows{\tc \v Penify CLI Example Workflows}\par \pard\plain +{\bkmkstart AAAAAAAAPF} +{\bkmkend AAAAAAAAPF} +{ +\pard\plain \s17\sa60\sb30\widctlpar\qj \fs22\cgrid {\s17\sa60\sb30\widctlpar\qj \fs22\cgrid +This document demonstrates how to use Penify CLI in real-world development workflows to improve your productivity.\par +{\bkmkstart AAAAAAAAFE} +{\bkmkend AAAAAAAAFE} +{{\pard\plain \s2\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs28\kerning28\cgrid +Workflow 1: Efficient Git Commits with AI +\par} +{\tc\tcl2 \v Workflow 1: Efficient Git Commits with AI} +{\bkmkstart AAAAAAAAFF} +{\bkmkend AAAAAAAAFF} +{{\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid +Setup +\par} +{\tc\tcl3 \v Setup} +First, configure your local LLM for offline operation:\par +{ +\par +\pard\plain \s40\li0\widctlpar\adjustright \shading1000\cbpat8 \f2\fs16\cgrid penify config llm\par +} +\par +Configure your JIRA integration for enhanced commit messages:\par +{ +\par +\pard\plain \s40\li0\widctlpar\adjustright \shading1000\cbpat8 \f2\fs16\cgrid penify config jira\par +} +\par} +{\bkmkstart AAAAAAAAFG} +{\bkmkend AAAAAAAAFG} +{{\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid +Daily Workflow +\par} +{\tc\tcl3 \v Daily Workflow} +{ +\par +\pard\plain \s140\fi-360\li360\widctlpar\fs20\cgrid +1.\tab Make your code changes as usual\par +\pard\plain \s140\fi-360\li360\widctlpar\fs20\cgrid +2.\tab When ready to commit, use Penify to generate a smart commit message:\par} +\par +{ +\par +\pard\plain \s40\li0\widctlpar\adjustright \shading1000\cbpat8 \f2\fs16\cgrid penify commit\par +} +\par +{ +\par +\pard\plain \s140\fi-360\li360\widctlpar\fs20\cgrid +1.\tab Review and confirm the generated commit message\par +\pard\plain \s140\fi-360\li360\widctlpar\fs20\cgrid +2.\tab Git commit and push as usual\par} +\par +\par} +{\bkmkstart AAAAAAAAFH} +{\bkmkend AAAAAAAAFH} +{{\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid +Benefits +\par} +{\tc\tcl3 \v Benefits} +{ +\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +Consistent and descriptive commit messages\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +Automatic inclusion of relevant JIRA ticket information\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +Time saved from writing detailed commit messages\par} +\par +\par} +\par} +{\bkmkstart AAAAAAAAFI} +{\bkmkend AAAAAAAAFI} +{{\pard\plain \s2\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs28\kerning28\cgrid +Workflow 2: Documentation Generation Pipeline +\par} +{\tc\tcl2 \v Workflow 2: Documentation Generation Pipeline} +{\bkmkstart AAAAAAAAFJ} +{\bkmkend AAAAAAAAFJ} +{{\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid +Setup +\par} +{\tc\tcl3 \v Setup} +Login to Penify to access advanced documentation features:\par +{ +\par +\pard\plain \s40\li0\widctlpar\adjustright \shading1000\cbpat8 \f2\fs16\cgrid penify login\par +} +\par +Install the Git hook for automatic documentation generation:\par +{ +\par +\pard\plain \s40\li0\widctlpar\adjustright \shading1000\cbpat8 \f2\fs16\cgrid penify docgen install-hook\par +} +\par} +{\bkmkstart AAAAAAAAFK} +{\bkmkend AAAAAAAAFK} +{{\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid +Daily Workflow +\par} +{\tc\tcl3 \v Daily Workflow} +{ +\par +\pard\plain \s140\fi-360\li360\widctlpar\fs20\cgrid +1.\tab Make your code changes as usual\par +\pard\plain \s140\fi-360\li360\widctlpar\fs20\cgrid +2.\tab Commit your changes\par +\pard\plain \s140\fi-360\li360\widctlpar\fs20\cgrid +3.\tab Documentation is automatically generated for changed files\par +\pard\plain \s140\fi-360\li360\widctlpar\fs20\cgrid +4.\tab Review the generated documentation\par} +\par +\par} +{\bkmkstart AAAAAAAAFL} +{\bkmkend AAAAAAAAFL} +{{\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid +Manual Documentation +\par} +{\tc\tcl3 \v Manual Documentation} +For specific files or folders:\par +{ +\par +\pard\plain \s40\li0\widctlpar\adjustright \shading1000\cbpat8 \f2\fs16\cgrid penify docgen -l src/components/authentication\par +} +\par} +{\bkmkstart AAAAAAAAFM} +{\bkmkend AAAAAAAAFM} +{{\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid +Benefits +\par} +{\tc\tcl3 \v Benefits} +{ +\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +Always up-to-date documentation\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +Consistent documentation style\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +Time saved from writing detailed documentation\par} +\par +\par} +\par} +{\bkmkstart AAAAAAAAFN} +{\bkmkend AAAAAAAAFN} +{{\pard\plain \s2\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs28\kerning28\cgrid +Workflow 3: Code Review Enhancement +\par} +{\tc\tcl2 \v Workflow 3: Code Review Enhancement} +{\bkmkstart AAAAAAAAFO} +{\bkmkend AAAAAAAAFO} +{{\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid +Setup +\par} +{\tc\tcl3 \v Setup} +Ensure you're logged into Penify:\par +{ +\par +\pard\plain \s40\li0\widctlpar\adjustright \shading1000\cbpat8 \f2\fs16\cgrid penify login\par +} +\par} +{\bkmkstart AAAAAAAAFP} +{\bkmkend AAAAAAAAFP} +{{\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid +Workflow +\par} +{\tc\tcl3 \v Workflow} +{ +\par +\pard\plain \s140\fi-360\li360\widctlpar\fs20\cgrid +1.\tab Before submitting a PR, generate documentation for changed files:\par} +\par +{ +\par +\pard\plain \s40\li0\widctlpar\adjustright \shading1000\cbpat8 \f2\fs16\cgrid penify docgen\par +} +\par +{ +\par +\pard\plain \s140\fi-360\li360\widctlpar\fs20\cgrid +1.\tab Include the generated documentation in your PR\par +\pard\plain \s140\fi-360\li360\widctlpar\fs20\cgrid +2.\tab Reviewers can better understand your changes with the AI-generated explanations\par} +\par +\par} +{\bkmkstart AAAAAAAAFQ} +{\bkmkend AAAAAAAAFQ} +{{\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid +Benefits +\par} +{\tc\tcl3 \v Benefits} +{ +\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +Improved PR quality\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +Faster code reviews\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +Better team understanding of code changes\par} +\par +\par} +\par} +{\bkmkstart AAAAAAAAFR} +{\bkmkend AAAAAAAAFR} +{{\pard\plain \s2\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs28\kerning28\cgrid +Workflow 4: Onboarding New Team Members +\par} +{\tc\tcl2 \v Workflow 4: Onboarding New Team Members} +{\bkmkstart AAAAAAAAFS} +{\bkmkend AAAAAAAAFS} +{{\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid +For Team Leads +\par} +{\tc\tcl3 \v For Team Leads} +Generate comprehensive documentation for the entire codebase:\par +{ +\par +\pard\plain \s40\li0\widctlpar\adjustright \shading1000\cbpat8 \f2\fs16\cgrid penify docgen -l .\par +} +\par} +{\bkmkstart AAAAAAAAFT} +{\bkmkend AAAAAAAAFT} +{{\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid +For New Team Members +\par} +{\tc\tcl3 \v For New Team Members} +Generate focused documentation for components you're working on:\par +{ +\par +\pard\plain \s40\li0\widctlpar\adjustright \shading1000\cbpat8 \f2\fs16\cgrid penify docgen -l src/components/my-feature\par +} +\par} +{\bkmkstart AAAAAAAAFU} +{\bkmkend AAAAAAAAFU} +{{\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid +Benefits +\par} +{\tc\tcl3 \v Benefits} +{ +\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +Faster onboarding\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +Better understanding of code structure\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +Reduced questions to senior team members\par} +\par +\par} +\par} +{\bkmkstart AAAAAAAAFV} +{\bkmkend AAAAAAAAFV} +{{\pard\plain \s2\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs28\kerning28\cgrid +Workflow 5: Legacy Code Understanding +\par} +{\tc\tcl2 \v Workflow 5: Legacy Code Understanding} +When working with unfamiliar legacy code:\par +{ +\par +\pard\plain \s40\li0\widctlpar\adjustright \shading1000\cbpat8 \f2\fs16\cgrid # Document a specific complex file\par +penify docgen -l src/legacy/complex_module.py\par +\par +# Document an entire legacy component\par +penify docgen -l src/legacy/old_component\par +} +\par +{\bkmkstart AAAAAAAAFW} +{\bkmkend AAAAAAAAFW} +{{\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid +Benefits +\par} +{\tc\tcl3 \v Benefits} +{ +\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +Quickly understand complex legacy systems\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +Reduce time spent deciphering undocumented code\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +Make safer changes to legacy systems \par} +\par +\par} +\par} +}} + +\pard\plain \sect\sbkpage +\s1\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs36\kerning36\cgrid +Penify CLI Tool{\tc \v Penify CLI Tool}\par \pard\plain +{\bkmkstart AAAAAAAAPG} +{\bkmkend AAAAAAAAPG} +{ +\pard\plain \s17\sa60\sb30\widctlpar\qj \fs22\cgrid {\s17\sa60\sb30\widctlpar\qj \fs22\cgrid + \par +A CLI tool to generate smart commit messages, code documentation, and more.\par +{\bkmkstart AAAAAAAAFX} +{\bkmkend AAAAAAAAFX} +{{\pard\plain \s2\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs28\kerning28\cgrid +Features +\par} +{\tc\tcl2 \v Features} +{ +\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +Automatically generate documentation for your code\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +Support for multiple programming languages\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +Git hook integration for automatic documentation on commits\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +Folder and file analysis\par} +\par +\par} +{\bkmkstart AAAAAAAAFY} +{\bkmkend AAAAAAAAFY} +{{\pard\plain \s2\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs28\kerning28\cgrid +Installation +\par} +{\tc\tcl2 \v Installation} +Install from PyPI:\par +{ +\par +\pard\plain \s40\li0\widctlpar\adjustright \shading1000\cbpat8 \f2\fs16\cgrid pip install penify\par +} +\par} +{\bkmkstart AAAAAAAAFZ} +{\bkmkend AAAAAAAAFZ} +{{\pard\plain \s2\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs28\kerning28\cgrid +Usage +\par} +{\tc\tcl2 \v Usage} +Penify CLI provides several subcommands for different functionalities, organized into basic commands (no login required) and advanced commands (login required).\par} +{\bkmkstart AAAAAAAAGA} +{\bkmkend AAAAAAAAGA} +{{\pard\plain \s2\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs28\kerning28\cgrid +Basic Commands (No login required) +\par} +{\tc\tcl2 \v Basic Commands (No login required)} +{\bkmkstart AAAAAAAAGB} +{\bkmkend AAAAAAAAGB} +{{\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid +Commit +\par} +{\tc\tcl3 \v Commit} +Generate smart commit messages using local LLM:\par +{ +\par +\pard\plain \s40\li0\widctlpar\adjustright \shading1000\cbpat8 \f2\fs16\cgrid penify commit [-m "Optional message"] [-e] [-d]\par +} +\par +Options:{ +\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +{\f2 -m, --message} : Optional custom commit message\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +{\f2 -e, --terminal} : Open editor to modify commit message before committing\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +{\f2 -d, --description} : Generate commit message with both title and description (without this flag, only title is generated)\par} +\par +\par} +{\bkmkstart AAAAAAAAGC} +{\bkmkend AAAAAAAAGC} +{{\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid +Config +\par} +{\tc\tcl3 \v Config} +Configure local LLM and JIRA settings:\par +{ +\par +\pard\plain \s40\li0\widctlpar\adjustright \shading1000\cbpat8 \f2\fs16\cgrid # Configure LLM settings\par +penify config llm --model MODEL_NAME [--api-base API_URL] [--api-key API_KEY]\par +\par +# Configure LLM settings through web interface\par +penify config llm-web\par +\par +# Configure JIRA settings\par +penify config jira --url JIRA_URL --username USERNAME --api-token TOKEN [--verify]\par +\par +# Configure JIRA settings through web interface\par +penify config jira-web\par +} +\par} +\par} +{\bkmkstart AAAAAAAAGD} +{\bkmkend AAAAAAAAGD} +{{\pard\plain \s2\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs28\kerning28\cgrid +Advanced Commands (Login required) +\par} +{\tc\tcl2 \v Advanced Commands (Login required)} +{\bkmkstart AAAAAAAAGE} +{\bkmkend AAAAAAAAGE} +{{\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid +Login +\par} +{\tc\tcl3 \v Login} +To log in and obtain an API token:\par +{ +\par +\pard\plain \s40\li0\widctlpar\adjustright \shading1000\cbpat8 \f2\fs16\cgrid penify login\par +} +\par +This command will open a browser window for authentication. After successful login, the API key will be saved locally for future use.\par} +{\bkmkstart AAAAAAAAGF} +{\bkmkend AAAAAAAAGF} +{{\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid +Documentation Generation +\par} +{\tc\tcl3 \v Documentation Generation} +Generate documentation for Git diff, files or folders:\par +{ +\par +\pard\plain \s40\li0\widctlpar\adjustright \shading1000\cbpat8 \f2\fs16\cgrid # Generate documentation for latest Git commit diff\par +penify docgen\par +\par +# Generate documentation for specific file or folder\par +penify docgen -l /path/to/file/or/folder\par +} +\par +Options:{ +\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +{\f2 -l, --location} : Path to specific file or folder for documentation generation (defaults to current directory)\par} +\par +\par} +{\bkmkstart AAAAAAAAGG} +{\bkmkend AAAAAAAAGG} +{{\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid +Git Hook Management +\par} +{\tc\tcl3 \v Git Hook Management} +Install or uninstall Git post-commit hooks:\par +{ +\par +\pard\plain \s40\li0\widctlpar\adjustright \shading1000\cbpat8 \f2\fs16\cgrid # Install Git hook\par +penify docgen install-hook [-l /path/to/repo]\par +\par +# Uninstall Git hook\par +penify docgen uninstall-hook [-l /path/to/repo]\par +} +\par +Options:{ +\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +{\f2 -l, --location} : Path to the Git repository (defaults to current directory)\par} +\par +\par} +\par} +{\bkmkstart AAAAAAAAGH} +{\bkmkend AAAAAAAAGH} +{{\pard\plain \s2\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs28\kerning28\cgrid +Authentication +\par} +{\tc\tcl2 \v Authentication} +Penify CLI uses an API token for authentication with advanced features.\par +If no token is available and you try to access an advanced feature, you'll be prompted to log in.\par} +{\bkmkstart AAAAAAAAGI} +{\bkmkend AAAAAAAAGI} +{{\pard\plain \s2\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs28\kerning28\cgrid +Local LLM Configuration +\par} +{\tc\tcl2 \v Local LLM Configuration} +For commit message generation, Penify can use a local LLM. Configure it using:\par +{ +\par +\pard\plain \s40\li0\widctlpar\adjustright \shading1000\cbpat8 \f2\fs16\cgrid penify config llm --model MODEL_NAME --api-base API_URL --api-key API_KEY\par +} +\par +Common configurations:{ +\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +OpenAI: {\f2 --model gpt-3.5-turbo --api-base {\f2 https://api.openai.com/v1} --api-key YOUR_KEY} \par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +Anthropic: {\f2 --model claude-2 --api-base {\f2 https://api.anthropic.com} --api-key YOUR_KEY} \par} +\par +\par} +{\bkmkstart AAAAAAAAGJ} +{\bkmkend AAAAAAAAGJ} +{{\pard\plain \s2\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs28\kerning28\cgrid +JIRA Integration +\par} +{\tc\tcl2 \v JIRA Integration} +Configure JIRA integration to enhance commit messages with issue details:\par +{ +\par +\pard\plain \s40\li0\widctlpar\adjustright \shading1000\cbpat8 \f2\fs16\cgrid penify config jira --url https://your-domain.atlassian.net --username your-email@example.com --api-token YOUR_API_TOKEN\par +} +\par} +{\bkmkstart AAAAAAAAGK} +{\bkmkend AAAAAAAAGK} +{{\pard\plain \s2\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs28\kerning28\cgrid +Development +\par} +{\tc\tcl2 \v Development} +To set up the development environment:\par +{ +\par +\pard\plain \s140\fi-360\li360\widctlpar\fs20\cgrid +1.\tab Clone the repository: { +\par +\pard\plain \s41\li360\widctlpar\adjustright \shading1000\cbpat8 \f2\fs16\cgrid git clone https://github.com/SingularityX-ai/penify-cli.git\par +} +\par +\pard\plain \s140\fi-360\li360\widctlpar\fs20\cgrid +2.\tab Install the package in editable mode: { +\par +\pard\plain \s41\li360\widctlpar\adjustright \shading1000\cbpat8 \f2\fs16\cgrid pip install -e .\par +} +\par} +\par +{\bkmkstart AAAAAAAAGL} +{\bkmkend AAAAAAAAGL} +{{\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid +Running Tests +\par} +{\tc\tcl3 \v Running Tests} +{ +\par +\pard\plain \s40\li0\widctlpar\adjustright \shading1000\cbpat8 \f2\fs16\cgrid pytest\par +} +\par} +\par} +{\bkmkstart AAAAAAAAGM} +{\bkmkend AAAAAAAAGM} +{{\pard\plain \s2\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs28\kerning28\cgrid +License +\par} +{\tc\tcl2 \v License} +This project is licensed under the MIT License.\par} +{\bkmkstart AAAAAAAAGN} +{\bkmkend AAAAAAAAGN} +{{\pard\plain \s2\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs28\kerning28\cgrid +Author +\par} +{\tc\tcl2 \v Author} +Suman Saurabh ({\f2 ss.sumansaurabh92@gmail.com})\par} +{\bkmkstart AAAAAAAAGO} +{\bkmkend AAAAAAAAGO} +{{\pard\plain \s2\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs28\kerning28\cgrid +Contributing +\par} +{\tc\tcl2 \v Contributing} +Contributions are welcome! Please feel free to submit a Pull Request.\par} +{\bkmkstart AAAAAAAAGP} +{\bkmkend AAAAAAAAGP} +{{\pard\plain \s2\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs28\kerning28\cgrid +Issues +\par} +{\tc\tcl2 \v Issues} +If you encounter any problems or have suggestions, please file an issue on the {\f2 GitHub repository}.\par} +{\bkmkstart AAAAAAAAGQ} +{\bkmkend AAAAAAAAGQ} +{{\pard\plain \s2\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs28\kerning28\cgrid +Support +\par} +{\tc\tcl2 \v Support} +For automated API Documentation, Architecture Documentation, Code Documentation, Pull Request Documentation, or if you need a demo, please join our {\f2 Discord support channel}. \par} +}} + +\pard\plain \sect\sbkpage +\s1\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs36\kerning36\cgrid +Namespace Index\par \pard\plain +{\tc \v Namespace Index} +\pard\plain \s2\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs28\kerning28\cgrid +Namespace List\par \pard\plain +{ +\pard\plain \s17\sa60\sb30\widctlpar\qj \fs22\cgrid Here is a list of all namespaces with brief descriptions:} +{ +\par +\pard\plain \s101\li360\sa27\sb27\widctlpar\tqr\tldot\tx8640\adjustright \fs20\cgrid +{\b {\b penify_hook} } \tab {\field\fldedit {\*\fldinst PAGEREF AAAAAAAAGS \\*MERGEFORMAT}{\fldrslt pagenum}} +\par +{\b {\b penify_hook.api_client} } \tab {\field\fldedit {\*\fldinst PAGEREF AAAAAAAAGT \\*MERGEFORMAT}{\fldrslt pagenum}} +\par +{\b {\b penify_hook.base_analyzer} } \tab {\field\fldedit {\*\fldinst PAGEREF AAAAAAAAHE \\*MERGEFORMAT}{\fldrslt pagenum}} +\par +{\b {\b penify_hook.commands} } \tab {\field\fldedit {\*\fldinst PAGEREF AAAAAAAAHS \\*MERGEFORMAT}{\fldrslt pagenum}} +\par +{\b {\b penify_hook.commands.auth_commands} } \tab {\field\fldedit {\*\fldinst PAGEREF AAAAAAAAHT \\*MERGEFORMAT}{\fldrslt pagenum}} +\par +{\b {\b penify_hook.commands.commit_commands} } \tab {\field\fldedit {\*\fldinst PAGEREF AAAAAAAAHW \\*MERGEFORMAT}{\fldrslt pagenum}} +\par +{\b {\b penify_hook.commands.config_commands} } \tab {\field\fldedit {\*\fldinst PAGEREF AAAAAAAAIA \\*MERGEFORMAT}{\fldrslt pagenum}} +\par +{\b {\b penify_hook.commands.doc_commands} } \tab {\field\fldedit {\*\fldinst PAGEREF AAAAAAAAIN \\*MERGEFORMAT}{\fldrslt pagenum}} +\par +{\b {\b penify_hook.commands.hook_commands} } \tab {\field\fldedit {\*\fldinst PAGEREF AAAAAAAAIS \\*MERGEFORMAT}{\fldrslt pagenum}} +\par +{\b {\b penify_hook.commit_analyzer} } \tab {\field\fldedit {\*\fldinst PAGEREF AAAAAAAAIX \\*MERGEFORMAT}{\fldrslt pagenum}} +\par +{\b {\b penify_hook.config_command} } \tab {\field\fldedit {\*\fldinst PAGEREF AAAAAAAAJE \\*MERGEFORMAT}{\fldrslt pagenum}} +\par +{\b {\b penify_hook.constants} } \tab {\field\fldedit {\*\fldinst PAGEREF AAAAAAAAJH \\*MERGEFORMAT}{\fldrslt pagenum}} +\par +{\b {\b penify_hook.file_analyzer} } \tab {\field\fldedit {\*\fldinst PAGEREF AAAAAAAAJK \\*MERGEFORMAT}{\fldrslt pagenum}} +\par +{\b {\b penify_hook.folder_analyzer} } \tab {\field\fldedit {\*\fldinst PAGEREF AAAAAAAAJR \\*MERGEFORMAT}{\fldrslt pagenum}} +\par +{\b {\b penify_hook.git_analyzer} } \tab {\field\fldedit {\*\fldinst PAGEREF AAAAAAAAJW \\*MERGEFORMAT}{\fldrslt pagenum}} +\par +{\b {\b penify_hook.jira_client} } \tab {\field\fldedit {\*\fldinst PAGEREF AAAAAAAAKD \\*MERGEFORMAT}{\fldrslt pagenum}} +\par +{\b {\b penify_hook.llm_client} } \tab {\field\fldedit {\*\fldinst PAGEREF AAAAAAAAKV \\*MERGEFORMAT}{\fldrslt pagenum}} +\par +{\b {\b penify_hook.login_command} } \tab {\field\fldedit {\*\fldinst PAGEREF AAAAAAAALC \\*MERGEFORMAT}{\fldrslt pagenum}} +\par +{\b {\b penify_hook.main} } \tab {\field\fldedit {\*\fldinst PAGEREF AAAAAAAALF \\*MERGEFORMAT}{\fldrslt pagenum}} +\par +{\b {\b penify_hook.ui_utils} } \tab {\field\fldedit {\*\fldinst PAGEREF AAAAAAAALH \\*MERGEFORMAT}{\fldrslt pagenum}} +\par +{\b {\b penify_hook.utils} } \tab {\field\fldedit {\*\fldinst PAGEREF AAAAAAAAMI \\*MERGEFORMAT}{\fldrslt pagenum}} +\par +{\b {\b setup} } \tab {\field\fldedit {\*\fldinst PAGEREF AAAAAAAAMO \\*MERGEFORMAT}{\fldrslt pagenum}} +\par +{\b {\b tests} } \tab {\field\fldedit {\*\fldinst PAGEREF AAAAAAAANC \\*MERGEFORMAT}{\fldrslt pagenum}} +\par +{\b {\b tests.conftest} } \tab {\field\fldedit {\*\fldinst PAGEREF AAAAAAAAND \\*MERGEFORMAT}{\fldrslt pagenum}} +\par +{\b {\b tests.test_commit_commands} } \tab {\field\fldedit {\*\fldinst PAGEREF AAAAAAAANE \\*MERGEFORMAT}{\fldrslt pagenum}} +\par +{\b {\b tests.test_config_commands} } \tab {\field\fldedit {\*\fldinst PAGEREF AAAAAAAANS \\*MERGEFORMAT}{\fldrslt pagenum}} +\par +{\b {\b tests.test_doc_commands} } \tab {\field\fldedit {\*\fldinst PAGEREF AAAAAAAAOG \\*MERGEFORMAT}{\fldrslt pagenum}} +\par +{\b {\b tests.test_web_config} } \tab {\field\fldedit {\*\fldinst PAGEREF AAAAAAAAOS \\*MERGEFORMAT}{\fldrslt pagenum}} +\par +\par} +\pard\plain \sect\sbkpage +\s1\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs36\kerning36\cgrid +Hierarchical Index\par \pard\plain +{\tc \v Hierarchical Index} +\pard\plain \s2\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs28\kerning28\cgrid +Class Hierarchy\par \pard\plain +{ +\pard\plain \s17\sa60\sb30\widctlpar\qj \fs22\cgrid This inheritance list is sorted roughly, but not completely, alphabetically:} +{ +\par +\pard\plain \s101\li360\sa27\sb27\widctlpar\tqr\tldot\tx8640\adjustright \fs20\cgrid +penify_hook.api_client.APIClient\tab {\field\fldedit {\*\fldinst PAGEREF AAAAAAAAGU \\*MERGEFORMAT}{\fldrslt pagenum}} +\par +penify_hook.base_analyzer.BaseAnalyzer\tab {\field\fldedit {\*\fldinst PAGEREF AAAAAAAAHF \\*MERGEFORMAT}{\fldrslt pagenum}} +{ +\par +\pard\plain \s102\li720\sa24\sb24\widctlpar\tqr\tldot\tx8640\adjustright \fs20\cgrid +penify_hook.commit_analyzer.CommitDocGenHook\tab {\field\fldedit {\*\fldinst PAGEREF AAAAAAAAIY \\*MERGEFORMAT}{\fldrslt pagenum}} +\par +penify_hook.file_analyzer.FileAnalyzerGenHook\tab {\field\fldedit {\*\fldinst PAGEREF AAAAAAAAJM \\*MERGEFORMAT}{\fldrslt pagenum}} +\par +penify_hook.folder_analyzer.FolderAnalyzerGenHook\tab {\field\fldedit {\*\fldinst PAGEREF AAAAAAAAJS \\*MERGEFORMAT}{\fldrslt pagenum}} +\par +penify_hook.git_analyzer.GitDocGenHook\tab {\field\fldedit {\*\fldinst PAGEREF AAAAAAAAJY \\*MERGEFORMAT}{\fldrslt pagenum}} +\par +}\par +Exception\tab {\field\fldedit {\*\fldinst PAGEREF AAAAAAAAGR \\*MERGEFORMAT}{\fldrslt pagenum}} +{ +\par +\pard\plain \s102\li720\sa24\sb24\widctlpar\tqr\tldot\tx8640\adjustright \fs20\cgrid +penify_hook.utils.GitRepoNotFoundError\tab {\field\fldedit {\*\fldinst PAGEREF AAAAAAAAMN \\*MERGEFORMAT}{\fldrslt pagenum}} +\par +}\par +penify_hook.jira_client.JiraClient\tab {\field\fldedit {\*\fldinst PAGEREF AAAAAAAAKF \\*MERGEFORMAT}{\fldrslt pagenum}} +\par +penify_hook.llm_client.LLMClient\tab {\field\fldedit {\*\fldinst PAGEREF AAAAAAAAKW \\*MERGEFORMAT}{\fldrslt pagenum}} +\par +tests.test_commit_commands.TestCommitCommands\tab {\field\fldedit {\*\fldinst PAGEREF AAAAAAAANF \\*MERGEFORMAT}{\fldrslt pagenum}} +\par +tests.test_config_commands.TestConfigCommands\tab {\field\fldedit {\*\fldinst PAGEREF AAAAAAAANT \\*MERGEFORMAT}{\fldrslt pagenum}} +\par +tests.test_web_config.TestWebConfig\tab {\field\fldedit {\*\fldinst PAGEREF AAAAAAAAOT \\*MERGEFORMAT}{\fldrslt pagenum}} +\par +} +\pard\plain \sect\sbkpage +\s1\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs36\kerning36\cgrid +Class Index\par \pard\plain +{\tc \v Class Index} +\pard\plain \s2\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs28\kerning28\cgrid +Class List\par \pard\plain +{ +\pard\plain \s17\sa60\sb30\widctlpar\qj \fs22\cgrid Here are the classes, structs, unions and interfaces with brief descriptions:} +{ +\par +\pard\plain \s101\li360\sa27\sb27\widctlpar\tqr\tldot\tx8640\adjustright \fs20\cgrid +{\b {\b penify_hook.api_client.APIClient} } \tab {\field\fldedit {\*\fldinst PAGEREF AAAAAAAAGU \\*MERGEFORMAT}{\fldrslt pagenum}} +\par +{\b {\b penify_hook.base_analyzer.BaseAnalyzer} } \tab {\field\fldedit {\*\fldinst PAGEREF AAAAAAAAHF \\*MERGEFORMAT}{\fldrslt pagenum}} +\par +{\b {\b penify_hook.commit_analyzer.CommitDocGenHook} } \tab {\field\fldedit {\*\fldinst PAGEREF AAAAAAAAIY \\*MERGEFORMAT}{\fldrslt pagenum}} +\par +{\b {\b Exception} } \tab {\field\fldedit {\*\fldinst PAGEREF AAAAAAAAGR \\*MERGEFORMAT}{\fldrslt pagenum}} +\par +{\b {\b penify_hook.file_analyzer.FileAnalyzerGenHook} } \tab {\field\fldedit {\*\fldinst PAGEREF AAAAAAAAJM \\*MERGEFORMAT}{\fldrslt pagenum}} +\par +{\b {\b penify_hook.folder_analyzer.FolderAnalyzerGenHook} } \tab {\field\fldedit {\*\fldinst PAGEREF AAAAAAAAJS \\*MERGEFORMAT}{\fldrslt pagenum}} +\par +{\b {\b penify_hook.git_analyzer.GitDocGenHook} } \tab {\field\fldedit {\*\fldinst PAGEREF AAAAAAAAJY \\*MERGEFORMAT}{\fldrslt pagenum}} +\par +{\b {\b penify_hook.utils.GitRepoNotFoundError} } \tab {\field\fldedit {\*\fldinst PAGEREF AAAAAAAAMN \\*MERGEFORMAT}{\fldrslt pagenum}} +\par +{\b {\b penify_hook.jira_client.JiraClient} } \tab {\field\fldedit {\*\fldinst PAGEREF AAAAAAAAKF \\*MERGEFORMAT}{\fldrslt pagenum}} +\par +{\b {\b penify_hook.llm_client.LLMClient} } \tab {\field\fldedit {\*\fldinst PAGEREF AAAAAAAAKW \\*MERGEFORMAT}{\fldrslt pagenum}} +\par +{\b {\b tests.test_commit_commands.TestCommitCommands} } \tab {\field\fldedit {\*\fldinst PAGEREF AAAAAAAANF \\*MERGEFORMAT}{\fldrslt pagenum}} +\par +{\b {\b tests.test_config_commands.TestConfigCommands} } \tab {\field\fldedit {\*\fldinst PAGEREF AAAAAAAANT \\*MERGEFORMAT}{\fldrslt pagenum}} +\par +{\b {\b tests.test_web_config.TestWebConfig} } \tab {\field\fldedit {\*\fldinst PAGEREF AAAAAAAAOT \\*MERGEFORMAT}{\fldrslt pagenum}} +\par +\par} +\pard\plain \sect\sbkpage +\s1\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs36\kerning36\cgrid +File Index\par \pard\plain +{\tc \v File Index} +\pard\plain \s2\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs28\kerning28\cgrid +File List\par \pard\plain +{ +\pard\plain \s17\sa60\sb30\widctlpar\qj \fs22\cgrid Here is a list of all files with brief descriptions:} +{ +\par +\pard\plain \s101\li360\sa27\sb27\widctlpar\tqr\tldot\tx8640\adjustright \fs20\cgrid +{\b /tmp/github_reposRepoArchDocGenContext/Penify-dev/penify-cli/{\b setup.py} } \tab {\field\fldedit {\*\fldinst PAGEREF AAAAAAAABD \\*MERGEFORMAT}{\fldrslt pagenum}} +\par +{\b /tmp/github_reposRepoArchDocGenContext/Penify-dev/penify-cli/penify_hook/{\b __init__.py} } \tab {\field\fldedit {\*\fldinst PAGEREF AAAAAAAAAI \\*MERGEFORMAT}{\fldrslt pagenum}} +\par +{\b /tmp/github_reposRepoArchDocGenContext/Penify-dev/penify-cli/penify_hook/{\b api_client.py} } \tab {\field\fldedit {\*\fldinst PAGEREF AAAAAAAAAG \\*MERGEFORMAT}{\fldrslt pagenum}} +\par +{\b /tmp/github_reposRepoArchDocGenContext/Penify-dev/penify-cli/penify_hook/{\b base_analyzer.py} } \tab {\field\fldedit {\*\fldinst PAGEREF AAAAAAAAAH \\*MERGEFORMAT}{\fldrslt pagenum}} +\par +{\b /tmp/github_reposRepoArchDocGenContext/Penify-dev/penify-cli/penify_hook/{\b commit_analyzer.py} } \tab {\field\fldedit {\*\fldinst PAGEREF AAAAAAAAAQ \\*MERGEFORMAT}{\fldrslt pagenum}} +\par +{\b /tmp/github_reposRepoArchDocGenContext/Penify-dev/penify-cli/penify_hook/{\b config_command.py} } \tab {\field\fldedit {\*\fldinst PAGEREF AAAAAAAAAR \\*MERGEFORMAT}{\fldrslt pagenum}} +\par +{\b /tmp/github_reposRepoArchDocGenContext/Penify-dev/penify-cli/penify_hook/{\b constants.py} } \tab {\field\fldedit {\*\fldinst PAGEREF AAAAAAAAAS \\*MERGEFORMAT}{\fldrslt pagenum}} +\par +{\b /tmp/github_reposRepoArchDocGenContext/Penify-dev/penify-cli/penify_hook/{\b file_analyzer.py} } \tab {\field\fldedit {\*\fldinst PAGEREF AAAAAAAAAT \\*MERGEFORMAT}{\fldrslt pagenum}} +\par +{\b /tmp/github_reposRepoArchDocGenContext/Penify-dev/penify-cli/penify_hook/{\b folder_analyzer.py} } \tab {\field\fldedit {\*\fldinst PAGEREF AAAAAAAAAU \\*MERGEFORMAT}{\fldrslt pagenum}} +\par +{\b /tmp/github_reposRepoArchDocGenContext/Penify-dev/penify-cli/penify_hook/{\b git_analyzer.py} } \tab {\field\fldedit {\*\fldinst PAGEREF AAAAAAAAAV \\*MERGEFORMAT}{\fldrslt pagenum}} +\par +{\b /tmp/github_reposRepoArchDocGenContext/Penify-dev/penify-cli/penify_hook/{\b jira_client.py} } \tab {\field\fldedit {\*\fldinst PAGEREF AAAAAAAAAW \\*MERGEFORMAT}{\fldrslt pagenum}} +\par +{\b /tmp/github_reposRepoArchDocGenContext/Penify-dev/penify-cli/penify_hook/{\b llm_client.py} } \tab {\field\fldedit {\*\fldinst PAGEREF AAAAAAAAAX \\*MERGEFORMAT}{\fldrslt pagenum}} +\par +{\b /tmp/github_reposRepoArchDocGenContext/Penify-dev/penify-cli/penify_hook/{\b login_command.py} } \tab {\field\fldedit {\*\fldinst PAGEREF AAAAAAAAAY \\*MERGEFORMAT}{\fldrslt pagenum}} +\par +{\b /tmp/github_reposRepoArchDocGenContext/Penify-dev/penify-cli/penify_hook/{\b main.py} } \tab {\field\fldedit {\*\fldinst PAGEREF AAAAAAAAAZ \\*MERGEFORMAT}{\fldrslt pagenum}} +\par +{\b /tmp/github_reposRepoArchDocGenContext/Penify-dev/penify-cli/penify_hook/{\b ui_utils.py} } \tab {\field\fldedit {\*\fldinst PAGEREF AAAAAAAABA \\*MERGEFORMAT}{\fldrslt pagenum}} +\par +{\b /tmp/github_reposRepoArchDocGenContext/Penify-dev/penify-cli/penify_hook/{\b utils.py} } \tab {\field\fldedit {\*\fldinst PAGEREF AAAAAAAABB \\*MERGEFORMAT}{\fldrslt pagenum}} +\par +{\b /tmp/github_reposRepoArchDocGenContext/Penify-dev/penify-cli/penify_hook/commands/{\b __init__.py} } \tab {\field\fldedit {\*\fldinst PAGEREF AAAAAAAAAJ \\*MERGEFORMAT}{\fldrslt pagenum}} +\par +{\b /tmp/github_reposRepoArchDocGenContext/Penify-dev/penify-cli/penify_hook/commands/{\b auth_commands.py} } \tab {\field\fldedit {\*\fldinst PAGEREF AAAAAAAAAL \\*MERGEFORMAT}{\fldrslt pagenum}} +\par +{\b /tmp/github_reposRepoArchDocGenContext/Penify-dev/penify-cli/penify_hook/commands/{\b commit_commands.py} } \tab {\field\fldedit {\*\fldinst PAGEREF AAAAAAAAAM \\*MERGEFORMAT}{\fldrslt pagenum}} +\par +{\b /tmp/github_reposRepoArchDocGenContext/Penify-dev/penify-cli/penify_hook/commands/{\b config_commands.py} } \tab {\field\fldedit {\*\fldinst PAGEREF AAAAAAAAAN \\*MERGEFORMAT}{\fldrslt pagenum}} +\par +{\b /tmp/github_reposRepoArchDocGenContext/Penify-dev/penify-cli/penify_hook/commands/{\b doc_commands.py} } \tab {\field\fldedit {\*\fldinst PAGEREF AAAAAAAAAO \\*MERGEFORMAT}{\fldrslt pagenum}} +\par +{\b /tmp/github_reposRepoArchDocGenContext/Penify-dev/penify-cli/penify_hook/commands/{\b hook_commands.py} } \tab {\field\fldedit {\*\fldinst PAGEREF AAAAAAAAAP \\*MERGEFORMAT}{\fldrslt pagenum}} +\par +{\b /tmp/github_reposRepoArchDocGenContext/Penify-dev/penify-cli/tests/{\b __init__.py} } \tab {\field\fldedit {\*\fldinst PAGEREF AAAAAAAAAK \\*MERGEFORMAT}{\fldrslt pagenum}} +\par +{\b /tmp/github_reposRepoArchDocGenContext/Penify-dev/penify-cli/tests/{\b conftest.py} } \tab {\field\fldedit {\*\fldinst PAGEREF AAAAAAAABE \\*MERGEFORMAT}{\fldrslt pagenum}} +\par +{\b /tmp/github_reposRepoArchDocGenContext/Penify-dev/penify-cli/tests/{\b test_commit_commands.py} } \tab {\field\fldedit {\*\fldinst PAGEREF AAAAAAAABF \\*MERGEFORMAT}{\fldrslt pagenum}} +\par +{\b /tmp/github_reposRepoArchDocGenContext/Penify-dev/penify-cli/tests/{\b test_config_commands.py} } \tab {\field\fldedit {\*\fldinst PAGEREF AAAAAAAABG \\*MERGEFORMAT}{\fldrslt pagenum}} +\par +{\b /tmp/github_reposRepoArchDocGenContext/Penify-dev/penify-cli/tests/{\b test_doc_commands.py} } \tab {\field\fldedit {\*\fldinst PAGEREF AAAAAAAABH \\*MERGEFORMAT}{\fldrslt pagenum}} +\par +{\b /tmp/github_reposRepoArchDocGenContext/Penify-dev/penify-cli/tests/{\b test_web_config.py} } \tab {\field\fldedit {\*\fldinst PAGEREF AAAAAAAABI \\*MERGEFORMAT}{\fldrslt pagenum}} +\par +\par} +\pard\plain \sect\sbkpage +\s1\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs36\kerning36\cgrid +Namespace Documentation\par \pard\plain +\pard\plain \s2\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs28\kerning28\cgrid +penify_hook Namespace Reference\par \pard\plain +{\tc\tcl2 \v penify_hook} +{\xe \v penify_hook} +{\bkmkstart AAAAAAAAGS} +{\bkmkend AAAAAAAAGS} +\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid +Namespaces\par +\pard\plain + +{ +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +namespace {\b api_client}\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +namespace {\b base_analyzer}\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +namespace {\b commands}\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +namespace {\b commit_analyzer}\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +namespace {\b config_command}\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +namespace {\b constants}\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +namespace {\b file_analyzer}\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +namespace {\b folder_analyzer}\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +namespace {\b git_analyzer}\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +namespace {\b jira_client}\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +namespace {\b llm_client}\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +namespace {\b login_command}\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +namespace {\b main}\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +namespace {\b ui_utils}\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +namespace {\b utils}\par +} +\par \pard\plain + +\pard\plain \sect\sbkpage +\s2\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs28\kerning28\cgrid +\pard\plain \s2\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs28\kerning28\cgrid +penify_hook.api_client Namespace Reference\par \pard\plain +{\tc\tcl2 \v penify_hook.api_client} +{\xe \v penify_hook.api_client} +{\bkmkstart AAAAAAAAGT} +{\bkmkend AAAAAAAAGT} +\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid +Classes\par +\pard\plain + +{ +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +class {\b APIClient}\par +} +\par \pard\plain + +\pard\plain \sect\sbkpage +\s2\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs28\kerning28\cgrid +\pard\plain \s2\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs28\kerning28\cgrid +penify_hook.base_analyzer Namespace Reference\par \pard\plain +{\tc\tcl2 \v penify_hook.base_analyzer} +{\xe \v penify_hook.base_analyzer} +{\bkmkstart AAAAAAAAHE} +{\bkmkend AAAAAAAAHE} +\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid +Classes\par +\pard\plain + +{ +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +class {\b BaseAnalyzer}\par +} +\par \pard\plain + +\pard\plain \sect\sbkpage +\s2\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs28\kerning28\cgrid +\pard\plain \s2\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs28\kerning28\cgrid +penify_hook.commands Namespace Reference\par \pard\plain +{\tc\tcl2 \v penify_hook.commands} +{\xe \v penify_hook.commands} +{\bkmkstart AAAAAAAAHS} +{\bkmkend AAAAAAAAHS} +\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid +Namespaces\par +\pard\plain + +{ +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +namespace {\b auth_commands}\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +namespace {\b commit_commands}\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +namespace {\b config_commands}\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +namespace {\b doc_commands}\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +namespace {\b hook_commands}\par +} +\par \pard\plain + +\pard\plain \sect\sbkpage +\s2\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs28\kerning28\cgrid +\pard\plain \s2\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs28\kerning28\cgrid +penify_hook.commands.auth_commands Namespace Reference\par \pard\plain +{\tc\tcl2 \v penify_hook.commands.auth_commands} +{\xe \v penify_hook.commands.auth_commands} +{\bkmkstart AAAAAAAAHT} +{\bkmkend AAAAAAAAHT} +\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid +Functions\par +\pard\plain + +{ +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +def {\b save_credentials} (api_key)\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +def {\b login} (api_url, dashboard_url)\par +} +{\pard\widctlpar\brdrb\brdrs\brdrw5\brsp20 \adjustright \par} +\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid +Function Documentation\par +\pard\plain +{\xe \v login\:penify_hook.commands.auth_commands} +{\xe \v penify_hook.commands.auth_commands\:login} +\pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid { +{\b +def penify_hook.commands.auth_commands.login ( {\i api_url}, {\i dashboard_url})}} +\par +{\bkmkstart AAAAAAAAHU} +{\bkmkend AAAAAAAAHU} +{ +\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid +{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid +{ +\par +\pard\plain \s41\li360\widctlpar\adjustright \shading1000\cbpat8 \f2\fs16\cgrid Open the login page in a web browser and capture the token via redirect.} + \par +}Here is the call graph for this function:{ +\pard\plain +\par\pard \qc {\field\flddirty {\*\fldinst INCLUDEPICTURE "namespacepenify__hook_1_1commands_1_1auth__commands_a78f375c58bb6f69f98675e6a9ac84655_cgraph.svg" \\d \\*MERGEFORMAT}{\fldrslt IMAGE}}\par +} +Here is the caller graph for this function:{ +\pard\plain +\par\pard \qc {\field\flddirty {\*\fldinst INCLUDEPICTURE "namespacepenify__hook_1_1commands_1_1auth__commands_a78f375c58bb6f69f98675e6a9ac84655_icgraph.svg" \\d \\*MERGEFORMAT}{\fldrslt IMAGE}}\par +} +} +{\xe \v save_credentials\:penify_hook.commands.auth_commands} +{\xe \v penify_hook.commands.auth_commands\:save_credentials} +\pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid { +{\b +def penify_hook.commands.auth_commands.save_credentials ( {\i api_key})}} +\par +{\bkmkstart AAAAAAAAHV} +{\bkmkend AAAAAAAAHV} +{ +\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid +{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid +{ +\par +\pard\plain \s41\li360\widctlpar\adjustright \shading1000\cbpat8 \f2\fs16\cgrid Save the API key in a priority-based manner.\par +\par +This function attempts to save the API key in two locations, based on priority:\par +1. In a `.env` file located in the root of the Git repository if one is found.\par +2. In a global `.penify` file located in the user's home directory as a\par +fallback. The function first tries to locate the Git repository using\par +`recursive_search_git_folder`. If a Git repository is found, it reads the\par +existing `.env` file (if present), updates or adds the API key under the key\par +`PENIFY_API_TOKEN`, and writes the updated content back. If any error occurs\par +during this process, it falls back to saving the credentials in the global\par +`.penify` file. The function handles exceptions and prints appropriate error\par +messages.\par +\par +Args:\par + api_key (str): The API key to save.\par +\par +Returns:\par + bool: True if the API key is saved successfully, False otherwise.\par +} + \par +}Here is the call graph for this function:{ +\pard\plain +\par\pard \qc {\field\flddirty {\*\fldinst INCLUDEPICTURE "namespacepenify__hook_1_1commands_1_1auth__commands_aa3956ca1749d4218ea1dc6e5b6218b24_cgraph.svg" \\d \\*MERGEFORMAT}{\fldrslt IMAGE}}\par +} +Here is the caller graph for this function:{ +\pard\plain +\par\pard \qc {\field\flddirty {\*\fldinst INCLUDEPICTURE "namespacepenify__hook_1_1commands_1_1auth__commands_aa3956ca1749d4218ea1dc6e5b6218b24_icgraph.svg" \\d \\*MERGEFORMAT}{\fldrslt IMAGE}}\par +} +} +\par \pard\plain + +\pard\plain \sect\sbkpage +\s2\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs28\kerning28\cgrid +\pard\plain \s2\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs28\kerning28\cgrid +penify_hook.commands.commit_commands Namespace Reference\par \pard\plain +{\tc\tcl2 \v penify_hook.commands.commit_commands} +{\xe \v penify_hook.commands.commit_commands} +{\bkmkstart AAAAAAAAHW} +{\bkmkend AAAAAAAAHW} +\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid +Functions\par +\pard\plain + +{ +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +def {\b commit_code} (api_url, token, message, open_terminal, generate_description, llm_model=None, llm_api_base=None, llm_api_key=None, jira_url=None, jira_user=None, jira_api_token=None)\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +def {\b setup_commit_parser} (parser)\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +def {\b handle_commit} (args)\par +} +{\pard\widctlpar\brdrb\brdrs\brdrw5\brsp20 \adjustright \par} +\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid +Function Documentation\par +\pard\plain +{\xe \v commit_code\:penify_hook.commands.commit_commands} +{\xe \v penify_hook.commands.commit_commands\:commit_code} +\pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid { +{\b +def penify_hook.commands.commit_commands.commit_code ( {\i api_url}, {\i token}, {\i message}, {\i open_terminal}, {\i generate_description}, {\i llm_model} = {\f2 None}, {\i llm_api_base} = {\f2 None}, {\i llm_api_key} = {\f2 None}, {\i jira_url} = {\f2 None}, {\i jira_user} = {\f2 None}, {\i jira_api_token} = {\f2 None})}} +\par +{\bkmkstart AAAAAAAAHX} +{\bkmkend AAAAAAAAHX} +{ +\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid +{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid +{ +\par +\pard\plain \s41\li360\widctlpar\adjustright \shading1000\cbpat8 \f2\fs16\cgrid Enhance Git commits with AI-powered commit messages.\par +\par +This function allows for the generation of enhanced commit messages using\par +natural language processing models and optionally integrates with JIRA for\par +additional context. It processes the current Git folder to find relevant files\par +and generates a detailed commit message based on the provided parameters.\par +\par +Args:\par + api_url (str): URL of the API endpoint.\par + token (str): Authentication token for the API.\par + message (str): Initial commit message provided by the user.\par + open_terminal (bool): Whether to open the terminal after committing.\par + generate_description (bool): Whether to generate a detailed description in the commit message.\par + llm_model (str?): The language model to use for generating the commit message. Defaults to None.\par + llm_api_base (str?): Base URL of the LLM API. Defaults to None.\par + llm_api_key (str?): API key for accessing the LLM service. Defaults to None.\par + jira_url (str?): URL of the JIRA instance. Defaults to None.\par + jira_user (str?): Username for authenticating with JIRA. Defaults to None.\par + jira_api_token (str?): API token for accessing JIRA. Defaults to None.\par +} + \par +}Here is the call graph for this function:{ +\pard\plain +\par\pard \qc {\field\flddirty {\*\fldinst INCLUDEPICTURE "namespacepenify__hook_1_1commands_1_1commit__commands_a62564c4e8ad59fc46d56cb0f9122a71a_cgraph.svg" \\d \\*MERGEFORMAT}{\fldrslt IMAGE}}\par +} +Here is the caller graph for this function:{ +\pard\plain +\par\pard \qc {\field\flddirty {\*\fldinst INCLUDEPICTURE "namespacepenify__hook_1_1commands_1_1commit__commands_a62564c4e8ad59fc46d56cb0f9122a71a_icgraph.svg" \\d \\*MERGEFORMAT}{\fldrslt IMAGE}}\par +} +} +{\xe \v handle_commit\:penify_hook.commands.commit_commands} +{\xe \v penify_hook.commands.commit_commands\:handle_commit} +\pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid { +{\b +def penify_hook.commands.commit_commands.handle_commit ( {\i args})}} +\par +{\bkmkstart AAAAAAAAHY} +{\bkmkend AAAAAAAAHY} +{ +\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid +{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid +{ +\par +\pard\plain \s41\li360\widctlpar\adjustright \shading1000\cbpat8 \f2\fs16\cgrid Handle commit functionality by processing arguments and invoking the\par +appropriate commands.} + \par +}Here is the call graph for this function:{ +\pard\plain +\par\pard \qc {\field\flddirty {\*\fldinst INCLUDEPICTURE "namespacepenify__hook_1_1commands_1_1commit__commands_af4f739f524c38b437e4e47673d683e23_cgraph.svg" \\d \\*MERGEFORMAT}{\fldrslt IMAGE}}\par +} +Here is the caller graph for this function:{ +\pard\plain +\par\pard \qc {\field\flddirty {\*\fldinst INCLUDEPICTURE "namespacepenify__hook_1_1commands_1_1commit__commands_af4f739f524c38b437e4e47673d683e23_icgraph.svg" \\d \\*MERGEFORMAT}{\fldrslt IMAGE}}\par +} +} +{\xe \v setup_commit_parser\:penify_hook.commands.commit_commands} +{\xe \v penify_hook.commands.commit_commands\:setup_commit_parser} +\pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid { +{\b +def penify_hook.commands.commit_commands.setup_commit_parser ( {\i parser})}} +\par +{\bkmkstart AAAAAAAAHZ} +{\bkmkend AAAAAAAAHZ} +{ +\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid +{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid +{ +\par +\pard\plain \s41\li360\widctlpar\adjustright \shading1000\cbpat8 \f2\fs16\cgrid Sets up an argument parser for generating smart commit messages.} + \par +}Here is the caller graph for this function:{ +\pard\plain +\par\pard \qc {\field\flddirty {\*\fldinst INCLUDEPICTURE "namespacepenify__hook_1_1commands_1_1commit__commands_a8627583116eb78e31a4d3cdc16d2f15c_icgraph.svg" \\d \\*MERGEFORMAT}{\fldrslt IMAGE}}\par +} +} +\par \pard\plain + +\pard\plain \sect\sbkpage +\s2\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs28\kerning28\cgrid +\pard\plain \s2\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs28\kerning28\cgrid +penify_hook.commands.config_commands Namespace Reference\par \pard\plain +{\tc\tcl2 \v penify_hook.commands.config_commands} +{\xe \v penify_hook.commands.config_commands} +{\bkmkstart AAAAAAAAIA} +{\bkmkend AAAAAAAAIA} +\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid +Functions\par +\pard\plain + +{ +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +None {\b load_env_files} ()\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +Path {\b get_penify_config} ()\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +Any {\b get_env_var_or_default} (str env_var, Any default=None)\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +def {\b save_llm_config} (model, api_base, api_key)\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +def {\b save_jira_config} (url, username, api_token)\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +Dict[str, str] {\b get_llm_config} ()\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +Dict[str, str] {\b get_jira_config} ()\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +def {\b config_llm_web} ()\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +def {\b config_jira_web} ()\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +Optional[str] {\b get_token} ()\par +} +\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid +Variables\par +\pard\plain + +{ +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +bool {\b DOTENV_AVAILABLE} = True\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +{\b path}\par +} +{\pard\widctlpar\brdrb\brdrs\brdrw5\brsp20 \adjustright \par} +\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid +Function Documentation\par +\pard\plain +{\xe \v config_jira_web\:penify_hook.commands.config_commands} +{\xe \v penify_hook.commands.config_commands\:config_jira_web} +\pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid { +{\b +def penify_hook.commands.config_commands.config_jira_web ()}} +\par +{\bkmkstart AAAAAAAAIB} +{\bkmkend AAAAAAAAIB} +{ +\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid +{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid +{ +\par +\pard\plain \s41\li360\widctlpar\adjustright \shading1000\cbpat8 \f2\fs16\cgrid Starts a web server for configuring JIRA settings.} + \par +}Here is the call graph for this function:{ +\pard\plain +\par\pard \qc {\field\flddirty {\*\fldinst INCLUDEPICTURE "namespacepenify__hook_1_1commands_1_1config__commands_af115198ea5d6808ccb98733957f50b06_cgraph.svg" \\d \\*MERGEFORMAT}{\fldrslt IMAGE}}\par +} +Here is the caller graph for this function:{ +\pard\plain +\par\pard \qc {\field\flddirty {\*\fldinst INCLUDEPICTURE "namespacepenify__hook_1_1commands_1_1config__commands_af115198ea5d6808ccb98733957f50b06_icgraph.svg" \\d \\*MERGEFORMAT}{\fldrslt IMAGE}}\par +} +} +{\xe \v config_llm_web\:penify_hook.commands.config_commands} +{\xe \v penify_hook.commands.config_commands\:config_llm_web} +\pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid { +{\b +def penify_hook.commands.config_commands.config_llm_web ()}} +\par +{\bkmkstart AAAAAAAAIC} +{\bkmkend AAAAAAAAIC} +{ +\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid +{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid +{ +\par +\pard\plain \s41\li360\widctlpar\adjustright \shading1000\cbpat8 \f2\fs16\cgrid Starts an HTTP server for configuring LLM settings via a web interface.} + \par +}Here is the caller graph for this function:{ +\pard\plain +\par\pard \qc {\field\flddirty {\*\fldinst INCLUDEPICTURE "namespacepenify__hook_1_1commands_1_1config__commands_a185dfc34a655ed80e6c95939b6f3c35c_icgraph.svg" \\d \\*MERGEFORMAT}{\fldrslt IMAGE}}\par +} +} +{\xe \v get_env_var_or_default\:penify_hook.commands.config_commands} +{\xe \v penify_hook.commands.config_commands\:get_env_var_or_default} +\pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid { +{\b + Any penify_hook.commands.config_commands.get_env_var_or_default (str {\i env_var}, Any {\i default} = {\f2 None})}} +\par +{\bkmkstart AAAAAAAAID} +{\bkmkend AAAAAAAAID} +{ +\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid +{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid +{ +\par +\pard\plain \s41\li360\widctlpar\adjustright \shading1000\cbpat8 \f2\fs16\cgrid Get environment variable or return default value.} + \par +}Here is the caller graph for this function:{ +\pard\plain +\par\pard \qc {\field\flddirty {\*\fldinst INCLUDEPICTURE "namespacepenify__hook_1_1commands_1_1config__commands_a3caf2b062dd33b1f1d7ddc7224f0ff87_icgraph.svg" \\d \\*MERGEFORMAT}{\fldrslt IMAGE}}\par +} +} +{\xe \v get_jira_config\:penify_hook.commands.config_commands} +{\xe \v penify_hook.commands.config_commands\:get_jira_config} +\pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid { +{\b + Dict[str, str] penify_hook.commands.config_commands.get_jira_config ()}} +\par +{\bkmkstart AAAAAAAAIE} +{\bkmkend AAAAAAAAIE} +{ +\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid +{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid +{ +\par +\pard\plain \s41\li360\widctlpar\adjustright \shading1000\cbpat8 \f2\fs16\cgrid Retrieve JIRA configuration from environment variables.} + \par +}Here is the call graph for this function:{ +\pard\plain +\par\pard \qc {\field\flddirty {\*\fldinst INCLUDEPICTURE "namespacepenify__hook_1_1commands_1_1config__commands_a15bf3685c4dcb5c15ba6a4055e484cf2_cgraph.svg" \\d \\*MERGEFORMAT}{\fldrslt IMAGE}}\par +} +Here is the caller graph for this function:{ +\pard\plain +\par\pard \qc {\field\flddirty {\*\fldinst INCLUDEPICTURE "namespacepenify__hook_1_1commands_1_1config__commands_a15bf3685c4dcb5c15ba6a4055e484cf2_icgraph.svg" \\d \\*MERGEFORMAT}{\fldrslt IMAGE}}\par +} +} +{\xe \v get_llm_config\:penify_hook.commands.config_commands} +{\xe \v penify_hook.commands.config_commands\:get_llm_config} +\pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid { +{\b + Dict[str, str] penify_hook.commands.config_commands.get_llm_config ()}} +\par +{\bkmkstart AAAAAAAAIF} +{\bkmkend AAAAAAAAIF} +{ +\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid +{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid +{ +\par +\pard\plain \s41\li360\widctlpar\adjustright \shading1000\cbpat8 \f2\fs16\cgrid Retrieve LLM configuration from environment variables.} + \par +}Here is the call graph for this function:{ +\pard\plain +\par\pard \qc {\field\flddirty {\*\fldinst INCLUDEPICTURE "namespacepenify__hook_1_1commands_1_1config__commands_a6492bc8e7df6e38bb06ad05e572d4cc0_cgraph.svg" \\d \\*MERGEFORMAT}{\fldrslt IMAGE}}\par +} +Here is the caller graph for this function:{ +\pard\plain +\par\pard \qc {\field\flddirty {\*\fldinst INCLUDEPICTURE "namespacepenify__hook_1_1commands_1_1config__commands_a6492bc8e7df6e38bb06ad05e572d4cc0_icgraph.svg" \\d \\*MERGEFORMAT}{\fldrslt IMAGE}}\par +} +} +{\xe \v get_penify_config\:penify_hook.commands.config_commands} +{\xe \v penify_hook.commands.config_commands\:get_penify_config} +\pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid { +{\b + Path penify_hook.commands.config_commands.get_penify_config ()}} +\par +{\bkmkstart AAAAAAAAIG} +{\bkmkend AAAAAAAAIG} +{ +\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid +{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid +{ +\par +\pard\plain \s41\li360\widctlpar\adjustright \shading1000\cbpat8 \f2\fs16\cgrid Returns the path to the `config.json` file within the `.penify` directory,\par +creating it if necessary.} + \par +}Here is the call graph for this function:{ +\pard\plain +\par\pard \qc {\field\flddirty {\*\fldinst INCLUDEPICTURE "namespacepenify__hook_1_1commands_1_1config__commands_a6559a82d0bf727703d550d1003d3ed20_cgraph.svg" \\d \\*MERGEFORMAT}{\fldrslt IMAGE}}\par +} +Here is the caller graph for this function:{ +\pard\plain +\par\pard \qc {\field\flddirty {\*\fldinst INCLUDEPICTURE "namespacepenify__hook_1_1commands_1_1config__commands_a6559a82d0bf727703d550d1003d3ed20_icgraph.svg" \\d \\*MERGEFORMAT}{\fldrslt IMAGE}}\par +} +} +{\xe \v get_token\:penify_hook.commands.config_commands} +{\xe \v penify_hook.commands.config_commands\:get_token} +\pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid { +{\b + Optional[str] penify_hook.commands.config_commands.get_token ()}} +\par +{\bkmkstart AAAAAAAAIH} +{\bkmkend AAAAAAAAIH} +{ +\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid +{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid +{ +\par +\pard\plain \s41\li360\widctlpar\adjustright \shading1000\cbpat8 \f2\fs16\cgrid Retrieves an API token using a prioritized method.\par +\par +This function first attempts to load environment variables from all `.env`\par +files and checks if the `PENIFY_API_TOKEN` environment variable is set. If\par +found, it returns the token. If not, it looks for the API key in a\par +configuration file named 'api_keys'. If both methods fail, it returns None.\par +\par +Returns:\par + str or None: The API token if found, otherwise None.\par +} + \par +}Here is the call graph for this function:{ +\pard\plain +\par\pard \qc {\field\flddirty {\*\fldinst INCLUDEPICTURE "namespacepenify__hook_1_1commands_1_1config__commands_a5503d51c905e2f1b299b12d2a73bd812_cgraph.svg" \\d \\*MERGEFORMAT}{\fldrslt IMAGE}}\par +} +Here is the caller graph for this function:{ +\pard\plain +\par\pard \qc {\field\flddirty {\*\fldinst INCLUDEPICTURE "namespacepenify__hook_1_1commands_1_1config__commands_a5503d51c905e2f1b299b12d2a73bd812_icgraph.svg" \\d \\*MERGEFORMAT}{\fldrslt IMAGE}}\par +} +} +{\xe \v load_env_files\:penify_hook.commands.config_commands} +{\xe \v penify_hook.commands.config_commands\:load_env_files} +\pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid { +{\b + None penify_hook.commands.config_commands.load_env_files ()}} +\par +{\bkmkstart AAAAAAAAII} +{\bkmkend AAAAAAAAII} +{ +\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid +{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid +{ +\par +\pard\plain \s41\li360\widctlpar\adjustright \shading1000\cbpat8 \f2\fs16\cgrid Load environment variables from .env files in various locations with proper\par +priority.\par +\par +This function loads environment variables from .env files located in different\par +directories, prioritizing the current directory over the Git repo root and the\par +user home directory. The loading process ensures that later files override\par +earlier ones.\par +} + \par +}Here is the call graph for this function:{ +\pard\plain +\par\pard \qc {\field\flddirty {\*\fldinst INCLUDEPICTURE "namespacepenify__hook_1_1commands_1_1config__commands_aabe277132ce0bc0aacef951cf1dee2ae_cgraph.svg" \\d \\*MERGEFORMAT}{\fldrslt IMAGE}}\par +} +Here is the caller graph for this function:{ +\pard\plain +\par\pard \qc {\field\flddirty {\*\fldinst INCLUDEPICTURE "namespacepenify__hook_1_1commands_1_1config__commands_aabe277132ce0bc0aacef951cf1dee2ae_icgraph.svg" \\d \\*MERGEFORMAT}{\fldrslt IMAGE}}\par +} +} +{\xe \v save_jira_config\:penify_hook.commands.config_commands} +{\xe \v penify_hook.commands.config_commands\:save_jira_config} +\pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid { +{\b +def penify_hook.commands.config_commands.save_jira_config ( {\i url}, {\i username}, {\i api_token})}} +\par +{\bkmkstart AAAAAAAAIJ} +{\bkmkend AAAAAAAAIJ} +{ +\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid +{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid +{ +\par +\pard\plain \s41\li360\widctlpar\adjustright \shading1000\cbpat8 \f2\fs16\cgrid Save JIRA configuration settings to a .env file.\par +\par +This function saves JIRA configuration following these steps: 1. Determine the\par +target .env file location based on whether the current directory is inside a\par +Git repository. 2. If inside a Git repo, use the Git repo root's .env file;\par +otherwise, use the user home directory's .env file. 3. Read the existing\par +content of the .env file (if it exists) to preserve other settings. 4. Update\par +the .env content with the new JIRA configuration. 5. Write the updated content\par +back to the .env file. 6. Optionally, reload environment variables to make\par +changes immediately available.\par +\par +Args:\par + url (str): The JIRA URL to be saved in the .env file.\par + username (str): The JIRA username to be saved in the .env file.\par + api_token (str): The JIRA API token to be saved in the .env file.\par +\par +Returns:\par + bool: True if the configuration was successfully saved, False otherwise.\par +} + \par +}Here is the call graph for this function:{ +\pard\plain +\par\pard \qc {\field\flddirty {\*\fldinst INCLUDEPICTURE "namespacepenify__hook_1_1commands_1_1config__commands_ab2486ac2bf16b4a671e49625bfa4f9b4_cgraph.svg" \\d \\*MERGEFORMAT}{\fldrslt IMAGE}}\par +} +Here is the caller graph for this function:{ +\pard\plain +\par\pard \qc {\field\flddirty {\*\fldinst INCLUDEPICTURE "namespacepenify__hook_1_1commands_1_1config__commands_ab2486ac2bf16b4a671e49625bfa4f9b4_icgraph.svg" \\d \\*MERGEFORMAT}{\fldrslt IMAGE}}\par +} +} +{\xe \v save_llm_config\:penify_hook.commands.config_commands} +{\xe \v penify_hook.commands.config_commands\:save_llm_config} +\pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid { +{\b +def penify_hook.commands.config_commands.save_llm_config ( {\i model}, {\i api_base}, {\i api_key})}} +\par +{\bkmkstart AAAAAAAAIK} +{\bkmkend AAAAAAAAIK} +{ +\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid +{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid +{ +\par +\pard\plain \s41\li360\widctlpar\adjustright \shading1000\cbpat8 \f2\fs16\cgrid Save LLM configuration settings to an .env file.\par +\par +This function saves the LLM configuration following a specific priority: 1. Git\par +repo root .env (if inside a git repo) 2. User home directory .env It handles\par +the detection of the Git repo root, reads the existing .env content, updates it\par +with the new LLM configuration, and writes it back to the file. It also reloads\par +the environment variables to make changes immediately available.\par +\par +Args:\par + model (str): The name of the language model.\par + api_base (str): The base URL for the API.\par + api_key (str): The API key for authentication.\par +\par +Returns:\par + bool: True if the configuration is saved successfully, False otherwise.\par +} + \par +}Here is the call graph for this function:{ +\pard\plain +\par\pard \qc {\field\flddirty {\*\fldinst INCLUDEPICTURE "namespacepenify__hook_1_1commands_1_1config__commands_a4617bc5956e502c9555dc0dda0376df4_cgraph.svg" \\d \\*MERGEFORMAT}{\fldrslt IMAGE}}\par +} +Here is the caller graph for this function:{ +\pard\plain +\par\pard \qc {\field\flddirty {\*\fldinst INCLUDEPICTURE "namespacepenify__hook_1_1commands_1_1config__commands_a4617bc5956e502c9555dc0dda0376df4_icgraph.svg" \\d \\*MERGEFORMAT}{\fldrslt IMAGE}}\par +} +} +{\pard\widctlpar\brdrb\brdrs\brdrw5\brsp20 \adjustright \par} +\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid +Variable Documentation\par +\pard\plain +{\xe \v DOTENV_AVAILABLE\:penify_hook.commands.config_commands} +{\xe \v penify_hook.commands.config_commands\:DOTENV_AVAILABLE} +\pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid { +{\b +bool penify_hook.commands.config_commands.DOTENV_AVAILABLE = True}} +\par +{\bkmkstart AAAAAAAAIL} +{\bkmkend AAAAAAAAIL} +{ +\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid +} +{\xe \v path\:penify_hook.commands.config_commands} +{\xe \v penify_hook.commands.config_commands\:path} +\pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid { +{\b +penify_hook.commands.config_commands.path}} +\par +{\bkmkstart AAAAAAAAIM} +{\bkmkend AAAAAAAAIM} +{ +\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid +} +\par \pard\plain + +\pard\plain \sect\sbkpage +\s2\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs28\kerning28\cgrid +\pard\plain \s2\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs28\kerning28\cgrid +penify_hook.commands.doc_commands Namespace Reference\par \pard\plain +{\tc\tcl2 \v penify_hook.commands.doc_commands} +{\xe \v penify_hook.commands.doc_commands} +{\bkmkstart AAAAAAAAIN} +{\bkmkend AAAAAAAAIN} +\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid +Functions\par +\pard\plain + +{ +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +def {\b generate_doc} (api_url, token, location=None)\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +def {\b setup_docgen_parser} (parser)\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +def {\b handle_docgen} (args)\par +} +\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid +Variables\par +\pard\plain + +{ +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +string {\b docgen_description}\par +} +{\pard\widctlpar\brdrb\brdrs\brdrw5\brsp20 \adjustright \par} +\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid +Function Documentation\par +\pard\plain +{\xe \v generate_doc\:penify_hook.commands.doc_commands} +{\xe \v penify_hook.commands.doc_commands\:generate_doc} +\pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid { +{\b +def penify_hook.commands.doc_commands.generate_doc ( {\i api_url}, {\i token}, {\i location} = {\f2 None})}} +\par +{\bkmkstart AAAAAAAAIO} +{\bkmkend AAAAAAAAIO} +{ +\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid +{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid +{ +\par +\pard\plain \s41\li360\widctlpar\adjustright \shading1000\cbpat8 \f2\fs16\cgrid Generates documentation based on the given parameters.\par +\par +This function initializes an API client using the provided API URL and token.\par +It then generates documentation by analyzing the specified location, which can\par +be a folder, a file, or the current working directory if no location is\par +provided. The function handles different types of analysis based on the input\par +location and reports any errors encountered during the process.\par +\par +Args:\par + api_url (str): The URL of the API to connect to for documentation generation.\par + token (str): The authentication token for accessing the API.\par + location (str?): The path to a specific file or folder to analyze. If not provided,\par + the current working directory is used.\par +} + \par +}Here is the caller graph for this function:{ +\pard\plain +\par\pard \qc {\field\flddirty {\*\fldinst INCLUDEPICTURE "namespacepenify__hook_1_1commands_1_1doc__commands_a4daac68bc563432bf25c85dc78081a25_icgraph.svg" \\d \\*MERGEFORMAT}{\fldrslt IMAGE}}\par +} +} +{\xe \v handle_docgen\:penify_hook.commands.doc_commands} +{\xe \v penify_hook.commands.doc_commands\:handle_docgen} +\pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid { +{\b +def penify_hook.commands.doc_commands.handle_docgen ( {\i args})}} +\par +{\bkmkstart AAAAAAAAIP} +{\bkmkend AAAAAAAAIP} +{ +\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid +{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid +{ +\par +\pard\plain \s41\li360\widctlpar\adjustright \shading1000\cbpat8 \f2\fs16\cgrid Handle document generation and hook management based on subcommands.} + \par +}Here is the call graph for this function:{ +\pard\plain +\par\pard \qc {\field\flddirty {\*\fldinst INCLUDEPICTURE "namespacepenify__hook_1_1commands_1_1doc__commands_a2006ab13bff718ef783868a910c0b704_cgraph.svg" \\d \\*MERGEFORMAT}{\fldrslt IMAGE}}\par +} +Here is the caller graph for this function:{ +\pard\plain +\par\pard \qc {\field\flddirty {\*\fldinst INCLUDEPICTURE "namespacepenify__hook_1_1commands_1_1doc__commands_a2006ab13bff718ef783868a910c0b704_icgraph.svg" \\d \\*MERGEFORMAT}{\fldrslt IMAGE}}\par +} +} +{\xe \v setup_docgen_parser\:penify_hook.commands.doc_commands} +{\xe \v penify_hook.commands.doc_commands\:setup_docgen_parser} +\pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid { +{\b +def penify_hook.commands.doc_commands.setup_docgen_parser ( {\i parser})}} +\par +{\bkmkstart AAAAAAAAIQ} +{\bkmkend AAAAAAAAIQ} +{ +\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid +{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid +{ +\par +\pard\plain \s41\li360\widctlpar\adjustright \shading1000\cbpat8 \f2\fs16\cgrid Configure a parser for generating documentation using Git commands.} + \par +}Here is the caller graph for this function:{ +\pard\plain +\par\pard \qc {\field\flddirty {\*\fldinst INCLUDEPICTURE "namespacepenify__hook_1_1commands_1_1doc__commands_acc7f4ead1b11951d885fa5c151c2cbe0_icgraph.svg" \\d \\*MERGEFORMAT}{\fldrslt IMAGE}}\par +} +} +{\pard\widctlpar\brdrb\brdrs\brdrw5\brsp20 \adjustright \par} +\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid +Variable Documentation\par +\pard\plain +{\xe \v docgen_description\:penify_hook.commands.doc_commands} +{\xe \v penify_hook.commands.doc_commands\:docgen_description} +\pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid { +{\b +string penify_hook.commands.doc_commands.docgen_description}} +\par +{\bkmkstart AAAAAAAAIR} +{\bkmkend AAAAAAAAIR} +{ +\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid +{\b Initial value:}{ +\pard\plain \s41\li360\widctlpar\adjustright \shading1000\cbpat8 \f2\fs16\cgrid 1 = {\cf22 """Generate code documentation using Penify.}\par +2 {\cf22 }\par +3 {\cf22 This command requires you to be logged in to your Penify account.}\par +4 {\cf22 You can generate documentation for:}\par +5 {\cf22 - Current Git diff (default)}\par +6 {\cf22 - Specific file}\par +7 {\cf22 - Specific folder}\par +8 {\cf22 """}\par +} +} +\par \pard\plain + +\pard\plain \sect\sbkpage +\s2\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs28\kerning28\cgrid +\pard\plain \s2\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs28\kerning28\cgrid +penify_hook.commands.hook_commands Namespace Reference\par \pard\plain +{\tc\tcl2 \v penify_hook.commands.hook_commands} +{\xe \v penify_hook.commands.hook_commands} +{\bkmkstart AAAAAAAAIS} +{\bkmkend AAAAAAAAIS} +\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid +Functions\par +\pard\plain + +{ +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +def {\b install_git_hook} (location, token)\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +def {\b uninstall_git_hook} (location)\par +} +\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid +Variables\par +\pard\plain + +{ +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +string {\b HOOK_FILENAME} = "post-commit"\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +string {\b HOOK_TEMPLATE}\par +} +{\pard\widctlpar\brdrb\brdrs\brdrw5\brsp20 \adjustright \par} +\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid +Function Documentation\par +\pard\plain +{\xe \v install_git_hook\:penify_hook.commands.hook_commands} +{\xe \v penify_hook.commands.hook_commands\:install_git_hook} +\pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid { +{\b +def penify_hook.commands.hook_commands.install_git_hook ( {\i location}, {\i token})}} +\par +{\bkmkstart AAAAAAAAIT} +{\bkmkend AAAAAAAAIT} +{ +\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid +{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid +{ +\par +\pard\plain \s41\li360\widctlpar\adjustright \shading1000\cbpat8 \f2\fs16\cgrid Install a post-commit Git hook that generates documentation for changed files.} + \par +}Here is the caller graph for this function:{ +\pard\plain +\par\pard \qc {\field\flddirty {\*\fldinst INCLUDEPICTURE "namespacepenify__hook_1_1commands_1_1hook__commands_adff8f5d3bf1c3795974a391ee95b72b2_icgraph.svg" \\d \\*MERGEFORMAT}{\fldrslt IMAGE}}\par +} +} +{\xe \v uninstall_git_hook\:penify_hook.commands.hook_commands} +{\xe \v penify_hook.commands.hook_commands\:uninstall_git_hook} +\pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid { +{\b +def penify_hook.commands.hook_commands.uninstall_git_hook ( {\i location})}} +\par +{\bkmkstart AAAAAAAAIU} +{\bkmkend AAAAAAAAIU} +{ +\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid +{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid +{ +\par +\pard\plain \s41\li360\widctlpar\adjustright \shading1000\cbpat8 \f2\fs16\cgrid Uninstalls the post-commit hook from the specified location.} + \par +}Here is the caller graph for this function:{ +\pard\plain +\par\pard \qc {\field\flddirty {\*\fldinst INCLUDEPICTURE "namespacepenify__hook_1_1commands_1_1hook__commands_a81543eb5fa835fd1237f24e8bce6201d_icgraph.svg" \\d \\*MERGEFORMAT}{\fldrslt IMAGE}}\par +} +} +{\pard\widctlpar\brdrb\brdrs\brdrw5\brsp20 \adjustright \par} +\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid +Variable Documentation\par +\pard\plain +{\xe \v HOOK_FILENAME\:penify_hook.commands.hook_commands} +{\xe \v penify_hook.commands.hook_commands\:HOOK_FILENAME} +\pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid { +{\b +string penify_hook.commands.hook_commands.HOOK_FILENAME = "post-commit"}} +\par +{\bkmkstart AAAAAAAAIV} +{\bkmkend AAAAAAAAIV} +{ +\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid +} +{\xe \v HOOK_TEMPLATE\:penify_hook.commands.hook_commands} +{\xe \v penify_hook.commands.hook_commands\:HOOK_TEMPLATE} +\pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid { +{\b +string penify_hook.commands.hook_commands.HOOK_TEMPLATE}} +\par +{\bkmkstart AAAAAAAAIW} +{\bkmkend AAAAAAAAIW} +{ +\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid +{\b Initial value:}{ +\pard\plain \s41\li360\widctlpar\adjustright \shading1000\cbpat8 \f2\fs16\cgrid 1 = {\cf22 """#!/bin/sh}\par +2 {\cf22 # This is a post-commit hook generated by penify.}\par +3 {\cf22 # Automatically generates documentation for changed files after each commit.}\par +4 {\cf22 }\par +5 {\cf22 penify docgen -gf \{git_folder_path\} -t \{token\}}\par +6 {\cf22 """}\par +} +} +\par \pard\plain + +\pard\plain \sect\sbkpage +\s2\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs28\kerning28\cgrid +\pard\plain \s2\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs28\kerning28\cgrid +penify_hook.commit_analyzer Namespace Reference\par \pard\plain +{\tc\tcl2 \v penify_hook.commit_analyzer} +{\xe \v penify_hook.commit_analyzer} +{\bkmkstart AAAAAAAAIX} +{\bkmkend AAAAAAAAIX} +\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid +Classes\par +\pard\plain + +{ +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +class {\b CommitDocGenHook}\par +} +\par \pard\plain + +\pard\plain \sect\sbkpage +\s2\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs28\kerning28\cgrid +\pard\plain \s2\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs28\kerning28\cgrid +penify_hook.config_command Namespace Reference\par \pard\plain +{\tc\tcl2 \v penify_hook.config_command} +{\xe \v penify_hook.config_command} +{\bkmkstart AAAAAAAAJE} +{\bkmkend AAAAAAAAJE} +\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid +Functions\par +\pard\plain + +{ +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +def {\b setup_config_parser} (parent_parser)\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +def {\b handle_config} (args)\par +} +{\pard\widctlpar\brdrb\brdrs\brdrw5\brsp20 \adjustright \par} +\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid +Function Documentation\par +\pard\plain +{\xe \v handle_config\:penify_hook.config_command} +{\xe \v penify_hook.config_command\:handle_config} +\pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid { +{\b +def penify_hook.config_command.handle_config ( {\i args})}} +\par +{\bkmkstart AAAAAAAAJF} +{\bkmkend AAAAAAAAJF} +{ +\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid +{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid +{ +\par +\pard\plain \s41\li360\widctlpar\adjustright \shading1000\cbpat8 \f2\fs16\cgrid Handle configuration settings based on the specified config type.\par +\par +This function processes different types of configurations such as LLM (Language\par +Model) and JIRA. It saves configurations, sets up web-based configurations, and\par +verifies JIRA connections. Depending on the `args.config_type`, it imports\par +necessary modules, handles configuration saving or setup, and optionally\par +verifies JIRA connectivity.\par +\par +Args:\par + args (argparse.Namespace): Command-line arguments containing the type of configuration to handle.\par +} + \par +}Here is the call graph for this function:{ +\pard\plain +\par\pard \qc {\field\flddirty {\*\fldinst INCLUDEPICTURE "namespacepenify__hook_1_1config__command_a240e5331681eb574ac319d7458783bde_cgraph.svg" \\d \\*MERGEFORMAT}{\fldrslt IMAGE}}\par +} +Here is the caller graph for this function:{ +\pard\plain +\par\pard \qc {\field\flddirty {\*\fldinst INCLUDEPICTURE "namespacepenify__hook_1_1config__command_a240e5331681eb574ac319d7458783bde_icgraph.svg" \\d \\*MERGEFORMAT}{\fldrslt IMAGE}}\par +} +} +{\xe \v setup_config_parser\:penify_hook.config_command} +{\xe \v penify_hook.config_command\:setup_config_parser} +\pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid { +{\b +def penify_hook.config_command.setup_config_parser ( {\i parent_parser})}} +\par +{\bkmkstart AAAAAAAAJG} +{\bkmkend AAAAAAAAJG} +{ +\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid +{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid +{ +\par +\pard\plain \s41\li360\widctlpar\adjustright \shading1000\cbpat8 \f2\fs16\cgrid Set up configuration parsers with subcommands for LLM and JIRA settings.} + \par +}Here is the caller graph for this function:{ +\pard\plain +\par\pard \qc {\field\flddirty {\*\fldinst INCLUDEPICTURE "namespacepenify__hook_1_1config__command_a4f3eb92164a69df1446d745f8a09285e_icgraph.svg" \\d \\*MERGEFORMAT}{\fldrslt IMAGE}}\par +} +} +\par \pard\plain + +\pard\plain \sect\sbkpage +\s2\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs28\kerning28\cgrid +\pard\plain \s2\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs28\kerning28\cgrid +penify_hook.constants Namespace Reference\par \pard\plain +{\tc\tcl2 \v penify_hook.constants} +{\xe \v penify_hook.constants} +{\bkmkstart AAAAAAAAJH} +{\bkmkend AAAAAAAAJH} +\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid +Variables\par +\pard\plain + +{ +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +string {\b API_URL} = 'http://localhost:8000/api'\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +string {\b DASHBOARD_URL} = "https://dashboard.penify.dev/auth/localhost/login"\par +} +{\pard\widctlpar\brdrb\brdrs\brdrw5\brsp20 \adjustright \par} +\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid +Variable Documentation\par +\pard\plain +{\xe \v API_URL\:penify_hook.constants} +{\xe \v penify_hook.constants\:API_URL} +\pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid { +{\b +string penify_hook.constants.API_URL = 'http://localhost:8000/api'}} +\par +{\bkmkstart AAAAAAAAJI} +{\bkmkend AAAAAAAAJI} +{ +\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid +} +{\xe \v DASHBOARD_URL\:penify_hook.constants} +{\xe \v penify_hook.constants\:DASHBOARD_URL} +\pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid { +{\b +string penify_hook.constants.DASHBOARD_URL = "https://dashboard.penify.dev/auth/localhost/login"}} +\par +{\bkmkstart AAAAAAAAJJ} +{\bkmkend AAAAAAAAJJ} +{ +\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid +} +\par \pard\plain + +\pard\plain \sect\sbkpage +\s2\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs28\kerning28\cgrid +\pard\plain \s2\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs28\kerning28\cgrid +penify_hook.file_analyzer Namespace Reference\par \pard\plain +{\tc\tcl2 \v penify_hook.file_analyzer} +{\xe \v penify_hook.file_analyzer} +{\bkmkstart AAAAAAAAJK} +{\bkmkend AAAAAAAAJK} +\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid +Classes\par +\pard\plain + +{ +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +class {\b FileAnalyzerGenHook}\par +} +\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid +Variables\par +\pard\plain + +{ +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +{\b logger} = logging.getLogger(__name__)\par +} +{\pard\widctlpar\brdrb\brdrs\brdrw5\brsp20 \adjustright \par} +\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid +Variable Documentation\par +\pard\plain +{\xe \v logger\:penify_hook.file_analyzer} +{\xe \v penify_hook.file_analyzer\:logger} +\pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid { +{\b +penify_hook.file_analyzer.logger = logging.getLogger(__name__)}} +\par +{\bkmkstart AAAAAAAAJL} +{\bkmkend AAAAAAAAJL} +{ +\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid +} +\par \pard\plain + +\pard\plain \sect\sbkpage +\s2\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs28\kerning28\cgrid +\pard\plain \s2\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs28\kerning28\cgrid +penify_hook.folder_analyzer Namespace Reference\par \pard\plain +{\tc\tcl2 \v penify_hook.folder_analyzer} +{\xe \v penify_hook.folder_analyzer} +{\bkmkstart AAAAAAAAJR} +{\bkmkend AAAAAAAAJR} +\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid +Classes\par +\pard\plain + +{ +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +class {\b FolderAnalyzerGenHook}\par +} +\par \pard\plain + +\pard\plain \sect\sbkpage +\s2\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs28\kerning28\cgrid +\pard\plain \s2\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs28\kerning28\cgrid +penify_hook.git_analyzer Namespace Reference\par \pard\plain +{\tc\tcl2 \v penify_hook.git_analyzer} +{\xe \v penify_hook.git_analyzer} +{\bkmkstart AAAAAAAAJW} +{\bkmkend AAAAAAAAJW} +\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid +Classes\par +\pard\plain + +{ +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +class {\b GitDocGenHook}\par +} +\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid +Variables\par +\pard\plain + +{ +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +{\b logger} = logging.getLogger(__name__)\par +} +{\pard\widctlpar\brdrb\brdrs\brdrw5\brsp20 \adjustright \par} +\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid +Variable Documentation\par +\pard\plain +{\xe \v logger\:penify_hook.git_analyzer} +{\xe \v penify_hook.git_analyzer\:logger} +\pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid { +{\b +penify_hook.git_analyzer.logger = logging.getLogger(__name__)}} +\par +{\bkmkstart AAAAAAAAJX} +{\bkmkend AAAAAAAAJX} +{ +\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid +} +\par \pard\plain + +\pard\plain \sect\sbkpage +\s2\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs28\kerning28\cgrid +\pard\plain \s2\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs28\kerning28\cgrid +penify_hook.jira_client Namespace Reference\par \pard\plain +{\tc\tcl2 \v penify_hook.jira_client} +{\xe \v penify_hook.jira_client} +{\bkmkstart AAAAAAAAKD} +{\bkmkend AAAAAAAAKD} +\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid +Classes\par +\pard\plain + +{ +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +class {\b JiraClient}\par +} +\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid +Variables\par +\pard\plain + +{ +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +bool {\b JIRA_AVAILABLE} = True\par +} +{\pard\widctlpar\brdrb\brdrs\brdrw5\brsp20 \adjustright \par} +\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid +Variable Documentation\par +\pard\plain +{\xe \v JIRA_AVAILABLE\:penify_hook.jira_client} +{\xe \v penify_hook.jira_client\:JIRA_AVAILABLE} +\pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid { +{\b +bool penify_hook.jira_client.JIRA_AVAILABLE = True}} +\par +{\bkmkstart AAAAAAAAKE} +{\bkmkend AAAAAAAAKE} +{ +\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid +} +\par \pard\plain + +\pard\plain \sect\sbkpage +\s2\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs28\kerning28\cgrid +\pard\plain \s2\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs28\kerning28\cgrid +penify_hook.llm_client Namespace Reference\par \pard\plain +{\tc\tcl2 \v penify_hook.llm_client} +{\xe \v penify_hook.llm_client} +{\bkmkstart AAAAAAAAKV} +{\bkmkend AAAAAAAAKV} +\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid +Classes\par +\pard\plain + +{ +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +class {\b LLMClient}\par +} +\par \pard\plain + +\pard\plain \sect\sbkpage +\s2\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs28\kerning28\cgrid +\pard\plain \s2\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs28\kerning28\cgrid +penify_hook.login_command Namespace Reference\par \pard\plain +{\tc\tcl2 \v penify_hook.login_command} +{\xe \v penify_hook.login_command} +{\bkmkstart AAAAAAAALC} +{\bkmkend AAAAAAAALC} +\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid +Functions\par +\pard\plain + +{ +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +def {\b setup_login_parser} (parser)\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +def {\b handle_login} (args)\par +} +{\pard\widctlpar\brdrb\brdrs\brdrw5\brsp20 \adjustright \par} +\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid +Function Documentation\par +\pard\plain +{\xe \v handle_login\:penify_hook.login_command} +{\xe \v penify_hook.login_command\:handle_login} +\pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid { +{\b +def penify_hook.login_command.handle_login ( {\i args})}} +\par +{\bkmkstart AAAAAAAALD} +{\bkmkend AAAAAAAALD} +{ +\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid +{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid +{ +\par +\pard\plain \s41\li360\widctlpar\adjustright \shading1000\cbpat8 \f2\fs16\cgrid Initiates a user login process using predefined constants and the `login`\par +function.} + \par +}Here is the call graph for this function:{ +\pard\plain +\par\pard \qc {\field\flddirty {\*\fldinst INCLUDEPICTURE "namespacepenify__hook_1_1login__command_ae4bf932fbafeff834b0a0c5a37f74ccd_cgraph.svg" \\d \\*MERGEFORMAT}{\fldrslt IMAGE}}\par +} +Here is the caller graph for this function:{ +\pard\plain +\par\pard \qc {\field\flddirty {\*\fldinst INCLUDEPICTURE "namespacepenify__hook_1_1login__command_ae4bf932fbafeff834b0a0c5a37f74ccd_icgraph.svg" \\d \\*MERGEFORMAT}{\fldrslt IMAGE}}\par +} +} +{\xe \v setup_login_parser\:penify_hook.login_command} +{\xe \v penify_hook.login_command\:setup_login_parser} +\pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid { +{\b +def penify_hook.login_command.setup_login_parser ( {\i parser})}} +\par +{\bkmkstart AAAAAAAALE} +{\bkmkend AAAAAAAALE} +{ +\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid +{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid +{ +\par +\pard\plain \s41\li360\widctlpar\adjustright \shading1000\cbpat8 \f2\fs16\cgrid Set up command-line arguments for login.} + \par +}Here is the caller graph for this function:{ +\pard\plain +\par\pard \qc {\field\flddirty {\*\fldinst INCLUDEPICTURE "namespacepenify__hook_1_1login__command_aae63db4c484797bead34b7d874020c6a_icgraph.svg" \\d \\*MERGEFORMAT}{\fldrslt IMAGE}}\par +} +} +\par \pard\plain + +\pard\plain \sect\sbkpage +\s2\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs28\kerning28\cgrid +\pard\plain \s2\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs28\kerning28\cgrid +penify_hook.main Namespace Reference\par \pard\plain +{\tc\tcl2 \v penify_hook.main} +{\xe \v penify_hook.main} +{\bkmkstart AAAAAAAALF} +{\bkmkend AAAAAAAALF} +\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid +Functions\par +\pard\plain + +{ +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +def {\b main} ()\par +} +{\pard\widctlpar\brdrb\brdrs\brdrw5\brsp20 \adjustright \par} +\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid +Function Documentation\par +\pard\plain +{\xe \v main\:penify_hook.main} +{\xe \v penify_hook.main\:main} +\pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid { +{\b +def penify_hook.main.main ()}} +\par +{\bkmkstart AAAAAAAALG} +{\bkmkend AAAAAAAALG} +{ +\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid +{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid +{ +\par +\pard\plain \s41\li360\widctlpar\adjustright \shading1000\cbpat8 \f2\fs16\cgrid Main function to handle command-line interface (CLI) interactions with Penify\par +services.\par +\par +This tool provides a command-line interface for generating smart commit\par +messages, configuring local-LLM and JIRA, and generating code documentation. It\par +supports basic commands that do not require login and advanced commands that\par +require user authentication. The `--version` flag can be used to display the\par +version information.\par +} + \par +}Here is the call graph for this function:{ +\pard\plain +\par\pard \qc {\field\flddirty {\*\fldinst INCLUDEPICTURE "namespacepenify__hook_1_1main_a16838b20df4bd14ee4b5e1dd2906738f_cgraph.svg" \\d \\*MERGEFORMAT}{\fldrslt IMAGE}}\par +} +Here is the caller graph for this function:{ +\pard\plain +\par\pard \qc {\field\flddirty {\*\fldinst INCLUDEPICTURE "namespacepenify__hook_1_1main_a16838b20df4bd14ee4b5e1dd2906738f_icgraph.svg" \\d \\*MERGEFORMAT}{\fldrslt IMAGE}}\par +} +} +\par \pard\plain + +\pard\plain \sect\sbkpage +\s2\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs28\kerning28\cgrid +\pard\plain \s2\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs28\kerning28\cgrid +penify_hook.ui_utils Namespace Reference\par \pard\plain +{\tc\tcl2 \v penify_hook.ui_utils} +{\xe \v penify_hook.ui_utils} +{\bkmkstart AAAAAAAALH} +{\bkmkend AAAAAAAALH} +\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid +Functions\par +\pard\plain + +{ +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +def {\b format_info} (message)\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +def {\b format_success} (message)\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +def {\b format_warning} (message)\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +def {\b format_error} (message)\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +def {\b format_highlight} (message)\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +def {\b format_file_path} (file_path)\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +def {\b print_info} (message)\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +def {\b print_success} (message)\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +def {\b print_warning} (message)\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +def {\b print_error} (message)\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +def {\b print_processing} (file_path)\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +def {\b print_status} (status, message)\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +def {\b create_progress_bar} (total, desc="Processing", unit="item")\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +def {\b create_stage_progress_bar} (stages, desc="Processing")\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +def {\b update_stage} (pbar, stage_name)\par +} +\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid +Variables\par +\pard\plain + +{ +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +{\b autoreset}\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +{\b INFO_COLOR} = Fore.CYAN\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +{\b SUCCESS_COLOR} = Fore.GREEN\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +{\b WARNING_COLOR} = Fore.YELLOW\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +{\b ERROR_COLOR} = Fore.RED\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +{\b HIGHLIGHT_COLOR} = Fore.BLUE\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +{\b NEUTRAL_COLOR} = Fore.WHITE\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +string {\b SUCCESS_SYMBOL} = "\'E2\'9C\'93"\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +string {\b WARNING_SYMBOL} = "\'E2\'97\'8B"\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +string {\b ERROR_SYMBOL} = "\'E2\'9C\'97"\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +string {\b PROCESSING_SYMBOL} = "\'E2\'9F\'B3"\par +} +{\pard\widctlpar\brdrb\brdrs\brdrw5\brsp20 \adjustright \par} +\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid +Detailed Description\par +\pard\plain +{ +\pard\plain \s17\sa60\sb30\widctlpar\qj \fs22\cgrid {\s17\sa60\sb30\widctlpar\qj \fs22\cgrid +{ +\par +\pard\plain \s40\li0\widctlpar\adjustright \shading1000\cbpat8 \f2\fs16\cgrid UI utilities for Penify CLI.\par +\par +This module provides utility functions for consistent UI formatting,\par +colored output, and progress indicators across the Penify CLI application.\par +} + \par +}} +{\pard\widctlpar\brdrb\brdrs\brdrw5\brsp20 \adjustright \par} +\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid +Function Documentation\par +\pard\plain +{\xe \v create_progress_bar\:penify_hook.ui_utils} +{\xe \v penify_hook.ui_utils\:create_progress_bar} +\pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid { +{\b +def penify_hook.ui_utils.create_progress_bar ( {\i total}, {\i desc} = {\f2 "Processing"}, {\i unit} = {\f2 "item"})}} +\par +{\bkmkstart AAAAAAAALI} +{\bkmkend AAAAAAAALI} +{ +\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid +{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid +{ +\par +\pard\plain \s41\li360\widctlpar\adjustright \shading1000\cbpat8 \f2\fs16\cgrid Create a tqdm progress bar with consistent styling.} + \par +}Here is the call graph for this function:{ +\pard\plain +\par\pard \qc {\field\flddirty {\*\fldinst INCLUDEPICTURE "namespacepenify__hook_1_1ui__utils_a12b92532b1458af94f3649d411b5505c_cgraph.svg" \\d \\*MERGEFORMAT}{\fldrslt IMAGE}}\par +} +Here is the caller graph for this function:{ +\pard\plain +\par\pard \qc {\field\flddirty {\*\fldinst INCLUDEPICTURE "namespacepenify__hook_1_1ui__utils_a12b92532b1458af94f3649d411b5505c_icgraph.svg" \\d \\*MERGEFORMAT}{\fldrslt IMAGE}}\par +} +} +{\xe \v create_stage_progress_bar\:penify_hook.ui_utils} +{\xe \v penify_hook.ui_utils\:create_stage_progress_bar} +\pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid { +{\b +def penify_hook.ui_utils.create_stage_progress_bar ( {\i stages}, {\i desc} = {\f2 "Processing"})}} +\par +{\bkmkstart AAAAAAAALJ} +{\bkmkend AAAAAAAALJ} +{ +\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid +{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid +{ +\par +\pard\plain \s41\li360\widctlpar\adjustright \shading1000\cbpat8 \f2\fs16\cgrid Create a tqdm progress bar for processing stages with consistent styling.} + \par +}Here is the call graph for this function:{ +\pard\plain +\par\pard \qc {\field\flddirty {\*\fldinst INCLUDEPICTURE "namespacepenify__hook_1_1ui__utils_a3da02cd1140179a9ce60f62c85fccfef_cgraph.svg" \\d \\*MERGEFORMAT}{\fldrslt IMAGE}}\par +} +Here is the caller graph for this function:{ +\pard\plain +\par\pard \qc {\field\flddirty {\*\fldinst INCLUDEPICTURE "namespacepenify__hook_1_1ui__utils_a3da02cd1140179a9ce60f62c85fccfef_icgraph.svg" \\d \\*MERGEFORMAT}{\fldrslt IMAGE}}\par +} +} +{\xe \v format_error\:penify_hook.ui_utils} +{\xe \v penify_hook.ui_utils\:format_error} +\pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid { +{\b +def penify_hook.ui_utils.format_error ( {\i message})}} +\par +{\bkmkstart AAAAAAAALK} +{\bkmkend AAAAAAAALK} +{ +\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid +{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid +{ +\par +\pard\plain \s41\li360\widctlpar\adjustright \shading1000\cbpat8 \f2\fs16\cgrid Format an error message with the specified error color.} + \par +}Here is the caller graph for this function:{ +\pard\plain +\par\pard \qc {\field\flddirty {\*\fldinst INCLUDEPICTURE "namespacepenify__hook_1_1ui__utils_a4dd934568897433fa73f9cc182ac4a3e_icgraph.svg" \\d \\*MERGEFORMAT}{\fldrslt IMAGE}}\par +} +} +{\xe \v format_file_path\:penify_hook.ui_utils} +{\xe \v penify_hook.ui_utils\:format_file_path} +\pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid { +{\b +def penify_hook.ui_utils.format_file_path ( {\i file_path})}} +\par +{\bkmkstart AAAAAAAALL} +{\bkmkend AAAAAAAALL} +{ +\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid +{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid +{ +\par +\pard\plain \s41\li360\widctlpar\adjustright \shading1000\cbpat8 \f2\fs16\cgrid Format a file path with a warning color.} + \par +}Here is the caller graph for this function:{ +\pard\plain +\par\pard \qc {\field\flddirty {\*\fldinst INCLUDEPICTURE "namespacepenify__hook_1_1ui__utils_af3441fb3c2c3850b8b3b6455a9fdaba4_icgraph.svg" \\d \\*MERGEFORMAT}{\fldrslt IMAGE}}\par +} +} +{\xe \v format_highlight\:penify_hook.ui_utils} +{\xe \v penify_hook.ui_utils\:format_highlight} +\pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid { +{\b +def penify_hook.ui_utils.format_highlight ( {\i message})}} +\par +{\bkmkstart AAAAAAAALM} +{\bkmkend AAAAAAAALM} +{ +\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid +{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid +{ +\par +\pard\plain \s41\li360\widctlpar\adjustright \shading1000\cbpat8 \f2\fs16\cgrid Format a highlighted message with appropriate color.} + \par +}} +{\xe \v format_info\:penify_hook.ui_utils} +{\xe \v penify_hook.ui_utils\:format_info} +\pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid { +{\b +def penify_hook.ui_utils.format_info ( {\i message})}} +\par +{\bkmkstart AAAAAAAALN} +{\bkmkend AAAAAAAALN} +{ +\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid +{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid +{ +\par +\pard\plain \s41\li360\widctlpar\adjustright \shading1000\cbpat8 \f2\fs16\cgrid Format an informational message with appropriate color.} + \par +}Here is the caller graph for this function:{ +\pard\plain +\par\pard \qc {\field\flddirty {\*\fldinst INCLUDEPICTURE "namespacepenify__hook_1_1ui__utils_a92c3e466d1912058167be2eacf85b9f6_icgraph.svg" \\d \\*MERGEFORMAT}{\fldrslt IMAGE}}\par +} +} +{\xe \v format_success\:penify_hook.ui_utils} +{\xe \v penify_hook.ui_utils\:format_success} +\pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid { +{\b +def penify_hook.ui_utils.format_success ( {\i message})}} +\par +{\bkmkstart AAAAAAAALO} +{\bkmkend AAAAAAAALO} +{ +\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid +{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid +{ +\par +\pard\plain \s41\li360\widctlpar\adjustright \shading1000\cbpat8 \f2\fs16\cgrid Formats a success message with green color and reset style.} + \par +}Here is the caller graph for this function:{ +\pard\plain +\par\pard \qc {\field\flddirty {\*\fldinst INCLUDEPICTURE "namespacepenify__hook_1_1ui__utils_a532cdb4de7c679ce8b29c3e9116c4776_icgraph.svg" \\d \\*MERGEFORMAT}{\fldrslt IMAGE}}\par +} +} +{\xe \v format_warning\:penify_hook.ui_utils} +{\xe \v penify_hook.ui_utils\:format_warning} +\pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid { +{\b +def penify_hook.ui_utils.format_warning ( {\i message})}} +\par +{\bkmkstart AAAAAAAALP} +{\bkmkend AAAAAAAALP} +{ +\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid +{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid +{ +\par +\pard\plain \s41\li360\widctlpar\adjustright \shading1000\cbpat8 \f2\fs16\cgrid Format a warning message with appropriate color.} + \par +}Here is the caller graph for this function:{ +\pard\plain +\par\pard \qc {\field\flddirty {\*\fldinst INCLUDEPICTURE "namespacepenify__hook_1_1ui__utils_a0a6fd2613c6fe053b6e4356cd9e5cda2_icgraph.svg" \\d \\*MERGEFORMAT}{\fldrslt IMAGE}}\par +} +} +{\xe \v print_error\:penify_hook.ui_utils} +{\xe \v penify_hook.ui_utils\:print_error} +\pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid { +{\b +def penify_hook.ui_utils.print_error ( {\i message})}} +\par +{\bkmkstart AAAAAAAALQ} +{\bkmkend AAAAAAAALQ} +{ +\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid +{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid +{ +\par +\pard\plain \s41\li360\widctlpar\adjustright \shading1000\cbpat8 \f2\fs16\cgrid Print an error message with appropriate formatting.} + \par +}Here is the call graph for this function:{ +\pard\plain +\par\pard \qc {\field\flddirty {\*\fldinst INCLUDEPICTURE "namespacepenify__hook_1_1ui__utils_a6f0acd7dd91abfe67d0807803bc3b65f_cgraph.svg" \\d \\*MERGEFORMAT}{\fldrslt IMAGE}}\par +} +Here is the caller graph for this function:{ +\pard\plain +\par\pard \qc {\field\flddirty {\*\fldinst INCLUDEPICTURE "namespacepenify__hook_1_1ui__utils_a6f0acd7dd91abfe67d0807803bc3b65f_icgraph.svg" \\d \\*MERGEFORMAT}{\fldrslt IMAGE}}\par +} +} +{\xe \v print_info\:penify_hook.ui_utils} +{\xe \v penify_hook.ui_utils\:print_info} +\pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid { +{\b +def penify_hook.ui_utils.print_info ( {\i message})}} +\par +{\bkmkstart AAAAAAAALR} +{\bkmkend AAAAAAAALR} +{ +\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid +{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid +{ +\par +\pard\plain \s41\li360\widctlpar\adjustright \shading1000\cbpat8 \f2\fs16\cgrid Prints an informational message with formatting.} + \par +}Here is the call graph for this function:{ +\pard\plain +\par\pard \qc {\field\flddirty {\*\fldinst INCLUDEPICTURE "namespacepenify__hook_1_1ui__utils_a811f0adf6e9bf71510c379b6fa155e44_cgraph.svg" \\d \\*MERGEFORMAT}{\fldrslt IMAGE}}\par +} +Here is the caller graph for this function:{ +\pard\plain +\par\pard \qc {\field\flddirty {\*\fldinst INCLUDEPICTURE "namespacepenify__hook_1_1ui__utils_a811f0adf6e9bf71510c379b6fa155e44_icgraph.svg" \\d \\*MERGEFORMAT}{\fldrslt IMAGE}}\par +} +} +{\xe \v print_processing\:penify_hook.ui_utils} +{\xe \v penify_hook.ui_utils\:print_processing} +\pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid { +{\b +def penify_hook.ui_utils.print_processing ( {\i file_path})}} +\par +{\bkmkstart AAAAAAAALS} +{\bkmkend AAAAAAAALS} +{ +\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid +{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid +{ +\par +\pard\plain \s41\li360\widctlpar\adjustright \shading1000\cbpat8 \f2\fs16\cgrid Print a processing message for a specified file.} + \par +}Here is the call graph for this function:{ +\pard\plain +\par\pard \qc {\field\flddirty {\*\fldinst INCLUDEPICTURE "namespacepenify__hook_1_1ui__utils_adfcbbfe39029ab6d1dd33e7bf75ae115_cgraph.svg" \\d \\*MERGEFORMAT}{\fldrslt IMAGE}}\par +} +Here is the caller graph for this function:{ +\pard\plain +\par\pard \qc {\field\flddirty {\*\fldinst INCLUDEPICTURE "namespacepenify__hook_1_1ui__utils_adfcbbfe39029ab6d1dd33e7bf75ae115_icgraph.svg" \\d \\*MERGEFORMAT}{\fldrslt IMAGE}}\par +} +} +{\xe \v print_status\:penify_hook.ui_utils} +{\xe \v penify_hook.ui_utils\:print_status} +\pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid { +{\b +def penify_hook.ui_utils.print_status ( {\i status}, {\i message})}} +\par +{\bkmkstart AAAAAAAALT} +{\bkmkend AAAAAAAALT} +{ +\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid +{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid +{ +\par +\pard\plain \s41\li360\widctlpar\adjustright \shading1000\cbpat8 \f2\fs16\cgrid Print a status message with an appropriate symbol.} + \par +}Here is the caller graph for this function:{ +\pard\plain +\par\pard \qc {\field\flddirty {\*\fldinst INCLUDEPICTURE "namespacepenify__hook_1_1ui__utils_aa6e684c00e26199440137a87ed9b195c_icgraph.svg" \\d \\*MERGEFORMAT}{\fldrslt IMAGE}}\par +} +} +{\xe \v print_success\:penify_hook.ui_utils} +{\xe \v penify_hook.ui_utils\:print_success} +\pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid { +{\b +def penify_hook.ui_utils.print_success ( {\i message})}} +\par +{\bkmkstart AAAAAAAALU} +{\bkmkend AAAAAAAALU} +{ +\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid +{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid +{ +\par +\pard\plain \s41\li360\widctlpar\adjustright \shading1000\cbpat8 \f2\fs16\cgrid Prints a formatted success message.} + \par +}Here is the call graph for this function:{ +\pard\plain +\par\pard \qc {\field\flddirty {\*\fldinst INCLUDEPICTURE "namespacepenify__hook_1_1ui__utils_a2b16aa6b68a9edea5f29f84f1c4be79a_cgraph.svg" \\d \\*MERGEFORMAT}{\fldrslt IMAGE}}\par +} +Here is the caller graph for this function:{ +\pard\plain +\par\pard \qc {\field\flddirty {\*\fldinst INCLUDEPICTURE "namespacepenify__hook_1_1ui__utils_a2b16aa6b68a9edea5f29f84f1c4be79a_icgraph.svg" \\d \\*MERGEFORMAT}{\fldrslt IMAGE}}\par +} +} +{\xe \v print_warning\:penify_hook.ui_utils} +{\xe \v penify_hook.ui_utils\:print_warning} +\pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid { +{\b +def penify_hook.ui_utils.print_warning ( {\i message})}} +\par +{\bkmkstart AAAAAAAALV} +{\bkmkend AAAAAAAALV} +{ +\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid +{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid +{ +\par +\pard\plain \s41\li360\widctlpar\adjustright \shading1000\cbpat8 \f2\fs16\cgrid Prints a warning message with formatted output.} + \par +}Here is the call graph for this function:{ +\pard\plain +\par\pard \qc {\field\flddirty {\*\fldinst INCLUDEPICTURE "namespacepenify__hook_1_1ui__utils_a1ffbb9671dbe233770268e2dd66a67fa_cgraph.svg" \\d \\*MERGEFORMAT}{\fldrslt IMAGE}}\par +} +Here is the caller graph for this function:{ +\pard\plain +\par\pard \qc {\field\flddirty {\*\fldinst INCLUDEPICTURE "namespacepenify__hook_1_1ui__utils_a1ffbb9671dbe233770268e2dd66a67fa_icgraph.svg" \\d \\*MERGEFORMAT}{\fldrslt IMAGE}}\par +} +} +{\xe \v update_stage\:penify_hook.ui_utils} +{\xe \v penify_hook.ui_utils\:update_stage} +\pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid { +{\b +def penify_hook.ui_utils.update_stage ( {\i pbar}, {\i stage_name})}} +\par +{\bkmkstart AAAAAAAALW} +{\bkmkend AAAAAAAALW} +{ +\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid +{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid +{ +\par +\pard\plain \s41\li360\widctlpar\adjustright \shading1000\cbpat8 \f2\fs16\cgrid Update the progress bar with a new stage name.} + \par +}Here is the caller graph for this function:{ +\pard\plain +\par\pard \qc {\field\flddirty {\*\fldinst INCLUDEPICTURE "namespacepenify__hook_1_1ui__utils_a5a7340d0fc60fb80f17514d60bf45f1d_icgraph.svg" \\d \\*MERGEFORMAT}{\fldrslt IMAGE}}\par +} +} +{\pard\widctlpar\brdrb\brdrs\brdrw5\brsp20 \adjustright \par} +\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid +Variable Documentation\par +\pard\plain +{\xe \v autoreset\:penify_hook.ui_utils} +{\xe \v penify_hook.ui_utils\:autoreset} +\pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid { +{\b +penify_hook.ui_utils.autoreset}} +\par +{\bkmkstart AAAAAAAALX} +{\bkmkend AAAAAAAALX} +{ +\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid +} +{\xe \v ERROR_COLOR\:penify_hook.ui_utils} +{\xe \v penify_hook.ui_utils\:ERROR_COLOR} +\pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid { +{\b +penify_hook.ui_utils.ERROR_COLOR = Fore.RED}} +\par +{\bkmkstart AAAAAAAALY} +{\bkmkend AAAAAAAALY} +{ +\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid +} +{\xe \v ERROR_SYMBOL\:penify_hook.ui_utils} +{\xe \v penify_hook.ui_utils\:ERROR_SYMBOL} +\pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid { +{\b +string penify_hook.ui_utils.ERROR_SYMBOL = "\'E2\'9C\'97"}} +\par +{\bkmkstart AAAAAAAALZ} +{\bkmkend AAAAAAAALZ} +{ +\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid +} +{\xe \v HIGHLIGHT_COLOR\:penify_hook.ui_utils} +{\xe \v penify_hook.ui_utils\:HIGHLIGHT_COLOR} +\pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid { +{\b +penify_hook.ui_utils.HIGHLIGHT_COLOR = Fore.BLUE}} +\par +{\bkmkstart AAAAAAAAMA} +{\bkmkend AAAAAAAAMA} +{ +\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid +} +{\xe \v INFO_COLOR\:penify_hook.ui_utils} +{\xe \v penify_hook.ui_utils\:INFO_COLOR} +\pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid { +{\b +penify_hook.ui_utils.INFO_COLOR = Fore.CYAN}} +\par +{\bkmkstart AAAAAAAAMB} +{\bkmkend AAAAAAAAMB} +{ +\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid +} +{\xe \v NEUTRAL_COLOR\:penify_hook.ui_utils} +{\xe \v penify_hook.ui_utils\:NEUTRAL_COLOR} +\pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid { +{\b +penify_hook.ui_utils.NEUTRAL_COLOR = Fore.WHITE}} +\par +{\bkmkstart AAAAAAAAMC} +{\bkmkend AAAAAAAAMC} +{ +\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid +} +{\xe \v PROCESSING_SYMBOL\:penify_hook.ui_utils} +{\xe \v penify_hook.ui_utils\:PROCESSING_SYMBOL} +\pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid { +{\b +string penify_hook.ui_utils.PROCESSING_SYMBOL = "\'E2\'9F\'B3"}} +\par +{\bkmkstart AAAAAAAAMD} +{\bkmkend AAAAAAAAMD} +{ +\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid +} +{\xe \v SUCCESS_COLOR\:penify_hook.ui_utils} +{\xe \v penify_hook.ui_utils\:SUCCESS_COLOR} +\pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid { +{\b +penify_hook.ui_utils.SUCCESS_COLOR = Fore.GREEN}} +\par +{\bkmkstart AAAAAAAAME} +{\bkmkend AAAAAAAAME} +{ +\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid +} +{\xe \v SUCCESS_SYMBOL\:penify_hook.ui_utils} +{\xe \v penify_hook.ui_utils\:SUCCESS_SYMBOL} +\pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid { +{\b +string penify_hook.ui_utils.SUCCESS_SYMBOL = "\'E2\'9C\'93"}} +\par +{\bkmkstart AAAAAAAAMF} +{\bkmkend AAAAAAAAMF} +{ +\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid +} +{\xe \v WARNING_COLOR\:penify_hook.ui_utils} +{\xe \v penify_hook.ui_utils\:WARNING_COLOR} +\pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid { +{\b +penify_hook.ui_utils.WARNING_COLOR = Fore.YELLOW}} +\par +{\bkmkstart AAAAAAAAMG} +{\bkmkend AAAAAAAAMG} +{ +\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid +} +{\xe \v WARNING_SYMBOL\:penify_hook.ui_utils} +{\xe \v penify_hook.ui_utils\:WARNING_SYMBOL} +\pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid { +{\b +string penify_hook.ui_utils.WARNING_SYMBOL = "\'E2\'97\'8B"}} +\par +{\bkmkstart AAAAAAAAMH} +{\bkmkend AAAAAAAAMH} +{ +\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid +} +\par \pard\plain + +\pard\plain \sect\sbkpage +\s2\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs28\kerning28\cgrid +\pard\plain \s2\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs28\kerning28\cgrid +penify_hook.utils Namespace Reference\par \pard\plain +{\tc\tcl2 \v penify_hook.utils} +{\xe \v penify_hook.utils} +{\bkmkstart AAAAAAAAMI} +{\bkmkend AAAAAAAAMI} +\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid +Classes\par +\pard\plain + +{ +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +class {\b GitRepoNotFoundError}\par +} +\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid +Functions\par +\pard\plain + +{ +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +def {\b get_repo_details} (Repo repo)\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +def {\b recursive_search_git_folder} (folder_path)\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +def {\b find_git_parent} (path)\par +} +\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid +Variables\par +\pard\plain + +{ +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +{\b logger} = logging.getLogger(__name__)\par +} +{\pard\widctlpar\brdrb\brdrs\brdrw5\brsp20 \adjustright \par} +\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid +Function Documentation\par +\pard\plain +{\xe \v find_git_parent\:penify_hook.utils} +{\xe \v penify_hook.utils\:find_git_parent} +\pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid { +{\b +def penify_hook.utils.find_git_parent ( {\i path})}} +\par +{\bkmkstart AAAAAAAAMJ} +{\bkmkend AAAAAAAAMJ} +{ +\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid +{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid +{ +\par +\pard\plain \s41\li360\widctlpar\adjustright \shading1000\cbpat8 \f2\fs16\cgrid Traverse up from the given path to find the nearest directory containing a .git\par +subdirectory.} + \par +}} +{\xe \v get_repo_details\:penify_hook.utils} +{\xe \v penify_hook.utils\:get_repo_details} +\pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid { +{\b +def penify_hook.utils.get_repo_details (Repo {\i repo})}} +\par +{\bkmkstart AAAAAAAAMK} +{\bkmkend AAAAAAAAMK} +{ +\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid +{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid +{ +\par +\pard\plain \s41\li360\widctlpar\adjustright \shading1000\cbpat8 \f2\fs16\cgrid Determine the details of a repository including its remote URL, hosting\par +service, organization name, and repository name.\par +\par +This function extracts the remote URL from the given Git repository object and\par +determines the hosting service (e.g., GitHub, Azure DevOps, Bitbucket, GitLab).\par +It then parses the URL to extract the organization name and repository name. If\par +the URL does not match any known hosting service pattern, it sets the hosting\par +service as "Unknown". The function handles exceptions that may occur during\par +this process and logs an error message if needed.\par +\par +Args:\par + repo (Repo): A GitPython Repo object representing the local git repository.\par +\par +Returns:\par + dict: A dictionary containing the organization name, repository name, and hosting\par + service.\par +} + \par +}} +{\xe \v recursive_search_git_folder\:penify_hook.utils} +{\xe \v penify_hook.utils\:recursive_search_git_folder} +\pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid { +{\b +def penify_hook.utils.recursive_search_git_folder ( {\i folder_path})}} +\par +{\bkmkstart AAAAAAAAML} +{\bkmkend AAAAAAAAML} +{ +\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid +{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid +{ +\par +\pard\plain \s41\li360\widctlpar\adjustright \shading1000\cbpat8 \f2\fs16\cgrid Recursively searches for a .git folder starting from the given directory.} + \par +}Here is the call graph for this function:{ +\pard\plain +\par\pard \qc {\field\flddirty {\*\fldinst INCLUDEPICTURE "namespacepenify__hook_1_1utils_a95c3f9c80860d6a2e2d061d2fb660a3f_cgraph.svg" \\d \\*MERGEFORMAT}{\fldrslt IMAGE}}\par +} +Here is the caller graph for this function:{ +\pard\plain +\par\pard \qc {\field\flddirty {\*\fldinst INCLUDEPICTURE "namespacepenify__hook_1_1utils_a95c3f9c80860d6a2e2d061d2fb660a3f_icgraph.svg" \\d \\*MERGEFORMAT}{\fldrslt IMAGE}}\par +} +} +{\pard\widctlpar\brdrb\brdrs\brdrw5\brsp20 \adjustright \par} +\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid +Variable Documentation\par +\pard\plain +{\xe \v logger\:penify_hook.utils} +{\xe \v penify_hook.utils\:logger} +\pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid { +{\b +penify_hook.utils.logger = logging.getLogger(__name__)}} +\par +{\bkmkstart AAAAAAAAMM} +{\bkmkend AAAAAAAAMM} +{ +\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid +} +\par \pard\plain + +\pard\plain \sect\sbkpage +\s2\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs28\kerning28\cgrid +\pard\plain \s2\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs28\kerning28\cgrid +setup Namespace Reference\par \pard\plain +{\tc\tcl2 \v setup} +{\xe \v setup} +{\bkmkstart AAAAAAAAMO} +{\bkmkend AAAAAAAAMO} +\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid +Variables\par +\pard\plain + +{ +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +{\b name}\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +{\b version}\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +{\b packages}\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +{\b install_requires}\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +{\b entry_points}\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +{\b author}\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +{\b author_email}\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +{\b description}\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +{\b long_description}\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +{\b long_description_content_type}\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +{\b url}\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +{\b classifiers}\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +{\b python_requires}\par +} +{\pard\widctlpar\brdrb\brdrs\brdrw5\brsp20 \adjustright \par} +\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid +Variable Documentation\par +\pard\plain +{\xe \v author\:setup} +{\xe \v setup\:author} +\pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid { +{\b +setup.author}} +\par +{\bkmkstart AAAAAAAAMP} +{\bkmkend AAAAAAAAMP} +{ +\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid +} +{\xe \v author_email\:setup} +{\xe \v setup\:author_email} +\pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid { +{\b +setup.author_email}} +\par +{\bkmkstart AAAAAAAAMQ} +{\bkmkend AAAAAAAAMQ} +{ +\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid +} +{\xe \v classifiers\:setup} +{\xe \v setup\:classifiers} +\pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid { +{\b +setup.classifiers}} +\par +{\bkmkstart AAAAAAAAMR} +{\bkmkend AAAAAAAAMR} +{ +\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid +} +{\xe \v description\:setup} +{\xe \v setup\:description} +\pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid { +{\b +setup.description}} +\par +{\bkmkstart AAAAAAAAMS} +{\bkmkend AAAAAAAAMS} +{ +\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid +} +{\xe \v entry_points\:setup} +{\xe \v setup\:entry_points} +\pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid { +{\b +setup.entry_points}} +\par +{\bkmkstart AAAAAAAAMT} +{\bkmkend AAAAAAAAMT} +{ +\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid +} +{\xe \v install_requires\:setup} +{\xe \v setup\:install_requires} +\pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid { +{\b +setup.install_requires}} +\par +{\bkmkstart AAAAAAAAMU} +{\bkmkend AAAAAAAAMU} +{ +\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid +} +{\xe \v long_description\:setup} +{\xe \v setup\:long_description} +\pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid { +{\b +setup.long_description}} +\par +{\bkmkstart AAAAAAAAMV} +{\bkmkend AAAAAAAAMV} +{ +\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid +} +{\xe \v long_description_content_type\:setup} +{\xe \v setup\:long_description_content_type} +\pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid { +{\b +setup.long_description_content_type}} +\par +{\bkmkstart AAAAAAAAMW} +{\bkmkend AAAAAAAAMW} +{ +\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid +} +{\xe \v name\:setup} +{\xe \v setup\:name} +\pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid { +{\b +setup.name}} +\par +{\bkmkstart AAAAAAAAMX} +{\bkmkend AAAAAAAAMX} +{ +\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid +} +{\xe \v packages\:setup} +{\xe \v setup\:packages} +\pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid { +{\b +setup.packages}} +\par +{\bkmkstart AAAAAAAAMY} +{\bkmkend AAAAAAAAMY} +{ +\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid +} +{\xe \v python_requires\:setup} +{\xe \v setup\:python_requires} +\pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid { +{\b +setup.python_requires}} +\par +{\bkmkstart AAAAAAAAMZ} +{\bkmkend AAAAAAAAMZ} +{ +\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid +} +{\xe \v url\:setup} +{\xe \v setup\:url} +\pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid { +{\b +setup.url}} +\par +{\bkmkstart AAAAAAAANA} +{\bkmkend AAAAAAAANA} +{ +\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid +} +{\xe \v version\:setup} +{\xe \v setup\:version} +\pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid { +{\b +setup.version}} +\par +{\bkmkstart AAAAAAAANB} +{\bkmkend AAAAAAAANB} +{ +\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid +} +\par \pard\plain + +\pard\plain \sect\sbkpage +\s2\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs28\kerning28\cgrid +\pard\plain \s2\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs28\kerning28\cgrid +tests Namespace Reference\par \pard\plain +{\tc\tcl2 \v tests} +{\xe \v tests} +{\bkmkstart AAAAAAAANC} +{\bkmkend AAAAAAAANC} +\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid +Namespaces\par +\pard\plain + +{ +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +namespace {\b conftest}\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +namespace {\b test_commit_commands}\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +namespace {\b test_config_commands}\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +namespace {\b test_doc_commands}\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +namespace {\b test_web_config}\par +} +\par \pard\plain + +\pard\plain \sect\sbkpage +\s2\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs28\kerning28\cgrid +\pard\plain \s2\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs28\kerning28\cgrid +tests.conftest Namespace Reference\par \pard\plain +{\tc\tcl2 \v tests.conftest} +{\xe \v tests.conftest} +{\bkmkstart AAAAAAAAND} +{\bkmkend AAAAAAAAND} +\par \pard\plain + +\pard\plain \sect\sbkpage +\s2\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs28\kerning28\cgrid +\pard\plain \s2\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs28\kerning28\cgrid +tests.test_commit_commands Namespace Reference\par \pard\plain +{\tc\tcl2 \v tests.test_commit_commands} +{\xe \v tests.test_commit_commands} +{\bkmkstart AAAAAAAANE} +{\bkmkend AAAAAAAANE} +\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid +Classes\par +\pard\plain + +{ +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +class {\b TestCommitCommands}\par +} +\par \pard\plain + +\pard\plain \sect\sbkpage +\s2\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs28\kerning28\cgrid +\pard\plain \s2\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs28\kerning28\cgrid +tests.test_config_commands Namespace Reference\par \pard\plain +{\tc\tcl2 \v tests.test_config_commands} +{\xe \v tests.test_config_commands} +{\bkmkstart AAAAAAAANS} +{\bkmkend AAAAAAAANS} +\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid +Classes\par +\pard\plain + +{ +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +class {\b TestConfigCommands}\par +} +\par \pard\plain + +\pard\plain \sect\sbkpage +\s2\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs28\kerning28\cgrid +\pard\plain \s2\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs28\kerning28\cgrid +tests.test_doc_commands Namespace Reference\par \pard\plain +{\tc\tcl2 \v tests.test_doc_commands} +{\xe \v tests.test_doc_commands} +{\bkmkstart AAAAAAAAOG} +{\bkmkend AAAAAAAAOG} +\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid +Functions\par +\pard\plain + +{ +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +def {\b test_generate_doc_no_location} (mock_getcwd, mock_api_client, mock_folder_analyzer, mock_file_analyzer, mock_git_analyzer)\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +def {\b test_generate_doc_file_location} (mock_api_client, mock_folder_analyzer, mock_file_analyzer, mock_git_analyzer)\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +def {\b test_generate_doc_folder_location} (mock_api_client, mock_folder_analyzer, mock_file_analyzer, mock_git_analyzer)\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +def {\b test_generate_doc_error_handling} (mock_api_client, mock_git_analyzer, mock_exit)\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +def {\b test_setup_docgen_parser} ()\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +def {\b test_handle_docgen_install_hook} (mock_exit, mock_get_token, mock_generate_doc, mock_uninstall_hook, mock_install_hook)\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +def {\b test_handle_docgen_uninstall_hook} (mock_exit, mock_get_token, mock_generate_doc, mock_uninstall_hook, mock_install_hook)\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +def {\b test_handle_docgen_generate} (mock_get_token, mock_generate_doc, mock_uninstall_hook, mock_install_hook)\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +def {\b test_handle_docgen_no_token} (mock_exit, mock_get_token)\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +def {\b test_generate_doc_with_file_exception} (mock_api_client, mock_getcwd)\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +def {\b test_generate_doc_with_folder_exception} (mock_api_client, mock_getcwd)\par +} +{\pard\widctlpar\brdrb\brdrs\brdrw5\brsp20 \adjustright \par} +\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid +Function Documentation\par +\pard\plain +{\xe \v test_generate_doc_error_handling\:tests.test_doc_commands} +{\xe \v tests.test_doc_commands\:test_generate_doc_error_handling} +\pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid { +{\b +def tests.test_doc_commands.test_generate_doc_error_handling ( {\i mock_api_client}, {\i mock_git_analyzer}, {\i mock_exit})}} +\par +{\bkmkstart AAAAAAAAOH} +{\bkmkend AAAAAAAAOH} +{ +\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid +{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid +{ +\par +\pard\plain \s41\li360\widctlpar\adjustright \shading1000\cbpat8 \f2\fs16\cgrid Generate a documentation string for the provided code snippet using\par +Google Docstring style.\par +\par +Short one line description: Test function to ensure proper error\par +handling during API calls with GitAnalyzer. Multiline long description:\par +This test function is designed to verify that the generate_doc function\par +handles exceptions correctly when an error occurs during API interaction\par +with GitAnalyzer. It sets up a mock API client and a mock Git analyzer,\par +causing the analyzer to raise an exception to simulate a failure\par +condition. The function then asserts that the exit code is set to 1 when\par +the error handling mechanism is invoked.\par +\par +Args:\par + mock_api_client (MagicMock): A mock object simulating the API client.\par + mock_git_analyzer (MagicMock): A mock object simulating the Git analyzer, configured to raise an\par + exception.\par + mock_exit (MagicMock): A mock object representing the exit function, which should be called\par + with an error code.\par +} + \par +}Here is the call graph for this function:{ +\pard\plain +\par\pard \qc {\field\flddirty {\*\fldinst INCLUDEPICTURE "namespacetests_1_1test__doc__commands_aec76cc25c23476794234cdadbcaef0c0_cgraph.svg" \\d \\*MERGEFORMAT}{\fldrslt IMAGE}}\par +} +} +{\xe \v test_generate_doc_file_location\:tests.test_doc_commands} +{\xe \v tests.test_doc_commands\:test_generate_doc_file_location} +\pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid { +{\b +def tests.test_doc_commands.test_generate_doc_file_location ( {\i mock_api_client}, {\i mock_folder_analyzer}, {\i mock_file_analyzer}, {\i mock_git_analyzer})}} +\par +{\bkmkstart AAAAAAAAOI} +{\bkmkend AAAAAAAAOI} +{ +\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid +{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid +{ +\par +\pard\plain \s41\li360\widctlpar\adjustright \shading1000\cbpat8 \f2\fs16\cgrid Test generating a documentation file location.\par +\par +This function tests the process of generating a documentation file\par +location using mock objects for API client, folder analyzer, file\par +analyzer, and Git analyzer. It sets up the necessary mocks, calls the\par +`generate_doc` function with specified parameters, and asserts that the\par +appropriate methods on the mock objects are called as expected.\par +\par +Args:\par + mock_api_client (MagicMock): Mock object for the API client.\par + mock_folder_analyzer (MagicMock): Mock object for the folder analyzer.\par + mock_file_analyzer (MagicMock): Mock object for the file analyzer.\par + mock_git_analyzer (MagicMock): Mock object for the Git analyzer.\par +} + \par +}Here is the call graph for this function:{ +\pard\plain +\par\pard \qc {\field\flddirty {\*\fldinst INCLUDEPICTURE "namespacetests_1_1test__doc__commands_a0e74c920f258f442914771164fe26b45_cgraph.svg" \\d \\*MERGEFORMAT}{\fldrslt IMAGE}}\par +} +} +{\xe \v test_generate_doc_folder_location\:tests.test_doc_commands} +{\xe \v tests.test_doc_commands\:test_generate_doc_folder_location} +\pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid { +{\b +def tests.test_doc_commands.test_generate_doc_folder_location ( {\i mock_api_client}, {\i mock_folder_analyzer}, {\i mock_file_analyzer}, {\i mock_git_analyzer})}} +\par +{\bkmkstart AAAAAAAAOJ} +{\bkmkend AAAAAAAAOJ} +{ +\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid +{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid +{ +\par +\pard\plain \s41\li360\widctlpar\adjustright \shading1000\cbpat8 \f2\fs16\cgrid Test the function to generate documentation for a folder location.\par +\par +It sets up mock objects for API client, folder analyzer, file analyzer,\par +and Git analyzer, then calls the `generate_doc` function with specified\par +parameters. Finally, it asserts that the correct methods on the mock\par +objects were called as expected.\par +\par +Args:\par + mock_api_client (MagicMock): Mock object for the API client.\par + mock_folder_analyzer (MagicMock): Mock object for the folder analyzer.\par + mock_file_analyzer (MagicMock): Mock object for the file analyzer.\par + mock_git_analyzer (MagicMock): Mock object for the Git analyzer.\par +} + \par +}Here is the call graph for this function:{ +\pard\plain +\par\pard \qc {\field\flddirty {\*\fldinst INCLUDEPICTURE "namespacetests_1_1test__doc__commands_a4bb75610e40d94d42bc169b25403c186_cgraph.svg" \\d \\*MERGEFORMAT}{\fldrslt IMAGE}}\par +} +} +{\xe \v test_generate_doc_no_location\:tests.test_doc_commands} +{\xe \v tests.test_doc_commands\:test_generate_doc_no_location} +\pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid { +{\b +def tests.test_doc_commands.test_generate_doc_no_location ( {\i mock_getcwd}, {\i mock_api_client}, {\i mock_folder_analyzer}, {\i mock_file_analyzer}, {\i mock_git_analyzer})}} +\par +{\bkmkstart AAAAAAAAOK} +{\bkmkend AAAAAAAAOK} +{ +\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid +{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid +{ +\par +\pard\plain \s41\li360\widctlpar\adjustright \shading1000\cbpat8 \f2\fs16\cgrid Test function to generate documentation without location information.\par +\par +This function sets up mocks for the API client, current working\par +directory, and Git analyzer. It then calls the `generate_doc` function\par +with a fake API URL and token. The function is expected to initialize\par +the API client, configure the Git analyzer, and run it without any\par +location information.\par +\par +Args:\par + mock_getcwd (MagicMock): Mock for os.getcwd().\par + mock_api_client (MagicMock): Mock for creating an API client.\par + mock_folder_analyzer (MagicMock): Mock for folder analysis.\par + mock_file_analyzer (MagicMock): Mock for file analysis.\par + mock_git_analyzer (MagicMock): Mock for Git analyzer setup.\par +} + \par +}Here is the call graph for this function:{ +\pard\plain +\par\pard \qc {\field\flddirty {\*\fldinst INCLUDEPICTURE "namespacetests_1_1test__doc__commands_a806110833eb0aad547156faf014b31d8_cgraph.svg" \\d \\*MERGEFORMAT}{\fldrslt IMAGE}}\par +} +} +{\xe \v test_generate_doc_with_file_exception\:tests.test_doc_commands} +{\xe \v tests.test_doc_commands\:test_generate_doc_with_file_exception} +\pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid { +{\b +def tests.test_doc_commands.test_generate_doc_with_file_exception ( {\i mock_api_client}, {\i mock_getcwd})}} +\par +{\bkmkstart AAAAAAAAOL} +{\bkmkend AAAAAAAAOL} +{ +\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid +{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid +{ +\par +\pard\plain \s41\li360\widctlpar\adjustright \shading1000\cbpat8 \f2\fs16\cgrid Generate documentation from a Python source file.\par +\par +This function reads a Python file and generates a docstring based on its\par +content. It uses mock objects to simulate API calls and directory\par +operations during testing.\par +\par +Args:\par + mock_api_client (unittest.mock.MagicMock): A mock object for simulating API client behavior.\par + mock_getcwd (unittest.mock.MagicMock): A mock object for simulating the current working directory function.\par +} + \par +}Here is the call graph for this function:{ +\pard\plain +\par\pard \qc {\field\flddirty {\*\fldinst INCLUDEPICTURE "namespacetests_1_1test__doc__commands_a335e7fd4912192c7276cf31bbebc6eb0_cgraph.svg" \\d \\*MERGEFORMAT}{\fldrslt IMAGE}}\par +} +} +{\xe \v test_generate_doc_with_folder_exception\:tests.test_doc_commands} +{\xe \v tests.test_doc_commands\:test_generate_doc_with_folder_exception} +\pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid { +{\b +def tests.test_doc_commands.test_generate_doc_with_folder_exception ( {\i mock_api_client}, {\i mock_getcwd})}} +\par +{\bkmkstart AAAAAAAAOM} +{\bkmkend AAAAAAAAOM} +{ +\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid +{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid +{ +\par +\pard\plain \s41\li360\widctlpar\adjustright \shading1000\cbpat8 \f2\fs16\cgrid Generate documentation from a given API endpoint and save it to a\par +folder.\par +\par +This function fetches data from the specified API endpoint, processes\par +it, and saves the generated documentation in the provided folder. If an\par +error occurs during the fetching process, a SystemExit exception is\par +raised with an appropriate message.\par +\par +Args:\par + api_url (str): The URL of the API endpoint from which data will be fetched.\par + token (str): The authentication token required to access the API.\par + folder_path (str): The path to the folder where the documentation will be saved.\par +} + \par +}Here is the call graph for this function:{ +\pard\plain +\par\pard \qc {\field\flddirty {\*\fldinst INCLUDEPICTURE "namespacetests_1_1test__doc__commands_a64165ddfdb3071a88422f080f0e529a3_cgraph.svg" \\d \\*MERGEFORMAT}{\fldrslt IMAGE}}\par +} +} +{\xe \v test_handle_docgen_generate\:tests.test_doc_commands} +{\xe \v tests.test_doc_commands\:test_handle_docgen_generate} +\pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid { +{\b +def tests.test_doc_commands.test_handle_docgen_generate ( {\i mock_get_token}, {\i mock_generate_doc}, {\i mock_uninstall_hook}, {\i mock_install_hook})}} +\par +{\bkmkstart AAAAAAAAON} +{\bkmkend AAAAAAAAON} +{ +\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid +{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid +{ +\par +\pard\plain \s41\li360\widctlpar\adjustright \shading1000\cbpat8 \f2\fs16\cgrid Test the direct documentation generation functionality.\par +\par +This function tests the `handle_docgen` function when no subcommand is\par +provided. It verifies that the document generation hook is called and\par +the uninstall and install hooks are not called.\par +\par +Args:\par + mock_get_token (MagicMock): Mocked function to get authentication token.\par + mock_generate_doc (MagicMock): Mocked function for generating documentation.\par + mock_uninstall_hook (MagicMock): Mocked function for uninstalling the document generation hook.\par + mock_install_hook (MagicMock): Mocked function for installing the document generation hook.\par +} + \par +}Here is the call graph for this function:{ +\pard\plain +\par\pard \qc {\field\flddirty {\*\fldinst INCLUDEPICTURE "namespacetests_1_1test__doc__commands_ab158ffa48469b6c097a7a55fcb20c21a_cgraph.svg" \\d \\*MERGEFORMAT}{\fldrslt IMAGE}}\par +} +} +{\xe \v test_handle_docgen_install_hook\:tests.test_doc_commands} +{\xe \v tests.test_doc_commands\:test_handle_docgen_install_hook} +\pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid { +{\b +def tests.test_doc_commands.test_handle_docgen_install_hook ( {\i mock_exit}, {\i mock_get_token}, {\i mock_generate_doc}, {\i mock_uninstall_hook}, {\i mock_install_hook})}} +\par +{\bkmkstart AAAAAAAAOO} +{\bkmkend AAAAAAAAOO} +{ +\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid +{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid +{ +\par +\pard\plain \s41\li360\widctlpar\adjustright \shading1000\cbpat8 \f2\fs16\cgrid Test the handling of the 'install-hook' subcommand.\par +\par +This function sets up a mock environment where it simulates the\par +execution of the 'install-hook' subcommand. It verifies that the\par +`mock_install_hook` is called with the correct arguments, while\par +`mock_generate_doc` and `mock_uninstall_hook` are not called.\par +\par +Args:\par + mock_exit (MagicMock): Mock object for sys.exit.\par + mock_get_token (MagicMock): Mock object to simulate fetching a token.\par + mock_generate_doc (MagicMock): Mock object to simulate generating documentation.\par + mock_uninstall_hook (MagicMock): Mock object to simulate uninstalling a hook.\par + mock_install_hook (MagicMock): Mock object to simulate installing a hook.\par +} + \par +}Here is the call graph for this function:{ +\pard\plain +\par\pard \qc {\field\flddirty {\*\fldinst INCLUDEPICTURE "namespacetests_1_1test__doc__commands_ab74688baa8c9b5ba302c2877a9789d05_cgraph.svg" \\d \\*MERGEFORMAT}{\fldrslt IMAGE}}\par +} +} +{\xe \v test_handle_docgen_no_token\:tests.test_doc_commands} +{\xe \v tests.test_doc_commands\:test_handle_docgen_no_token} +\pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid { +{\b +def tests.test_doc_commands.test_handle_docgen_no_token ( {\i mock_exit}, {\i mock_get_token})}} +\par +{\bkmkstart AAAAAAAAOP} +{\bkmkend AAAAAAAAOP} +{ +\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid +{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid +{ +\par +\pard\plain \s41\li360\widctlpar\adjustright \shading1000\cbpat8 \f2\fs16\cgrid Test the behavior of the `handle_docgen` function when no token is\par +provided.\par +\par +This function asserts that if no token is returned by `mock_get_token`,\par +the `handle_docgen` function will call `mock_exit` with a status code of\par +1.\par +\par +Args:\par + mock_exit (MagicMock): A MagicMock object simulating the `exit` function.\par + mock_get_token (MagicMock): A MagicMock object simulating the `get_token` function.\par +} + \par +}Here is the call graph for this function:{ +\pard\plain +\par\pard \qc {\field\flddirty {\*\fldinst INCLUDEPICTURE "namespacetests_1_1test__doc__commands_af9b01e5fc89255cac96747fa081c442c_cgraph.svg" \\d \\*MERGEFORMAT}{\fldrslt IMAGE}}\par +} +} +{\xe \v test_handle_docgen_uninstall_hook\:tests.test_doc_commands} +{\xe \v tests.test_doc_commands\:test_handle_docgen_uninstall_hook} +\pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid { +{\b +def tests.test_doc_commands.test_handle_docgen_uninstall_hook ( {\i mock_exit}, {\i mock_get_token}, {\i mock_generate_doc}, {\i mock_uninstall_hook}, {\i mock_install_hook})}} +\par +{\bkmkstart AAAAAAAAOQ} +{\bkmkend AAAAAAAAOQ} +{ +\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid +{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid +{ +\par +\pard\plain \s41\li360\widctlpar\adjustright \shading1000\cbpat8 \f2\fs16\cgrid Test the uninstall-hook subcommand of the handle_docgen function.\par +This test case sets up a mock environment and verifies that the\par +uninstall-hook is called with the correct location, while generate_doc\par +and install_hook are not called.\par +\par +Args:\par + mock_exit (MagicMock): A mock for the exit function.\par + mock_get_token (MagicMock): A mock for the get_token function.\par + mock_generate_doc (MagicMock): A mock for the generate_doc function.\par + mock_uninstall_hook (MagicMock): A mock for the uninstall_hook function.\par + mock_install_hook (MagicMock): A mock for the install_hook function.\par +} + \par +}Here is the call graph for this function:{ +\pard\plain +\par\pard \qc {\field\flddirty {\*\fldinst INCLUDEPICTURE "namespacetests_1_1test__doc__commands_a1458af9ad0128c3ca1263b552fd5e482_cgraph.svg" \\d \\*MERGEFORMAT}{\fldrslt IMAGE}}\par +} +} +{\xe \v test_setup_docgen_parser\:tests.test_doc_commands} +{\xe \v tests.test_doc_commands\:test_setup_docgen_parser} +\pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid { +{\b +def tests.test_doc_commands.test_setup_docgen_parser ()}} +\par +{\bkmkstart AAAAAAAAOR} +{\bkmkend AAAAAAAAOR} +{ +\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid +{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid +{ +\par +\pard\plain \s41\li360\widctlpar\adjustright \shading1000\cbpat8 \f2\fs16\cgrid Test the setup_docgen_parser function to ensure it properly configures\par +the ArgumentParser for docgen options.\par +\par +It verifies that the parser correctly sets up docgen options and handles\par +different subcommands like 'install-hook' and 'uninstall-hook'.\par +} + \par +}Here is the call graph for this function:{ +\pard\plain +\par\pard \qc {\field\flddirty {\*\fldinst INCLUDEPICTURE "namespacetests_1_1test__doc__commands_a0f27751d0ba2acfe40ef7e85bccf47d7_cgraph.svg" \\d \\*MERGEFORMAT}{\fldrslt IMAGE}}\par +} +} +\par \pard\plain + +\pard\plain \sect\sbkpage +\s2\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs28\kerning28\cgrid +\pard\plain \s2\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs28\kerning28\cgrid +tests.test_web_config Namespace Reference\par \pard\plain +{\tc\tcl2 \v tests.test_web_config} +{\xe \v tests.test_web_config} +{\bkmkstart AAAAAAAAOS} +{\bkmkend AAAAAAAAOS} +\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid +Classes\par +\pard\plain + +{ +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +class {\b TestWebConfig}\par +} + +\pard\plain \sect\sbkpage +\s1\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs36\kerning36\cgrid +Class Documentation{\tc \v Class Documentation} +\par \pard\plain +\pard\plain \s2\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs28\kerning28\cgrid +penify_hook.api_client.APIClient Class Reference\par \pard\plain +{\tc\tcl2 \v penify_hook.api_client.APIClient} +{\xe \v penify_hook.api_client.APIClient} +{\bkmkstart AAAAAAAAGU} +{\bkmkend AAAAAAAAGU} +Collaboration diagram for penify_hook.api_client.APIClient:{ +\pard\plain +\par\pard \qc {\field\flddirty {\*\fldinst INCLUDEPICTURE "classpenify__hook_1_1api__client_1_1APIClient__coll__graph.svg" \\d \\*MERGEFORMAT}{\fldrslt IMAGE}}\par +} +\par +\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid +Public Member Functions\par +\pard\plain + +{ +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +def {\b __init__} (self, {\b api_url}, str api_token=None, str bearer_token=None)\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +def {\b send_file_for_docstring_generation} (self, file_name, content, line_numbers, repo_details=None)\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +def {\b generate_commit_summary} (self, git_diff, str instruction="", repo_details=None, dict jira_context=None)\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +list[str] {\b get_supported_file_types} (self)\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +def {\b generate_commit_summary_with_llm} (self, diff, message, bool generate_description, repo_details, {\b LLMClient} llm_client, jira_context=None)\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +def {\b get_api_key} (self)\par +} +\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid +Public Attributes\par +\pard\plain + +{ +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +{\b api_url}\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +{\b AUTH_TOKEN}\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +{\b BEARER_TOKEN}\par +} +{\pard\widctlpar\brdrb\brdrs\brdrw5\brsp20 \adjustright \par} +\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid +Constructor & Destructor Documentation\par +\pard\plain +{\xe \v __init__\:penify_hook.api_client.APIClient} +{\xe \v penify_hook.api_client.APIClient\:__init__} +\pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid { +{\b +def penify_hook.api_client.APIClient.__init__ ( {\i self}, {\i api_url}, str {\i api_token} = {\f2 None}, str {\i bearer_token} = {\f2 None})}} +\par +{\bkmkstart AAAAAAAAGV} +{\bkmkend AAAAAAAAGV} +{ +\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid +} +{\pard\widctlpar\brdrb\brdrs\brdrw5\brsp20 \adjustright \par} +\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid +Member Function Documentation\par +\pard\plain +{\xe \v generate_commit_summary\:penify_hook.api_client.APIClient} +{\xe \v penify_hook.api_client.APIClient\:generate_commit_summary} +\pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid { +{\b +def penify_hook.api_client.APIClient.generate_commit_summary ( {\i self}, {\i git_diff}, str {\i instruction} = {\f2 ""}, {\i repo_details} = {\f2 None}, dict {\i jira_context} = {\f2 None})}} +\par +{\bkmkstart AAAAAAAAGW} +{\bkmkend AAAAAAAAGW} +{ +\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid +{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid +{ +\par +\pard\plain \s41\li360\widctlpar\adjustright \shading1000\cbpat8 \f2\fs16\cgrid Generates a commit summary by sending a POST request to the API endpoint.\par +\par +This function constructs a payload containing the git diff and any additional\par +instructions provided. It then sends this payload to a specified API endpoint\par +to generate a summary of the commit. If the request is successful, it returns\par +the response from the API; otherwise, it returns None. The function also\par +handles optional repository details and JIRA context if they are provided.\par +\par +Args:\par + git_diff (str): The git diff of the commit.\par + instruction (str): Additional instruction for the commit. Defaults to "".\par + repo_details (dict): Details of the git repository. Defaults to None.\par + jira_context (dict): JIRA issue details to enhance the commit summary. Defaults to None.\par +\par +Returns:\par + dict: The response from the API if the request is successful, None otherwise.\par +} + \par +}Here is the caller graph for this function:{ +\pard\plain +\par\pard \qc {\field\flddirty {\*\fldinst INCLUDEPICTURE "classpenify__hook_1_1api__client_1_1APIClient_a7ff74798e7d428b4e2f20095287eb2ce_icgraph.svg" \\d \\*MERGEFORMAT}{\fldrslt IMAGE}}\par +} +} +{\xe \v generate_commit_summary_with_llm\:penify_hook.api_client.APIClient} +{\xe \v penify_hook.api_client.APIClient\:generate_commit_summary_with_llm} +\pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid { +{\b +def penify_hook.api_client.APIClient.generate_commit_summary_with_llm ( {\i self}, {\i diff}, {\i message}, bool {\i generate_description}, {\i repo_details}, {\b LLMClient} {\i llm_client}, {\i jira_context} = {\f2 None})}} +\par +{\bkmkstart AAAAAAAAGX} +{\bkmkend AAAAAAAAGX} +{ +\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid +{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid +{ +\par +\pard\plain \s41\li360\widctlpar\adjustright \shading1000\cbpat8 \f2\fs16\cgrid Generates a commit summary using a local LLM client; falls back to API on\par +error.} + \par +}Here is the call graph for this function:{ +\pard\plain +\par\pard \qc {\field\flddirty {\*\fldinst INCLUDEPICTURE "classpenify__hook_1_1api__client_1_1APIClient_ac0ada470b897935f9fb372cd0e7e51e3_cgraph.svg" \\d \\*MERGEFORMAT}{\fldrslt IMAGE}}\par +} +} +{\xe \v get_api_key\:penify_hook.api_client.APIClient} +{\xe \v penify_hook.api_client.APIClient\:get_api_key} +\pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid { +{\b +def penify_hook.api_client.APIClient.get_api_key ( {\i self})}} +\par +{\bkmkstart AAAAAAAAGY} +{\bkmkend AAAAAAAAGY} +{ +\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid +{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid +{ +\par +\pard\plain \s41\li360\widctlpar\adjustright \shading1000\cbpat8 \f2\fs16\cgrid Fetch an API key from a specified URL using a Bearer token.} + \par +}} +{\xe \v get_supported_file_types\:penify_hook.api_client.APIClient} +{\xe \v penify_hook.api_client.APIClient\:get_supported_file_types} +\pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid { +{\b + list[str] penify_hook.api_client.APIClient.get_supported_file_types ( {\i self})}} +\par +{\bkmkstart AAAAAAAAGZ} +{\bkmkend AAAAAAAAGZ} +{ +\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid +{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid +{ +\par +\pard\plain \s41\li360\widctlpar\adjustright \shading1000\cbpat8 \f2\fs16\cgrid Retrieve supported file types from the API or return a default list.} + \par +}} +{\xe \v send_file_for_docstring_generation\:penify_hook.api_client.APIClient} +{\xe \v penify_hook.api_client.APIClient\:send_file_for_docstring_generation} +\pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid { +{\b +def penify_hook.api_client.APIClient.send_file_for_docstring_generation ( {\i self}, {\i file_name}, {\i content}, {\i line_numbers}, {\i repo_details} = {\f2 None})}} +\par +{\bkmkstart AAAAAAAAHA} +{\bkmkend AAAAAAAAHA} +{ +\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid +{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid +{ +\par +\pard\plain \s41\li360\widctlpar\adjustright \shading1000\cbpat8 \f2\fs16\cgrid Send file content and modified lines to the API and return modified content.} + \par +}} +{\pard\widctlpar\brdrb\brdrs\brdrw5\brsp20 \adjustright \par} +\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid +Member Data Documentation\par +\pard\plain +{\xe \v api_url\:penify_hook.api_client.APIClient} +{\xe \v penify_hook.api_client.APIClient\:api_url} +\pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid { +{\b +penify_hook.api_client.APIClient.api_url}} +\par +{\bkmkstart AAAAAAAAHB} +{\bkmkend AAAAAAAAHB} +{ +\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid +} +{\xe \v AUTH_TOKEN\:penify_hook.api_client.APIClient} +{\xe \v penify_hook.api_client.APIClient\:AUTH_TOKEN} +\pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid { +{\b +penify_hook.api_client.APIClient.AUTH_TOKEN}} +\par +{\bkmkstart AAAAAAAAHC} +{\bkmkend AAAAAAAAHC} +{ +\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid +} +{\xe \v BEARER_TOKEN\:penify_hook.api_client.APIClient} +{\xe \v penify_hook.api_client.APIClient\:BEARER_TOKEN} +\pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid { +{\b +penify_hook.api_client.APIClient.BEARER_TOKEN}} +\par +{\bkmkstart AAAAAAAAHD} +{\bkmkend AAAAAAAAHD} +{ +\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid +} +{\pard\widctlpar\brdrb\brdrs\brdrw5\brsp20 \adjustright \par} +The documentation for this class was generated from the following file:{\par +\pard\plain \s121\fi-360\li720\widctlpar\jclisttab\tx720{\*\pn \pnlvlbody\ilvl0\ls2\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +/tmp/github_reposRepoArchDocGenContext/Penify-dev/penify-cli/penify_hook/{\b api_client.py}\par +}\par \pard\plain + +\pard\plain \sect\sbkpage +\s2\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs28\kerning28\cgrid +\pard\plain \s2\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs28\kerning28\cgrid +penify_hook.base_analyzer.BaseAnalyzer Class Reference\par \pard\plain +{\tc\tcl2 \v penify_hook.base_analyzer.BaseAnalyzer} +{\xe \v penify_hook.base_analyzer.BaseAnalyzer} +{\bkmkstart AAAAAAAAHF} +{\bkmkend AAAAAAAAHF} +Inheritance diagram for penify_hook.base_analyzer.BaseAnalyzer:{ +\pard\plain +\par\pard \qc {\field\flddirty {\*\fldinst INCLUDEPICTURE "classpenify__hook_1_1base__analyzer_1_1BaseAnalyzer__inherit__graph.svg" \\d \\*MERGEFORMAT}{\fldrslt IMAGE}}\par +} +\par +Collaboration diagram for penify_hook.base_analyzer.BaseAnalyzer:{ +\pard\plain +\par\pard \qc {\field\flddirty {\*\fldinst INCLUDEPICTURE "classpenify__hook_1_1base__analyzer_1_1BaseAnalyzer__coll__graph.svg" \\d \\*MERGEFORMAT}{\fldrslt IMAGE}}\par +} +\par +\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid +Public Member Functions\par +\pard\plain + +{ +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +def {\b __init__} (self, str {\b folder_path}, {\b APIClient} {\b api_client})\par +} +\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid +Public Attributes\par +\pard\plain + +{ +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +{\b folder_path}\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +{\b repo_path}\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +{\b repo}\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +{\b repo_details}\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +{\b relative_file_path}\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +{\b api_client}\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +{\b supported_file_types}\par +} +{\pard\widctlpar\brdrb\brdrs\brdrw5\brsp20 \adjustright \par} +\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid +Constructor & Destructor Documentation\par +\pard\plain +{\xe \v __init__\:penify_hook.base_analyzer.BaseAnalyzer} +{\xe \v penify_hook.base_analyzer.BaseAnalyzer\:__init__} +\pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid { +{\b +def penify_hook.base_analyzer.BaseAnalyzer.__init__ ( {\i self}, str {\i folder_path}, {\b APIClient} {\i api_client})}} +\par +{\bkmkstart AAAAAAAAHG} +{\bkmkend AAAAAAAAHG} +{ +\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid +\par +{ +Reimplemented in {\b penify_hook.folder_analyzer.FolderAnalyzerGenHook} ({\i p.{\field\fldedit {\*\fldinst PAGEREF AAAAAAAAHH \\*MERGEFORMAT}{\fldrslt pagenum}}}), {\b penify_hook.file_analyzer.FileAnalyzerGenHook} ({\i p.{\field\fldedit {\*\fldinst PAGEREF AAAAAAAAHI \\*MERGEFORMAT}{\fldrslt pagenum}}}), {\b penify_hook.git_analyzer.GitDocGenHook} ({\i p.{\field\fldedit {\*\fldinst PAGEREF AAAAAAAAHJ \\*MERGEFORMAT}{\fldrslt pagenum}}}), and {\b penify_hook.commit_analyzer.CommitDocGenHook} ({\i p.{\field\fldedit {\*\fldinst PAGEREF AAAAAAAAHK \\*MERGEFORMAT}{\fldrslt pagenum}}}).}\par +} +{\pard\widctlpar\brdrb\brdrs\brdrw5\brsp20 \adjustright \par} +\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid +Member Data Documentation\par +\pard\plain +{\xe \v api_client\:penify_hook.base_analyzer.BaseAnalyzer} +{\xe \v penify_hook.base_analyzer.BaseAnalyzer\:api_client} +\pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid { +{\b +penify_hook.base_analyzer.BaseAnalyzer.api_client}} +\par +{\bkmkstart AAAAAAAAHL} +{\bkmkend AAAAAAAAHL} +{ +\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid +} +{\xe \v folder_path\:penify_hook.base_analyzer.BaseAnalyzer} +{\xe \v penify_hook.base_analyzer.BaseAnalyzer\:folder_path} +\pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid { +{\b +penify_hook.base_analyzer.BaseAnalyzer.folder_path}} +\par +{\bkmkstart AAAAAAAAHM} +{\bkmkend AAAAAAAAHM} +{ +\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid +} +{\xe \v relative_file_path\:penify_hook.base_analyzer.BaseAnalyzer} +{\xe \v penify_hook.base_analyzer.BaseAnalyzer\:relative_file_path} +\pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid { +{\b +penify_hook.base_analyzer.BaseAnalyzer.relative_file_path}} +\par +{\bkmkstart AAAAAAAAHN} +{\bkmkend AAAAAAAAHN} +{ +\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid +} +{\xe \v repo\:penify_hook.base_analyzer.BaseAnalyzer} +{\xe \v penify_hook.base_analyzer.BaseAnalyzer\:repo} +\pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid { +{\b +penify_hook.base_analyzer.BaseAnalyzer.repo}} +\par +{\bkmkstart AAAAAAAAHO} +{\bkmkend AAAAAAAAHO} +{ +\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid +} +{\xe \v repo_details\:penify_hook.base_analyzer.BaseAnalyzer} +{\xe \v penify_hook.base_analyzer.BaseAnalyzer\:repo_details} +\pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid { +{\b +penify_hook.base_analyzer.BaseAnalyzer.repo_details}} +\par +{\bkmkstart AAAAAAAAHP} +{\bkmkend AAAAAAAAHP} +{ +\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid +} +{\xe \v repo_path\:penify_hook.base_analyzer.BaseAnalyzer} +{\xe \v penify_hook.base_analyzer.BaseAnalyzer\:repo_path} +\pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid { +{\b +penify_hook.base_analyzer.BaseAnalyzer.repo_path}} +\par +{\bkmkstart AAAAAAAAHQ} +{\bkmkend AAAAAAAAHQ} +{ +\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid +} +{\xe \v supported_file_types\:penify_hook.base_analyzer.BaseAnalyzer} +{\xe \v penify_hook.base_analyzer.BaseAnalyzer\:supported_file_types} +\pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid { +{\b +penify_hook.base_analyzer.BaseAnalyzer.supported_file_types}} +\par +{\bkmkstart AAAAAAAAHR} +{\bkmkend AAAAAAAAHR} +{ +\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid +} +{\pard\widctlpar\brdrb\brdrs\brdrw5\brsp20 \adjustright \par} +The documentation for this class was generated from the following file:{\par +\pard\plain \s121\fi-360\li720\widctlpar\jclisttab\tx720{\*\pn \pnlvlbody\ilvl0\ls2\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +/tmp/github_reposRepoArchDocGenContext/Penify-dev/penify-cli/penify_hook/{\b base_analyzer.py}\par +}\par \pard\plain + +\pard\plain \sect\sbkpage +\s2\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs28\kerning28\cgrid +\pard\plain \s2\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs28\kerning28\cgrid +penify_hook.commit_analyzer.CommitDocGenHook Class Reference\par \pard\plain +{\tc\tcl2 \v penify_hook.commit_analyzer.CommitDocGenHook} +{\xe \v penify_hook.commit_analyzer.CommitDocGenHook} +{\bkmkstart AAAAAAAAIY} +{\bkmkend AAAAAAAAIY} +Inheritance diagram for penify_hook.commit_analyzer.CommitDocGenHook:{ +\pard\plain +\par\pard \qc {\field\flddirty {\*\fldinst INCLUDEPICTURE "classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook__inherit__graph.svg" \\d \\*MERGEFORMAT}{\fldrslt IMAGE}}\par +} +\par +Collaboration diagram for penify_hook.commit_analyzer.CommitDocGenHook:{ +\pard\plain +\par\pard \qc {\field\flddirty {\*\fldinst INCLUDEPICTURE "classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook__coll__graph.svg" \\d \\*MERGEFORMAT}{\fldrslt IMAGE}}\par +} +\par +\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid +Public Member Functions\par +\pard\plain + +{ +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +def {\b __init__} (self, str {\b repo_path}, {\b APIClient} {\b api_client}, {\b llm_client}=None, jira_client=None)\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +dict {\b get_summary} (self, str instruction, bool generate_description)\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +def {\b run} (self, Optional[str] msg, bool edit_commit_message, bool generate_description)\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +tuple {\b process_jira_integration} (self, str title, str description, str msg)\par +} +\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid +Public Attributes\par +\pard\plain + +{ +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +{\b llm_client}\par +} +\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid +Private Member Functions\par +\pard\plain + +{ +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +def {\b _amend_commit} (self)\par +} +{\pard\widctlpar\brdrb\brdrs\brdrw5\brsp20 \adjustright \par} +\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid +Constructor & Destructor Documentation\par +\pard\plain +{\xe \v __init__\:penify_hook.commit_analyzer.CommitDocGenHook} +{\xe \v penify_hook.commit_analyzer.CommitDocGenHook\:__init__} +\pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid { +{\b +def penify_hook.commit_analyzer.CommitDocGenHook.__init__ ( {\i self}, str {\i repo_path}, {\b APIClient} {\i api_client}, {\i llm_client} = {\f2 None}, {\i jira_client} = {\f2 None})}} +\par +{\bkmkstart AAAAAAAAHK} +{\bkmkend AAAAAAAAHK} +{ +\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid +\par +{ +Reimplemented from {\b penify_hook.base_analyzer.BaseAnalyzer} ({\i p.{\field\fldedit {\*\fldinst PAGEREF AAAAAAAAHG \\*MERGEFORMAT}{\fldrslt pagenum}}}).}\par +Here is the call graph for this function:{ +\pard\plain +\par\pard \qc {\field\flddirty {\*\fldinst INCLUDEPICTURE "classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook_af127d86729e226d74dbeb095b008db3e_cgraph.svg" \\d \\*MERGEFORMAT}{\fldrslt IMAGE}}\par +} +Here is the caller graph for this function:{ +\pard\plain +\par\pard \qc {\field\flddirty {\*\fldinst INCLUDEPICTURE "classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook_af127d86729e226d74dbeb095b008db3e_icgraph.svg" \\d \\*MERGEFORMAT}{\fldrslt IMAGE}}\par +} +} +{\pard\widctlpar\brdrb\brdrs\brdrw5\brsp20 \adjustright \par} +\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid +Member Function Documentation\par +\pard\plain +{\xe \v _amend_commit\:penify_hook.commit_analyzer.CommitDocGenHook} +{\xe \v penify_hook.commit_analyzer.CommitDocGenHook\:_amend_commit} +\pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid { +{\b +def penify_hook.commit_analyzer.CommitDocGenHook._amend_commit ( {\i self}){\f2 [private]}}} +\par +{\bkmkstart AAAAAAAAIZ} +{\bkmkend AAAAAAAAIZ} +{ +\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid +{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid +{ +\par +\pard\plain \s41\li360\widctlpar\adjustright \shading1000\cbpat8 \f2\fs16\cgrid Amends the last commit message in the repository.} + \par +}Here is the caller graph for this function:{ +\pard\plain +\par\pard \qc {\field\flddirty {\*\fldinst INCLUDEPICTURE "classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook_ac999c5cbc852a7ec3b412ccb43c274ca_icgraph.svg" \\d \\*MERGEFORMAT}{\fldrslt IMAGE}}\par +} +} +{\xe \v get_summary\:penify_hook.commit_analyzer.CommitDocGenHook} +{\xe \v penify_hook.commit_analyzer.CommitDocGenHook\:get_summary} +\pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid { +{\b + dict penify_hook.commit_analyzer.CommitDocGenHook.get_summary ( {\i self}, str {\i instruction}, bool {\i generate_description})}} +\par +{\bkmkstart AAAAAAAAJA} +{\bkmkend AAAAAAAAJA} +{ +\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid +{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid +{ +\par +\pard\plain \s41\li360\widctlpar\adjustright \shading1000\cbpat8 \f2\fs16\cgrid Generate a summary for the commit based on the staged changes.\par +\par +This function retrieves the differences of the staged changes in the repository\par +and generates a commit summary using the provided instruction. If there are no\par +changes staged for commit, an exception is raised. If a JIRA client is\par +connected, it will attempt to extract issue keys from the current branch and\par +use them to fetch context. The summary can be generated either with a Language\par +Model (LLM) client or through the API client.\par +\par +Args:\par + instruction (str): A string containing instructions for generating the commit summary.\par + generate_description (bool): Whether to include detailed descriptions in the summary.\par +\par +Raises:\par + ValueError: If there are no changes staged for commit.\par +} + \par +}Here is the call graph for this function:{ +\pard\plain +\par\pard \qc {\field\flddirty {\*\fldinst INCLUDEPICTURE "classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook_a8496194276441fa2eb2fa014eaab9a37_cgraph.svg" \\d \\*MERGEFORMAT}{\fldrslt IMAGE}}\par +} +Here is the caller graph for this function:{ +\pard\plain +\par\pard \qc {\field\flddirty {\*\fldinst INCLUDEPICTURE "classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook_a8496194276441fa2eb2fa014eaab9a37_icgraph.svg" \\d \\*MERGEFORMAT}{\fldrslt IMAGE}}\par +} +} +{\xe \v process_jira_integration\:penify_hook.commit_analyzer.CommitDocGenHook} +{\xe \v penify_hook.commit_analyzer.CommitDocGenHook\:process_jira_integration} +\pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid { +{\b + tuple penify_hook.commit_analyzer.CommitDocGenHook.process_jira_integration ( {\i self}, str {\i title}, str {\i description}, str {\i msg})}} +\par +{\bkmkstart AAAAAAAAJB} +{\bkmkend AAAAAAAAJB} +{ +\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid +{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid +{ +\par +\pard\plain \s41\li360\widctlpar\adjustright \shading1000\cbpat8 \f2\fs16\cgrid Process JIRA integration by extracting issue keys from commit message\par +components and branch name.\par +\par +This function looks for JIRA issue keys in the provided commit title,\par +description, original user message, and the active branch name. It uses these\par +keys to update the commit message with JIRA information and adds comments to\par +the corresponding JIRA issues. If no keys are found, it logs a warning.\par +\par +Args:\par + title (str): The generated commit title.\par + description (str): The generated commit description.\par + msg (str): The original user message that might contain JIRA references.\par +\par +Returns:\par + tuple: A tuple containing the updated commit title and description with included JIRA\par + information.\par +} + \par +}Here is the call graph for this function:{ +\pard\plain +\par\pard \qc {\field\flddirty {\*\fldinst INCLUDEPICTURE "classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook_adda13cc121d96342476ccf72b63a007f_cgraph.svg" \\d \\*MERGEFORMAT}{\fldrslt IMAGE}}\par +} +Here is the caller graph for this function:{ +\pard\plain +\par\pard \qc {\field\flddirty {\*\fldinst INCLUDEPICTURE "classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook_adda13cc121d96342476ccf72b63a007f_icgraph.svg" \\d \\*MERGEFORMAT}{\fldrslt IMAGE}}\par +} +} +{\xe \v run\:penify_hook.commit_analyzer.CommitDocGenHook} +{\xe \v penify_hook.commit_analyzer.CommitDocGenHook\:run} +\pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid { +{\b +def penify_hook.commit_analyzer.CommitDocGenHook.run ( {\i self}, Optional[str] {\i msg}, bool {\i edit_commit_message}, bool {\i generate_description})}} +\par +{\bkmkstart AAAAAAAAJC} +{\bkmkend AAAAAAAAJC} +{ +\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid +{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid +{ +\par +\pard\plain \s41\li360\widctlpar\adjustright \shading1000\cbpat8 \f2\fs16\cgrid Run the post-commit hook.\par +\par +This method processes the modified files from the last commit, stages them, and\par +creates an auto-commit with an optional message. It also handles JIRA\par +integration if available. If there is an error generating the commit summary,\par +an exception is raised.\par +\par +Args:\par + msg (Optional[str]): An optional message to include in the commit.\par + edit_commit_message (bool): A flag indicating whether to open the git commit\par + edit terminal after committing.\par + generate_description (bool): A flag indicating whether to include a description\par + in the commit message.\par +} + \par +}Here is the call graph for this function:{ +\pard\plain +\par\pard \qc {\field\flddirty {\*\fldinst INCLUDEPICTURE "classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook_a6370a03f7ed9175ef6f81e931a105ea9_cgraph.svg" \\d \\*MERGEFORMAT}{\fldrslt IMAGE}}\par +} +} +{\pard\widctlpar\brdrb\brdrs\brdrw5\brsp20 \adjustright \par} +\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid +Member Data Documentation\par +\pard\plain +{\xe \v llm_client\:penify_hook.commit_analyzer.CommitDocGenHook} +{\xe \v penify_hook.commit_analyzer.CommitDocGenHook\:llm_client} +\pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid { +{\b +penify_hook.commit_analyzer.CommitDocGenHook.llm_client}} +\par +{\bkmkstart AAAAAAAAJD} +{\bkmkend AAAAAAAAJD} +{ +\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid +} +{\pard\widctlpar\brdrb\brdrs\brdrw5\brsp20 \adjustright \par} +The documentation for this class was generated from the following file:{\par +\pard\plain \s121\fi-360\li720\widctlpar\jclisttab\tx720{\*\pn \pnlvlbody\ilvl0\ls2\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +/tmp/github_reposRepoArchDocGenContext/Penify-dev/penify-cli/penify_hook/{\b commit_analyzer.py}\par +}\par \pard\plain + +\pard\plain \sect\sbkpage +\s2\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs28\kerning28\cgrid +\pard\plain \s2\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs28\kerning28\cgrid +Exception Class Reference\par \pard\plain +{\tc\tcl2 \v Exception} +{\xe \v Exception} +{\bkmkstart AAAAAAAAGR} +{\bkmkend AAAAAAAAGR} +Inheritance diagram for Exception:{ +\pard\plain +\par\pard \qc {\field\flddirty {\*\fldinst INCLUDEPICTURE "classException__inherit__graph.svg" \\d \\*MERGEFORMAT}{\fldrslt IMAGE}}\par +} +\par +Collaboration diagram for Exception:{ +\pard\plain +\par\pard \qc {\field\flddirty {\*\fldinst INCLUDEPICTURE "classException__coll__graph.svg" \\d \\*MERGEFORMAT}{\fldrslt IMAGE}}\par +} +\par +{\pard\widctlpar\brdrb\brdrs\brdrw5\brsp20 \adjustright \par} +The documentation for this class was generated from the following file:{\par +\pard\plain \s121\fi-360\li720\widctlpar\jclisttab\tx720{\*\pn \pnlvlbody\ilvl0\ls2\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +/tmp/github_reposRepoArchDocGenContext/Penify-dev/penify-cli/penify_hook/{\b utils.py}\par +}\par \pard\plain + +\pard\plain \sect\sbkpage +\s2\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs28\kerning28\cgrid +\pard\plain \s2\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs28\kerning28\cgrid +penify_hook.file_analyzer.FileAnalyzerGenHook Class Reference\par \pard\plain +{\tc\tcl2 \v penify_hook.file_analyzer.FileAnalyzerGenHook} +{\xe \v penify_hook.file_analyzer.FileAnalyzerGenHook} +{\bkmkstart AAAAAAAAJM} +{\bkmkend AAAAAAAAJM} +Inheritance diagram for penify_hook.file_analyzer.FileAnalyzerGenHook:{ +\pard\plain +\par\pard \qc {\field\flddirty {\*\fldinst INCLUDEPICTURE "classpenify__hook_1_1file__analyzer_1_1FileAnalyzerGenHook__inherit__graph.svg" \\d \\*MERGEFORMAT}{\fldrslt IMAGE}}\par +} +\par +Collaboration diagram for penify_hook.file_analyzer.FileAnalyzerGenHook:{ +\pard\plain +\par\pard \qc {\field\flddirty {\*\fldinst INCLUDEPICTURE "classpenify__hook_1_1file__analyzer_1_1FileAnalyzerGenHook__coll__graph.svg" \\d \\*MERGEFORMAT}{\fldrslt IMAGE}}\par +} +\par +\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid +Public Member Functions\par +\pard\plain + +{ +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +def {\b __init__} (self, str {\b file_path}, {\b APIClient} {\b api_client})\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +def {\b process_file} (self, {\b file_path}, pbar, str new_param="")\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +def {\b print_processing} (self, {\b file_path})\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +def {\b run} (self)\par +} +\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid +Public Attributes\par +\pard\plain + +{ +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +{\b file_path}\par +} +{\pard\widctlpar\brdrb\brdrs\brdrw5\brsp20 \adjustright \par} +\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid +Constructor & Destructor Documentation\par +\pard\plain +{\xe \v __init__\:penify_hook.file_analyzer.FileAnalyzerGenHook} +{\xe \v penify_hook.file_analyzer.FileAnalyzerGenHook\:__init__} +\pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid { +{\b +def penify_hook.file_analyzer.FileAnalyzerGenHook.__init__ ( {\i self}, str {\i file_path}, {\b APIClient} {\i api_client})}} +\par +{\bkmkstart AAAAAAAAHI} +{\bkmkend AAAAAAAAHI} +{ +\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid +\par +{ +Reimplemented from {\b penify_hook.base_analyzer.BaseAnalyzer} ({\i p.{\field\fldedit {\*\fldinst PAGEREF AAAAAAAAHG \\*MERGEFORMAT}{\fldrslt pagenum}}}).}\par +} +{\pard\widctlpar\brdrb\brdrs\brdrw5\brsp20 \adjustright \par} +\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid +Member Function Documentation\par +\pard\plain +{\xe \v print_processing\:penify_hook.file_analyzer.FileAnalyzerGenHook} +{\xe \v penify_hook.file_analyzer.FileAnalyzerGenHook\:print_processing} +\pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid { +{\b +def penify_hook.file_analyzer.FileAnalyzerGenHook.print_processing ( {\i self}, {\i file_path})}} +\par +{\bkmkstart AAAAAAAAJN} +{\bkmkend AAAAAAAAJN} +{ +\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid +{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid +{ +\par +\pard\plain \s41\li360\widctlpar\adjustright \shading1000\cbpat8 \f2\fs16\cgrid Prints a message indicating that a file is being processed.} + \par +}Here is the call graph for this function:{ +\pard\plain +\par\pard \qc {\field\flddirty {\*\fldinst INCLUDEPICTURE "classpenify__hook_1_1file__analyzer_1_1FileAnalyzerGenHook_a6ab39391dfb7686f2a2d21a702dd3073_cgraph.svg" \\d \\*MERGEFORMAT}{\fldrslt IMAGE}}\par +} +} +{\xe \v process_file\:penify_hook.file_analyzer.FileAnalyzerGenHook} +{\xe \v penify_hook.file_analyzer.FileAnalyzerGenHook\:process_file} +\pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid { +{\b +def penify_hook.file_analyzer.FileAnalyzerGenHook.process_file ( {\i self}, {\i file_path}, {\i pbar}, str {\i new_param} = {\f2 ""})}} +\par +{\bkmkstart AAAAAAAAJO} +{\bkmkend AAAAAAAAJO} +{ +\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid +{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid +{ +\par +\pard\plain \s41\li360\widctlpar\adjustright \shading1000\cbpat8 \f2\fs16\cgrid Processes a file by validating its extension, reading content,\par +generating documentation, and writing changes back to the file. The function\par +performs several stages of processing: 1. Validates the file's extension to\par +ensure it is supported. 2. Reads the content of the file. 3. Sends the file\par +content for documentation generation. 4. Writes the generated documentation\par +back to the file if there are changes.\par +\par +Args:\par + file_path (str): The path of the file to be processed.\par + pbar (tqdm.tqdm): A progress bar object to update the status of processing stages.\par + new_param (str?): An additional parameter for future use. Defaults to an empty string.} + \par +}Here is the call graph for this function:{ +\pard\plain +\par\pard \qc {\field\flddirty {\*\fldinst INCLUDEPICTURE "classpenify__hook_1_1file__analyzer_1_1FileAnalyzerGenHook_a2cc6c22ef588fccf3eed9bbc57fb6d6e_cgraph.svg" \\d \\*MERGEFORMAT}{\fldrslt IMAGE}}\par +} +Here is the caller graph for this function:{ +\pard\plain +\par\pard \qc {\field\flddirty {\*\fldinst INCLUDEPICTURE "classpenify__hook_1_1file__analyzer_1_1FileAnalyzerGenHook_a2cc6c22ef588fccf3eed9bbc57fb6d6e_icgraph.svg" \\d \\*MERGEFORMAT}{\fldrslt IMAGE}}\par +} +} +{\xe \v run\:penify_hook.file_analyzer.FileAnalyzerGenHook} +{\xe \v penify_hook.file_analyzer.FileAnalyzerGenHook\:run} +\pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid { +{\b +def penify_hook.file_analyzer.FileAnalyzerGenHook.run ( {\i self})}} +\par +{\bkmkstart AAAAAAAAJP} +{\bkmkend AAAAAAAAJP} +{ +\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid +{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid +{ +\par +\pard\plain \s41\li360\widctlpar\adjustright \shading1000\cbpat8 \f2\fs16\cgrid Runs the documentation process with a progress bar.\par +\par +This method orchestrates the documentation process by creating a progress bar,\par +processing the file, and handling exceptions to ensure the progress bar\par +completes properly. It updates the progress bar through various stages and\par +provides feedback based on the result of the file processing.\par +} + \par +}Here is the call graph for this function:{ +\pard\plain +\par\pard \qc {\field\flddirty {\*\fldinst INCLUDEPICTURE "classpenify__hook_1_1file__analyzer_1_1FileAnalyzerGenHook_a4f4dffbc432fac3e259d957dd1e187f1_cgraph.svg" \\d \\*MERGEFORMAT}{\fldrslt IMAGE}}\par +} +} +{\pard\widctlpar\brdrb\brdrs\brdrw5\brsp20 \adjustright \par} +\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid +Member Data Documentation\par +\pard\plain +{\xe \v file_path\:penify_hook.file_analyzer.FileAnalyzerGenHook} +{\xe \v penify_hook.file_analyzer.FileAnalyzerGenHook\:file_path} +\pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid { +{\b +penify_hook.file_analyzer.FileAnalyzerGenHook.file_path}} +\par +{\bkmkstart AAAAAAAAJQ} +{\bkmkend AAAAAAAAJQ} +{ +\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid +} +{\pard\widctlpar\brdrb\brdrs\brdrw5\brsp20 \adjustright \par} +The documentation for this class was generated from the following file:{\par +\pard\plain \s121\fi-360\li720\widctlpar\jclisttab\tx720{\*\pn \pnlvlbody\ilvl0\ls2\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +/tmp/github_reposRepoArchDocGenContext/Penify-dev/penify-cli/penify_hook/{\b file_analyzer.py}\par +}\par \pard\plain + +\pard\plain \sect\sbkpage +\s2\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs28\kerning28\cgrid +\pard\plain \s2\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs28\kerning28\cgrid +penify_hook.folder_analyzer.FolderAnalyzerGenHook Class Reference\par \pard\plain +{\tc\tcl2 \v penify_hook.folder_analyzer.FolderAnalyzerGenHook} +{\xe \v penify_hook.folder_analyzer.FolderAnalyzerGenHook} +{\bkmkstart AAAAAAAAJS} +{\bkmkend AAAAAAAAJS} +Inheritance diagram for penify_hook.folder_analyzer.FolderAnalyzerGenHook:{ +\pard\plain +\par\pard \qc {\field\flddirty {\*\fldinst INCLUDEPICTURE "classpenify__hook_1_1folder__analyzer_1_1FolderAnalyzerGenHook__inherit__graph.svg" \\d \\*MERGEFORMAT}{\fldrslt IMAGE}}\par +} +\par +Collaboration diagram for penify_hook.folder_analyzer.FolderAnalyzerGenHook:{ +\pard\plain +\par\pard \qc {\field\flddirty {\*\fldinst INCLUDEPICTURE "classpenify__hook_1_1folder__analyzer_1_1FolderAnalyzerGenHook__coll__graph.svg" \\d \\*MERGEFORMAT}{\fldrslt IMAGE}}\par +} +\par +\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid +Public Member Functions\par +\pard\plain + +{ +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +def {\b __init__} (self, str {\b dir_path}, {\b APIClient} {\b api_client})\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +def {\b list_all_files_in_dir} (self, str {\b dir_path})\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +def {\b run} (self)\par +} +\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid +Public Attributes\par +\pard\plain + +{ +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +{\b dir_path}\par +} +{\pard\widctlpar\brdrb\brdrs\brdrw5\brsp20 \adjustright \par} +\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid +Constructor & Destructor Documentation\par +\pard\plain +{\xe \v __init__\:penify_hook.folder_analyzer.FolderAnalyzerGenHook} +{\xe \v penify_hook.folder_analyzer.FolderAnalyzerGenHook\:__init__} +\pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid { +{\b +def penify_hook.folder_analyzer.FolderAnalyzerGenHook.__init__ ( {\i self}, str {\i dir_path}, {\b APIClient} {\i api_client})}} +\par +{\bkmkstart AAAAAAAAHH} +{\bkmkend AAAAAAAAHH} +{ +\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid +\par +{ +Reimplemented from {\b penify_hook.base_analyzer.BaseAnalyzer} ({\i p.{\field\fldedit {\*\fldinst PAGEREF AAAAAAAAHG \\*MERGEFORMAT}{\fldrslt pagenum}}}).}\par +} +{\pard\widctlpar\brdrb\brdrs\brdrw5\brsp20 \adjustright \par} +\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid +Member Function Documentation\par +\pard\plain +{\xe \v list_all_files_in_dir\:penify_hook.folder_analyzer.FolderAnalyzerGenHook} +{\xe \v penify_hook.folder_analyzer.FolderAnalyzerGenHook\:list_all_files_in_dir} +\pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid { +{\b +def penify_hook.folder_analyzer.FolderAnalyzerGenHook.list_all_files_in_dir ( {\i self}, str {\i dir_path})}} +\par +{\bkmkstart AAAAAAAAJT} +{\bkmkend AAAAAAAAJT} +{ +\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid +{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid +{ +\par +\pard\plain \s41\li360\widctlpar\adjustright \shading1000\cbpat8 \f2\fs16\cgrid List all non-hidden files in a directory and its subdirectories.\par +\par +This function recursively traverses the specified directory and its\par +subdirectories, collecting paths of all non-hidden files. It filters out hidden\par +directories and files (those starting with a dot) to ensure only visible files\par +are returned.\par +\par +Args:\par + dir_path (str): The path to the directory whose files and subdirectory files need to be listed.\par +} + \par +}Here is the caller graph for this function:{ +\pard\plain +\par\pard \qc {\field\flddirty {\*\fldinst INCLUDEPICTURE "classpenify__hook_1_1folder__analyzer_1_1FolderAnalyzerGenHook_a70b845318fc7ac3b607daf26378e19ec_icgraph.svg" \\d \\*MERGEFORMAT}{\fldrslt IMAGE}}\par +} +} +{\xe \v run\:penify_hook.folder_analyzer.FolderAnalyzerGenHook} +{\xe \v penify_hook.folder_analyzer.FolderAnalyzerGenHook\:run} +\pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid { +{\b +def penify_hook.folder_analyzer.FolderAnalyzerGenHook.run ( {\i self})}} +\par +{\bkmkstart AAAAAAAAJU} +{\bkmkend AAAAAAAAJU} +{ +\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid +{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid +{ +\par +\pard\plain \s41\li360\widctlpar\adjustright \shading1000\cbpat8 \f2\fs16\cgrid Run the post-commit hook and process files with a progress bar.} + \par +}Here is the call graph for this function:{ +\pard\plain +\par\pard \qc {\field\flddirty {\*\fldinst INCLUDEPICTURE "classpenify__hook_1_1folder__analyzer_1_1FolderAnalyzerGenHook_afd189d1b8c773bf710a899eb21fd76cc_cgraph.svg" \\d \\*MERGEFORMAT}{\fldrslt IMAGE}}\par +} +} +{\pard\widctlpar\brdrb\brdrs\brdrw5\brsp20 \adjustright \par} +\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid +Member Data Documentation\par +\pard\plain +{\xe \v dir_path\:penify_hook.folder_analyzer.FolderAnalyzerGenHook} +{\xe \v penify_hook.folder_analyzer.FolderAnalyzerGenHook\:dir_path} +\pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid { +{\b +penify_hook.folder_analyzer.FolderAnalyzerGenHook.dir_path}} +\par +{\bkmkstart AAAAAAAAJV} +{\bkmkend AAAAAAAAJV} +{ +\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid +} +{\pard\widctlpar\brdrb\brdrs\brdrw5\brsp20 \adjustright \par} +The documentation for this class was generated from the following file:{\par +\pard\plain \s121\fi-360\li720\widctlpar\jclisttab\tx720{\*\pn \pnlvlbody\ilvl0\ls2\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +/tmp/github_reposRepoArchDocGenContext/Penify-dev/penify-cli/penify_hook/{\b folder_analyzer.py}\par +}\par \pard\plain + +\pard\plain \sect\sbkpage +\s2\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs28\kerning28\cgrid +\pard\plain \s2\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs28\kerning28\cgrid +penify_hook.git_analyzer.GitDocGenHook Class Reference\par \pard\plain +{\tc\tcl2 \v penify_hook.git_analyzer.GitDocGenHook} +{\xe \v penify_hook.git_analyzer.GitDocGenHook} +{\bkmkstart AAAAAAAAJY} +{\bkmkend AAAAAAAAJY} +Inheritance diagram for penify_hook.git_analyzer.GitDocGenHook:{ +\pard\plain +\par\pard \qc {\field\flddirty {\*\fldinst INCLUDEPICTURE "classpenify__hook_1_1git__analyzer_1_1GitDocGenHook__inherit__graph.svg" \\d \\*MERGEFORMAT}{\fldrslt IMAGE}}\par +} +\par +Collaboration diagram for penify_hook.git_analyzer.GitDocGenHook:{ +\pard\plain +\par\pard \qc {\field\flddirty {\*\fldinst INCLUDEPICTURE "classpenify__hook_1_1git__analyzer_1_1GitDocGenHook__coll__graph.svg" \\d \\*MERGEFORMAT}{\fldrslt IMAGE}}\par +} +\par +\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid +Public Member Functions\par +\pard\plain + +{ +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +def {\b __init__} (self, str {\b repo_path}, {\b APIClient} {\b api_client})\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +def {\b get_modified_files_in_last_commit} (self)\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +def {\b get_modified_lines} (self, diff_text)\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +def {\b process_file} (self, file_path)\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +def {\b run} (self)\par +} +\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid +Additional Inherited Members\par +\pard\plain +{\pard\widctlpar\brdrb\brdrs\brdrw5\brsp20 \adjustright \par} +\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid +Constructor & Destructor Documentation\par +\pard\plain +{\xe \v __init__\:penify_hook.git_analyzer.GitDocGenHook} +{\xe \v penify_hook.git_analyzer.GitDocGenHook\:__init__} +\pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid { +{\b +def penify_hook.git_analyzer.GitDocGenHook.__init__ ( {\i self}, str {\i repo_path}, {\b APIClient} {\i api_client})}} +\par +{\bkmkstart AAAAAAAAHJ} +{\bkmkend AAAAAAAAHJ} +{ +\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid +\par +{ +Reimplemented from {\b penify_hook.base_analyzer.BaseAnalyzer} ({\i p.{\field\fldedit {\*\fldinst PAGEREF AAAAAAAAHG \\*MERGEFORMAT}{\fldrslt pagenum}}}).}\par +Here is the call graph for this function:{ +\pard\plain +\par\pard \qc {\field\flddirty {\*\fldinst INCLUDEPICTURE "classpenify__hook_1_1git__analyzer_1_1GitDocGenHook_a92275fddb43dbef6dfdb6c1ed6e96d0c_cgraph.svg" \\d \\*MERGEFORMAT}{\fldrslt IMAGE}}\par +} +Here is the caller graph for this function:{ +\pard\plain +\par\pard \qc {\field\flddirty {\*\fldinst INCLUDEPICTURE "classpenify__hook_1_1git__analyzer_1_1GitDocGenHook_a92275fddb43dbef6dfdb6c1ed6e96d0c_icgraph.svg" \\d \\*MERGEFORMAT}{\fldrslt IMAGE}}\par +} +} +{\pard\widctlpar\brdrb\brdrs\brdrw5\brsp20 \adjustright \par} +\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid +Member Function Documentation\par +\pard\plain +{\xe \v get_modified_files_in_last_commit\:penify_hook.git_analyzer.GitDocGenHook} +{\xe \v penify_hook.git_analyzer.GitDocGenHook\:get_modified_files_in_last_commit} +\pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid { +{\b +def penify_hook.git_analyzer.GitDocGenHook.get_modified_files_in_last_commit ( {\i self})}} +\par +{\bkmkstart AAAAAAAAJZ} +{\bkmkend AAAAAAAAJZ} +{ +\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid +{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid +{ +\par +\pard\plain \s41\li360\widctlpar\adjustright \shading1000\cbpat8 \f2\fs16\cgrid Get the list of files modified in the last commit.} + \par +}Here is the caller graph for this function:{ +\pard\plain +\par\pard \qc {\field\flddirty {\*\fldinst INCLUDEPICTURE "classpenify__hook_1_1git__analyzer_1_1GitDocGenHook_a17549766100e91eb94b5f1a1d34bf481_icgraph.svg" \\d \\*MERGEFORMAT}{\fldrslt IMAGE}}\par +} +} +{\xe \v get_modified_lines\:penify_hook.git_analyzer.GitDocGenHook} +{\xe \v penify_hook.git_analyzer.GitDocGenHook\:get_modified_lines} +\pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid { +{\b +def penify_hook.git_analyzer.GitDocGenHook.get_modified_lines ( {\i self}, {\i diff_text})}} +\par +{\bkmkstart AAAAAAAAKA} +{\bkmkend AAAAAAAAKA} +{ +\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid +{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid +{ +\par +\pard\plain \s41\li360\widctlpar\adjustright \shading1000\cbpat8 \f2\fs16\cgrid Extract modified line numbers from a diff text.\par +\par +This function processes a diff text to identify and extract the line numbers\par +that have been modified. It distinguishes between added and deleted lines and\par +keeps track of the current line number as it parses through the diff. The\par +function handles hunk headers and ensures that any deletions at the end of the\par +file are also captured.\par +\par +Args:\par + diff_text (str): A string containing the diff text to be processed.\par +} + \par +}Here is the caller graph for this function:{ +\pard\plain +\par\pard \qc {\field\flddirty {\*\fldinst INCLUDEPICTURE "classpenify__hook_1_1git__analyzer_1_1GitDocGenHook_a974d2f51315ed6a1965a7fd7e2ced0cd_icgraph.svg" \\d \\*MERGEFORMAT}{\fldrslt IMAGE}}\par +} +} +{\xe \v process_file\:penify_hook.git_analyzer.GitDocGenHook} +{\xe \v penify_hook.git_analyzer.GitDocGenHook\:process_file} +\pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid { +{\b +def penify_hook.git_analyzer.GitDocGenHook.process_file ( {\i self}, {\i file_path})}} +\par +{\bkmkstart AAAAAAAAKB} +{\bkmkend AAAAAAAAKB} +{ +\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid +{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid +{ +\par +\pard\plain \s41\li360\widctlpar\adjustright \shading1000\cbpat8 \f2\fs16\cgrid Processes a file by checking its type, reading its content, and sending it to\par +an API.\par +\par +This method constructs the absolute path of the specified file and verifies if\par +the file has a valid extension. If the file type is supported, it reads the\par +content of the file and retrieves the differences from the last commit in the\par +repository. If changes are detected, it sends the file content along with the\par +modified lines to an API for further processing. If the API response indicates\par +no changes, the original file will not be overwritten.\par +\par +Args:\par + file_path (str): The relative path to the file to be processed.\par +} + \par +}Here is the call graph for this function:{ +\pard\plain +\par\pard \qc {\field\flddirty {\*\fldinst INCLUDEPICTURE "classpenify__hook_1_1git__analyzer_1_1GitDocGenHook_a05313caa22b173ce75638f0db08eeb85_cgraph.svg" \\d \\*MERGEFORMAT}{\fldrslt IMAGE}}\par +} +Here is the caller graph for this function:{ +\pard\plain +\par\pard \qc {\field\flddirty {\*\fldinst INCLUDEPICTURE "classpenify__hook_1_1git__analyzer_1_1GitDocGenHook_a05313caa22b173ce75638f0db08eeb85_icgraph.svg" \\d \\*MERGEFORMAT}{\fldrslt IMAGE}}\par +} +} +{\xe \v run\:penify_hook.git_analyzer.GitDocGenHook} +{\xe \v penify_hook.git_analyzer.GitDocGenHook\:run} +\pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid { +{\b +def penify_hook.git_analyzer.GitDocGenHook.run ( {\i self})}} +\par +{\bkmkstart AAAAAAAAKC} +{\bkmkend AAAAAAAAKC} +{ +\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid +{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid +{ +\par +\pard\plain \s41\li360\widctlpar\adjustright \shading1000\cbpat8 \f2\fs16\cgrid Run the post-commit hook.\par +\par +This method retrieves the list of modified files from the last commit and\par +processes each file. It stages any files that have been modified during\par +processing and creates an auto-commit if changes were made. A progress bar is\par +displayed to indicate the processing status of each file. The method handles\par +any exceptions that occur during file processing, printing an error message for\par +each file that fails to process. If any modifications are made to the files, an\par +auto-commit is created to save those changes.\par +} + \par +}Here is the call graph for this function:{ +\pard\plain +\par\pard \qc {\field\flddirty {\*\fldinst INCLUDEPICTURE "classpenify__hook_1_1git__analyzer_1_1GitDocGenHook_a3beba14e92d717391a74bb70b1fab0ae_cgraph.svg" \\d \\*MERGEFORMAT}{\fldrslt IMAGE}}\par +} +} +{\pard\widctlpar\brdrb\brdrs\brdrw5\brsp20 \adjustright \par} +The documentation for this class was generated from the following file:{\par +\pard\plain \s121\fi-360\li720\widctlpar\jclisttab\tx720{\*\pn \pnlvlbody\ilvl0\ls2\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +/tmp/github_reposRepoArchDocGenContext/Penify-dev/penify-cli/penify_hook/{\b git_analyzer.py}\par +}\par \pard\plain + +\pard\plain \sect\sbkpage +\s2\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs28\kerning28\cgrid +\pard\plain \s2\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs28\kerning28\cgrid +penify_hook.utils.GitRepoNotFoundError Class Reference\par \pard\plain +{\tc\tcl2 \v penify_hook.utils.GitRepoNotFoundError} +{\xe \v penify_hook.utils.GitRepoNotFoundError} +{\bkmkstart AAAAAAAAMN} +{\bkmkend AAAAAAAAMN} +Inheritance diagram for penify_hook.utils.GitRepoNotFoundError:{ +\pard\plain +\par\pard \qc {\field\flddirty {\*\fldinst INCLUDEPICTURE "classpenify__hook_1_1utils_1_1GitRepoNotFoundError__inherit__graph.svg" \\d \\*MERGEFORMAT}{\fldrslt IMAGE}}\par +} +\par +Collaboration diagram for penify_hook.utils.GitRepoNotFoundError:{ +\pard\plain +\par\pard \qc {\field\flddirty {\*\fldinst INCLUDEPICTURE "classpenify__hook_1_1utils_1_1GitRepoNotFoundError__coll__graph.svg" \\d \\*MERGEFORMAT}{\fldrslt IMAGE}}\par +} +\par +{\pard\widctlpar\brdrb\brdrs\brdrw5\brsp20 \adjustright \par} +The documentation for this class was generated from the following file:{\par +\pard\plain \s121\fi-360\li720\widctlpar\jclisttab\tx720{\*\pn \pnlvlbody\ilvl0\ls2\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +/tmp/github_reposRepoArchDocGenContext/Penify-dev/penify-cli/penify_hook/{\b utils.py}\par +}\par \pard\plain + +\pard\plain \sect\sbkpage +\s2\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs28\kerning28\cgrid +\pard\plain \s2\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs28\kerning28\cgrid +penify_hook.jira_client.JiraClient Class Reference\par \pard\plain +{\tc\tcl2 \v penify_hook.jira_client.JiraClient} +{\xe \v penify_hook.jira_client.JiraClient} +{\bkmkstart AAAAAAAAKF} +{\bkmkend AAAAAAAAKF} +Collaboration diagram for penify_hook.jira_client.JiraClient:{ +\pard\plain +\par\pard \qc {\field\flddirty {\*\fldinst INCLUDEPICTURE "classpenify__hook_1_1jira__client_1_1JiraClient__coll__graph.svg" \\d \\*MERGEFORMAT}{\fldrslt IMAGE}}\par +} +\par +\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid +Public Member Functions\par +\pard\plain + +{ +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +def {\b __init__} (self, str {\b jira_url}=None, str {\b jira_user}=None, str {\b jira_api_token}=None)\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +bool {\b is_connected} (self)\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +List[str] {\b extract_issue_keys_from_branch} (self, str branch_name)\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +List[str] {\b extract_issue_keys} (self, str text)\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +Optional[Dict[str, Any]] {\b get_issue_details} (self, str issue_key)\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +bool {\b add_comment} (self, str issue_key, str comment)\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +bool {\b update_issue_status} (self, str issue_key, str transition_name)\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +tuple {\b format_commit_message_with_jira_info} (self, str commit_title, str commit_description, List[str] issue_keys=None)\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +Dict[str, Any] {\b get_detailed_issue_context} (self, str issue_key)\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +Dict[str, Any] {\b get_commit_context_from_issues} (self, List[str] issue_keys)\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +tuple {\b enhance_commit_message} (self, str title, str description, List[str] issue_keys)\par +} +\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid +Public Attributes\par +\pard\plain + +{ +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +{\b jira_url}\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +{\b jira_user}\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +{\b jira_api_token}\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +{\b jira_client}\par +} +{\pard\widctlpar\brdrb\brdrs\brdrw5\brsp20 \adjustright \par} +\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid +Detailed Description\par +\pard\plain +{ +\pard\plain \s17\sa60\sb30\widctlpar\qj \fs22\cgrid {\s17\sa60\sb30\widctlpar\qj \fs22\cgrid +{ +\par +\pard\plain \s40\li0\widctlpar\adjustright \shading1000\cbpat8 \f2\fs16\cgrid Client for interacting with JIRA API\par +} + \par +}} +{\pard\widctlpar\brdrb\brdrs\brdrw5\brsp20 \adjustright \par} +\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid +Constructor & Destructor Documentation\par +\pard\plain +{\xe \v __init__\:penify_hook.jira_client.JiraClient} +{\xe \v penify_hook.jira_client.JiraClient\:__init__} +\pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid { +{\b +def penify_hook.jira_client.JiraClient.__init__ ( {\i self}, str {\i jira_url} = {\f2 None}, str {\i jira_user} = {\f2 None}, str {\i jira_api_token} = {\f2 None})}} +\par +{\bkmkstart AAAAAAAAKG} +{\bkmkend AAAAAAAAKG} +{ +\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid +{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid +{ +\par +\pard\plain \s41\li360\widctlpar\adjustright \shading1000\cbpat8 \f2\fs16\cgrid Initialize the JIRA client.\par +\par +Args:\par + jira_url: Base URL for JIRA instance (e.g., "https://your-domain.atlassian.net")\par + jira_user: JIRA username or email\par + jira_api_token: JIRA API token\par +} + \par +}} +{\pard\widctlpar\brdrb\brdrs\brdrw5\brsp20 \adjustright \par} +\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid +Member Function Documentation\par +\pard\plain +{\xe \v add_comment\:penify_hook.jira_client.JiraClient} +{\xe \v penify_hook.jira_client.JiraClient\:add_comment} +\pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid { +{\b + bool penify_hook.jira_client.JiraClient.add_comment ( {\i self}, str {\i issue_key}, str {\i comment})}} +\par +{\bkmkstart AAAAAAAAKH} +{\bkmkend AAAAAAAAKH} +{ +\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid +{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid +{ +\par +\pard\plain \s41\li360\widctlpar\adjustright \shading1000\cbpat8 \f2\fs16\cgrid Adds a comment to a JIRA issue.} + \par +}Here is the call graph for this function:{ +\pard\plain +\par\pard \qc {\field\flddirty {\*\fldinst INCLUDEPICTURE "classpenify__hook_1_1jira__client_1_1JiraClient_aa1f374116c64cd5f1492ec7f7e40f9c1_cgraph.svg" \\d \\*MERGEFORMAT}{\fldrslt IMAGE}}\par +} +Here is the caller graph for this function:{ +\pard\plain +\par\pard \qc {\field\flddirty {\*\fldinst INCLUDEPICTURE "classpenify__hook_1_1jira__client_1_1JiraClient_aa1f374116c64cd5f1492ec7f7e40f9c1_icgraph.svg" \\d \\*MERGEFORMAT}{\fldrslt IMAGE}}\par +} +} +{\xe \v enhance_commit_message\:penify_hook.jira_client.JiraClient} +{\xe \v penify_hook.jira_client.JiraClient\:enhance_commit_message} +\pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid { +{\b + tuple penify_hook.jira_client.JiraClient.enhance_commit_message ( {\i self}, str {\i title}, str {\i description}, List[str] {\i issue_keys})}} +\par +{\bkmkstart AAAAAAAAKI} +{\bkmkend AAAAAAAAKI} +{ +\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid +{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid +{ +\par +\pard\plain \s41\li360\widctlpar\adjustright \shading1000\cbpat8 \f2\fs16\cgrid Enhance a commit message with business and technical context from JIRA issues.\par +\par +This function first checks if the list of issue keys is empty or if there is no\par +connection. If so, it returns the original title and description without\par +modification. It then retrieves context information from the specified JIRA\par +issues. If the primary issue is missing, it formats the commit message with\par +basic JIRA info. The function enhances the commit title by prefixing it with\par +the primary issue key if not already included. It appends a business context\par +section to the description, including details like issue type, status,\par +priority, sprint, acceptance criteria, and a condensed issue description. If\par +comments are available, they are added as technical notes. Finally, related\par +issues are listed.\par +\par +Args:\par + title (str): Original commit title.\par + description (str): Original commit description.\par + issue_keys (List[str]): List of JIRA issue keys to include in the enhanced commit message.\par +\par +Returns:\par + tuple: A tuple containing the enhanced commit title and description with added\par + context from JIRA issues.\par +} + \par +}Here is the call graph for this function:{ +\pard\plain +\par\pard \qc {\field\flddirty {\*\fldinst INCLUDEPICTURE "classpenify__hook_1_1jira__client_1_1JiraClient_a70d2c5a6432aa6f238da0ff65d49a760_cgraph.svg" \\d \\*MERGEFORMAT}{\fldrslt IMAGE}}\par +} +} +{\xe \v extract_issue_keys\:penify_hook.jira_client.JiraClient} +{\xe \v penify_hook.jira_client.JiraClient\:extract_issue_keys} +\pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid { +{\b + List[str] penify_hook.jira_client.JiraClient.extract_issue_keys ( {\i self}, str {\i text})}} +\par +{\bkmkstart AAAAAAAAKJ} +{\bkmkend AAAAAAAAKJ} +{ +\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid +{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid +{ +\par +\pard\plain \s41\li360\widctlpar\adjustright \shading1000\cbpat8 \f2\fs16\cgrid Extract unique JIRA issue keys from the given text.} + \par +}Here is the caller graph for this function:{ +\pard\plain +\par\pard \qc {\field\flddirty {\*\fldinst INCLUDEPICTURE "classpenify__hook_1_1jira__client_1_1JiraClient_ad2823ad1d3baaedd38039913c3a97fd7_icgraph.svg" \\d \\*MERGEFORMAT}{\fldrslt IMAGE}}\par +} +} +{\xe \v extract_issue_keys_from_branch\:penify_hook.jira_client.JiraClient} +{\xe \v penify_hook.jira_client.JiraClient\:extract_issue_keys_from_branch} +\pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid { +{\b + List[str] penify_hook.jira_client.JiraClient.extract_issue_keys_from_branch ( {\i self}, str {\i branch_name})}} +\par +{\bkmkstart AAAAAAAAKK} +{\bkmkend AAAAAAAAKK} +{ +\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid +{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid +{ +\par +\pard\plain \s41\li360\widctlpar\adjustright \shading1000\cbpat8 \f2\fs16\cgrid Extracts unique JIRA issue keys from a branch name.} + \par +}Here is the call graph for this function:{ +\pard\plain +\par\pard \qc {\field\flddirty {\*\fldinst INCLUDEPICTURE "classpenify__hook_1_1jira__client_1_1JiraClient_a093d6456fe053ef7a7862d5d6851910c_cgraph.svg" \\d \\*MERGEFORMAT}{\fldrslt IMAGE}}\par +} +} +{\xe \v format_commit_message_with_jira_info\:penify_hook.jira_client.JiraClient} +{\xe \v penify_hook.jira_client.JiraClient\:format_commit_message_with_jira_info} +\pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid { +{\b + tuple penify_hook.jira_client.JiraClient.format_commit_message_with_jira_info ( {\i self}, str {\i commit_title}, str {\i commit_description}, List[str] {\i issue_keys} = {\f2 None})}} +\par +{\bkmkstart AAAAAAAAKL} +{\bkmkend AAAAAAAAKL} +{ +\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid +{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid +{ +\par +\pard\plain \s41\li360\widctlpar\adjustright \shading1000\cbpat8 \f2\fs16\cgrid Format commit message with JIRA issue information.\par +\par +This function updates the provided commit title and description by\par +incorporating JIRA issue keys. If no issue keys are supplied, it extracts them\par +from the commit title and description. It then formats the commit title to\par +include the first issue key if not already present and appends detailed\par +information about each issue to the commit description.\par +\par +Args:\par + commit_title (str): The original commit title.\par + commit_description (str): The original commit description.\par + issue_keys (List[str]?): A list of JIRA issue keys to include in the commit message. If not\par + provided, issue keys will be extracted from both the title and the description.\par +\par +Returns:\par + tuple: A tuple containing the updated commit title and description with JIRA\par + information included.\par +} + \par +}Here is the call graph for this function:{ +\pard\plain +\par\pard \qc {\field\flddirty {\*\fldinst INCLUDEPICTURE "classpenify__hook_1_1jira__client_1_1JiraClient_a49ea1149758f7f5212149d357b13cc23_cgraph.svg" \\d \\*MERGEFORMAT}{\fldrslt IMAGE}}\par +} +Here is the caller graph for this function:{ +\pard\plain +\par\pard \qc {\field\flddirty {\*\fldinst INCLUDEPICTURE "classpenify__hook_1_1jira__client_1_1JiraClient_a49ea1149758f7f5212149d357b13cc23_icgraph.svg" \\d \\*MERGEFORMAT}{\fldrslt IMAGE}}\par +} +} +{\xe \v get_commit_context_from_issues\:penify_hook.jira_client.JiraClient} +{\xe \v penify_hook.jira_client.JiraClient\:get_commit_context_from_issues} +\pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid { +{\b + Dict[str, Any] penify_hook.jira_client.JiraClient.get_commit_context_from_issues ( {\i self}, List[str] {\i issue_keys})}} +\par +{\bkmkstart AAAAAAAAKM} +{\bkmkend AAAAAAAAKM} +{ +\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid +{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid +{ +\par +\pard\plain \s41\li360\widctlpar\adjustright \shading1000\cbpat8 \f2\fs16\cgrid Gather contextual information from JIRA issues to improve commit messages.\par +\par +This function processes a list of JIRA issue keys, retrieves detailed context\par +for each issue, and aggregates it into a dictionary that can be used to enhance\par +commit messages. It first retrieves the primary issue (the first key in the\par +list) and then gathers basic details for any related issues. The resulting\par +context includes information from both the primary and related issues, along\par +with all issue keys.\par +\par +Args:\par + issue_keys: List of JIRA issue keys to gather information from\par +\par +Returns:\par + Dict containing business and technical context from the issues\par +} + \par +}Here is the call graph for this function:{ +\pard\plain +\par\pard \qc {\field\flddirty {\*\fldinst INCLUDEPICTURE "classpenify__hook_1_1jira__client_1_1JiraClient_afb41ce6f13c30b1265d439ddf04bf2cd_cgraph.svg" \\d \\*MERGEFORMAT}{\fldrslt IMAGE}}\par +} +Here is the caller graph for this function:{ +\pard\plain +\par\pard \qc {\field\flddirty {\*\fldinst INCLUDEPICTURE "classpenify__hook_1_1jira__client_1_1JiraClient_afb41ce6f13c30b1265d439ddf04bf2cd_icgraph.svg" \\d \\*MERGEFORMAT}{\fldrslt IMAGE}}\par +} +} +{\xe \v get_detailed_issue_context\:penify_hook.jira_client.JiraClient} +{\xe \v penify_hook.jira_client.JiraClient\:get_detailed_issue_context} +\pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid { +{\b + Dict[str, Any] penify_hook.jira_client.JiraClient.get_detailed_issue_context ( {\i self}, str {\i issue_key})}} +\par +{\bkmkstart AAAAAAAAKN} +{\bkmkend AAAAAAAAKN} +{ +\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid +{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid +{ +\par +\pard\plain \s41\li360\widctlpar\adjustright \shading1000\cbpat8 \f2\fs16\cgrid Retrieve comprehensive details about a JIRA issue including context for better\par +commit messages.\par +\par +This function fetches detailed information from a specified JIRA issue and\par +constructs a dictionary containing various context fields such as the issue\par +summary, description, type, status, priority, comments, URL, and additional\par +custom fields like acceptance criteria and sprint information. It handles\par +errors by logging appropriate warnings or errors.\par +\par +Args:\par + issue_key (str): The JIRA issue key (e.g., "PROJECT-123").\par +\par +Returns:\par + Dict[str, Any]: A dictionary containing business and technical context from the issue.\par +} + \par +}Here is the call graph for this function:{ +\pard\plain +\par\pard \qc {\field\flddirty {\*\fldinst INCLUDEPICTURE "classpenify__hook_1_1jira__client_1_1JiraClient_aa967169a4b7970c67c0947b9ac56f746_cgraph.svg" \\d \\*MERGEFORMAT}{\fldrslt IMAGE}}\par +} +Here is the caller graph for this function:{ +\pard\plain +\par\pard \qc {\field\flddirty {\*\fldinst INCLUDEPICTURE "classpenify__hook_1_1jira__client_1_1JiraClient_aa967169a4b7970c67c0947b9ac56f746_icgraph.svg" \\d \\*MERGEFORMAT}{\fldrslt IMAGE}}\par +} +} +{\xe \v get_issue_details\:penify_hook.jira_client.JiraClient} +{\xe \v penify_hook.jira_client.JiraClient\:get_issue_details} +\pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid { +{\b + Optional[Dict[str, Any]] penify_hook.jira_client.JiraClient.get_issue_details ( {\i self}, str {\i issue_key})}} +\par +{\bkmkstart AAAAAAAAKO} +{\bkmkend AAAAAAAAKO} +{ +\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid +{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid +{ +\par +\pard\plain \s41\li360\widctlpar\adjustright \shading1000\cbpat8 \f2\fs16\cgrid Retrieve details of a JIRA issue based on its key.\par +\par +This function fetches detailed information about a specified JIRA issue using\par +the provided issue key. It first checks if the JIRA client is connected; if\par +not, it logs a warning and returns `None`. If connected, it attempts to\par +retrieve the issue from the JIRA server. On success, it constructs and returns\par +a dictionary containing various details such as the issue's key, summary,\par +status, description, assignee, reporter, type, priority, and URL. Errors during\par +this process are logged, and `None` is returned.\par +\par +Args:\par + issue_key (str): The JIRA issue key (e.g., "PROJECT-123").\par +} + \par +}Here is the call graph for this function:{ +\pard\plain +\par\pard \qc {\field\flddirty {\*\fldinst INCLUDEPICTURE "classpenify__hook_1_1jira__client_1_1JiraClient_a65f6924819084b7c8d268956a784804a_cgraph.svg" \\d \\*MERGEFORMAT}{\fldrslt IMAGE}}\par +} +Here is the caller graph for this function:{ +\pard\plain +\par\pard \qc {\field\flddirty {\*\fldinst INCLUDEPICTURE "classpenify__hook_1_1jira__client_1_1JiraClient_a65f6924819084b7c8d268956a784804a_icgraph.svg" \\d \\*MERGEFORMAT}{\fldrslt IMAGE}}\par +} +} +{\xe \v is_connected\:penify_hook.jira_client.JiraClient} +{\xe \v penify_hook.jira_client.JiraClient\:is_connected} +\pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid { +{\b + bool penify_hook.jira_client.JiraClient.is_connected ( {\i self})}} +\par +{\bkmkstart AAAAAAAAKP} +{\bkmkend AAAAAAAAKP} +{ +\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid +{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid +{ +\par +\pard\plain \s41\li360\widctlpar\adjustright \shading1000\cbpat8 \f2\fs16\cgrid Check if the JIRA client is connected.} + \par +}Here is the caller graph for this function:{ +\pard\plain +\par\pard \qc {\field\flddirty {\*\fldinst INCLUDEPICTURE "classpenify__hook_1_1jira__client_1_1JiraClient_a00d0f9ae006313a21576362d26ac5ec8_icgraph.svg" \\d \\*MERGEFORMAT}{\fldrslt IMAGE}}\par +} +} +{\xe \v update_issue_status\:penify_hook.jira_client.JiraClient} +{\xe \v penify_hook.jira_client.JiraClient\:update_issue_status} +\pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid { +{\b + bool penify_hook.jira_client.JiraClient.update_issue_status ( {\i self}, str {\i issue_key}, str {\i transition_name})}} +\par +{\bkmkstart AAAAAAAAKQ} +{\bkmkend AAAAAAAAKQ} +{ +\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid +{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid +{ +\par +\pard\plain \s41\li360\widctlpar\adjustright \shading1000\cbpat8 \f2\fs16\cgrid Update the status of a JIRA issue.\par +\par +This method checks if the JIRA client is connected, retrieves available\par +transitions for the given issue, finds the transition ID by name, and updates\par +the issue's status accordingly. If any step fails or the specified transition\par +is not found, appropriate logs are generated, and False is returned.\par +\par +Args:\par + issue_key (str): The key of the JIRA issue to be updated.\par + transition_name (str): The name of the desired transition.\par +\par +Returns:\par + bool: True if the status was successfully updated, False otherwise.\par +} + \par +}Here is the call graph for this function:{ +\pard\plain +\par\pard \qc {\field\flddirty {\*\fldinst INCLUDEPICTURE "classpenify__hook_1_1jira__client_1_1JiraClient_aca8837552d37bfd611de23441a240826_cgraph.svg" \\d \\*MERGEFORMAT}{\fldrslt IMAGE}}\par +} +} +{\pard\widctlpar\brdrb\brdrs\brdrw5\brsp20 \adjustright \par} +\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid +Member Data Documentation\par +\pard\plain +{\xe \v jira_api_token\:penify_hook.jira_client.JiraClient} +{\xe \v penify_hook.jira_client.JiraClient\:jira_api_token} +\pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid { +{\b +penify_hook.jira_client.JiraClient.jira_api_token}} +\par +{\bkmkstart AAAAAAAAKR} +{\bkmkend AAAAAAAAKR} +{ +\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid +} +{\xe \v jira_client\:penify_hook.jira_client.JiraClient} +{\xe \v penify_hook.jira_client.JiraClient\:jira_client} +\pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid { +{\b +penify_hook.jira_client.JiraClient.jira_client}} +\par +{\bkmkstart AAAAAAAAKS} +{\bkmkend AAAAAAAAKS} +{ +\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid +} +{\xe \v jira_url\:penify_hook.jira_client.JiraClient} +{\xe \v penify_hook.jira_client.JiraClient\:jira_url} +\pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid { +{\b +penify_hook.jira_client.JiraClient.jira_url}} +\par +{\bkmkstart AAAAAAAAKT} +{\bkmkend AAAAAAAAKT} +{ +\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid +} +{\xe \v jira_user\:penify_hook.jira_client.JiraClient} +{\xe \v penify_hook.jira_client.JiraClient\:jira_user} +\pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid { +{\b +penify_hook.jira_client.JiraClient.jira_user}} +\par +{\bkmkstart AAAAAAAAKU} +{\bkmkend AAAAAAAAKU} +{ +\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid +} +{\pard\widctlpar\brdrb\brdrs\brdrw5\brsp20 \adjustright \par} +The documentation for this class was generated from the following file:{\par +\pard\plain \s121\fi-360\li720\widctlpar\jclisttab\tx720{\*\pn \pnlvlbody\ilvl0\ls2\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +/tmp/github_reposRepoArchDocGenContext/Penify-dev/penify-cli/penify_hook/{\b jira_client.py}\par +}\par \pard\plain + +\pard\plain \sect\sbkpage +\s2\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs28\kerning28\cgrid +\pard\plain \s2\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs28\kerning28\cgrid +penify_hook.llm_client.LLMClient Class Reference\par \pard\plain +{\tc\tcl2 \v penify_hook.llm_client.LLMClient} +{\xe \v penify_hook.llm_client.LLMClient} +{\bkmkstart AAAAAAAAKW} +{\bkmkend AAAAAAAAKW} +Collaboration diagram for penify_hook.llm_client.LLMClient:{ +\pard\plain +\par\pard \qc {\field\flddirty {\*\fldinst INCLUDEPICTURE "classpenify__hook_1_1llm__client_1_1LLMClient__coll__graph.svg" \\d \\*MERGEFORMAT}{\fldrslt IMAGE}}\par +} +\par +\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid +Public Member Functions\par +\pard\plain + +{ +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +def {\b __init__} (self, str {\b model}=None, str api_base=None, str api_key=None)\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +def {\b litellm} (self)\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +Dict {\b generate_commit_summary} (self, str diff, str message, bool generate_description, Dict repo_details, Dict jira_context=None)\par +} +\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid +Public Attributes\par +\pard\plain + +{ +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +{\b model}\par +} +\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid +Private Attributes\par +\pard\plain + +{ +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +{\b _litellm}\par +} +{\pard\widctlpar\brdrb\brdrs\brdrw5\brsp20 \adjustright \par} +\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid +Detailed Description\par +\pard\plain +{ +\pard\plain \s17\sa60\sb30\widctlpar\qj \fs22\cgrid {\s17\sa60\sb30\widctlpar\qj \fs22\cgrid +{ +\par +\pard\plain \s40\li0\widctlpar\adjustright \shading1000\cbpat8 \f2\fs16\cgrid Client for interacting with LLM models using LiteLLM.\par +} + \par +}} +{\pard\widctlpar\brdrb\brdrs\brdrw5\brsp20 \adjustright \par} +\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid +Constructor & Destructor Documentation\par +\pard\plain +{\xe \v __init__\:penify_hook.llm_client.LLMClient} +{\xe \v penify_hook.llm_client.LLMClient\:__init__} +\pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid { +{\b +def penify_hook.llm_client.LLMClient.__init__ ( {\i self}, str {\i model} = {\f2 None}, str {\i api_base} = {\f2 None}, str {\i api_key} = {\f2 None})}} +\par +{\bkmkstart AAAAAAAAKX} +{\bkmkend AAAAAAAAKX} +{ +\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid +{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid +{ +\par +\pard\plain \s41\li360\widctlpar\adjustright \shading1000\cbpat8 \f2\fs16\cgrid Initialize the LLM client.\par +\par +Args:\par + model: LLM model to use (e.g., "gpt-4", "ollama/llama2", etc.)\par + api_base: Base URL for API requests (e.g., "http://localhost:11434" for Ollama)\par + api_key: API key for the LLM service\par +} + \par +}} +{\pard\widctlpar\brdrb\brdrs\brdrw5\brsp20 \adjustright \par} +\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid +Member Function Documentation\par +\pard\plain +{\xe \v generate_commit_summary\:penify_hook.llm_client.LLMClient} +{\xe \v penify_hook.llm_client.LLMClient\:generate_commit_summary} +\pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid { +{\b + Dict penify_hook.llm_client.LLMClient.generate_commit_summary ( {\i self}, str {\i diff}, str {\i message}, bool {\i generate_description}, Dict {\i repo_details}, Dict {\i jira_context} = {\f2 None})}} +\par +{\bkmkstart AAAAAAAAKY} +{\bkmkend AAAAAAAAKY} +{ +\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid +{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid +{ +\par +\pard\plain \s41\li360\widctlpar\adjustright \shading1000\cbpat8 \f2\fs16\cgrid Generate a concise and descriptive commit summary based on Git diff, user\par +instructions, repository details, and optional JIRA context.\par +\par +This function constructs a prompt for an LLM to produce a commit title and, if\par +requested, a detailed description. The summary adheres to Semantic Commit\par +Messages guidelines. If JIRA context is provided, it enriches the prompt with\par +relevant issue information.\par +\par +Args:\par + diff (str): Git diff of changes.\par + message (str): User-provided commit message or instructions.\par + generate_description (bool): Flag indicating whether to include a detailed description in the summary.\par + repo_details (Dict): Details about the repository.\par + jira_context (Dict?): Optional JIRA issue context to enhance the summary.\par +\par +Returns:\par + Dict: A dictionary containing the title and description for the commit. If\par + `generate_description` is False, the 'description' key may be absent.\par +\par +Raises:\par + ValueError: If the LLM model is not configured.\par +} + \par +}Here is the call graph for this function:{ +\pard\plain +\par\pard \qc {\field\flddirty {\*\fldinst INCLUDEPICTURE "classpenify__hook_1_1llm__client_1_1LLMClient_a2ad3014dac466ee1d8e00306d0cf2000_cgraph.svg" \\d \\*MERGEFORMAT}{\fldrslt IMAGE}}\par +} +Here is the caller graph for this function:{ +\pard\plain +\par\pard \qc {\field\flddirty {\*\fldinst INCLUDEPICTURE "classpenify__hook_1_1llm__client_1_1LLMClient_a2ad3014dac466ee1d8e00306d0cf2000_icgraph.svg" \\d \\*MERGEFORMAT}{\fldrslt IMAGE}}\par +} +} +{\xe \v litellm\:penify_hook.llm_client.LLMClient} +{\xe \v penify_hook.llm_client.LLMClient\:litellm} +\pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid { +{\b +def penify_hook.llm_client.LLMClient.litellm ( {\i self})}} +\par +{\bkmkstart AAAAAAAAKZ} +{\bkmkend AAAAAAAAKZ} +{ +\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid +{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid +{ +\par +\pard\plain \s41\li360\widctlpar\adjustright \shading1000\cbpat8 \f2\fs16\cgrid Returns the litellm module, loading it if necessary.} + \par +}Here is the caller graph for this function:{ +\pard\plain +\par\pard \qc {\field\flddirty {\*\fldinst INCLUDEPICTURE "classpenify__hook_1_1llm__client_1_1LLMClient_ad6f06658ca922793f879474f2234518e_icgraph.svg" \\d \\*MERGEFORMAT}{\fldrslt IMAGE}}\par +} +} +{\pard\widctlpar\brdrb\brdrs\brdrw5\brsp20 \adjustright \par} +\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid +Member Data Documentation\par +\pard\plain +{\xe \v _litellm\:penify_hook.llm_client.LLMClient} +{\xe \v penify_hook.llm_client.LLMClient\:_litellm} +\pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid { +{\b +penify_hook.llm_client.LLMClient._litellm{\f2 [private]}}} +\par +{\bkmkstart AAAAAAAALA} +{\bkmkend AAAAAAAALA} +{ +\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid +} +{\xe \v model\:penify_hook.llm_client.LLMClient} +{\xe \v penify_hook.llm_client.LLMClient\:model} +\pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid { +{\b +penify_hook.llm_client.LLMClient.model}} +\par +{\bkmkstart AAAAAAAALB} +{\bkmkend AAAAAAAALB} +{ +\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid +} +{\pard\widctlpar\brdrb\brdrs\brdrw5\brsp20 \adjustright \par} +The documentation for this class was generated from the following file:{\par +\pard\plain \s121\fi-360\li720\widctlpar\jclisttab\tx720{\*\pn \pnlvlbody\ilvl0\ls2\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +/tmp/github_reposRepoArchDocGenContext/Penify-dev/penify-cli/penify_hook/{\b llm_client.py}\par +}\par \pard\plain + +\pard\plain \sect\sbkpage +\s2\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs28\kerning28\cgrid +\pard\plain \s2\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs28\kerning28\cgrid +tests.test_commit_commands.TestCommitCommands Class Reference\par \pard\plain +{\tc\tcl2 \v tests.test_commit_commands.TestCommitCommands} +{\xe \v tests.test_commit_commands.TestCommitCommands} +{\bkmkstart AAAAAAAANF} +{\bkmkend AAAAAAAANF} +Collaboration diagram for tests.test_commit_commands.TestCommitCommands:{ +\pard\plain +\par\pard \qc {\field\flddirty {\*\fldinst INCLUDEPICTURE "classtests_1_1test__commit__commands_1_1TestCommitCommands__coll__graph.svg" \\d \\*MERGEFORMAT}{\fldrslt IMAGE}}\par +} +\par +\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid +Public Member Functions\par +\pard\plain + +{ +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +def {\b mock_api_client} (self)\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +def {\b mock_llm_client} (self)\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +def {\b mock_jira_client} (self)\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +def {\b mock_commit_doc_gen} (self)\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +def {\b mock_git_folder_search} (self)\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +def {\b mock_print_functions} (self)\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +def {\b test_commit_code_with_llm_client} (self, mock_error, mock_warning, mock_info, {\b mock_git_folder_search}, mock_doc_gen, {\b mock_llm_client}, {\b mock_api_client})\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +def {\b test_commit_code_with_jira_client} (self, mock_error, mock_warning, mock_info, {\b mock_git_folder_search}, mock_doc_gen, {\b mock_jira_client}, {\b mock_llm_client}, {\b mock_api_client})\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +def {\b test_commit_code_with_jira_connection_failure} (self, mock_error, mock_warning, mock_info, {\b mock_git_folder_search}, mock_doc_gen, {\b mock_jira_client}, {\b mock_api_client})\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +def {\b test_commit_code_error_handling} (self, mock_print, mock_exit, {\b mock_git_folder_search}, mock_doc_gen, {\b mock_api_client})\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +def {\b test_setup_commit_parser} (self)\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +def {\b test_handle_commit} (self, mock_print_info, mock_commit_code, mock_get_token, mock_get_llm_config, mock_get_jira_config)\par +} +{\pard\widctlpar\brdrb\brdrs\brdrw5\brsp20 \adjustright \par} +\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid +Member Function Documentation\par +\pard\plain +{\xe \v mock_api_client\:tests.test_commit_commands.TestCommitCommands} +{\xe \v tests.test_commit_commands.TestCommitCommands\:mock_api_client} +\pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid { +{\b +def tests.test_commit_commands.TestCommitCommands.mock_api_client ( {\i self})}} +\par +{\bkmkstart AAAAAAAANG} +{\bkmkend AAAAAAAANG} +{ +\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid +{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid +{ +\par +\pard\plain \s41\li360\widctlpar\adjustright \shading1000\cbpat8 \f2\fs16\cgrid Mocks an instance of APIClient using unittest.mock.\par +\par +This function creates a mock object for APIClient and yields it along\par +with the mocked instance. It is useful for testing purposes where real\par +API calls should be avoided.\par +\par +Yields:\par + tuple: A tuple containing the mock of APIClient and the mocked instance of\par + APIClient.\par +} + \par +}} +{\xe \v mock_commit_doc_gen\:tests.test_commit_commands.TestCommitCommands} +{\xe \v tests.test_commit_commands.TestCommitCommands\:mock_commit_doc_gen} +\pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid { +{\b +def tests.test_commit_commands.TestCommitCommands.mock_commit_doc_gen ( {\i self})}} +\par +{\bkmkstart AAAAAAAANH} +{\bkmkend AAAAAAAANH} +{ +\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid +{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid +{ +\par +\pard\plain \s41\li360\widctlpar\adjustright \shading1000\cbpat8 \f2\fs16\cgrid Mocks the CommitDocGenHook class and returns a MagicMock instance.\par +\par +This function uses the `patch` decorator from the `unittest.mock` module\par +to create a mock of the `CommitDocGenHook` class. It then sets up this\par +mock to return a new `MagicMock` instance when invoked. The function\par +yields both the mock object and the mocked instance, allowing for easy\par +testing of functions that rely on `CommitDocGenHook`.\par +\par +Returns:\par + tuple: A tuple containing two elements:\par + - mock (patch): The patch object used to mock the `CommitDocGenHook`\par + class.\par + - doc_gen_instance (MagicMock): The mocked instance of\par + `CommitDocGenHook`.\par +} + \par +}} +{\xe \v mock_git_folder_search\:tests.test_commit_commands.TestCommitCommands} +{\xe \v tests.test_commit_commands.TestCommitCommands\:mock_git_folder_search} +\pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid { +{\b +def tests.test_commit_commands.TestCommitCommands.mock_git_folder_search ( {\i self})}} +\par +{\bkmkstart AAAAAAAANI} +{\bkmkend AAAAAAAANI} +{ +\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid +{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid +{ +\par +\pard\plain \s41\li360\widctlpar\adjustright \shading1000\cbpat8 \f2\fs16\cgrid Mock the `recursive_search_git_folder` function to return a predefined\par +git folder path.\par +\par +This function uses the `patch` decorator from the `unittest.mock` module\par +to intercept calls to `penify_hook.utils.recursive_search_git_folder`.\par +When called, it will return '/mock/git/folder' instead of performing an\par +actual search. This is useful for testing purposes where you need a\par +consistent response without interacting with the file system.\par +\par +Yields:\par + MagicMock: A mock object that simulates the `recursive_search_git_folder` function.\par +} + \par +}} +{\xe \v mock_jira_client\:tests.test_commit_commands.TestCommitCommands} +{\xe \v tests.test_commit_commands.TestCommitCommands\:mock_jira_client} +\pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid { +{\b +def tests.test_commit_commands.TestCommitCommands.mock_jira_client ( {\i self})}} +\par +{\bkmkstart AAAAAAAANJ} +{\bkmkend AAAAAAAANJ} +{ +\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid +{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid +{ +\par +\pard\plain \s41\li360\widctlpar\adjustright \shading1000\cbpat8 \f2\fs16\cgrid Create a mock JIRA client for testing purposes.\par +\par +This function yields a tuple containing a mock JIRA client instance and\par +its `is_connected` method. The mock client is configured to simulate an\par +active connection. This is useful for unit tests that require\par +interaction with a JIRA client without making actual network calls.\par +\par +Yields:\par + tuple: A tuple containing the mocked JIRA client instance and its\par + `is_connected` method.\par +} + \par +}} +{\xe \v mock_llm_client\:tests.test_commit_commands.TestCommitCommands} +{\xe \v tests.test_commit_commands.TestCommitCommands\:mock_llm_client} +\pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid { +{\b +def tests.test_commit_commands.TestCommitCommands.mock_llm_client ( {\i self})}} +\par +{\bkmkstart AAAAAAAANK} +{\bkmkend AAAAAAAANK} +{ +\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid +{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid +{ +\par +\pard\plain \s41\li360\widctlpar\adjustright \shading1000\cbpat8 \f2\fs16\cgrid Mock an instance of LLMClient for testing purposes.\par +\par +This function yields a mock object representing an instance of\par +LLMClient, which can be used to simulate interactions with a language\par +model during testing. The mock is patched to replace the actual\par +LLMClient class from the penify_hook module.\par +\par +Yields:\par + tuple: A tuple containing two elements:\par + - mock (MagicMock): The mock object for LLMClient.\par + - llm_client_instance (MagicMock): An instance of the mocked LLMClient.\par +} + \par +}} +{\xe \v mock_print_functions\:tests.test_commit_commands.TestCommitCommands} +{\xe \v tests.test_commit_commands.TestCommitCommands\:mock_print_functions} +\pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid { +{\b +def tests.test_commit_commands.TestCommitCommands.mock_print_functions ( {\i self})}} +\par +{\bkmkstart AAAAAAAANL} +{\bkmkend AAAAAAAANL} +{ +\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid +{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid +{ +\par +\pard\plain \s41\li360\widctlpar\adjustright \shading1000\cbpat8 \f2\fs16\cgrid Mocks the print functions from `penify_hook.ui_utils` for testing\par +purposes.\par +\par +This function uses Python's `unittest.mock.patch` to replace the actual\par +print functions (`print`, `print_warning`, and `print_error`) with mock\par +objects. These mock objects can be used in tests to capture calls made\par +to these print functions without actually printing anything.\par +\par +Yields:\par + tuple: A tuple containing three mock objects corresponding to `print_info`,\par + `print_warning`,\par + and `print_error`.\par +} + \par +}} +{\xe \v test_commit_code_error_handling\:tests.test_commit_commands.TestCommitCommands} +{\xe \v tests.test_commit_commands.TestCommitCommands\:test_commit_code_error_handling} +\pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid { +{\b +def tests.test_commit_commands.TestCommitCommands.test_commit_code_error_handling ( {\i self}, {\i mock_print}, {\i mock_exit}, {\i mock_git_folder_search}, {\i mock_doc_gen}, {\i mock_api_client})}} +\par +{\bkmkstart AAAAAAAANM} +{\bkmkend AAAAAAAANM} +{ +\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid +{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid +{ +\par +\pard\plain \s41\li360\widctlpar\adjustright \shading1000\cbpat8 \f2\fs16\cgrid Test the error handling in the test_commit_code function.\par +\par +This function sets up mocks to simulate exceptions and test the error\par +handling of the commit_code function. It verifies that the function\par +correctly prints an error message and exits with a status code of 1 when\par +an exception occurs during documentation generation.\par +\par +Args:\par + mock_print (MagicMock): Mock for the print function, used to verify error message output.\par + mock_exit (MagicMock): Mock for the sys.exit function, used to verify exit behavior.\par + mock_git_folder_search (MagicMock): Mock for the git_folder_search function, returning a mock Git folder\par + path.\par + mock_doc_gen (MagicMock): Mock for the doc_gen function, simulating an exception during\par + documentation generation.\par + mock_api_client (MagicMock): Mock for the API client class, not directly used but referenced in the\par + function signature.\par +} + \par +}Here is the call graph for this function:{ +\pard\plain +\par\pard \qc {\field\flddirty {\*\fldinst INCLUDEPICTURE "classtests_1_1test__commit__commands_1_1TestCommitCommands_a43c2ff3707124aa48e8eb581106b8691_cgraph.svg" \\d \\*MERGEFORMAT}{\fldrslt IMAGE}}\par +} +} +{\xe \v test_commit_code_with_jira_client\:tests.test_commit_commands.TestCommitCommands} +{\xe \v tests.test_commit_commands.TestCommitCommands\:test_commit_code_with_jira_client} +\pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid { +{\b +def tests.test_commit_commands.TestCommitCommands.test_commit_code_with_jira_client ( {\i self}, {\i mock_error}, {\i mock_warning}, {\i mock_info}, {\i mock_git_folder_search}, {\i mock_doc_gen}, {\i mock_jira_client}, {\i mock_llm_client}, {\i mock_api_client})}} +\par +{\bkmkstart AAAAAAAANN} +{\bkmkend AAAAAAAANN} +{ +\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid +{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid +{ +\par +\pard\plain \s41\li360\widctlpar\adjustright \shading1000\cbpat8 \f2\fs16\cgrid Test committing code using a JIRA client.\par +\par +This function tests the commit_code function with various parameters,\par +including API and JIRA credentials. It sets up mock objects for\par +dependencies such as the JIRA client, LLM client, and doc generator to\par +simulate the behavior of the real classes. The function then calls\par +commit_code and verifies that the JIRA client and doc generator are\par +called with the correct parameters.\par +\par +Args:\par + mock_error (MagicMock): A MagicMock object for simulating error logging.\par + mock_warning (MagicMock): A MagicMock object for simulating warning logging.\par + mock_info (MagicMock): A MagicMock object for simulating info logging.\par + mock_git_folder_search (MagicMock): A MagicMock object for simulating the git folder search function.\par + mock_doc_gen (MagicMock): A MagicMock object for simulating the doc generator function.\par + mock_jira_client (MagicMock): A MagicMock object for simulating the JIRA client class.\par + mock_llm_client (MagicMock): A MagicMock object for simulating the LLM client class.\par + mock_api_client (MagicMock): A MagicMock object for simulating the API client class.\par +} + \par +}Here is the call graph for this function:{ +\pard\plain +\par\pard \qc {\field\flddirty {\*\fldinst INCLUDEPICTURE "classtests_1_1test__commit__commands_1_1TestCommitCommands_af9c09013055ec39ddde86b487aefcf8b_cgraph.svg" \\d \\*MERGEFORMAT}{\fldrslt IMAGE}}\par +} +} +{\xe \v test_commit_code_with_jira_connection_failure\:tests.test_commit_commands.TestCommitCommands} +{\xe \v tests.test_commit_commands.TestCommitCommands\:test_commit_code_with_jira_connection_failure} +\pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid { +{\b +def tests.test_commit_commands.TestCommitCommands.test_commit_code_with_jira_connection_failure ( {\i self}, {\i mock_error}, {\i mock_warning}, {\i mock_info}, {\i mock_git_folder_search}, {\i mock_doc_gen}, {\i mock_jira_client}, {\i mock_api_client})}} +\par +{\bkmkstart AAAAAAAANO} +{\bkmkend AAAAAAAANO} +{ +\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid +{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid +{ +\par +\pard\plain \s41\li360\widctlpar\adjustright \shading1000\cbpat8 \f2\fs16\cgrid Test the commit_code function when JIRA connection fails.\par +\par +This function tests the scenario where the JIRA connection fails during\par +a code commit. It sets up various mocks to simulate different components\par +of the system and then calls the `commit_code` function with specific\par +parameters. The function is expected to handle the JIRA connection\par +failure gracefully by logging an appropriate warning.\par +\par +Args:\par + mock_error (MagicMock): Mock for error logging.\par + mock_warning (MagicMock): Mock for warning logging.\par + mock_info (MagicMock): Mock for info logging.\par + mock_git_folder_search (MagicMock): Mock for searching the Git folder.\par + mock_doc_gen (MagicMock): Mock for generating documentation.\par + mock_jira_client (MagicMock): Mock for creating a JIRA client.\par + mock_api_client (MagicMock): Mock for creating an API client.\par +} + \par +}Here is the call graph for this function:{ +\pard\plain +\par\pard \qc {\field\flddirty {\*\fldinst INCLUDEPICTURE "classtests_1_1test__commit__commands_1_1TestCommitCommands_acea0d934ee0f2b914b0b893736e8fe4e_cgraph.svg" \\d \\*MERGEFORMAT}{\fldrslt IMAGE}}\par +} +} +{\xe \v test_commit_code_with_llm_client\:tests.test_commit_commands.TestCommitCommands} +{\xe \v tests.test_commit_commands.TestCommitCommands\:test_commit_code_with_llm_client} +\pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid { +{\b +def tests.test_commit_commands.TestCommitCommands.test_commit_code_with_llm_client ( {\i self}, {\i mock_error}, {\i mock_warning}, {\i mock_info}, {\i mock_git_folder_search}, {\i mock_doc_gen}, {\i mock_llm_client}, {\i mock_api_client})}} +\par +{\bkmkstart AAAAAAAANP} +{\bkmkend AAAAAAAANP} +{ +\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid +{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid +{ +\par +\pard\plain \s41\li360\widctlpar\adjustright \shading1000\cbpat8 \f2\fs16\cgrid Test committing code using an LLM client.\par +\par +This function sets up mock objects for various components and then calls\par +the `commit_code` function with specified parameters. It verifies that\par +the correct mocks are created and called with the appropriate arguments.\par +\par +Args:\par + mock_error (MagicMock): Mock object for error handling.\par + mock_warning (MagicMock): Mock object for warning logging.\par + mock_info (MagicMock): Mock object for info logging.\par + mock_git_folder_search (MagicMock): Mock object to simulate git folder search.\par + mock_doc_gen (MagicMock): Mock object for document generation.\par + mock_llm_client (MagicMock): Mock object for LLM client interaction.\par + mock_api_client (MagicMock): Mock object for API client interaction.\par +} + \par +}Here is the call graph for this function:{ +\pard\plain +\par\pard \qc {\field\flddirty {\*\fldinst INCLUDEPICTURE "classtests_1_1test__commit__commands_1_1TestCommitCommands_acc4b1e4189792a3f7c11d2a745f479c0_cgraph.svg" \\d \\*MERGEFORMAT}{\fldrslt IMAGE}}\par +} +} +{\xe \v test_handle_commit\:tests.test_commit_commands.TestCommitCommands} +{\xe \v tests.test_commit_commands.TestCommitCommands\:test_handle_commit} +\pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid { +{\b +def tests.test_commit_commands.TestCommitCommands.test_handle_commit ( {\i self}, {\i mock_print_info}, {\i mock_commit_code}, {\i mock_get_token}, {\i mock_get_llm_config}, {\i mock_get_jira_config})}} +\par +{\bkmkstart AAAAAAAANQ} +{\bkmkend AAAAAAAANQ} +{ +\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid +{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid +{ +\par +\pard\plain \s41\li360\widctlpar\adjustright \shading1000\cbpat8 \f2\fs16\cgrid Test the handle_commit function with various mock objects.\par +\par +This function sets up mocks for retrieving LLM configuration, JIRA\par +configuration, and commit code. It then creates an argument object and\par +calls the handle_commit function. Finally, it verifies that the mock\par +functions were called with the expected arguments.\par +\par +Args:\par + mock_print_info (MagicMock): Mock object for printing information.\par + mock_commit_code (MagicMock): Mock object for committing code.\par + mock_get_token (MagicMock): Mock object for retrieving API token.\par + mock_get_llm_config (MagicMock): Mock object for retrieving LLM configuration.\par + mock_get_jira_config (MagicMock): Mock object for retrieving JIRA configuration.\par +} + \par +}Here is the call graph for this function:{ +\pard\plain +\par\pard \qc {\field\flddirty {\*\fldinst INCLUDEPICTURE "classtests_1_1test__commit__commands_1_1TestCommitCommands_ac13e368262340af98b30fd8ebdac6597_cgraph.svg" \\d \\*MERGEFORMAT}{\fldrslt IMAGE}}\par +} +} +{\xe \v test_setup_commit_parser\:tests.test_commit_commands.TestCommitCommands} +{\xe \v tests.test_commit_commands.TestCommitCommands\:test_setup_commit_parser} +\pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid { +{\b +def tests.test_commit_commands.TestCommitCommands.test_setup_commit_parser ( {\i self})}} +\par +{\bkmkstart AAAAAAAANR} +{\bkmkend AAAAAAAANR} +{ +\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid +{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid +{ +\par +\pard\plain \s41\li360\widctlpar\adjustright \shading1000\cbpat8 \f2\fs16\cgrid Set up the argument parser for the commit command.\par +\par +This function configures an argument parser to handle various options\par +for committing changes. It adds three arguments: - '-m' or '--message':\par +An optional argument to specify a contextual commit message with a\par +default value of "N/A". - '-e' or '--terminal': A boolean flag to open\par +an edit terminal before committing. - '-d' or '--description': A boolean\par +flag that, when set to False, indicates the generation of a commit\par +message with title and description.\par +\par +Args:\par + parser (MagicMock): The argument parser to be configured.\par +} + \par +}Here is the call graph for this function:{ +\pard\plain +\par\pard \qc {\field\flddirty {\*\fldinst INCLUDEPICTURE "classtests_1_1test__commit__commands_1_1TestCommitCommands_a4d04b125e102190a768f65f1948f15bc_cgraph.svg" \\d \\*MERGEFORMAT}{\fldrslt IMAGE}}\par +} +} +{\pard\widctlpar\brdrb\brdrs\brdrw5\brsp20 \adjustright \par} +The documentation for this class was generated from the following file:{\par +\pard\plain \s121\fi-360\li720\widctlpar\jclisttab\tx720{\*\pn \pnlvlbody\ilvl0\ls2\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +/tmp/github_reposRepoArchDocGenContext/Penify-dev/penify-cli/tests/{\b test_commit_commands.py}\par +}\par \pard\plain + +\pard\plain \sect\sbkpage +\s2\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs28\kerning28\cgrid +\pard\plain \s2\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs28\kerning28\cgrid +tests.test_config_commands.TestConfigCommands Class Reference\par \pard\plain +{\tc\tcl2 \v tests.test_config_commands.TestConfigCommands} +{\xe \v tests.test_config_commands.TestConfigCommands} +{\bkmkstart AAAAAAAANT} +{\bkmkend AAAAAAAANT} +Collaboration diagram for tests.test_config_commands.TestConfigCommands:{ +\pard\plain +\par\pard \qc {\field\flddirty {\*\fldinst INCLUDEPICTURE "classtests_1_1test__config__commands_1_1TestConfigCommands__coll__graph.svg" \\d \\*MERGEFORMAT}{\fldrslt IMAGE}}\par +} +\par +\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid +Public Member Functions\par +\pard\plain + +{ +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +def {\b test_get_penify_config_existing_dir} (self, mock_file_open, mock_makedirs, mock_path, mock_git_folder)\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +def {\b test_get_penify_config_new_dir} (self, mock_file_open, mock_makedirs, mock_path, mock_git_folder)\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +def {\b test_get_llm_config_exists} (self, mock_file_open, mock_get_config)\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +def {\b test_get_llm_config_empty} (self, mock_file_open, mock_get_config)\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +def {\b test_get_llm_config_invalid_json} (self, mock_print, mock_file_open, mock_get_config)\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +def {\b test_get_jira_config_exists} (self, mock_file_open, mock_get_config)\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +def {\b test_save_llm_config_success} (self, mock_print, mock_json_dump, mock_file_open, mock_get_config)\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +def {\b test_save_llm_config_failure} (self, mock_print, mock_file_open, mock_get_config)\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +def {\b test_save_jira_config_success} (self, mock_print, mock_json_dump, mock_file_open, mock_path)\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +def {\b test_get_token_from_env} (self, mock_file_open, mock_path, mock_getenv)\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +def {\b test_get_token_from_config} (self, mock_file_open, mock_path, mock_getenv)\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +def {\b test_get_token_not_found} (self, mock_file_open, mock_path, mock_getenv)\par +} +{\pard\widctlpar\brdrb\brdrs\brdrw5\brsp20 \adjustright \par} +\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid +Member Function Documentation\par +\pard\plain +{\xe \v test_get_jira_config_exists\:tests.test_config_commands.TestConfigCommands} +{\xe \v tests.test_config_commands.TestConfigCommands\:test_get_jira_config_exists} +\pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid { +{\b +def tests.test_config_commands.TestConfigCommands.test_get_jira_config_exists ( {\i self}, {\i mock_file_open}, {\i mock_get_config})}} +\par +{\bkmkstart AAAAAAAANU} +{\bkmkend AAAAAAAANU} +{ +\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid +{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid +{ +\par +\pard\plain \s41\li360\widctlpar\adjustright \shading1000\cbpat8 \f2\fs16\cgrid Test that get_jira_config returns the correct JIRA configuration when\par +the configuration file exists.\par +\par +It sets up a mock for the configuration file to simulate its existence\par +and verifies that the function reads from the correct file and returns\par +the expected JIRA configuration dictionary. Additionally, it checks that\par +the mock file open is called with the appropriate arguments.\par +\par +Args:\par + mock_file_open (MagicMock): A mock for the `open` function.\par + mock_get_config (MagicMock): A mock for the `get_config` function, which is expected to return a mock\par + configuration file object.\par +\par +Returns:\par + None: This test function does not explicitly return anything. Its assertions\par + serve as the verification of its correctness.\par +} + \par +}Here is the call graph for this function:{ +\pard\plain +\par\pard \qc {\field\flddirty {\*\fldinst INCLUDEPICTURE "classtests_1_1test__config__commands_1_1TestConfigCommands_aee37b97432821d19758c6325d4c74bcf_cgraph.svg" \\d \\*MERGEFORMAT}{\fldrslt IMAGE}}\par +} +} +{\xe \v test_get_llm_config_empty\:tests.test_config_commands.TestConfigCommands} +{\xe \v tests.test_config_commands.TestConfigCommands\:test_get_llm_config_empty} +\pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid { +{\b +def tests.test_config_commands.TestConfigCommands.test_get_llm_config_empty ( {\i self}, {\i mock_file_open}, {\i mock_get_config})}} +\par +{\bkmkstart AAAAAAAANV} +{\bkmkend AAAAAAAANV} +{ +\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid +{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid +{ +\par +\pard\plain \s41\li360\widctlpar\adjustright \shading1000\cbpat8 \f2\fs16\cgrid Test the behavior of get_llm_config when called with an empty\par +configuration file.\par +\par +This function sets up a mock configuration file that exists but returns\par +no content. It then calls the `get_llm_config` function and asserts that\par +it returns an empty dictionary and that the file open method was called\par +exactly once with the correct arguments.\par +\par +Args:\par + mock_file_open (MagicMock): A MagicMock object simulating the built-in open function.\par + mock_get_config (MagicMock): A MagicMock object simulating the get_config function.\par +} + \par +}Here is the call graph for this function:{ +\pard\plain +\par\pard \qc {\field\flddirty {\*\fldinst INCLUDEPICTURE "classtests_1_1test__config__commands_1_1TestConfigCommands_abd12f028b89aa9cd1152c0b9ece5d3cd_cgraph.svg" \\d \\*MERGEFORMAT}{\fldrslt IMAGE}}\par +} +} +{\xe \v test_get_llm_config_exists\:tests.test_config_commands.TestConfigCommands} +{\xe \v tests.test_config_commands.TestConfigCommands\:test_get_llm_config_exists} +\pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid { +{\b +def tests.test_config_commands.TestConfigCommands.test_get_llm_config_exists ( {\i self}, {\i mock_file_open}, {\i mock_get_config})}} +\par +{\bkmkstart AAAAAAAANW} +{\bkmkend AAAAAAAANW} +{ +\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid +{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid +{ +\par +\pard\plain \s41\li360\widctlpar\adjustright \shading1000\cbpat8 \f2\fs16\cgrid Test the get_llm_config function when the configuration file exists.\par +\par +This function sets up a mock configuration file that exists and returns\par +it when called. It then calls the get_llm_config function and asserts\par +that it returns the correct configuration dictionary. Additionally, it\par +checks that the mock_file_open function was called with the correct\par +arguments.\par +\par +Args:\par + mock_file_open (MagicMock): A mock for the open() function.\par + mock_get_config (MagicMock): A mock for the get_config() function.\par +} + \par +}Here is the call graph for this function:{ +\pard\plain +\par\pard \qc {\field\flddirty {\*\fldinst INCLUDEPICTURE "classtests_1_1test__config__commands_1_1TestConfigCommands_adf9f2233a3f4cc5725b9d4f05758b167_cgraph.svg" \\d \\*MERGEFORMAT}{\fldrslt IMAGE}}\par +} +} +{\xe \v test_get_llm_config_invalid_json\:tests.test_config_commands.TestConfigCommands} +{\xe \v tests.test_config_commands.TestConfigCommands\:test_get_llm_config_invalid_json} +\pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid { +{\b +def tests.test_config_commands.TestConfigCommands.test_get_llm_config_invalid_json ( {\i self}, {\i mock_print}, {\i mock_file_open}, {\i mock_get_config})}} +\par +{\bkmkstart AAAAAAAANX} +{\bkmkend AAAAAAAANX} +{ +\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid +{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid +{ +\par +\pard\plain \s41\li360\widctlpar\adjustright \shading1000\cbpat8 \f2\fs16\cgrid Test function to verify the behavior of get_llm_config when reading an\par +invalid JSON file.\par +\par +It sets up a mock configuration file that exists but contains invalid\par +JSON. The function is expected to handle this gracefully by printing an\par +error message and returning an empty dictionary.\par +\par +Args:\par + mock_print (MagicMock): Mock for the print function.\par + mock_file_open (MagicMock): Mock for the open function.\par + mock_get_config (MagicMock): Mock for the get_config function, which returns the mock configuration\par + file.\par +} + \par +}Here is the call graph for this function:{ +\pard\plain +\par\pard \qc {\field\flddirty {\*\fldinst INCLUDEPICTURE "classtests_1_1test__config__commands_1_1TestConfigCommands_a473984d31452b56acd6ce4011a1248bd_cgraph.svg" \\d \\*MERGEFORMAT}{\fldrslt IMAGE}}\par +} +} +{\xe \v test_get_penify_config_existing_dir\:tests.test_config_commands.TestConfigCommands} +{\xe \v tests.test_config_commands.TestConfigCommands\:test_get_penify_config_existing_dir} +\pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid { +{\b +def tests.test_config_commands.TestConfigCommands.test_get_penify_config_existing_dir ( {\i self}, {\i mock_file_open}, {\i mock_makedirs}, {\i mock_path}, {\i mock_git_folder})}} +\par +{\bkmkstart AAAAAAAANY} +{\bkmkend AAAAAAAANY} +{ +\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid +{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid +{ +\par +\pard\plain \s41\li360\widctlpar\adjustright \shading1000\cbpat8 \f2\fs16\cgrid Test the get_penify_config function when the .penify config directory\par +exists.\par +\par +It should not create a new directory and assert that all mocked\par +functions were called correctly.\par +\par +Args:\par + mock_file_open (MagicMock): A MagicMock object simulating the open() function.\par + mock_makedirs (MagicMock): A MagicMock object simulating the os.makedirs() function.\par + mock_path (MagicMock): A MagicMock object simulating the Path class from pathlib module.\par + mock_git_folder (MagicMock): A MagicMock object simulating the git_folder_search() function.\par +} + \par +}Here is the call graph for this function:{ +\pard\plain +\par\pard \qc {\field\flddirty {\*\fldinst INCLUDEPICTURE "classtests_1_1test__config__commands_1_1TestConfigCommands_a2e8162082bcdd5652bb37bdb14cf453a_cgraph.svg" \\d \\*MERGEFORMAT}{\fldrslt IMAGE}}\par +} +} +{\xe \v test_get_penify_config_new_dir\:tests.test_config_commands.TestConfigCommands} +{\xe \v tests.test_config_commands.TestConfigCommands\:test_get_penify_config_new_dir} +\pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid { +{\b +def tests.test_config_commands.TestConfigCommands.test_get_penify_config_new_dir ( {\i self}, {\i mock_file_open}, {\i mock_makedirs}, {\i mock_path}, {\i mock_git_folder})}} +\par +{\bkmkstart AAAAAAAANZ} +{\bkmkend AAAAAAAANZ} +{ +\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid +{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid +{ +\par +\pard\plain \s41\li360\widctlpar\adjustright \shading1000\cbpat8 \f2\fs16\cgrid Test the behavior of get_penify_config when the .penify directory does\par +not exist.\par +\par +This function mocks various system calls to simulate a scenario where\par +the .penify directory is not present. It then asserts that the\par +appropriate actions are taken to create the directory and write an empty\par +JSON file.\par +\par +Args:\par + mock_file_open (MagicMock): A MagicMock object simulating the `open` function.\par + mock_makedirs (MagicMock): A MagicMock object simulating the `os.makedirs` function.\par + mock_path (MagicMock): A MagicMock object simulating the `Path` class from `pathlib`.\par + mock_git_folder (MagicMock): A MagicMock object simulating a git folder search function.\par +} + \par +}Here is the call graph for this function:{ +\pard\plain +\par\pard \qc {\field\flddirty {\*\fldinst INCLUDEPICTURE "classtests_1_1test__config__commands_1_1TestConfigCommands_a33d4760eee3b67e1cde3aed755ebb948_cgraph.svg" \\d \\*MERGEFORMAT}{\fldrslt IMAGE}}\par +} +} +{\xe \v test_get_token_from_config\:tests.test_config_commands.TestConfigCommands} +{\xe \v tests.test_config_commands.TestConfigCommands\:test_get_token_from_config} +\pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid { +{\b +def tests.test_config_commands.TestConfigCommands.test_get_token_from_config ( {\i self}, {\i mock_file_open}, {\i mock_path}, {\i mock_getenv})}} +\par +{\bkmkstart AAAAAAAAOA} +{\bkmkend AAAAAAAAOA} +{ +\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid +{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid +{ +\par +\pard\plain \s41\li360\widctlpar\adjustright \shading1000\cbpat8 \f2\fs16\cgrid Test retrieving a token from the configuration.\par +\par +This function sets up mocks for environment variables and configuration\par +files, calls the `get_token` function, and asserts its behavior. It\par +verifies that when the environment variable is not found, the function\par +reads a token from a configuration file located in the user's home\par +directory.\par +\par +Args:\par + mock_file_open (MagicMock): A mock for the `open` function.\par + mock_path (MagicMock): A mock for the `pathlib.Path` class.\par + mock_getenv (MagicMock): A mock for the `os.getenv` function.\par +} + \par +}Here is the call graph for this function:{ +\pard\plain +\par\pard \qc {\field\flddirty {\*\fldinst INCLUDEPICTURE "classtests_1_1test__config__commands_1_1TestConfigCommands_a6c0207be563c3de59a6d16277805114c_cgraph.svg" \\d \\*MERGEFORMAT}{\fldrslt IMAGE}}\par +} +} +{\xe \v test_get_token_from_env\:tests.test_config_commands.TestConfigCommands} +{\xe \v tests.test_config_commands.TestConfigCommands\:test_get_token_from_env} +\pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid { +{\b +def tests.test_config_commands.TestConfigCommands.test_get_token_from_env ( {\i self}, {\i mock_file_open}, {\i mock_path}, {\i mock_getenv})}} +\par +{\bkmkstart AAAAAAAAOB} +{\bkmkend AAAAAAAAOB} +{ +\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid +{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid +{ +\par +\pard\plain \s41\li360\widctlpar\adjustright \shading1000\cbpat8 \f2\fs16\cgrid Test retrieving a token from the environment variable.\par +\par +This function tests the behavior of `get_token` when an environment\par +variable is set. It verifies that if the 'PENIFY_API_TOKEN' environment\par +variable exists, the function returns its value without attempting to\par +read a file.\par +\par +Args:\par + mock_file_open (MagicMock): A MagicMock object for simulating file operations.\par + mock_path (MagicMock): A MagicMock object for simulating path operations.\par + mock_getenv (MagicMock): A MagicMock object for simulating environment variable retrieval.\par +} + \par +}Here is the call graph for this function:{ +\pard\plain +\par\pard \qc {\field\flddirty {\*\fldinst INCLUDEPICTURE "classtests_1_1test__config__commands_1_1TestConfigCommands_a3355f7d313bebaa71694387cf2bc5232_cgraph.svg" \\d \\*MERGEFORMAT}{\fldrslt IMAGE}}\par +} +} +{\xe \v test_get_token_not_found\:tests.test_config_commands.TestConfigCommands} +{\xe \v tests.test_config_commands.TestConfigCommands\:test_get_token_not_found} +\pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid { +{\b +def tests.test_config_commands.TestConfigCommands.test_get_token_not_found ( {\i self}, {\i mock_file_open}, {\i mock_path}, {\i mock_getenv})}} +\par +{\bkmkstart AAAAAAAAOC} +{\bkmkend AAAAAAAAOC} +{ +\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid +{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid +{ +\par +\pard\plain \s41\li360\widctlpar\adjustright \shading1000\cbpat8 \f2\fs16\cgrid Test the get_token function when the API token environment variable is\par +not found.\par +\par +This function tests the scenario where the `PENIFY_API_TOKEN`\par +environment variable is not set. It mocks the environment variable to\par +return `None`, and verifies that the function returns `None`. The test\par +also checks that the environment variable is accessed once and that a\par +file open operation is attempted on a configuration file located in the\par +user's home directory.\par +\par +Args:\par + mock_file_open (MagicMock): Mock for the built-in `open` function.\par + mock_path (MagicMock): Mock for the `pathlib.Path` module.\par + mock_getenv (MagicMock): Mock for the `os.getenv` function.\par +\par +Returns:\par + None: The function does not return anything; it asserts conditions to verify\par + correctness.\par +} + \par +}Here is the call graph for this function:{ +\pard\plain +\par\pard \qc {\field\flddirty {\*\fldinst INCLUDEPICTURE "classtests_1_1test__config__commands_1_1TestConfigCommands_a400ca5d9fcdc159714e8df54920f9436_cgraph.svg" \\d \\*MERGEFORMAT}{\fldrslt IMAGE}}\par +} +} +{\xe \v test_save_jira_config_success\:tests.test_config_commands.TestConfigCommands} +{\xe \v tests.test_config_commands.TestConfigCommands\:test_save_jira_config_success} +\pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid { +{\b +def tests.test_config_commands.TestConfigCommands.test_save_jira_config_success ( {\i self}, {\i mock_print}, {\i mock_json_dump}, {\i mock_file_open}, {\i mock_path})}} +\par +{\bkmkstart AAAAAAAAOD} +{\bkmkend AAAAAAAAOD} +{ +\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid +{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid +{ +\par +\pard\plain \s41\li360\widctlpar\adjustright \shading1000\cbpat8 \f2\fs16\cgrid Test the save_jira_config function to ensure it saves JIRA configuration\par +successfully.\par +\par +This function sets up mocks for various dependencies and tests the\par +functionality of saving a JIRA configuration. It asserts that the\par +function returns `True`, the JSON dump is called with the correct\par +configuration, and the print statement contains the expected message.\par +\par +Args:\par + mock_print (MagicMock): Mock for the print function.\par + mock_json_dump (MagicMock): Mock for the json.dump function.\par + mock_file_open (MagicMock): Mock for the open function.\par + mock_path (MagicMock): Mock for the path module.\par +} + \par +}Here is the call graph for this function:{ +\pard\plain +\par\pard \qc {\field\flddirty {\*\fldinst INCLUDEPICTURE "classtests_1_1test__config__commands_1_1TestConfigCommands_af8d62310da2d768e21770f8f01ff5375_cgraph.svg" \\d \\*MERGEFORMAT}{\fldrslt IMAGE}}\par +} +} +{\xe \v test_save_llm_config_failure\:tests.test_config_commands.TestConfigCommands} +{\xe \v tests.test_config_commands.TestConfigCommands\:test_save_llm_config_failure} +\pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid { +{\b +def tests.test_config_commands.TestConfigCommands.test_save_llm_config_failure ( {\i self}, {\i mock_print}, {\i mock_file_open}, {\i mock_get_config})}} +\par +{\bkmkstart AAAAAAAAOE} +{\bkmkend AAAAAAAAOE} +{ +\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid +{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid +{ +\par +\pard\plain \s41\li360\widctlpar\adjustright \shading1000\cbpat8 \f2\fs16\cgrid Test function to verify that the save_llm_config function returns False\par +and prints an error message when it fails to save the LLM configuration\par +due to a permission error.\par +\par +It sets up a mock configuration file that exists and calls the\par +save_llm_config function with valid parameters. The function is expected\par +to return False and print "Error saving LLM configuration: Permission\par +denied" in case of a failure.\par +\par +Args:\par + self (TestLLMConfig): An instance of the test class.\par + mock_print (MagicMock): A MagicMock object representing the print function, which will be used\par + to assert that it was called with the expected error message.\par + mock_file_open (MagicMock): A MagicMock object representing the open function, which is not used in\par + this test but is included as a parameter for completeness.\par + mock_get_config (MagicMock): A MagicMock object representing the get_config function, which will be\par + used to return the mock configuration file.\par +} + \par +}Here is the call graph for this function:{ +\pard\plain +\par\pard \qc {\field\flddirty {\*\fldinst INCLUDEPICTURE "classtests_1_1test__config__commands_1_1TestConfigCommands_a73a264dfb21e16003e095b79f6eab2ac_cgraph.svg" \\d \\*MERGEFORMAT}{\fldrslt IMAGE}}\par +} +} +{\xe \v test_save_llm_config_success\:tests.test_config_commands.TestConfigCommands} +{\xe \v tests.test_config_commands.TestConfigCommands\:test_save_llm_config_success} +\pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid { +{\b +def tests.test_config_commands.TestConfigCommands.test_save_llm_config_success ( {\i self}, {\i mock_print}, {\i mock_json_dump}, {\i mock_file_open}, {\i mock_get_config})}} +\par +{\bkmkstart AAAAAAAAOF} +{\bkmkend AAAAAAAAOF} +{ +\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid +{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid +{ +\par +\pard\plain \s41\li360\widctlpar\adjustright \shading1000\cbpat8 \f2\fs16\cgrid Test the save_llm_config function successfully.\par +\par +This function tests that the save_llm_config function correctly saves an\par +LLM configuration and handles various mock objects and side effects. It\par +ensures that the function returns True upon successful execution, writes\par +the expected configuration to a file, and prints a confirmation message.\par +\par +Args:\par + mock_print (MagicMock): A mock object for the print function.\par + mock_json_dump (MagicMock): A mock object for json.dump.\par + mock_file_open (MagicMock): A mock object for file opening.\par + mock_get_config (MagicMock): A mock object to return a configuration file mock.\par +} + \par +}Here is the call graph for this function:{ +\pard\plain +\par\pard \qc {\field\flddirty {\*\fldinst INCLUDEPICTURE "classtests_1_1test__config__commands_1_1TestConfigCommands_acd8df8219441b9e9871b903a681400d9_cgraph.svg" \\d \\*MERGEFORMAT}{\fldrslt IMAGE}}\par +} +} +{\pard\widctlpar\brdrb\brdrs\brdrw5\brsp20 \adjustright \par} +The documentation for this class was generated from the following file:{\par +\pard\plain \s121\fi-360\li720\widctlpar\jclisttab\tx720{\*\pn \pnlvlbody\ilvl0\ls2\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +/tmp/github_reposRepoArchDocGenContext/Penify-dev/penify-cli/tests/{\b test_config_commands.py}\par +}\par \pard\plain + +\pard\plain \sect\sbkpage +\s2\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs28\kerning28\cgrid +\pard\plain \s2\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs28\kerning28\cgrid +tests.test_web_config.TestWebConfig Class Reference\par \pard\plain +{\tc\tcl2 \v tests.test_web_config.TestWebConfig} +{\xe \v tests.test_web_config.TestWebConfig} +{\bkmkstart AAAAAAAAOT} +{\bkmkend AAAAAAAAOT} +Collaboration diagram for tests.test_web_config.TestWebConfig:{ +\pard\plain +\par\pard \qc {\field\flddirty {\*\fldinst INCLUDEPICTURE "classtests_1_1test__web__config_1_1TestWebConfig__coll__graph.svg" \\d \\*MERGEFORMAT}{\fldrslt IMAGE}}\par +} +\par +\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid +Public Member Functions\par +\pard\plain + +{ +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +def {\b test_config_llm_web_server_setup} (self, mock_resource_filename, mock_server, mock_webbrowser)\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +def {\b test_config_jira_web_server_setup} (self, mock_resource_filename, mock_server, mock_webbrowser)\par +} +{\pard\widctlpar\brdrb\brdrs\brdrw5\brsp20 \adjustright \par} +\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid +Member Function Documentation\par +\pard\plain +{\xe \v test_config_jira_web_server_setup\:tests.test_web_config.TestWebConfig} +{\xe \v tests.test_web_config.TestWebConfig\:test_config_jira_web_server_setup} +\pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid { +{\b +def tests.test_web_config.TestWebConfig.test_config_jira_web_server_setup ( {\i self}, {\i mock_resource_filename}, {\i mock_server}, {\i mock_webbrowser})}} +\par +{\bkmkstart AAAAAAAAOU} +{\bkmkend AAAAAAAAOU} +{ +\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid +{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid +{ +\par +\pard\plain \s41\li360\widctlpar\adjustright \shading1000\cbpat8 \f2\fs16\cgrid Test the configuration and setup of a JIRA web server.\par +\par +This function tests the entire process of setting up a JIRA web server,\par +including mocking necessary resources, configuring the server to shut\par +down after handling one request, and verifying that the web browser is\par +opened with the correct URL. The function uses several mocks to simulate\par +external dependencies such as resource files, servers, and web browsers.\par +\par +Args:\par + mock_resource_filename (MagicMock): A MagicMock object for simulating the `resource_filename` function.\par + mock_server (MagicMock): A MagicMock object for simulating the server setup.\par + mock_webbrowser (MagicMock): A MagicMock object for simulating the web browser opening.\par +} + \par +}Here is the call graph for this function:{ +\pard\plain +\par\pard \qc {\field\flddirty {\*\fldinst INCLUDEPICTURE "classtests_1_1test__web__config_1_1TestWebConfig_a06e600222e426b003850509cb1d3190a_cgraph.svg" \\d \\*MERGEFORMAT}{\fldrslt IMAGE}}\par +} +} +{\xe \v test_config_llm_web_server_setup\:tests.test_web_config.TestWebConfig} +{\xe \v tests.test_web_config.TestWebConfig\:test_config_llm_web_server_setup} +\pard\plain \s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs20\cgrid { +{\b +def tests.test_web_config.TestWebConfig.test_config_llm_web_server_setup ( {\i self}, {\i mock_resource_filename}, {\i mock_server}, {\i mock_webbrowser})}} +\par +{\bkmkstart AAAAAAAAOV} +{\bkmkend AAAAAAAAOV} +{ +\pard\plain \s61\li360\sa60\sb30\qj\widctlpar\qj\adjustright \fs20\cgrid +{\s17\sa60\sb30\widctlpar\qj \fs22\cgrid +{ +\par +\pard\plain \s41\li360\widctlpar\adjustright \shading1000\cbpat8 \f2\fs16\cgrid Set up and test the web server configuration for an LLM (Large Language\par +Model) web interface.\par +\par +This function configures a mock web server for testing purposes,\par +including setting up resource filenames, mocking server behavior, and\par +verifying that the web browser is opened and the server starts\par +correctly. The function uses various mocks to simulate external\par +dependencies such as `resource_filename` and `server`.\par +\par +Args:\par + mock_resource_filename (MagicMock): A MagicMock object simulating the `resource_filename` function.\par + mock_server (MagicMock): A MagicMock object simulating the context manager for the web server.\par + mock_webbrowser (MagicMock): A MagicMock object simulating the `webbrowser` module.\par +} + \par +}Here is the call graph for this function:{ +\pard\plain +\par\pard \qc {\field\flddirty {\*\fldinst INCLUDEPICTURE "classtests_1_1test__web__config_1_1TestWebConfig_afc6440352201d207ea8b4d26f8ccfa35_cgraph.svg" \\d \\*MERGEFORMAT}{\fldrslt IMAGE}}\par +} +} +{\pard\widctlpar\brdrb\brdrs\brdrw5\brsp20 \adjustright \par} +The documentation for this class was generated from the following file:{\par +\pard\plain \s121\fi-360\li720\widctlpar\jclisttab\tx720{\*\pn \pnlvlbody\ilvl0\ls2\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +/tmp/github_reposRepoArchDocGenContext/Penify-dev/penify-cli/tests/{\b test_web_config.py}\par +} +\pard\plain \sect\sbkpage +\s1\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs36\kerning36\cgrid +File Documentation{\tc \v File Documentation} +\par \pard\plain +\pard\plain \s2\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs28\kerning28\cgrid +/tmp/github_reposRepoArchDocGenContext/Penify-dev/penify-cli/docs/commit-commands.md File Reference\par \pard\plain +{\tc\tcl2 \v /tmp/github_reposRepoArchDocGenContext/Penify-dev/penify-cli/docs/commit-commands.md} +{\xe \v /tmp/github_reposRepoArchDocGenContext/Penify-dev/penify-cli/docs/commit-commands.md} +{\bkmkstart AAAAAAAAAA} +{\bkmkend AAAAAAAAAA} +\par \pard\plain + +\pard\plain \sect\sbkpage +\s2\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs28\kerning28\cgrid +\pard\plain \s2\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs28\kerning28\cgrid +/tmp/github_reposRepoArchDocGenContext/Penify-dev/penify-cli/docs/config-commands.md File Reference\par \pard\plain +{\tc\tcl2 \v /tmp/github_reposRepoArchDocGenContext/Penify-dev/penify-cli/docs/config-commands.md} +{\xe \v /tmp/github_reposRepoArchDocGenContext/Penify-dev/penify-cli/docs/config-commands.md} +{\bkmkstart AAAAAAAAAB} +{\bkmkend AAAAAAAAAB} +\par \pard\plain + +\pard\plain \sect\sbkpage +\s2\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs28\kerning28\cgrid +\pard\plain \s2\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs28\kerning28\cgrid +/tmp/github_reposRepoArchDocGenContext/Penify-dev/penify-cli/docs/detailed-usage.md File Reference\par \pard\plain +{\tc\tcl2 \v /tmp/github_reposRepoArchDocGenContext/Penify-dev/penify-cli/docs/detailed-usage.md} +{\xe \v /tmp/github_reposRepoArchDocGenContext/Penify-dev/penify-cli/docs/detailed-usage.md} +{\bkmkstart AAAAAAAAAC} +{\bkmkend AAAAAAAAAC} +\par \pard\plain + +\pard\plain \sect\sbkpage +\s2\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs28\kerning28\cgrid +\pard\plain \s2\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs28\kerning28\cgrid +/tmp/github_reposRepoArchDocGenContext/Penify-dev/penify-cli/docs/doc_commands.md File Reference\par \pard\plain +{\tc\tcl2 \v /tmp/github_reposRepoArchDocGenContext/Penify-dev/penify-cli/docs/doc_commands.md} +{\xe \v /tmp/github_reposRepoArchDocGenContext/Penify-dev/penify-cli/docs/doc_commands.md} +{\bkmkstart AAAAAAAAAD} +{\bkmkend AAAAAAAAAD} +\par \pard\plain + +\pard\plain \sect\sbkpage +\s2\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs28\kerning28\cgrid +\pard\plain \s2\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs28\kerning28\cgrid +/tmp/github_reposRepoArchDocGenContext/Penify-dev/penify-cli/docs/example-workflows.md File Reference\par \pard\plain +{\tc\tcl2 \v /tmp/github_reposRepoArchDocGenContext/Penify-dev/penify-cli/docs/example-workflows.md} +{\xe \v /tmp/github_reposRepoArchDocGenContext/Penify-dev/penify-cli/docs/example-workflows.md} +{\bkmkstart AAAAAAAAAE} +{\bkmkend AAAAAAAAAE} +\par \pard\plain + +\pard\plain \sect\sbkpage +\s2\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs28\kerning28\cgrid +\pard\plain \s2\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs28\kerning28\cgrid +/tmp/github_reposRepoArchDocGenContext/Penify-dev/penify-cli/docs/penify-cli-documentation.md File Reference\par \pard\plain +{\tc\tcl2 \v /tmp/github_reposRepoArchDocGenContext/Penify-dev/penify-cli/docs/penify-cli-documentation.md} +{\xe \v /tmp/github_reposRepoArchDocGenContext/Penify-dev/penify-cli/docs/penify-cli-documentation.md} +{\bkmkstart AAAAAAAAAF} +{\bkmkend AAAAAAAAAF} +\par \pard\plain + +\pard\plain \sect\sbkpage +\s2\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs28\kerning28\cgrid +\pard\plain \s2\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs28\kerning28\cgrid +/tmp/github_reposRepoArchDocGenContext/Penify-dev/penify-cli/penify_hook/api_client.py File Reference\par \pard\plain +{\tc\tcl2 \v /tmp/github_reposRepoArchDocGenContext/Penify-dev/penify-cli/penify_hook/api_client.py} +{\xe \v /tmp/github_reposRepoArchDocGenContext/Penify-dev/penify-cli/penify_hook/api_client.py} +{\bkmkstart AAAAAAAAAG} +{\bkmkend AAAAAAAAAG} +\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid +Classes\par +\pard\plain + +{ +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +class {\b penify_hook.api_client.APIClient}\par +} +\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid +Namespaces\par +\pard\plain + +{ +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +namespace {\b penify_hook}\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +namespace {\b penify_hook.api_client}\par +} +\par \pard\plain + +\pard\plain \sect\sbkpage +\s2\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs28\kerning28\cgrid +\pard\plain \s2\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs28\kerning28\cgrid +/tmp/github_reposRepoArchDocGenContext/Penify-dev/penify-cli/penify_hook/base_analyzer.py File Reference\par \pard\plain +{\tc\tcl2 \v /tmp/github_reposRepoArchDocGenContext/Penify-dev/penify-cli/penify_hook/base_analyzer.py} +{\xe \v /tmp/github_reposRepoArchDocGenContext/Penify-dev/penify-cli/penify_hook/base_analyzer.py} +{\bkmkstart AAAAAAAAAH} +{\bkmkend AAAAAAAAAH} +\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid +Classes\par +\pard\plain + +{ +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +class {\b penify_hook.base_analyzer.BaseAnalyzer}\par +} +\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid +Namespaces\par +\pard\plain + +{ +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +namespace {\b penify_hook}\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +namespace {\b penify_hook.base_analyzer}\par +} +\par \pard\plain + +\pard\plain \sect\sbkpage +\s2\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs28\kerning28\cgrid +\pard\plain \s2\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs28\kerning28\cgrid +/tmp/github_reposRepoArchDocGenContext/Penify-dev/penify-cli/penify_hook/__init__.py File Reference\par \pard\plain +{\tc\tcl2 \v /tmp/github_reposRepoArchDocGenContext/Penify-dev/penify-cli/penify_hook/__init__.py} +{\xe \v /tmp/github_reposRepoArchDocGenContext/Penify-dev/penify-cli/penify_hook/__init__.py} +{\bkmkstart AAAAAAAAAI} +{\bkmkend AAAAAAAAAI} +\par \pard\plain + +\pard\plain \sect\sbkpage +\s2\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs28\kerning28\cgrid +\pard\plain \s2\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs28\kerning28\cgrid +/tmp/github_reposRepoArchDocGenContext/Penify-dev/penify-cli/penify_hook/commands/__init__.py File Reference\par \pard\plain +{\tc\tcl2 \v /tmp/github_reposRepoArchDocGenContext/Penify-dev/penify-cli/penify_hook/commands/__init__.py} +{\xe \v /tmp/github_reposRepoArchDocGenContext/Penify-dev/penify-cli/penify_hook/commands/__init__.py} +{\bkmkstart AAAAAAAAAJ} +{\bkmkend AAAAAAAAAJ} +\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid +Namespaces\par +\pard\plain + +{ +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +namespace {\b penify_hook}\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +namespace {\b penify_hook.commands}\par +} +\par \pard\plain + +\pard\plain \sect\sbkpage +\s2\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs28\kerning28\cgrid +\pard\plain \s2\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs28\kerning28\cgrid +/tmp/github_reposRepoArchDocGenContext/Penify-dev/penify-cli/tests/__init__.py File Reference\par \pard\plain +{\tc\tcl2 \v /tmp/github_reposRepoArchDocGenContext/Penify-dev/penify-cli/tests/__init__.py} +{\xe \v /tmp/github_reposRepoArchDocGenContext/Penify-dev/penify-cli/tests/__init__.py} +{\bkmkstart AAAAAAAAAK} +{\bkmkend AAAAAAAAAK} +\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid +Namespaces\par +\pard\plain + +{ +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +namespace {\b tests}\par +} +\par \pard\plain + +\pard\plain \sect\sbkpage +\s2\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs28\kerning28\cgrid +\pard\plain \s2\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs28\kerning28\cgrid +/tmp/github_reposRepoArchDocGenContext/Penify-dev/penify-cli/penify_hook/commands/auth_commands.py File Reference\par \pard\plain +{\tc\tcl2 \v /tmp/github_reposRepoArchDocGenContext/Penify-dev/penify-cli/penify_hook/commands/auth_commands.py} +{\xe \v /tmp/github_reposRepoArchDocGenContext/Penify-dev/penify-cli/penify_hook/commands/auth_commands.py} +{\bkmkstart AAAAAAAAAL} +{\bkmkend AAAAAAAAAL} +\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid +Namespaces\par +\pard\plain + +{ +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +namespace {\b penify_hook}\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +namespace {\b penify_hook.commands}\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +namespace {\b penify_hook.commands.auth_commands}\par +} +\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid +Functions\par +\pard\plain + +{ +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +def {\b penify_hook.commands.auth_commands.save_credentials} (api_key)\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +def {\b penify_hook.commands.auth_commands.login} (api_url, dashboard_url)\par +} +\par \pard\plain + +\pard\plain \sect\sbkpage +\s2\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs28\kerning28\cgrid +\pard\plain \s2\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs28\kerning28\cgrid +/tmp/github_reposRepoArchDocGenContext/Penify-dev/penify-cli/penify_hook/commands/commit_commands.py File Reference\par \pard\plain +{\tc\tcl2 \v /tmp/github_reposRepoArchDocGenContext/Penify-dev/penify-cli/penify_hook/commands/commit_commands.py} +{\xe \v /tmp/github_reposRepoArchDocGenContext/Penify-dev/penify-cli/penify_hook/commands/commit_commands.py} +{\bkmkstart AAAAAAAAAM} +{\bkmkend AAAAAAAAAM} +\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid +Namespaces\par +\pard\plain + +{ +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +namespace {\b penify_hook}\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +namespace {\b penify_hook.commands}\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +namespace {\b penify_hook.commands.commit_commands}\par +} +\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid +Functions\par +\pard\plain + +{ +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +def {\b penify_hook.commands.commit_commands.commit_code} (api_url, token, message, open_terminal, generate_description, llm_model=None, llm_api_base=None, llm_api_key=None, jira_url=None, jira_user=None, jira_api_token=None)\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +def {\b penify_hook.commands.commit_commands.setup_commit_parser} (parser)\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +def {\b penify_hook.commands.commit_commands.handle_commit} (args)\par +} +\par \pard\plain + +\pard\plain \sect\sbkpage +\s2\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs28\kerning28\cgrid +\pard\plain \s2\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs28\kerning28\cgrid +/tmp/github_reposRepoArchDocGenContext/Penify-dev/penify-cli/penify_hook/commands/config_commands.py File Reference\par \pard\plain +{\tc\tcl2 \v /tmp/github_reposRepoArchDocGenContext/Penify-dev/penify-cli/penify_hook/commands/config_commands.py} +{\xe \v /tmp/github_reposRepoArchDocGenContext/Penify-dev/penify-cli/penify_hook/commands/config_commands.py} +{\bkmkstart AAAAAAAAAN} +{\bkmkend AAAAAAAAAN} +\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid +Namespaces\par +\pard\plain + +{ +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +namespace {\b penify_hook}\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +namespace {\b penify_hook.commands}\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +namespace {\b penify_hook.commands.config_commands}\par +} +\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid +Functions\par +\pard\plain + +{ +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +None {\b penify_hook.commands.config_commands.load_env_files} ()\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +Path {\b penify_hook.commands.config_commands.get_penify_config} ()\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +Any {\b penify_hook.commands.config_commands.get_env_var_or_default} (str env_var, Any default=None)\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +def {\b penify_hook.commands.config_commands.save_llm_config} (model, api_base, api_key)\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +def {\b penify_hook.commands.config_commands.save_jira_config} (url, username, api_token)\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +Dict[str, str] {\b penify_hook.commands.config_commands.get_llm_config} ()\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +Dict[str, str] {\b penify_hook.commands.config_commands.get_jira_config} ()\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +def {\b penify_hook.commands.config_commands.config_llm_web} ()\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +def {\b penify_hook.commands.config_commands.config_jira_web} ()\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +Optional[str] {\b penify_hook.commands.config_commands.get_token} ()\par +} +\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid +Variables\par +\pard\plain + +{ +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +bool {\b penify_hook.commands.config_commands.DOTENV_AVAILABLE} = True\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +{\b penify_hook.commands.config_commands.path}\par +} +\par \pard\plain + +\pard\plain \sect\sbkpage +\s2\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs28\kerning28\cgrid +\pard\plain \s2\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs28\kerning28\cgrid +/tmp/github_reposRepoArchDocGenContext/Penify-dev/penify-cli/penify_hook/commands/doc_commands.py File Reference\par \pard\plain +{\tc\tcl2 \v /tmp/github_reposRepoArchDocGenContext/Penify-dev/penify-cli/penify_hook/commands/doc_commands.py} +{\xe \v /tmp/github_reposRepoArchDocGenContext/Penify-dev/penify-cli/penify_hook/commands/doc_commands.py} +{\bkmkstart AAAAAAAAAO} +{\bkmkend AAAAAAAAAO} +\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid +Namespaces\par +\pard\plain + +{ +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +namespace {\b penify_hook}\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +namespace {\b penify_hook.commands}\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +namespace {\b penify_hook.commands.doc_commands}\par +} +\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid +Functions\par +\pard\plain + +{ +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +def {\b penify_hook.commands.doc_commands.generate_doc} (api_url, token, location=None)\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +def {\b penify_hook.commands.doc_commands.setup_docgen_parser} (parser)\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +def {\b penify_hook.commands.doc_commands.handle_docgen} (args)\par +} +\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid +Variables\par +\pard\plain + +{ +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +string {\b penify_hook.commands.doc_commands.docgen_description}\par +} +\par \pard\plain + +\pard\plain \sect\sbkpage +\s2\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs28\kerning28\cgrid +\pard\plain \s2\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs28\kerning28\cgrid +/tmp/github_reposRepoArchDocGenContext/Penify-dev/penify-cli/penify_hook/commands/hook_commands.py File Reference\par \pard\plain +{\tc\tcl2 \v /tmp/github_reposRepoArchDocGenContext/Penify-dev/penify-cli/penify_hook/commands/hook_commands.py} +{\xe \v /tmp/github_reposRepoArchDocGenContext/Penify-dev/penify-cli/penify_hook/commands/hook_commands.py} +{\bkmkstart AAAAAAAAAP} +{\bkmkend AAAAAAAAAP} +\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid +Namespaces\par +\pard\plain + +{ +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +namespace {\b penify_hook}\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +namespace {\b penify_hook.commands}\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +namespace {\b penify_hook.commands.hook_commands}\par +} +\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid +Functions\par +\pard\plain + +{ +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +def {\b penify_hook.commands.hook_commands.install_git_hook} (location, token)\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +def {\b penify_hook.commands.hook_commands.uninstall_git_hook} (location)\par +} +\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid +Variables\par +\pard\plain + +{ +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +string {\b penify_hook.commands.hook_commands.HOOK_FILENAME} = "post-commit"\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +string {\b penify_hook.commands.hook_commands.HOOK_TEMPLATE}\par +} +\par \pard\plain + +\pard\plain \sect\sbkpage +\s2\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs28\kerning28\cgrid +\pard\plain \s2\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs28\kerning28\cgrid +/tmp/github_reposRepoArchDocGenContext/Penify-dev/penify-cli/penify_hook/commit_analyzer.py File Reference\par \pard\plain +{\tc\tcl2 \v /tmp/github_reposRepoArchDocGenContext/Penify-dev/penify-cli/penify_hook/commit_analyzer.py} +{\xe \v /tmp/github_reposRepoArchDocGenContext/Penify-dev/penify-cli/penify_hook/commit_analyzer.py} +{\bkmkstart AAAAAAAAAQ} +{\bkmkend AAAAAAAAAQ} +\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid +Classes\par +\pard\plain + +{ +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +class {\b penify_hook.commit_analyzer.CommitDocGenHook}\par +} +\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid +Namespaces\par +\pard\plain + +{ +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +namespace {\b penify_hook}\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +namespace {\b penify_hook.commit_analyzer}\par +} +\par \pard\plain + +\pard\plain \sect\sbkpage +\s2\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs28\kerning28\cgrid +\pard\plain \s2\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs28\kerning28\cgrid +/tmp/github_reposRepoArchDocGenContext/Penify-dev/penify-cli/penify_hook/config_command.py File Reference\par \pard\plain +{\tc\tcl2 \v /tmp/github_reposRepoArchDocGenContext/Penify-dev/penify-cli/penify_hook/config_command.py} +{\xe \v /tmp/github_reposRepoArchDocGenContext/Penify-dev/penify-cli/penify_hook/config_command.py} +{\bkmkstart AAAAAAAAAR} +{\bkmkend AAAAAAAAAR} +\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid +Namespaces\par +\pard\plain + +{ +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +namespace {\b penify_hook}\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +namespace {\b penify_hook.config_command}\par +} +\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid +Functions\par +\pard\plain + +{ +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +def {\b penify_hook.config_command.setup_config_parser} (parent_parser)\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +def {\b penify_hook.config_command.handle_config} (args)\par +} +\par \pard\plain + +\pard\plain \sect\sbkpage +\s2\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs28\kerning28\cgrid +\pard\plain \s2\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs28\kerning28\cgrid +/tmp/github_reposRepoArchDocGenContext/Penify-dev/penify-cli/penify_hook/constants.py File Reference\par \pard\plain +{\tc\tcl2 \v /tmp/github_reposRepoArchDocGenContext/Penify-dev/penify-cli/penify_hook/constants.py} +{\xe \v /tmp/github_reposRepoArchDocGenContext/Penify-dev/penify-cli/penify_hook/constants.py} +{\bkmkstart AAAAAAAAAS} +{\bkmkend AAAAAAAAAS} +\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid +Namespaces\par +\pard\plain + +{ +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +namespace {\b penify_hook}\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +namespace {\b penify_hook.constants}\par +} +\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid +Variables\par +\pard\plain + +{ +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +string {\b penify_hook.constants.API_URL} = 'http://localhost:8000/api'\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +string {\b penify_hook.constants.DASHBOARD_URL} = "https://dashboard.penify.dev/auth/localhost/login"\par +} +\par \pard\plain + +\pard\plain \sect\sbkpage +\s2\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs28\kerning28\cgrid +\pard\plain \s2\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs28\kerning28\cgrid +/tmp/github_reposRepoArchDocGenContext/Penify-dev/penify-cli/penify_hook/file_analyzer.py File Reference\par \pard\plain +{\tc\tcl2 \v /tmp/github_reposRepoArchDocGenContext/Penify-dev/penify-cli/penify_hook/file_analyzer.py} +{\xe \v /tmp/github_reposRepoArchDocGenContext/Penify-dev/penify-cli/penify_hook/file_analyzer.py} +{\bkmkstart AAAAAAAAAT} +{\bkmkend AAAAAAAAAT} +\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid +Classes\par +\pard\plain + +{ +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +class {\b penify_hook.file_analyzer.FileAnalyzerGenHook}\par +} +\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid +Namespaces\par +\pard\plain + +{ +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +namespace {\b penify_hook}\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +namespace {\b penify_hook.file_analyzer}\par +} +\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid +Variables\par +\pard\plain + +{ +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +{\b penify_hook.file_analyzer.logger} = logging.getLogger(__name__)\par +} +\par \pard\plain + +\pard\plain \sect\sbkpage +\s2\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs28\kerning28\cgrid +\pard\plain \s2\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs28\kerning28\cgrid +/tmp/github_reposRepoArchDocGenContext/Penify-dev/penify-cli/penify_hook/folder_analyzer.py File Reference\par \pard\plain +{\tc\tcl2 \v /tmp/github_reposRepoArchDocGenContext/Penify-dev/penify-cli/penify_hook/folder_analyzer.py} +{\xe \v /tmp/github_reposRepoArchDocGenContext/Penify-dev/penify-cli/penify_hook/folder_analyzer.py} +{\bkmkstart AAAAAAAAAU} +{\bkmkend AAAAAAAAAU} +\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid +Classes\par +\pard\plain + +{ +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +class {\b penify_hook.folder_analyzer.FolderAnalyzerGenHook}\par +} +\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid +Namespaces\par +\pard\plain + +{ +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +namespace {\b penify_hook}\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +namespace {\b penify_hook.folder_analyzer}\par +} +\par \pard\plain + +\pard\plain \sect\sbkpage +\s2\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs28\kerning28\cgrid +\pard\plain \s2\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs28\kerning28\cgrid +/tmp/github_reposRepoArchDocGenContext/Penify-dev/penify-cli/penify_hook/git_analyzer.py File Reference\par \pard\plain +{\tc\tcl2 \v /tmp/github_reposRepoArchDocGenContext/Penify-dev/penify-cli/penify_hook/git_analyzer.py} +{\xe \v /tmp/github_reposRepoArchDocGenContext/Penify-dev/penify-cli/penify_hook/git_analyzer.py} +{\bkmkstart AAAAAAAAAV} +{\bkmkend AAAAAAAAAV} +\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid +Classes\par +\pard\plain + +{ +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +class {\b penify_hook.git_analyzer.GitDocGenHook}\par +} +\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid +Namespaces\par +\pard\plain + +{ +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +namespace {\b penify_hook}\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +namespace {\b penify_hook.git_analyzer}\par +} +\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid +Variables\par +\pard\plain + +{ +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +{\b penify_hook.git_analyzer.logger} = logging.getLogger(__name__)\par +} +\par \pard\plain + +\pard\plain \sect\sbkpage +\s2\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs28\kerning28\cgrid +\pard\plain \s2\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs28\kerning28\cgrid +/tmp/github_reposRepoArchDocGenContext/Penify-dev/penify-cli/penify_hook/jira_client.py File Reference\par \pard\plain +{\tc\tcl2 \v /tmp/github_reposRepoArchDocGenContext/Penify-dev/penify-cli/penify_hook/jira_client.py} +{\xe \v /tmp/github_reposRepoArchDocGenContext/Penify-dev/penify-cli/penify_hook/jira_client.py} +{\bkmkstart AAAAAAAAAW} +{\bkmkend AAAAAAAAAW} +\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid +Classes\par +\pard\plain + +{ +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +class {\b penify_hook.jira_client.JiraClient}\par +} +\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid +Namespaces\par +\pard\plain + +{ +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +namespace {\b penify_hook}\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +namespace {\b penify_hook.jira_client}\par +} +\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid +Variables\par +\pard\plain + +{ +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +bool {\b penify_hook.jira_client.JIRA_AVAILABLE} = True\par +} +\par \pard\plain + +\pard\plain \sect\sbkpage +\s2\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs28\kerning28\cgrid +\pard\plain \s2\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs28\kerning28\cgrid +/tmp/github_reposRepoArchDocGenContext/Penify-dev/penify-cli/penify_hook/llm_client.py File Reference\par \pard\plain +{\tc\tcl2 \v /tmp/github_reposRepoArchDocGenContext/Penify-dev/penify-cli/penify_hook/llm_client.py} +{\xe \v /tmp/github_reposRepoArchDocGenContext/Penify-dev/penify-cli/penify_hook/llm_client.py} +{\bkmkstart AAAAAAAAAX} +{\bkmkend AAAAAAAAAX} +\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid +Classes\par +\pard\plain + +{ +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +class {\b penify_hook.llm_client.LLMClient}\par +} +\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid +Namespaces\par +\pard\plain + +{ +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +namespace {\b penify_hook}\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +namespace {\b penify_hook.llm_client}\par +} +\par \pard\plain + +\pard\plain \sect\sbkpage +\s2\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs28\kerning28\cgrid +\pard\plain \s2\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs28\kerning28\cgrid +/tmp/github_reposRepoArchDocGenContext/Penify-dev/penify-cli/penify_hook/login_command.py File Reference\par \pard\plain +{\tc\tcl2 \v /tmp/github_reposRepoArchDocGenContext/Penify-dev/penify-cli/penify_hook/login_command.py} +{\xe \v /tmp/github_reposRepoArchDocGenContext/Penify-dev/penify-cli/penify_hook/login_command.py} +{\bkmkstart AAAAAAAAAY} +{\bkmkend AAAAAAAAAY} +\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid +Namespaces\par +\pard\plain + +{ +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +namespace {\b penify_hook}\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +namespace {\b penify_hook.login_command}\par +} +\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid +Functions\par +\pard\plain + +{ +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +def {\b penify_hook.login_command.setup_login_parser} (parser)\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +def {\b penify_hook.login_command.handle_login} (args)\par +} +\par \pard\plain + +\pard\plain \sect\sbkpage +\s2\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs28\kerning28\cgrid +\pard\plain \s2\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs28\kerning28\cgrid +/tmp/github_reposRepoArchDocGenContext/Penify-dev/penify-cli/penify_hook/main.py File Reference\par \pard\plain +{\tc\tcl2 \v /tmp/github_reposRepoArchDocGenContext/Penify-dev/penify-cli/penify_hook/main.py} +{\xe \v /tmp/github_reposRepoArchDocGenContext/Penify-dev/penify-cli/penify_hook/main.py} +{\bkmkstart AAAAAAAAAZ} +{\bkmkend AAAAAAAAAZ} +\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid +Namespaces\par +\pard\plain + +{ +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +namespace {\b penify_hook}\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +namespace {\b penify_hook.main}\par +} +\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid +Functions\par +\pard\plain + +{ +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +def {\b penify_hook.main.main} ()\par +} +\par \pard\plain + +\pard\plain \sect\sbkpage +\s2\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs28\kerning28\cgrid +\pard\plain \s2\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs28\kerning28\cgrid +/tmp/github_reposRepoArchDocGenContext/Penify-dev/penify-cli/penify_hook/ui_utils.py File Reference\par \pard\plain +{\tc\tcl2 \v /tmp/github_reposRepoArchDocGenContext/Penify-dev/penify-cli/penify_hook/ui_utils.py} +{\xe \v /tmp/github_reposRepoArchDocGenContext/Penify-dev/penify-cli/penify_hook/ui_utils.py} +{\bkmkstart AAAAAAAABA} +{\bkmkend AAAAAAAABA} +\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid +Namespaces\par +\pard\plain + +{ +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +namespace {\b penify_hook}\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +namespace {\b penify_hook.ui_utils}\par +} +\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid +Functions\par +\pard\plain + +{ +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +def {\b penify_hook.ui_utils.format_info} (message)\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +def {\b penify_hook.ui_utils.format_success} (message)\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +def {\b penify_hook.ui_utils.format_warning} (message)\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +def {\b penify_hook.ui_utils.format_error} (message)\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +def {\b penify_hook.ui_utils.format_highlight} (message)\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +def {\b penify_hook.ui_utils.format_file_path} (file_path)\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +def {\b penify_hook.ui_utils.print_info} (message)\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +def {\b penify_hook.ui_utils.print_success} (message)\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +def {\b penify_hook.ui_utils.print_warning} (message)\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +def {\b penify_hook.ui_utils.print_error} (message)\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +def {\b penify_hook.ui_utils.print_processing} (file_path)\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +def {\b penify_hook.ui_utils.print_status} (status, message)\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +def {\b penify_hook.ui_utils.create_progress_bar} (total, desc="Processing", unit="item")\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +def {\b penify_hook.ui_utils.create_stage_progress_bar} (stages, desc="Processing")\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +def {\b penify_hook.ui_utils.update_stage} (pbar, stage_name)\par +} +\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid +Variables\par +\pard\plain + +{ +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +{\b penify_hook.ui_utils.autoreset}\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +{\b penify_hook.ui_utils.INFO_COLOR} = Fore.CYAN\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +{\b penify_hook.ui_utils.SUCCESS_COLOR} = Fore.GREEN\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +{\b penify_hook.ui_utils.WARNING_COLOR} = Fore.YELLOW\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +{\b penify_hook.ui_utils.ERROR_COLOR} = Fore.RED\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +{\b penify_hook.ui_utils.HIGHLIGHT_COLOR} = Fore.BLUE\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +{\b penify_hook.ui_utils.NEUTRAL_COLOR} = Fore.WHITE\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +string {\b penify_hook.ui_utils.SUCCESS_SYMBOL} = "\'E2\'9C\'93"\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +string {\b penify_hook.ui_utils.WARNING_SYMBOL} = "\'E2\'97\'8B"\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +string {\b penify_hook.ui_utils.ERROR_SYMBOL} = "\'E2\'9C\'97"\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +string {\b penify_hook.ui_utils.PROCESSING_SYMBOL} = "\'E2\'9F\'B3"\par +} +\par \pard\plain + +\pard\plain \sect\sbkpage +\s2\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs28\kerning28\cgrid +\pard\plain \s2\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs28\kerning28\cgrid +/tmp/github_reposRepoArchDocGenContext/Penify-dev/penify-cli/penify_hook/utils.py File Reference\par \pard\plain +{\tc\tcl2 \v /tmp/github_reposRepoArchDocGenContext/Penify-dev/penify-cli/penify_hook/utils.py} +{\xe \v /tmp/github_reposRepoArchDocGenContext/Penify-dev/penify-cli/penify_hook/utils.py} +{\bkmkstart AAAAAAAABB} +{\bkmkend AAAAAAAABB} +\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid +Classes\par +\pard\plain + +{ +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +class {\b penify_hook.utils.GitRepoNotFoundError}\par +} +\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid +Namespaces\par +\pard\plain + +{ +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +namespace {\b penify_hook}\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +namespace {\b penify_hook.utils}\par +} +\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid +Functions\par +\pard\plain + +{ +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +def {\b penify_hook.utils.get_repo_details} (Repo repo)\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +def {\b penify_hook.utils.recursive_search_git_folder} (folder_path)\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +def {\b penify_hook.utils.find_git_parent} (path)\par +} +\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid +Variables\par +\pard\plain + +{ +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +{\b penify_hook.utils.logger} = logging.getLogger(__name__)\par +} +\par \pard\plain + +\pard\plain \sect\sbkpage +\s2\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs28\kerning28\cgrid +\pard\plain \s2\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs28\kerning28\cgrid +/tmp/github_reposRepoArchDocGenContext/Penify-dev/penify-cli/README.md File Reference\par \pard\plain +{\tc\tcl2 \v /tmp/github_reposRepoArchDocGenContext/Penify-dev/penify-cli/README.md} +{\xe \v /tmp/github_reposRepoArchDocGenContext/Penify-dev/penify-cli/README.md} +{\bkmkstart AAAAAAAABC} +{\bkmkend AAAAAAAABC} +\par \pard\plain + +\pard\plain \sect\sbkpage +\s2\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs28\kerning28\cgrid +\pard\plain \s2\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs28\kerning28\cgrid +/tmp/github_reposRepoArchDocGenContext/Penify-dev/penify-cli/setup.py File Reference\par \pard\plain +{\tc\tcl2 \v /tmp/github_reposRepoArchDocGenContext/Penify-dev/penify-cli/setup.py} +{\xe \v /tmp/github_reposRepoArchDocGenContext/Penify-dev/penify-cli/setup.py} +{\bkmkstart AAAAAAAABD} +{\bkmkend AAAAAAAABD} +\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid +Namespaces\par +\pard\plain + +{ +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +namespace {\b setup}\par +} +\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid +Variables\par +\pard\plain + +{ +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +{\b setup.name}\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +{\b setup.version}\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +{\b setup.packages}\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +{\b setup.install_requires}\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +{\b setup.entry_points}\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +{\b setup.author}\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +{\b setup.author_email}\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +{\b setup.description}\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +{\b setup.long_description}\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +{\b setup.long_description_content_type}\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +{\b setup.url}\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +{\b setup.classifiers}\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +{\b setup.python_requires}\par +} +\par \pard\plain + +\pard\plain \sect\sbkpage +\s2\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs28\kerning28\cgrid +\pard\plain \s2\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs28\kerning28\cgrid +/tmp/github_reposRepoArchDocGenContext/Penify-dev/penify-cli/tests/conftest.py File Reference\par \pard\plain +{\tc\tcl2 \v /tmp/github_reposRepoArchDocGenContext/Penify-dev/penify-cli/tests/conftest.py} +{\xe \v /tmp/github_reposRepoArchDocGenContext/Penify-dev/penify-cli/tests/conftest.py} +{\bkmkstart AAAAAAAABE} +{\bkmkend AAAAAAAABE} +\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid +Namespaces\par +\pard\plain + +{ +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +namespace {\b tests}\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +namespace {\b tests.conftest}\par +} +\par \pard\plain + +\pard\plain \sect\sbkpage +\s2\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs28\kerning28\cgrid +\pard\plain \s2\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs28\kerning28\cgrid +/tmp/github_reposRepoArchDocGenContext/Penify-dev/penify-cli/tests/test_commit_commands.py File Reference\par \pard\plain +{\tc\tcl2 \v /tmp/github_reposRepoArchDocGenContext/Penify-dev/penify-cli/tests/test_commit_commands.py} +{\xe \v /tmp/github_reposRepoArchDocGenContext/Penify-dev/penify-cli/tests/test_commit_commands.py} +{\bkmkstart AAAAAAAABF} +{\bkmkend AAAAAAAABF} +\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid +Classes\par +\pard\plain + +{ +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +class {\b tests.test_commit_commands.TestCommitCommands}\par +} +\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid +Namespaces\par +\pard\plain + +{ +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +namespace {\b tests}\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +namespace {\b tests.test_commit_commands}\par +} +\par \pard\plain + +\pard\plain \sect\sbkpage +\s2\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs28\kerning28\cgrid +\pard\plain \s2\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs28\kerning28\cgrid +/tmp/github_reposRepoArchDocGenContext/Penify-dev/penify-cli/tests/test_config_commands.py File Reference\par \pard\plain +{\tc\tcl2 \v /tmp/github_reposRepoArchDocGenContext/Penify-dev/penify-cli/tests/test_config_commands.py} +{\xe \v /tmp/github_reposRepoArchDocGenContext/Penify-dev/penify-cli/tests/test_config_commands.py} +{\bkmkstart AAAAAAAABG} +{\bkmkend AAAAAAAABG} +\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid +Classes\par +\pard\plain + +{ +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +class {\b tests.test_config_commands.TestConfigCommands}\par +} +\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid +Namespaces\par +\pard\plain + +{ +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +namespace {\b tests}\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +namespace {\b tests.test_config_commands}\par +} +\par \pard\plain + +\pard\plain \sect\sbkpage +\s2\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs28\kerning28\cgrid +\pard\plain \s2\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs28\kerning28\cgrid +/tmp/github_reposRepoArchDocGenContext/Penify-dev/penify-cli/tests/test_doc_commands.py File Reference\par \pard\plain +{\tc\tcl2 \v /tmp/github_reposRepoArchDocGenContext/Penify-dev/penify-cli/tests/test_doc_commands.py} +{\xe \v /tmp/github_reposRepoArchDocGenContext/Penify-dev/penify-cli/tests/test_doc_commands.py} +{\bkmkstart AAAAAAAABH} +{\bkmkend AAAAAAAABH} +\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid +Namespaces\par +\pard\plain + +{ +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +namespace {\b tests}\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +namespace {\b tests.test_doc_commands}\par +} +\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid +Functions\par +\pard\plain + +{ +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +def {\b tests.test_doc_commands.test_generate_doc_no_location} (mock_getcwd, mock_api_client, mock_folder_analyzer, mock_file_analyzer, mock_git_analyzer)\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +def {\b tests.test_doc_commands.test_generate_doc_file_location} (mock_api_client, mock_folder_analyzer, mock_file_analyzer, mock_git_analyzer)\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +def {\b tests.test_doc_commands.test_generate_doc_folder_location} (mock_api_client, mock_folder_analyzer, mock_file_analyzer, mock_git_analyzer)\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +def {\b tests.test_doc_commands.test_generate_doc_error_handling} (mock_api_client, mock_git_analyzer, mock_exit)\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +def {\b tests.test_doc_commands.test_setup_docgen_parser} ()\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +def {\b tests.test_doc_commands.test_handle_docgen_install_hook} (mock_exit, mock_get_token, mock_generate_doc, mock_uninstall_hook, mock_install_hook)\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +def {\b tests.test_doc_commands.test_handle_docgen_uninstall_hook} (mock_exit, mock_get_token, mock_generate_doc, mock_uninstall_hook, mock_install_hook)\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +def {\b tests.test_doc_commands.test_handle_docgen_generate} (mock_get_token, mock_generate_doc, mock_uninstall_hook, mock_install_hook)\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +def {\b tests.test_doc_commands.test_handle_docgen_no_token} (mock_exit, mock_get_token)\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +def {\b tests.test_doc_commands.test_generate_doc_with_file_exception} (mock_api_client, mock_getcwd)\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +def {\b tests.test_doc_commands.test_generate_doc_with_folder_exception} (mock_api_client, mock_getcwd)\par +} +\par \pard\plain + +\pard\plain \sect\sbkpage +\s2\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs28\kerning28\cgrid +\pard\plain \s2\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs28\kerning28\cgrid +/tmp/github_reposRepoArchDocGenContext/Penify-dev/penify-cli/tests/test_web_config.py File Reference\par \pard\plain +{\tc\tcl2 \v /tmp/github_reposRepoArchDocGenContext/Penify-dev/penify-cli/tests/test_web_config.py} +{\xe \v /tmp/github_reposRepoArchDocGenContext/Penify-dev/penify-cli/tests/test_web_config.py} +{\bkmkstart AAAAAAAABI} +{\bkmkend AAAAAAAABI} +\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid +Classes\par +\pard\plain + +{ +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +class {\b tests.test_web_config.TestWebConfig}\par +} +\pard\plain \s3\sb240\sa60\keepn\widctlpar\adjustright \b\f1\cgrid +Namespaces\par +\pard\plain + +{ +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +namespace {\b tests}\par +\pard\plain \s120\fi-360\li360\widctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\cgrid +namespace {\b tests.test_web_config}\par +} + +\pard\plain \sect\sbkpage +\s1\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs36\kerning36\cgrid +\s1\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs36\kerning36\cgrid Index\par +\pard\plain +{\tc \v Index} +{\field\fldedit {\*\fldinst INDEX \\c2 \\*MERGEFORMAT}{\fldrslt INDEX}} +} diff --git a/docs/xml/Doxyfile.xml b/docs/xml/Doxyfile.xml new file mode 100644 index 0000000..a7e2647 --- /dev/null +++ b/docs/xml/Doxyfile.xml @@ -0,0 +1,391 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/xml/README_8md.xml b/docs/xml/README_8md.xml new file mode 100644 index 0000000..d74636f --- /dev/null +++ b/docs/xml/README_8md.xml @@ -0,0 +1,179 @@ + + + + README.md + + + + + +#PenifyCLITool + +![Tests](https://github.com/yourorganization/penify-cli/workflows/Tests/badge.svg) +![Coverage](./coverage.svg) + +ACLItooltogeneratesmartcommitmessages,codedocumentation,andmore. + +##Features + +-Automaticallygeneratedocumentationforyourcode +-Supportformultipleprogramminglanguages +-Githookintegrationforautomaticdocumentationoncommits +-Folderandfileanalysis + +##Installation + +InstallfromPyPI: + +```bash +pipinstallpenify +``` + +##Usage + +PenifyCLIprovidesseveralsubcommandsfordifferentfunctionalities,organizedintobasiccommands(nologinrequired)andadvancedcommands(loginrequired). + +##BasicCommands(Nologinrequired) + +###Commit + +GeneratesmartcommitmessagesusinglocalLLM: + +```bash +penifycommit[-m"Optionalmessage"][-e][-d] +``` + +Options: +-`-m,--message`:Optionalcustomcommitmessage +-`-e,--terminal`:Openeditortomodifycommitmessagebeforecommitting +-`-d,--description`:Generatecommitmessagewithbothtitleanddescription(withoutthisflag,onlytitleisgenerated) + +###Config + +ConfigurelocalLLMandJIRAsettings: + +```bash +#ConfigureLLMsettings +penifyconfigllm--modelMODEL_NAME[--api-baseAPI_URL][--api-keyAPI_KEY] + +#ConfigureLLMsettingsthroughwebinterface +penifyconfigllm-web + +#ConfigureJIRAsettings +penifyconfigjira--urlJIRA_URL--usernameUSERNAME--api-tokenTOKEN[--verify] + +#ConfigureJIRAsettingsthroughwebinterface +penifyconfigjira-web +``` + +##AdvancedCommands(Loginrequired) + +###Login + +TologinandobtainanAPItoken: + +```bash +penifylogin +``` + +Thiscommandwillopenabrowserwindowforauthentication.Aftersuccessfullogin,theAPIkeywillbesavedlocallyforfutureuse. + +###DocumentationGeneration + +GeneratedocumentationforGitdiff,filesorfolders: + +```bash +#GeneratedocumentationforlatestGitcommitdiff +penifydocgen + +#Generatedocumentationforspecificfileorfolder +penifydocgen-l/path/to/file/or/folder +``` + +Options: +-`-l,--location`:Pathtospecificfileorfolderfordocumentationgeneration(defaultstocurrentdirectory) + +###GitHookManagement + +InstalloruninstallGitpost-commithooks: + +```bash +#InstallGithook +penifydocgeninstall-hook[-l/path/to/repo] + +#UninstallGithook +penifydocgenuninstall-hook[-l/path/to/repo] +``` + +Options: +-`-l,--location`:PathtotheGitrepository(defaultstocurrentdirectory) + +##Authentication + +PenifyCLIusesanAPItokenforauthenticationwithadvancedfeatures. + +Ifnotokenisavailableandyoutrytoaccessanadvancedfeature,you'llbepromptedtologin. + +##LocalLLMConfiguration + +Forcommitmessagegeneration,PenifycanusealocalLLM.Configureitusing: + +```bash +penifyconfigllm--modelMODEL_NAME--api-baseAPI_URL--api-keyAPI_KEY +``` + +Commonconfigurations: +-OpenAI:`--modelgpt-3.5-turbo--api-basehttps://api.openai.com/v1--api-keyYOUR_KEY` +-Anthropic:`--modelclaude-2--api-basehttps://api.anthropic.com--api-keyYOUR_KEY` + +##JIRAIntegration + +ConfigureJIRAintegrationtoenhancecommitmessageswithissuedetails: + +```bash +penifyconfigjira--urlhttps://your-domain.atlassian.net--usernameyour-email@example.com--api-tokenYOUR_API_TOKEN +``` + +##Development + +Tosetupthedevelopmentenvironment: + +1.Clonetherepository: +```bash +gitclonehttps://github.com/SingularityX-ai/penify-cli.git +``` + +2.Installthepackageineditablemode: +```bash +pipinstall-e. +``` + +###RunningTests + +```bash +pytest +``` + +##License + +ThisprojectislicensedundertheMITLicense. + +##Author + +SumanSaurabh(ss.sumansaurabh92@gmail.com) + +##Contributing + +Contributionsarewelcome!PleasefeelfreetosubmitaPullRequest. + +##Issues + +Ifyouencounteranyproblemsorhavesuggestions,pleasefileanissueonthe[GitHubrepository](https://github.com/SingularityX-ai/penify/issues). + +##Support + +ForautomatedAPIDocumentation,ArchitectureDocumentation,CodeDocumentation,PullRequestDocumentation,orifyouneedademo,pleasejoinour[Discordsupportchannel](https://discord.gg/wqrc8JeV). + + + + diff --git a/docs/xml/api__client_8py.xml b/docs/xml/api__client_8py.xml new file mode 100644 index 0000000..f40173a --- /dev/null +++ b/docs/xml/api__client_8py.xml @@ -0,0 +1,127 @@ + + + + api_client.py + penify_hook::api_client::APIClient + penify_hook + penify_hook::api_client + + + + + +importjson +importos +importrequests +from.llm_clientimportLLMClient + +classAPIClient: +def__init__(self,api_url,api_token:str=None,bearer_token:str=None): +self.api_url=api_url +self.AUTH_TOKEN=api_token +self.BEARER_TOKEN=bearer_token + +defsend_file_for_docstring_generation(self,file_name,content,line_numbers,repo_details=None): +"""SendfilecontentandmodifiedlinestotheAPIandreturnmodifiedcontent.""" +payload={ +'file_path':file_name, +'content':content, +'modified_lines':line_numbers +} +ifrepo_details: +payload['git_repo']=repo_details +url=self.api_url+"/v1/cli/file/generate/doc" +response=requests.post(url,json=payload,headers={"api-key":f"{self.AUTH_TOKEN}"},timeout=60*10) +ifresponse.status_code==200: +response=response.json() +returnresponse.get('modified_content') +else: +error_message=response.json().get('detail') +ifnoterror_message: +error_message=response.text + +raiseException(f"APIError:{error_message}") + +defgenerate_commit_summary(self,git_diff,instruction:str="",repo_details=None,jira_context:dict=None): +"""GeneratesacommitsummarybysendingaPOSTrequesttotheAPIendpoint. + +Thisfunctionconstructsapayloadcontainingthegitdiffandanyadditional +instructionsprovided.ItthensendsthispayloadtoaspecifiedAPIendpoint +togenerateasummaryofthecommit.Iftherequestissuccessful,itreturns +theresponsefromtheAPI;otherwise,itreturnsNone.Thefunctionalso +handlesoptionalrepositorydetailsandJIRAcontextiftheyareprovided. + +Args: +git_diff(str):Thegitdiffofthecommit. +instruction(str):Additionalinstructionforthecommit.Defaultsto"". +repo_details(dict):Detailsofthegitrepository.DefaultstoNone. +jira_context(dict):JIRAissuedetailstoenhancethecommitsummary.DefaultstoNone. + +Returns: +dict:TheresponsefromtheAPIiftherequestissuccessful,Noneotherwise. +""" +payload={ +'git_diff':git_diff, +'additional_instruction':instruction +} +ifrepo_details: +payload['git_repo']=repo_details + +#AddJIRAcontextifavailable +ifjira_context: +payload['jira_context']=jira_context + +url=self.api_url+"/v1/cli/commit/summary" +try: +response=requests.post(url,json=payload,headers +={"api-key":f"{self.AUTH_TOKEN}"},timeout=60*10) +ifresponse.status_code==200: +response=response.json() +returnresponse +else: +#print(f"Response:{response.status_code}") +#print(f"Error:{response.text}") +raiseException(f"APIError:{response.text}") +exceptExceptionase: +print(f"Error:{e}") +returnNone + +defget_supported_file_types(self)->list[str]: + +"""RetrievesupportedfiletypesfromtheAPIorreturnadefaultlist.""" +url=self.api_url+"/v1/cli/supported_languages" +response=requests.get(url) +ifresponse.status_code==200: +response=response.json() +returnresponse +else: +return["py","js","ts","java","kt","cs","c"] + +defgenerate_commit_summary_with_llm(self,diff,message,generate_description:bool,repo_details,llm_client:LLMClient,jira_context=None): +"""GeneratesacommitsummaryusingalocalLLMclient;fallsbacktoAPIon +error.""" +try: +returnllm_client.generate_commit_summary(diff,message,generate_description,repo_details,jira_context) +exceptExceptionase: +print(f"ErrorusinglocalLLM:{e}") +#FallbacktoAPIforcommitsummary +returnself.generate_commit_summary(diff,message,repo_details,jira_context) + +defget_api_key(self): + + +"""FetchanAPIkeyfromaspecifiedURLusingaBearertoken.""" +url=self.api_url+"/v1/apiToken/get" +response=requests.get(url,headers={"Authorization":f"Bearer{self.BEARER_TOKEN}"},timeout=60*10) +ifresponse.status_code==200: +response=response.json() +returnresponse.get('key') +else: +print(f"Response:{response.status_code}") +print(f"Error:{response.text}") +returnNone + + + + + diff --git a/docs/xml/auth__commands_8py.xml b/docs/xml/auth__commands_8py.xml new file mode 100644 index 0000000..dcb0ac5 --- /dev/null +++ b/docs/xml/auth__commands_8py.xml @@ -0,0 +1,184 @@ + + + + auth_commands.py + penify_hook + penify_hook::commands + penify_hook::commands::auth_commands + + + + + +importjson +importwebbrowser +importhttp.server +importsocketserver +importurllib.parse +importrandom +importos +fromthreadingimportThread +frompathlibimportPath + +defsave_credentials(api_key): +#Trytosavein.envfileingitrepofirst +"""SavetheAPIkeyinapriority-basedmanner. + +ThisfunctionattemptstosavetheAPIkeyintwolocations,basedonpriority: +1.Ina`.env`filelocatedintherootoftheGitrepositoryifoneisfound. +2.Inaglobal`.penify`filelocatedintheuser'shomedirectoryasa +fallback.ThefunctionfirsttriestolocatetheGitrepositoryusing +`recursive_search_git_folder`.IfaGitrepositoryisfound,itreadsthe +existing`.env`file(ifpresent),updatesoraddstheAPIkeyunderthekey +`PENIFY_API_TOKEN`,andwritestheupdatedcontentback.Ifanyerroroccurs +duringthisprocess,itfallsbacktosavingthecredentialsintheglobal +`.penify`file.Thefunctionhandlesexceptionsandprintsappropriateerror +messages. + +Args: +api_key(str):TheAPIkeytosave. + +Returns: +bool:TrueiftheAPIkeyissavedsuccessfully,Falseotherwise. +""" +try: +from..utilsimportrecursive_search_git_folder +current_dir=os.getcwd() +repo_root=recursive_search_git_folder(current_dir) + +ifrepo_root: +#We'reinagitrepo,saveto.envfile +env_file=Path(repo_root)/'.env' +try: +#Readexisting.envcontent +env_content={} +ifenv_file.exists(): +withopen(env_file,'r')asf: +forlineinf: +line=line.strip() +iflineandnotline.startswith('#')and'='inline: +key,value=line.split('=',1) +env_content[key.strip()]=value.strip() + +#UpdateAPItoken +env_content['PENIFY_API_TOKEN']=api_key + +#Writebackto.envfile +withopen(env_file,'w')asf: +forkey,valueinenv_content.items(): +f.write(f"{key}={value}\n") + +print(f"APItokensavedto{env_file}") +returnTrue +exceptExceptionase: +print(f"Errorsavingto.envfile:{str(e)}") +#Fallbacktosavingin.penifyglobalconfig +exceptExceptionase: +print(f"Errorfindinggitrepository:{str(e)}") + +#Fallbacktoglobal.penifyfileinhomedirectory +home_dir=Path.home() +penify_file=home_dir/'.penify' + +#Ifthefilealreadyexists,addthenewapikeytotheexistingfile +ifpenify_file.exists(): +withopen(penify_file,'r')asf: +credentials=json.load(f) +credentials['api_keys']=api_key +else: +credentials={ +'api_keys':api_key +} + +try: +withopen(penify_file,'w')asf: +json.dump(credentials,f) +print(f"APItokensavedtoglobalconfig{penify_file}") +returnTrue +exceptExceptionase: +print(f"Errorsavingcredentials:{str(e)}") +returnFalse + +deflogin(api_url,dashboard_url): +"""Opentheloginpageinawebbrowserandcapturethetokenviaredirect.""" +redirect_port=random.randint(30000,50000) +redirect_url=f"http://localhost:{redirect_port}/callback" + +full_login_url=f"{dashboard_url}?redirectUri={urllib.parse.quote(redirect_url)}" + +print(f"Openingloginpageinyourdefaultwebbrowser:{full_login_url}") +webbrowser.open(full_login_url) + +classTokenHandler(http.server.SimpleHTTPRequestHandler): +defdo_GET(self): + +"""HandleaGETrequesttoprocesslogintokenandredirectordisplayerror +message.""" +query=urllib.parse.urlparse(self.path).query +query_components=urllib.parse.parse_qs(query) +token=query_components.get("token",[None])[0] + +iftoken: +self.send_response(200) +self.send_header("Content-type","text/html") +self.end_headers() +response=""" +<html> +<head> +<script> +setTimeout(function(){ +window.location.href='https://dashboard.penify.dev'; +},5000); +</script> +</head> +<body> +<h1>LoginSuccessful!</h1> +<p>YouwillberedirectedtothePenifydashboardin5seconds.YoucanalsoclosethiswindowandreturntotheCLI.</p> +</body> +</html> +""" +self.wfile.write(response.encode()) + +print(f"\nLoginsuccessful!FetchingAPIkeys...") +from..api_clientimportAPIClient +api_key=APIClient(api_url,None,token).get_api_key() +ifapi_key: +save_credentials(api_key) +print("APIkeysfetchedandsavedsuccessfully.") +print("You'llberedirectedtothePenifydashboard.YoucancontinueusingtheCLI.") +else: +print("FailedtofetchAPIkeys.") +else: +self.send_response(400) +self.send_header("Content-type","text/html") +self.end_headers() +response=""" +<html> +<body> +<h1>LoginFailed</h1> +<p>Pleasetryagain.</p> +</body> +</html> +""" +self.wfile.write(response.encode()) +print("\nLoginfailed.Pleasetryagain.") + +#Scheduletheservershutdown +thread=Thread(target=self.server.shutdown) +thread.daemon=True +thread.start() + +deflog_message(self,format,*args): +#Suppresslogmessages +"""Suppresslogmessages.""" +return + +withsocketserver.TCPServer(("",redirect_port),TokenHandler)ashttpd: +print(f"Listeningonport{redirect_port}fortheredirect...") +httpd.serve_forever() + +print("Loginprocesscompleted.YoucannowuseothercommandswithyourAPItoken.") + + + + diff --git a/docs/xml/base__analyzer_8py.xml b/docs/xml/base__analyzer_8py.xml new file mode 100644 index 0000000..3071dfd --- /dev/null +++ b/docs/xml/base__analyzer_8py.xml @@ -0,0 +1,36 @@ + + + + base_analyzer.py + penify_hook::base_analyzer::BaseAnalyzer + penify_hook + penify_hook::base_analyzer + + + + + +importos +fromgitimportRepo +from.api_clientimportAPIClient +frompenify_hook.utilsimportget_repo_details,recursive_search_git_folder + + +classBaseAnalyzer: + +def__init__(self,folder_path:str,api_client:APIClient): +self.folder_path=folder_path +self.repo_path=recursive_search_git_folder(folder_path) +self.repo=None +self.repo_details=None +ifself.folder_path: +self.repo=Repo(self.repo_path) +self.repo_details=get_repo_details(self.repo) + +self.relative_file_path=os.path.relpath(folder_path) +self.api_client=api_client +self.supported_file_types=set(api_client.get_supported_file_types()) + + + + diff --git a/docs/xml/classException.xml b/docs/xml/classException.xml new file mode 100644 index 0000000..2277730 --- /dev/null +++ b/docs/xml/classException.xml @@ -0,0 +1,32 @@ + + + + Exception + penify_hook.utils.GitRepoNotFoundError + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/xml/classpenify__hook_1_1api__client_1_1APIClient.xml b/docs/xml/classpenify__hook_1_1api__client_1_1APIClient.xml new file mode 100644 index 0000000..e843ba6 --- /dev/null +++ b/docs/xml/classpenify__hook_1_1api__client_1_1APIClient.xml @@ -0,0 +1,290 @@ + + + + penify_hook::api_client::APIClient + + + + penify_hook.api_client.APIClient::api_url + + api_url + penify_hook.api_client.APIClient.api_url + + + + + + + + penify_hook.api_client.APIClient.generate_commit_summary + penify_hook.api_client.APIClient.get_api_key + penify_hook.api_client.APIClient.get_supported_file_types + penify_hook.api_client.APIClient.send_file_for_docstring_generation + + + + penify_hook.api_client.APIClient::AUTH_TOKEN + + AUTH_TOKEN + penify_hook.api_client.APIClient.AUTH_TOKEN + + + + + + + + + + + penify_hook.api_client.APIClient::BEARER_TOKEN + + BEARER_TOKEN + penify_hook.api_client.APIClient.BEARER_TOKEN + + + + + + + + + + + + def + def penify_hook.api_client.APIClient.__init__ + (self, api_url, str api_token=None, str bearer_token=None) + __init__ + penify_hook.api_client.APIClient.__init__ + + self + self + + + api_url + api_url + + + str + api_token + None + + + str + bearer_token + None + + + + + + + + + + + def + def penify_hook.api_client.APIClient.send_file_for_docstring_generation + (self, file_name, content, line_numbers, repo_details=None) + send_file_for_docstring_generation + penify_hook.api_client.APIClient.send_file_for_docstring_generation + + self + self + + + file_name + file_name + + + content + content + + + line_numbers + line_numbers + + + repo_details + repo_details + None + + + + +Send file content and modified lines to the API and return modified content. + + + + + penify_hook.api_client.APIClient.api_url + + + def + def penify_hook.api_client.APIClient.generate_commit_summary + (self, git_diff, str instruction="", repo_details=None, dict jira_context=None) + generate_commit_summary + penify_hook.api_client.APIClient.generate_commit_summary + + self + self + + + git_diff + git_diff + + + str + instruction + "" + + + repo_details + repo_details + None + + + dict + jira_context + None + + + + +Generates a commit summary by sending a POST request to the API endpoint. + +This function constructs a payload containing the git diff and any additional +instructions provided. It then sends this payload to a specified API endpoint +to generate a summary of the commit. If the request is successful, it returns +the response from the API; otherwise, it returns None. The function also +handles optional repository details and JIRA context if they are provided. + +Args: + git_diff (str): The git diff of the commit. + instruction (str): Additional instruction for the commit. Defaults to "". + repo_details (dict): Details of the git repository. Defaults to None. + jira_context (dict): JIRA issue details to enhance the commit summary. Defaults to None. + +Returns: + dict: The response from the API if the request is successful, None otherwise. + + + + + + penify_hook.api_client.APIClient.api_url + penify_hook.api_client.APIClient.generate_commit_summary_with_llm + + + list[str] + list[str] penify_hook.api_client.APIClient.get_supported_file_types + (self) + get_supported_file_types + penify_hook.api_client.APIClient.get_supported_file_types + + self + self + + + + +Retrieve supported file types from the API or return a default list. + + + + + penify_hook.api_client.APIClient.api_url + + + def + def penify_hook.api_client.APIClient.generate_commit_summary_with_llm + (self, diff, message, bool generate_description, repo_details, LLMClient llm_client, jira_context=None) + generate_commit_summary_with_llm + penify_hook.api_client.APIClient.generate_commit_summary_with_llm + + self + self + + + diff + diff + + + message + message + + + bool + generate_description + + + repo_details + repo_details + + + LLMClient + llm_client + + + jira_context + jira_context + None + + + + +Generates a commit summary using a local LLM client; falls back to API on +error. + + + + + penify_hook.api_client.APIClient.generate_commit_summary + penify_hook.llm_client.LLMClient.generate_commit_summary + + + def + def penify_hook.api_client.APIClient.get_api_key + (self) + get_api_key + penify_hook.api_client.APIClient.get_api_key + + self + self + + + + +Fetch an API key from a specified URL using a Bearer token. + + + + + penify_hook.api_client.APIClient.api_url + + + + + + + + + + + + + + + penify_hook::api_client::APIClient__init__ + penify_hook::api_client::APIClientapi_url + penify_hook::api_client::APIClientAUTH_TOKEN + penify_hook::api_client::APIClientBEARER_TOKEN + penify_hook::api_client::APIClientgenerate_commit_summary + penify_hook::api_client::APIClientgenerate_commit_summary_with_llm + penify_hook::api_client::APIClientget_api_key + penify_hook::api_client::APIClientget_supported_file_types + penify_hook::api_client::APIClientsend_file_for_docstring_generation + + + diff --git a/docs/xml/classpenify__hook_1_1base__analyzer_1_1BaseAnalyzer.xml b/docs/xml/classpenify__hook_1_1base__analyzer_1_1BaseAnalyzer.xml new file mode 100644 index 0000000..3c6e3dc --- /dev/null +++ b/docs/xml/classpenify__hook_1_1base__analyzer_1_1BaseAnalyzer.xml @@ -0,0 +1,211 @@ + + + + penify_hook::base_analyzer::BaseAnalyzer + penify_hook.commit_analyzer.CommitDocGenHook + penify_hook.file_analyzer.FileAnalyzerGenHook + penify_hook.folder_analyzer.FolderAnalyzerGenHook + penify_hook.git_analyzer.GitDocGenHook + + + + penify_hook.base_analyzer.BaseAnalyzer::folder_path + + folder_path + penify_hook.base_analyzer.BaseAnalyzer.folder_path + + + + + + + + + + + penify_hook.base_analyzer.BaseAnalyzer::repo_path + + repo_path + penify_hook.base_analyzer.BaseAnalyzer.repo_path + + + + + + + + penify_hook.commit_analyzer.CommitDocGenHook._amend_commit + penify_hook.git_analyzer.GitDocGenHook.process_file + + + + penify_hook.base_analyzer.BaseAnalyzer::repo + + repo + penify_hook.base_analyzer.BaseAnalyzer.repo + + + + + + + + penify_hook.git_analyzer.GitDocGenHook.get_modified_files_in_last_commit + penify_hook.commit_analyzer.CommitDocGenHook.get_summary + penify_hook.git_analyzer.GitDocGenHook.process_file + penify_hook.commit_analyzer.CommitDocGenHook.process_jira_integration + penify_hook.git_analyzer.GitDocGenHook.run + penify_hook.commit_analyzer.CommitDocGenHook.run + + + + penify_hook.base_analyzer.BaseAnalyzer::repo_details + + repo_details + penify_hook.base_analyzer.BaseAnalyzer.repo_details + + + + + + + + penify_hook.commit_analyzer.CommitDocGenHook.get_summary + penify_hook.git_analyzer.GitDocGenHook.process_file + penify_hook.file_analyzer.FileAnalyzerGenHook.process_file + + + + penify_hook.base_analyzer.BaseAnalyzer::relative_file_path + + relative_file_path + penify_hook.base_analyzer.BaseAnalyzer.relative_file_path + + + + + + + + penify_hook.file_analyzer.FileAnalyzerGenHook.process_file + + + + penify_hook.base_analyzer.BaseAnalyzer::api_client + + api_client + penify_hook.base_analyzer.BaseAnalyzer.api_client + + + + + + + + penify_hook.commit_analyzer.CommitDocGenHook.get_summary + penify_hook.git_analyzer.GitDocGenHook.process_file + penify_hook.file_analyzer.FileAnalyzerGenHook.process_file + penify_hook.folder_analyzer.FolderAnalyzerGenHook.run + + + + penify_hook.base_analyzer.BaseAnalyzer::supported_file_types + + supported_file_types + penify_hook.base_analyzer.BaseAnalyzer.supported_file_types + + + + + + + + penify_hook.git_analyzer.GitDocGenHook.process_file + penify_hook.file_analyzer.FileAnalyzerGenHook.process_file + + + + + def + def penify_hook.base_analyzer.BaseAnalyzer.__init__ + (self, str folder_path, APIClient api_client) + __init__ + penify_hook.base_analyzer.BaseAnalyzer.__init__ + __init__ + __init__ + __init__ + __init__ + + self + self + + + str + folder_path + + + APIClient + api_client + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + penify_hook::base_analyzer::BaseAnalyzer__init__ + penify_hook::base_analyzer::BaseAnalyzerapi_client + penify_hook::base_analyzer::BaseAnalyzerfolder_path + penify_hook::base_analyzer::BaseAnalyzerrelative_file_path + penify_hook::base_analyzer::BaseAnalyzerrepo + penify_hook::base_analyzer::BaseAnalyzerrepo_details + penify_hook::base_analyzer::BaseAnalyzerrepo_path + penify_hook::base_analyzer::BaseAnalyzersupported_file_types + + + diff --git a/docs/xml/classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook.xml b/docs/xml/classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook.xml new file mode 100644 index 0000000..0a384a0 --- /dev/null +++ b/docs/xml/classpenify__hook_1_1commit__analyzer_1_1CommitDocGenHook.xml @@ -0,0 +1,278 @@ + + + + penify_hook::commit_analyzer::CommitDocGenHook + penify_hook.base_analyzer.BaseAnalyzer + + + + penify_hook.commit_analyzer.CommitDocGenHook::llm_client + + llm_client + penify_hook.commit_analyzer.CommitDocGenHook.llm_client + + + + + + + + penify_hook.commit_analyzer.CommitDocGenHook.get_summary + + + + + def + def penify_hook.commit_analyzer.CommitDocGenHook.__init__ + (self, str repo_path, APIClient api_client, llm_client=None, jira_client=None) + __init__ + penify_hook.commit_analyzer.CommitDocGenHook.__init__ + __init__ + + self + self + + + str + repo_path + + + APIClient + api_client + + + llm_client + llm_client + None + + + jira_client + jira_client + None + + + + + + + + + penify_hook.commit_analyzer.CommitDocGenHook.__init__ + penify_hook.commit_analyzer.CommitDocGenHook.__init__ + + + dict + dict penify_hook.commit_analyzer.CommitDocGenHook.get_summary + (self, str instruction, bool generate_description) + get_summary + penify_hook.commit_analyzer.CommitDocGenHook.get_summary + + self + self + + + str + instruction + + + bool + generate_description + + + + +Generate a summary for the commit based on the staged changes. + +This function retrieves the differences of the staged changes in the repository +and generates a commit summary using the provided instruction. If there are no +changes staged for commit, an exception is raised. If a JIRA client is +connected, it will attempt to extract issue keys from the current branch and +use them to fetch context. The summary can be generated either with a Language +Model (LLM) client or through the API client. + +Args: + instruction (str): A string containing instructions for generating the commit summary. + generate_description (bool): Whether to include detailed descriptions in the summary. + +Raises: + ValueError: If there are no changes staged for commit. + + + + + + penify_hook.base_analyzer.BaseAnalyzer.api_client + penify_hook.jira_client.JiraClient.jira_client + penify_hook.commit_analyzer.CommitDocGenHook.llm_client + penify_hook.ui_utils.print_info + penify_hook.base_analyzer.BaseAnalyzer.repo + penify_hook.base_analyzer.BaseAnalyzer.repo_details + penify_hook.commit_analyzer.CommitDocGenHook.run + + + def + def penify_hook.commit_analyzer.CommitDocGenHook.run + (self, Optional[str] msg, bool edit_commit_message, bool generate_description) + run + penify_hook.commit_analyzer.CommitDocGenHook.run + + self + self + + + Optional + msg + [str] + + + bool + edit_commit_message + + + bool + generate_description + + + + +Run the post-commit hook. + +This method processes the modified files from the last commit, stages them, and +creates an auto-commit with an optional message. It also handles JIRA +integration if available. If there is an error generating the commit summary, +an exception is raised. + +Args: + msg (Optional[str]): An optional message to include in the commit. + edit_commit_message (bool): A flag indicating whether to open the git commit + edit terminal after committing. + generate_description (bool): A flag indicating whether to include a description + in the commit message. + + + + + + penify_hook.commit_analyzer.CommitDocGenHook._amend_commit + penify_hook.commit_analyzer.CommitDocGenHook.get_summary + penify_hook.jira_client.JiraClient.jira_client + penify_hook.ui_utils.print_info + penify_hook.ui_utils.print_success + penify_hook.commit_analyzer.CommitDocGenHook.process_jira_integration + penify_hook.base_analyzer.BaseAnalyzer.repo + + + tuple + tuple penify_hook.commit_analyzer.CommitDocGenHook.process_jira_integration + (self, str title, str description, str msg) + process_jira_integration + penify_hook.commit_analyzer.CommitDocGenHook.process_jira_integration + + self + self + + + str + title + + + str + description + + + str + msg + + + + +Process JIRA integration by extracting issue keys from commit message +components and branch name. + +This function looks for JIRA issue keys in the provided commit title, +description, original user message, and the active branch name. It uses these +keys to update the commit message with JIRA information and adds comments to +the corresponding JIRA issues. If no keys are found, it logs a warning. + +Args: + title (str): The generated commit title. + description (str): The generated commit description. + msg (str): The original user message that might contain JIRA references. + +Returns: + tuple: A tuple containing the updated commit title and description with included JIRA + information. + + + + + + penify_hook.jira_client.JiraClient.jira_client + penify_hook.ui_utils.print_info + penify_hook.ui_utils.print_warning + penify_hook.base_analyzer.BaseAnalyzer.repo + penify_hook.commit_analyzer.CommitDocGenHook.run + + + + + def + def penify_hook.commit_analyzer.CommitDocGenHook._amend_commit + (self) + _amend_commit + penify_hook.commit_analyzer.CommitDocGenHook._amend_commit + + self + self + + + + +Amends the last commit message in the repository. + + + + + penify_hook.base_analyzer.BaseAnalyzer.repo_path + penify_hook.commit_analyzer.CommitDocGenHook.run + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + penify_hook::commit_analyzer::CommitDocGenHook__init__ + penify_hook::commit_analyzer::CommitDocGenHook_amend_commit + penify_hook::commit_analyzer::CommitDocGenHookget_summary + penify_hook::commit_analyzer::CommitDocGenHookllm_client + penify_hook::commit_analyzer::CommitDocGenHookprocess_jira_integration + penify_hook::commit_analyzer::CommitDocGenHookrun + + + diff --git a/docs/xml/classpenify__hook_1_1file__analyzer_1_1FileAnalyzerGenHook.xml b/docs/xml/classpenify__hook_1_1file__analyzer_1_1FileAnalyzerGenHook.xml new file mode 100644 index 0000000..f793382 --- /dev/null +++ b/docs/xml/classpenify__hook_1_1file__analyzer_1_1FileAnalyzerGenHook.xml @@ -0,0 +1,195 @@ + + + + penify_hook::file_analyzer::FileAnalyzerGenHook + penify_hook.base_analyzer.BaseAnalyzer + + + + penify_hook.file_analyzer.FileAnalyzerGenHook::file_path + + file_path + penify_hook.file_analyzer.FileAnalyzerGenHook.file_path + + + + + + + + penify_hook.file_analyzer.FileAnalyzerGenHook.run + + + + + def + def penify_hook.file_analyzer.FileAnalyzerGenHook.__init__ + (self, str file_path, APIClient api_client) + __init__ + penify_hook.file_analyzer.FileAnalyzerGenHook.__init__ + __init__ + + self + self + + + str + file_path + + + APIClient + api_client + + + + + + + + + + + def + def penify_hook.file_analyzer.FileAnalyzerGenHook.process_file + (self, file_path, pbar, str new_param="") + process_file + penify_hook.file_analyzer.FileAnalyzerGenHook.process_file + + self + self + + + file_path + file_path + + + pbar + pbar + + + str + new_param + "" + + + + +Processes a file by validating its extension, reading content, +generating documentation, and writing changes back to the file. The function +performs several stages of processing: 1. Validates the file's extension to +ensure it is supported. 2. Reads the content of the file. 3. Sends the file +content for documentation generation. 4. Writes the generated documentation +back to the file if there are changes. + +Args: + file_path (str): The path of the file to be processed. + pbar (tqdm.tqdm): A progress bar object to update the status of processing stages. + new_param (str?): An additional parameter for future use. Defaults to an empty string. + + + + + penify_hook.base_analyzer.BaseAnalyzer.api_client + penify_hook.ui_utils.print_warning + penify_hook.base_analyzer.BaseAnalyzer.relative_file_path + penify_hook.base_analyzer.BaseAnalyzer.repo_details + penify_hook.base_analyzer.BaseAnalyzer.supported_file_types + penify_hook.ui_utils.update_stage + penify_hook.file_analyzer.FileAnalyzerGenHook.run + penify_hook.git_analyzer.GitDocGenHook.run + + + def + def penify_hook.file_analyzer.FileAnalyzerGenHook.print_processing + (self, file_path) + print_processing + penify_hook.file_analyzer.FileAnalyzerGenHook.print_processing + + self + self + + + file_path + file_path + + + + +Prints a message indicating that a file is being processed. + + + + + penify_hook.ui_utils.format_file_path + + + def + def penify_hook.file_analyzer.FileAnalyzerGenHook.run + (self) + run + penify_hook.file_analyzer.FileAnalyzerGenHook.run + + self + self + + + + +Runs the documentation process with a progress bar. + +This method orchestrates the documentation process by creating a progress bar, +processing the file, and handling exceptions to ensure the progress bar +completes properly. It updates the progress bar through various stages and +provides feedback based on the result of the file processing. + + + + + + penify_hook.ui_utils.create_stage_progress_bar + penify_hook.file_analyzer.FileAnalyzerGenHook.file_path + penify_hook.ui_utils.print_status + penify_hook.ui_utils.print_success + penify_hook.git_analyzer.GitDocGenHook.process_file + penify_hook.file_analyzer.FileAnalyzerGenHook.process_file + penify_hook.ui_utils.update_stage + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + penify_hook::file_analyzer::FileAnalyzerGenHook__init__ + penify_hook::file_analyzer::FileAnalyzerGenHookfile_path + penify_hook::file_analyzer::FileAnalyzerGenHookprint_processing + penify_hook::file_analyzer::FileAnalyzerGenHookprocess_file + penify_hook::file_analyzer::FileAnalyzerGenHookrun + + + diff --git a/docs/xml/classpenify__hook_1_1folder__analyzer_1_1FolderAnalyzerGenHook.xml b/docs/xml/classpenify__hook_1_1folder__analyzer_1_1FolderAnalyzerGenHook.xml new file mode 100644 index 0000000..1df1368 --- /dev/null +++ b/docs/xml/classpenify__hook_1_1folder__analyzer_1_1FolderAnalyzerGenHook.xml @@ -0,0 +1,143 @@ + + + + penify_hook::folder_analyzer::FolderAnalyzerGenHook + penify_hook.base_analyzer.BaseAnalyzer + + + + penify_hook.folder_analyzer.FolderAnalyzerGenHook::dir_path + + dir_path + penify_hook.folder_analyzer.FolderAnalyzerGenHook.dir_path + + + + + + + + penify_hook.folder_analyzer.FolderAnalyzerGenHook.run + + + + + def + def penify_hook.folder_analyzer.FolderAnalyzerGenHook.__init__ + (self, str dir_path, APIClient api_client) + __init__ + penify_hook.folder_analyzer.FolderAnalyzerGenHook.__init__ + __init__ + + self + self + + + str + dir_path + + + APIClient + api_client + + + + + + + + + + + def + def penify_hook.folder_analyzer.FolderAnalyzerGenHook.list_all_files_in_dir + (self, str dir_path) + list_all_files_in_dir + penify_hook.folder_analyzer.FolderAnalyzerGenHook.list_all_files_in_dir + + self + self + + + str + dir_path + + + + +List all non-hidden files in a directory and its subdirectories. + +This function recursively traverses the specified directory and its +subdirectories, collecting paths of all non-hidden files. It filters out hidden +directories and files (those starting with a dot) to ensure only visible files +are returned. + +Args: + dir_path (str): The path to the directory whose files and subdirectory files need to be listed. + + + + + + penify_hook.folder_analyzer.FolderAnalyzerGenHook.run + + + def + def penify_hook.folder_analyzer.FolderAnalyzerGenHook.run + (self) + run + penify_hook.folder_analyzer.FolderAnalyzerGenHook.run + + self + self + + + + +Run the post-commit hook and process files with a progress bar. + + + + + penify_hook.base_analyzer.BaseAnalyzer.api_client + penify_hook.folder_analyzer.FolderAnalyzerGenHook.dir_path + penify_hook.folder_analyzer.FolderAnalyzerGenHook.list_all_files_in_dir + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + penify_hook::folder_analyzer::FolderAnalyzerGenHook__init__ + penify_hook::folder_analyzer::FolderAnalyzerGenHookdir_path + penify_hook::folder_analyzer::FolderAnalyzerGenHooklist_all_files_in_dir + penify_hook::folder_analyzer::FolderAnalyzerGenHookrun + + + diff --git a/docs/xml/classpenify__hook_1_1git__analyzer_1_1GitDocGenHook.xml b/docs/xml/classpenify__hook_1_1git__analyzer_1_1GitDocGenHook.xml new file mode 100644 index 0000000..f565eb1 --- /dev/null +++ b/docs/xml/classpenify__hook_1_1git__analyzer_1_1GitDocGenHook.xml @@ -0,0 +1,209 @@ + + + + penify_hook::git_analyzer::GitDocGenHook + penify_hook.base_analyzer.BaseAnalyzer + + + def + def penify_hook.git_analyzer.GitDocGenHook.__init__ + (self, str repo_path, APIClient api_client) + __init__ + penify_hook.git_analyzer.GitDocGenHook.__init__ + __init__ + + self + self + + + str + repo_path + + + APIClient + api_client + + + + + + + + + penify_hook.git_analyzer.GitDocGenHook.__init__ + penify_hook.git_analyzer.GitDocGenHook.__init__ + + + def + def penify_hook.git_analyzer.GitDocGenHook.get_modified_files_in_last_commit + (self) + get_modified_files_in_last_commit + penify_hook.git_analyzer.GitDocGenHook.get_modified_files_in_last_commit + + self + self + + + + +Get the list of files modified in the last commit. + + + + + penify_hook.base_analyzer.BaseAnalyzer.repo + penify_hook.git_analyzer.GitDocGenHook.run + + + def + def penify_hook.git_analyzer.GitDocGenHook.get_modified_lines + (self, diff_text) + get_modified_lines + penify_hook.git_analyzer.GitDocGenHook.get_modified_lines + + self + self + + + diff_text + diff_text + + + + +Extract modified line numbers from a diff text. + +This function processes a diff text to identify and extract the line numbers +that have been modified. It distinguishes between added and deleted lines and +keeps track of the current line number as it parses through the diff. The +function handles hunk headers and ensures that any deletions at the end of the +file are also captured. + +Args: + diff_text (str): A string containing the diff text to be processed. + + + + + + penify_hook.git_analyzer.GitDocGenHook.process_file + + + def + def penify_hook.git_analyzer.GitDocGenHook.process_file + (self, file_path) + process_file + penify_hook.git_analyzer.GitDocGenHook.process_file + + self + self + + + file_path + file_path + + + + +Processes a file by checking its type, reading its content, and sending it to +an API. + +This method constructs the absolute path of the specified file and verifies if +the file has a valid extension. If the file type is supported, it reads the +content of the file and retrieves the differences from the last commit in the +repository. If changes are detected, it sends the file content along with the +modified lines to an API for further processing. If the API response indicates +no changes, the original file will not be overwritten. + +Args: + file_path (str): The relative path to the file to be processed. + + + + + + penify_hook.base_analyzer.BaseAnalyzer.api_client + penify_hook.git_analyzer.GitDocGenHook.get_modified_lines + penify_hook.base_analyzer.BaseAnalyzer.repo + penify_hook.base_analyzer.BaseAnalyzer.repo_details + penify_hook.base_analyzer.BaseAnalyzer.repo_path + penify_hook.base_analyzer.BaseAnalyzer.supported_file_types + penify_hook.file_analyzer.FileAnalyzerGenHook.run + penify_hook.git_analyzer.GitDocGenHook.run + + + def + def penify_hook.git_analyzer.GitDocGenHook.run + (self) + run + penify_hook.git_analyzer.GitDocGenHook.run + + self + self + + + + +Run the post-commit hook. + +This method retrieves the list of modified files from the last commit and +processes each file. It stages any files that have been modified during +processing and creates an auto-commit if changes were made. A progress bar is +displayed to indicate the processing status of each file. The method handles +any exceptions that occur during file processing, printing an error message for +each file that fails to process. If any modifications are made to the files, an +auto-commit is created to save those changes. + + + + + + penify_hook.ui_utils.create_progress_bar + penify_hook.git_analyzer.GitDocGenHook.get_modified_files_in_last_commit + penify_hook.ui_utils.print_info + penify_hook.ui_utils.print_processing + penify_hook.ui_utils.print_status + penify_hook.ui_utils.print_success + penify_hook.git_analyzer.GitDocGenHook.process_file + penify_hook.file_analyzer.FileAnalyzerGenHook.process_file + penify_hook.base_analyzer.BaseAnalyzer.repo + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + penify_hook::git_analyzer::GitDocGenHook__init__ + penify_hook::git_analyzer::GitDocGenHookget_modified_files_in_last_commit + penify_hook::git_analyzer::GitDocGenHookget_modified_lines + penify_hook::git_analyzer::GitDocGenHookprocess_file + penify_hook::git_analyzer::GitDocGenHookrun + + + diff --git a/docs/xml/classpenify__hook_1_1jira__client_1_1JiraClient.xml b/docs/xml/classpenify__hook_1_1jira__client_1_1JiraClient.xml new file mode 100644 index 0000000..dde6211 --- /dev/null +++ b/docs/xml/classpenify__hook_1_1jira__client_1_1JiraClient.xml @@ -0,0 +1,523 @@ + + + + penify_hook::jira_client::JiraClient + + + + penify_hook.jira_client.JiraClient::jira_url + + jira_url + penify_hook.jira_client.JiraClient.jira_url + + + + + + + + + + + penify_hook.jira_client.JiraClient::jira_user + + jira_user + penify_hook.jira_client.JiraClient.jira_user + + + + + + + + + + + penify_hook.jira_client.JiraClient::jira_api_token + + jira_api_token + penify_hook.jira_client.JiraClient.jira_api_token + + + + + + + + + + + penify_hook.jira_client.JiraClient::jira_client + + jira_client + penify_hook.jira_client.JiraClient.jira_client + + + + + + + + penify_hook.jira_client.JiraClient.add_comment + penify_hook.jira_client.JiraClient.get_detailed_issue_context + penify_hook.jira_client.JiraClient.get_issue_details + penify_hook.commit_analyzer.CommitDocGenHook.get_summary + penify_hook.jira_client.JiraClient.is_connected + penify_hook.commit_analyzer.CommitDocGenHook.process_jira_integration + penify_hook.commit_analyzer.CommitDocGenHook.run + penify_hook.jira_client.JiraClient.update_issue_status + + + + + def + def penify_hook.jira_client.JiraClient.__init__ + (self, str jira_url=None, str jira_user=None, str jira_api_token=None) + __init__ + penify_hook.jira_client.JiraClient.__init__ + + self + self + + + str + jira_url + None + + + str + jira_user + None + + + str + jira_api_token + None + + + + +Initialize the JIRA client. + +Args: + jira_url: Base URL for JIRA instance (e.g., "https://your-domain.atlassian.net") + jira_user: JIRA username or email + jira_api_token: JIRA API token + + + + + + + + bool + bool penify_hook.jira_client.JiraClient.is_connected + (self) + is_connected + penify_hook.jira_client.JiraClient.is_connected + + self + self + + + + +Check if the JIRA client is connected. + + + + + penify_hook.jira_client.JiraClient.jira_client + penify_hook.jira_client.JiraClient.add_comment + penify_hook.jira_client.JiraClient.enhance_commit_message + penify_hook.jira_client.JiraClient.format_commit_message_with_jira_info + penify_hook.jira_client.JiraClient.get_commit_context_from_issues + penify_hook.jira_client.JiraClient.get_detailed_issue_context + penify_hook.jira_client.JiraClient.get_issue_details + penify_hook.jira_client.JiraClient.update_issue_status + + + List[str] + List[str] penify_hook.jira_client.JiraClient.extract_issue_keys_from_branch + (self, str branch_name) + extract_issue_keys_from_branch + penify_hook.jira_client.JiraClient.extract_issue_keys_from_branch + + self + self + + + str + branch_name + + + + +Extracts unique JIRA issue keys from a branch name. + + + + + penify_hook.ui_utils.print_info + + + List[str] + List[str] penify_hook.jira_client.JiraClient.extract_issue_keys + (self, str text) + extract_issue_keys + penify_hook.jira_client.JiraClient.extract_issue_keys + + self + self + + + str + text + + + + +Extract unique JIRA issue keys from the given text. + + + + + penify_hook.jira_client.JiraClient.format_commit_message_with_jira_info + + + Optional[Dict[str, Any]] + Optional[Dict[str, Any]] penify_hook.jira_client.JiraClient.get_issue_details + (self, str issue_key) + get_issue_details + penify_hook.jira_client.JiraClient.get_issue_details + + self + self + + + str + issue_key + + + + +Retrieve details of a JIRA issue based on its key. + +This function fetches detailed information about a specified JIRA issue using +the provided issue key. It first checks if the JIRA client is connected; if +not, it logs a warning and returns `None`. If connected, it attempts to +retrieve the issue from the JIRA server. On success, it constructs and returns +a dictionary containing various details such as the issue's key, summary, +status, description, assignee, reporter, type, priority, and URL. Errors during +this process are logged, and `None` is returned. + +Args: + issue_key (str): The JIRA issue key (e.g., "PROJECT-123"). + + + + + + penify_hook.jira_client.JiraClient.is_connected + penify_hook.jira_client.JiraClient.jira_client + penify_hook.jira_client.JiraClient.format_commit_message_with_jira_info + penify_hook.jira_client.JiraClient.get_commit_context_from_issues + + + bool + bool penify_hook.jira_client.JiraClient.add_comment + (self, str issue_key, str comment) + add_comment + penify_hook.jira_client.JiraClient.add_comment + + self + self + + + str + issue_key + + + str + comment + + + + +Adds a comment to a JIRA issue. + + + + + penify_hook.jira_client.JiraClient.add_comment + penify_hook.jira_client.JiraClient.is_connected + penify_hook.jira_client.JiraClient.jira_client + penify_hook.jira_client.JiraClient.add_comment + + + bool + bool penify_hook.jira_client.JiraClient.update_issue_status + (self, str issue_key, str transition_name) + update_issue_status + penify_hook.jira_client.JiraClient.update_issue_status + + self + self + + + str + issue_key + + + str + transition_name + + + + +Update the status of a JIRA issue. + +This method checks if the JIRA client is connected, retrieves available +transitions for the given issue, finds the transition ID by name, and updates +the issue's status accordingly. If any step fails or the specified transition +is not found, appropriate logs are generated, and False is returned. + +Args: + issue_key (str): The key of the JIRA issue to be updated. + transition_name (str): The name of the desired transition. + +Returns: + bool: True if the status was successfully updated, False otherwise. + + + + + + penify_hook.jira_client.JiraClient.is_connected + penify_hook.jira_client.JiraClient.jira_client + + + tuple + tuple penify_hook.jira_client.JiraClient.format_commit_message_with_jira_info + (self, str commit_title, str commit_description, List[str] issue_keys=None) + format_commit_message_with_jira_info + penify_hook.jira_client.JiraClient.format_commit_message_with_jira_info + + self + self + + + str + commit_title + + + str + commit_description + + + List + issue_keys + [str] + None + + + + +Format commit message with JIRA issue information. + +This function updates the provided commit title and description by +incorporating JIRA issue keys. If no issue keys are supplied, it extracts them +from the commit title and description. It then formats the commit title to +include the first issue key if not already present and appends detailed +information about each issue to the commit description. + +Args: + commit_title (str): The original commit title. + commit_description (str): The original commit description. + issue_keys (List[str]?): A list of JIRA issue keys to include in the commit message. If not + provided, issue keys will be extracted from both the title and the description. + +Returns: + tuple: A tuple containing the updated commit title and description with JIRA + information included. + + + + + + penify_hook.jira_client.JiraClient.extract_issue_keys + penify_hook.jira_client.JiraClient.get_issue_details + penify_hook.jira_client.JiraClient.is_connected + penify_hook.jira_client.JiraClient.enhance_commit_message + + + Dict[str, Any] + Dict[str, Any] penify_hook.jira_client.JiraClient.get_detailed_issue_context + (self, str issue_key) + get_detailed_issue_context + penify_hook.jira_client.JiraClient.get_detailed_issue_context + + self + self + + + str + issue_key + + + + +Retrieve comprehensive details about a JIRA issue including context for better +commit messages. + +This function fetches detailed information from a specified JIRA issue and +constructs a dictionary containing various context fields such as the issue +summary, description, type, status, priority, comments, URL, and additional +custom fields like acceptance criteria and sprint information. It handles +errors by logging appropriate warnings or errors. + +Args: + issue_key (str): The JIRA issue key (e.g., "PROJECT-123"). + +Returns: + Dict[str, Any]: A dictionary containing business and technical context from the issue. + + + + + + penify_hook.jira_client.JiraClient.is_connected + penify_hook.jira_client.JiraClient.jira_client + penify_hook.jira_client.JiraClient.get_commit_context_from_issues + + + Dict[str, Any] + Dict[str, Any] penify_hook.jira_client.JiraClient.get_commit_context_from_issues + (self, List[str] issue_keys) + get_commit_context_from_issues + penify_hook.jira_client.JiraClient.get_commit_context_from_issues + + self + self + + + List + issue_keys + [str] + + + + +Gather contextual information from JIRA issues to improve commit messages. + +This function processes a list of JIRA issue keys, retrieves detailed context +for each issue, and aggregates it into a dictionary that can be used to enhance +commit messages. It first retrieves the primary issue (the first key in the +list) and then gathers basic details for any related issues. The resulting +context includes information from both the primary and related issues, along +with all issue keys. + +Args: + issue_keys: List of JIRA issue keys to gather information from + +Returns: + Dict containing business and technical context from the issues + + + + + + penify_hook.jira_client.JiraClient.get_detailed_issue_context + penify_hook.jira_client.JiraClient.get_issue_details + penify_hook.jira_client.JiraClient.is_connected + penify_hook.jira_client.JiraClient.enhance_commit_message + + + tuple + tuple penify_hook.jira_client.JiraClient.enhance_commit_message + (self, str title, str description, List[str] issue_keys) + enhance_commit_message + penify_hook.jira_client.JiraClient.enhance_commit_message + + self + self + + + str + title + + + str + description + + + List + issue_keys + [str] + + + + +Enhance a commit message with business and technical context from JIRA issues. + +This function first checks if the list of issue keys is empty or if there is no +connection. If so, it returns the original title and description without +modification. It then retrieves context information from the specified JIRA +issues. If the primary issue is missing, it formats the commit message with +basic JIRA info. The function enhances the commit title by prefixing it with +the primary issue key if not already included. It appends a business context +section to the description, including details like issue type, status, +priority, sprint, acceptance criteria, and a condensed issue description. If +comments are available, they are added as technical notes. Finally, related +issues are listed. + +Args: + title (str): Original commit title. + description (str): Original commit description. + issue_keys (List[str]): List of JIRA issue keys to include in the enhanced commit message. + +Returns: + tuple: A tuple containing the enhanced commit title and description with added + context from JIRA issues. + + + + + + penify_hook.jira_client.JiraClient.format_commit_message_with_jira_info + penify_hook.jira_client.JiraClient.get_commit_context_from_issues + penify_hook.jira_client.JiraClient.is_connected + + + + + +Client for interacting with JIRA API + + + + + + + + + + + penify_hook::jira_client::JiraClient__init__ + penify_hook::jira_client::JiraClientadd_comment + penify_hook::jira_client::JiraClientenhance_commit_message + penify_hook::jira_client::JiraClientextract_issue_keys + penify_hook::jira_client::JiraClientextract_issue_keys_from_branch + penify_hook::jira_client::JiraClientformat_commit_message_with_jira_info + penify_hook::jira_client::JiraClientget_commit_context_from_issues + penify_hook::jira_client::JiraClientget_detailed_issue_context + penify_hook::jira_client::JiraClientget_issue_details + penify_hook::jira_client::JiraClientis_connected + penify_hook::jira_client::JiraClientjira_api_token + penify_hook::jira_client::JiraClientjira_client + penify_hook::jira_client::JiraClientjira_url + penify_hook::jira_client::JiraClientjira_user + penify_hook::jira_client::JiraClientupdate_issue_status + + + diff --git a/docs/xml/classpenify__hook_1_1llm__client_1_1LLMClient.xml b/docs/xml/classpenify__hook_1_1llm__client_1_1LLMClient.xml new file mode 100644 index 0000000..d1e7640 --- /dev/null +++ b/docs/xml/classpenify__hook_1_1llm__client_1_1LLMClient.xml @@ -0,0 +1,187 @@ + + + + penify_hook::llm_client::LLMClient + + + + penify_hook.llm_client.LLMClient::model + + model + penify_hook.llm_client.LLMClient.model + + + + + + + + penify_hook.llm_client.LLMClient.generate_commit_summary + + + + + + penify_hook.llm_client.LLMClient::_litellm + + _litellm + penify_hook.llm_client.LLMClient._litellm + + + + + + + + penify_hook.llm_client.LLMClient.litellm + + + + + def + def penify_hook.llm_client.LLMClient.__init__ + (self, str model=None, str api_base=None, str api_key=None) + __init__ + penify_hook.llm_client.LLMClient.__init__ + + self + self + + + str + model + None + + + str + api_base + None + + + str + api_key + None + + + + +Initialize the LLM client. + +Args: + model: LLM model to use (e.g., "gpt-4", "ollama/llama2", etc.) + api_base: Base URL for API requests (e.g., "http://localhost:11434" for Ollama) + api_key: API key for the LLM service + + + + + + + + def + def penify_hook.llm_client.LLMClient.litellm + (self) + litellm + penify_hook.llm_client.LLMClient.litellm + + self + self + + + + +Returns the litellm module, loading it if necessary. + + + + + penify_hook.llm_client.LLMClient._litellm + penify_hook.llm_client.LLMClient.generate_commit_summary + + + Dict + Dict penify_hook.llm_client.LLMClient.generate_commit_summary + (self, str diff, str message, bool generate_description, Dict repo_details, Dict jira_context=None) + generate_commit_summary + penify_hook.llm_client.LLMClient.generate_commit_summary + + self + self + + + str + diff + + + str + message + + + bool + generate_description + + + Dict + repo_details + + + Dict + jira_context + None + + + + +Generate a concise and descriptive commit summary based on Git diff, user +instructions, repository details, and optional JIRA context. + +This function constructs a prompt for an LLM to produce a commit title and, if +requested, a detailed description. The summary adheres to Semantic Commit +Messages guidelines. If JIRA context is provided, it enriches the prompt with +relevant issue information. + +Args: + diff (str): Git diff of changes. + message (str): User-provided commit message or instructions. + generate_description (bool): Flag indicating whether to include a detailed description in the summary. + repo_details (Dict): Details about the repository. + jira_context (Dict?): Optional JIRA issue context to enhance the summary. + +Returns: + Dict: A dictionary containing the title and description for the commit. If + `generate_description` is False, the 'description' key may be absent. + +Raises: + ValueError: If the LLM model is not configured. + + + + + + penify_hook.llm_client.LLMClient.litellm + penify_hook.llm_client.LLMClient.model + penify_hook.api_client.APIClient.generate_commit_summary_with_llm + + + + + +Client for interacting with LLM models using LiteLLM. + + + + + + + + + + + penify_hook::llm_client::LLMClient__init__ + penify_hook::llm_client::LLMClient_litellm + penify_hook::llm_client::LLMClientgenerate_commit_summary + penify_hook::llm_client::LLMClientlitellm + penify_hook::llm_client::LLMClientmodel + + + diff --git a/docs/xml/classpenify__hook_1_1utils_1_1GitRepoNotFoundError.xml b/docs/xml/classpenify__hook_1_1utils_1_1GitRepoNotFoundError.xml new file mode 100644 index 0000000..f40e622 --- /dev/null +++ b/docs/xml/classpenify__hook_1_1utils_1_1GitRepoNotFoundError.xml @@ -0,0 +1,38 @@ + + + + penify_hook::utils::GitRepoNotFoundError + Exception + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/xml/classtests_1_1test__commit__commands_1_1TestCommitCommands.xml b/docs/xml/classtests_1_1test__commit__commands_1_1TestCommitCommands.xml new file mode 100644 index 0000000..fd6cd22 --- /dev/null +++ b/docs/xml/classtests_1_1test__commit__commands_1_1TestCommitCommands.xml @@ -0,0 +1,551 @@ + + + + tests::test_commit_commands::TestCommitCommands + + + def + def tests.test_commit_commands.TestCommitCommands.mock_api_client + (self) + mock_api_client + tests.test_commit_commands.TestCommitCommands.mock_api_client + + self + self + + + + +Mocks an instance of APIClient using unittest.mock. + +This function creates a mock object for APIClient and yields it along +with the mocked instance. It is useful for testing purposes where real +API calls should be avoided. + +Yields: + tuple: A tuple containing the mock of APIClient and the mocked instance of + APIClient. + + + + + + + + def + def tests.test_commit_commands.TestCommitCommands.mock_llm_client + (self) + mock_llm_client + tests.test_commit_commands.TestCommitCommands.mock_llm_client + + self + self + + + + +Mock an instance of LLMClient for testing purposes. + +This function yields a mock object representing an instance of +LLMClient, which can be used to simulate interactions with a language +model during testing. The mock is patched to replace the actual +LLMClient class from the penify_hook module. + +Yields: + tuple: A tuple containing two elements: + - mock (MagicMock): The mock object for LLMClient. + - llm_client_instance (MagicMock): An instance of the mocked LLMClient. + + + + + + + + def + def tests.test_commit_commands.TestCommitCommands.mock_jira_client + (self) + mock_jira_client + tests.test_commit_commands.TestCommitCommands.mock_jira_client + + self + self + + + + +Create a mock JIRA client for testing purposes. + +This function yields a tuple containing a mock JIRA client instance and +its `is_connected` method. The mock client is configured to simulate an +active connection. This is useful for unit tests that require +interaction with a JIRA client without making actual network calls. + +Yields: + tuple: A tuple containing the mocked JIRA client instance and its + `is_connected` method. + + + + + + + + def + def tests.test_commit_commands.TestCommitCommands.mock_commit_doc_gen + (self) + mock_commit_doc_gen + tests.test_commit_commands.TestCommitCommands.mock_commit_doc_gen + + self + self + + + + +Mocks the CommitDocGenHook class and returns a MagicMock instance. + +This function uses the `patch` decorator from the `unittest.mock` module +to create a mock of the `CommitDocGenHook` class. It then sets up this +mock to return a new `MagicMock` instance when invoked. The function +yields both the mock object and the mocked instance, allowing for easy +testing of functions that rely on `CommitDocGenHook`. + +Returns: + tuple: A tuple containing two elements: + - mock (patch): The patch object used to mock the `CommitDocGenHook` + class. + - doc_gen_instance (MagicMock): The mocked instance of + `CommitDocGenHook`. + + + + + + + + def + def tests.test_commit_commands.TestCommitCommands.mock_git_folder_search + (self) + mock_git_folder_search + tests.test_commit_commands.TestCommitCommands.mock_git_folder_search + + self + self + + + + +Mock the `recursive_search_git_folder` function to return a predefined +git folder path. + +This function uses the `patch` decorator from the `unittest.mock` module +to intercept calls to `penify_hook.utils.recursive_search_git_folder`. +When called, it will return '/mock/git/folder' instead of performing an +actual search. This is useful for testing purposes where you need a +consistent response without interacting with the file system. + +Yields: + MagicMock: A mock object that simulates the `recursive_search_git_folder` function. + + + + + + + + def + def tests.test_commit_commands.TestCommitCommands.mock_print_functions + (self) + mock_print_functions + tests.test_commit_commands.TestCommitCommands.mock_print_functions + + self + self + + + + +Mocks the print functions from `penify_hook.ui_utils` for testing +purposes. + +This function uses Python's `unittest.mock.patch` to replace the actual +print functions (`print`, `print_warning`, and `print_error`) with mock +objects. These mock objects can be used in tests to capture calls made +to these print functions without actually printing anything. + +Yields: + tuple: A tuple containing three mock objects corresponding to `print_info`, + `print_warning`, + and `print_error`. + + + + + + + + def + def tests.test_commit_commands.TestCommitCommands.test_commit_code_with_llm_client + (self, mock_error, mock_warning, mock_info, mock_git_folder_search, mock_doc_gen, mock_llm_client, mock_api_client) + test_commit_code_with_llm_client + tests.test_commit_commands.TestCommitCommands.test_commit_code_with_llm_client + + self + self + + + mock_error + mock_error + + + mock_warning + mock_warning + + + mock_info + mock_info + + + mock_git_folder_search + mock_git_folder_search + + + mock_doc_gen + mock_doc_gen + + + mock_llm_client + mock_llm_client + + + mock_api_client + mock_api_client + + + + +Test committing code using an LLM client. + +This function sets up mock objects for various components and then calls +the `commit_code` function with specified parameters. It verifies that +the correct mocks are created and called with the appropriate arguments. + +Args: + mock_error (MagicMock): Mock object for error handling. + mock_warning (MagicMock): Mock object for warning logging. + mock_info (MagicMock): Mock object for info logging. + mock_git_folder_search (MagicMock): Mock object to simulate git folder search. + mock_doc_gen (MagicMock): Mock object for document generation. + mock_llm_client (MagicMock): Mock object for LLM client interaction. + mock_api_client (MagicMock): Mock object for API client interaction. + + + + + + penify_hook.commands.commit_commands.commit_code + + + def + def tests.test_commit_commands.TestCommitCommands.test_commit_code_with_jira_client + (self, mock_error, mock_warning, mock_info, mock_git_folder_search, mock_doc_gen, mock_jira_client, mock_llm_client, mock_api_client) + test_commit_code_with_jira_client + tests.test_commit_commands.TestCommitCommands.test_commit_code_with_jira_client + + self + self + + + mock_error + mock_error + + + mock_warning + mock_warning + + + mock_info + mock_info + + + mock_git_folder_search + mock_git_folder_search + + + mock_doc_gen + mock_doc_gen + + + mock_jira_client + mock_jira_client + + + mock_llm_client + mock_llm_client + + + mock_api_client + mock_api_client + + + + +Test committing code using a JIRA client. + +This function tests the commit_code function with various parameters, +including API and JIRA credentials. It sets up mock objects for +dependencies such as the JIRA client, LLM client, and doc generator to +simulate the behavior of the real classes. The function then calls +commit_code and verifies that the JIRA client and doc generator are +called with the correct parameters. + +Args: + mock_error (MagicMock): A MagicMock object for simulating error logging. + mock_warning (MagicMock): A MagicMock object for simulating warning logging. + mock_info (MagicMock): A MagicMock object for simulating info logging. + mock_git_folder_search (MagicMock): A MagicMock object for simulating the git folder search function. + mock_doc_gen (MagicMock): A MagicMock object for simulating the doc generator function. + mock_jira_client (MagicMock): A MagicMock object for simulating the JIRA client class. + mock_llm_client (MagicMock): A MagicMock object for simulating the LLM client class. + mock_api_client (MagicMock): A MagicMock object for simulating the API client class. + + + + + + penify_hook.commands.commit_commands.commit_code + + + def + def tests.test_commit_commands.TestCommitCommands.test_commit_code_with_jira_connection_failure + (self, mock_error, mock_warning, mock_info, mock_git_folder_search, mock_doc_gen, mock_jira_client, mock_api_client) + test_commit_code_with_jira_connection_failure + tests.test_commit_commands.TestCommitCommands.test_commit_code_with_jira_connection_failure + + self + self + + + mock_error + mock_error + + + mock_warning + mock_warning + + + mock_info + mock_info + + + mock_git_folder_search + mock_git_folder_search + + + mock_doc_gen + mock_doc_gen + + + mock_jira_client + mock_jira_client + + + mock_api_client + mock_api_client + + + + +Test the commit_code function when JIRA connection fails. + +This function tests the scenario where the JIRA connection fails during +a code commit. It sets up various mocks to simulate different components +of the system and then calls the `commit_code` function with specific +parameters. The function is expected to handle the JIRA connection +failure gracefully by logging an appropriate warning. + +Args: + mock_error (MagicMock): Mock for error logging. + mock_warning (MagicMock): Mock for warning logging. + mock_info (MagicMock): Mock for info logging. + mock_git_folder_search (MagicMock): Mock for searching the Git folder. + mock_doc_gen (MagicMock): Mock for generating documentation. + mock_jira_client (MagicMock): Mock for creating a JIRA client. + mock_api_client (MagicMock): Mock for creating an API client. + + + + + + penify_hook.commands.commit_commands.commit_code + + + def + def tests.test_commit_commands.TestCommitCommands.test_commit_code_error_handling + (self, mock_print, mock_exit, mock_git_folder_search, mock_doc_gen, mock_api_client) + test_commit_code_error_handling + tests.test_commit_commands.TestCommitCommands.test_commit_code_error_handling + + self + self + + + mock_print + mock_print + + + mock_exit + mock_exit + + + mock_git_folder_search + mock_git_folder_search + + + mock_doc_gen + mock_doc_gen + + + mock_api_client + mock_api_client + + + + +Test the error handling in the test_commit_code function. + +This function sets up mocks to simulate exceptions and test the error +handling of the commit_code function. It verifies that the function +correctly prints an error message and exits with a status code of 1 when +an exception occurs during documentation generation. + +Args: + mock_print (MagicMock): Mock for the print function, used to verify error message output. + mock_exit (MagicMock): Mock for the sys.exit function, used to verify exit behavior. + mock_git_folder_search (MagicMock): Mock for the git_folder_search function, returning a mock Git folder + path. + mock_doc_gen (MagicMock): Mock for the doc_gen function, simulating an exception during + documentation generation. + mock_api_client (MagicMock): Mock for the API client class, not directly used but referenced in the + function signature. + + + + + + penify_hook.commands.commit_commands.commit_code + + + def + def tests.test_commit_commands.TestCommitCommands.test_setup_commit_parser + (self) + test_setup_commit_parser + tests.test_commit_commands.TestCommitCommands.test_setup_commit_parser + + self + self + + + + +Set up the argument parser for the commit command. + +This function configures an argument parser to handle various options +for committing changes. It adds three arguments: - '-m' or '--message': +An optional argument to specify a contextual commit message with a +default value of "N/A". - '-e' or '--terminal': A boolean flag to open +an edit terminal before committing. - '-d' or '--description': A boolean +flag that, when set to False, indicates the generation of a commit +message with title and description. + +Args: + parser (MagicMock): The argument parser to be configured. + + + + + + penify_hook.commands.commit_commands.setup_commit_parser + + + def + def tests.test_commit_commands.TestCommitCommands.test_handle_commit + (self, mock_print_info, mock_commit_code, mock_get_token, mock_get_llm_config, mock_get_jira_config) + test_handle_commit + tests.test_commit_commands.TestCommitCommands.test_handle_commit + + self + self + + + mock_print_info + mock_print_info + + + mock_commit_code + mock_commit_code + + + mock_get_token + mock_get_token + + + mock_get_llm_config + mock_get_llm_config + + + mock_get_jira_config + mock_get_jira_config + + + + +Test the handle_commit function with various mock objects. + +This function sets up mocks for retrieving LLM configuration, JIRA +configuration, and commit code. It then creates an argument object and +calls the handle_commit function. Finally, it verifies that the mock +functions were called with the expected arguments. + +Args: + mock_print_info (MagicMock): Mock object for printing information. + mock_commit_code (MagicMock): Mock object for committing code. + mock_get_token (MagicMock): Mock object for retrieving API token. + mock_get_llm_config (MagicMock): Mock object for retrieving LLM configuration. + mock_get_jira_config (MagicMock): Mock object for retrieving JIRA configuration. + + + + + + penify_hook.commands.commit_commands.handle_commit + + + + + + + + + + + + + + + tests::test_commit_commands::TestCommitCommandsmock_api_client + tests::test_commit_commands::TestCommitCommandsmock_commit_doc_gen + tests::test_commit_commands::TestCommitCommandsmock_git_folder_search + tests::test_commit_commands::TestCommitCommandsmock_jira_client + tests::test_commit_commands::TestCommitCommandsmock_llm_client + tests::test_commit_commands::TestCommitCommandsmock_print_functions + tests::test_commit_commands::TestCommitCommandstest_commit_code_error_handling + tests::test_commit_commands::TestCommitCommandstest_commit_code_with_jira_client + tests::test_commit_commands::TestCommitCommandstest_commit_code_with_jira_connection_failure + tests::test_commit_commands::TestCommitCommandstest_commit_code_with_llm_client + tests::test_commit_commands::TestCommitCommandstest_handle_commit + tests::test_commit_commands::TestCommitCommandstest_setup_commit_parser + + + diff --git a/docs/xml/classtests_1_1test__config__commands_1_1TestConfigCommands.xml b/docs/xml/classtests_1_1test__config__commands_1_1TestConfigCommands.xml new file mode 100644 index 0000000..68175a0 --- /dev/null +++ b/docs/xml/classtests_1_1test__config__commands_1_1TestConfigCommands.xml @@ -0,0 +1,578 @@ + + + + tests::test_config_commands::TestConfigCommands + + + def + def tests.test_config_commands.TestConfigCommands.test_get_penify_config_existing_dir + (self, mock_file_open, mock_makedirs, mock_path, mock_git_folder) + test_get_penify_config_existing_dir + tests.test_config_commands.TestConfigCommands.test_get_penify_config_existing_dir + + self + self + + + mock_file_open + mock_file_open + + + mock_makedirs + mock_makedirs + + + mock_path + mock_path + + + mock_git_folder + mock_git_folder + + + + +Test the get_penify_config function when the .penify config directory +exists. + +It should not create a new directory and assert that all mocked +functions were called correctly. + +Args: + mock_file_open (MagicMock): A MagicMock object simulating the open() function. + mock_makedirs (MagicMock): A MagicMock object simulating the os.makedirs() function. + mock_path (MagicMock): A MagicMock object simulating the Path class from pathlib module. + mock_git_folder (MagicMock): A MagicMock object simulating the git_folder_search() function. + + + + + + penify_hook.commands.config_commands.get_penify_config + + + def + def tests.test_config_commands.TestConfigCommands.test_get_penify_config_new_dir + (self, mock_file_open, mock_makedirs, mock_path, mock_git_folder) + test_get_penify_config_new_dir + tests.test_config_commands.TestConfigCommands.test_get_penify_config_new_dir + + self + self + + + mock_file_open + mock_file_open + + + mock_makedirs + mock_makedirs + + + mock_path + mock_path + + + mock_git_folder + mock_git_folder + + + + +Test the behavior of get_penify_config when the .penify directory does +not exist. + +This function mocks various system calls to simulate a scenario where +the .penify directory is not present. It then asserts that the +appropriate actions are taken to create the directory and write an empty +JSON file. + +Args: + mock_file_open (MagicMock): A MagicMock object simulating the `open` function. + mock_makedirs (MagicMock): A MagicMock object simulating the `os.makedirs` function. + mock_path (MagicMock): A MagicMock object simulating the `Path` class from `pathlib`. + mock_git_folder (MagicMock): A MagicMock object simulating a git folder search function. + + + + + + penify_hook.commands.config_commands.get_penify_config + + + def + def tests.test_config_commands.TestConfigCommands.test_get_llm_config_exists + (self, mock_file_open, mock_get_config) + test_get_llm_config_exists + tests.test_config_commands.TestConfigCommands.test_get_llm_config_exists + + self + self + + + mock_file_open + mock_file_open + + + mock_get_config + mock_get_config + + + + +Test the get_llm_config function when the configuration file exists. + +This function sets up a mock configuration file that exists and returns +it when called. It then calls the get_llm_config function and asserts +that it returns the correct configuration dictionary. Additionally, it +checks that the mock_file_open function was called with the correct +arguments. + +Args: + mock_file_open (MagicMock): A mock for the open() function. + mock_get_config (MagicMock): A mock for the get_config() function. + + + + + + penify_hook.commands.config_commands.get_llm_config + + + def + def tests.test_config_commands.TestConfigCommands.test_get_llm_config_empty + (self, mock_file_open, mock_get_config) + test_get_llm_config_empty + tests.test_config_commands.TestConfigCommands.test_get_llm_config_empty + + self + self + + + mock_file_open + mock_file_open + + + mock_get_config + mock_get_config + + + + +Test the behavior of get_llm_config when called with an empty +configuration file. + +This function sets up a mock configuration file that exists but returns +no content. It then calls the `get_llm_config` function and asserts that +it returns an empty dictionary and that the file open method was called +exactly once with the correct arguments. + +Args: + mock_file_open (MagicMock): A MagicMock object simulating the built-in open function. + mock_get_config (MagicMock): A MagicMock object simulating the get_config function. + + + + + + penify_hook.commands.config_commands.get_llm_config + + + def + def tests.test_config_commands.TestConfigCommands.test_get_llm_config_invalid_json + (self, mock_print, mock_file_open, mock_get_config) + test_get_llm_config_invalid_json + tests.test_config_commands.TestConfigCommands.test_get_llm_config_invalid_json + + self + self + + + mock_print + mock_print + + + mock_file_open + mock_file_open + + + mock_get_config + mock_get_config + + + + +Test function to verify the behavior of get_llm_config when reading an +invalid JSON file. + +It sets up a mock configuration file that exists but contains invalid +JSON. The function is expected to handle this gracefully by printing an +error message and returning an empty dictionary. + +Args: + mock_print (MagicMock): Mock for the print function. + mock_file_open (MagicMock): Mock for the open function. + mock_get_config (MagicMock): Mock for the get_config function, which returns the mock configuration + file. + + + + + + penify_hook.commands.config_commands.get_llm_config + + + def + def tests.test_config_commands.TestConfigCommands.test_get_jira_config_exists + (self, mock_file_open, mock_get_config) + test_get_jira_config_exists + tests.test_config_commands.TestConfigCommands.test_get_jira_config_exists + + self + self + + + mock_file_open + mock_file_open + + + mock_get_config + mock_get_config + + + + +Test that get_jira_config returns the correct JIRA configuration when +the configuration file exists. + +It sets up a mock for the configuration file to simulate its existence +and verifies that the function reads from the correct file and returns +the expected JIRA configuration dictionary. Additionally, it checks that +the mock file open is called with the appropriate arguments. + +Args: + mock_file_open (MagicMock): A mock for the `open` function. + mock_get_config (MagicMock): A mock for the `get_config` function, which is expected to return a mock + configuration file object. + +Returns: + None: This test function does not explicitly return anything. Its assertions + serve as the verification of its correctness. + + + + + + penify_hook.commands.config_commands.get_jira_config + + + def + def tests.test_config_commands.TestConfigCommands.test_save_llm_config_success + (self, mock_print, mock_json_dump, mock_file_open, mock_get_config) + test_save_llm_config_success + tests.test_config_commands.TestConfigCommands.test_save_llm_config_success + + self + self + + + mock_print + mock_print + + + mock_json_dump + mock_json_dump + + + mock_file_open + mock_file_open + + + mock_get_config + mock_get_config + + + + +Test the save_llm_config function successfully. + +This function tests that the save_llm_config function correctly saves an +LLM configuration and handles various mock objects and side effects. It +ensures that the function returns True upon successful execution, writes +the expected configuration to a file, and prints a confirmation message. + +Args: + mock_print (MagicMock): A mock object for the print function. + mock_json_dump (MagicMock): A mock object for json.dump. + mock_file_open (MagicMock): A mock object for file opening. + mock_get_config (MagicMock): A mock object to return a configuration file mock. + + + + + + penify_hook.commands.config_commands.save_llm_config + + + def + def tests.test_config_commands.TestConfigCommands.test_save_llm_config_failure + (self, mock_print, mock_file_open, mock_get_config) + test_save_llm_config_failure + tests.test_config_commands.TestConfigCommands.test_save_llm_config_failure + + self + self + + + mock_print + mock_print + + + mock_file_open + mock_file_open + + + mock_get_config + mock_get_config + + + + +Test function to verify that the save_llm_config function returns False +and prints an error message when it fails to save the LLM configuration +due to a permission error. + +It sets up a mock configuration file that exists and calls the +save_llm_config function with valid parameters. The function is expected +to return False and print "Error saving LLM configuration: Permission +denied" in case of a failure. + +Args: + self (TestLLMConfig): An instance of the test class. + mock_print (MagicMock): A MagicMock object representing the print function, which will be used + to assert that it was called with the expected error message. + mock_file_open (MagicMock): A MagicMock object representing the open function, which is not used in + this test but is included as a parameter for completeness. + mock_get_config (MagicMock): A MagicMock object representing the get_config function, which will be + used to return the mock configuration file. + + + + + + penify_hook.commands.config_commands.save_llm_config + + + def + def tests.test_config_commands.TestConfigCommands.test_save_jira_config_success + (self, mock_print, mock_json_dump, mock_file_open, mock_path) + test_save_jira_config_success + tests.test_config_commands.TestConfigCommands.test_save_jira_config_success + + self + self + + + mock_print + mock_print + + + mock_json_dump + mock_json_dump + + + mock_file_open + mock_file_open + + + mock_path + mock_path + + + + +Test the save_jira_config function to ensure it saves JIRA configuration +successfully. + +This function sets up mocks for various dependencies and tests the +functionality of saving a JIRA configuration. It asserts that the +function returns `True`, the JSON dump is called with the correct +configuration, and the print statement contains the expected message. + +Args: + mock_print (MagicMock): Mock for the print function. + mock_json_dump (MagicMock): Mock for the json.dump function. + mock_file_open (MagicMock): Mock for the open function. + mock_path (MagicMock): Mock for the path module. + + + + + + penify_hook.commands.config_commands.save_jira_config + + + def + def tests.test_config_commands.TestConfigCommands.test_get_token_from_env + (self, mock_file_open, mock_path, mock_getenv) + test_get_token_from_env + tests.test_config_commands.TestConfigCommands.test_get_token_from_env + + self + self + + + mock_file_open + mock_file_open + + + mock_path + mock_path + + + mock_getenv + mock_getenv + + + + +Test retrieving a token from the environment variable. + +This function tests the behavior of `get_token` when an environment +variable is set. It verifies that if the 'PENIFY_API_TOKEN' environment +variable exists, the function returns its value without attempting to +read a file. + +Args: + mock_file_open (MagicMock): A MagicMock object for simulating file operations. + mock_path (MagicMock): A MagicMock object for simulating path operations. + mock_getenv (MagicMock): A MagicMock object for simulating environment variable retrieval. + + + + + + penify_hook.commands.config_commands.get_token + + + def + def tests.test_config_commands.TestConfigCommands.test_get_token_from_config + (self, mock_file_open, mock_path, mock_getenv) + test_get_token_from_config + tests.test_config_commands.TestConfigCommands.test_get_token_from_config + + self + self + + + mock_file_open + mock_file_open + + + mock_path + mock_path + + + mock_getenv + mock_getenv + + + + +Test retrieving a token from the configuration. + +This function sets up mocks for environment variables and configuration +files, calls the `get_token` function, and asserts its behavior. It +verifies that when the environment variable is not found, the function +reads a token from a configuration file located in the user's home +directory. + +Args: + mock_file_open (MagicMock): A mock for the `open` function. + mock_path (MagicMock): A mock for the `pathlib.Path` class. + mock_getenv (MagicMock): A mock for the `os.getenv` function. + + + + + + penify_hook.commands.config_commands.get_token + + + def + def tests.test_config_commands.TestConfigCommands.test_get_token_not_found + (self, mock_file_open, mock_path, mock_getenv) + test_get_token_not_found + tests.test_config_commands.TestConfigCommands.test_get_token_not_found + + self + self + + + mock_file_open + mock_file_open + + + mock_path + mock_path + + + mock_getenv + mock_getenv + + + + +Test the get_token function when the API token environment variable is +not found. + +This function tests the scenario where the `PENIFY_API_TOKEN` +environment variable is not set. It mocks the environment variable to +return `None`, and verifies that the function returns `None`. The test +also checks that the environment variable is accessed once and that a +file open operation is attempted on a configuration file located in the +user's home directory. + +Args: + mock_file_open (MagicMock): Mock for the built-in `open` function. + mock_path (MagicMock): Mock for the `pathlib.Path` module. + mock_getenv (MagicMock): Mock for the `os.getenv` function. + +Returns: + None: The function does not return anything; it asserts conditions to verify + correctness. + + + + + + penify_hook.commands.config_commands.get_token + + + + + + + + + + + + + + + tests::test_config_commands::TestConfigCommandstest_get_jira_config_exists + tests::test_config_commands::TestConfigCommandstest_get_llm_config_empty + tests::test_config_commands::TestConfigCommandstest_get_llm_config_exists + tests::test_config_commands::TestConfigCommandstest_get_llm_config_invalid_json + tests::test_config_commands::TestConfigCommandstest_get_penify_config_existing_dir + tests::test_config_commands::TestConfigCommandstest_get_penify_config_new_dir + tests::test_config_commands::TestConfigCommandstest_get_token_from_config + tests::test_config_commands::TestConfigCommandstest_get_token_from_env + tests::test_config_commands::TestConfigCommandstest_get_token_not_found + tests::test_config_commands::TestConfigCommandstest_save_jira_config_success + tests::test_config_commands::TestConfigCommandstest_save_llm_config_failure + tests::test_config_commands::TestConfigCommandstest_save_llm_config_success + + + diff --git a/docs/xml/classtests_1_1test__web__config_1_1TestWebConfig.xml b/docs/xml/classtests_1_1test__web__config_1_1TestWebConfig.xml new file mode 100644 index 0000000..e73b0c9 --- /dev/null +++ b/docs/xml/classtests_1_1test__web__config_1_1TestWebConfig.xml @@ -0,0 +1,112 @@ + + + + tests::test_web_config::TestWebConfig + + + def + def tests.test_web_config.TestWebConfig.test_config_llm_web_server_setup + (self, mock_resource_filename, mock_server, mock_webbrowser) + test_config_llm_web_server_setup + tests.test_web_config.TestWebConfig.test_config_llm_web_server_setup + + self + self + + + mock_resource_filename + mock_resource_filename + + + mock_server + mock_server + + + mock_webbrowser + mock_webbrowser + + + + +Set up and test the web server configuration for an LLM (Large Language +Model) web interface. + +This function configures a mock web server for testing purposes, +including setting up resource filenames, mocking server behavior, and +verifying that the web browser is opened and the server starts +correctly. The function uses various mocks to simulate external +dependencies such as `resource_filename` and `server`. + +Args: + mock_resource_filename (MagicMock): A MagicMock object simulating the `resource_filename` function. + mock_server (MagicMock): A MagicMock object simulating the context manager for the web server. + mock_webbrowser (MagicMock): A MagicMock object simulating the `webbrowser` module. + + + + + + penify_hook.commands.config_commands.config_llm_web + + + def + def tests.test_web_config.TestWebConfig.test_config_jira_web_server_setup + (self, mock_resource_filename, mock_server, mock_webbrowser) + test_config_jira_web_server_setup + tests.test_web_config.TestWebConfig.test_config_jira_web_server_setup + + self + self + + + mock_resource_filename + mock_resource_filename + + + mock_server + mock_server + + + mock_webbrowser + mock_webbrowser + + + + +Test the configuration and setup of a JIRA web server. + +This function tests the entire process of setting up a JIRA web server, +including mocking necessary resources, configuring the server to shut +down after handling one request, and verifying that the web browser is +opened with the correct URL. The function uses several mocks to simulate +external dependencies such as resource files, servers, and web browsers. + +Args: + mock_resource_filename (MagicMock): A MagicMock object for simulating the `resource_filename` function. + mock_server (MagicMock): A MagicMock object for simulating the server setup. + mock_webbrowser (MagicMock): A MagicMock object for simulating the web browser opening. + + + + + + penify_hook.commands.config_commands.config_jira_web + + + + + + + + + + + + + + + tests::test_web_config::TestWebConfigtest_config_jira_web_server_setup + tests::test_web_config::TestWebConfigtest_config_llm_web_server_setup + + + diff --git a/docs/xml/combine.xslt b/docs/xml/combine.xslt new file mode 100644 index 0000000..3bfa82c --- /dev/null +++ b/docs/xml/combine.xslt @@ -0,0 +1,15 @@ + + + + + + + + + + + + diff --git a/docs/xml/commit-commands_8md.xml b/docs/xml/commit-commands_8md.xml new file mode 100644 index 0000000..4ff7b63 --- /dev/null +++ b/docs/xml/commit-commands_8md.xml @@ -0,0 +1,174 @@ + + + + commit-commands.md + + + + + +#PenifyCLI-CommitCommands + +The`commit`commandallowsyoutogeneratesmart,AI-poweredcommitmessagesforyourGitchanges.Thisdocumentexplainsallavailableoptionsandcombinations. + +##BasicUsage + +```bash +penifycommit +``` + +Bydefault,thiscommand: +-AnalyzesyourstagedGitchanges +-Generatesaconcisecommittitleonly +-UseslocalLLMifconfigured,orfallsbacktoPenifyAPI + +##CommandOptions + +###`-m,--message` + +Providecontextforthecommitmessagegeneration: + +```bash +penifycommit-m"Fixloginflow" +``` + +ThishinthelpstheAIunderstandyourintentionandimprovesthequalityofthegeneratedmessage. + +###`-e,--terminal` + +Openaneditortoreviewandeditthegeneratedcommitmessagebeforecommitting: + +```bash +penifycommit-e +``` + +ThisopensyourdefaultGiteditorwiththegeneratedmessageforreview. + +###`-d,--description` + +Generateadetailedcommitmessagewithbothtitleanddescription: + +```bash +penifycommit-d +``` + +Withoutthisflag,onlythecommittitleisgenerated. + +##OptionCombinations + +Youcancombinetheseoptionsfordifferentworkflows: + +###GenerateTitleOnlywithContext + +```bash +penifycommit-m"UpdateloginUI" +``` + +###GenerateTitleandDescriptionwithContext + +```bash +penifycommit-m"UpdateloginUI"-d +``` + +###GenerateandEditFullCommitMessage + +```bash +penifycommit-d-e +``` + +###Generate,Edit,andProvideContext + +```bash +penifycommit-m"Refactorauthentication"-d-e +``` + +##LLMandJIRAIntegration + +###UsingLocalLLM + +Ifyou'veconfiguredalocalLLMusing`penifyconfigllm`,thecommitcommandwillautomaticallyuseitformessagegeneration. + +Benefits: +-Privacy:yourcodechangesdon'tleaveyourmachine +-Speed:nonetworklatency +-Worksoffline + +###JIRAEnhancement + +Ifyou'veconfiguredJIRAintegrationusing`penifyconfigjira`,thecommitcommandwill: + +1.DetectJIRAissuereferencesinyourchanges +2.FetchissuedetailsfromyourJIRAinstance +3.Includeissueinformationinthecommitmessage +4.FormatthecommitmessageaccordingtoJIRA'ssmartcommitformat + +Exampleoutput: +``` +PROJ-123:Fixauthenticationbuginloginflow + +-UpdatedOAuthtokenvalidation +-Fixedsessiontimeouthandling +-Addedunittestsforedgecases + +[PROJ-123] +``` + +##ConfigurationRequirements + +Forthe`commit`commandtowork: + +1.Youmusthaveconfiguredeither: +-LocalLLMvia`penifyconfigllm`,OR +-Loggedinvia`penifylogin` + +2.ForJIRAenhancement(optional): +-ConfigureJIRAvia`penifyconfigjira` + +##Examples + +###BasicCommitwithDefaultSettings + +```bash +#Stageyourchanges +gitadd. + +#Generatecommitmessage +penifycommit + +#Commitwiththegeneratedmessage +gitcommit-m"Generatedmessagehere" +``` + +###FullWorkflowwithAllFeatures + +```bash +#Stageyourchanges +gitadd. + +#GeneratedetailedcommitmessagewithJIRAintegration, +#providecontext,andopeneditorforreview +penifycommit-m"Fixloginissue"-d-e + +#Thecommitisautomaticallycompletedafteryousaveandexittheeditor +``` + +##Troubleshooting + +###CommonIssues + +1.**"NoLLMmodelorAPItokenprovided"** +-Run`penifyconfigllm`toconfigurealocalLLM,or +-Run`penifylogin`toauthenticatewithPenify + +2.**"FailedtoconnecttoJIRA"** +-CheckyourJIRAconfigurationwith`cat~/.penify` +-Verifyyournetworkconnection +-EnsureyourJIRAcredentialsarevalid + +3.**"ErrorinitializingLLMclient"** +-VerifyyourLLMconfigurationsettings +-EnsuretheLLMAPIisaccessible + + + + diff --git a/docs/xml/commit__analyzer_8py.xml b/docs/xml/commit__analyzer_8py.xml new file mode 100644 index 0000000..280aa69 --- /dev/null +++ b/docs/xml/commit__analyzer_8py.xml @@ -0,0 +1,188 @@ + + + + commit_analyzer.py + penify_hook::commit_analyzer::CommitDocGenHook + penify_hook + penify_hook::commit_analyzer + + + + + +importos +importre +importsubprocess +importtempfile +fromtypingimportOptional,List +fromgitimportRepo +fromtqdmimporttqdm + +frompenify_hook.base_analyzerimportBaseAnalyzer +frompenify_hook.jira_clientimportJiraClient +frompenify_hook.ui_utilsimportprint_info,print_success,print_warning +from.api_clientimportAPIClient + +classCommitDocGenHook(BaseAnalyzer): +def__init__(self,repo_path:str,api_client:APIClient,llm_client=None,jira_client=None): +super().__init__(repo_path,api_client) + +self.llm_client=llm_client#AddLLMclientasanoptionalparameter +self.jira_client:JiraClient=jira_client#AddJIRAclientasanoptionalparameter + +defget_summary(self,instruction:str,generate_description:bool)->dict: +"""Generateasummaryforthecommitbasedonthestagedchanges. + +Thisfunctionretrievesthedifferencesofthestagedchangesintherepository +andgeneratesacommitsummaryusingtheprovidedinstruction.Ifthereareno +changesstagedforcommit,anexceptionisraised.IfaJIRAclientis +connected,itwillattempttoextractissuekeysfromthecurrentbranchand +usethemtofetchcontext.ThesummarycanbegeneratedeitherwithaLanguage +Model(LLM)clientorthroughtheAPIclient. + +Args: +instruction(str):Astringcontaininginstructionsforgeneratingthecommitsummary. +generate_description(bool):Whethertoincludedetaileddescriptionsinthesummary. + +Raises: +ValueError:Iftherearenochangesstagedforcommit. +""" +diff=self.repo.git.diff('--cached') +ifnotdiff: +raiseValueError("Nochangestocommit") + +#GetJIRAcontextifavailable +jira_context=None +ifself.jira_clientandself.jira_client.is_connected(): +try: +#CheckbranchnameforJIRAissues +current_branch=self.repo.active_branch.name +issue_keys=self.jira_client.extract_issue_keys_from_branch(current_branch) + +#Ifissuesfoundinbranch,getcontext +ifissue_keys: +jira_context=self.jira_client.get_commit_context_from_issues(issue_keys) +exceptExceptionase: +print(f"CouldnotgetJIRAcontext:{e}") + +#UseLLMclientifprovided,otherwiseuseAPIclient +print_info("FetchingcommitsummaryfromLLM...") +ifself.llm_client: +returnself.api_client.generate_commit_summary_with_llm( +diff,instruction,generate_description,self.repo_details,self.llm_client,jira_context +) +else: +returnself.api_client.generate_commit_summary(diff,instruction,self.repo_details,jira_context) + + +defrun(self,msg:Optional[str],edit_commit_message:bool,generate_description:bool): +"""Runthepost-commithook. + +Thismethodprocessesthemodifiedfilesfromthelastcommit,stagesthem,and +createsanauto-commitwithanoptionalmessage.ItalsohandlesJIRA +integrationifavailable.Ifthereisanerrorgeneratingthecommitsummary, +anexceptionisraised. + +Args: +msg(Optional[str]):Anoptionalmessagetoincludeinthecommit. +edit_commit_message(bool):Aflagindicatingwhethertoopenthegitcommit +editterminalaftercommitting. +generate_description(bool):Aflagindicatingwhethertoincludeadescription +inthecommitmessage. +""" +summary:dict=self.get_summary(msg,True) +ifnotsummary: +raiseException("Errorgeneratingcommitsummary") + +title=summary.get('title',"") +description=summary.get('description',"") + +#IfJIRAclientisavailable,integrateJIRAinformation +ifself.jira_clientandself.jira_client.is_connected(): +#AddJIRAinformationtocommitmessage +self.process_jira_integration(title,description,msg) + +#committhechangestotherepositorywithabovedetails +commit_msg=f"{title}\n\n{description}"ifgenerate_descriptionelsetitle +self.repo.git.commit('-m',commit_msg) +print_success(f"Commit:{commit_msg}") + +ifedit_commit_message: +#Openthegitcommiteditterminal +print_info("Openinggitcommiteditterminal...") +self._amend_commit() + +defprocess_jira_integration(self,title:str,description:str,msg:str)->tuple: +#LookforJIRAissuekeysincommitmessage,title,descriptionandusermessage +"""ProcessJIRAintegrationbyextractingissuekeysfromcommitmessage +componentsandbranchname. + +ThisfunctionlooksforJIRAissuekeysintheprovidedcommittitle, +description,originalusermessage,andtheactivebranchname.Itusesthese +keystoupdatethecommitmessagewithJIRAinformationandaddscommentsto +thecorrespondingJIRAissues.Ifnokeysarefound,itlogsawarning. + +Args: +title(str):Thegeneratedcommittitle. +description(str):Thegeneratedcommitdescription. +msg(str):TheoriginalusermessagethatmightcontainJIRAreferences. + +Returns: +tuple:AtuplecontainingtheupdatedcommittitleanddescriptionwithincludedJIRA +information. +""" +issue_keys=[] +ifself.jira_client: +#Extractfrommessagecontent +issue_keys=self.jira_client.extract_issue_keys(f"{title}{description}{msg}") + +#Alsocheckthebranchname(whichoftenfollowsJIRAnamingconventions) +try: +current_branch=self.repo.active_branch.name +branch_issue_keys=self.jira_client.extract_issue_keys_from_branch(current_branch) + +#Addanynewkeysfoundinbranchname +forkeyinbranch_issue_keys: +ifkeynotinissue_keys: +issue_keys.append(key) +print_info(f"AddedJIRAissue{key}frombranchname:{current_branch}") +exceptExceptionase: +print_warning(f"CouldnotextractJIRAissuesfrombranchname:{e}") + +ifissue_keys: +print_info(f"FoundJIRAissues:{','.join(issue_keys)}") + +#FormatcommitmessagewithJIRAinfo + +#AddcommentstoJIRAissues +forissue_keyinissue_keys: +comment=( +f"Commitrelatedtothisissue:\n\n" +f"**{title}**\n\n" +f"{description}\n\n" +) +self.jira_client.add_comment(issue_key,comment) +else: +print_warning("NoJIRAissuesfoundincommitmessageorbranchname") + +returntitle,description + +def_amend_commit(self): +"""Amendsthelastcommitmessageintherepository.""" +try: +#Changetotherepositorydirectory +os.chdir(self.repo_path) + +#Rungitcommit--amend +subprocess.run(['git','commit','--amend'],check=True) + +print("Commitmessageamendedsuccessfully.") +exceptsubprocess.CalledProcessErrorase: +print(f"Erroramendingcommitmessage:{e}") +finally: +#Changebacktotheoriginaldirectory +os.chdir(os.path.dirname(os.path.abspath(__file__))) + + + + diff --git a/docs/xml/commit__commands_8py.xml b/docs/xml/commit__commands_8py.xml new file mode 100644 index 0000000..217bf43 --- /dev/null +++ b/docs/xml/commit__commands_8py.xml @@ -0,0 +1,162 @@ + + + + commit_commands.py + penify_hook + penify_hook::commands + penify_hook::commands::commit_commands + + + + + +importos +importsys +importargparse + +frompenify_hook.ui_utilsimportprint_info,print_warning + + +defcommit_code(api_url,token,message,open_terminal,generate_description, +llm_model=None,llm_api_base=None,llm_api_key=None, +jira_url=None,jira_user=None,jira_api_token=None): + +"""EnhanceGitcommitswithAI-poweredcommitmessages. + +Thisfunctionallowsforthegenerationofenhancedcommitmessagesusing +naturallanguageprocessingmodelsandoptionallyintegrateswithJIRAfor +additionalcontext.ItprocessesthecurrentGitfoldertofindrelevantfiles +andgeneratesadetailedcommitmessagebasedontheprovidedparameters. + +Args: +api_url(str):URLoftheAPIendpoint. +token(str):AuthenticationtokenfortheAPI. +message(str):Initialcommitmessageprovidedbytheuser. +open_terminal(bool):Whethertoopentheterminalaftercommitting. +generate_description(bool):Whethertogenerateadetaileddescriptioninthecommitmessage. +llm_model(str?):Thelanguagemodeltouseforgeneratingthecommitmessage.DefaultstoNone. +llm_api_base(str?):BaseURLoftheLLMAPI.DefaultstoNone. +llm_api_key(str?):APIkeyforaccessingtheLLMservice.DefaultstoNone. +jira_url(str?):URLoftheJIRAinstance.DefaultstoNone. +jira_user(str?):UsernameforauthenticatingwithJIRA.DefaultstoNone. +jira_api_token(str?):APItokenforaccessingJIRA.DefaultstoNone. +""" +frompenify_hook.ui_utilsimportprint_error +frompenify_hook.utilsimportrecursive_search_git_folder +from..commit_analyzerimportCommitDocGenHook +from..api_clientimportAPIClient + +#Tryimportingoptionaldependencies +try: +from..llm_clientimportLLMClient +exceptImportError: +LLMClient=None + +try: +from..jira_clientimportJiraClient +exceptImportError: +JiraClient=None +#CreateAPIclient +api_client=APIClient(api_url,token) + +#InitializeLLMclientifLLMparametersareprovidedandLLMClientisavailable +llm_client=None +ifLLMClientisnotNoneandllm_model: +try: +llm_client=LLMClient( +model=llm_model, +api_base=llm_api_base, +api_key=llm_api_key +) +print_info(f"UsingLLMmodel:{llm_model}") +exceptExceptionase: +print_error(f"ErrorinitializingLLMclient:{e}") +print_error("FallingbacktoAPIforcommitsummarygeneration") +else: +ifnottoken: +print_error("NoLLMmodelorAPItokenprovided.PleaseprovideanLLMmodelorAPItoken.") + +#InitializeJIRAclientifparametersareprovidedandJiraClientisavailable +jira_client=None +ifJiraClientisnotNoneandjira_urlandjira_userandjira_api_token: +try: +jira_client=JiraClient( +jira_url=jira_url, +jira_user=jira_user, +jira_api_token=jira_api_token +) +ifjira_client.is_connected(): +print_info(f"ConnectedtoJIRA:{jira_url}") +else: +print_warning(f"FailedtoconnecttoJIRA:{jira_url}") +jira_client=None +exceptExceptionase: +print_warning(f"ErrorinitializingJIRAclient:{e}") +jira_client=None + +try: +#PasstheLLMclientandJIRAclienttoCommitDocGenHook +gf_path=recursive_search_git_folder(os.getcwd()) +analyzer=CommitDocGenHook(gf_path,api_client,llm_client,jira_client) +analyzer.run(message,open_terminal,generate_description) +exceptExceptionase: +print(f"Error:{e}") +sys.exit(1) + + + + + +defsetup_commit_parser(parser): + +"""Setsupanargumentparserforgeneratingsmartcommitmessages.""" +commit_parser_description=""" +Itgeneratessmartcommitmessages.Bydefault,itwilljustgeneratejusttheTitleofthecommitmessage. +1.IfyouhavenotconfiguredLLM,itwillgiveanerror.YoueitherneedtoconfigureLLMorusetheAPIkey. +2.IfyouhavenotconfiguredJIRA.ItwillnotenhancethecommitmessagewithJIRAissuedetails. +3.Formoreinformation,visithttps://penify.wiki/dcsgc1 +""" +parser.help="Generatesmartcommitmessagesusinglocal-LLM(nologinrequired)." +parser.description=commit_parser_description +parser.formatter_class=argparse.RawDescriptionHelpFormatter + +#Addthemessageargumentwithbetterhelp +parser.add_argument("-m","--message",required=False,help="Commitwithcontextualcommitmessage.",default="N/A") +parser.add_argument("-e","--terminal",action="store_true",help="Openeditterminalbeforecommitting.") +parser.add_argument("-d","--description",action="store_false",help="Itwillgeneratecommitmessagewithtitleanddescription.",default=False) + +defhandle_commit(args): + +"""Handlecommitfunctionalitybyprocessingargumentsandinvokingthe +appropriatecommands.""" +frompenify_hook.commands.commit_commandsimportcommit_code +frompenify_hook.commands.config_commandsimportget_jira_config,get_llm_config,get_token +frompenify_hook.constantsimportAPI_URL + +#Onlyimportdependenciesneededforcommitfunctionalityhere +open_terminal=args.terminal +generate_description=args.description +print_info(f"GenerateCommitDescription:{generate_description}") +#Trytogetfromconfig +llm_config=get_llm_config() +llm_model=llm_config.get('model') +llm_api_base=llm_config.get('api_base') +llm_api_key=llm_config.get('api_key') +token=get_token() + + + +#Trytogetfromconfig +jira_config=get_jira_config() +jira_url=jira_config.get('url') +jira_user=jira_config.get('username') +jira_api_token=jira_config.get('api_token') + + +commit_code(API_URL,token,args.message,open_terminal,generate_description, +llm_model,llm_api_base,llm_api_key, +jira_url,jira_user,jira_api_token) + + + + diff --git a/docs/xml/compound.xsd b/docs/xml/compound.xsd new file mode 100644 index 0000000..e0ffe43 --- /dev/null +++ b/docs/xml/compound.xsd @@ -0,0 +1,1290 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + The mentioned file will be located in the directory as specified by XML_OUTPUT + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/xml/config-commands_8md.xml b/docs/xml/config-commands_8md.xml new file mode 100644 index 0000000..4eb0949 --- /dev/null +++ b/docs/xml/config-commands_8md.xml @@ -0,0 +1,179 @@ + + + + config-commands.md + + + + + +#PenifyCLI-ConfigurationCommands + +The`config`commandallowsyoutosetupandmanageconfigurationsettingsforPenifyCLI.Thisdocumentexplainsallavailableconfigurationoptionsandhowtousethem. + +##ConfigurationOverview + +PenifyCLIstoresconfigurationinaJSONfileat`~/.penify/config.json`.Theconfigurationincludes: + +-LLM(LargeLanguageModel)settingsforlocalcommitmessagegeneration +-JIRAintegrationsettingsforenhancedcommitmessages +-APItokensandothercredentials + +##BasicUsage + +```bash +#ConfigureLLMsettings +penifyconfigllm + +#ConfigureJIRAintegration +penifyconfigjira +``` + +##LLMConfiguration + +###WebInterface + +Running`penifyconfigllm`opensawebinterfaceinyourbrowserwhereyoucanconfigure: + +1.**Model**:TheLLMmodeltouse(e.g.,`gpt-3.5-turbo`) +2.**APIBaseURL**:TheendpointURLforyourLLMAPI(e.g.,`https://api.openai.com/v1`) +3.**APIKey**:YourauthenticationkeyfortheLLMAPI + +###SupportedLLMs + +PenifyCLIsupportsvariousLLMproviders: + +####OpenAI +-Model:`gpt-3.5-turbo`or`gpt-4` +-APIBase:`https://api.openai.com/v1` +-APIKey:YourOpenAIAPIkey + +####Anthropic +-Model:`claude-instant-1`or`claude-2` +-APIBase:`https://api.anthropic.com/v1` +-APIKey:YourAnthropicAPIkey + +####Ollama(Local) +-Model:`llama2`oranymodelyouhaveinstalled +-APIBase:`http://localhost:11434` +-APIKey:(leaveblank) + +####AzureOpenAI +-Model:Yourdeployedmodelname +-APIBase:YourAzureendpoint +-APIKey:YourAzureAPIkey + +###ConfigurationFileStructure + +Afterconfiguration,your`~/.penify/config.json`willcontain: + +```json +{ +"llm":{ +"model":"gpt-3.5-turbo", +"api_base":"https://api.openai.com/v1", +"api_key":"sk-..." +} +} +``` + +##JIRAConfiguration + +###WebInterface + +Running`penifyconfigjira`opensawebinterfacewhereyoucanconfigure: + +1.**JIRAURL**:YourJIRAinstanceURL(e.g.,`https://yourcompany.atlassian.net`) +2.**Username**:YourJIRAusername(typicallyyouremail) +3.**APIToken**:YourJIRAAPItoken + +###CreatingaJIRAAPIToken + +1.Loginto[https://id.atlassian.com/manage-profile/security/api-tokens](https://id.atlassian.com/manage-profile/security/api-tokens) +2.Click"CreateAPItoken" +3.Giveitaname(e.g.,"PenifyCLI") +4.Copythegeneratedtokenandpasteitintotheconfiguration + +###ConfigurationFileStructure + +Afterconfiguration,your`~/.penify/config.json`willcontain: + +```json +{ +"jira":{ +"url":"https://yourcompany.atlassian.net", +"username":"your.email@example.com", +"api_token":"your-jira-api-token" +} +} +``` + +##ConfigurationLocations + +PenifyCLIlooksforconfigurationinmultiplelocations: + +1.Project-specific:`.penify/config.json`intheGitrepositoryroot +2.User-specific:`~/.penify/config.json`inyourhomedirectory + +Theproject-specificconfigurationtakesprecedenceifbothexist. + +##EnvironmentVariables + +Youcanoverrideconfigurationsettingsusingenvironmentvariables: + +-`PENIFY_API_TOKEN`:OverridethestoredAPItoken +-`PENIFY_LLM_MODEL`:OverridetheconfiguredLLMmodel +-`PENIFY_LLM_API_BASE`:OverridetheconfiguredLLMAPIbaseURL +-`PENIFY_LLM_API_KEY`:OverridetheconfiguredLLMAPIkey +-`PENIFY_JIRA_URL`:OverridetheconfiguredJIRAURL +-`PENIFY_JIRA_USER`:OverridetheconfiguredJIRAusername +-`PENIFY_JIRA_TOKEN`:OverridetheconfiguredJIRAAPItoken + +Example: +```bash +exportPENIFY_LLM_MODEL="gpt-4" +penifycommit +``` + +##Command-LineConfiguration + +Foradvancedusersorscripting,youcandirectlyedittheconfigurationfile: + +```bash +#Viewcurrentconfiguration +cat~/.penify/config.json + +#Editconfigurationwithyourpreferrededitor +nano~/.penify/config.json +``` + +##SharingConfiguration + +Youcanshareconfigurationbetweenmachinesbycopyingthe`.penify/config.json`file.However,becautiouswithAPIkeysandcredentials. + +Forteamsettings,consider: +1.Usingaproject-specific`.penify/config.json`withsharedsettings +2.ExcludingAPIkeysfromsharedconfiguration +3.Usingenvironmentvariablesforsensitivecredentials + +##Troubleshooting + +###CommonIssues + +1.**"Errorreadingconfigurationfile"** +-Checkifthefileexists:`ls-la~/.penify` +-EnsureitcontainsvalidJSON:`cat~/.penify/config.json` + +2.**"FailedtoconnecttoLLMAPI"** +-VerifyAPIbaseURLandAPIkey +-ChecknetworkconnectivitytotheAPIendpoint +-Ensureyouraccounthasaccesstothespecifiedmodel + +3.**"FailedtoconnecttoJIRA"** +-CheckJIRAURLformat(shouldinclude`https://`) +-VerifyusernameandAPItoken +-EnsureyourJIRAaccounthasAPIaccesspermissions + + + + diff --git a/docs/xml/config__command_8py.xml b/docs/xml/config__command_8py.xml new file mode 100644 index 0000000..53169fa --- /dev/null +++ b/docs/xml/config__command_8py.xml @@ -0,0 +1,101 @@ + + + + config_command.py + penify_hook + penify_hook::config_command + + + + + + + + +defsetup_config_parser(parent_parser): + +#Configsubcommand:Createsubparsersforconfigtypes +"""SetupconfigurationparserswithsubcommandsforLLMandJIRAsettings.""" +parser=parent_parser.add_subparsers(title="config_type",dest="config_type") + +#Configsubcommand:llm +llm_config_parser=parser.add_parser("llm-cmd",help="ConfigureLLMsettings.") +llm_config_parser.add_argument("--model",required=True,help="LLMmodeltouse") +llm_config_parser.add_argument("--api-base",help="APIbaseURLfortheLLMservice") +llm_config_parser.add_argument("--api-key",help="APIkeyfortheLLMservice") + +#Configsubcommand:llm-web +parser.add_parser("llm",help="ConfigureLLMsettingsthroughawebinterface") + +#Configsubcommand:jira +jira_config_parser=parser.add_parser("jira-cmd",help="ConfigureJIRAsettings.") +jira_config_parser.add_argument("--url",required=True,help="JIRAbaseURL") +jira_config_parser.add_argument("--username",required=True,help="JIRAusernameoremail") +jira_config_parser.add_argument("--api-token",required=True,help="JIRAAPItoken") +jira_config_parser.add_argument("--verify",action="store_true",help="VerifyJIRAconnection") + +#Configsubcommand:jira-web +parser.add_parser("jira",help="ConfigureJIRAsettingsthroughawebinterface") + +#Addallothernecessaryargumentsforconfigcommand + +defhandle_config(args): + +#Onlyimportdependenciesneededforconfigfunctionalityhere + + + +"""Handleconfigurationsettingsbasedonthespecifiedconfigtype. + +ThisfunctionprocessesdifferenttypesofconfigurationssuchasLLM(Language +Model)andJIRA.Itsavesconfigurations,setsupweb-basedconfigurations,and +verifiesJIRAconnections.Dependingonthe`args.config_type`,itimports +necessarymodules,handlesconfigurationsavingorsetup,andoptionally +verifiesJIRAconnectivity. + +Args: +args(argparse.Namespace):Command-lineargumentscontainingthetypeofconfigurationtohandle. +""" +ifargs.config_type=="llm-cmd": +frompenify_hook.commands.config_commandsimportsave_llm_config +save_llm_config(args.model,args.api_base,args.api_key) +print(f"LLMconfigurationset:Model={args.model},APIBase={args.api_baseor'default'}") + +elifargs.config_type=="llm": +frompenify_hook.commands.config_commandsimportconfig_llm_web +config_llm_web() + +elifargs.config_type=="jira-cmd": +frompenify_hook.commands.config_commandsimportsave_jira_config +save_jira_config(args.url,args.username,args.api_token) +print(f"JIRAconfigurationset:URL={args.url},Username={args.username}") +frompenify_hook.jira_clientimportJiraClient#Importmovedhere + +#Verifyconnectionifrequested +ifargs.verify: +ifJiraClient: +jira_client=JiraClient( +jira_url=args.url, +jira_user=args.username, +jira_api_token=args.api_token +) +ifjira_client.is_connected(): +print("JIRAconnectionverifiedsuccessfully!") +else: +print("FailedtoconnecttoJIRA.Pleasecheckyourcredentials.") +else: +print("JIRApackagenotinstalled.Cannotverifyconnection.") + +elifargs.config_type=="jira": +frompenify_hook.commands.config_commandsimportconfig_jira_web +config_jira_web() + +else: +print("Pleasespecifyaconfigtype:llm,jira") +return1 + +return0 + + + + diff --git a/docs/xml/config__commands_8py.xml b/docs/xml/config__commands_8py.xml new file mode 100644 index 0000000..6eaf2f6 --- /dev/null +++ b/docs/xml/config__commands_8py.xml @@ -0,0 +1,536 @@ + + + + config_commands.py + penify_hook + penify_hook::commands + penify_hook::commands::config_commands + + + + + +importjson +importos +importrandom +importwebbrowser +importhttp.server +importsocketserver +importpkg_resources +frompathlibimportPath +fromthreadingimportThread +importlogging +importsys +fromtypingimportDict,Any,Optional,Union + +#Trytoimportdotenv,butdon'tfailifit'snotavailable +try: +fromdotenvimportload_dotenv +DOTENV_AVAILABLE=True +exceptImportError: +DOTENV_AVAILABLE=False + + +defload_env_files()->None: +"""Loadenvironmentvariablesfrom.envfilesinvariouslocationswithproper +priority. + +Thisfunctionloadsenvironmentvariablesfrom.envfileslocatedindifferent +directories,prioritizingthecurrentdirectoryovertheGitreporootandthe +userhomedirectory.Theloadingprocessensuresthatlaterfilesoverride +earlierones. +""" +ifnotDOTENV_AVAILABLE: +logging.warning("python-dotenvisnotinstalled..envfileloadingisdisabled.") +logging.warning("Run'pipinstallpython-dotenv'toenable.envfilesupport.") +return + +#Loadfromuserhomedirectory(lowestpriority) +try: +home_env=Path.home()/'.env' +ifhome_env.exists(): +load_dotenv(dotenv_path=home_env,override=False) +exceptExceptionase: +logging.warning(f"Failedtoload.envfromhomedirectory:{str(e)}") + +#LoadfromGitreporoot(mediumpriority) +try: +frompenify_hook.utilsimportrecursive_search_git_folder +current_dir=os.getcwd() +repo_root=recursive_search_git_folder(current_dir) +ifrepo_rootandrepo_root!=str(Path.home()): +repo_env=Path(repo_root)/'.env' +ifrepo_env.exists()andrepo_env!=home_env: +load_dotenv(dotenv_path=repo_env,override=True) +exceptExceptionase: +logging.warning(f"Failedtoload.envfromGitrepo:{str(e)}") + +#Loadfromcurrentdirectory(highestpriority) +current_env=Path(os.getcwd())/'.env' +ifcurrent_env.exists()and(notrepo_rootorcurrent_env!=Path(repo_root)/'.env'): +load_dotenv(dotenv_path=current_env,override=True) + + +#Loadenvironmentvariableswhenmoduleisimported +load_env_files() + + +defget_penify_config()->Path: +"""Returnsthepathtothe`config.json`filewithinthe`.penify`directory, +creatingitifnecessary.""" +current_dir=os.getcwd() +frompenify_hook.utilsimportrecursive_search_git_folder +home_dir=recursive_search_git_folder(current_dir) + + +ifnothome_dir: +home_dir=Path.home() +else: +home_dir=Path(home_dir) + +penify_dir=home_dir/'.penify' +ifpenify_dir.exists(): +returnpenify_dir/'config.json' +else: +#Createthe.penifydirectoryifitdoesn'texist +os.makedirs(penify_dir,exist_ok=True) + + +#Createthe.penifydirectory +os.makedirs(penify_dir,exist_ok=True) +#Createanemptyconfig.jsonfile +withopen(penify_dir/'config.json','w')asf: +json.dump({},f) +returnpenify_dir/'config.json' + + +defget_env_var_or_default(env_var:str,default:Any=None)->Any: +"""Getenvironmentvariableorreturndefaultvalue.""" +returnos.environ.get(env_var,default) + + +defsave_llm_config(model,api_base,api_key): +"""SaveLLMconfigurationsettingstoan.envfile. + +ThisfunctionsavestheLLMconfigurationfollowingaspecificpriority:1.Git +reporoot.env(ifinsideagitrepo)2.Userhomedirectory.envIthandles +thedetectionoftheGitreporoot,readstheexisting.envcontent,updatesit +withthenewLLMconfiguration,andwritesitbacktothefile.Italsoreloads +theenvironmentvariablestomakechangesimmediatelyavailable. + +Args: +model(str):Thenameofthelanguagemodel. +api_base(str):ThebaseURLfortheAPI. +api_key(str):TheAPIkeyforauthentication. + +Returns: +bool:Trueiftheconfigurationissavedsuccessfully,Falseotherwise. +""" +frompathlibimportPath +importos + +ifnotDOTENV_AVAILABLE: +print("python-dotenvisnotinstalled.Run'pipinstallpython-dotenv'toenable.envfilesupport.") +returnFalse + +#TrytofindGitreporoot +try: +frompenify_hook.utilsimportrecursive_search_git_folder +current_dir=os.getcwd() +repo_root=recursive_search_git_folder(current_dir) +env_file=Path(repo_root)/'.env'ifrepo_rootelsePath.home()/'.env' +exceptExceptionase: +print(f"FailedtodetermineGitreporoot:{str(e)}") +env_file=Path.home()/'.env' + +#Readexisting.envcontent +env_content={} +ifenv_file.exists(): +withopen(env_file,'r')asf: +forlineinf: +line=line.strip() +iflineandnotline.startswith('#')and'='inline: +key,value=line.split('=',1) +env_content[key.strip()]=value.strip() + +#UpdateLLMconfiguration +env_content['PENIFY_LLM_MODEL']=model +env_content['PENIFY_LLM_API_BASE']=api_base +env_content['PENIFY_LLM_API_KEY']=api_key + +#Writebackto.envfile +try: +withopen(env_file,'w')asf: +forkey,valueinenv_content.items(): +f.write(f"{key}={value}\n") +print(f"LLMconfigurationsavedto{env_file}") + +#Reloadenvironmentvariablestomakechangesimmediatelyavailable +ifDOTENV_AVAILABLE: +fromdotenvimportload_dotenv +load_dotenv(dotenv_path=env_file,override=True) + +returnTrue +exceptExceptionase: +print(f"ErrorsavingLLMconfiguration:{str(e)}") +returnFalse + + +defsave_jira_config(url,username,api_token): +"""SaveJIRAconfigurationsettingstoa.envfile. + +ThisfunctionsavesJIRAconfigurationfollowingthesesteps:1.Determinethe +target.envfilelocationbasedonwhetherthecurrentdirectoryisinsidea +Gitrepository.2.IfinsideaGitrepo,usetheGitreporoot's.envfile; +otherwise,usetheuserhomedirectory's.envfile.3.Readtheexisting +contentofthe.envfile(ifitexists)topreserveothersettings.4.Update +the.envcontentwiththenewJIRAconfiguration.5.Writetheupdatedcontent +backtothe.envfile.6.Optionally,reloadenvironmentvariablestomake +changesimmediatelyavailable. + +Args: +url(str):TheJIRAURLtobesavedinthe.envfile. +username(str):TheJIRAusernametobesavedinthe.envfile. +api_token(str):TheJIRAAPItokentobesavedinthe.envfile. + +Returns: +bool:Trueiftheconfigurationwassuccessfullysaved,Falseotherwise. +""" +frompathlibimportPath +importos + +ifnotDOTENV_AVAILABLE: +print("python-dotenvisnotinstalled.Run'pipinstallpython-dotenv'toenable.envfilesupport.") +returnFalse + +#TrytofindGitreporoot +try: +frompenify_hook.utilsimportrecursive_search_git_folder +current_dir=os.getcwd() +repo_root=recursive_search_git_folder(current_dir) +env_file=Path(repo_root)/'.env'ifrepo_rootelsePath.home()/'.env' +exceptExceptionase: +print(f"FailedtodetermineGitreporoot:{str(e)}") +env_file=Path.home()/'.env' + +#Readexisting.envcontent +env_content={} +ifenv_file.exists(): +withopen(env_file,'r')asf: +forlineinf: +line=line.strip() +iflineandnotline.startswith('#')and'='inline: +key,value=line.split('=',1) +env_content[key.strip()]=value.strip() + +#UpdateJIRAconfiguration +env_content['PENIFY_JIRA_URL']=url +env_content['PENIFY_JIRA_USER']=username +env_content['PENIFY_JIRA_TOKEN']=api_token + +#Writebackto.envfile +try: +withopen(env_file,'w')asf: +forkey,valueinenv_content.items(): +f.write(f"{key}={value}\n") +print(f"JIRAconfigurationsavedto{env_file}") + +#Reloadenvironmentvariablestomakechangesimmediatelyavailable +ifDOTENV_AVAILABLE: +fromdotenvimportload_dotenv +load_dotenv(dotenv_path=env_file,override=True) + +returnTrue +exceptExceptionase: +print(f"ErrorsavingJIRAconfiguration:{str(e)}") +returnFalse + + +defget_llm_config()->Dict[str,str]: +#Ensureenvironmentvariablesareloaded +"""RetrieveLLMconfigurationfromenvironmentvariables.""" +ifDOTENV_AVAILABLE: +load_env_files() + +#Getvaluesfromenvironmentvariables +config={ +'model':get_env_var_or_default('PENIFY_LLM_MODEL',''), +'api_base':get_env_var_or_default('PENIFY_LLM_API_BASE',''), +'api_key':get_env_var_or_default('PENIFY_LLM_API_KEY','') +} + +#Removeemptyvalues +config={k:vfork,vinconfig.items()ifv} + +returnconfig + + +defget_jira_config()->Dict[str,str]: +#Ensureenvironmentvariablesareloaded +"""RetrieveJIRAconfigurationfromenvironmentvariables.""" +ifDOTENV_AVAILABLE: +load_env_files() + +#Getvaluesfromenvironmentvariables +config={ +'url':get_env_var_or_default('PENIFY_JIRA_URL',''), +'username':get_env_var_or_default('PENIFY_JIRA_USER',''), +'api_token':get_env_var_or_default('PENIFY_JIRA_TOKEN','') +} + +#Removeemptyvalues +config={k:vfork,vinconfig.items()ifv} + +returnconfig + + +defconfig_llm_web(): +"""StartsanHTTPserverforconfiguringLLMsettingsviaawebinterface.""" +redirect_port=random.randint(30000,50000) +server_url=f"http://localhost:{redirect_port}" + +print(f"Startingconfigurationserveron{server_url}") + +classConfigHandler(http.server.SimpleHTTPRequestHandler): +defdo_GET(self): + +"""HandleHTTPGETrequestsandserveappropriateresponsesbasedonpath.""" +ifself.path=="/": +self.send_response(200) +self.send_header("Content-type","text/html") +self.end_headers() + +#ReadthetemplateHTMLfile +template_path=pkg_resources.resource_filename( +"penify_hook","templates/llm_config.html" +) + +withopen(template_path,'r')asf: +content=f.read() + +self.wfile.write(content.encode()) +elifself.path=="/get_config": +self.send_response(200) +self.send_header("Content-type","application/json") +self.end_headers() + +#GetcurrentLLMconfiguration +current_config=get_llm_config() + +ifcurrent_config: +response={ +"success":True, +"config":current_config +} +else: +response={ +"success":False, +"message":"Noconfigurationfound" +} + +self.wfile.write(json.dumps(response).encode()) +else: +self.send_response(404) +self.send_header("Content-type","text/plain") +self.end_headers() +self.wfile.write(b"NotFound") + +defdo_POST(self): + +"""HandlePOSTrequeststosavelanguagemodelconfigurationdata.""" +ifself.path=="/save": +content_length=int(self.headers['Content-Length']) +post_data=self.rfile.read(content_length) +data=json.loads(post_data.decode()) + +model=data.get('model') +api_base=data.get('api_base') +api_key=data.get('api_key') + +try: +save_llm_config(model,api_base,api_key) + +self.send_response(200) +self.send_header("Content-type","application/json") +self.end_headers() +response={ +"success":True, +"message":f"LLMconfigurationsavedsuccessfully.Usingmodel:{model}" +} +self.wfile.write(json.dumps(response).encode()) + +#Scheduletheservershutdown +thread=Thread(target=self.server.shutdown) +thread.daemon=True +thread.start() + +exceptExceptionase: +self.send_response(500) +self.send_header("Content-type","application/json") +self.end_headers() +response={"success":False,"message":f"Errorsavingconfiguration:{str(e)}"} +self.wfile.write(json.dumps(response).encode()) +else: +self.send_response(404) +self.send_header("Content-type","application/json") +self.end_headers() +self.wfile.write(json.dumps({"success":False,"message":"NotFound"}).encode()) + +deflog_message(self,format,*args): +#Suppresslogmessages +"""Suppresseslogmessages.""" +return + +withsocketserver.TCPServer(("",redirect_port),ConfigHandler)ashttpd: +print(f"Openingconfigurationpageinyourbrowser...") +webbrowser.open(server_url) +print(f"Waitingforconfigurationtobesubmitted...") +httpd.serve_forever() + +print("Configurationcompleted.") + + +defconfig_jira_web(): +"""StartsawebserverforconfiguringJIRAsettings.""" +redirect_port=random.randint(30000,50000) +server_url=f"http://localhost:{redirect_port}" + +print(f"Startingconfigurationserveron{server_url}") + +classConfigHandler(http.server.SimpleHTTPRequestHandler): +defdo_GET(self): + +"""HandleGETrequestsbyservingHTML,JSON,or404responsesbasedonthepath.""" +ifself.path=="/": +self.send_response(200) +self.send_header("Content-type","text/html") +self.end_headers() + +#ReadthetemplateHTMLfile +template_path=pkg_resources.resource_filename( +"penify_hook","templates/jira_config.html" +) + +withopen(template_path,'r')asf: +content=f.read() + +self.wfile.write(content.encode()) +elifself.path=="/get_config": +self.send_response(200) +self.send_header("Content-type","application/json") +self.end_headers() + +#GetcurrentJIRAconfiguration +current_config=get_jira_config() + +ifcurrent_config: +response={ +"success":True, +"config":current_config +} +else: +response={ +"success":False, +"message":"NoJIRAconfigurationfound" +} + +self.wfile.write(json.dumps(response).encode()) +else: +self.send_response(404) +self.send_header("Content-type","text/plain") +self.end_headers() +self.wfile.write(b"NotFound") + +defdo_POST(self): + +"""HandleHTTPPOSTrequeststosaveJIRAconfiguration.""" +ifself.path=="/save": +content_length=int(self.headers['Content-Length']) +post_data=self.rfile.read(content_length) +data=json.loads(post_data.decode()) + +url=data.get('url') +username=data.get('username') +api_token=data.get('api_token') +verify=data.get('verify',False) + +try: +#Savetheconfiguration +save_jira_config(url,username,api_token) + +#Verifyconnectionoptionishandledinmain.py +self.send_response(200) +self.send_header("Content-type","application/json") +self.end_headers() +response={ +"success":True, +"message":f"JIRAconfigurationsavedsuccessfully." +} +self.wfile.write(json.dumps(response).encode()) + +#Scheduletheservershutdown +thread=Thread(target=self.server.shutdown) +thread.daemon=True +thread.start() + +exceptExceptionase: +self.send_response(500) +self.send_header("Content-type","application/json") +self.end_headers() +response={"success":False,"message":f"Errorsavingconfiguration:{str(e)}"} +self.wfile.write(json.dumps(response).encode()) +else: +self.send_response(404) +self.send_header("Content-type","application/json") +self.end_headers() +self.wfile.write(json.dumps({"success":False,"message":"NotFound"}).encode()) + +deflog_message(self,format,*args): +#Suppresslogmessages +"""Suppresseslogmessages.""" +return + +withsocketserver.TCPServer(("",redirect_port),ConfigHandler)ashttpd: +print(f"Openingconfigurationpageinyourbrowser...") +webbrowser.open(server_url) +print(f"Waitingforconfigurationtobesubmitted...") +httpd.serve_forever() + +print("Configurationcompleted.") + + +defget_token()->Optional[str]: +#Ensureenvironmentvariablesareloadedfromall.envfiles +"""RetrievesanAPItokenusingaprioritizedmethod. + +Thisfunctionfirstattemptstoloadenvironmentvariablesfromall`.env` +filesandchecksifthe`PENIFY_API_TOKEN`environmentvariableisset.If +found,itreturnsthetoken.Ifnot,itlooksfortheAPIkeyina +configurationfilenamed'api_keys'.Ifbothmethodsfail,itreturnsNone. + +Returns: +strorNone:TheAPItokeniffound,otherwiseNone. +""" +ifDOTENV_AVAILABLE: +load_env_files() + +#Checkenvironmentvariablefirst +env_token=get_env_var_or_default('PENIFY_API_TOKEN') +ifenv_token: +returnenv_token + +#Checkconfigfile +config_file=get_penify_config() +ifconfig_file.exists(): +try: +withopen(config_file,'r')asf: +config=json.load(f) +returnconfig.get('api_keys') +except(json.JSONDecodeError,Exception)ase: +print(f"Errorreading.penifyconfigfile:{str(e)}") + +returnNone + + + + diff --git a/docs/xml/conftest_8py.xml b/docs/xml/conftest_8py.xml new file mode 100644 index 0000000..1f83991 --- /dev/null +++ b/docs/xml/conftest_8py.xml @@ -0,0 +1,23 @@ + + + + conftest.py + tests + tests::conftest + + + + + +importpytest +importos +importsys + +#Addprojectroottosys.pathforimportstowork +sys.path.insert(0,os.path.abspath(os.path.join(os.path.dirname(__file__),'..'))) + +#Commonfixturescanbeaddedhere + + + + diff --git a/docs/xml/constants_8py.xml b/docs/xml/constants_8py.xml new file mode 100644 index 0000000..ba635e1 --- /dev/null +++ b/docs/xml/constants_8py.xml @@ -0,0 +1,17 @@ + + + + constants.py + penify_hook + penify_hook::constants + + + + + +API_URL='http://localhost:8000/api' +DASHBOARD_URL="https://dashboard.penify.dev/auth/localhost/login" + + + + diff --git a/docs/xml/detailed-usage_8md.xml b/docs/xml/detailed-usage_8md.xml new file mode 100644 index 0000000..cb55f77 --- /dev/null +++ b/docs/xml/detailed-usage_8md.xml @@ -0,0 +1,173 @@ + + + + detailed-usage.md + + + + + +#PenifyCLI-DetailedUsageGuide + +Thisdocumentprovidesin-depthinformationaboutallfeaturesandcapabilitiesofthePenifyCLItool. + +##TableofContents + +-[PenifyCLI-DetailedUsageGuide](#penify-cli---detailed-usage-guide) +-[TableofContents](#table-of-contents) +-[Authentication](#authentication) +-[LoginProcess](#login-process) +-[APITokenStorage](#api-token-storage) +-[TokenPrecedence](#token-precedence) +-[CommandOverview](#command-overview) +-[CommitMessageGeneration](#commit-message-generation) +-[CodeDocumentationGeneration](#code-documentation-generation) +-[UseCases](#use-cases) +-[AuthenticationRequirement](#authentication-requirement) +-[ConfigurationSettings](#configuration-settings) +-[GitHooks](#git-hooks) +-[Post-CommitHook](#post-commit-hook) +-[CustomHookLocation](#custom-hook-location) +-[AdvancedUseCases](#advanced-use-cases) +-[CI/CDIntegration](#cicd-integration) +-[RemoteRepositoryDocumentation](#remote-repository-documentation) +-[Troubleshooting](#troubleshooting) +-[CommonIssues](#common-issues) +-[Logs](#logs) +-[Support](#support) + +##Authentication + +###LoginProcess + +Whenyourun`penifylogin`,thetool: + +1.Opensyourdefaultwebbrowser +2.RedirectsyoutoPenify'sloginpage +3.Capturestheauthenticationtokenaftersuccessfullogin +4.Savesthetokenin`~/.penify`file + +###APITokenStorage + +APItokensarestoredinyourhomedirectoryinthe`.penify`file.ThisJSONfilecontains: + +```json +{ +"api_keys":"your-api-token", +"llm":{"model":"...","api_base":"...","api_key":"..."}, +"jira":{"url":"...","username":"...","api_token":"..."} +} +``` + +###TokenPrecedence + +1.Environmentvariable`PENIFY_API_TOKEN`(highestpriority) +2.Tokenin`~/.penify`file + +##CommandOverview + +``` +penify +├──commitGeneratesmartcommitmessages +├──configConfigurelocalLLMandJIRA +├──llmConfigurelocalLLMsettings +└──jiraConfigureJIRAintegration +├──loginLogintoPenifyaccount +└──docgenGeneratecodedocumentation +├──install-hookInstallGitpost-commithook +└──uninstall-hookRemoveGitpost-commithook +``` + +##CommitMessageGeneration + +The`commit`commandanalyzesyourstagedchangesandgeneratesmeaningfulcommitmessages.Itcan: + +-UsealocalLLMifconfigured +-EnhancemessageswithJIRAissuedetails +-Providebothtitleanddescription + +Forspecificoptionsandexamples,see[docs/commit-commands.md](commit-commands.md). + +##CodeDocumentationGeneration + +The`docgen`commandgeneratesdocumentationforyourcode: + +###UseCases + +1.**CurrentGitDiff**:Defaultbehavior,documentsonlychangedfiles +2.**SpecificFile**:Passafilepathwith`-lpath/to/file.py` +3.**EntireFolder**:Passafolderpathwith`-lpath/to/folder` + +###AuthenticationRequirement + +ThisfeaturerequiresauthenticationwithaPenifyaccount.Run`penifylogin`beforeusingdocumentationfeatures. + +##ConfigurationSettings + +Configurelocalsettingsusingthe`config`command: + +-**LLMSettings**:ConfigurealocalLLMforcommitmessagegeneration +-**JIRASettings**:SetupJIRAintegrationforenhancedcommitmessages + +Fordetailedconfigurationoptions,see[docs/config-commands.md](config-commands.md). + +##GitHooks + +PenifycaninstallGithookstoautomatedocumentationgeneration: + +###Post-CommitHook + +-**Install**:`penifydocgeninstall-hook` +-**Whatitdoes**:Automaticallygeneratesdocumentationforchangedfilesaftereachcommit +-**Uninstall**:`penifydocgenuninstall-hook` + +###CustomHookLocation + +YoucanspecifyacustomlocationforGithooks: + +```bash +penifydocgeninstall-hook-l/path/to/git/repo +``` + +##AdvancedUseCases + +###CI/CDIntegration + +ForCI/CDpipelines: + +1.Set`PENIFY_API_TOKEN`asanenvironmentvariable +2.Runcommandswithoutrequiringinteractivelogin + +###RemoteRepositoryDocumentation + +Generatedocumentationforanentirerepository: + +```bash +gitclonehttps://github.com/user/repo +cdrepo +penifydocgen-l. +``` + +##Troubleshooting + +###CommonIssues + +1.**APIKeyErrors**:Ensureyou'verun`penifylogin`orset`PENIFY_API_TOKEN` +2.**LLMConfiguration**:CheckyourLLMsettingswith`cat~/.penify` +3.**JIRAIntegration**:VerifyJIRAcredentialsinyourconfiguration + +###Logs + +Formoredetailedlogs,youcansettheenvironmentvariable: + +```bash +exportPENIFY_DEBUG=1 +``` + +###Support + +Foradditionalhelp,visit[https://docs.penify.dev/](https://docs.penify.dev/)orcontactsupport@penify.dev + + + + diff --git a/docs/xml/dir_063e2d5fe58a131099a7fe4200cca78c.xml b/docs/xml/dir_063e2d5fe58a131099a7fe4200cca78c.xml new file mode 100644 index 0000000..64ba2d0 --- /dev/null +++ b/docs/xml/dir_063e2d5fe58a131099a7fe4200cca78c.xml @@ -0,0 +1,17 @@ + + + + /tmp/github_reposRepoArchDocGenContext/Penify-dev/penify-cli/tests + __init__.py + conftest.py + test_commit_commands.py + test_config_commands.py + test_doc_commands.py + test_web_config.py + + + + + + + diff --git a/docs/xml/dir_1648a057408aae8db85b8e3797335623.xml b/docs/xml/dir_1648a057408aae8db85b8e3797335623.xml new file mode 100644 index 0000000..300e1cd --- /dev/null +++ b/docs/xml/dir_1648a057408aae8db85b8e3797335623.xml @@ -0,0 +1,11 @@ + + + + /tmp/github_reposRepoArchDocGenContext/Penify-dev/penify-cli/docs + + + + + + + diff --git a/docs/xml/dir_624fa2a8bce97f0444ac5cca335d4e23.xml b/docs/xml/dir_624fa2a8bce97f0444ac5cca335d4e23.xml new file mode 100644 index 0000000..52eaaa8 --- /dev/null +++ b/docs/xml/dir_624fa2a8bce97f0444ac5cca335d4e23.xml @@ -0,0 +1,17 @@ + + + + /tmp/github_reposRepoArchDocGenContext/Penify-dev/penify-cli/penify_hook/commands + __init__.py + auth_commands.py + commit_commands.py + config_commands.py + doc_commands.py + hook_commands.py + + + + + + + diff --git a/docs/xml/dir_b3b22d2ab7966b65f6b237e3231b41be.xml b/docs/xml/dir_b3b22d2ab7966b65f6b237e3231b41be.xml new file mode 100644 index 0000000..2a7c175 --- /dev/null +++ b/docs/xml/dir_b3b22d2ab7966b65f6b237e3231b41be.xml @@ -0,0 +1,15 @@ + + + + /tmp/github_reposRepoArchDocGenContext/Penify-dev/penify-cli + /tmp/github_reposRepoArchDocGenContext/Penify-dev/penify-cli/docs + /tmp/github_reposRepoArchDocGenContext/Penify-dev/penify-cli/penify_hook + /tmp/github_reposRepoArchDocGenContext/Penify-dev/penify-cli/tests + setup.py + + + + + + + diff --git a/docs/xml/dir_f88c3381c1861b3f7ca1f3d63cf244b5.xml b/docs/xml/dir_f88c3381c1861b3f7ca1f3d63cf244b5.xml new file mode 100644 index 0000000..9f4f478 --- /dev/null +++ b/docs/xml/dir_f88c3381c1861b3f7ca1f3d63cf244b5.xml @@ -0,0 +1,27 @@ + + + + /tmp/github_reposRepoArchDocGenContext/Penify-dev/penify-cli/penify_hook + /tmp/github_reposRepoArchDocGenContext/Penify-dev/penify-cli/penify_hook/commands + __init__.py + api_client.py + base_analyzer.py + commit_analyzer.py + config_command.py + constants.py + file_analyzer.py + folder_analyzer.py + git_analyzer.py + jira_client.py + llm_client.py + login_command.py + main.py + ui_utils.py + utils.py + + + + + + + diff --git a/docs/xml/doc__commands_8md.xml b/docs/xml/doc__commands_8md.xml new file mode 100644 index 0000000..839cd71 --- /dev/null +++ b/docs/xml/doc__commands_8md.xml @@ -0,0 +1,340 @@ + + + + doc_commands.md + + + + + +#PenifyCLI-DocumentationGenerationCommands + +Thisdocumentprovidesadetailedguidetoallpermutationsandcombinationsofthe`docgen`command,includingextensiveinformationaboutGithookcommandsforautomatingdocumentationgeneration. + +##TableofContents + +-[BasicUsage](#basic-usage) +-[CommandOptions](#command-options) +-[OptionCombinations](#option-combinations) +-[GitHookCommands](#git-hook-commands) +-[HookInstallation](#hook-installation) +-[HookCustomization](#hook-customization) +-[HookUninstallation](#hook-uninstallation) +-[AdvancedUseCases](#advanced-use-cases) +-[Troubleshooting](#troubleshooting) + +##BasicUsage + +```bash +penifydocgen +``` + +Bydefault,thiscommand: +-AnalyzesthecurrentGitdiff(changessincelastcommit) +-Generatesdocumentationforchangedfilesonly +-Requiresauthenticationvia`penifylogin` + +##CommandOptions + +###`-l,--location` + +Specifyatargetfordocumentationgeneration: + +```bash +#Generatedocumentationforaspecificfile +penifydocgen-lpath/to/file.py + +#Generatedocumentationforaspecificfolder +penifydocgen-lpath/to/folder +``` + +Withoutthisflag,PenifyanalyzesonlyGit-trackedmodifiedfiles. + +###Subcommands + +####`install-hook` + +InstallaGitpost-commithooktoautomaticallygeneratedocumentation: + +```bash +penifydocgeninstall-hook +``` + +####`uninstall-hook` + +RemovetheGitpost-commithook: + +```bash +penifydocgenuninstall-hook +``` + +##OptionCombinations + +###GenerateDocumentationforCurrentGitDiff + +```bash +#Basicusage-currentGitdiff +penifydocgen +``` + +###GenerateDocumentationforaSpecificFile + +```bash +#Singlefiledocumentation +penifydocgen-lsrc/main.py +``` + +###GenerateDocumentationforaFolder + +```bash +#Folderdocumentation +penifydocgen-lsrc/models/ +``` + +###InstallHookinCurrentRepository + +```bash +#InstallhookincurrentGitrepository +penifydocgeninstall-hook +``` + +###InstallHookinSpecificRepository + +```bash +#InstallhookinaspecificGitrepository +penifydocgeninstall-hook-l/path/to/repo +``` + +###UninstallHookfromCurrentRepository + +```bash +#UninstallhookfromcurrentGitrepository +penifydocgenuninstall-hook +``` + +###UninstallHookfromSpecificRepository + +```bash +#UninstallhookfromaspecificGitrepository +penifydocgenuninstall-hook-l/path/to/repo +``` + +##GitHookCommands + +PenifyprovidesGithookcommandstoautomatedocumentationgenerationaspartofyourGitworkflow. + +###HookInstallation + +####HowHooksWork + +WhenyouinstallaGithookwith`penifydocgeninstall-hook`,Penify: + +1.Createsapost-commithookscriptinthe`.git/hooks`directory +2.Makesthescriptexecutable +3.Configuresthehooktorun`penifydocgen`aftereachcommit + +####HookScriptContent + +Thegeneratedpost-commithookcontains: + +```bash +#!/bin/sh +#Thisisapost-commithookgeneratedbypenify. +#Automaticallygeneratesdocumentationforchangedfilesaftereachcommit. + +penifydocgen-gf/path/to/git/repository-tyour_api_token +``` + +####InstallationLocation + +Bydefault,hooksareinstalledinthecurrentGitrepository.Youcanspecifyadifferentlocation: + +```bash +penifydocgeninstall-hook-l/path/to/repo +``` + +####InstallationRequirements + +Toinstallhooks,youneed: +-AvalidPenifyAPItoken(loginfirstwith`penifylogin`) +-Writepermissionstothe`.git/hooks`directory + +####VerifyingInstallation + +Afterinstallation,youcanverifythatthehookisinstalled: + +```bash +cat.git/hooks/post-commit +``` + +###HookCustomization + +Youcancustomizethepost-commithookafterinstallation: + +####ModifyingHookBehavior + +1.Editthe`.git/hooks/post-commit`file +2.Addadditionaloptionstothe`penifydocgen`command +3.Addothercommandstorunaftercommit + +Exampleofacustomizedhook: + +```bash +#!/bin/sh +#Thisisapost-commithookgeneratedbypenify. +#Automaticallygeneratesdocumentationforchangedfilesaftereachcommit. + +#Generatedocumentation +penifydocgen-gf/path/to/git/repository-tyour_api_token + +#Additionalcustomcommands +echo"Documentationgenerationcomplete!" +``` + +####AdvancedHookScenarios + +**ConditionalDocumentationGeneration**: + +```bash +#!/bin/sh +#Onlygeneratedocumentationforcommitstothemainbranch +BRANCH=$(gitrev-parse--abbrev-refHEAD) +if["$BRANCH"="main"];then +penifydocgen-gf/path/to/git/repository-tyour_api_token +fi +``` + +**DocumentingSpecificFiles/Folders**: + +```bash +#!/bin/sh +#OnlydocumentPythonfilesinthesrcdirectory +penifydocgen-lsrc/-gf/path/to/git/repository-tyour_api_token +``` + +###HookUninstallation + +####StandardUninstallation + +Toremoveahookfromthecurrentrepository: + +```bash +penifydocgenuninstall-hook +``` + +####SpecificRepositoryUninstallation + +Toremoveahookfromaspecificrepository: + +```bash +penifydocgenuninstall-hook-l/path/to/repo +``` + +####ManualHookRemoval + +Ifneeded,youcanmanuallyremovethehook: + +```bash +rm.git/hooks/post-commit +``` + +####VerifyingUninstallation + +Checkthatthehookwassuccessfullyremoved: + +```bash +ls-la.git/hooks/post-commit#Shouldreturn"Nosuchfileordirectory" +``` + +##AdvancedUseCases + +###ContinuousIntegration + +RundocumentationgenerationinCIpipelines: + +```bash +#InyourCIscript +exportPENIFY_API_TOKEN=your_api_token +penifydocgen-lsrc/ +``` + +###BatchDocumentation + +Generatedocumentationformultiplerepositories: + +```bash +#Bashscriptforbatchdocumentation +forrepoinrepo1repo2repo3;do +cd/path/to/$repo +penifydocgen-l. +done +``` + +###CustomGitHookIntegration + +IntegratewithotherGithooks: + +```bash +#In.git/hooks/pre-push +penifydocgen-lsrc/ +``` + +###DocumentingReleaseTags + +Generatedocumentationwhencreatingareleasetag: + +```bash +#Documenteverythingwhencreatingatag +gittag-av1.0.0 +penifydocgen-l.#Documententirecodebase +gitcommit--amend-m"Releasev1.0.0withupdateddocumentation" +``` + +##Troubleshooting + +###CommonIssues + +1.**"Authenticationrequired"** +-Run`penifylogin`beforeusingdocumentationfeatures +-CheckyourAPItokenwith`cat~/.penify` + +2.**"Permissiondeniedwheninstallinghook"** +-CheckGitrepositorypermissions +-Tryrunningwithsudo(ifappropriateforyourenvironment) +-Ensurethe`.git/hooks`directoryexists + +3.**"Hookinstalledbutnotrunning"** +-Checkifthehookisexecutable:`ls-la.git/hooks/post-commit` +-Makeitexecutableifneeded:`chmod+x.git/hooks/post-commit` +-Checkforsyntaxerrorsinthehookscript + +4.**"Fileordirectorynotfound"** +-Verifythepathprovidedtothe`-l`option +-Ensureyou'rerunningthecommandfromthecorrectdirectory + +5.**"Hookuninstallationfailed"** +-Checkpermissionsonthe`.git/hooks`directory +-Trymanualremoval:`rm.git/hooks/post-commit` + +###Debugging + +Fordetailedoutputwhenrunningdocumentationcommands: + +```bash +exportPENIFY_DEBUG=1 +penifydocgen-lsrc/ +``` + +###GettingHelp + +Forcommand-specifichelp: + +```bash +penifydocgen--help +penifydocgeninstall-hook--help +penifydocgenuninstall-hook--help +``` + + + + diff --git a/docs/xml/doc__commands_8py.xml b/docs/xml/doc__commands_8py.xml new file mode 100644 index 0000000..88027b7 --- /dev/null +++ b/docs/xml/doc__commands_8py.xml @@ -0,0 +1,152 @@ + + + + doc_commands.py + penify_hook + penify_hook::commands + penify_hook::commands::doc_commands + + + + + + +importargparse +importlogging +importos +importsys +importtime + +defgenerate_doc(api_url,token,location=None): +"""Generatesdocumentationbasedonthegivenparameters. + +ThisfunctioninitializesanAPIclientusingtheprovidedAPIURLandtoken. +Itthengeneratesdocumentationbyanalyzingthespecifiedlocation,whichcan +beafolder,afile,orthecurrentworkingdirectoryifnolocationis +provided.Thefunctionhandlesdifferenttypesofanalysisbasedontheinput +locationandreportsanyerrorsencounteredduringtheprocess. + +Args: +api_url(str):TheURLoftheAPItoconnecttofordocumentationgeneration. +token(str):TheauthenticationtokenforaccessingtheAPI. +location(str?):Thepathtoaspecificfileorfoldertoanalyze.Ifnotprovided, +thecurrentworkingdirectoryisused. +""" +t1=time.time() +from..api_clientimportAPIClient +print(f"TimetakentolaodAPIClinet:{time.time()-t1:.2f}seconds") +"""Generatesdocumentationbasedonthegivenparameters. + +ThisfunctioninitializesanAPIclientusingtheprovidedAPIURLand +token.Itthengeneratesdocumentationbyanalyzingthespecified +location,whichcanbeafolder,afile,orthecurrentworking +directoryifnolocationisprovided.Thefunctionhandlesdifferent +typesofanalysisbasedontheinputlocationandreportsanyerrors +encounteredduringtheprocess. + +Args: +api_url(str):TheURLoftheAPItoconnecttofordocumentationgeneration. +token(str):TheauthenticationtokenforaccessingtheAPI. +location(str?):Thepathtoaspecificfileorfoldertoanalyze. +Ifnotprovided,thecurrentworkingdirectoryisused. +""" +api_client=APIClient(api_url,token) +iflocationisNone: +current_folder_path=os.getcwd() +try: +from..git_analyzerimportGitDocGenHook +analyzer=GitDocGenHook(current_folder_path,api_client) +analyzer.run() +exceptExceptionase: +print(f"Error:{e}") +sys.exit(1) + +#iflocationisafile +eliflen(location.split('.'))>1: +try: +from..file_analyzerimportFileAnalyzerGenHook +analyzer=FileAnalyzerGenHook(location,api_client) +analyzer.run() +exceptExceptionase: +print(f"Error:{e}") +sys.exit(1) + +else: +try: +from..folder_analyzerimportFolderAnalyzerGenHook +analyzer=FolderAnalyzerGenHook(location,api_client) +analyzer.run() +exceptExceptionase: +print(f"Error:{e}") +sys.exit(1) + + +#Definethedocgendescriptiontext +docgen_description="""GeneratecodedocumentationusingPenify. + +ThiscommandrequiresyoutobeloggedintoyourPenifyaccount. +Youcangeneratedocumentationfor: +-CurrentGitdiff(default) +-Specificfile +-Specificfolder +""" + +defsetup_docgen_parser(parser): + +#Wedon'tneedtocreateanewdocgen_parsersinceit'spassedasaparameter +"""ConfigureaparserforgeneratingdocumentationusingGitcommands.""" +docgen_parser_description=""" +ItgeneratesDocumentationfortheGitdiff,fileorfolder. +1.Bydefault,itwillgitdiffdocumentation-visithttps://penify.wiki/dcdcformoredetails. +2.Iffileisprovided,itwillgeneratedocumentationforthatfile-visithttps://penify.wiki/dfdc +3.Iffolderisprovided,itwillgeneratedocumentationforthatfolder-visithttps://penify.wiki/drdc +4.CommitHookswillautomaticallygeneratedocumentationfortheGitdiffoncommit-https://penify.wiki/dpchc +5.YouneedtobeloggedintoyourPenifyaccounttousethesecommands. +""" + +parser.description=docgen_parser_description +parser.formatter_class=argparse.RawDescriptionHelpFormatter +docgen_subparsers=parser.add_subparsers(title="docgen_subcommand",dest="docgen_subcommand") + +#Docgenmainoptions(fordirectdocumentationgeneration) +parser.add_argument("-l","--location",help="[Optional]PathtothefolderorfiletoGenerateDocumentation.Bydefaultitwillpicktherootdirectory.",default=None) + +#Subcommand:install-hook(aspartofdocgen) +install_hook_parser=docgen_subparsers.add_parser("install-hook",help="InstalltheGitpost-commithook.") +install_hook_parser.add_argument("-l","--location",required=False, +help="LocationinwhichtoinstalltheGithook.Defaultstocurrentdirectory.", +default=os.getcwd()) + +#Subcommand:uninstall-hook(aspartofdocgen) +uninstall_hook_parser=docgen_subparsers.add_parser("uninstall-hook",help="UninstalltheGitpost-commithook.") +uninstall_hook_parser.add_argument("-l","--location",required=False, +help="LocationfromwhichtouninstalltheGithook.Defaultstocurrentdirectory.", +default=os.getcwd()) + +defhandle_docgen(args): + +#Onlyimportdependenciesneededfordocgenfunctionalityhere +"""Handledocumentgenerationandhookmanagementbasedonsubcommands.""" +frompenify_hook.commands.config_commandsimportget_token +importsys +frompenify_hook.commands.doc_commandsimportgenerate_doc +frompenify_hook.commands.hook_commandsimportinstall_git_hook,uninstall_git_hook +frompenify_hook.constantsimportAPI_URL + +token=get_token() +ifnottoken: +logging.error("Error:Unabletoauthenticate.Pleaserun'penifylogin'.") +sys.exit(1) + +ifargs.docgen_subcommand=="install-hook": +install_git_hook(args.location,token) + +elifargs.docgen_subcommand=="uninstall-hook": +uninstall_git_hook(args.location) + +else:#Directdocumentationgeneration +generate_doc(API_URL,token,args.location) + + + + diff --git a/docs/xml/doxyfile.xsd b/docs/xml/doxyfile.xsd new file mode 100644 index 0000000..fbfc2c1 --- /dev/null +++ b/docs/xml/doxyfile.xsd @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/xml/example-workflows_8md.xml b/docs/xml/example-workflows_8md.xml new file mode 100644 index 0000000..24722e9 --- /dev/null +++ b/docs/xml/example-workflows_8md.xml @@ -0,0 +1,156 @@ + + + + example-workflows.md + + + + + +#PenifyCLIExampleWorkflows + +ThisdocumentdemonstrateshowtousePenifyCLIinreal-worlddevelopmentworkflowstoimproveyourproductivity. + +##Workflow1:EfficientGitCommitswithAI + +###Setup + +First,configureyourlocalLLMforofflineoperation: + +```bash +penifyconfigllm +``` + +ConfigureyourJIRAintegrationforenhancedcommitmessages: + +```bash +penifyconfigjira +``` + +###DailyWorkflow + +1.Makeyourcodechangesasusual +2.Whenreadytocommit,usePenifytogenerateasmartcommitmessage: + +```bash +penifycommit +``` + +3.Reviewandconfirmthegeneratedcommitmessage +4.Gitcommitandpushasusual + +###Benefits + +-Consistentanddescriptivecommitmessages +-AutomaticinclusionofrelevantJIRAticketinformation +-Timesavedfromwritingdetailedcommitmessages + +##Workflow2:DocumentationGenerationPipeline + +###Setup + +LogintoPenifytoaccessadvanceddocumentationfeatures: + +```bash +penifylogin +``` + +InstalltheGithookforautomaticdocumentationgeneration: + +```bash +penifydocgeninstall-hook +``` + +###DailyWorkflow + +1.Makeyourcodechangesasusual +2.Commityourchanges +3.Documentationisautomaticallygeneratedforchangedfiles +4.Reviewthegenerateddocumentation + +###ManualDocumentation + +Forspecificfilesorfolders: + +```bash +penifydocgen-lsrc/components/authentication +``` + +###Benefits + +-Alwaysup-to-datedocumentation +-Consistentdocumentationstyle +-Timesavedfromwritingdetaileddocumentation + +##Workflow3:CodeReviewEnhancement + +###Setup + +Ensureyou'reloggedintoPenify: + +```bash +penifylogin +``` + +###Workflow + +1.BeforesubmittingaPR,generatedocumentationforchangedfiles: + +```bash +penifydocgen +``` + +2.IncludethegenerateddocumentationinyourPR +3.ReviewerscanbetterunderstandyourchangeswiththeAI-generatedexplanations + +###Benefits + +-ImprovedPRquality +-Fastercodereviews +-Betterteamunderstandingofcodechanges + +##Workflow4:OnboardingNewTeamMembers + +###ForTeamLeads + +Generatecomprehensivedocumentationfortheentirecodebase: + +```bash +penifydocgen-l. +``` + +###ForNewTeamMembers + +Generatefocuseddocumentationforcomponentsyou'reworkingon: + +```bash +penifydocgen-lsrc/components/my-feature +``` + +###Benefits + +-Fasteronboarding +-Betterunderstandingofcodestructure +-Reducedquestionstoseniorteammembers + +##Workflow5:LegacyCodeUnderstanding + +Whenworkingwithunfamiliarlegacycode: + +```bash +#Documentaspecificcomplexfile +penifydocgen-lsrc/legacy/complex_module.py + +#Documentanentirelegacycomponent +penifydocgen-lsrc/legacy/old_component +``` + +###Benefits + +-Quicklyunderstandcomplexlegacysystems +-Reducetimespentdecipheringundocumentedcode +-Makesaferchangestolegacysystems + + + + diff --git a/docs/xml/file__analyzer_8py.xml b/docs/xml/file__analyzer_8py.xml new file mode 100644 index 0000000..312fc34 --- /dev/null +++ b/docs/xml/file__analyzer_8py.xml @@ -0,0 +1,170 @@ + + + + file_analyzer.py + penify_hook::file_analyzer::FileAnalyzerGenHook + penify_hook + penify_hook::file_analyzer + + + + + +importos +importsys +fromgitimportRepo +fromtqdmimporttqdm +importtime + +frompenify_hook.base_analyzerimportBaseAnalyzer +frompenify_hook.utilsimportget_repo_details,recursive_search_git_folder +from.api_clientimportAPIClient +importlogging +from.ui_utilsimport( +format_highlight,print_info,print_success,print_warning,print_error, +print_status,create_stage_progress_bar, +update_stage,format_file_path +) + +#Setuplogger +logger=logging.getLogger(__name__) + +classFileAnalyzerGenHook(BaseAnalyzer): +def__init__(self,file_path:str,api_client:APIClient): +self.file_path=file_path +super().__init__(file_path,api_client) + + + +defprocess_file(self,file_path,pbar,new_param:str=""): +"""Processesafilebyvalidatingitsextension,readingcontent, +generatingdocumentation,andwritingchangesbacktothefile.Thefunction +performsseveralstagesofprocessing:1.Validatesthefile'sextensionto +ensureitissupported.2.Readsthecontentofthefile.3.Sendsthefile +contentfordocumentationgeneration.4.Writesthegenerateddocumentation +backtothefileiftherearechanges. + +Args: +file_path(str):Thepathofthefiletobeprocessed. +pbar(tqdm.tqdm):Aprogressbarobjecttoupdatethestatusofprocessingstages. +new_param(str?):Anadditionalparameterforfutureuse.Defaultstoanemptystring.""" +file_abs_path=os.path.join(os.getcwd(),file_path) +file_extension=os.path.splitext(file_path)[1].lower() + +#---STAGE1:Validating--- +update_stage(pbar,"Validating") +ifnotfile_extension: +print_warning(f"Emptyextensionisnotsupported.Skipping'{self.relative_file_path}'.") +returnFalse + +file_extension=file_extension[1:]#Removetheleadingdot + +iffile_extensionnotinself.supported_file_types: +print_warning(f"Filetype'{file_extension}'isnotsupported.Skipping'{self.relative_file_path}'.") +returnFalse + +#Updateprogressbartoindicatewe'removingtonextstage +pbar.update(1) + +#---STAGE2:Readingcontent--- +update_stage(pbar,"Readingcontent") +try: +withopen(file_abs_path,'r')asfile: +content=file.read() +exceptExceptionase: +logger.error(f"Errorreadingfile{file_path}:{str(e)}") +returnFalse + +modified_lines=[iforiinrange(len(content.splitlines()))] + +#Updateprogressbartoindicatewe'removingtonextstage +pbar.update(1) + +#---STAGE3:Documenting--- +update_stage(pbar,"Documenting") + +response=self.api_client.send_file_for_docstring_generation(self.relative_file_path,content,modified_lines,self.repo_details) + +ifresponseisNone: +returnFalse + +ifresponse==content: +logger.info(f"Nochangesneededfor{file_path}") +returnFalse + +#Updateprogressbartoindicatewe'removingtonextstage +pbar.update(1) + +#---STAGE4:Writingchanges--- +update_stage(pbar,"Writingchanges") + +try: +withopen(file_abs_path,'w')asfile: +file.write(response) +logger.info(f"Updatedfile{file_path}withgenerateddocumentation") + +#Markfinalstageascomplete +pbar.update(1) +returnTrue +exceptExceptionase: +logger.error(f"Errorwritingfile{file_path}:{str(e)}") +returnFalse + +defprint_processing(self,file_path): +"""Printsamessageindicatingthatafileisbeingprocessed.""" +formatted_path=format_file_path(file_path) +print(f"\n{format_highlight(f'Processingfile:{formatted_path}')}") + +defrun(self): + +#Createaprogressbarwithappropriatestages +"""Runsthedocumentationprocesswithaprogressbar. + +Thismethodorchestratesthedocumentationprocessbycreatingaprogressbar, +processingthefile,andhandlingexceptionstoensuretheprogressbar +completesproperly.Itupdatestheprogressbarthroughvariousstagesand +providesfeedbackbasedontheresultofthefileprocessing. +""" +stages=["Validating","Readingcontent","Documenting","Writingchanges","Completed"] +pbar,_=create_stage_progress_bar(stages,f"Startingdocumenting") + +try: +#Printaclearindicationofwhichfileisbeingprocessed +#self.print_processing(self.file_path) + +#Processthefile +result=self.process_file(self.file_path,pbar) + +#Ensureallstagesarecompleted +remaining_steps=len(stages)-pbar.n +pbar.update(remaining_steps) + + +#Displayappropriatemessagebasedonresult +remaining=len(stages)-pbar.n +ifremaining>0: +pbar.update(remaining) +update_stage(pbar,"Complete") +pbar.clear() +pbar.close() + +exceptExceptionase: +remaining=len(stages)-pbar.n +ifremaining>0: +pbar.update(remaining) +update_stage(pbar,"Complete") +pbar.clear() +pbar.close() +print_status('error',e) +sys.exit(1) + +#Ensureprogressbarcompletesevenonerror +ifresult: +print_success(f"\n✓Documentationupdatedfor{self.relative_file_path}") +else: +print_success(f"\n✓Nochangesneededfor{self.relative_file_path}") + + + + + diff --git a/docs/xml/folder__analyzer_8py.xml b/docs/xml/folder__analyzer_8py.xml new file mode 100644 index 0000000..8aab81c --- /dev/null +++ b/docs/xml/folder__analyzer_8py.xml @@ -0,0 +1,67 @@ + + + + folder_analyzer.py + penify_hook::folder_analyzer::FolderAnalyzerGenHook + penify_hook + penify_hook::folder_analyzer + + + + + +importos +fromgitimportRepo + +frompenify_hook.base_analyzerimportBaseAnalyzer +from.api_clientimportAPIClient +from.file_analyzerimportFileAnalyzerGenHook +fromtqdmimporttqdm + +classFolderAnalyzerGenHook(BaseAnalyzer): +def__init__(self,dir_path:str,api_client:APIClient): +self.dir_path=dir_path +super().__init__(dir_path,api_client) + +deflist_all_files_in_dir(self,dir_path:str): + +"""Listallnon-hiddenfilesinadirectoryanditssubdirectories. + +Thisfunctionrecursivelytraversesthespecifieddirectoryandits +subdirectories,collectingpathsofallnon-hiddenfiles.Itfiltersouthidden +directoriesandfiles(thosestartingwithadot)toensureonlyvisiblefiles +arereturned. + +Args: +dir_path(str):Thepathtothedirectorywhosefilesandsubdirectoryfilesneedtobelisted. +""" +files=[] +fordirpath,dirnames,filenamesinos.walk(dir_path): +dirnames[:]=[dfordindirnamesifnotd.startswith(".")] +forfilenameinfilenames: +#Constructthefullfilepath +full_path=os.path.join(dirpath,filename) +files.append(full_path) +returnfiles + +defrun(self): +"""Runthepost-commithookandprocessfileswithaprogressbar.""" +try: +file_list=self.list_all_files_in_dir(self.dir_path) +total_files=len(file_list) +print(f"Processing{total_files}filesinfolder[{self.dir_path}]") + +withtqdm(total=total_files,desc="Processingfiles",unit="file",ncols=80,ascii=True)aspbar: +forfile_pathinfile_list: +try: +analyzer=FileAnalyzerGenHook(file_path,self.api_client) +analyzer.run() +exceptExceptionasfile_error: +print(f"Errorprocessingfile[{file_path}]:{file_error}") +pbar.update(1)#Evenifthereisanerror,movetheprogressbarforward +exceptExceptionase: +print(f"File[{self.dir_path}]wasnotprocessedduetoerror:{e}") + + + + diff --git a/docs/xml/git__analyzer_8py.xml b/docs/xml/git__analyzer_8py.xml new file mode 100644 index 0000000..fe2453e --- /dev/null +++ b/docs/xml/git__analyzer_8py.xml @@ -0,0 +1,193 @@ + + + + git_analyzer.py + penify_hook::git_analyzer::GitDocGenHook + penify_hook + penify_hook::git_analyzer + + + + + +importos +importre +fromgitimportRepo +fromtqdmimporttqdm + +frompenify_hook.base_analyzerimportBaseAnalyzer +frompenify_hook.utilsimportget_repo_details,recursive_search_git_folder +from.api_clientimportAPIClient +importlogging +from.ui_utilsimport( +print_info,print_success,print_warning,print_error, +print_processing,print_status,create_progress_bar, +format_file_path +) + +#Setuplogger +logger=logging.getLogger(__name__) + +classGitDocGenHook(BaseAnalyzer): +def__init__(self,repo_path:str,api_client:APIClient): +super().__init__(repo_path,api_client) + +defget_modified_files_in_last_commit(self): +"""Getthelistoffilesmodifiedinthelastcommit.""" +last_commit=self.repo.head.commit +modified_files=[] +fordiffinlast_commit.diff('HEAD~1'): +ifdiff.a_pathnotinmodified_files: +modified_files.append(diff.a_path) +returnmodified_files + +defget_modified_lines(self,diff_text): +"""Extractmodifiedlinenumbersfromadifftext. + +Thisfunctionprocessesadifftexttoidentifyandextractthelinenumbers +thathavebeenmodified.Itdistinguishesbetweenaddedanddeletedlinesand +keepstrackofthecurrentlinenumberasitparsesthroughthediff.The +functionhandleshunkheadersandensuresthatanydeletionsattheendofthe +filearealsocaptured. + +Args: +diff_text(str):Astringcontainingthedifftexttobeprocessed. +""" +modified_lines=[] +current_line=0 +deletion_start=None + +forlineindiff_text.splitlines(): +ifline.startswith('@@'): +#Parsethehunkheader +_,old,new,_=line.split('',3) +current_line=int(new.split(',')[0].strip('+')) +deletion_start=None +elifline.startswith('-'): +#Thisisadeletedline +ifdeletion_startisNone: +deletion_start=current_line +elifline.startswith('+'): +#Thisisanaddedline +modified_lines.append(current_line) +current_line+=1 +ifdeletion_startisnotNone: +modified_lines.append(deletion_start) +deletion_start=None +else: +#Thisisanunchangedline +current_line+=1 +ifdeletion_startisnotNone: +modified_lines.append(deletion_start) +deletion_start=None + +#Handlecasewheredeletionisattheendofthefile +ifdeletion_startisnotNone: +modified_lines.append(deletion_start) + +returnsorted(set(modified_lines))#Removeduplicatesandsort + +defprocess_file(self,file_path): +"""Processesafilebycheckingitstype,readingitscontent,andsendingitto +anAPI. + +Thismethodconstructstheabsolutepathofthespecifiedfileandverifiesif +thefilehasavalidextension.Ifthefiletypeissupported,itreadsthe +contentofthefileandretrievesthedifferencesfromthelastcommitinthe +repository.Ifchangesaredetected,itsendsthefilecontentalongwiththe +modifiedlinestoanAPIforfurtherprocessing.IftheAPIresponseindicates +nochanges,theoriginalfilewillnotbeoverwritten. + +Args: +file_path(str):Therelativepathtothefiletobeprocessed. +""" +file_abs_path=os.path.join(self.repo_path,file_path) +file_extension=os.path.splitext(file_path)[1].lower() + +ifnotfile_extension: +logger.info(f"File{file_path}hasnoextension.Skipping.") +returnFalse + +file_extension=file_extension[1:]#Removetheleadingdot + +iffile_extensionnotinself.supported_file_types: +logger.info(f"Filetype{file_extension}isnotsupported.Skipping{file_path}.") +returnFalse + +withopen(file_abs_path,'r')asfile: +content=file.read() + +#Getthediffofthefileinthelastcommit +last_commit=self.repo.head.commit +prev_commit=last_commit.parents[0]iflast_commit.parentselselast_commit + +#Usegitcommandtogetthediff +diff_text=self.repo.git.diff(prev_commit.hexsha,last_commit.hexsha,'--',file_path) + +ifnotdiff_text: +logger.info(f"Nochangesdetectedfor{file_path}") +returnFalse + +modified_lines=self.get_modified_lines(diff_text) +#SenddatatoAPI +response=self.api_client.send_file_for_docstring_generation(file_path,content,modified_lines,self.repo_details) +ifresponseisNone: +returnFalse + +ifresponse==content: +logger.info(f"Nochangesdetectedfor{file_path}") +returnFalse +#Iftheresponseissuccessful,replacethefilecontent +withopen(file_abs_path,'w')asfile: +file.write(response) +logger.info(f"Updatedfile{file_path}withgenerateddocumentation") +returnTrue + +defrun(self): +"""Runthepost-commithook. + +Thismethodretrievesthelistofmodifiedfilesfromthelastcommitand +processeseachfile.Itstagesanyfilesthathavebeenmodifiedduring +processingandcreatesanauto-commitifchangesweremade.Aprogressbaris +displayedtoindicatetheprocessingstatusofeachfile.Themethodhandles +anyexceptionsthatoccurduringfileprocessing,printinganerrormessagefor +eachfilethatfailstoprocess.Ifanymodificationsaremadetothefiles,an +auto-commitiscreatedtosavethosechanges. +""" +logger.info("Startingdoc_gen_hookprocessing") +print_info("Startingdoc_gen_hookprocessing") + +modified_files=self.get_modified_files_in_last_commit() +changes_made=False +total_files=len(modified_files) + +withcreate_progress_bar(total_files,"Processingfiles","file")aspbar: +forfileinmodified_files: +print_processing(file) +logging.info(f"Processingfile:{file}") +try: +ifself.process_file(file): +#Stagethemodifiedfile +self.repo.git.add(file) +changes_made=True +print_status('success',"Documentationupdated") +else: +print_status('warning',"Nochangesneeded") +exceptExceptionasfile_error: +error_msg=f"Errorprocessingfile[{file}]:{file_error}" +logger.error(error_msg) +print_status('error',error_msg) +pbar.update(1)#Updatetheprogressbar + +#Ifanyfilewasmodified,createanewcommit +ifchanges_made: +#self.repo.git.commit('-m','Auto-commit:Updatedfilesafterdoc_gen_hookprocessing.') +logger.info("Auto-commitcreatedwithchanges.") +print_success("\n✓Auto-commitcreatedwithchanges") +else: +logger.info("doc_gen_hookcomplete.Nochangesmade.") +print_info("\n✓doc_gen_hookcomplete.Nochangesmade.") + + + + diff --git a/docs/xml/hook__commands_8py.xml b/docs/xml/hook__commands_8py.xml new file mode 100644 index 0000000..b48451a --- /dev/null +++ b/docs/xml/hook__commands_8py.xml @@ -0,0 +1,52 @@ + + + + hook_commands.py + penify_hook + penify_hook::commands + penify_hook::commands::hook_commands + + + + + +importsys +frompathlibimportPath + +HOOK_FILENAME="post-commit" +HOOK_TEMPLATE="""#!/bin/sh +#Thisisapost-commithookgeneratedbypenify. +#Automaticallygeneratesdocumentationforchangedfilesaftereachcommit. + +penifydocgen-gf{git_folder_path}-t{token} +""" + +definstall_git_hook(location,token): +"""Installapost-commitGithookthatgeneratesdocumentationforchangedfiles.""" +hooks_dir=Path(location)/".git/hooks" +hook_path=hooks_dir/HOOK_FILENAME + +ifnothooks_dir.exists(): +print(f"Error:Thehooksdirectory{hooks_dir}doesnotexist.") +sys.exit(1) + +hook_content=HOOK_TEMPLATE.format(token=token,git_folder_path=location) +hook_path.write_text(hook_content) +hook_path.chmod(0o755)#Makethehookscriptexecutable + +print(f"Post-commithookinstalledin{hook_path}") +print(f"Documentationwillnowbeautomaticallygeneratedaftereachcommit.") + +defuninstall_git_hook(location): +"""Uninstallsthepost-commithookfromthespecifiedlocation.""" +hook_path=Path(location)/".git/hooks"/HOOK_FILENAME + +ifhook_path.exists(): +hook_path.unlink() +print(f"Post-commithookuninstalledfrom{hook_path}") +else: +print(f"Nopost-commithookfoundin{hook_path}") + + + + diff --git a/docs/xml/index.xml b/docs/xml/index.xml new file mode 100644 index 0000000..01b2ebc --- /dev/null +++ b/docs/xml/index.xml @@ -0,0 +1,351 @@ + + + penify_hook::api_client::APIClient + api_url + AUTH_TOKEN + BEARER_TOKEN + __init__ + send_file_for_docstring_generation + generate_commit_summary + get_supported_file_types + generate_commit_summary_with_llm + get_api_key + + penify_hook::base_analyzer::BaseAnalyzer + folder_path + repo_path + repo + repo_details + relative_file_path + api_client + supported_file_types + __init__ + + penify_hook::commit_analyzer::CommitDocGenHook + llm_client + __init__ + get_summary + run + process_jira_integration + _amend_commit + + Exception + + penify_hook::file_analyzer::FileAnalyzerGenHook + file_path + __init__ + process_file + print_processing + run + + penify_hook::folder_analyzer::FolderAnalyzerGenHook + dir_path + __init__ + list_all_files_in_dir + run + + penify_hook::git_analyzer::GitDocGenHook + __init__ + get_modified_files_in_last_commit + get_modified_lines + process_file + run + + penify_hook::utils::GitRepoNotFoundError + + penify_hook::jira_client::JiraClient + jira_url + jira_user + jira_api_token + jira_client + __init__ + is_connected + extract_issue_keys_from_branch + extract_issue_keys + get_issue_details + add_comment + update_issue_status + format_commit_message_with_jira_info + get_detailed_issue_context + get_commit_context_from_issues + enhance_commit_message + + penify_hook::llm_client::LLMClient + model + _litellm + __init__ + litellm + generate_commit_summary + + tests::test_commit_commands::TestCommitCommands + mock_api_client + mock_llm_client + mock_jira_client + mock_commit_doc_gen + mock_git_folder_search + mock_print_functions + test_commit_code_with_llm_client + test_commit_code_with_jira_client + test_commit_code_with_jira_connection_failure + test_commit_code_error_handling + test_setup_commit_parser + test_handle_commit + + tests::test_config_commands::TestConfigCommands + test_get_penify_config_existing_dir + test_get_penify_config_new_dir + test_get_llm_config_exists + test_get_llm_config_empty + test_get_llm_config_invalid_json + test_get_jira_config_exists + test_save_llm_config_success + test_save_llm_config_failure + test_save_jira_config_success + test_get_token_from_env + test_get_token_from_config + test_get_token_not_found + + tests::test_web_config::TestWebConfig + test_config_llm_web_server_setup + test_config_jira_web_server_setup + + penify_hook + + penify_hook::api_client + + penify_hook::base_analyzer + + penify_hook::commands + + penify_hook::commands::auth_commands + save_credentials + login + + penify_hook::commands::commit_commands + commit_code + setup_commit_parser + handle_commit + + penify_hook::commands::config_commands + DOTENV_AVAILABLE + path + load_env_files + get_penify_config + get_env_var_or_default + save_llm_config + save_jira_config + get_llm_config + get_jira_config + config_llm_web + config_jira_web + get_token + + penify_hook::commands::doc_commands + docgen_description + generate_doc + setup_docgen_parser + handle_docgen + + penify_hook::commands::hook_commands + HOOK_FILENAME + HOOK_TEMPLATE + install_git_hook + uninstall_git_hook + + penify_hook::commit_analyzer + + penify_hook::config_command + setup_config_parser + handle_config + + penify_hook::constants + API_URL + DASHBOARD_URL + + penify_hook::file_analyzer + logger + + penify_hook::folder_analyzer + + penify_hook::git_analyzer + logger + + penify_hook::jira_client + JIRA_AVAILABLE + + penify_hook::llm_client + + penify_hook::login_command + setup_login_parser + handle_login + + penify_hook::main + main + + penify_hook::ui_utils + autoreset + INFO_COLOR + SUCCESS_COLOR + WARNING_COLOR + ERROR_COLOR + HIGHLIGHT_COLOR + NEUTRAL_COLOR + SUCCESS_SYMBOL + WARNING_SYMBOL + ERROR_SYMBOL + PROCESSING_SYMBOL + format_info + format_success + format_warning + format_error + format_highlight + format_file_path + print_info + print_success + print_warning + print_error + print_processing + print_status + create_progress_bar + create_stage_progress_bar + update_stage + + penify_hook::utils + logger + get_repo_details + recursive_search_git_folder + find_git_parent + + setup + name + version + packages + install_requires + entry_points + author + author_email + description + long_description + long_description_content_type + url + classifiers + python_requires + + std + + tests + + tests::conftest + + tests::test_commit_commands + + tests::test_config_commands + + tests::test_doc_commands + test_generate_doc_no_location + test_generate_doc_file_location + test_generate_doc_folder_location + test_generate_doc_error_handling + test_setup_docgen_parser + test_handle_docgen_install_hook + test_handle_docgen_uninstall_hook + test_handle_docgen_generate + test_handle_docgen_no_token + test_generate_doc_with_file_exception + test_generate_doc_with_folder_exception + + tests::test_web_config + + commit-commands.md + + config-commands.md + + detailed-usage.md + + doc_commands.md + + example-workflows.md + + penify-cli-documentation.md + + api_client.py + + base_analyzer.py + + __init__.py + + __init__.py + + __init__.py + + auth_commands.py + + commit_commands.py + + config_commands.py + + doc_commands.py + + hook_commands.py + + commit_analyzer.py + + config_command.py + + constants.py + + file_analyzer.py + + folder_analyzer.py + + git_analyzer.py + + jira_client.py + + llm_client.py + + login_command.py + + main.py + + ui_utils.py + + utils.py + + README.md + + setup.py + + conftest.py + + test_commit_commands.py + + test_config_commands.py + + test_doc_commands.py + + test_web_config.py + + md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_commit_commands + + md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_config_commands + + md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_detailed_usage + + md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_doc_commands + + md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_example_workflows + + md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_README + + /tmp/github_reposRepoArchDocGenContext/Penify-dev/penify-cli/penify_hook/commands + + /tmp/github_reposRepoArchDocGenContext/Penify-dev/penify-cli/docs + + /tmp/github_reposRepoArchDocGenContext/Penify-dev/penify-cli + + /tmp/github_reposRepoArchDocGenContext/Penify-dev/penify-cli/penify_hook + + /tmp/github_reposRepoArchDocGenContext/Penify-dev/penify-cli/tests + + diff --git a/docs/xml/index.xsd b/docs/xml/index.xsd new file mode 100644 index 0000000..cfb7041 --- /dev/null +++ b/docs/xml/index.xsd @@ -0,0 +1,71 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/xml/jira__client_8py.xml b/docs/xml/jira__client_8py.xml new file mode 100644 index 0000000..7567141 --- /dev/null +++ b/docs/xml/jira__client_8py.xml @@ -0,0 +1,438 @@ + + + + jira_client.py + penify_hook::jira_client::JiraClient + penify_hook + penify_hook::jira_client + + + + + +importre +importlogging +fromtypingimportOptional,Dict,List,Any + +frompenify_hook.ui_utilsimportprint_info,print_success +try: +fromjiraimportJIRA +JIRA_AVAILABLE=True +exceptImportError: +JIRA_AVAILABLE=False + +classJiraClient: +""" +ClientforinteractingwithJIRAAPI +""" + +def__init__(self,jira_url:str=None,jira_user:str=None,jira_api_token:str=None): +""" +InitializetheJIRAclient. + +Args: +jira_url:BaseURLforJIRAinstance(e.g.,"https://your-domain.atlassian.net") +jira_user:JIRAusernameoremail +jira_api_token:JIRAAPItoken +""" +self.jira_url=jira_url +self.jira_user=jira_user +self.jira_api_token=jira_api_token +self.jira_client=None + +ifnotJIRA_AVAILABLE: +logging.warning("JIRApackagenotavailable.JIRAintegrationwillnotwork.") +return + +ifjira_urlandjira_userandjira_api_token: +try: +self.jira_client=JIRA( +server=jira_url, +basic_auth=(jira_user,jira_api_token) +) +logging.info("JIRAclientinitializedsuccessfully") +exceptExceptionase: +logging.error(f"FailedtoinitializeJIRAclient:{e}") +self.jira_client=None + +defis_connected(self)->bool: +"""CheckiftheJIRAclientisconnected.""" +returnself.jira_clientisnotNone + +defextract_issue_keys_from_branch(self,branch_name:str)->List[str]: +#CommonJIRAissuekeypattern:PROJECT-123 +"""ExtractsuniqueJIRAissuekeysfromabranchname.""" +pattern=r'[A-Z][A-Z0-9_]+-[0-9]+' +matches=re.findall(pattern,branch_name) +ifmatches: +print_info(f"FetchingrelevantJIRAissues") +returnlist(set(matches))#Removeduplicates + +defextract_issue_keys(self,text:str)->List[str]: +#CommonJIRAissuekeypattern:PROJECT-123 +"""ExtractuniqueJIRAissuekeysfromthegiventext.""" +pattern=r'[A-Z][A-Z0-9_]+-[0-9]+' +matches=re.findall(pattern,text) +returnlist(set(matches))#Removeduplicates + +defget_issue_details(self,issue_key:str)->Optional[Dict[str,Any]]: +"""RetrievedetailsofaJIRAissuebasedonitskey. + +ThisfunctionfetchesdetailedinformationaboutaspecifiedJIRAissueusing +theprovidedissuekey.ItfirstchecksiftheJIRAclientisconnected;if +not,itlogsawarningandreturns`None`.Ifconnected,itattemptsto +retrievetheissuefromtheJIRAserver.Onsuccess,itconstructsandreturns +adictionarycontainingvariousdetailssuchastheissue'skey,summary, +status,description,assignee,reporter,type,priority,andURL.Errorsduring +thisprocessarelogged,and`None`isreturned. + +Args: +issue_key(str):TheJIRAissuekey(e.g.,"PROJECT-123"). +""" +ifnotself.is_connected(): +logging.warning("JIRAclientnotconnected") +returnNone + +try: +issue=self.jira_client.issue(issue_key) +return{ +'key':issue.key, +'summary':issue.fields.summary, +'status':issue.fields.status.name, +'description':issue.fields.description, +'assignee':issue.fields.assignee.displayNameifissue.fields.assigneeelseNone, +'reporter':issue.fields.reporter.displayNameifissue.fields.reporterelseNone, +'type':issue.fields.issuetype.name, +'priority':issue.fields.priority.nameifhasattr(issue.fields,'priority')andissue.fields.priorityelseNone, +'url':f"{self.jira_url}/browse/{issue.key}" +} +exceptExceptionase: +logging.error(f"Errorfetchingissue{issue_key}:{e}") +returnNone + +defadd_comment(self,issue_key:str,comment:str)->bool: +"""AddsacommenttoaJIRAissue.""" +ifnotself.is_connected(): +logging.warning("JIRAclientnotconnected") +returnFalse + +try: +self.jira_client.add_comment(issue_key,comment) +logging.info(f"Commentaddedto{issue_key}") +returnTrue +exceptExceptionase: +logging.error(f"Erroraddingcommentto{issue_key}:{e}") +returnFalse + +defupdate_issue_status(self,issue_key:str,transition_name:str)->bool: +"""UpdatethestatusofaJIRAissue. + +ThismethodchecksiftheJIRAclientisconnected,retrievesavailable +transitionsforthegivenissue,findsthetransitionIDbyname,andupdates +theissue'sstatusaccordingly.Ifanystepfailsorthespecifiedtransition +isnotfound,appropriatelogsaregenerated,andFalseisreturned. + +Args: +issue_key(str):ThekeyoftheJIRAissuetobeupdated. +transition_name(str):Thenameofthedesiredtransition. + +Returns: +bool:Trueifthestatuswassuccessfullyupdated,Falseotherwise. +""" +ifnotself.is_connected(): +logging.warning("JIRAclientnotconnected") +returnFalse + +try: +#Getavailabletransitions +transitions=self.jira_client.transitions(issue_key) + +#FindthetransitionIDbasedonname +transition_id=None +fortintransitions: +ift['name'].lower()==transition_name.lower(): +transition_id=t['id'] +break + +iftransition_id: +self.jira_client.transition_issue(issue_key,transition_id) +logging.info(f"Updated{issue_key}statusto{transition_name}") +returnTrue +else: +logging.warning(f"Transition'{transition_name}'notfoundfor{issue_key}") +returnFalse + +exceptExceptionase: +logging.error(f"Errorupdatingstatusfor{issue_key}:{e}") +returnFalse + +defformat_commit_message_with_jira_info(self,commit_title:str,commit_description:str,issue_keys:List[str]=None)->tuple: +#Ifnoissuekeysprovided,extractthemfromtitleanddescription +"""FormatcommitmessagewithJIRAissueinformation. + +Thisfunctionupdatestheprovidedcommittitleanddescriptionby +incorporatingJIRAissuekeys.Ifnoissuekeysaresupplied,itextractsthem +fromthecommittitleanddescription.Itthenformatsthecommittitleto +includethefirstissuekeyifnotalreadypresentandappendsdetailed +informationabouteachissuetothecommitdescription. + +Args: +commit_title(str):Theoriginalcommittitle. +commit_description(str):Theoriginalcommitdescription. +issue_keys(List[str]?):AlistofJIRAissuekeystoincludeinthecommitmessage.Ifnot +provided,issuekeyswillbeextractedfromboththetitleandthedescription. + +Returns: +tuple:AtuplecontainingtheupdatedcommittitleanddescriptionwithJIRA +informationincluded. +""" +ifnotissue_keys: +title_keys=self.extract_issue_keys(commit_title) +desc_keys=self.extract_issue_keys(commit_description) +issue_keys=list(set(title_keys+desc_keys)) + +ifnotissue_keysornotself.is_connected(): +returncommit_title,commit_description + +#Formatthetitletoincludetheissuekeyifnotalreadythere +updated_title=commit_title +ifissue_keysandnotany(keyincommit_titleforkeyinissue_keys): +#Addthefirstissuekeytothetitle +updated_title=f"{issue_keys[0]}:{commit_title}" + +#Addissuedetailstothedescription +updated_description=commit_description + +issue_details_section="\n\n##RelatedJIRAIssues\n\n" +has_issue_details=False + +forissue_keyinissue_keys: +details=self.get_issue_details(issue_key) +ifdetails: +has_issue_details=True +issue_details_section+=( +f"***[{details['key']}]({details['url']})**:{details['summary']}\n" +f"*Status:{details['status']}\n" +f"*Type:{details['type']}\n" +) + +ifhas_issue_details: +updated_description+=issue_details_section + +returnupdated_title,updated_description + +defget_detailed_issue_context(self,issue_key:str)->Dict[str,Any]: +"""RetrievecomprehensivedetailsaboutaJIRAissueincludingcontextforbetter +commitmessages. + +ThisfunctionfetchesdetailedinformationfromaspecifiedJIRAissueand +constructsadictionarycontainingvariouscontextfieldssuchastheissue +summary,description,type,status,priority,comments,URL,andadditional +customfieldslikeacceptancecriteriaandsprintinformation.Ithandles +errorsbyloggingappropriatewarningsorerrors. + +Args: +issue_key(str):TheJIRAissuekey(e.g.,"PROJECT-123"). + +Returns: +Dict[str,Any]:Adictionarycontainingbusinessandtechnicalcontextfromtheissue. +""" +ifnotself.is_connected(): +logging.warning("JIRAclientnotconnected") +return{} + +try: +issue=self.jira_client.issue(issue_key) + +#Getissuehistoryandcommentsforcontext +comments=[] +try: +forcommentinself.jira_client.comments(issue): +comments.append(comment.body) +exceptExceptionase: +logging.warning(f"Couldnotfetchcommentsfor{issue_key}:{e}") + +#Buildacomprehensivecontextobject +context={ +'key':issue.key, +'summary':issue.fields.summary, +'description':issue.fields.descriptionor"", +'type':issue.fields.issuetype.name, +'status':issue.fields.status.name, +'priority':issue.fields.priority.nameifhasattr(issue.fields,'priority')andissue.fields.priorityelse"None", +'comments':comments[:3],#Limittolatest3comments +'url':f"{self.jira_url}/browse/{issue.key}" +} + +#Addacceptancecriteriaifavailable(commoncustomfields) +#FieldnamesmayvarybyJIRAinstance +acceptance_criteria=None +try: +forfield_namein['customfield_10001','acceptance_criteria','customfield_10207']: +ifhasattr(issue.fields,field_name): +field_value=getattr(issue.fields,field_name) +iffield_value: +acceptance_criteria=field_value +break +exceptException: +pass + +ifacceptance_criteria: +context['acceptance_criteria']=acceptance_criteria + +#Trytoextractsprintinformation +try: +sprint_field=None +forfield_nameindir(issue.fields): +if'sprint'infield_name.lower(): +sprint_field=field_name +break + +ifsprint_field: +sprint_value=getattr(issue.fields,sprint_field) +ifsprint_value: +ifisinstance(sprint_value,list)andlen(sprint_value)>0: +context['sprint']=sprint_value[0] +else: +context['sprint']=str(sprint_value) +exceptExceptionase: +logging.debug(f"Couldnotextractsprintinformation:{e}") + +returncontext + +exceptExceptionase: +logging.error(f"Errorfetchingdetailedinformationfor{issue_key}:{e}") +return{} + +defget_commit_context_from_issues(self,issue_keys:List[str])->Dict[str,Any]: +"""GathercontextualinformationfromJIRAissuestoimprovecommitmessages. + +ThisfunctionprocessesalistofJIRAissuekeys,retrievesdetailedcontext +foreachissue,andaggregatesitintoadictionarythatcanbeusedtoenhance +commitmessages.Itfirstretrievestheprimaryissue(thefirstkeyinthe +list)andthengathersbasicdetailsforanyrelatedissues.Theresulting +contextincludesinformationfromboththeprimaryandrelatedissues,along +withallissuekeys. + +Args: +issue_keys:ListofJIRAissuekeystogatherinformationfrom + +Returns: +Dictcontainingbusinessandtechnicalcontextfromtheissues +""" +ifnotissue_keysornotself.is_connected(): +return{} + +#Gettheprimaryissue(firstinthelist) +primary_issue=self.get_detailed_issue_context(issue_keys[0]) + +#Getbasicinfoforrelatedissues +related_issues=[] +forkeyinissue_keys[1:]:#Skipthefirstoneasit'stheprimary +details=self.get_issue_details(key) +ifdetails: +related_issues.append(details) + +#Buildcontextdictionaryforcommitmessageenhancement +context={ +'primary_issue':primary_issue, +'related_issues':related_issues, +'all_keys':issue_keys +} + +returncontext + +defenhance_commit_message(self,title:str,description:str,issue_keys:List[str])->tuple: +"""EnhanceacommitmessagewithbusinessandtechnicalcontextfromJIRAissues. + +Thisfunctionfirstchecksifthelistofissuekeysisemptyorifthereisno +connection.Ifso,itreturnstheoriginaltitleanddescriptionwithout +modification.ItthenretrievescontextinformationfromthespecifiedJIRA +issues.Iftheprimaryissueismissing,itformatsthecommitmessagewith +basicJIRAinfo.Thefunctionenhancesthecommittitlebyprefixingitwith +theprimaryissuekeyifnotalreadyincluded.Itappendsabusinesscontext +sectiontothedescription,includingdetailslikeissuetype,status, +priority,sprint,acceptancecriteria,andacondensedissuedescription.If +commentsareavailable,theyareaddedastechnicalnotes.Finally,related +issuesarelisted. + +Args: +title(str):Originalcommittitle. +description(str):Originalcommitdescription. +issue_keys(List[str]):ListofJIRAissuekeystoincludeintheenhancedcommitmessage. + +Returns: +tuple:Atuplecontainingtheenhancedcommittitleanddescriptionwithadded +contextfromJIRAissues. +""" +ifnotissue_keysornotself.is_connected(): +returntitle,description + +#Getcontextinformationfromissues +context=self.get_commit_context_from_issues(issue_keys) +ifnotcontextornotcontext.get('primary_issue'): +returnself.format_commit_message_with_jira_info(title,description,issue_keys) + +#Getprimaryissue +primary=context['primary_issue'] + +#Enhancetitlewithprimaryissuekeyandsummaryifnotalreadyincluded +enhanced_title=title +ifnotany(keyintitleforkeyinissue_keys): +key=primary['key'] +#Keeporiginaltitle,butprefixwithissuekey +enhanced_title=f"{key}:{title}" + +#Enhancedescriptionwithbusinessandtechnicalcontext +enhanced_description=description + +#Addbusinesscontextsection +business_section="\n\n##BusinessContext\n\n" +business_section+=f"**Issue**:[{primary['key']}]({primary['url']})-{primary['summary']}\n" +business_section+=f"**Type**:{primary['type']}\n" +business_section+=f"**Status**:{primary['status']}\n" +business_section+=f"**Priority**:{primary['priority']}\n" + +if'sprint'inprimary: +business_section+=f"**Sprint**:{primary['sprint']}\n" + +if'acceptance_criteria'inprimary: +business_section+=f"\n**AcceptanceCriteria**:\n{primary['acceptance_criteria']}\n" + +ifprimary.get('description'): +#Includeacondensedversionofthedescriptionifit'snottoolong +desc=primary['description'] +iflen(desc)>300: +desc=desc[:300]+"..." +business_section+=f"\n**IssueDescription**:\n{desc}\n" + +#Addtechnicalcontextfromcommentsifavailable +ifprimary.get('comments'): +tech_section="\n##TechnicalNotes\n\n" + +#Extracttechnicaldetailsfromcomments(oftendevsdiscussimplementationdetailshere) +forcommentinprimary['comments']: +iflen(comment)>200:#Onlyincludeshortertechnicalnotes +comment=comment[:200]+"..." +tech_section+=f"-{comment}\n\n" + +iflen(tech_section)>50:#Onlyaddifthere'ssubstantialcontent +enhanced_description+=business_section+tech_section +else: +enhanced_description+=business_section +else: +enhanced_description+=business_section + +#Addrelatedissuessection +ifcontext.get('related_issues'): +related_section="\n##RelatedIssues\n\n" +forissueincontext['related_issues']: +related_section+=f"-[{issue['key']}]({issue['url']}):{issue['summary']}({issue['status']})\n" + +enhanced_description+=related_section + +returnenhanced_title,enhanced_description + + + + diff --git a/docs/xml/llm__client_8py.xml b/docs/xml/llm__client_8py.xml new file mode 100644 index 0000000..d8d190e --- /dev/null +++ b/docs/xml/llm__client_8py.xml @@ -0,0 +1,189 @@ + + + + llm_client.py + penify_hook::llm_client::LLMClient + penify_hook + penify_hook::llm_client + + + + + +importjson +importos +importsys +fromtypingimportDict,Optional,List,Any,Union +importtime + +#Removedeagerlitellmimportandtimingcode +#Willlazyloadlitellmonlywhenneeded + +classLLMClient: +""" +ClientforinteractingwithLLMmodelsusingLiteLLM. +""" + +def__init__(self,model:str=None,api_base:str=None,api_key:str=None): +""" +InitializetheLLMclient. + +Args: +model:LLMmodeltouse(e.g.,"gpt-4","ollama/llama2",etc.) +api_base:BaseURLforAPIrequests(e.g.,"http://localhost:11434"forOllama) +api_key:APIkeyfortheLLMservice +""" +#Configurelitellmifparametersareprovided +self.model=model +ifapi_base: +os.environ["OPENAI_API_BASE"]=api_base +ifapi_key: +os.environ["OPENAI_API_KEY"]=api_key +self._litellm=None + +@property +deflitellm(self): +"""Returnsthelitellmmodule,loadingitifnecessary.""" +ifself._litellmisNone: +importlitellm +self._litellm=litellm +returnself._litellm + +defgenerate_commit_summary(self,diff:str,message:str,generate_description:bool,repo_details:Dict,jira_context:Dict=None)->Dict: +"""GenerateaconciseanddescriptivecommitsummarybasedonGitdiff,user +instructions,repositorydetails,andoptionalJIRAcontext. + +ThisfunctionconstructsapromptforanLLMtoproduceacommittitleand,if +requested,adetaileddescription.ThesummaryadherestoSemanticCommit +Messagesguidelines.IfJIRAcontextisprovided,itenrichesthepromptwith +relevantissueinformation. + +Args: +diff(str):Gitdiffofchanges. +message(str):User-providedcommitmessageorinstructions. +generate_description(bool):Flagindicatingwhethertoincludeadetaileddescriptioninthesummary. +repo_details(Dict):Detailsabouttherepository. +jira_context(Dict?):OptionalJIRAissuecontexttoenhancethesummary. + +Returns: +Dict:Adictionarycontainingthetitleanddescriptionforthecommit.If +`generate_description`isFalse,the'description'keymaybeabsent. + +Raises: +ValueError:IftheLLMmodelisnotconfigured. +""" +ifnotself.model: +raiseValueError("LLMmodelnotconfigured.PleaseprovideamodelwheninitializingLLMClient.") + +#Limitdiffsizetoavoidtokenlimits +max_diff_chars=10000 +iflen(diff)>max_diff_chars: +diff=diff[:max_diff_chars]+f"\n...(difftruncated,total{len(diff)}characters)" + +#CreatepromptfortheLLM +prompt=f""" +BasedontheGitdiffbelow,generateaconciseanddescriptivecommitsummary. + +Userinstructions:{message} +""" + +#AddJIRAcontextifavailable +ifjira_contextandjira_context.get('primary_issue'): +primary=jira_context['primary_issue'] +prompt+=f""" + +JIRAISSUEINFORMATION: +IssueKey:{primary['key']} +Summary:{primary['summary']} +Type:{primary['type']} +Status:{primary['status']} +""" + +if'description'inprimaryandprimary['description']: +#Includeacondensedversionofthedescription +description=primary['description'] +iflen(description)>500: +description=description[:500]+"..." +prompt+=f"Description:{description}\n" + +if'acceptance_criteria'inprimary: +prompt+=f"AcceptanceCriteria:{primary['acceptance_criteria']}\n" + +prompt+=""" + +PleasemakesureyourcommitmessageaddressesthebusinessrequirementsintheJIRAissue +whileaccuratelydescribingthetechnicalchangesinthediff. +""" + +prompt+=f""" + +Gitdiff: +``` +{diff} +``` + +Pleaseprovide: +1.Ashort,focusedcommittitle(50-72characters)inaSemanticCommitMessagesformat.Format:<type>(<scope>):<subject> +{'2.Adetaileddescriptionthatexplainswhatwaschanged,whyitwaschangedinbothbusinessandtechnicalaspects,andanyimportantcontext'ifgenerate_descriptionelse''} + +ListofSemanticCommitMessagetypesthatyoucanuse: +feat:(newfeaturefortheuser,notanewfeatureforbuildscript) +fix:(bugfixfortheuser,notafixtoabuildscript) +docs:(changestothedocumentation) +style:(formatting,missingsemicolons,etc;noproductioncodechange) +refactor:(refactoringproductioncode,eg.renamingavariable) +test:(addingmissingtests,refactoringtests;noproductioncodechange) +chore:(updatinggrunttasksetc;noproductioncodechange) + +FormatyourresponseasvalidJSONwith'title'{"and'description'"ifgenerate_descriptionelse''}keys. +""" + +try: +#CalltheLLMusinglitellm-nowusingthelazy-loadedproperty +response=self.litellm.completion( +model=self.model, +messages=[{"role":"user","content":prompt}], +temperature=0.2, +max_tokens=800#Increasedtokenlimittoaccommodatedetaileddescriptions +) +content=response.choices[0].message.content + +#ExtractJSONfromtheresponse +try: +#TrytoparsetheentirecontentasJSON +result=json.loads(content) +ifnotisinstance(result,dict)or'title'notinresultor'description'notinresult: +raiseValueError("InvalidJSONstructure") + +exceptjson.JSONDecodeError: +#Ifthatfails,trytoextractJSONfromthecontent +importre +json_match=re.search(r'```json\s*(.*?)\s*```',content,re.DOTALL) +ifjson_match: +result=json.loads(json_match.group(1)) +else: +#Lastresort:extracttitleanddescriptiondirectly +lines=content.split('\n') +title=next((lineforlineinlinesifline.strip()),"Generatedcommit").strip() +description="\n".join(lineforlineinlines[1:]ifline.strip()) +result={ +"title":title, +"description":description +} + +ifnotgenerate_descriptionand'description'inresult: +#Ifdescriptionismissinganduserrequestedit,addaplaceholder +delresult['description'] +returnresult + +exceptExceptionase: +sys.exit(f"Errorgeneratingcommitsummary:{e}") +#FallbacktoabasicsummaryifLLMfails +print(f"ErrorgeneratingcommitsummarywithLLM:{e}") +return{ +"title":"Updatecode", +} + + + + diff --git a/docs/xml/login__command_8py.xml b/docs/xml/login__command_8py.xml new file mode 100644 index 0000000..d8d68af --- /dev/null +++ b/docs/xml/login__command_8py.xml @@ -0,0 +1,30 @@ + + + + login_command.py + penify_hook + penify_hook::login_command + + + + + +defsetup_login_parser(parser): +"""Setupcommand-lineargumentsforlogin.""" +parser.add_argument("--token",help="SpecifyAPItokendirectly") +#Addallothernecessaryargumentsforlogincommand + +defhandle_login(args): + +"""Initiatesauserloginprocessusingpredefinedconstantsandthe`login` +function.""" +frompenify_hook.constantsimportAPI_URL,DASHBOARD_URL +frompenify_hook.commands.auth_commandsimportlogin + + +#Onlyimportdependenciesneededforloginfunctionalityhere +returnlogin(API_URL,DASHBOARD_URL) + + + + diff --git a/docs/xml/main_8py.xml b/docs/xml/main_8py.xml new file mode 100644 index 0000000..37d807e --- /dev/null +++ b/docs/xml/main_8py.xml @@ -0,0 +1,101 @@ + + + + main.py + penify_hook + penify_hook::main + + + + + +importargparse +importsys +importtime + + +defmain(): + +"""Mainfunctiontohandlecommand-lineinterface(CLI)interactionswithPenify +services. + +Thistoolprovidesacommand-lineinterfaceforgeneratingsmartcommit +messages,configuringlocal-LLMandJIRA,andgeneratingcodedocumentation.It +supportsbasiccommandsthatdonotrequireloginandadvancedcommandsthat +requireuserauthentication.The`--version`flagcanbeusedtodisplaythe +versioninformation. +""" +parser=argparse.ArgumentParser( +description="""PenifyCLItoolfor: +1.AIcommitmessagegenerationwithJIRAintegrationtoenhancecommitmessages. +2.GeneratingCodeDocumentation,itrequiresSignUptoPenify +3.Formoreinformation,visithttps://penify.wiki/dpc1""", +formatter_class=argparse.RawDescriptionHelpFormatter +) + +#Addversionflag +parser.add_argument('--version','-v',action='store_true',help='Showversioninformation') + +subparsers=parser.add_subparsers(title="options",dest="subcommands") + +#Groupcommandslogically +basic_title="BasicCommands(Nologinrequired)" +advanced_title="AdvancedCommands(Loginrequired)" + +#Creategroupedsubparsers(visuallyseparatedinhelpoutput) +parser.add_argument_group(basic_title) +parser.add_argument_group(advanced_title) + +#Setupsubparserswithproperimportsupfront +commit_parser=subparsers.add_parser("commit",help="Generatesmartcommitmessagesusinglocal-LLM(nologinrequired).") +from.commands.commit_commandsimportsetup_commit_parser +setup_commit_parser(commit_parser) + +config_parser=subparsers.add_parser("config",help="Configurelocal-LLMandJIRA.") +from.config_commandimportsetup_config_parser +setup_config_parser(config_parser) + +login_parser=subparsers.add_parser("login",help="LogintoPenifytouseadvancedfeatureslike'docgen'generation.") +from.login_commandimportsetup_login_parser +setup_login_parser(login_parser) + +docgen_parser=subparsers.add_parser("docgen",help="[REQUIRESLOGIN]GeneratecodedocumentationfortheGitdiff,fileorfolder.") +from.commands.doc_commandsimportsetup_docgen_parser +setup_docgen_parser(docgen_parser) + +#Parseargswithoutvalidationfirsttocheckforsimpleflagslike--version +if'--version'insys.argvor'-v'insys.argv: +fromimportlib.metadataimportversion +try: +print(f"penifyversion{version('penify')}") +except: +print("penifyversion0.2.2") +return0 + +#Parsetheargumentstodeterminewhichcommandwasrequested +args=parser.parse_args() +#Handlethecommands +ifargs.subcommands=="commit": +frompenify_hook.ui_utilsimportprint_info +print_info("Pleasewaitwhilewegeneratethecommitmessage...") +from.commands.commit_commandsimporthandle_commit +returnhandle_commit(args) +elifargs.subcommands=="config": +from.config_commandimporthandle_config +returnhandle_config(args) +elifargs.subcommands=="login": +from.login_commandimporthandle_login +returnhandle_login(args) +elifargs.subcommands=="docgen": +from.commands.doc_commandsimporthandle_docgen +returnhandle_docgen(args) +else: +parser.print_help() +return1 + +if__name__=="__main__": +sys.exit(main()) + + + + diff --git a/docs/xml/md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_README.xml b/docs/xml/md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_README.xml new file mode 100644 index 0000000..3f93092 --- /dev/null +++ b/docs/xml/md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_README.xml @@ -0,0 +1,163 @@ + + + + md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_README + Penify CLI Tool + + + +Tests + Coverage + +A CLI tool to generate smart commit messages, code documentation, and more. + +Features + +Automatically generate documentation for your code +Support for multiple programming languages +Git hook integration for automatic documentation on commits +Folder and file analysis + + + + +Installation +Install from PyPI: +pipinstallpenify + + + +Usage +Penify CLI provides several subcommands for different functionalities, organized into basic commands (no login required) and advanced commands (login required). + + +Basic Commands (No login required) + +Commit +Generate smart commit messages using local LLM: +penifycommit[-m"Optionalmessage"][-e][-d] + +Options: +-m, --message: Optional custom commit message +-e, --terminal: Open editor to modify commit message before committing +-d, --description: Generate commit message with both title and description (without this flag, only title is generated) + + + + +Config +Configure local LLM and JIRA settings: +#ConfigureLLMsettings +penifyconfigllm--modelMODEL_NAME[--api-baseAPI_URL][--api-keyAPI_KEY] + +#ConfigureLLMsettingsthroughwebinterface +penifyconfigllm-web + +#ConfigureJIRAsettings +penifyconfigjira--urlJIRA_URL--usernameUSERNAME--api-tokenTOKEN[--verify] + +#ConfigureJIRAsettingsthroughwebinterface +penifyconfigjira-web + + + + +Advanced Commands (Login required) + +Login +To log in and obtain an API token: +penifylogin + +This command will open a browser window for authentication. After successful login, the API key will be saved locally for future use. + + +Documentation Generation +Generate documentation for Git diff, files or folders: +#GeneratedocumentationforlatestGitcommitdiff +penifydocgen + +#Generatedocumentationforspecificfileorfolder +penifydocgen-l/path/to/file/or/folder + +Options: +-l, --location: Path to specific file or folder for documentation generation (defaults to current directory) + + + + +Git Hook Management +Install or uninstall Git post-commit hooks: +#InstallGithook +penifydocgeninstall-hook[-l/path/to/repo] + +#UninstallGithook +penifydocgenuninstall-hook[-l/path/to/repo] + +Options: +-l, --location: Path to the Git repository (defaults to current directory) + + + + + +Authentication +Penify CLI uses an API token for authentication with advanced features. +If no token is available and you try to access an advanced feature, you'll be prompted to log in. + + +Local LLM Configuration +For commit message generation, Penify can use a local LLM. Configure it using: +penifyconfigllm--modelMODEL_NAME--api-baseAPI_URL--api-keyAPI_KEY + +Common configurations: +OpenAI: --model gpt-3.5-turbo --api-base https://api.openai.com/v1 --api-key YOUR_KEY +Anthropic: --model claude-2 --api-base https://api.anthropic.com --api-key YOUR_KEY + + + + +JIRA Integration +Configure JIRA integration to enhance commit messages with issue details: +penifyconfigjira--urlhttps://your-domain.atlassian.net--usernameyour-email@example.com--api-tokenYOUR_API_TOKEN + + + +Development +To set up the development environment: + +Clone the repository: gitclonehttps://github.com/SingularityX-ai/penify-cli.git + +Install the package in editable mode: pipinstall-e. + + + + +Running Tests +pytest + + + + +License +This project is licensed under the MIT License. + + +Author +Suman Saurabh (ss.sumansaurabh92@gmail.com) + + +Contributing +Contributions are welcome! Please feel free to submit a Pull Request. + + +Issues +If you encounter any problems or have suggestions, please file an issue on the GitHub repository. + + +Support +For automated API Documentation, Architecture Documentation, Code Documentation, Pull Request Documentation, or if you need a demo, please join our Discord support channel. + + + + + diff --git a/docs/xml/md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_commit_commands.xml b/docs/xml/md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_commit_commands.xml new file mode 100644 index 0000000..ddb149f --- /dev/null +++ b/docs/xml/md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_commit_commands.xml @@ -0,0 +1,172 @@ + + + + md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_commit_commands + Penify CLI - Commit Commands + + + +The commit command allows you to generate smart, AI-powered commit messages for your Git changes. This document explains all available options and combinations. + +Basic Usage +penifycommit + +By default, this command: +Analyzes your staged Git changes +Generates a concise commit title only +Uses local LLM if configured, or falls back to Penify API + + + + +Command Options + +<tt>-m, --message</tt> +Provide context for the commit message generation: +penifycommit-m"Fixloginflow" + +This hint helps the AI understand your intention and improves the quality of the generated message. + + +<tt>-e, --terminal</tt> +Open an editor to review and edit the generated commit message before committing: +penifycommit-e + +This opens your default Git editor with the generated message for review. + + +<tt>-d, --description</tt> +Generate a detailed commit message with both title and description: +penifycommit-d + +Without this flag, only the commit title is generated. + + + +Option Combinations +You can combine these options for different workflows: + +Generate Title Only with Context +penifycommit-m"UpdateloginUI" + + + +Generate Title and Description with Context +penifycommit-m"UpdateloginUI"-d + + + +Generate and Edit Full Commit Message +penifycommit-d-e + + + +Generate, Edit, and Provide Context +penifycommit-m"Refactorauthentication"-d-e + + + + +LLM and JIRA Integration + +Using Local LLM +If you've configured a local LLM using penify config llm, the commit command will automatically use it for message generation. +Benefits: +Privacy: your code changes don't leave your machine +Speed: no network latency +Works offline + + + + +JIRA Enhancement +If you've configured JIRA integration using penify config jira, the commit command will: + +Detect JIRA issue references in your changes +Fetch issue details from your JIRA instance +Include issue information in the commit message +Format the commit message according to JIRA's smart commit format + + +Example output: PROJ-123:Fixauthenticationbuginloginflow + +-UpdatedOAuthtokenvalidation +-Fixedsessiontimeouthandling +-Addedunittestsforedgecases + +[PROJ-123] + + + + +Configuration Requirements +For the commit command to work: + +You must have configured either: +Local LLM via penify config llm, OR +Logged in via penify login + + +For JIRA enhancement (optional): +Configure JIRA via penify config jira + + + + + + +Examples + +Basic Commit with Default Settings +#Stageyourchanges +gitadd. + +#Generatecommitmessage +penifycommit + +#Commitwiththegeneratedmessage +gitcommit-m"Generatedmessagehere" + + + +Full Workflow with All Features +#Stageyourchanges +gitadd. + +#GeneratedetailedcommitmessagewithJIRAintegration, +#providecontext,andopeneditorforreview +penifycommit-m"Fixloginissue"-d-e + +#Thecommitisautomaticallycompletedafteryousaveandexittheeditor + + + + +Troubleshooting + +Common Issues + +**"No LLM model or API token provided"** +Run penify config llm to configure a local LLM, or +Run penify login to authenticate with Penify + + +**"Failed to connect to JIRA"** +Check your JIRA configuration with cat ~/.penify +Verify your network connection +Ensure your JIRA credentials are valid + + +**"Error initializing LLM client"** +Verify your LLM configuration settings +Ensure the LLM API is accessible + + + + + + + + + + diff --git a/docs/xml/md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_config_commands.xml b/docs/xml/md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_config_commands.xml new file mode 100644 index 0000000..6606065 --- /dev/null +++ b/docs/xml/md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_config_commands.xml @@ -0,0 +1,205 @@ + + + + md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_config_commands + Penify CLI - Configuration Commands + + + +The config command allows you to set up and manage configuration settings for Penify CLI. This document explains all available configuration options and how to use them. + +Configuration Overview +Penify CLI stores configuration in a JSON file at ~/.penify/config.json. The configuration includes: + +LLM (Large Language Model) settings for local commit message generation +JIRA integration settings for enhanced commit messages +API tokens and other credentials + + + + +Basic Usage +#ConfigureLLMsettings +penifyconfigllm + +#ConfigureJIRAintegration +penifyconfigjira + + + +LLM Configuration + +Web Interface +Running penify config llm opens a web interface in your browser where you can configure: + +Model: The LLM model to use (e.g., gpt-3.5-turbo) +API Base URL: The endpoint URL for your LLM API (e.g., https://api.openai.com/v1) +API Key: Your authentication key for the LLM API + + + + +Supported LLMs +Penify CLI supports various LLM providers: + +OpenAI + +Model: gpt-3.5-turbo or gpt-4 +API Base: https://api.openai.com/v1 +API Key: Your OpenAI API key + + + + +Anthropic + +Model: claude-instant-1 or claude-2 +API Base: https://api.anthropic.com/v1 +API Key: Your Anthropic API key + + + + +Ollama (Local) + +Model: llama2 or any model you have installed +API Base: http://localhost:11434 +API Key: (leave blank) + + + + +Azure OpenAI + +Model: Your deployed model name +API Base: Your Azure endpoint +API Key: Your Azure API key + + + + + +Configuration File Structure +After configuration, your ~/.penify/config.json will contain: +{ +"llm":{ +"model":"gpt-3.5-turbo", +"api_base":"https://api.openai.com/v1", +"api_key":"sk-..." +} +} + + + + +JIRA Configuration + +Web Interface +Running penify config jira opens a web interface where you can configure: + +JIRA URL: Your JIRA instance URL (e.g., https://yourcompany.atlassian.net) +Username: Your JIRA username (typically your email) +API Token: Your JIRA API token + + + + +Creating a JIRA API Token + +Log in to https://id.atlassian.com/manage-profile/security/api-tokens +Click "Create API token" +Give it a name (e.g., "Penify CLI") +Copy the generated token and paste it into the configuration + + + + +Configuration File Structure +After configuration, your ~/.penify/config.json will contain: +{ +"jira":{ +"url":"https://yourcompany.atlassian.net", +"username":"your.email@example.com", +"api_token":"your-jira-api-token" +} +} + + + + +Configuration Locations +Penify CLI looks for configuration in multiple locations: + +Project-specific: .penify/config.json in the Git repository root +User-specific: ~/.penify/config.json in your home directory + + +The project-specific configuration takes precedence if both exist. + + +Environment Variables +You can override configuration settings using environment variables: + +PENIFY_API_TOKEN: Override the stored API token +PENIFY_LLM_MODEL: Override the configured LLM model +PENIFY_LLM_API_BASE: Override the configured LLM API base URL +PENIFY_LLM_API_KEY: Override the configured LLM API key +PENIFY_JIRA_URL: Override the configured JIRA URL +PENIFY_JIRA_USER: Override the configured JIRA username +PENIFY_JIRA_TOKEN: Override the configured JIRA API token + + +Example: exportPENIFY_LLM_MODEL="gpt-4" +penifycommit + + + +Command-Line Configuration +For advanced users or scripting, you can directly edit the configuration file: +#Viewcurrentconfiguration +cat~/.penify/config.json + +#Editconfigurationwithyourpreferrededitor +nano~/.penify/config.json + + + +Sharing Configuration +You can share configuration between machines by copying the .penify/config.json file. However, be cautious with API keys and credentials. +For team settings, consider: +Using a project-specific .penify/config.json with shared settings +Excluding API keys from shared configuration +Using environment variables for sensitive credentials + + + + +Troubleshooting + +Common Issues + +**"Error reading configuration file"** +Check if the file exists: ls -la ~/.penify +Ensure it contains valid JSON: cat ~/.penify/config.json + + +**"Failed to connect to LLM API"** +Verify API base URL and API key +Check network connectivity to the API endpoint +Ensure your account has access to the specified model + + +**"Failed to connect to JIRA"** +Check JIRA URL format (should include https://) +Verify username and API token +Ensure your JIRA account has API access permissions + + + + + + + + + + diff --git a/docs/xml/md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_detailed_usage.xml b/docs/xml/md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_detailed_usage.xml new file mode 100644 index 0000000..e1fa5b4 --- /dev/null +++ b/docs/xml/md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_detailed_usage.xml @@ -0,0 +1,197 @@ + + + + md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_detailed_usage + Penify CLI - Detailed Usage Guide + + + +This document provides in-depth information about all features and capabilities of the Penify CLI tool. + +Table of Contents + +Penify CLI - Detailed Usage Guide +Table of Contents +Authentication +Login Process +API Token Storage +Token Precedence + + +Command Overview +Commit Message Generation +Code Documentation Generation +Use Cases +Authentication Requirement + + +Configuration Settings +Git Hooks +Post-Commit Hook +Custom Hook Location + + +Advanced Use Cases +CI/CD Integration +Remote Repository Documentation + + +Troubleshooting +Common Issues +Logs +Support + + + + + + + + +Authentication + +Login Process +When you run penify login, the tool: + +Opens your default web browser +Redirects you to Penify's login page +Captures the authentication token after successful login +Saves the token in ~/.penify file + + + + +API Token Storage +API tokens are stored in your home directory in the .penify file. This JSON file contains: +{ +"api_keys":"your-api-token", +"llm":{"model":"...","api_base":"...","api_key":"..."}, +"jira":{"url":"...","username":"...","api_token":"..."} +} + + + +Token Precedence + +Environment variable PENIFY_API_TOKEN (highest priority) +Token in ~/.penify file + + + + + +Command Overview +penify +├──commitGeneratesmartcommitmessages +├──configConfigurelocalLLMandJIRA +├──llmConfigurelocalLLMsettings +└──jiraConfigureJIRAintegration +├──loginLogintoPenifyaccount +└──docgenGeneratecodedocumentation +├──install-hookInstallGitpost-commithook +└──uninstall-hookRemoveGitpost-commithook + + + +Commit Message Generation +The commit command analyzes your staged changes and generates meaningful commit messages. It can: + +Use a local LLM if configured +Enhance messages with JIRA issue details +Provide both title and description + + +For specific options and examples, see docs/commit-commands.md. + + +Code Documentation Generation +The docgen command generates documentation for your code: + +Use Cases + +Current Git Diff: Default behavior, documents only changed files +Specific File: Pass a file path with -l path/to/file.py +Entire Folder: Pass a folder path with -l path/to/folder + + + + +Authentication Requirement +This feature requires authentication with a Penify account. Run penify login before using documentation features. + + + +Configuration Settings +Configure local settings using the config command: + +LLM Settings: Configure a local LLM for commit message generation +JIRA Settings: Set up JIRA integration for enhanced commit messages + + +For detailed configuration options, see docs/config-commands.md. + + +Git Hooks +Penify can install Git hooks to automate documentation generation: + +Post-Commit Hook + +Install: penify docgen install-hook +What it does: Automatically generates documentation for changed files after each commit +Uninstall: penify docgen uninstall-hook + + + + +Custom Hook Location +You can specify a custom location for Git hooks: +penifydocgeninstall-hook-l/path/to/git/repo + + + + +Advanced Use Cases + +CI/CD Integration +For CI/CD pipelines: + +Set PENIFY_API_TOKEN as an environment variable +Run commands without requiring interactive login + + + + +Remote Repository Documentation +Generate documentation for an entire repository: +gitclonehttps://github.com/user/repo +cdrepo +penifydocgen-l. + + + + +Troubleshooting + +Common Issues + +API Key Errors: Ensure you've run penify login or set PENIFY_API_TOKEN +LLM Configuration: Check your LLM settings with cat ~/.penify +JIRA Integration: Verify JIRA credentials in your configuration + + + + +Logs +For more detailed logs, you can set the environment variable: +exportPENIFY_DEBUG=1 + + + +Support +For additional help, visit https://docs.penify.dev/ or contact support@penify.dev + + + + + + diff --git a/docs/xml/md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_doc_commands.xml b/docs/xml/md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_doc_commands.xml new file mode 100644 index 0000000..7107276 --- /dev/null +++ b/docs/xml/md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_doc_commands.xml @@ -0,0 +1,317 @@ + + + + md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_doc_commands + Penify CLI - Documentation Generation Commands + + + +This document provides a detailed guide to all permutations and combinations of the docgen command, including extensive information about Git hook commands for automating documentation generation. + +Table of Contents + +Basic Usage +Command Options +Option Combinations +Git Hook Commands +Hook Installation +Hook Customization +Hook Uninstallation + + +Advanced Use Cases +Troubleshooting + + + + +Basic Usage +penifydocgen + +By default, this command: +Analyzes the current Git diff (changes since last commit) +Generates documentation for changed files only +Requires authentication via penify login + + + + +Command Options + +<tt>-l, --location</tt> +Specify a target for documentation generation: +#Generatedocumentationforaspecificfile +penifydocgen-lpath/to/file.py + +#Generatedocumentationforaspecificfolder +penifydocgen-lpath/to/folder + +Without this flag, Penify analyzes only Git-tracked modified files. + + +Subcommands + +<tt>install-hook</tt> +Install a Git post-commit hook to automatically generate documentation: +penifydocgeninstall-hook + + + +<tt>uninstall-hook</tt> +Remove the Git post-commit hook: +penifydocgenuninstall-hook + + + + + +Option Combinations + +Generate Documentation for Current Git Diff +#Basicusage-currentGitdiff +penifydocgen + + + +Generate Documentation for a Specific File +#Singlefiledocumentation +penifydocgen-lsrc/main.py + + + +Generate Documentation for a Folder +#Folderdocumentation +penifydocgen-lsrc/models/ + + + +Install Hook in Current Repository +#InstallhookincurrentGitrepository +penifydocgeninstall-hook + + + +Install Hook in Specific Repository +#InstallhookinaspecificGitrepository +penifydocgeninstall-hook-l/path/to/repo + + + +Uninstall Hook from Current Repository +#UninstallhookfromcurrentGitrepository +penifydocgenuninstall-hook + + + +Uninstall Hook from Specific Repository +#UninstallhookfromaspecificGitrepository +penifydocgenuninstall-hook-l/path/to/repo + + + + +Git Hook Commands +Penify provides Git hook commands to automate documentation generation as part of your Git workflow. + +Hook Installation + +How Hooks Work +When you install a Git hook with penify docgen install-hook, Penify: + +Creates a post-commit hook script in the .git/hooks directory +Makes the script executable +Configures the hook to run penify docgen after each commit + + + + +Hook Script Content +The generated post-commit hook contains: +#!/bin/sh +#Thisisapost-commithookgeneratedbypenify. +#Automaticallygeneratesdocumentationforchangedfilesaftereachcommit. + +penifydocgen-gf/path/to/git/repository-tyour_api_token + + + +Installation Location +By default, hooks are installed in the current Git repository. You can specify a different location: +penifydocgeninstall-hook-l/path/to/repo + + + +Installation Requirements +To install hooks, you need: +A valid Penify API token (login first with penify login) +Write permissions to the .git/hooks directory + + + + +Verifying Installation +After installation, you can verify that the hook is installed: +cat.git/hooks/post-commit + + + + +Hook Customization +You can customize the post-commit hook after installation: + +Modifying Hook Behavior + +Edit the .git/hooks/post-commit file +Add additional options to the penify docgen command +Add other commands to run after commit + + +Example of a customized hook: +#!/bin/sh +#Thisisapost-commithookgeneratedbypenify. +#Automaticallygeneratesdocumentationforchangedfilesaftereachcommit. + +#Generatedocumentation +penifydocgen-gf/path/to/git/repository-tyour_api_token + +#Additionalcustomcommands +echo"Documentationgenerationcomplete!" + + + +Advanced Hook Scenarios +Conditional Documentation Generation: +#!/bin/sh +#Onlygeneratedocumentationforcommitstothemainbranch +BRANCH=$(gitrev-parse--abbrev-refHEAD) +if["$BRANCH"="main"];then +penifydocgen-gf/path/to/git/repository-tyour_api_token +fi + +Documenting Specific Files/Folders: +#!/bin/sh +#OnlydocumentPythonfilesinthesrcdirectory +penifydocgen-lsrc/-gf/path/to/git/repository-tyour_api_token + + + + +Hook Uninstallation + +Standard Uninstallation +To remove a hook from the current repository: +penifydocgenuninstall-hook + + + +Specific Repository Uninstallation +To remove a hook from a specific repository: +penifydocgenuninstall-hook-l/path/to/repo + + + +Manual Hook Removal +If needed, you can manually remove the hook: +rm.git/hooks/post-commit + + + +Verifying Uninstallation +Check that the hook was successfully removed: +ls-la.git/hooks/post-commit#Shouldreturn"Nosuchfileordirectory" + + + + + +Advanced Use Cases + +Continuous Integration +Run documentation generation in CI pipelines: +#InyourCIscript +exportPENIFY_API_TOKEN=your_api_token +penifydocgen-lsrc/ + + + +Batch Documentation +Generate documentation for multiple repositories: +#Bashscriptforbatchdocumentation +forrepoinrepo1repo2repo3;do +cd/path/to/$repo +penifydocgen-l. +done + + + +Custom Git Hook Integration +Integrate with other Git hooks: +#In.git/hooks/pre-push +penifydocgen-lsrc/ + + + +Documenting Release Tags +Generate documentation when creating a release tag: +#Documenteverythingwhencreatingatag +gittag-av1.0.0 +penifydocgen-l.#Documententirecodebase +gitcommit--amend-m"Releasev1.0.0withupdateddocumentation" + + + + +Troubleshooting + +Common Issues + +**"Authentication required"** +Run penify login before using documentation features +Check your API token with cat ~/.penify + + +**"Permission denied when installing hook"** +Check Git repository permissions +Try running with sudo (if appropriate for your environment) +Ensure the .git/hooks directory exists + + +**"Hook installed but not running"** +Check if the hook is executable: ls -la .git/hooks/post-commit +Make it executable if needed: chmod +x .git/hooks/post-commit +Check for syntax errors in the hook script + + +**"File or directory not found"** +Verify the path provided to the -l option +Ensure you're running the command from the correct directory + + +**"Hook uninstallation failed"** +Check permissions on the .git/hooks directory +Try manual removal: rm .git/hooks/post-commit + + + + + + +Debugging +For detailed output when running documentation commands: +exportPENIFY_DEBUG=1 +penifydocgen-lsrc/ + + + +Getting Help +For command-specific help: +penifydocgen--help +penifydocgeninstall-hook--help +penifydocgenuninstall-hook--help + + + + + + + diff --git a/docs/xml/md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_example_workflows.xml b/docs/xml/md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_example_workflows.xml new file mode 100644 index 0000000..2e80f2e --- /dev/null +++ b/docs/xml/md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_example_workflows.xml @@ -0,0 +1,161 @@ + + + + md__tmp_github_reposRepoArchDocGenContext_Penify_dev_penify_cli_docs_example_workflows + Penify CLI Example Workflows + + + +This document demonstrates how to use Penify CLI in real-world development workflows to improve your productivity. + +Workflow 1: Efficient Git Commits with AI + +Setup +First, configure your local LLM for offline operation: +penifyconfigllm + +Configure your JIRA integration for enhanced commit messages: +penifyconfigjira + + + +Daily Workflow + +Make your code changes as usual +When ready to commit, use Penify to generate a smart commit message: + + +penifycommit + + +Review and confirm the generated commit message +Git commit and push as usual + + + + +Benefits + +Consistent and descriptive commit messages +Automatic inclusion of relevant JIRA ticket information +Time saved from writing detailed commit messages + + + + + +Workflow 2: Documentation Generation Pipeline + +Setup +Login to Penify to access advanced documentation features: +penifylogin + +Install the Git hook for automatic documentation generation: +penifydocgeninstall-hook + + + +Daily Workflow + +Make your code changes as usual +Commit your changes +Documentation is automatically generated for changed files +Review the generated documentation + + + + +Manual Documentation +For specific files or folders: +penifydocgen-lsrc/components/authentication + + + +Benefits + +Always up-to-date documentation +Consistent documentation style +Time saved from writing detailed documentation + + + + + +Workflow 3: Code Review Enhancement + +Setup +Ensure you're logged into Penify: +penifylogin + + + +Workflow + +Before submitting a PR, generate documentation for changed files: + + +penifydocgen + + +Include the generated documentation in your PR +Reviewers can better understand your changes with the AI-generated explanations + + + + +Benefits + +Improved PR quality +Faster code reviews +Better team understanding of code changes + + + + + +Workflow 4: Onboarding New Team Members + +For Team Leads +Generate comprehensive documentation for the entire codebase: +penifydocgen-l. + + + +For New Team Members +Generate focused documentation for components you're working on: +penifydocgen-lsrc/components/my-feature + + + +Benefits + +Faster onboarding +Better understanding of code structure +Reduced questions to senior team members + + + + + +Workflow 5: Legacy Code Understanding +When working with unfamiliar legacy code: +#Documentaspecificcomplexfile +penifydocgen-lsrc/legacy/complex_module.py + +#Documentanentirelegacycomponent +penifydocgen-lsrc/legacy/old_component + + +Benefits + +Quickly understand complex legacy systems +Reduce time spent deciphering undocumented code +Make safer changes to legacy systems + + + + + + + + diff --git a/docs/xml/namespacepenify__hook.xml b/docs/xml/namespacepenify__hook.xml new file mode 100644 index 0000000..2d5d9d8 --- /dev/null +++ b/docs/xml/namespacepenify__hook.xml @@ -0,0 +1,26 @@ + + + + penify_hook + penify_hook::api_client + penify_hook::base_analyzer + penify_hook::commands + penify_hook::commit_analyzer + penify_hook::config_command + penify_hook::constants + penify_hook::file_analyzer + penify_hook::folder_analyzer + penify_hook::git_analyzer + penify_hook::jira_client + penify_hook::llm_client + penify_hook::login_command + penify_hook::main + penify_hook::ui_utils + penify_hook::utils + + + + + + + diff --git a/docs/xml/namespacepenify__hook_1_1api__client.xml b/docs/xml/namespacepenify__hook_1_1api__client.xml new file mode 100644 index 0000000..763c4c4 --- /dev/null +++ b/docs/xml/namespacepenify__hook_1_1api__client.xml @@ -0,0 +1,12 @@ + + + + penify_hook::api_client + penify_hook::api_client::APIClient + + + + + + + diff --git a/docs/xml/namespacepenify__hook_1_1base__analyzer.xml b/docs/xml/namespacepenify__hook_1_1base__analyzer.xml new file mode 100644 index 0000000..82a8bc2 --- /dev/null +++ b/docs/xml/namespacepenify__hook_1_1base__analyzer.xml @@ -0,0 +1,12 @@ + + + + penify_hook::base_analyzer + penify_hook::base_analyzer::BaseAnalyzer + + + + + + + diff --git a/docs/xml/namespacepenify__hook_1_1commands.xml b/docs/xml/namespacepenify__hook_1_1commands.xml new file mode 100644 index 0000000..4abe35e --- /dev/null +++ b/docs/xml/namespacepenify__hook_1_1commands.xml @@ -0,0 +1,16 @@ + + + + penify_hook::commands + penify_hook::commands::auth_commands + penify_hook::commands::commit_commands + penify_hook::commands::config_commands + penify_hook::commands::doc_commands + penify_hook::commands::hook_commands + + + + + + + diff --git a/docs/xml/namespacepenify__hook_1_1commands_1_1auth__commands.xml b/docs/xml/namespacepenify__hook_1_1commands_1_1auth__commands.xml new file mode 100644 index 0000000..305ce09 --- /dev/null +++ b/docs/xml/namespacepenify__hook_1_1commands_1_1auth__commands.xml @@ -0,0 +1,77 @@ + + + + penify_hook::commands::auth_commands + + + def + def penify_hook.commands.auth_commands.save_credentials + (api_key) + save_credentials + penify_hook.commands.auth_commands.save_credentials + + api_key + api_key + + + + +Save the API key in a priority-based manner. + +This function attempts to save the API key in two locations, based on priority: +1. In a `.env` file located in the root of the Git repository if one is found. +2. In a global `.penify` file located in the user's home directory as a +fallback. The function first tries to locate the Git repository using +`recursive_search_git_folder`. If a Git repository is found, it reads the +existing `.env` file (if present), updates or adds the API key under the key +`PENIFY_API_TOKEN`, and writes the updated content back. If any error occurs +during this process, it falls back to saving the credentials in the global +`.penify` file. The function handles exceptions and prints appropriate error +messages. + +Args: + api_key (str): The API key to save. + +Returns: + bool: True if the API key is saved successfully, False otherwise. + + + + + + penify_hook.utils.recursive_search_git_folder + penify_hook.commands.auth_commands.login + + + def + def penify_hook.commands.auth_commands.login + (api_url, dashboard_url) + login + penify_hook.commands.auth_commands.login + + api_url + api_url + + + dashboard_url + dashboard_url + + + + +Open the login page in a web browser and capture the token via redirect. + + + + + penify_hook.commands.auth_commands.save_credentials + penify_hook.login_command.handle_login + + + + + + + + + diff --git a/docs/xml/namespacepenify__hook_1_1commands_1_1commit__commands.xml b/docs/xml/namespacepenify__hook_1_1commands_1_1commit__commands.xml new file mode 100644 index 0000000..c1cfba1 --- /dev/null +++ b/docs/xml/namespacepenify__hook_1_1commands_1_1commit__commands.xml @@ -0,0 +1,154 @@ + + + + penify_hook::commands::commit_commands + + + def + def penify_hook.commands.commit_commands.commit_code + (api_url, token, message, open_terminal, generate_description, llm_model=None, llm_api_base=None, llm_api_key=None, jira_url=None, jira_user=None, jira_api_token=None) + commit_code + penify_hook.commands.commit_commands.commit_code + + api_url + api_url + + + token + token + + + message + message + + + open_terminal + open_terminal + + + generate_description + generate_description + + + llm_model + llm_model + None + + + llm_api_base + llm_api_base + None + + + llm_api_key + llm_api_key + None + + + jira_url + jira_url + None + + + jira_user + jira_user + None + + + jira_api_token + jira_api_token + None + + + + +Enhance Git commits with AI-powered commit messages. + +This function allows for the generation of enhanced commit messages using +natural language processing models and optionally integrates with JIRA for +additional context. It processes the current Git folder to find relevant files +and generates a detailed commit message based on the provided parameters. + +Args: + api_url (str): URL of the API endpoint. + token (str): Authentication token for the API. + message (str): Initial commit message provided by the user. + open_terminal (bool): Whether to open the terminal after committing. + generate_description (bool): Whether to generate a detailed description in the commit message. + llm_model (str?): The language model to use for generating the commit message. Defaults to None. + llm_api_base (str?): Base URL of the LLM API. Defaults to None. + llm_api_key (str?): API key for accessing the LLM service. Defaults to None. + jira_url (str?): URL of the JIRA instance. Defaults to None. + jira_user (str?): Username for authenticating with JIRA. Defaults to None. + jira_api_token (str?): API token for accessing JIRA. Defaults to None. + + + + + + penify_hook.ui_utils.print_error + penify_hook.ui_utils.print_info + penify_hook.ui_utils.print_warning + penify_hook.utils.recursive_search_git_folder + penify_hook.commands.commit_commands.handle_commit + tests.test_commit_commands.TestCommitCommands.test_commit_code_error_handling + tests.test_commit_commands.TestCommitCommands.test_commit_code_with_jira_client + tests.test_commit_commands.TestCommitCommands.test_commit_code_with_jira_connection_failure + tests.test_commit_commands.TestCommitCommands.test_commit_code_with_llm_client + + + def + def penify_hook.commands.commit_commands.setup_commit_parser + (parser) + setup_commit_parser + penify_hook.commands.commit_commands.setup_commit_parser + + parser + parser + + + + +Sets up an argument parser for generating smart commit messages. + + + + + penify_hook.main.main + tests.test_commit_commands.TestCommitCommands.test_setup_commit_parser + + + def + def penify_hook.commands.commit_commands.handle_commit + (args) + handle_commit + penify_hook.commands.commit_commands.handle_commit + + args + args + + + + +Handle commit functionality by processing arguments and invoking the +appropriate commands. + + + + + penify_hook.commands.commit_commands.commit_code + penify_hook.commands.config_commands.get_jira_config + penify_hook.commands.config_commands.get_llm_config + penify_hook.commands.config_commands.get_token + penify_hook.ui_utils.print_info + penify_hook.main.main + tests.test_commit_commands.TestCommitCommands.test_handle_commit + + + + + + + + + diff --git a/docs/xml/namespacepenify__hook_1_1commands_1_1config__commands.xml b/docs/xml/namespacepenify__hook_1_1commands_1_1config__commands.xml new file mode 100644 index 0000000..aa4819c --- /dev/null +++ b/docs/xml/namespacepenify__hook_1_1commands_1_1config__commands.xml @@ -0,0 +1,323 @@ + + + + penify_hook::commands::config_commands + + + bool + bool penify_hook::commands::config_commands::DOTENV_AVAILABLE + + DOTENV_AVAILABLE + penify_hook.commands.config_commands.DOTENV_AVAILABLE + = True + + + + + + + + + + + penify_hook::commands::config_commands.path + + path + penify_hook.commands.config_commands.path + + + + + + + + + + + + None + None penify_hook.commands.config_commands.load_env_files + () + load_env_files + penify_hook.commands.config_commands.load_env_files + + + +Load environment variables from .env files in various locations with proper +priority. + +This function loads environment variables from .env files located in different +directories, prioritizing the current directory over the Git repo root and the +user home directory. The loading process ensures that later files override +earlier ones. + + + + + + penify_hook.commands.config_commands.load_env_files + penify_hook.utils.recursive_search_git_folder + penify_hook.commands.config_commands.get_jira_config + penify_hook.commands.config_commands.get_llm_config + penify_hook.commands.config_commands.get_token + penify_hook.commands.config_commands.load_env_files + + + Path + Path penify_hook.commands.config_commands.get_penify_config + () + get_penify_config + penify_hook.commands.config_commands.get_penify_config + + + +Returns the path to the `config.json` file within the `.penify` directory, +creating it if necessary. + + + + + penify_hook.utils.recursive_search_git_folder + penify_hook.commands.config_commands.get_token + tests.test_config_commands.TestConfigCommands.test_get_penify_config_existing_dir + tests.test_config_commands.TestConfigCommands.test_get_penify_config_new_dir + + + Any + Any penify_hook.commands.config_commands.get_env_var_or_default + (str env_var, Any default=None) + get_env_var_or_default + penify_hook.commands.config_commands.get_env_var_or_default + + str + env_var + + + Any + default + None + + + + +Get environment variable or return default value. + + + + + penify_hook.commands.config_commands.get_jira_config + penify_hook.commands.config_commands.get_llm_config + penify_hook.commands.config_commands.get_token + + + def + def penify_hook.commands.config_commands.save_llm_config + (model, api_base, api_key) + save_llm_config + penify_hook.commands.config_commands.save_llm_config + + model + model + + + api_base + api_base + + + api_key + api_key + + + + +Save LLM configuration settings to an .env file. + +This function saves the LLM configuration following a specific priority: 1. Git +repo root .env (if inside a git repo) 2. User home directory .env It handles +the detection of the Git repo root, reads the existing .env content, updates it +with the new LLM configuration, and writes it back to the file. It also reloads +the environment variables to make changes immediately available. + +Args: + model (str): The name of the language model. + api_base (str): The base URL for the API. + api_key (str): The API key for authentication. + +Returns: + bool: True if the configuration is saved successfully, False otherwise. + + + + + + penify_hook.utils.recursive_search_git_folder + penify_hook.config_command.handle_config + tests.test_config_commands.TestConfigCommands.test_save_llm_config_failure + tests.test_config_commands.TestConfigCommands.test_save_llm_config_success + + + def + def penify_hook.commands.config_commands.save_jira_config + (url, username, api_token) + save_jira_config + penify_hook.commands.config_commands.save_jira_config + + url + url + + + username + username + + + api_token + api_token + + + + +Save JIRA configuration settings to a .env file. + +This function saves JIRA configuration following these steps: 1. Determine the +target .env file location based on whether the current directory is inside a +Git repository. 2. If inside a Git repo, use the Git repo root's .env file; +otherwise, use the user home directory's .env file. 3. Read the existing +content of the .env file (if it exists) to preserve other settings. 4. Update +the .env content with the new JIRA configuration. 5. Write the updated content +back to the .env file. 6. Optionally, reload environment variables to make +changes immediately available. + +Args: + url (str): The JIRA URL to be saved in the .env file. + username (str): The JIRA username to be saved in the .env file. + api_token (str): The JIRA API token to be saved in the .env file. + +Returns: + bool: True if the configuration was successfully saved, False otherwise. + + + + + + penify_hook.utils.recursive_search_git_folder + penify_hook.commands.config_commands.config_jira_web + penify_hook.config_command.handle_config + tests.test_config_commands.TestConfigCommands.test_save_jira_config_success + + + Dict[str, str] + Dict[str, str] penify_hook.commands.config_commands.get_llm_config + () + get_llm_config + penify_hook.commands.config_commands.get_llm_config + + + +Retrieve LLM configuration from environment variables. + + + + + penify_hook.commands.config_commands.get_env_var_or_default + penify_hook.commands.config_commands.load_env_files + penify_hook.commands.commit_commands.handle_commit + tests.test_config_commands.TestConfigCommands.test_get_llm_config_empty + tests.test_config_commands.TestConfigCommands.test_get_llm_config_exists + tests.test_config_commands.TestConfigCommands.test_get_llm_config_invalid_json + + + Dict[str, str] + Dict[str, str] penify_hook.commands.config_commands.get_jira_config + () + get_jira_config + penify_hook.commands.config_commands.get_jira_config + + + +Retrieve JIRA configuration from environment variables. + + + + + penify_hook.commands.config_commands.get_env_var_or_default + penify_hook.commands.config_commands.load_env_files + penify_hook.commands.config_commands.config_jira_web + penify_hook.commands.commit_commands.handle_commit + tests.test_config_commands.TestConfigCommands.test_get_jira_config_exists + + + def + def penify_hook.commands.config_commands.config_llm_web + () + config_llm_web + penify_hook.commands.config_commands.config_llm_web + + + +Starts an HTTP server for configuring LLM settings via a web interface. + + + + + penify_hook.config_command.handle_config + tests.test_web_config.TestWebConfig.test_config_llm_web_server_setup + + + def + def penify_hook.commands.config_commands.config_jira_web + () + config_jira_web + penify_hook.commands.config_commands.config_jira_web + + + +Starts a web server for configuring JIRA settings. + + + + + penify_hook.commands.config_commands.get_jira_config + penify_hook.commands.config_commands.save_jira_config + penify_hook.config_command.handle_config + tests.test_web_config.TestWebConfig.test_config_jira_web_server_setup + + + Optional[str] + Optional[str] penify_hook.commands.config_commands.get_token + () + get_token + penify_hook.commands.config_commands.get_token + + + +Retrieves an API token using a prioritized method. + +This function first attempts to load environment variables from all `.env` +files and checks if the `PENIFY_API_TOKEN` environment variable is set. If +found, it returns the token. If not, it looks for the API key in a +configuration file named 'api_keys'. If both methods fail, it returns None. + +Returns: + str or None: The API token if found, otherwise None. + + + + + + penify_hook.commands.config_commands.get_env_var_or_default + penify_hook.commands.config_commands.get_penify_config + penify_hook.commands.config_commands.load_env_files + penify_hook.commands.commit_commands.handle_commit + penify_hook.commands.doc_commands.handle_docgen + tests.test_config_commands.TestConfigCommands.test_get_token_from_config + tests.test_config_commands.TestConfigCommands.test_get_token_from_env + tests.test_config_commands.TestConfigCommands.test_get_token_not_found + + + + + + + + + diff --git a/docs/xml/namespacepenify__hook_1_1commands_1_1doc__commands.xml b/docs/xml/namespacepenify__hook_1_1commands_1_1doc__commands.xml new file mode 100644 index 0000000..ae5fad7 --- /dev/null +++ b/docs/xml/namespacepenify__hook_1_1commands_1_1doc__commands.xml @@ -0,0 +1,134 @@ + + + + penify_hook::commands::doc_commands + + + string + string penify_hook::commands::doc_commands.docgen_description + + docgen_description + penify_hook.commands.doc_commands.docgen_description + = """Generate code documentation using Penify. + +This command requires you to be logged in to your Penify account. +You can generate documentation for: +- Current Git diff (default) +- Specific file +- Specific folder +""" + + + + + + + + + + + + def + def penify_hook.commands.doc_commands.generate_doc + (api_url, token, location=None) + generate_doc + penify_hook.commands.doc_commands.generate_doc + + api_url + api_url + + + token + token + + + location + location + None + + + + +Generates documentation based on the given parameters. + +This function initializes an API client using the provided API URL and token. +It then generates documentation by analyzing the specified location, which can +be a folder, a file, or the current working directory if no location is +provided. The function handles different types of analysis based on the input +location and reports any errors encountered during the process. + +Args: + api_url (str): The URL of the API to connect to for documentation generation. + token (str): The authentication token for accessing the API. + location (str?): The path to a specific file or folder to analyze. If not provided, + the current working directory is used. + + + + + + penify_hook.commands.doc_commands.handle_docgen + tests.test_doc_commands.test_generate_doc_error_handling + tests.test_doc_commands.test_generate_doc_file_location + tests.test_doc_commands.test_generate_doc_folder_location + tests.test_doc_commands.test_generate_doc_no_location + tests.test_doc_commands.test_generate_doc_with_file_exception + tests.test_doc_commands.test_generate_doc_with_folder_exception + + + def + def penify_hook.commands.doc_commands.setup_docgen_parser + (parser) + setup_docgen_parser + penify_hook.commands.doc_commands.setup_docgen_parser + + parser + parser + + + + +Configure a parser for generating documentation using Git commands. + + + + + penify_hook.main.main + tests.test_doc_commands.test_setup_docgen_parser + + + def + def penify_hook.commands.doc_commands.handle_docgen + (args) + handle_docgen + penify_hook.commands.doc_commands.handle_docgen + + args + args + + + + +Handle document generation and hook management based on subcommands. + + + + + penify_hook.commands.doc_commands.generate_doc + penify_hook.commands.config_commands.get_token + penify_hook.commands.hook_commands.install_git_hook + penify_hook.commands.hook_commands.uninstall_git_hook + penify_hook.main.main + tests.test_doc_commands.test_handle_docgen_generate + tests.test_doc_commands.test_handle_docgen_install_hook + tests.test_doc_commands.test_handle_docgen_no_token + tests.test_doc_commands.test_handle_docgen_uninstall_hook + + + + + + + + + diff --git a/docs/xml/namespacepenify__hook_1_1commands_1_1hook__commands.xml b/docs/xml/namespacepenify__hook_1_1commands_1_1hook__commands.xml new file mode 100644 index 0000000..403fdd6 --- /dev/null +++ b/docs/xml/namespacepenify__hook_1_1commands_1_1hook__commands.xml @@ -0,0 +1,94 @@ + + + + penify_hook::commands::hook_commands + + + string + string penify_hook::commands::hook_commands.HOOK_FILENAME + + HOOK_FILENAME + penify_hook.commands.hook_commands.HOOK_FILENAME + = "post-commit" + + + + + + + + + + string + string penify_hook::commands::hook_commands.HOOK_TEMPLATE + + HOOK_TEMPLATE + penify_hook.commands.hook_commands.HOOK_TEMPLATE + = """#!/bin/sh +# This is a post-commit hook generated by penify. +# Automatically generates documentation for changed files after each commit. + +penify docgen -gf {git_folder_path} -t {token} +""" + + + + + + + + + + + + def + def penify_hook.commands.hook_commands.install_git_hook + (location, token) + install_git_hook + penify_hook.commands.hook_commands.install_git_hook + + location + location + + + token + token + + + + +Install a post-commit Git hook that generates documentation for changed files. + + + + + penify_hook.commands.doc_commands.handle_docgen + + + def + def penify_hook.commands.hook_commands.uninstall_git_hook + (location) + uninstall_git_hook + penify_hook.commands.hook_commands.uninstall_git_hook + + location + location + + + + +Uninstalls the post-commit hook from the specified location. + + + + + penify_hook.commands.doc_commands.handle_docgen + + + + + + + + + diff --git a/docs/xml/namespacepenify__hook_1_1commit__analyzer.xml b/docs/xml/namespacepenify__hook_1_1commit__analyzer.xml new file mode 100644 index 0000000..34e3580 --- /dev/null +++ b/docs/xml/namespacepenify__hook_1_1commit__analyzer.xml @@ -0,0 +1,12 @@ + + + + penify_hook::commit_analyzer + penify_hook::commit_analyzer::CommitDocGenHook + + + + + + + diff --git a/docs/xml/namespacepenify__hook_1_1config__command.xml b/docs/xml/namespacepenify__hook_1_1config__command.xml new file mode 100644 index 0000000..c3cf5a8 --- /dev/null +++ b/docs/xml/namespacepenify__hook_1_1config__command.xml @@ -0,0 +1,67 @@ + + + + penify_hook::config_command + + + def + def penify_hook.config_command.setup_config_parser + (parent_parser) + setup_config_parser + penify_hook.config_command.setup_config_parser + + parent_parser + parent_parser + + + + +Set up configuration parsers with subcommands for LLM and JIRA settings. + + + + + penify_hook.main.main + + + def + def penify_hook.config_command.handle_config + (args) + handle_config + penify_hook.config_command.handle_config + + args + args + + + + +Handle configuration settings based on the specified config type. + +This function processes different types of configurations such as LLM (Language +Model) and JIRA. It saves configurations, sets up web-based configurations, and +verifies JIRA connections. Depending on the `args.config_type`, it imports +necessary modules, handles configuration saving or setup, and optionally +verifies JIRA connectivity. + +Args: + args (argparse.Namespace): Command-line arguments containing the type of configuration to handle. + + + + + + penify_hook.commands.config_commands.config_jira_web + penify_hook.commands.config_commands.config_llm_web + penify_hook.commands.config_commands.save_jira_config + penify_hook.commands.config_commands.save_llm_config + penify_hook.main.main + + + + + + + + + diff --git a/docs/xml/namespacepenify__hook_1_1constants.xml b/docs/xml/namespacepenify__hook_1_1constants.xml new file mode 100644 index 0000000..1aafdc4 --- /dev/null +++ b/docs/xml/namespacepenify__hook_1_1constants.xml @@ -0,0 +1,43 @@ + + + + penify_hook::constants + + + string + string penify_hook::constants.API_URL + + API_URL + penify_hook.constants.API_URL + = 'http://localhost:8000/api' + + + + + + + + + + string + string penify_hook::constants.DASHBOARD_URL + + DASHBOARD_URL + penify_hook.constants.DASHBOARD_URL + = "https://dashboard.penify.dev/auth/localhost/login" + + + + + + + + + + + + + + + + diff --git a/docs/xml/namespacepenify__hook_1_1file__analyzer.xml b/docs/xml/namespacepenify__hook_1_1file__analyzer.xml new file mode 100644 index 0000000..1588f44 --- /dev/null +++ b/docs/xml/namespacepenify__hook_1_1file__analyzer.xml @@ -0,0 +1,29 @@ + + + + penify_hook::file_analyzer + penify_hook::file_analyzer::FileAnalyzerGenHook + + + + penify_hook::file_analyzer.logger + + logger + penify_hook.file_analyzer.logger + = logging.getLogger(__name__) + + + + + + + + + + + + + + + + diff --git a/docs/xml/namespacepenify__hook_1_1folder__analyzer.xml b/docs/xml/namespacepenify__hook_1_1folder__analyzer.xml new file mode 100644 index 0000000..f75cafb --- /dev/null +++ b/docs/xml/namespacepenify__hook_1_1folder__analyzer.xml @@ -0,0 +1,12 @@ + + + + penify_hook::folder_analyzer + penify_hook::folder_analyzer::FolderAnalyzerGenHook + + + + + + + diff --git a/docs/xml/namespacepenify__hook_1_1git__analyzer.xml b/docs/xml/namespacepenify__hook_1_1git__analyzer.xml new file mode 100644 index 0000000..9b156cc --- /dev/null +++ b/docs/xml/namespacepenify__hook_1_1git__analyzer.xml @@ -0,0 +1,29 @@ + + + + penify_hook::git_analyzer + penify_hook::git_analyzer::GitDocGenHook + + + + penify_hook::git_analyzer.logger + + logger + penify_hook.git_analyzer.logger + = logging.getLogger(__name__) + + + + + + + + + + + + + + + + diff --git a/docs/xml/namespacepenify__hook_1_1jira__client.xml b/docs/xml/namespacepenify__hook_1_1jira__client.xml new file mode 100644 index 0000000..dbbe0fc --- /dev/null +++ b/docs/xml/namespacepenify__hook_1_1jira__client.xml @@ -0,0 +1,29 @@ + + + + penify_hook::jira_client + penify_hook::jira_client::JiraClient + + + bool + bool penify_hook::jira_client::JIRA_AVAILABLE + + JIRA_AVAILABLE + penify_hook.jira_client.JIRA_AVAILABLE + = True + + + + + + + + + + + + + + + + diff --git a/docs/xml/namespacepenify__hook_1_1llm__client.xml b/docs/xml/namespacepenify__hook_1_1llm__client.xml new file mode 100644 index 0000000..5748cf6 --- /dev/null +++ b/docs/xml/namespacepenify__hook_1_1llm__client.xml @@ -0,0 +1,12 @@ + + + + penify_hook::llm_client + penify_hook::llm_client::LLMClient + + + + + + + diff --git a/docs/xml/namespacepenify__hook_1_1login__command.xml b/docs/xml/namespacepenify__hook_1_1login__command.xml new file mode 100644 index 0000000..462f74b --- /dev/null +++ b/docs/xml/namespacepenify__hook_1_1login__command.xml @@ -0,0 +1,55 @@ + + + + penify_hook::login_command + + + def + def penify_hook.login_command.setup_login_parser + (parser) + setup_login_parser + penify_hook.login_command.setup_login_parser + + parser + parser + + + + +Set up command-line arguments for login. + + + + + penify_hook.main.main + + + def + def penify_hook.login_command.handle_login + (args) + handle_login + penify_hook.login_command.handle_login + + args + args + + + + +Initiates a user login process using predefined constants and the `login` +function. + + + + + penify_hook.commands.auth_commands.login + penify_hook.main.main + + + + + + + + + diff --git a/docs/xml/namespacepenify__hook_1_1main.xml b/docs/xml/namespacepenify__hook_1_1main.xml new file mode 100644 index 0000000..63c3c74 --- /dev/null +++ b/docs/xml/namespacepenify__hook_1_1main.xml @@ -0,0 +1,47 @@ + + + + penify_hook::main + + + def + def penify_hook.main.main + () + main + penify_hook.main.main + + + +Main function to handle command-line interface (CLI) interactions with Penify +services. + +This tool provides a command-line interface for generating smart commit +messages, configuring local-LLM and JIRA, and generating code documentation. It +supports basic commands that do not require login and advanced commands that +require user authentication. The `--version` flag can be used to display the +version information. + + + + + + penify_hook.commands.commit_commands.handle_commit + penify_hook.config_command.handle_config + penify_hook.commands.doc_commands.handle_docgen + penify_hook.login_command.handle_login + penify_hook.main.main + penify_hook.ui_utils.print_info + penify_hook.commands.commit_commands.setup_commit_parser + penify_hook.config_command.setup_config_parser + penify_hook.commands.doc_commands.setup_docgen_parser + penify_hook.login_command.setup_login_parser + penify_hook.main.main + + + + + + + + + diff --git a/docs/xml/namespacepenify__hook_1_1ui__utils.xml b/docs/xml/namespacepenify__hook_1_1ui__utils.xml new file mode 100644 index 0000000..443bfc7 --- /dev/null +++ b/docs/xml/namespacepenify__hook_1_1ui__utils.xml @@ -0,0 +1,529 @@ + + + + penify_hook::ui_utils + + + + penify_hook::ui_utils.autoreset + + autoreset + penify_hook.ui_utils.autoreset + + + + + + + + + + + penify_hook::ui_utils.INFO_COLOR + + INFO_COLOR + penify_hook.ui_utils.INFO_COLOR + = Fore.CYAN + + + + + + + + + + + penify_hook::ui_utils.SUCCESS_COLOR + + SUCCESS_COLOR + penify_hook.ui_utils.SUCCESS_COLOR + = Fore.GREEN + + + + + + + + + + + penify_hook::ui_utils.WARNING_COLOR + + WARNING_COLOR + penify_hook.ui_utils.WARNING_COLOR + = Fore.YELLOW + + + + + + + + + + + penify_hook::ui_utils.ERROR_COLOR + + ERROR_COLOR + penify_hook.ui_utils.ERROR_COLOR + = Fore.RED + + + + + + + + + + + penify_hook::ui_utils.HIGHLIGHT_COLOR + + HIGHLIGHT_COLOR + penify_hook.ui_utils.HIGHLIGHT_COLOR + = Fore.BLUE + + + + + + + + + + + penify_hook::ui_utils.NEUTRAL_COLOR + + NEUTRAL_COLOR + penify_hook.ui_utils.NEUTRAL_COLOR + = Fore.WHITE + + + + + + + + + + string + string penify_hook::ui_utils.SUCCESS_SYMBOL + + SUCCESS_SYMBOL + penify_hook.ui_utils.SUCCESS_SYMBOL + = "✓" + + + + + + + + + + string + string penify_hook::ui_utils.WARNING_SYMBOL + + WARNING_SYMBOL + penify_hook.ui_utils.WARNING_SYMBOL + = "○" + + + + + + + + + + string + string penify_hook::ui_utils.ERROR_SYMBOL + + ERROR_SYMBOL + penify_hook.ui_utils.ERROR_SYMBOL + = "✗" + + + + + + + + + + string + string penify_hook::ui_utils.PROCESSING_SYMBOL + + PROCESSING_SYMBOL + penify_hook.ui_utils.PROCESSING_SYMBOL + = "⟳" + + + + + + + + + + + + def + def penify_hook.ui_utils.format_info + (message) + format_info + penify_hook.ui_utils.format_info + + message + message + + + + +Format an informational message with appropriate color. + + + + + penify_hook.ui_utils.create_progress_bar + penify_hook.ui_utils.create_stage_progress_bar + penify_hook.ui_utils.print_info + + + def + def penify_hook.ui_utils.format_success + (message) + format_success + penify_hook.ui_utils.format_success + + message + message + + + + +Formats a success message with green color and reset style. + + + + + penify_hook.ui_utils.print_success + + + def + def penify_hook.ui_utils.format_warning + (message) + format_warning + penify_hook.ui_utils.format_warning + + message + message + + + + +Format a warning message with appropriate color. + + + + + penify_hook.ui_utils.print_warning + + + def + def penify_hook.ui_utils.format_error + (message) + format_error + penify_hook.ui_utils.format_error + + message + message + + + + +Format an error message with the specified error color. + + + + + penify_hook.ui_utils.print_error + + + def + def penify_hook.ui_utils.format_highlight + (message) + format_highlight + penify_hook.ui_utils.format_highlight + + message + message + + + + +Format a highlighted message with appropriate color. + + + + + + + def + def penify_hook.ui_utils.format_file_path + (file_path) + format_file_path + penify_hook.ui_utils.format_file_path + + file_path + file_path + + + + +Format a file path with a warning color. + + + + + penify_hook.ui_utils.print_processing + penify_hook.file_analyzer.FileAnalyzerGenHook.print_processing + + + def + def penify_hook.ui_utils.print_info + (message) + print_info + penify_hook.ui_utils.print_info + + message + message + + + + +Prints an informational message with formatting. + + + + + penify_hook.ui_utils.format_info + penify_hook.commands.commit_commands.commit_code + penify_hook.jira_client.JiraClient.extract_issue_keys_from_branch + penify_hook.commit_analyzer.CommitDocGenHook.get_summary + penify_hook.commands.commit_commands.handle_commit + penify_hook.main.main + penify_hook.commit_analyzer.CommitDocGenHook.process_jira_integration + penify_hook.git_analyzer.GitDocGenHook.run + penify_hook.commit_analyzer.CommitDocGenHook.run + + + def + def penify_hook.ui_utils.print_success + (message) + print_success + penify_hook.ui_utils.print_success + + message + message + + + + +Prints a formatted success message. + + + + + penify_hook.ui_utils.format_success + penify_hook.file_analyzer.FileAnalyzerGenHook.run + penify_hook.git_analyzer.GitDocGenHook.run + penify_hook.commit_analyzer.CommitDocGenHook.run + + + def + def penify_hook.ui_utils.print_warning + (message) + print_warning + penify_hook.ui_utils.print_warning + + message + message + + + + +Prints a warning message with formatted output. + + + + + penify_hook.ui_utils.format_warning + penify_hook.commands.commit_commands.commit_code + penify_hook.file_analyzer.FileAnalyzerGenHook.process_file + penify_hook.commit_analyzer.CommitDocGenHook.process_jira_integration + + + def + def penify_hook.ui_utils.print_error + (message) + print_error + penify_hook.ui_utils.print_error + + message + message + + + + +Print an error message with appropriate formatting. + + + + + penify_hook.ui_utils.format_error + penify_hook.commands.commit_commands.commit_code + + + def + def penify_hook.ui_utils.print_processing + (file_path) + print_processing + penify_hook.ui_utils.print_processing + + file_path + file_path + + + + +Print a processing message for a specified file. + + + + + penify_hook.ui_utils.format_file_path + penify_hook.git_analyzer.GitDocGenHook.run + + + def + def penify_hook.ui_utils.print_status + (status, message) + print_status + penify_hook.ui_utils.print_status + + status + status + + + message + message + + + + +Print a status message with an appropriate symbol. + + + + + penify_hook.file_analyzer.FileAnalyzerGenHook.run + penify_hook.git_analyzer.GitDocGenHook.run + + + def + def penify_hook.ui_utils.create_progress_bar + (total, desc="Processing", unit="item") + create_progress_bar + penify_hook.ui_utils.create_progress_bar + + total + total + + + desc + desc + "Processing" + + + unit + unit + "item" + + + + +Create a tqdm progress bar with consistent styling. + + + + + penify_hook.ui_utils.format_info + penify_hook.git_analyzer.GitDocGenHook.run + + + def + def penify_hook.ui_utils.create_stage_progress_bar + (stages, desc="Processing") + create_stage_progress_bar + penify_hook.ui_utils.create_stage_progress_bar + + stages + stages + + + desc + desc + "Processing" + + + + +Create a tqdm progress bar for processing stages with consistent styling. + + + + + penify_hook.ui_utils.format_info + penify_hook.file_analyzer.FileAnalyzerGenHook.run + + + def + def penify_hook.ui_utils.update_stage + (pbar, stage_name) + update_stage + penify_hook.ui_utils.update_stage + + pbar + pbar + + + stage_name + stage_name + + + + +Update the progress bar with a new stage name. + + + + + penify_hook.file_analyzer.FileAnalyzerGenHook.process_file + penify_hook.file_analyzer.FileAnalyzerGenHook.run + + + + + +UI utilities for Penify CLI. + +This module provides utility functions for consistent UI formatting, +colored output, and progress indicators across the Penify CLI application. + + + + + diff --git a/docs/xml/namespacepenify__hook_1_1utils.xml b/docs/xml/namespacepenify__hook_1_1utils.xml new file mode 100644 index 0000000..5746b88 --- /dev/null +++ b/docs/xml/namespacepenify__hook_1_1utils.xml @@ -0,0 +1,113 @@ + + + + penify_hook::utils + penify_hook::utils::GitRepoNotFoundError + + + + penify_hook::utils.logger + + logger + penify_hook.utils.logger + = logging.getLogger(__name__) + + + + + + + + + + + + def + def penify_hook.utils.get_repo_details + (Repo repo) + get_repo_details + penify_hook.utils.get_repo_details + + Repo + repo + + + + +Determine the details of a repository including its remote URL, hosting +service, organization name, and repository name. + +This function extracts the remote URL from the given Git repository object and +determines the hosting service (e.g., GitHub, Azure DevOps, Bitbucket, GitLab). +It then parses the URL to extract the organization name and repository name. If +the URL does not match any known hosting service pattern, it sets the hosting +service as "Unknown". The function handles exceptions that may occur during +this process and logs an error message if needed. + +Args: + repo (Repo): A GitPython Repo object representing the local git repository. + +Returns: + dict: A dictionary containing the organization name, repository name, and hosting + service. + + + + + + + + def + def penify_hook.utils.recursive_search_git_folder + (folder_path) + recursive_search_git_folder + penify_hook.utils.recursive_search_git_folder + + folder_path + folder_path + + + + +Recursively searches for a .git folder starting from the given directory. + + + + + penify_hook.utils.recursive_search_git_folder + penify_hook.commands.commit_commands.commit_code + penify_hook.commands.config_commands.get_penify_config + penify_hook.commands.config_commands.load_env_files + penify_hook.utils.recursive_search_git_folder + penify_hook.commands.auth_commands.save_credentials + penify_hook.commands.config_commands.save_jira_config + penify_hook.commands.config_commands.save_llm_config + + + def + def penify_hook.utils.find_git_parent + (path) + find_git_parent + penify_hook.utils.find_git_parent + + path + path + + + + +Traverse up from the given path to find the nearest directory containing a .git +subdirectory. + + + + + + + + + + + + + diff --git a/docs/xml/namespacesetup.xml b/docs/xml/namespacesetup.xml new file mode 100644 index 0000000..9527ed9 --- /dev/null +++ b/docs/xml/namespacesetup.xml @@ -0,0 +1,195 @@ + + + + setup + + + + setup.name + + name + setup.name + + + + + + + + + + + setup.version + + version + setup.version + + + + + + + + + + + setup.packages + + packages + setup.packages + + + + + + + + + + + setup.install_requires + + install_requires + setup.install_requires + + + + + + + + + + + setup.entry_points + + entry_points + setup.entry_points + + + + + + + + + + + setup.author + + author + setup.author + + + + + + + + + + + setup.author_email + + author_email + setup.author_email + + + + + + + + + + + setup.description + + description + setup.description + + + + + + + + + + + setup.long_description + + long_description + setup.long_description + + + + + + + + + + + setup.long_description_content_type + + long_description_content_type + setup.long_description_content_type + + + + + + + + + + + setup.url + + url + setup.url + + + + + + + + + + + setup.classifiers + + classifiers + setup.classifiers + + + + + + + + + + + setup.python_requires + + python_requires + setup.python_requires + + + + + + + + + + + + + + + + diff --git a/docs/xml/namespacestd.xml b/docs/xml/namespacestd.xml new file mode 100644 index 0000000..0f0343b --- /dev/null +++ b/docs/xml/namespacestd.xml @@ -0,0 +1,110 @@ + + + + std + std::allocator + std::array + std::atomic + std::atomic_ref + std::auto_ptr + std::bad_alloc + std::bad_cast + std::bad_exception + std::bad_typeid + std::basic_fstream + std::basic_ifstream + std::basic_ios + std::basic_iostream + std::basic_istream + std::basic_istringstream + std::basic_ofstream + std::basic_ostream + std::basic_ostringstream + std::basic_string + std::basic_string_view + std::basic_stringstream + std::bitset + std::complex + std::deque + std::domain_error + std::error_category + std::error_code + std::error_condition + std::exception + std::forward_list + std::fstream + std::ifstream + std::invalid_argument + std::ios + std::ios_base + std::istream + std::istringstream + std::jthread + std::length_error + std::list + std::lock_guard + std::logic_error + std::map + std::multimap + std::multiset + std::mutex + std::ofstream + std::ostream + std::ostringstream + std::out_of_range + std::overflow_error + std::priority_queue + std::queue + std::range_error + std::recursive_mutex + std::recursive_timed_mutex + std::runtime_error + std::set + std::shared_lock + std::shared_mutex + std::shared_ptr + std::shared_timed_mutex + std::smart_ptr + std::span + std::stack + std::string + std::string_view + std::stringstream + std::system_error + std::thread + std::timed_mutex + std::u16string + std::u16string_view + std::u32string + std::u32string_view + std::u8string + std::u8string_view + std::underflow_error + std::unique_lock + std::unique_ptr + std::unordered_map + std::unordered_multimap + std::unordered_multiset + std::unordered_set + std::valarray + std::vector + std::weak_ptr + std::wfstream + std::wifstream + std::wios + std::wistream + std::wistringstream + std::wofstream + std::wostream + std::wostringstream + std::wstring + std::wstring_view + std::wstringstream + +STL namespace. + + + + + + diff --git a/docs/xml/namespacetests.xml b/docs/xml/namespacetests.xml new file mode 100644 index 0000000..3b5005f --- /dev/null +++ b/docs/xml/namespacetests.xml @@ -0,0 +1,16 @@ + + + + tests + tests::conftest + tests::test_commit_commands + tests::test_config_commands + tests::test_doc_commands + tests::test_web_config + + + + + + + diff --git a/docs/xml/namespacetests_1_1conftest.xml b/docs/xml/namespacetests_1_1conftest.xml new file mode 100644 index 0000000..9d124cb --- /dev/null +++ b/docs/xml/namespacetests_1_1conftest.xml @@ -0,0 +1,11 @@ + + + + tests::conftest + + + + + + + diff --git a/docs/xml/namespacetests_1_1test__commit__commands.xml b/docs/xml/namespacetests_1_1test__commit__commands.xml new file mode 100644 index 0000000..b7c5e1f --- /dev/null +++ b/docs/xml/namespacetests_1_1test__commit__commands.xml @@ -0,0 +1,12 @@ + + + + tests::test_commit_commands + tests::test_commit_commands::TestCommitCommands + + + + + + + diff --git a/docs/xml/namespacetests_1_1test__config__commands.xml b/docs/xml/namespacetests_1_1test__config__commands.xml new file mode 100644 index 0000000..9443c08 --- /dev/null +++ b/docs/xml/namespacetests_1_1test__config__commands.xml @@ -0,0 +1,12 @@ + + + + tests::test_config_commands + tests::test_config_commands::TestConfigCommands + + + + + + + diff --git a/docs/xml/namespacetests_1_1test__doc__commands.xml b/docs/xml/namespacetests_1_1test__doc__commands.xml new file mode 100644 index 0000000..04a2685 --- /dev/null +++ b/docs/xml/namespacetests_1_1test__doc__commands.xml @@ -0,0 +1,461 @@ + + + + tests::test_doc_commands + + + def + def tests.test_doc_commands.test_generate_doc_no_location + (mock_getcwd, mock_api_client, mock_folder_analyzer, mock_file_analyzer, mock_git_analyzer) + test_generate_doc_no_location + tests.test_doc_commands.test_generate_doc_no_location + + mock_getcwd + mock_getcwd + + + mock_api_client + mock_api_client + + + mock_folder_analyzer + mock_folder_analyzer + + + mock_file_analyzer + mock_file_analyzer + + + mock_git_analyzer + mock_git_analyzer + + + + +Test function to generate documentation without location information. + +This function sets up mocks for the API client, current working +directory, and Git analyzer. It then calls the `generate_doc` function +with a fake API URL and token. The function is expected to initialize +the API client, configure the Git analyzer, and run it without any +location information. + +Args: + mock_getcwd (MagicMock): Mock for os.getcwd(). + mock_api_client (MagicMock): Mock for creating an API client. + mock_folder_analyzer (MagicMock): Mock for folder analysis. + mock_file_analyzer (MagicMock): Mock for file analysis. + mock_git_analyzer (MagicMock): Mock for Git analyzer setup. + + + + + + penify_hook.commands.doc_commands.generate_doc + + + def + def tests.test_doc_commands.test_generate_doc_file_location + (mock_api_client, mock_folder_analyzer, mock_file_analyzer, mock_git_analyzer) + test_generate_doc_file_location + tests.test_doc_commands.test_generate_doc_file_location + + mock_api_client + mock_api_client + + + mock_folder_analyzer + mock_folder_analyzer + + + mock_file_analyzer + mock_file_analyzer + + + mock_git_analyzer + mock_git_analyzer + + + + +Test generating a documentation file location. + +This function tests the process of generating a documentation file +location using mock objects for API client, folder analyzer, file +analyzer, and Git analyzer. It sets up the necessary mocks, calls the +`generate_doc` function with specified parameters, and asserts that the +appropriate methods on the mock objects are called as expected. + +Args: + mock_api_client (MagicMock): Mock object for the API client. + mock_folder_analyzer (MagicMock): Mock object for the folder analyzer. + mock_file_analyzer (MagicMock): Mock object for the file analyzer. + mock_git_analyzer (MagicMock): Mock object for the Git analyzer. + + + + + + penify_hook.commands.doc_commands.generate_doc + + + def + def tests.test_doc_commands.test_generate_doc_folder_location + (mock_api_client, mock_folder_analyzer, mock_file_analyzer, mock_git_analyzer) + test_generate_doc_folder_location + tests.test_doc_commands.test_generate_doc_folder_location + + mock_api_client + mock_api_client + + + mock_folder_analyzer + mock_folder_analyzer + + + mock_file_analyzer + mock_file_analyzer + + + mock_git_analyzer + mock_git_analyzer + + + + +Test the function to generate documentation for a folder location. + +It sets up mock objects for API client, folder analyzer, file analyzer, +and Git analyzer, then calls the `generate_doc` function with specified +parameters. Finally, it asserts that the correct methods on the mock +objects were called as expected. + +Args: + mock_api_client (MagicMock): Mock object for the API client. + mock_folder_analyzer (MagicMock): Mock object for the folder analyzer. + mock_file_analyzer (MagicMock): Mock object for the file analyzer. + mock_git_analyzer (MagicMock): Mock object for the Git analyzer. + + + + + + penify_hook.commands.doc_commands.generate_doc + + + def + def tests.test_doc_commands.test_generate_doc_error_handling + (mock_api_client, mock_git_analyzer, mock_exit) + test_generate_doc_error_handling + tests.test_doc_commands.test_generate_doc_error_handling + + mock_api_client + mock_api_client + + + mock_git_analyzer + mock_git_analyzer + + + mock_exit + mock_exit + + + + +Generate a documentation string for the provided code snippet using +Google Docstring style. + +Short one line description: Test function to ensure proper error +handling during API calls with GitAnalyzer. Multiline long description: +This test function is designed to verify that the generate_doc function +handles exceptions correctly when an error occurs during API interaction +with GitAnalyzer. It sets up a mock API client and a mock Git analyzer, +causing the analyzer to raise an exception to simulate a failure +condition. The function then asserts that the exit code is set to 1 when +the error handling mechanism is invoked. + +Args: + mock_api_client (MagicMock): A mock object simulating the API client. + mock_git_analyzer (MagicMock): A mock object simulating the Git analyzer, configured to raise an + exception. + mock_exit (MagicMock): A mock object representing the exit function, which should be called + with an error code. + + + + + + penify_hook.commands.doc_commands.generate_doc + + + def + def tests.test_doc_commands.test_setup_docgen_parser + () + test_setup_docgen_parser + tests.test_doc_commands.test_setup_docgen_parser + + + +Test the setup_docgen_parser function to ensure it properly configures +the ArgumentParser for docgen options. + +It verifies that the parser correctly sets up docgen options and handles +different subcommands like 'install-hook' and 'uninstall-hook'. + + + + + + penify_hook.commands.doc_commands.setup_docgen_parser + + + def + def tests.test_doc_commands.test_handle_docgen_install_hook + (mock_exit, mock_get_token, mock_generate_doc, mock_uninstall_hook, mock_install_hook) + test_handle_docgen_install_hook + tests.test_doc_commands.test_handle_docgen_install_hook + + mock_exit + mock_exit + + + mock_get_token + mock_get_token + + + mock_generate_doc + mock_generate_doc + + + mock_uninstall_hook + mock_uninstall_hook + + + mock_install_hook + mock_install_hook + + + + +Test the handling of the 'install-hook' subcommand. + +This function sets up a mock environment where it simulates the +execution of the 'install-hook' subcommand. It verifies that the +`mock_install_hook` is called with the correct arguments, while +`mock_generate_doc` and `mock_uninstall_hook` are not called. + +Args: + mock_exit (MagicMock): Mock object for sys.exit. + mock_get_token (MagicMock): Mock object to simulate fetching a token. + mock_generate_doc (MagicMock): Mock object to simulate generating documentation. + mock_uninstall_hook (MagicMock): Mock object to simulate uninstalling a hook. + mock_install_hook (MagicMock): Mock object to simulate installing a hook. + + + + + + penify_hook.commands.doc_commands.handle_docgen + + + def + def tests.test_doc_commands.test_handle_docgen_uninstall_hook + (mock_exit, mock_get_token, mock_generate_doc, mock_uninstall_hook, mock_install_hook) + test_handle_docgen_uninstall_hook + tests.test_doc_commands.test_handle_docgen_uninstall_hook + + mock_exit + mock_exit + + + mock_get_token + mock_get_token + + + mock_generate_doc + mock_generate_doc + + + mock_uninstall_hook + mock_uninstall_hook + + + mock_install_hook + mock_install_hook + + + + +Test the uninstall-hook subcommand of the handle_docgen function. +This test case sets up a mock environment and verifies that the +uninstall-hook is called with the correct location, while generate_doc +and install_hook are not called. + +Args: + mock_exit (MagicMock): A mock for the exit function. + mock_get_token (MagicMock): A mock for the get_token function. + mock_generate_doc (MagicMock): A mock for the generate_doc function. + mock_uninstall_hook (MagicMock): A mock for the uninstall_hook function. + mock_install_hook (MagicMock): A mock for the install_hook function. + + + + + + penify_hook.commands.doc_commands.handle_docgen + + + def + def tests.test_doc_commands.test_handle_docgen_generate + (mock_get_token, mock_generate_doc, mock_uninstall_hook, mock_install_hook) + test_handle_docgen_generate + tests.test_doc_commands.test_handle_docgen_generate + + mock_get_token + mock_get_token + + + mock_generate_doc + mock_generate_doc + + + mock_uninstall_hook + mock_uninstall_hook + + + mock_install_hook + mock_install_hook + + + + +Test the direct documentation generation functionality. + +This function tests the `handle_docgen` function when no subcommand is +provided. It verifies that the document generation hook is called and +the uninstall and install hooks are not called. + +Args: + mock_get_token (MagicMock): Mocked function to get authentication token. + mock_generate_doc (MagicMock): Mocked function for generating documentation. + mock_uninstall_hook (MagicMock): Mocked function for uninstalling the document generation hook. + mock_install_hook (MagicMock): Mocked function for installing the document generation hook. + + + + + + penify_hook.commands.doc_commands.handle_docgen + + + def + def tests.test_doc_commands.test_handle_docgen_no_token + (mock_exit, mock_get_token) + test_handle_docgen_no_token + tests.test_doc_commands.test_handle_docgen_no_token + + mock_exit + mock_exit + + + mock_get_token + mock_get_token + + + + +Test the behavior of the `handle_docgen` function when no token is +provided. + +This function asserts that if no token is returned by `mock_get_token`, +the `handle_docgen` function will call `mock_exit` with a status code of +1. + +Args: + mock_exit (MagicMock): A MagicMock object simulating the `exit` function. + mock_get_token (MagicMock): A MagicMock object simulating the `get_token` function. + + + + + + penify_hook.commands.doc_commands.handle_docgen + + + def + def tests.test_doc_commands.test_generate_doc_with_file_exception + (mock_api_client, mock_getcwd) + test_generate_doc_with_file_exception + tests.test_doc_commands.test_generate_doc_with_file_exception + + mock_api_client + mock_api_client + + + mock_getcwd + mock_getcwd + + + + +Generate documentation from a Python source file. + +This function reads a Python file and generates a docstring based on its +content. It uses mock objects to simulate API calls and directory +operations during testing. + +Args: + mock_api_client (unittest.mock.MagicMock): A mock object for simulating API client behavior. + mock_getcwd (unittest.mock.MagicMock): A mock object for simulating the current working directory function. + + + + + + penify_hook.commands.doc_commands.generate_doc + + + def + def tests.test_doc_commands.test_generate_doc_with_folder_exception + (mock_api_client, mock_getcwd) + test_generate_doc_with_folder_exception + tests.test_doc_commands.test_generate_doc_with_folder_exception + + mock_api_client + mock_api_client + + + mock_getcwd + mock_getcwd + + + + +Generate documentation from a given API endpoint and save it to a +folder. + +This function fetches data from the specified API endpoint, processes +it, and saves the generated documentation in the provided folder. If an +error occurs during the fetching process, a SystemExit exception is +raised with an appropriate message. + +Args: + api_url (str): The URL of the API endpoint from which data will be fetched. + token (str): The authentication token required to access the API. + folder_path (str): The path to the folder where the documentation will be saved. + + + + + + penify_hook.commands.doc_commands.generate_doc + + + + + + + + + diff --git a/docs/xml/namespacetests_1_1test__web__config.xml b/docs/xml/namespacetests_1_1test__web__config.xml new file mode 100644 index 0000000..d68b4d9 --- /dev/null +++ b/docs/xml/namespacetests_1_1test__web__config.xml @@ -0,0 +1,12 @@ + + + + tests::test_web_config + tests::test_web_config::TestWebConfig + + + + + + + diff --git a/docs/xml/penify-cli-documentation_8md.xml b/docs/xml/penify-cli-documentation_8md.xml new file mode 100644 index 0000000..83e4922 --- /dev/null +++ b/docs/xml/penify-cli-documentation_8md.xml @@ -0,0 +1,220 @@ + + + + penify-cli-documentation.md + + + + + +--- +layout:doc +title:StreamlineGitCommitsandCodeDocumentationwithPenify-CLI'sAutomatedGeneration +description:DiscoverhowPenify-CLIautomatesbothGitcommitmessagesandcodedocumentation,withJiraintegrationandflexibleoptions.Savetime,improverepositoryclarity,andboostproductivitywiththisdetailedguidetousageandbestpractices. +keywords:Penify-CLI,Gitcommitmessages,codedocumentation,Jiraintegration,automateddocumentation,versioncontrol,repositorymanagement,developerproductivity +author:SumanSauarbh +--- +#PenifyCLIDocumentation + +PenifyCLIisapowerfultoolforenhancingyourdevelopmentworkflowwithAI-poweredfeatureslikecommitmessagegeneration,codedocumentation,andJIRAintegration. + +##Installation + +```bash +pipinstallpenify +``` + +##GettingStarted + +Afterinstallation,youcanchecktheversionofPenifyCLI: + +```bash +penify--version +``` + +##CommandsOverview + +-`commit`:Generatesmartcommitmessagesusinglocal-LLM +-`config`:Configurelocal-LLMandJIRAsettings +-`login`:LogintoPenifytouseadvancedfeatures +-`docgen`:GeneratecodedocumentationforGitdiffs,files,orfolders + +##DetailedCommandDocumentation + +###CommitCommand + +The`commit`commandgeneratesintelligentcommitmessagesusinglocalLLMmodelsorPenifyservices. + +####Usage: + +```bash +penifycommit[options] +``` + +####Options: + +-`-m,--messageTEXT`:Providecontextforthecommitmessagegeneration +-`-e,--terminal`:Openaneditortomodifythegeneratedcommitmessagebeforeapplyingit +-`-d,--description`:Generateadetailedcommitmessagewithbothtitleanddescription + +####Examples: + +**Basicusage:** +```bash +penifycommit +``` + +**Providecontextforbetterresults:** +```bash +penifycommit-m"Fixedtheloginbutton" +``` + +**Generateadetailedcommitmessageandopeneditor:** +```bash +penifycommit-e-d +``` + +####Requirements: + +-EitheralocalLLMconfiguration(via`penifyconfigllm`)orPenifylogin +-ForJIRAintegration,configureJIRAsettings(via`penifyconfigjira`) + +--- + +###ConfigCommand + +The`config`commandhelpsyouconfigurelocalLLMsettingsandJIRAintegrationforenhancedcommitmessages. + +####Usage: + +```bash +penifyconfig[subcommand] +``` + +####Subcommands: + +-`llm`:ConfigurelocalLargeLanguageModelsettings +-`jira`:ConfigureJIRAintegrationsettings + +####Examples: + +**ConfigurelocalLLM:** +```bash +penifyconfigllm +``` +Thisopensawebinterfacetoconfigure: +-Modelname(e.g.,gpt-3.5-turbo,llama2) +-APIbaseURL(e.g.,https://api.openai.com/v1) +-APIkey + +**ConfigureJIRAintegration:** +```bash +penifyconfigjira +``` +Thisopensawebinterfacetoconfigure: +-JIRAURL(e.g.,https://your-domain.atlassian.net) +-Username(typicallyyouremail) +-APItoken + +--- + +###LoginCommand + +The`login`commandauthenticatesyouwithPenifyforadvancedfeatureslikecodedocumentationgeneration. + +####Usage: + +```bash +penifylogin +``` + +####Whathappens: +1.AbrowserwindowopenstothePenifyloginpage +2.Aftersuccessfullogin,yourAPIkeyisautomaticallysaved +3.ThetoolisnowauthorizedtousePenify'sadvancedfeatures + +####Example: + +```bash +penifylogin +``` + +--- + +###DocgenCommand + +The`docgen`commandgeneratesdocumentationforyourcodeusingPenify'sAIservices. + +####Usage: + +```bash +penifydocgen[options][subcommand] +``` + +####Options: + +-`-l,--locationPATH`:Pathtoaspecificfileorfoldertodocument(default:currentworkingdirectory) + +####Subcommands: + +-`install-hook`:InstallaGitpost-commithooktoautomaticallygeneratedocumentation +-`uninstall-hook`:RemovetheGitpost-commithook + +####Examples: + +**DocumentcurrentGitdiff:** +```bash +penifydocgen +``` + +**Documentaspecificfile:** +```bash +penifydocgen-lsrc/main.py +``` + +**Documentanentirefolder:** +```bash +penifydocgen-lsrc/components +``` + +**InstalltheGithookforautomaticdocumentation:** +```bash +penifydocgeninstall-hook +``` + +**UninstalltheGithook:** +```bash +penifydocgenuninstall-hook +``` + +####Requirements: + +-RequireslogintoPenify(`penifylogin`) + +##ConfigurationFiles + +PenifyCLIstoresconfigurationinthefollowinglocations: + +-Globalconfiguration:`~/.penify` +-Project-specificconfiguration:`.penify`inyourGitrepositoryroot + +##EnvironmentVariables + +-`PENIFY_API_TOKEN`:CanbeusedtoprovidetheAPItokeninsteadofloggingin + +##Troubleshooting + +Ifyouencounterissues: + +1.Checkyourconfigurationwith`cat~/.penify` +2.VerifynetworkconnectivitytoAPIendpoints +3.EnsureyourAPIkeysandtokensarevalid +4.ForJIRAintegrationissues,verifyyourJIRAcredentials + +##AdditionalResources + +Formoreinformation,visitthe[PenifyDocumentation](https://docs.penify.dev/). + + + + diff --git a/docs/xml/penify__hook_2____init_____8py.xml b/docs/xml/penify__hook_2____init_____8py.xml new file mode 100644 index 0000000..d3d0335 --- /dev/null +++ b/docs/xml/penify__hook_2____init_____8py.xml @@ -0,0 +1,13 @@ + + + + __init__.py + + + + + + + + + diff --git a/docs/xml/penify__hook_2commands_2____init_____8py.xml b/docs/xml/penify__hook_2commands_2____init_____8py.xml new file mode 100644 index 0000000..141dfec --- /dev/null +++ b/docs/xml/penify__hook_2commands_2____init_____8py.xml @@ -0,0 +1,16 @@ + + + + __init__.py + penify_hook + penify_hook::commands + + + + + +#ThisfilemakesthecommandsdirectoryaproperPythonpackage + + + + diff --git a/docs/xml/setup_8py.xml b/docs/xml/setup_8py.xml new file mode 100644 index 0000000..b732c20 --- /dev/null +++ b/docs/xml/setup_8py.xml @@ -0,0 +1,46 @@ + + + + setup.py + setup + + + + + +fromsetuptoolsimportsetup,find_packages + +setup( +name="penify",#Changedfrom"penify"toamoreuniquename +version="0.3.0", +packages=['penify_hook'], +install_requires=[ +"requests", +"tqdm", +"GitPython", +"colorama", +"litellm", +"jira" +], +entry_points={ +"console_scripts":[ +"penify=penify_hook.main:main",#Commandnameremainsthesame +], +}, +author="SumanSaurabh", +author_email="ss.sumansaurabh92@gmail.com", +description="ApenifyclitooltogenerateDocumentation,Commit-summary.", +long_description=open("README.md").read(), +long_description_content_type="text/markdown", +url="https://github.com/SingularityX-ai/penify", +classifiers=[ +"ProgrammingLanguage::Python::3", +"License::OSIApproved::MITLicense", +"OperatingSystem::OSIndependent", +], +python_requires='>=3.6', +) + + + + diff --git a/docs/xml/test__commit__commands_8py.xml b/docs/xml/test__commit__commands_8py.xml new file mode 100644 index 0000000..210ffd1 --- /dev/null +++ b/docs/xml/test__commit__commands_8py.xml @@ -0,0 +1,450 @@ + + + + test_commit_commands.py + tests::test_commit_commands::TestCommitCommands + tests + tests::test_commit_commands + + + + + +importos +importsys +importpytest +fromunittest.mockimportpatch,MagicMock,call + +frompenify_hook.commands.commit_commandsimportcommit_code,setup_commit_parser,handle_commit + +classTestCommitCommands: + +@pytest.fixture +defmock_api_client(self): +"""MocksaninstanceofAPIClientusingunittest.mock. + +ThisfunctioncreatesamockobjectforAPIClientandyieldsitalong +withthemockedinstance.Itisusefulfortestingpurposeswherereal +APIcallsshouldbeavoided. + +Yields: +tuple:AtuplecontainingthemockofAPIClientandthemockedinstanceof +APIClient. +""" + +withpatch('penify_hook.api_client.APIClient',create=True)asmock: +api_client_instance=MagicMock() +mock.return_value=api_client_instance +yieldmock,api_client_instance + +@pytest.fixture +defmock_llm_client(self): +"""MockaninstanceofLLMClientfortestingpurposes. + +Thisfunctionyieldsamockobjectrepresentinganinstanceof +LLMClient,whichcanbeusedtosimulateinteractionswithalanguage +modelduringtesting.Themockispatchedtoreplacetheactual +LLMClientclassfromthepenify_hookmodule. + +Yields: +tuple:Atuplecontainingtwoelements: +-mock(MagicMock):ThemockobjectforLLMClient. +-llm_client_instance(MagicMock):AninstanceofthemockedLLMClient. +""" + +withpatch('penify_hook.llm_client.LLMClient',create=True)asmock: +llm_client_instance=MagicMock() +mock.return_value=llm_client_instance +yieldmock,llm_client_instance + +@pytest.fixture +defmock_jira_client(self): +"""CreateamockJIRAclientfortestingpurposes. + +ThisfunctionyieldsatuplecontainingamockJIRAclientinstanceand +its`is_connected`method.Themockclientisconfiguredtosimulatean +activeconnection.Thisisusefulforunitteststhatrequire +interactionwithaJIRAclientwithoutmakingactualnetworkcalls. + +Yields: +tuple:AtuplecontainingthemockedJIRAclientinstanceandits +`is_connected`method. +""" + +withpatch('penify_hook.jira_client.JiraClient',create=True)asmock: +jira_instance=MagicMock() +jira_instance.is_connected.return_value=True +mock.return_value=jira_instance +yieldmock,jira_instance + +@pytest.fixture +defmock_commit_doc_gen(self): +"""MockstheCommitDocGenHookclassandreturnsaMagicMockinstance. + +Thisfunctionusesthe`patch`decoratorfromthe`unittest.mock`module +tocreateamockofthe`CommitDocGenHook`class.Itthensetsupthis +mocktoreturnanew`MagicMock`instancewheninvoked.Thefunction +yieldsboththemockobjectandthemockedinstance,allowingforeasy +testingoffunctionsthatrelyon`CommitDocGenHook`. + +Returns: +tuple:Atuplecontainingtwoelements: +-mock(patch):Thepatchobjectusedtomockthe`CommitDocGenHook` +class. +-doc_gen_instance(MagicMock):Themockedinstanceof +`CommitDocGenHook`. +""" + +withpatch('penify_hook.commit_analyzer.CommitDocGenHook',create=True)asmock: +doc_gen_instance=MagicMock() +mock.return_value=doc_gen_instance +yieldmock,doc_gen_instance + +@pytest.fixture +defmock_git_folder_search(self): +"""Mockthe`recursive_search_git_folder`functiontoreturnapredefined +gitfolderpath. + +Thisfunctionusesthe`patch`decoratorfromthe`unittest.mock`module +tointerceptcallsto`penify_hook.utils.recursive_search_git_folder`. +Whencalled,itwillreturn'/mock/git/folder'insteadofperformingan +actualsearch.Thisisusefulfortestingpurposeswhereyouneeda +consistentresponsewithoutinteractingwiththefilesystem. + +Yields: +MagicMock:Amockobjectthatsimulatesthe`recursive_search_git_folder`function. +""" + +withpatch('penify_hook.utils.recursive_search_git_folder',create=True)asmock: +mock.return_value='/mock/git/folder' +yieldmock + +@pytest.fixture +defmock_print_functions(self): +"""Mockstheprintfunctionsfrom`penify_hook.ui_utils`fortesting +purposes. + +ThisfunctionusesPython's`unittest.mock.patch`toreplacetheactual +printfunctions(`print`,`print_warning`,and`print_error`)withmock +objects.Thesemockobjectscanbeusedinteststocapturecallsmade +totheseprintfunctionswithoutactuallyprintinganything. + +Yields: +tuple:Atuplecontainingthreemockobjectscorrespondingto`print_info`, +`print_warning`, +and`print_error`. +""" + +withpatch('penify_hook.ui_utils.print_info',create=True)asmock_info,\ +patch('penify_hook.ui_utils.print_warning',create=True)asmock_warning,\ +patch('penify_hook.ui_utils.print_error',create=True)asmock_error: +yieldmock_info,mock_warning,mock_error + +@patch('penify_hook.api_client.APIClient',create=True) +@patch('penify_hook.llm_client.LLMClient',create=True) +@patch('penify_hook.commit_analyzer.CommitDocGenHook',create=True) +@patch('penify_hook.utils.recursive_search_git_folder',create=True) +@patch('penify_hook.ui_utils.print_info',create=True) +@patch('penify_hook.ui_utils.print_warning',create=True) +@patch('penify_hook.ui_utils.print_error',create=True) +deftest_commit_code_with_llm_client(self,mock_error,mock_warning,mock_info, +mock_git_folder_search,mock_doc_gen, +mock_llm_client,mock_api_client): +"""TestcommittingcodeusinganLLMclient. + +Thisfunctionsetsupmockobjectsforvariouscomponentsandthencalls +the`commit_code`functionwithspecifiedparameters.Itverifiesthat +thecorrectmocksarecreatedandcalledwiththeappropriatearguments. + +Args: +mock_error(MagicMock):Mockobjectforerrorhandling. +mock_warning(MagicMock):Mockobjectforwarninglogging. +mock_info(MagicMock):Mockobjectforinfologging. +mock_git_folder_search(MagicMock):Mockobjecttosimulategitfoldersearch. +mock_doc_gen(MagicMock):Mockobjectfordocumentgeneration. +mock_llm_client(MagicMock):MockobjectforLLMclientinteraction. +mock_api_client(MagicMock):MockobjectforAPIclientinteraction. +""" + +#Setupmocks +api_instance=MagicMock() +mock_api_client.return_value=api_instance + +llm_instance=MagicMock() +mock_llm_client.return_value=llm_instance + +doc_gen_instance=MagicMock() +mock_doc_gen.return_value=doc_gen_instance + +mock_git_folder_search.return_value='/mock/git/folder' + +#CallfunctionwithLLMparameters +commit_code( +api_url="http://api.example.com", +token="api-token", +message="testcommit", +open_terminal=False, +generate_description=True, +llm_model="gpt-4", +llm_api_base="http://llm-api.example.com", +llm_api_key="llm-api-key" +) + +#Verifycalls +mock_api_client.assert_called_once_with("http://api.example.com","api-token") +mock_llm_client.assert_called_once_with( +model="gpt-4", +api_base="http://llm-api.example.com", +api_key="llm-api-key" +) +mock_doc_gen.assert_called_once_with('/mock/git/folder',api_instance,llm_instance,None) +doc_gen_instance.run.assert_called_once_with("testcommit",False,True) + +@patch('penify_hook.api_client.APIClient',create=True) +@patch('penify_hook.llm_client.LLMClient',create=True) +@patch('penify_hook.jira_client.JiraClient',create=True) +@patch('penify_hook.commit_analyzer.CommitDocGenHook',create=True) +@patch('penify_hook.utils.recursive_search_git_folder',create=True) +@patch('penify_hook.ui_utils.print_info',create=True) +@patch('penify_hook.ui_utils.print_warning',create=True) +@patch('penify_hook.ui_utils.print_error',create=True) +deftest_commit_code_with_jira_client(self,mock_error,mock_warning,mock_info, +mock_git_folder_search,mock_doc_gen, +mock_jira_client,mock_llm_client,mock_api_client): +"""TestcommittingcodeusingaJIRAclient. + +Thisfunctionteststhecommit_codefunctionwithvariousparameters, +includingAPIandJIRAcredentials.Itsetsupmockobjectsfor +dependenciessuchastheJIRAclient,LLMclient,anddocgeneratorto +simulatethebehavioroftherealclasses.Thefunctionthencalls +commit_codeandverifiesthattheJIRAclientanddocgeneratorare +calledwiththecorrectparameters. + +Args: +mock_error(MagicMock):AMagicMockobjectforsimulatingerrorlogging. +mock_warning(MagicMock):AMagicMockobjectforsimulatingwarninglogging. +mock_info(MagicMock):AMagicMockobjectforsimulatinginfologging. +mock_git_folder_search(MagicMock):AMagicMockobjectforsimulatingthegitfoldersearchfunction. +mock_doc_gen(MagicMock):AMagicMockobjectforsimulatingthedocgeneratorfunction. +mock_jira_client(MagicMock):AMagicMockobjectforsimulatingtheJIRAclientclass. +mock_llm_client(MagicMock):AMagicMockobjectforsimulatingtheLLMclientclass. +mock_api_client(MagicMock):AMagicMockobjectforsimulatingtheAPIclientclass. +""" + +#Setupmocks +api_instance=MagicMock() +mock_api_client.return_value=api_instance + +llm_instance=MagicMock() +mock_llm_client.return_value=llm_instance + +jira_instance=MagicMock() +jira_instance.is_connected.return_value=True +mock_jira_client.return_value=jira_instance + +doc_gen_instance=MagicMock() +mock_doc_gen.return_value=doc_gen_instance + +mock_git_folder_search.return_value='/mock/git/folder' + +#CallfunctionwithJIRAparameters +commit_code( +api_url="http://api.example.com", +token="api-token", +message="testcommit", +open_terminal=False, +generate_description=True, +llm_model="gpt-4", +llm_api_base="http://llm-api.example.com", +llm_api_key="llm-api-key", +jira_url="https://jira.example.com", +jira_user="jira-user", +jira_api_token="jira-token" +) + +#Verifycalls +mock_jira_client.assert_called_once_with( +jira_url="https://jira.example.com", +jira_user="jira-user", +jira_api_token="jira-token" +) +mock_doc_gen.assert_called_once_with('/mock/git/folder',api_instance,llm_instance,jira_instance) + +@patch('penify_hook.api_client.APIClient',create=True) +@patch('penify_hook.jira_client.JiraClient',create=True) +@patch('penify_hook.commit_analyzer.CommitDocGenHook',create=True) +@patch('penify_hook.utils.recursive_search_git_folder',create=True) +@patch('penify_hook.ui_utils.print_info',create=True) +@patch('penify_hook.ui_utils.print_warning',create=True) +@patch('penify_hook.ui_utils.print_error',create=True) +deftest_commit_code_with_jira_connection_failure(self,mock_error,mock_warning,mock_info, +mock_git_folder_search,mock_doc_gen, +mock_jira_client,mock_api_client): +"""Testthecommit_codefunctionwhenJIRAconnectionfails. + +ThisfunctionteststhescenariowheretheJIRAconnectionfailsduring +acodecommit.Itsetsupvariousmockstosimulatedifferentcomponents +ofthesystemandthencallsthe`commit_code`functionwithspecific +parameters.ThefunctionisexpectedtohandletheJIRAconnection +failuregracefullybylogginganappropriatewarning. + +Args: +mock_error(MagicMock):Mockforerrorlogging. +mock_warning(MagicMock):Mockforwarninglogging. +mock_info(MagicMock):Mockforinfologging. +mock_git_folder_search(MagicMock):MockforsearchingtheGitfolder. +mock_doc_gen(MagicMock):Mockforgeneratingdocumentation. +mock_jira_client(MagicMock):MockforcreatingaJIRAclient. +mock_api_client(MagicMock):MockforcreatinganAPIclient. +""" + +#Setupmocks +api_instance=MagicMock() +mock_api_client.return_value=api_instance + +jira_instance=MagicMock() +jira_instance.is_connected.return_value=False +mock_jira_client.return_value=jira_instance + +doc_gen_instance=MagicMock() +mock_doc_gen.return_value=doc_gen_instance + +mock_git_folder_search.return_value='/mock/git/folder' + +#Callfunction +commit_code( +api_url="http://api.example.com", +token="api-token", +message="testcommit", +open_terminal=False, +generate_description=True, +llm_model=None, +jira_url="https://jira.example.com", +jira_user="jira-user", +jira_api_token="jira-token" +) + +#VerifyJIRAwarning +mock_doc_gen.assert_called_once_with('/mock/git/folder',api_instance,None,None) + +@patch('penify_hook.api_client.APIClient',create=True) +@patch('penify_hook.commit_analyzer.CommitDocGenHook',create=True) +@patch('penify_hook.utils.recursive_search_git_folder',create=True) +@patch('sys.exit') +@patch('builtins.print') +deftest_commit_code_error_handling(self,mock_print,mock_exit, +mock_git_folder_search,mock_doc_gen,mock_api_client): +"""Testtheerrorhandlinginthetest_commit_codefunction. + +Thisfunctionsetsupmockstosimulateexceptionsandtesttheerror +handlingofthecommit_codefunction.Itverifiesthatthefunction +correctlyprintsanerrormessageandexitswithastatuscodeof1when +anexceptionoccursduringdocumentationgeneration. + +Args: +mock_print(MagicMock):Mockfortheprintfunction,usedtoverifyerrormessageoutput. +mock_exit(MagicMock):Mockforthesys.exitfunction,usedtoverifyexitbehavior. +mock_git_folder_search(MagicMock):Mockforthegit_folder_searchfunction,returningamockGitfolder +path. +mock_doc_gen(MagicMock):Mockforthedoc_genfunction,simulatinganexceptionduring +documentationgeneration. +mock_api_client(MagicMock):MockfortheAPIclientclass,notdirectlyusedbutreferencedinthe +functionsignature. +""" + +#Setupmocks +mock_doc_gen.side_effect=Exception("Testerror") +mock_git_folder_search.return_value='/mock/git/folder' + +#Callfunction +commit_code( +api_url="http://api.example.com", +token="api-token", +message="testcommit", +open_terminal=False, +generate_description=True +) + +mock_print.assert_called_once_with("Error:Testerror") +mock_exit.assert_called_once_with(1) + +deftest_setup_commit_parser(self): +"""Setuptheargumentparserforthecommitcommand. + +Thisfunctionconfiguresanargumentparsertohandlevariousoptions +forcommittingchanges.Itaddsthreearguments:-'-m'or'--message': +Anoptionalargumenttospecifyacontextualcommitmessagewitha +defaultvalueof"N/A".-'-e'or'--terminal':Abooleanflagtoopen +aneditterminalbeforecommitting.-'-d'or'--description':Aboolean +flagthat,whensettoFalse,indicatesthegenerationofacommit +messagewithtitleanddescription. + +Args: +parser(MagicMock):Theargumentparsertobeconfigured. +""" + +parser=MagicMock() +setup_commit_parser(parser) + +#Verifyparserconfiguration +assertparser.add_argument.call_count==3 +parser.add_argument.assert_any_call("-m","--message",required=False,help="Commitwithcontextualcommitmessage.",default="N/A") +parser.add_argument.assert_any_call("-e","--terminal",action="store_true",help="Openeditterminalbeforecommitting.") +parser.add_argument.assert_any_call("-d","--description",action="store_false",help="Itwillgeneratecommitmessagewithtitleanddescription.",default=False) + +@patch('penify_hook.commands.commit_commands.get_token') +@patch('penify_hook.commands.commit_commands.get_jira_config') +@patch('penify_hook.commands.commit_commands.get_llm_config') +@patch('penify_hook.commands.commit_commands.commit_code') +@patch('penify_hook.commands.commit_commands.print_info') +@patch('penify_hook.constants.API_URL',"http://api.example.com") +deftest_handle_commit(self,mock_print_info,mock_commit_code,mock_get_token, +mock_get_llm_config,mock_get_jira_config): +"""Testthehandle_commitfunctionwithvariousmockobjects. + +ThisfunctionsetsupmocksforretrievingLLMconfiguration,JIRA +configuration,andcommitcode.Itthencreatesanargumentobjectand +callsthehandle_commitfunction.Finally,itverifiesthatthemock +functionswerecalledwiththeexpectedarguments. + +Args: +mock_print_info(MagicMock):Mockobjectforprintinginformation. +mock_commit_code(MagicMock):Mockobjectforcommittingcode. +mock_get_token(MagicMock):MockobjectforretrievingAPItoken. +mock_get_llm_config(MagicMock):MockobjectforretrievingLLMconfiguration. +mock_get_jira_config(MagicMock):MockobjectforretrievingJIRAconfiguration. +""" + +#Setupmocks +mock_get_llm_config.return_value={ +'model':'test-model', +'api_base':'http://llm-api.example.com', +'api_key':'llm-key' +} +mock_get_token.return_value='api-token' +mock_get_jira_config.return_value={ +'url':'https://jira.example.com', +'username':'jira-user', +'api_token':'jira-token' +} + +#Createargs +args=MagicMock() +args.message="testcommit" +args.terminal=True +args.description=True + +#Callfunction +handle_commit(args) + +#Verify +mock_print_info.assert_called_with("GenerateCommitDescription:True") +mock_commit_code.assert_called_once_with( +"http://api.example.com",'api-token',"testcommit",True,True, +'test-model','http://llm-api.example.com','llm-key', +'https://jira.example.com','jira-user','jira-token' +) + + + + diff --git a/docs/xml/test__config__commands_8py.xml b/docs/xml/test__config__commands_8py.xml new file mode 100644 index 0000000..cd7b938 --- /dev/null +++ b/docs/xml/test__config__commands_8py.xml @@ -0,0 +1,465 @@ + + + + test_config_commands.py + tests::test_config_commands::TestConfigCommands + tests + tests::test_config_commands + + + + + +importos +importjson +importpytest +fromunittest.mockimportpatch,mock_open,MagicMock +frompathlibimportPath + +frompenify_hook.commands.config_commandsimport( +get_penify_config, +get_llm_config, +get_jira_config, +save_llm_config, +save_jira_config, +get_token +) + +classTestConfigCommands: + +@patch('penify_hook.commands.config_commands.recursive_search_git_folder')#Updatedpatchpathhere +@patch('penify_hook.commands.config_commands.Path') +@patch('os.makedirs') +@patch('builtins.open',new_callable=mock_open) +deftest_get_penify_config_existing_dir(self,mock_file_open,mock_makedirs,mock_path,mock_git_folder): +"""Testtheget_penify_configfunctionwhenthe.penifyconfigdirectory +exists. + +Itshouldnotcreateanewdirectoryandassertthatallmocked +functionswerecalledcorrectly. + +Args: +mock_file_open(MagicMock):AMagicMockobjectsimulatingtheopen()function. +mock_makedirs(MagicMock):AMagicMockobjectsimulatingtheos.makedirs()function. +mock_path(MagicMock):AMagicMockobjectsimulatingthePathclassfrompathlibmodule. +mock_git_folder(MagicMock):AMagicMockobjectsimulatingthegit_folder_search()function. +""" + +#Mockgitfoldersearch +mock_git_folder.return_value='/mock/git/folder' + +#MockPathoperations +mock_path_instance=MagicMock() +mock_path.return_value=mock_path_instance +mock_path_instance.__truediv__.return_value=mock_path_instance + +#Pathexistsfor.penifydir +mock_path_instance.exists.return_value=True + +#Callfunction +result=get_penify_config() + +#Assertions +mock_git_folder.assert_called_once_with(os.getcwd()) +mock_path.assert_called_once_with('/mock/git/folder') +mock_path_instance.__truediv__.assert_called_with('.penify') +assertmock_makedirs.call_count==0#Shouldnotcreatedirectory + +@patch('penify_hook.utils.recursive_search_git_folder') +@patch('penify_hook.commands.config_commands.Path') +@patch('os.makedirs') +@patch('builtins.open',new_callable=mock_open) +deftest_get_penify_config_new_dir(self,mock_file_open,mock_makedirs,mock_path,mock_git_folder): +"""Testthebehaviorofget_penify_configwhenthe.penifydirectorydoes +notexist. + +Thisfunctionmocksvarioussystemcallstosimulateascenariowhere +the.penifydirectoryisnotpresent.Itthenassertsthatthe +appropriateactionsaretakentocreatethedirectoryandwriteanempty +JSONfile. + +Args: +mock_file_open(MagicMock):AMagicMockobjectsimulatingthe`open`function. +mock_makedirs(MagicMock):AMagicMockobjectsimulatingthe`os.makedirs`function. +mock_path(MagicMock):AMagicMockobjectsimulatingthe`Path`classfrom`pathlib`. +mock_git_folder(MagicMock):AMagicMockobjectsimulatingagitfoldersearchfunction. +""" + +#Mockgitfoldersearch +mock_git_folder.return_value='/mock/git/folder' + +#MockPathoperations +mock_path_instance=MagicMock() +mock_path.return_value=mock_path_instance +mock_path_instance.__truediv__.return_value=mock_path_instance + +#Pathdoesn'texistfor.penifydir +mock_path_instance.exists.side_effect=[False,False] + +#Callfunction +result=get_penify_config() + +#Assertions +mock_makedirs.assert_called_with(mock_path_instance,exist_ok=True) +mock_file_open.assert_called_once() +mock_file_open().write.assert_called_once_with('{}') + +@patch('penify_hook.commands.config_commands.get_penify_config') +@patch('builtins.open',new_callable=mock_open,read_data='{"llm":{"model":"gpt-4","api_base":"https://api.openai.com","api_key":"test-key"}}') +deftest_get_llm_config_exists(self,mock_file_open,mock_get_config): +"""Testtheget_llm_configfunctionwhentheconfigurationfileexists. + +Thisfunctionsetsupamockconfigurationfilethatexistsandreturns +itwhencalled.Itthencallstheget_llm_configfunctionandasserts +thatitreturnsthecorrectconfigurationdictionary.Additionally,it +checksthatthemock_file_openfunctionwascalledwiththecorrect +arguments. + +Args: +mock_file_open(MagicMock):Amockfortheopen()function. +mock_get_config(MagicMock):Amockfortheget_config()function. +""" + +#Setupmock +mock_config_file=MagicMock() +mock_config_file.exists.return_value=True +mock_get_config.return_value=mock_config_file + +#Callfunction +result=get_llm_config() + +#Assertions +assertresult=={ +'model':'gpt-4', +'api_base':'https://api.openai.com', +'api_key':'test-key' +} +mock_file_open.assert_called_once_with(mock_config_file,'r') + +@patch('penify_hook.commands.config_commands.get_penify_config') +@patch('builtins.open',new_callable=mock_open,read_data='{}') +deftest_get_llm_config_empty(self,mock_file_open,mock_get_config): +"""Testthebehaviorofget_llm_configwhencalledwithanempty +configurationfile. + +Thisfunctionsetsupamockconfigurationfilethatexistsbutreturns +nocontent.Itthencallsthe`get_llm_config`functionandassertsthat +itreturnsanemptydictionaryandthatthefileopenmethodwascalled +exactlyoncewiththecorrectarguments. + +Args: +mock_file_open(MagicMock):AMagicMockobjectsimulatingthebuilt-inopenfunction. +mock_get_config(MagicMock):AMagicMockobjectsimulatingtheget_configfunction. +""" + +#Setupmock +mock_config_file=MagicMock() +mock_config_file.exists.return_value=True +mock_get_config.return_value=mock_config_file + +#Callfunction +result=get_llm_config() + +#Assertions +assertresult=={} +mock_file_open.assert_called_once_with(mock_config_file,'r') + +@patch('penify_hook.commands.config_commands.get_penify_config') +@patch('builtins.open',new_callable=mock_open,read_data='invalidjson') +@patch('builtins.print') +deftest_get_llm_config_invalid_json(self,mock_print,mock_file_open,mock_get_config): +"""Testfunctiontoverifythebehaviorofget_llm_configwhenreadingan +invalidJSONfile. + +Itsetsupamockconfigurationfilethatexistsbutcontainsinvalid +JSON.Thefunctionisexpectedtohandlethisgracefullybyprintingan +errormessageandreturninganemptydictionary. + +Args: +mock_print(MagicMock):Mockfortheprintfunction. +mock_file_open(MagicMock):Mockfortheopenfunction. +mock_get_config(MagicMock):Mockfortheget_configfunction,whichreturnsthemockconfiguration +file. +""" + +#Setupmock +mock_config_file=MagicMock() +mock_config_file.exists.return_value=True +mock_get_config.return_value=mock_config_file + +#Callfunction +result=get_llm_config() + +#Assertions +assertresult=={} +mock_print.assert_called_once() +assert'Errorreading.penifyconfigfile'inmock_print.call_args[0][0] + +@patch('penify_hook.commands.config_commands.get_penify_config') +@patch('builtins.open',new_callable=mock_open,read_data='{"jira":{"url":"https://jira.example.com","username":"user","api_token":"token"}}') +deftest_get_jira_config_exists(self,mock_file_open,mock_get_config): +"""Testthatget_jira_configreturnsthecorrectJIRAconfigurationwhen +theconfigurationfileexists. + +Itsetsupamockfortheconfigurationfiletosimulateitsexistence +andverifiesthatthefunctionreadsfromthecorrectfileandreturns +theexpectedJIRAconfigurationdictionary.Additionally,itchecksthat +themockfileopeniscalledwiththeappropriatearguments. + +Args: +mock_file_open(MagicMock):Amockforthe`open`function. +mock_get_config(MagicMock):Amockforthe`get_config`function,whichisexpectedtoreturnamock +configurationfileobject. + +Returns: +None:Thistestfunctiondoesnotexplicitlyreturnanything.Itsassertions +serveastheverificationofitscorrectness. +""" + +#Setupmock +mock_config_file=MagicMock() +mock_config_file.exists.return_value=True +mock_get_config.return_value=mock_config_file + +#Callfunction +result=get_jira_config() + +#Assertions +assertresult=={ +'url':'https://jira.example.com', +'username':'user', +'api_token':'token' +} +mock_file_open.assert_called_once_with(mock_config_file,'r') + +@patch('penify_hook.commands.config_commands.get_penify_config') +@patch('builtins.open',new_callable=mock_open) +@patch('json.dump') +@patch('builtins.print') +deftest_save_llm_config_success(self,mock_print,mock_json_dump,mock_file_open,mock_get_config): +"""Testthesave_llm_configfunctionsuccessfully. + +Thisfunctionteststhatthesave_llm_configfunctioncorrectlysavesan +LLMconfigurationandhandlesvariousmockobjectsandsideeffects.It +ensuresthatthefunctionreturnsTrueuponsuccessfulexecution,writes +theexpectedconfigurationtoafile,andprintsaconfirmationmessage. + +Args: +mock_print(MagicMock):Amockobjectfortheprintfunction. +mock_json_dump(MagicMock):Amockobjectforjson.dump. +mock_file_open(MagicMock):Amockobjectforfileopening. +mock_get_config(MagicMock):Amockobjecttoreturnaconfigurationfilemock. +""" + +#Setupmock +mock_config_file=MagicMock() +mock_get_config.return_value=mock_config_file +mock_file_open.return_value.__enter__.return_value=mock_file_open + +#Mockjson.loadtoreturnemptydictwhenreading +withpatch('json.load',return_value={}): +#Callfunction +result=save_llm_config("gpt-4","https://api.openai.com","test-key") + +#Assertions +assertresult==True +mock_json_dump.assert_called_once() +expected_config={ +'llm':{ +'model':'gpt-4', +'api_base':'https://api.openai.com', +'api_key':'test-key' +} +} +assertmock_json_dump.call_args[0][0]==expected_config +mock_print.assert_called_once() +assert'configurationsaved'inmock_print.call_args[0][0] + +@patch('penify_hook.commands.config_commands.get_penify_config') +@patch('builtins.open',side_effect=IOError("Permissiondenied")) +@patch('builtins.print') +deftest_save_llm_config_failure(self,mock_print,mock_file_open,mock_get_config): +"""Testfunctiontoverifythatthesave_llm_configfunctionreturnsFalse +andprintsanerrormessagewhenitfailstosavetheLLMconfiguration +duetoapermissionerror. + +Itsetsupamockconfigurationfilethatexistsandcallsthe +save_llm_configfunctionwithvalidparameters.Thefunctionisexpected +toreturnFalseandprint"ErrorsavingLLMconfiguration:Permission +denied"incaseofafailure. + +Args: +self(TestLLMConfig):Aninstanceofthetestclass. +mock_print(MagicMock):AMagicMockobjectrepresentingtheprintfunction,whichwillbeused +toassertthatitwascalledwiththeexpectederrormessage. +mock_file_open(MagicMock):AMagicMockobjectrepresentingtheopenfunction,whichisnotusedin +thistestbutisincludedasaparameterforcompleteness. +mock_get_config(MagicMock):AMagicMockobjectrepresentingtheget_configfunction,whichwillbe +usedtoreturnthemockconfigurationfile. +""" + +#Setupmock +mock_config_file=MagicMock() +mock_config_file.exists.return_value=True +mock_get_config.return_value=mock_config_file + +#Callfunction +result=save_llm_config("gpt-4","https://api.openai.com","test-key") + +#Assert +assertresultisFalse +mock_print.assert_called_with("ErrorsavingLLMconfiguration:Permissiondenied") + +@patch('penify_hook.commands.config_commands.Path') +@patch('builtins.open',new_callable=mock_open) +@patch('json.dump') +@patch('builtins.print') +deftest_save_jira_config_success(self,mock_print,mock_json_dump,mock_file_open,mock_path): +"""Testthesave_jira_configfunctiontoensureitsavesJIRAconfiguration +successfully. + +Thisfunctionsetsupmocksforvariousdependenciesandteststhe +functionalityofsavingaJIRAconfiguration.Itassertsthatthe +functionreturns`True`,theJSONdumpiscalledwiththecorrect +configuration,andtheprintstatementcontainstheexpectedmessage. + +Args: +mock_print(MagicMock):Mockfortheprintfunction. +mock_json_dump(MagicMock):Mockforthejson.dumpfunction. +mock_file_open(MagicMock):Mockfortheopenfunction. +mock_path(MagicMock):Mockforthepathmodule. +""" + +#Setupmock +mock_home_dir=MagicMock() +mock_path.home.return_value=mock_home_dir +mock_home_dir.__truediv__.return_value=mock_home_dir +mock_home_dir.exists.return_value=True + +#Mockjson.loadtoreturnemptydictwhenreading +withpatch('json.load',return_value={}): +#Callfunction +result=save_jira_config("https://jira.example.com","user","token") + +#Assertions +assertresult==True +mock_json_dump.assert_called_once() +expected_config={ +'jira':{ +'url':'https://jira.example.com', +'username':'user', +'api_token':'token' +} +} +assertmock_json_dump.call_args[0][0]==expected_config +mock_print.assert_called_once() +assert'configurationsaved'inmock_print.call_args[0][0] + +@patch('os.getenv') +@patch('penify_hook.commands.config_commands.Path') +@patch('builtins.open',new_callable=mock_open,read_data='{"api_keys":"config-token"}') +deftest_get_token_from_env(self,mock_file_open,mock_path,mock_getenv): +"""Testretrievingatokenfromtheenvironmentvariable. + +Thisfunctionteststhebehaviorof`get_token`whenanenvironment +variableisset.Itverifiesthatifthe'PENIFY_API_TOKEN'environment +variableexists,thefunctionreturnsitsvaluewithoutattemptingto +readafile. + +Args: +mock_file_open(MagicMock):AMagicMockobjectforsimulatingfileoperations. +mock_path(MagicMock):AMagicMockobjectforsimulatingpathoperations. +mock_getenv(MagicMock):AMagicMockobjectforsimulatingenvironmentvariableretrieval. +""" + +#Setupmockforenvvar +mock_getenv.return_value="env-token" + +#Callfunction +result=get_token() + +#Assertions +assertresult=="env-token" +mock_getenv.assert_called_once_with('PENIFY_API_TOKEN') +#Fileshouldnotbereadifenvvarexists +assertmock_file_open.call_count==0 + +@patch('os.getenv') +@patch('penify_hook.commands.config_commands.Path') +@patch('builtins.open',new_callable=mock_open,read_data='{"api_keys":"config-token"}') +deftest_get_token_from_config(self,mock_file_open,mock_path,mock_getenv): +"""Testretrievingatokenfromtheconfiguration. + +Thisfunctionsetsupmocksforenvironmentvariablesandconfiguration +files,callsthe`get_token`function,andassertsitsbehavior.It +verifiesthatwhentheenvironmentvariableisnotfound,thefunction +readsatokenfromaconfigurationfilelocatedintheuser'shome +directory. + +Args: +mock_file_open(MagicMock):Amockforthe`open`function. +mock_path(MagicMock):Amockforthe`pathlib.Path`class. +mock_getenv(MagicMock):Amockforthe`os.getenv`function. +""" + +#Setupmockforenvvar(notfound) +mock_getenv.return_value=None + +#Setupmockforconfigfile +mock_home_dir=MagicMock() +mock_path.home.return_value=mock_home_dir +mock_home_dir.__truediv__.return_value=mock_home_dir +mock_home_dir.exists.return_value=True + +#Callfunction +result=get_token() + +#Assertions +assertresult=="config-token" +mock_getenv.assert_called_once_with('PENIFY_API_TOKEN') +mock_file_open.assert_called_once_with(mock_home_dir,'r') + +@patch('os.getenv') +@patch('penify_hook.commands.config_commands.Path') +@patch('builtins.open',new_callable=mock_open,read_data='{"other_key":"value"}') +deftest_get_token_not_found(self,mock_file_open,mock_path,mock_getenv): +"""Testtheget_tokenfunctionwhentheAPItokenenvironmentvariableis +notfound. + +Thisfunctionteststhescenariowherethe`PENIFY_API_TOKEN` +environmentvariableisnotset.Itmockstheenvironmentvariableto +return`None`,andverifiesthatthefunctionreturns`None`.Thetest +alsochecksthattheenvironmentvariableisaccessedonceandthata +fileopenoperationisattemptedonaconfigurationfilelocatedinthe +user'shomedirectory. + +Args: +mock_file_open(MagicMock):Mockforthebuilt-in`open`function. +mock_path(MagicMock):Mockforthe`pathlib.Path`module. +mock_getenv(MagicMock):Mockforthe`os.getenv`function. + +Returns: +None:Thefunctiondoesnotreturnanything;itassertsconditionstoverify +correctness. +""" + +#Setupmockforenvvar(notfound) +mock_getenv.return_value=None + +#Setupmockforconfigfile +mock_home_dir=MagicMock() +mock_path.home.return_value=mock_home_dir +mock_home_dir.__truediv__.return_value=mock_home_dir +mock_home_dir.exists.return_value=True + +#Callfunction +result=get_token() + +#Assertions +assertresultisNone +mock_getenv.assert_called_once_with('PENIFY_API_TOKEN') +mock_file_open.assert_called_once_with(mock_home_dir,'r') + + + + diff --git a/docs/xml/test__doc__commands_8py.xml b/docs/xml/test__doc__commands_8py.xml new file mode 100644 index 0000000..46e88a8 --- /dev/null +++ b/docs/xml/test__doc__commands_8py.xml @@ -0,0 +1,372 @@ + + + + test_doc_commands.py + tests + tests::test_doc_commands + + + + + +importpytest +importsys +importos +fromargparseimportArgumentParser +fromunittest.mockimportpatch,MagicMock + +sys.path.insert(0,os.path.abspath(os.path.join(os.path.dirname(__file__),'..'))) + +frompenify_hook.commands.doc_commandsimport( +generate_doc, +setup_docgen_parser, +handle_docgen +) + + +@patch('penify_hook.file_analyzer.FileAnalyzerGenHook') +@patch('penify_hook.git_analyzer.GitDocGenHook') +@patch('penify_hook.folder_analyzer.FolderAnalyzerGenHook') +@patch('penify_hook.api_client.APIClient') +@patch('penify_hook.commands.doc_commands.os.getcwd') +deftest_generate_doc_no_location(mock_getcwd,mock_api_client, +mock_folder_analyzer,mock_file_analyzer, +mock_git_analyzer): +"""Testfunctiontogeneratedocumentationwithoutlocationinformation. + +ThisfunctionsetsupmocksfortheAPIclient,currentworking +directory,andGitanalyzer.Itthencallsthe`generate_doc`function +withafakeAPIURLandtoken.Thefunctionisexpectedtoinitialize +theAPIclient,configuretheGitanalyzer,andrunitwithoutany +locationinformation. + +Args: +mock_getcwd(MagicMock):Mockforos.getcwd(). +mock_api_client(MagicMock):MockforcreatinganAPIclient. +mock_folder_analyzer(MagicMock):Mockforfolderanalysis. +mock_file_analyzer(MagicMock):Mockforfileanalysis. +mock_git_analyzer(MagicMock):MockforGitanalyzersetup. +""" + +#Setup +mock_api_instance=MagicMock() +mock_api_client.return_value=mock_api_instance +mock_getcwd.return_value='/fake/current/dir' +mock_git_instance=MagicMock() +mock_git_analyzer.return_value=mock_git_instance + +#Callfunction +generate_doc('http://api.example.com','fake-token',None) + +#Assertions +mock_api_client.assert_called_once_with('http://api.example.com','fake-token') +mock_git_analyzer.assert_called_once_with('/fake/current/dir',mock_api_instance) +mock_git_instance.run.assert_called_once() +#mock_file_analyzer.assert_not_called() +#mock_folder_analyzer.assert_not_called() + + +@patch('penify_hook.git_analyzer.GitDocGenHook') +@patch('penify_hook.folder_analyzer.FolderAnalyzerGenHook') +@patch('penify_hook.api_client.APIClient') +@patch('penify_hook.api_client.APIClient') +deftest_generate_doc_file_location(mock_api_client,mock_folder_analyzer, +mock_file_analyzer,mock_git_analyzer): +"""Testgeneratingadocumentationfilelocation. + +Thisfunctionteststheprocessofgeneratingadocumentationfile +locationusingmockobjectsforAPIclient,folderanalyzer,file +analyzer,andGitanalyzer.Itsetsupthenecessarymocks,callsthe +`generate_doc`functionwithspecifiedparameters,andassertsthatthe +appropriatemethodsonthemockobjectsarecalledasexpected. + +Args: +mock_api_client(MagicMock):MockobjectfortheAPIclient. +mock_folder_analyzer(MagicMock):Mockobjectforthefolderanalyzer. +mock_file_analyzer(MagicMock):Mockobjectforthefileanalyzer. +mock_git_analyzer(MagicMock):MockobjectfortheGitanalyzer. +""" + +#Setup +mock_api_instance=MagicMock() +mock_api_client.return_value=mock_api_instance +mock_file_instance=MagicMock() +mock_file_analyzer.return_value=mock_file_instance + +#Callfunction +generate_doc('http://api.example.com','fake-token','example.py') + +#Assertions +mock_api_client.assert_called_once_with('http://api.example.com','fake-token') +mock_file_analyzer.assert_called_once_with('example.py',mock_api_instance) +mock_file_instance.run.assert_called_once() +mock_git_analyzer.assert_not_called() +mock_folder_analyzer.assert_not_called() + + +@patch('penify_hook.commands.doc_commands.GitDocGenHook') +@patch('penify_hook.commands.doc_commands.FileAnalyzerGenHook') +@patch('penify_hook.commands.doc_commands.FolderAnalyzerGenHook') +@patch('penify_hook.api_client.APIClient') +deftest_generate_doc_folder_location(mock_api_client,mock_folder_analyzer, +mock_file_analyzer,mock_git_analyzer): +"""Testthefunctiontogeneratedocumentationforafolderlocation. + +ItsetsupmockobjectsforAPIclient,folderanalyzer,fileanalyzer, +andGitanalyzer,thencallsthe`generate_doc`functionwithspecified +parameters.Finally,itassertsthatthecorrectmethodsonthemock +objectswerecalledasexpected. + +Args: +mock_api_client(MagicMock):MockobjectfortheAPIclient. +mock_folder_analyzer(MagicMock):Mockobjectforthefolderanalyzer. +mock_file_analyzer(MagicMock):Mockobjectforthefileanalyzer. +mock_git_analyzer(MagicMock):MockobjectfortheGitanalyzer. +""" + +#Setup +mock_api_instance=MagicMock() +mock_api_client.return_value=mock_api_instance +mock_folder_instance=MagicMock() +mock_folder_analyzer.return_value=mock_folder_instance + +#Callfunction +generate_doc('http://api.example.com','fake-token','src') + +#Assertions +mock_api_client.assert_called_once_with('http://api.example.com','fake-token') +mock_folder_analyzer.assert_called_once_with('src',mock_api_instance) +mock_folder_instance.run.assert_called_once() +mock_git_analyzer.assert_not_called() +mock_file_analyzer.assert_not_called() + + +@patch('sys.exit') +@patch('penify_hook.commands.doc_commands.GitDocGenHook') +@patch('penify_hook.api_client.APIClient') +deftest_generate_doc_error_handling(mock_api_client,mock_git_analyzer,mock_exit): +"""Generateadocumentationstringfortheprovidedcodesnippetusing +GoogleDocstringstyle. + +Shortonelinedescription:Testfunctiontoensurepropererror +handlingduringAPIcallswithGitAnalyzer.Multilinelongdescription: +Thistestfunctionisdesignedtoverifythatthegenerate_docfunction +handlesexceptionscorrectlywhenanerroroccursduringAPIinteraction +withGitAnalyzer.ItsetsupamockAPIclientandamockGitanalyzer, +causingtheanalyzertoraiseanexceptiontosimulateafailure +condition.Thefunctionthenassertsthattheexitcodeissetto1when +theerrorhandlingmechanismisinvoked. + +Args: +mock_api_client(MagicMock):AmockobjectsimulatingtheAPIclient. +mock_git_analyzer(MagicMock):AmockobjectsimulatingtheGitanalyzer,configuredtoraisean +exception. +mock_exit(MagicMock):Amockobjectrepresentingtheexitfunction,whichshouldbecalled +withanerrorcode. +""" + +#Setup +mock_api_instance=MagicMock() +mock_api_client.return_value=mock_api_instance +mock_git_analyzer.side_effect=Exception("Testerror") + +#Callfunction +generate_doc('http://api.example.com','fake-token',None) + +#Assertions +mock_exit.assert_called_once_with(1) + + +deftest_setup_docgen_parser(): +"""Testthesetup_docgen_parserfunctiontoensureitproperlyconfigures +theArgumentParserfordocgenoptions. + +Itverifiesthattheparsercorrectlysetsupdocgenoptionsandhandles +differentsubcommandslike'install-hook'and'uninstall-hook'. +""" + +parser=ArgumentParser() +setup_docgen_parser(parser) + +#Checkthatdocgenoptionsareproperlysetup +args=parser.parse_args(['-l','test_location']) +assertargs.location=='test_location' + +#Checkinstall-hooksubcommand +args=parser.parse_args(['install-hook','-l','hook_location']) +assertargs.docgen_subcommand=='install-hook' +assertargs.location=='hook_location' + +#Checkuninstall-hooksubcommand +args=parser.parse_args(['uninstall-hook','-l','hook_location']) +assertargs.docgen_subcommand=='uninstall-hook' +assertargs.location=='hook_location' + + +@patch('penify_hook.commands.doc_commands.install_git_hook') +@patch('penify_hook.commands.doc_commands.uninstall_git_hook') +@patch('penify_hook.commands.doc_commands.generate_doc') +@patch('penify_hook.commands.doc_commands.get_token') +@patch('sys.exit') +deftest_handle_docgen_install_hook(mock_exit,mock_get_token,mock_generate_doc, +mock_uninstall_hook,mock_install_hook): +"""Testthehandlingofthe'install-hook'subcommand. + +Thisfunctionsetsupamockenvironmentwhereitsimulatesthe +executionofthe'install-hook'subcommand.Itverifiesthatthe +`mock_install_hook`iscalledwiththecorrectarguments,while +`mock_generate_doc`and`mock_uninstall_hook`arenotcalled. + +Args: +mock_exit(MagicMock):Mockobjectforsys.exit. +mock_get_token(MagicMock):Mockobjecttosimulatefetchingatoken. +mock_generate_doc(MagicMock):Mockobjecttosimulategeneratingdocumentation. +mock_uninstall_hook(MagicMock):Mockobjecttosimulateuninstallingahook. +mock_install_hook(MagicMock):Mockobjecttosimulateinstallingahook. +""" + +#Setup +mock_get_token.return_value='fake-token' + +#Testinstall-hooksubcommand +args=MagicMock(docgen_subcommand='install-hook',location='hook_location') +handle_docgen(args) +mock_install_hook.assert_called_once_with('hook_location','fake-token') +mock_generate_doc.assert_not_called() +mock_uninstall_hook.assert_not_called() + + +@patch('penify_hook.commands.doc_commands.install_git_hook') +@patch('penify_hook.commands.doc_commands.uninstall_git_hook') +@patch('penify_hook.commands.doc_commands.generate_doc') +@patch('penify_hook.commands.doc_commands.get_token') +@patch('sys.exit') +deftest_handle_docgen_uninstall_hook(mock_exit,mock_get_token,mock_generate_doc, +mock_uninstall_hook,mock_install_hook): +"""Testtheuninstall-hooksubcommandofthehandle_docgenfunction. +Thistestcasesetsupamockenvironmentandverifiesthatthe +uninstall-hookiscalledwiththecorrectlocation,whilegenerate_doc +andinstall_hookarenotcalled. + +Args: +mock_exit(MagicMock):Amockfortheexitfunction. +mock_get_token(MagicMock):Amockfortheget_tokenfunction. +mock_generate_doc(MagicMock):Amockforthegenerate_docfunction. +mock_uninstall_hook(MagicMock):Amockfortheuninstall_hookfunction. +mock_install_hook(MagicMock):Amockfortheinstall_hookfunction. +""" + +#Setup +mock_get_token.return_value='fake-token' + +#Testuninstall-hooksubcommand +args=MagicMock(docgen_subcommand='uninstall-hook',location='hook_location') +handle_docgen(args) +mock_uninstall_hook.assert_called_once_with('hook_location') +mock_generate_doc.assert_not_called() +mock_install_hook.assert_not_called() + + +@patch('penify_hook.commands.doc_commands.install_git_hook') +@patch('penify_hook.commands.doc_commands.uninstall_git_hook') +@patch('penify_hook.commands.doc_commands.generate_doc') +@patch('penify_hook.commands.doc_commands.get_token') +deftest_handle_docgen_generate(mock_get_token,mock_generate_doc, +mock_uninstall_hook,mock_install_hook): +"""Testthedirectdocumentationgenerationfunctionality. + +Thisfunctionteststhe`handle_docgen`functionwhennosubcommandis +provided.Itverifiesthatthedocumentgenerationhookiscalledand +theuninstallandinstallhooksarenotcalled. + +Args: +mock_get_token(MagicMock):Mockedfunctiontogetauthenticationtoken. +mock_generate_doc(MagicMock):Mockedfunctionforgeneratingdocumentation. +mock_uninstall_hook(MagicMock):Mockedfunctionforuninstallingthedocumentgenerationhook. +mock_install_hook(MagicMock):Mockedfunctionforinstallingthedocumentgenerationhook. +""" + +#Setup +mock_get_token.return_value='fake-token' + +#Testdirectdocumentationgeneration +args=MagicMock(docgen_subcommand=None,location='doc_location') +handle_docgen(args) +mock_generate_doc.assert_called_once() +mock_install_hook.assert_not_called() +mock_uninstall_hook.assert_not_called() + + +@patch('penify_hook.commands.doc_commands.get_token') +@patch('sys.exit') +deftest_handle_docgen_no_token(mock_exit,mock_get_token): +"""Testthebehaviorofthe`handle_docgen`functionwhennotokenis +provided. + +Thisfunctionassertsthatifnotokenisreturnedby`mock_get_token`, +the`handle_docgen`functionwillcall`mock_exit`withastatuscodeof +1. + +Args: +mock_exit(MagicMock):AMagicMockobjectsimulatingthe`exit`function. +mock_get_token(MagicMock):AMagicMockobjectsimulatingthe`get_token`function. +""" + +#Testwithnotoken +mock_get_token.return_value=None +args=MagicMock(docgen_subcommand=None,location='doc_location') +handle_docgen(args) +mock_exit.assert_called_once_with(1) + + +@patch('penify_hook.commands.doc_commands.os.getcwd') +@patch('penify_hook.api_client.APIClient') +deftest_generate_doc_with_file_exception(mock_api_client,mock_getcwd): +"""GeneratedocumentationfromaPythonsourcefile. + +ThisfunctionreadsaPythonfileandgeneratesadocstringbasedonits +content.ItusesmockobjectstosimulateAPIcallsanddirectory +operationsduringtesting. + +Args: +mock_api_client(unittest.mock.MagicMock):AmockobjectforsimulatingAPIclientbehavior. +mock_getcwd(unittest.mock.MagicMock):Amockobjectforsimulatingthecurrentworkingdirectoryfunction. +""" + +#Setup +mock_api_client.side_effect=Exception("APIerror") +mock_getcwd.return_value='/fake/current/dir' + +#Testfilelocationwithexception +withpytest.raises(SystemExit): +generate_doc('http://api.example.com','fake-token','example.py') + + +@patch('penify_hook.commands.doc_commands.os.getcwd') +@patch('penify_hook.api_client.APIClient') +deftest_generate_doc_with_folder_exception(mock_api_client,mock_getcwd): +"""GeneratedocumentationfromagivenAPIendpointandsaveittoa +folder. + +ThisfunctionfetchesdatafromthespecifiedAPIendpoint,processes +it,andsavesthegenerateddocumentationintheprovidedfolder.Ifan +erroroccursduringthefetchingprocess,aSystemExitexceptionis +raisedwithanappropriatemessage. + +Args: +api_url(str):TheURLoftheAPIendpointfromwhichdatawillbefetched. +token(str):TheauthenticationtokenrequiredtoaccesstheAPI. +folder_path(str):Thepathtothefolderwherethedocumentationwillbesaved. +""" + +#Setup +mock_api_client.side_effect=Exception("APIerror") +mock_getcwd.return_value='/fake/current/dir' + +#Testfolderlocationwithexception +withpytest.raises(SystemExit): +generate_doc('http://api.example.com','fake-token','src_folder') + + + + diff --git a/docs/xml/test__web__config_8py.xml b/docs/xml/test__web__config_8py.xml new file mode 100644 index 0000000..9482cac --- /dev/null +++ b/docs/xml/test__web__config_8py.xml @@ -0,0 +1,110 @@ + + + + test_web_config.py + tests::test_web_config::TestWebConfig + tests + tests::test_web_config + + + + + +importpytest +importjson +importhttp.server +importthreading +importsocketserver +importtime +fromunittest.mockimportpatch,MagicMock,mock_open +importwebbrowser + +frompenify_hook.commands.config_commandsimportconfig_llm_web,config_jira_web + + +classTestWebConfig: + +@patch('webbrowser.open') +@patch('socketserver.TCPServer') +@patch('pkg_resources.resource_filename') +deftest_config_llm_web_server_setup(self,mock_resource_filename,mock_server,mock_webbrowser): +"""SetupandtestthewebserverconfigurationforanLLM(LargeLanguage +Model)webinterface. + +Thisfunctionconfiguresamockwebserverfortestingpurposes, +includingsettingupresourcefilenames,mockingserverbehavior,and +verifyingthatthewebbrowserisopenedandtheserverstarts +correctly.Thefunctionusesvariousmockstosimulateexternal +dependenciessuchas`resource_filename`and`server`. + +Args: +mock_resource_filename(MagicMock):AMagicMockobjectsimulatingthe`resource_filename`function. +mock_server(MagicMock):AMagicMockobjectsimulatingthecontextmanagerforthewebserver. +mock_webbrowser(MagicMock):AMagicMockobjectsimulatingthe`webbrowser`module. +""" + +#Setupmocks +mock_resource_filename.return_value='mock/template/path' +mock_server_instance=MagicMock() +mock_server.return_value.__enter__.return_value=mock_server_instance + +#Mocktheserve_forevermethodtostopafterbeingcalledonce +defstop_server_after_call(): +mock_server_instance.shutdown() +mock_server_instance.serve_forever.side_effect=stop_server_after_call + +#Callfunctionwithpatchedwebbrowser +withpatch('builtins.print'):#Suppressprintstatements +config_llm_web() + +#Verifywebbrowserwasopened +mock_webbrowser.assert_called_once() +assertmock_webbrowser.call_args[0][0].startswith('http://localhost:') + +#Verifyserverwasstarted +mock_server.assert_called_once() +mock_server_instance.serve_forever.assert_called_once() + +@patch('webbrowser.open') +@patch('socketserver.TCPServer') +@patch('pkg_resources.resource_filename') +deftest_config_jira_web_server_setup(self,mock_resource_filename,mock_server,mock_webbrowser): +"""TesttheconfigurationandsetupofaJIRAwebserver. + +ThisfunctionteststheentireprocessofsettingupaJIRAwebserver, +includingmockingnecessaryresources,configuringtheservertoshut +downafterhandlingonerequest,andverifyingthatthewebbrowseris +openedwiththecorrectURL.Thefunctionusesseveralmockstosimulate +externaldependenciessuchasresourcefiles,servers,andwebbrowsers. + +Args: +mock_resource_filename(MagicMock):AMagicMockobjectforsimulatingthe`resource_filename`function. +mock_server(MagicMock):AMagicMockobjectforsimulatingtheserversetup. +mock_webbrowser(MagicMock):AMagicMockobjectforsimulatingthewebbrowseropening. +""" + +#Setupmocks +mock_resource_filename.return_value='mock/template/path' +mock_server_instance=MagicMock() +mock_server.return_value.__enter__.return_value=mock_server_instance + +#Mocktheserve_forevermethodtostopafterbeingcalledonce +defstop_server_after_call(): +mock_server_instance.shutdown() +mock_server_instance.serve_forever.side_effect=stop_server_after_call + +#Callfunctionwithpatchedwebbrowser +withpatch('builtins.print'):#Suppressprintstatements +config_jira_web() + +#Verifywebbrowserwasopened +mock_webbrowser.assert_called_once() +assertmock_webbrowser.call_args[0][0].startswith('http://localhost:') + +#Verifyserverwasstarted +mock_server.assert_called_once() +mock_server_instance.serve_forever.assert_called_once() + + + + diff --git a/docs/xml/tests_2____init_____8py.xml b/docs/xml/tests_2____init_____8py.xml new file mode 100644 index 0000000..b5fdf08 --- /dev/null +++ b/docs/xml/tests_2____init_____8py.xml @@ -0,0 +1,15 @@ + + + + __init__.py + tests + + + + + +#EmptyfiletomaketestsdirectoryaproperPythonpackage + + + + diff --git a/docs/xml/ui__utils_8py.xml b/docs/xml/ui__utils_8py.xml new file mode 100644 index 0000000..37643e7 --- /dev/null +++ b/docs/xml/ui__utils_8py.xml @@ -0,0 +1,125 @@ + + + + ui_utils.py + penify_hook + penify_hook::ui_utils + + + + + +""" +UIutilitiesforPenifyCLI. + +ThismoduleprovidesutilityfunctionsforconsistentUIformatting, +coloredoutput,andprogressindicatorsacrossthePenifyCLIapplication. +""" +importos +fromcoloramaimportFore,Style,init +fromtqdmimporttqdm + +#Initializecoloramaforcross-platformcoloredterminaloutput +init(autoreset=True) + +#Colorconstantsfordifferentmessagetypes +INFO_COLOR=Fore.CYAN +SUCCESS_COLOR=Fore.GREEN +WARNING_COLOR=Fore.YELLOW +ERROR_COLOR=Fore.RED +HIGHLIGHT_COLOR=Fore.BLUE +NEUTRAL_COLOR=Fore.WHITE + +#Statussymbols +SUCCESS_SYMBOL="✓" +WARNING_SYMBOL="○" +ERROR_SYMBOL="✗" +PROCESSING_SYMBOL="⟳" + +defformat_info(message): +"""Formataninformationalmessagewithappropriatecolor.""" +returnf"{INFO_COLOR}{message}{Style.RESET_ALL}" + +defformat_success(message): +"""Formatsasuccessmessagewithgreencolorandresetstyle.""" +returnf"{SUCCESS_COLOR}{message}{Style.RESET_ALL}" + +defformat_warning(message): +"""Formatawarningmessagewithappropriatecolor.""" +returnf"{WARNING_COLOR}{message}{Style.RESET_ALL}" + +defformat_error(message): +"""Formatanerrormessagewiththespecifiederrorcolor.""" +returnf"{ERROR_COLOR}{message}{Style.RESET_ALL}" + +defformat_highlight(message): +"""Formatahighlightedmessagewithappropriatecolor.""" +returnf"{HIGHLIGHT_COLOR}{message}{Style.RESET_ALL}" + +defformat_file_path(file_path): +"""Formatafilepathwithawarningcolor.""" +returnf"{WARNING_COLOR}{file_path}{Style.RESET_ALL}" + +defprint_info(message): +"""Printsaninformationalmessagewithformatting.""" +print(format_info(message)) + +defprint_success(message): +"""Printsaformattedsuccessmessage.""" +print(format_success(message)) + +defprint_warning(message): +"""Printsawarningmessagewithformattedoutput.""" +print(format_warning(message)) + +defprint_error(message): +"""Printanerrormessagewithappropriateformatting.""" +print(format_error(message)) + +defprint_processing(file_path): +"""Printaprocessingmessageforaspecifiedfile.""" +formatted_path=format_file_path(file_path) +print(f"\n{format_highlight(f'Processingfile:{formatted_path}')}") + +defprint_status(status,message): +"""Printastatusmessagewithanappropriatesymbol.""" +ifstatus=='success': +print(f"{SUCCESS_COLOR}{SUCCESS_SYMBOL}{message}{Style.RESET_ALL}") +elifstatus=='warning': +print(f"{NEUTRAL_COLOR}{WARNING_SYMBOL}{message}{Style.RESET_ALL}") +elifstatus=='error': +print(f"{ERROR_COLOR}{ERROR_SYMBOL}{message}{Style.RESET_ALL}") +else: +print(f"{PROCESSING_SYMBOL}{message}") + +defcreate_progress_bar(total,desc="Processing",unit="item"): +"""Createatqdmprogressbarwithconsistentstyling.""" +returntqdm( +total=total, +desc=format_info(desc), +unit=unit, +ncols=80, +ascii=True +) + +defcreate_stage_progress_bar(stages,desc="Processing"): +"""Createatqdmprogressbarforprocessingstageswithconsistentstyling.""" +pbar=tqdm( +total=len(stages), +desc=format_info(desc), +unit="step", +ncols=80, +ascii=True +) +returnpbar,stages + +defupdate_stage(pbar,stage_name): +#Forcerefreshwithacustomdescriptionandensureit'svisible +"""Updatetheprogressbarwithanewstagename.""" +pbar.set_postfix_str("")#Clearanyexistingpostfix +pbar.set_description_str(f"{format_info(stage_name)}") +pbar.refresh()#Forcerefreshthedisplay + + + + diff --git a/docs/xml/utils_8py.xml b/docs/xml/utils_8py.xml new file mode 100644 index 0000000..3eaad14 --- /dev/null +++ b/docs/xml/utils_8py.xml @@ -0,0 +1,116 @@ + + + + utils.py + penify_hook::utils::GitRepoNotFoundError + penify_hook + penify_hook::utils + + + + + +importlogging +importos +importre + +fromgitimportRepo +logger=logging.getLogger(__name__) + + +classGitRepoNotFoundError(Exception): +pass + + +defget_repo_details(repo:Repo): +"""DeterminethedetailsofarepositoryincludingitsremoteURL,hosting +service,organizationname,andrepositoryname. + +ThisfunctionextractstheremoteURLfromthegivenGitrepositoryobjectand +determinesthehostingservice(e.g.,GitHub,AzureDevOps,Bitbucket,GitLab). +ItthenparsestheURLtoextracttheorganizationnameandrepositoryname.If +theURLdoesnotmatchanyknownhostingservicepattern,itsetsthehosting +serviceas"Unknown".Thefunctionhandlesexceptionsthatmayoccurduring +thisprocessandlogsanerrormessageifneeded. + +Args: +repo(Repo):AGitPythonRepoobjectrepresentingthelocalgitrepository. + +Returns: +dict:Adictionarycontainingtheorganizationname,repositoryname,andhosting +service. +""" +remote_url=None +hosting_service="Unknown" +org_name=None +repo_name=None + +try: +#GettheremoteURL +remote=repo.remotes.origin.url +remote_url=remote + +#DeterminethehostingservicebasedontheURL +if"github.com"inremote: +hosting_service="GITHUB" +match=re.match(r".*github\.com[:/](.*?)/(.*?)(\.git)?$",remote) +elif"dev.azure.com"inremote: +hosting_service="AZUREDEVOPS" +match=re.match(r".*dev\.azure\.com/(.*?)/(.*?)/_git/(.*?)(\.git)?$",remote) +elif"visualstudio.com"inremote: +hosting_service="AZUREDEVOPS" +match=re.match(r".*@(.*?)\.visualstudio\.com/(.*?)/_git/(.*?)(\.git)?$",remote) +elif"bitbucket.org"inremote: +hosting_service="BITBUCKET" +match=re.match(r".*bitbucket\.org[:/](.*?)/(.*?)(\.git)?$",remote) +elif"gitlab.com"inremote: +hosting_service="GITLAB" +match=re.match(r".*gitlab\.com[:/](.*?)/(.*?)(\.git)?$",remote) +else: +hosting_service="UnknownHostingService" +match=None + +ifmatch: +org_name=match.group(1) +repo_name=match.group(2) + +#ForAzureDevOps,adjustthegroupindices +ifhosting_service=="AZUREDEVOPS": +repo_name=match.group(3) + +exceptExceptionase: +logger.error(f"ErrordeterminingGITprovider:{e}") + +return{ +"organization_name":org_name, +"repo_name":repo_name, +"vendor":hosting_service +} + +defrecursive_search_git_folder(folder_path): +"""Recursivelysearchesfora.gitfolderstartingfromthegivendirectory.""" +ifos.path.isdir(folder_path): +if'.git'inos.listdir(folder_path): +returnfolder_path +#reachedtherootofthefilesystem +eliffolder_path==os.path.dirname(folder_path): +returnNone +else: +returnrecursive_search_git_folder(os.path.dirname(folder_path)) + +deffind_git_parent(path): + +"""Traverseupfromthegivenpathtofindthenearestdirectorycontaininga.git +subdirectory.""" +current_dir=os.path.abspath(path) + +whilecurrent_dir!=os.path.dirname(current_dir):#Traverseuptotherootdirectory +ifos.path.isdir(os.path.join(current_dir,".git")): +returncurrent_dir#Returntheparentfoldercontainingthe.gitdirectory +current_dir=os.path.dirname(current_dir) + +raiseGitRepoNotFoundError(f"NoGitrepositoryfoundinthepathoranyofitsparentdirectories:{path}") + + + + diff --git a/docs/xml/xml.xsd b/docs/xml/xml.xsd new file mode 100644 index 0000000..9f80fe1 --- /dev/null +++ b/docs/xml/xml.xsd @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + +