GyuhoLee

[Add] Flask로 서버 구현

Showing 1000 changed files with 2020 additions and 40 deletions

Too many changes to show.

To preserve performance only 1000 of 1000+ files are displayed.

1 <?xml version="1.0" encoding="UTF-8"?> 1 <?xml version="1.0" encoding="UTF-8"?>
2 <project version="4"> 2 <project version="4">
3 <component name="ProjectRootManager" version="2" project-jdk-name="Python 3.8" project-jdk-type="Python SDK" /> 3 <component name="ProjectRootManager" version="2" project-jdk-name="Python 3.8" project-jdk-type="Python SDK" />
4 + <component name="PyCharmProfessionalAdvertiser">
5 + <option name="shown" value="true" />
6 + </component>
4 </project> 7 </project>
...\ No newline at end of file ...\ No newline at end of file
......
...@@ -20,6 +20,10 @@ ...@@ -20,6 +20,10 @@
20 </component> 20 </component>
21 <component name="ChangeListManager"> 21 <component name="ChangeListManager">
22 <list default="true" id="b9decb0c-dc9e-4239-bdad-09ea8dd5179d" name="Default Changelist" comment=""> 22 <list default="true" id="b9decb0c-dc9e-4239-bdad-09ea8dd5179d" name="Default Changelist" comment="">
23 + <change beforePath="$PROJECT_DIR$/.idea/misc.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/misc.xml" afterDir="false" />
24 + <change beforePath="$PROJECT_DIR$/.idea/workspace.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/workspace.xml" afterDir="false" />
25 + <change beforePath="$PROJECT_DIR$/index.html" beforeDir="false" />
26 + <change beforePath="$PROJECT_DIR$/style.css" beforeDir="false" />
23 <change beforePath="$PROJECT_DIR$/subtitle.py" beforeDir="false" afterPath="$PROJECT_DIR$/subtitle.py" afterDir="false" /> 27 <change beforePath="$PROJECT_DIR$/subtitle.py" beforeDir="false" afterPath="$PROJECT_DIR$/subtitle.py" afterDir="false" />
24 </list> 28 </list>
25 <option name="SHOW_DIALOG" value="false" /> 29 <option name="SHOW_DIALOG" value="false" />
...@@ -31,6 +35,7 @@ ...@@ -31,6 +35,7 @@
31 <option name="RECENT_TEMPLATES"> 35 <option name="RECENT_TEMPLATES">
32 <list> 36 <list>
33 <option value="Python Script" /> 37 <option value="Python Script" />
38 + <option value="HTML File" />
34 </list> 39 </list>
35 </option> 40 </option>
36 </component> 41 </component>
...@@ -45,11 +50,33 @@ ...@@ -45,11 +50,33 @@
45 </component> 50 </component>
46 <component name="PropertiesComponent"> 51 <component name="PropertiesComponent">
47 <property name="ASKED_SHARE_PROJECT_CONFIGURATION_FILES" value="true" /> 52 <property name="ASKED_SHARE_PROJECT_CONFIGURATION_FILES" value="true" />
53 + <property name="DefaultHtmlFileTemplate" value="HTML File" />
48 <property name="RunOnceActivity.OpenProjectViewOnStart" value="true" /> 54 <property name="RunOnceActivity.OpenProjectViewOnStart" value="true" />
49 <property name="last_opened_file_path" value="$PROJECT_DIR$" /> 55 <property name="last_opened_file_path" value="$PROJECT_DIR$" />
50 <property name="settings.editor.selected.configurable" value="com.jetbrains.python.configuration.PyActiveSdkModuleConfigurable" /> 56 <property name="settings.editor.selected.configurable" value="com.jetbrains.python.configuration.PyActiveSdkModuleConfigurable" />
51 </component> 57 </component>
52 - <component name="RunManager"> 58 + <component name="RunManager" selected="Python.app">
59 + <configuration name="app" type="PythonConfigurationType" factoryName="Python" temporary="true" nameIsGenerated="true">
60 + <module name="src" />
61 + <option name="INTERPRETER_OPTIONS" value="" />
62 + <option name="PARENT_ENVS" value="true" />
63 + <envs>
64 + <env name="PYTHONUNBUFFERED" value="1" />
65 + </envs>
66 + <option name="SDK_HOME" value="" />
67 + <option name="WORKING_DIRECTORY" value="$PROJECT_DIR$" />
68 + <option name="IS_MODULE_SDK" value="true" />
69 + <option name="ADD_CONTENT_ROOTS" value="true" />
70 + <option name="ADD_SOURCE_ROOTS" value="true" />
71 + <option name="SCRIPT_NAME" value="$PROJECT_DIR$/app.py" />
72 + <option name="PARAMETERS" value="" />
73 + <option name="SHOW_COMMAND_LINE" value="false" />
74 + <option name="EMULATE_TERMINAL" value="false" />
75 + <option name="MODULE_MODE" value="false" />
76 + <option name="REDIRECT_INPUT" value="false" />
77 + <option name="INPUT_FILE" value="" />
78 + <method v="2" />
79 + </configuration>
53 <configuration name="subtitle" type="PythonConfigurationType" factoryName="Python" temporary="true" nameIsGenerated="true"> 80 <configuration name="subtitle" type="PythonConfigurationType" factoryName="Python" temporary="true" nameIsGenerated="true">
54 <module name="src" /> 81 <module name="src" />
55 <option name="INTERPRETER_OPTIONS" value="" /> 82 <option name="INTERPRETER_OPTIONS" value="" />
...@@ -73,6 +100,7 @@ ...@@ -73,6 +100,7 @@
73 </configuration> 100 </configuration>
74 <recent_temporary> 101 <recent_temporary>
75 <list> 102 <list>
103 + <item itemvalue="Python.app" />
76 <item itemvalue="Python.subtitle" /> 104 <item itemvalue="Python.subtitle" />
77 </list> 105 </list>
78 </recent_temporary> 106 </recent_temporary>
...@@ -105,25 +133,25 @@ ...@@ -105,25 +133,25 @@
105 <screen x="0" y="0" width="1920" height="1040" /> 133 <screen x="0" y="0" width="1920" height="1040" />
106 </state> 134 </state>
107 <state x="740" y="275" key="FileChooserDialogImpl/0.0.1920.1040/1920.0.1920.1040@0.0.1920.1040" timestamp="1604836455343" /> 135 <state x="740" y="275" key="FileChooserDialogImpl/0.0.1920.1040/1920.0.1920.1040@0.0.1920.1040" timestamp="1604836455343" />
108 - <state width="1899" height="282" key="GridCell.Tab.0.bottom" timestamp="1607071806698"> 136 + <state width="1899" height="282" key="GridCell.Tab.0.bottom" timestamp="1607247311462">
109 <screen x="0" y="0" width="1920" height="1040" /> 137 <screen x="0" y="0" width="1920" height="1040" />
110 </state> 138 </state>
111 - <state width="1899" height="282" key="GridCell.Tab.0.bottom/0.0.1920.1040/1920.0.1920.1040@0.0.1920.1040" timestamp="1607071806698" /> 139 + <state width="1899" height="282" key="GridCell.Tab.0.bottom/0.0.1920.1040/1920.0.1920.1040@0.0.1920.1040" timestamp="1607247311462" />
112 <state width="1899" height="282" key="GridCell.Tab.0.bottom/0.0.1920.1040/1920.0.1920.1040@1920.0.1920.1040" timestamp="1604306110978" /> 140 <state width="1899" height="282" key="GridCell.Tab.0.bottom/0.0.1920.1040/1920.0.1920.1040@1920.0.1920.1040" timestamp="1604306110978" />
113 - <state width="1899" height="282" key="GridCell.Tab.0.center" timestamp="1607071806698"> 141 + <state width="1899" height="282" key="GridCell.Tab.0.center" timestamp="1607247311461">
114 <screen x="0" y="0" width="1920" height="1040" /> 142 <screen x="0" y="0" width="1920" height="1040" />
115 </state> 143 </state>
116 - <state width="1899" height="282" key="GridCell.Tab.0.center/0.0.1920.1040/1920.0.1920.1040@0.0.1920.1040" timestamp="1607071806698" /> 144 + <state width="1899" height="282" key="GridCell.Tab.0.center/0.0.1920.1040/1920.0.1920.1040@0.0.1920.1040" timestamp="1607247311461" />
117 <state width="1899" height="282" key="GridCell.Tab.0.center/0.0.1920.1040/1920.0.1920.1040@1920.0.1920.1040" timestamp="1604306110978" /> 145 <state width="1899" height="282" key="GridCell.Tab.0.center/0.0.1920.1040/1920.0.1920.1040@1920.0.1920.1040" timestamp="1604306110978" />
118 - <state width="1899" height="282" key="GridCell.Tab.0.left" timestamp="1607071806698"> 146 + <state width="1899" height="282" key="GridCell.Tab.0.left" timestamp="1607247311461">
119 <screen x="0" y="0" width="1920" height="1040" /> 147 <screen x="0" y="0" width="1920" height="1040" />
120 </state> 148 </state>
121 - <state width="1899" height="282" key="GridCell.Tab.0.left/0.0.1920.1040/1920.0.1920.1040@0.0.1920.1040" timestamp="1607071806698" /> 149 + <state width="1899" height="282" key="GridCell.Tab.0.left/0.0.1920.1040/1920.0.1920.1040@0.0.1920.1040" timestamp="1607247311461" />
122 <state width="1899" height="282" key="GridCell.Tab.0.left/0.0.1920.1040/1920.0.1920.1040@1920.0.1920.1040" timestamp="1604306110978" /> 150 <state width="1899" height="282" key="GridCell.Tab.0.left/0.0.1920.1040/1920.0.1920.1040@1920.0.1920.1040" timestamp="1604306110978" />
123 - <state width="1899" height="282" key="GridCell.Tab.0.right" timestamp="1607071806698"> 151 + <state width="1899" height="282" key="GridCell.Tab.0.right" timestamp="1607247311462">
124 <screen x="0" y="0" width="1920" height="1040" /> 152 <screen x="0" y="0" width="1920" height="1040" />
125 </state> 153 </state>
126 - <state width="1899" height="282" key="GridCell.Tab.0.right/0.0.1920.1040/1920.0.1920.1040@0.0.1920.1040" timestamp="1607071806698" /> 154 + <state width="1899" height="282" key="GridCell.Tab.0.right/0.0.1920.1040/1920.0.1920.1040@0.0.1920.1040" timestamp="1607247311462" />
127 <state width="1899" height="282" key="GridCell.Tab.0.right/0.0.1920.1040/1920.0.1920.1040@1920.0.1920.1040" timestamp="1604306110978" /> 155 <state width="1899" height="282" key="GridCell.Tab.0.right/0.0.1920.1040/1920.0.1920.1040@1920.0.1920.1040" timestamp="1604306110978" />
128 <state x="2381" y="164" key="SettingsEditor" timestamp="1604303734485"> 156 <state x="2381" y="164" key="SettingsEditor" timestamp="1604303734485">
129 <screen x="1920" y="0" width="1920" height="1040" /> 157 <screen x="1920" y="0" width="1920" height="1040" />
......
No preview for this file type
1 +from flask import Flask, render_template, request
2 +import subtitle
3 +
4 +app = Flask(__name__)
5 +
6 +@app.route('/')
7 +def home():
8 + return render_template("index.html")
9 +
10 +@app.route('/result', methods =['POST', 'GET'])
11 +def result():
12 + if request.method == 'POST':
13 + req = request.form
14 + res = subtitle.subTitle(req['Url'], int(req['Zip']))
15 + return render_template("result.html", result = res)
16 +
17 +if __name__ == '__main__':
18 + app.run(debug=True)
...\ No newline at end of file ...\ No newline at end of file
1 -#container{
2 - margin-left: 30%;
3 - text-align: left;
4 -}
5 -
6 -#subtitle{
7 - font-size: 20px;
8 -}
9 -
10 -a, a:link, a:visited, a:active, a:hover{
11 - text-decoration: none;
12 -}
...\ No newline at end of file ...\ No newline at end of file
...@@ -11,10 +11,8 @@ def komoran_tokenize(sent): ...@@ -11,10 +11,8 @@ def komoran_tokenize(sent):
11 words = [w for w in words if ('/NN' in w or '/XR' in w or '/VA' in w or '/VV' in w)] 11 words = [w for w in words if ('/NN' in w or '/XR' in w or '/VA' in w or '/VV' in w)]
12 return words 12 return words
13 13
14 -def subtitle(video_url, topk_size): 14 +def subTitle(video_url, topk_size):
15 #youtube url의 자막 -> xml으로 가져오기 15 #youtube url의 자막 -> xml으로 가져오기
16 - topk_size = 30
17 - video_url = 'https://www.youtube.com/watch?v=ecUWKU_v318'
18 yt = YouTube(video_url) 16 yt = YouTube(video_url)
19 title = yt.title 17 title = yt.title
20 description = yt.description 18 description = yt.description
...@@ -28,7 +26,7 @@ def subtitle(video_url, topk_size): ...@@ -28,7 +26,7 @@ def subtitle(video_url, topk_size):
28 for child in root.findall("text"): 26 for child in root.findall("text"):
29 text = child.text.replace('\n', ' ') 27 text = child.text.replace('\n', ' ')
30 texts.append(text) 28 texts.append(text)
31 - topk_size = texts.size() * 100 // topk_size 29 + topk_size = len(texts) * topk_size // 100
32 30
33 #Komoran을 통해 형태소 단위로 분리 후 태깅 31 #Komoran을 통해 형태소 단위로 분리 후 태깅
34 komoran = Komoran('STABLE') 32 komoran = Komoran('STABLE')
...@@ -53,14 +51,14 @@ def subtitle(video_url, topk_size): ...@@ -53,14 +51,14 @@ def subtitle(video_url, topk_size):
53 bias[0] = 5 51 bias[0] = 5
54 keysents = summarizer.summarize(texts, topk=topk_size, bias=bias) 52 keysents = summarizer.summarize(texts, topk=topk_size, bias=bias)
55 keysents.sort(key=itemgetter(0)) 53 keysents.sort(key=itemgetter(0))
56 - first = True 54 + First = True
57 - ret = '' 55 + ret1 = ''
56 + ret2 = ''
58 for _, _, sent in keysents: 57 for _, _, sent in keysents:
59 sent = sent.replace('&#39;', "'") 58 sent = sent.replace('&#39;', "'")
60 - ret = ret + sent 59 + if First:
61 - if first: 60 + ret1 = sent
62 - ret += '\n' 61 + First = False
63 - first = False
64 else: 62 else:
65 - ret += ' ' 63 + ret2 = ret2 + sent + ' '
66 - return ret; 64 + return [ret1, ret2]
......
1 1
2 <!DOCTYPE html> 2 <!DOCTYPE html>
3 -<html lang="ko"> 3 +<html lang="en">
4 <head> 4 <head>
5 <title>유튜브 자막 요약기</title> 5 <title>유튜브 자막 요약기</title>
6 <meta charset="utf-8" /> 6 <meta charset="utf-8" />
7 </head> 7 </head>
8 - <link rel="stylesheet" href="style.css">
9 <body> 8 <body>
10 - <div id="container"> 9 + <div id="container" style="margin-left: 10%;">
11 <h1>유튜브 자막 요약기</h1> 10 <h1>유튜브 자막 요약기</h1>
12 <div id="subtitle"> 11 <div id="subtitle">
13 <div>만든이 : 이규호</div> 12 <div>만든이 : 이규호</div>
14 <a href="https://github.com/GyuhoLee/youtube_summary" target="_blank">github 바로가기</a> 13 <a href="https://github.com/GyuhoLee/youtube_summary" target="_blank">github 바로가기</a>
15 <br><br> 14 <br><br>
16 <div id="desc">요약할 유튜브 영상의 URL과 압축률을 입력해주세요.</div> 15 <div id="desc">요약할 유튜브 영상의 URL과 압축률을 입력해주세요.</div>
17 - </div><br><br> 16 + </div><br>
18 - <form action="/" method="post"> 17 + <form action="http://127.0.0.1:5000/result" method="POST">
19 <label for="url"> URL :</label> 18 <label for="url"> URL :</label>
20 - <input type="text" name="url" placeholder="유튜브 url 입력" style="width:40%; height:40px;"/><br><br> 19 + <input type="text" name="Url" placeholder="유튜브 url 입력" style="width:40%; height:40px;"/><br><br>
21 <label for="zip"> 압축률 :</label> 20 <label for="zip"> 압축률 :</label>
22 - <input type="text" name="zip" placeholder="압축률(%) 입력" style="width:10%; height:30px;"/> 21 + <input type="text" name="Zip" placeholder="압축률(%) 입력" style="width:10%; height:30px;"/>
23 <input type="submit" value="요약하기" style="height:30px; width:7%;"></inpout> 22 <input type="submit" value="요약하기" style="height:30px; width:7%;"></inpout>
24 </form> 23 </form>
25 </div> 24 </div>
......
1 +
2 +<!DOCTYPE html>
3 +<html lang="en">
4 + <head>
5 + <title>유튜브 자막 요약 결과</title>
6 +<meta charset="utf-8" />
7 + </head>
8 + <body>
9 + <div id="container" style="margin-left: 10%; margin-right: 20%">
10 + <h1>유튜브 자막 요약 결과</h1>
11 + <br><br>
12 + <h4>{{ result[0] }}</h4>
13 + {{ result[1] }}
14 +
15 + </div>
16 + </body>
17 +</html>
1 +Copyright 2010 Pallets
2 +
3 +Redistribution and use in source and binary forms, with or without
4 +modification, are permitted provided that the following conditions are
5 +met:
6 +
7 +1. Redistributions of source code must retain the above copyright
8 + notice, this list of conditions and the following disclaimer.
9 +
10 +2. Redistributions in binary form must reproduce the above copyright
11 + notice, this list of conditions and the following disclaimer in the
12 + documentation and/or other materials provided with the distribution.
13 +
14 +3. Neither the name of the copyright holder nor the names of its
15 + contributors may be used to endorse or promote products derived from
16 + this software without specific prior written permission.
17 +
18 +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
19 +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
20 +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
21 +PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
22 +HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
23 +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
24 +TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
25 +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
26 +LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
27 +NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
28 +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
1 +Metadata-Version: 2.1
2 +Name: Flask
3 +Version: 1.1.2
4 +Summary: A simple framework for building complex web applications.
5 +Home-page: https://palletsprojects.com/p/flask/
6 +Author: Armin Ronacher
7 +Author-email: armin.ronacher@active-4.com
8 +Maintainer: Pallets
9 +Maintainer-email: contact@palletsprojects.com
10 +License: BSD-3-Clause
11 +Project-URL: Documentation, https://flask.palletsprojects.com/
12 +Project-URL: Code, https://github.com/pallets/flask
13 +Project-URL: Issue tracker, https://github.com/pallets/flask/issues
14 +Platform: UNKNOWN
15 +Classifier: Development Status :: 5 - Production/Stable
16 +Classifier: Environment :: Web Environment
17 +Classifier: Framework :: Flask
18 +Classifier: Intended Audience :: Developers
19 +Classifier: License :: OSI Approved :: BSD License
20 +Classifier: Operating System :: OS Independent
21 +Classifier: Programming Language :: Python
22 +Classifier: Programming Language :: Python :: 2
23 +Classifier: Programming Language :: Python :: 2.7
24 +Classifier: Programming Language :: Python :: 3
25 +Classifier: Programming Language :: Python :: 3.5
26 +Classifier: Programming Language :: Python :: 3.6
27 +Classifier: Programming Language :: Python :: 3.7
28 +Classifier: Programming Language :: Python :: 3.8
29 +Classifier: Programming Language :: Python :: Implementation :: CPython
30 +Classifier: Programming Language :: Python :: Implementation :: PyPy
31 +Classifier: Topic :: Internet :: WWW/HTTP :: Dynamic Content
32 +Classifier: Topic :: Internet :: WWW/HTTP :: WSGI :: Application
33 +Classifier: Topic :: Software Development :: Libraries :: Application Frameworks
34 +Classifier: Topic :: Software Development :: Libraries :: Python Modules
35 +Requires-Python: >=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*
36 +Requires-Dist: Werkzeug (>=0.15)
37 +Requires-Dist: Jinja2 (>=2.10.1)
38 +Requires-Dist: itsdangerous (>=0.24)
39 +Requires-Dist: click (>=5.1)
40 +Provides-Extra: dev
41 +Requires-Dist: pytest ; extra == 'dev'
42 +Requires-Dist: coverage ; extra == 'dev'
43 +Requires-Dist: tox ; extra == 'dev'
44 +Requires-Dist: sphinx ; extra == 'dev'
45 +Requires-Dist: pallets-sphinx-themes ; extra == 'dev'
46 +Requires-Dist: sphinxcontrib-log-cabinet ; extra == 'dev'
47 +Requires-Dist: sphinx-issues ; extra == 'dev'
48 +Provides-Extra: docs
49 +Requires-Dist: sphinx ; extra == 'docs'
50 +Requires-Dist: pallets-sphinx-themes ; extra == 'docs'
51 +Requires-Dist: sphinxcontrib-log-cabinet ; extra == 'docs'
52 +Requires-Dist: sphinx-issues ; extra == 'docs'
53 +Provides-Extra: dotenv
54 +Requires-Dist: python-dotenv ; extra == 'dotenv'
55 +
56 +Flask
57 +=====
58 +
59 +Flask is a lightweight `WSGI`_ web application framework. It is designed
60 +to make getting started quick and easy, with the ability to scale up to
61 +complex applications. It began as a simple wrapper around `Werkzeug`_
62 +and `Jinja`_ and has become one of the most popular Python web
63 +application frameworks.
64 +
65 +Flask offers suggestions, but doesn't enforce any dependencies or
66 +project layout. It is up to the developer to choose the tools and
67 +libraries they want to use. There are many extensions provided by the
68 +community that make adding new functionality easy.
69 +
70 +
71 +Installing
72 +----------
73 +
74 +Install and update using `pip`_:
75 +
76 +.. code-block:: text
77 +
78 + pip install -U Flask
79 +
80 +
81 +A Simple Example
82 +----------------
83 +
84 +.. code-block:: python
85 +
86 + from flask import Flask
87 +
88 + app = Flask(__name__)
89 +
90 + @app.route("/")
91 + def hello():
92 + return "Hello, World!"
93 +
94 +.. code-block:: text
95 +
96 + $ env FLASK_APP=hello.py flask run
97 + * Serving Flask app "hello"
98 + * Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
99 +
100 +
101 +Contributing
102 +------------
103 +
104 +For guidance on setting up a development environment and how to make a
105 +contribution to Flask, see the `contributing guidelines`_.
106 +
107 +.. _contributing guidelines: https://github.com/pallets/flask/blob/master/CONTRIBUTING.rst
108 +
109 +
110 +Donate
111 +------
112 +
113 +The Pallets organization develops and supports Flask and the libraries
114 +it uses. In order to grow the community of contributors and users, and
115 +allow the maintainers to devote more time to the projects, `please
116 +donate today`_.
117 +
118 +.. _please donate today: https://psfmember.org/civicrm/contribute/transact?reset=1&id=20
119 +
120 +
121 +Links
122 +-----
123 +
124 +* Website: https://palletsprojects.com/p/flask/
125 +* Documentation: https://flask.palletsprojects.com/
126 +* Releases: https://pypi.org/project/Flask/
127 +* Code: https://github.com/pallets/flask
128 +* Issue tracker: https://github.com/pallets/flask/issues
129 +* Test status: https://dev.azure.com/pallets/flask/_build
130 +* Official chat: https://discord.gg/t6rrQZH
131 +
132 +.. _WSGI: https://wsgi.readthedocs.io
133 +.. _Werkzeug: https://www.palletsprojects.com/p/werkzeug/
134 +.. _Jinja: https://www.palletsprojects.com/p/jinja/
135 +.. _pip: https://pip.pypa.io/en/stable/quickstart/
136 +
137 +
1 +../../Scripts/flask.exe,sha256=crX1FXqR6qv685jlJx2II5eveFwhxnA7gTRlZPl6xYM,97121
2 +Flask-1.1.2.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4
3 +Flask-1.1.2.dist-info/LICENSE.rst,sha256=SJqOEQhQntmKN7uYPhHg9-HTHwvY-Zp5yESOf_N9B-o,1475
4 +Flask-1.1.2.dist-info/METADATA,sha256=3INpPWH6nKfZ33R2N-bQZy4TOe1wQCMweZc9mwcNrtc,4591
5 +Flask-1.1.2.dist-info/RECORD,,
6 +Flask-1.1.2.dist-info/WHEEL,sha256=8zNYZbwQSXoB9IfXOjPfeNwvAsALAjffgk27FqvCWbo,110
7 +Flask-1.1.2.dist-info/entry_points.txt,sha256=gBLA1aKg0OYR8AhbAfg8lnburHtKcgJLDU52BBctN0k,42
8 +Flask-1.1.2.dist-info/top_level.txt,sha256=dvi65F6AeGWVU0TBpYiC04yM60-FX1gJFkK31IKQr5c,6
9 +flask/__init__.py,sha256=YnA9wkwbJcnb_jTT-nMsMFeFE_UWt33khKzdHmMSuyI,1894
10 +flask/__main__.py,sha256=fjVtt3QTANXlpJCOv3Ha7d5H-76MwzSIOab7SFD9TEk,254
11 +flask/__pycache__/__init__.cpython-38.pyc,,
12 +flask/__pycache__/__main__.cpython-38.pyc,,
13 +flask/__pycache__/_compat.cpython-38.pyc,,
14 +flask/__pycache__/app.cpython-38.pyc,,
15 +flask/__pycache__/blueprints.cpython-38.pyc,,
16 +flask/__pycache__/cli.cpython-38.pyc,,
17 +flask/__pycache__/config.cpython-38.pyc,,
18 +flask/__pycache__/ctx.cpython-38.pyc,,
19 +flask/__pycache__/debughelpers.cpython-38.pyc,,
20 +flask/__pycache__/globals.cpython-38.pyc,,
21 +flask/__pycache__/helpers.cpython-38.pyc,,
22 +flask/__pycache__/logging.cpython-38.pyc,,
23 +flask/__pycache__/sessions.cpython-38.pyc,,
24 +flask/__pycache__/signals.cpython-38.pyc,,
25 +flask/__pycache__/templating.cpython-38.pyc,,
26 +flask/__pycache__/testing.cpython-38.pyc,,
27 +flask/__pycache__/views.cpython-38.pyc,,
28 +flask/__pycache__/wrappers.cpython-38.pyc,,
29 +flask/_compat.py,sha256=8KPT54Iig96TuLipdogLRHNYToIcg-xPhnSV5VRERnw,4099
30 +flask/app.py,sha256=tmEhx_XrIRP24vZg39dHMWFzJ2jj-YxIcd51LaIT5cE,98059
31 +flask/blueprints.py,sha256=vkdm8NusGsfZUeIfPdCluj733QFmiQcT4Sk1tuZLUjw,21400
32 +flask/cli.py,sha256=SIb22uq9wYBeB2tKMl0pYdhtZ1MAQyZtPL-3m6es4G0,31035
33 +flask/config.py,sha256=3dejvQRYfNHw_V7dCLMxU8UNFpL34xIKemN7gHZIZ8Y,10052
34 +flask/ctx.py,sha256=cks-omGedkxawHFo6bKIrdOHsJCAgg1i_NWw_htxb5U,16724
35 +flask/debughelpers.py,sha256=-whvPKuAoU8AZ9c1z_INuOeBgfYDqE1J2xNBsoriugU,6475
36 +flask/globals.py,sha256=OgcHb6_NCyX6-TldciOdKcyj4PNfyQwClxdMhvov6aA,1637
37 +flask/helpers.py,sha256=IHa578HU_3XAAo1wpXQv24MYRYO5TzaiDQQwvUIcE6Q,43074
38 +flask/json/__init__.py,sha256=6nITbZYiYOPB8Qfi1-dvsblwn01KRz8VOsMBIZyaYek,11988
39 +flask/json/__pycache__/__init__.cpython-38.pyc,,
40 +flask/json/__pycache__/tag.cpython-38.pyc,,
41 +flask/json/tag.py,sha256=vq9GOllg_0kTWKuVFrwmkeOQzR-jdBD23x-89JyCCQI,8306
42 +flask/logging.py,sha256=WcY5UkqTysGfmosyygSlXyZYGwOp3y-VsE6ehoJ48dk,3250
43 +flask/sessions.py,sha256=G0KsEkr_i1LG_wOINwFSOW3ts7Xbv4bNgEZKc7TRloc,14360
44 +flask/signals.py,sha256=yYLOed2x8WnQ7pirGalQYfpYpCILJ0LJhmNSrnWvjqw,2212
45 +flask/templating.py,sha256=F8E_IZXn9BGsjMzUJ5N_ACMyZdiFBp_SSEaUunvfZ7g,4939
46 +flask/testing.py,sha256=WXsciCQbHBP7xjHqNvOA4bT0k86GvSNpgzncfXLDEEg,10146
47 +flask/views.py,sha256=eeWnadLAj0QdQPLtjKipDetRZyG62CT2y7fNOFDJz0g,5802
48 +flask/wrappers.py,sha256=kgsvtZuMM6RQaDqhRbc5Pcj9vqTnaERl2pmXcdGL7LU,4736
1 +Wheel-Version: 1.0
2 +Generator: bdist_wheel (0.33.6)
3 +Root-Is-Purelib: true
4 +Tag: py2-none-any
5 +Tag: py3-none-any
6 +
1 +[console_scripts]
2 +flask = flask.cli:main
3 +
1 +Copyright 2007 Pallets
2 +
3 +Redistribution and use in source and binary forms, with or without
4 +modification, are permitted provided that the following conditions are
5 +met:
6 +
7 +1. Redistributions of source code must retain the above copyright
8 + notice, this list of conditions and the following disclaimer.
9 +
10 +2. Redistributions in binary form must reproduce the above copyright
11 + notice, this list of conditions and the following disclaimer in the
12 + documentation and/or other materials provided with the distribution.
13 +
14 +3. Neither the name of the copyright holder nor the names of its
15 + contributors may be used to endorse or promote products derived from
16 + this software without specific prior written permission.
17 +
18 +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
19 +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
20 +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
21 +PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
22 +HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
23 +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
24 +TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
25 +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
26 +LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
27 +NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
28 +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
1 +Metadata-Version: 2.1
2 +Name: Jinja2
3 +Version: 2.11.2
4 +Summary: A very fast and expressive template engine.
5 +Home-page: https://palletsprojects.com/p/jinja/
6 +Author: Armin Ronacher
7 +Author-email: armin.ronacher@active-4.com
8 +Maintainer: Pallets
9 +Maintainer-email: contact@palletsprojects.com
10 +License: BSD-3-Clause
11 +Project-URL: Documentation, https://jinja.palletsprojects.com/
12 +Project-URL: Code, https://github.com/pallets/jinja
13 +Project-URL: Issue tracker, https://github.com/pallets/jinja/issues
14 +Platform: UNKNOWN
15 +Classifier: Development Status :: 5 - Production/Stable
16 +Classifier: Environment :: Web Environment
17 +Classifier: Intended Audience :: Developers
18 +Classifier: License :: OSI Approved :: BSD License
19 +Classifier: Operating System :: OS Independent
20 +Classifier: Programming Language :: Python
21 +Classifier: Programming Language :: Python :: 2
22 +Classifier: Programming Language :: Python :: 2.7
23 +Classifier: Programming Language :: Python :: 3
24 +Classifier: Programming Language :: Python :: 3.5
25 +Classifier: Programming Language :: Python :: 3.6
26 +Classifier: Programming Language :: Python :: 3.7
27 +Classifier: Programming Language :: Python :: 3.8
28 +Classifier: Programming Language :: Python :: Implementation :: CPython
29 +Classifier: Programming Language :: Python :: Implementation :: PyPy
30 +Classifier: Topic :: Internet :: WWW/HTTP :: Dynamic Content
31 +Classifier: Topic :: Software Development :: Libraries :: Python Modules
32 +Classifier: Topic :: Text Processing :: Markup :: HTML
33 +Requires-Python: >=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*
34 +Description-Content-Type: text/x-rst
35 +Requires-Dist: MarkupSafe (>=0.23)
36 +Provides-Extra: i18n
37 +Requires-Dist: Babel (>=0.8) ; extra == 'i18n'
38 +
39 +Jinja
40 +=====
41 +
42 +Jinja is a fast, expressive, extensible templating engine. Special
43 +placeholders in the template allow writing code similar to Python
44 +syntax. Then the template is passed data to render the final document.
45 +
46 +It includes:
47 +
48 +- Template inheritance and inclusion.
49 +- Define and import macros within templates.
50 +- HTML templates can use autoescaping to prevent XSS from untrusted
51 + user input.
52 +- A sandboxed environment can safely render untrusted templates.
53 +- AsyncIO support for generating templates and calling async
54 + functions.
55 +- I18N support with Babel.
56 +- Templates are compiled to optimized Python code just-in-time and
57 + cached, or can be compiled ahead-of-time.
58 +- Exceptions point to the correct line in templates to make debugging
59 + easier.
60 +- Extensible filters, tests, functions, and even syntax.
61 +
62 +Jinja's philosophy is that while application logic belongs in Python if
63 +possible, it shouldn't make the template designer's job difficult by
64 +restricting functionality too much.
65 +
66 +
67 +Installing
68 +----------
69 +
70 +Install and update using `pip`_:
71 +
72 +.. code-block:: text
73 +
74 + $ pip install -U Jinja2
75 +
76 +.. _pip: https://pip.pypa.io/en/stable/quickstart/
77 +
78 +
79 +In A Nutshell
80 +-------------
81 +
82 +.. code-block:: jinja
83 +
84 + {% extends "base.html" %}
85 + {% block title %}Members{% endblock %}
86 + {% block content %}
87 + <ul>
88 + {% for user in users %}
89 + <li><a href="{{ user.url }}">{{ user.username }}</a></li>
90 + {% endfor %}
91 + </ul>
92 + {% endblock %}
93 +
94 +
95 +Links
96 +-----
97 +
98 +- Website: https://palletsprojects.com/p/jinja/
99 +- Documentation: https://jinja.palletsprojects.com/
100 +- Releases: https://pypi.org/project/Jinja2/
101 +- Code: https://github.com/pallets/jinja
102 +- Issue tracker: https://github.com/pallets/jinja/issues
103 +- Test status: https://dev.azure.com/pallets/jinja/_build
104 +- Official chat: https://discord.gg/t6rrQZH
105 +
106 +
1 +Jinja2-2.11.2.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4
2 +Jinja2-2.11.2.dist-info/LICENSE.rst,sha256=O0nc7kEF6ze6wQ-vG-JgQI_oXSUrjp3y4JefweCUQ3s,1475
3 +Jinja2-2.11.2.dist-info/METADATA,sha256=5ZHRZoIRAMHsJPnqhlJ622_dRPsYePYJ-9EH4-Ry7yI,3535
4 +Jinja2-2.11.2.dist-info/RECORD,,
5 +Jinja2-2.11.2.dist-info/WHEEL,sha256=kGT74LWyRUZrL4VgLh6_g12IeVl_9u9ZVhadrgXZUEY,110
6 +Jinja2-2.11.2.dist-info/entry_points.txt,sha256=Qy_DkVo6Xj_zzOtmErrATe8lHZhOqdjpt3e4JJAGyi8,61
7 +Jinja2-2.11.2.dist-info/top_level.txt,sha256=PkeVWtLb3-CqjWi1fO29OCbj55EhX_chhKrCdrVe_zs,7
8 +jinja2/__init__.py,sha256=0QCM_jKKDM10yzSdHRVV4mQbCbDqf0GN0GirAqibn9Y,1549
9 +jinja2/__pycache__/__init__.cpython-38.pyc,,
10 +jinja2/__pycache__/_compat.cpython-38.pyc,,
11 +jinja2/__pycache__/_identifier.cpython-38.pyc,,
12 +jinja2/__pycache__/asyncfilters.cpython-38.pyc,,
13 +jinja2/__pycache__/asyncsupport.cpython-38.pyc,,
14 +jinja2/__pycache__/bccache.cpython-38.pyc,,
15 +jinja2/__pycache__/compiler.cpython-38.pyc,,
16 +jinja2/__pycache__/constants.cpython-38.pyc,,
17 +jinja2/__pycache__/debug.cpython-38.pyc,,
18 +jinja2/__pycache__/defaults.cpython-38.pyc,,
19 +jinja2/__pycache__/environment.cpython-38.pyc,,
20 +jinja2/__pycache__/exceptions.cpython-38.pyc,,
21 +jinja2/__pycache__/ext.cpython-38.pyc,,
22 +jinja2/__pycache__/filters.cpython-38.pyc,,
23 +jinja2/__pycache__/idtracking.cpython-38.pyc,,
24 +jinja2/__pycache__/lexer.cpython-38.pyc,,
25 +jinja2/__pycache__/loaders.cpython-38.pyc,,
26 +jinja2/__pycache__/meta.cpython-38.pyc,,
27 +jinja2/__pycache__/nativetypes.cpython-38.pyc,,
28 +jinja2/__pycache__/nodes.cpython-38.pyc,,
29 +jinja2/__pycache__/optimizer.cpython-38.pyc,,
30 +jinja2/__pycache__/parser.cpython-38.pyc,,
31 +jinja2/__pycache__/runtime.cpython-38.pyc,,
32 +jinja2/__pycache__/sandbox.cpython-38.pyc,,
33 +jinja2/__pycache__/tests.cpython-38.pyc,,
34 +jinja2/__pycache__/utils.cpython-38.pyc,,
35 +jinja2/__pycache__/visitor.cpython-38.pyc,,
36 +jinja2/_compat.py,sha256=B6Se8HjnXVpzz9-vfHejn-DV2NjaVK-Iewupc5kKlu8,3191
37 +jinja2/_identifier.py,sha256=EdgGJKi7O1yvr4yFlvqPNEqV6M1qHyQr8Gt8GmVTKVM,1775
38 +jinja2/asyncfilters.py,sha256=XJtYXTxFvcJ5xwk6SaDL4S0oNnT0wPYvXBCSzc482fI,4250
39 +jinja2/asyncsupport.py,sha256=ZBFsDLuq3Gtji3Ia87lcyuDbqaHZJRdtShZcqwpFnSQ,7209
40 +jinja2/bccache.py,sha256=3Pmp4jo65M9FQuIxdxoDBbEDFwe4acDMQf77nEJfrHA,12139
41 +jinja2/compiler.py,sha256=Ta9W1Lit542wItAHXlDcg0sEOsFDMirCdlFPHAurg4o,66284
42 +jinja2/constants.py,sha256=RR1sTzNzUmKco6aZicw4JpQpJGCuPuqm1h1YmCNUEFY,1458
43 +jinja2/debug.py,sha256=neR7GIGGjZH3_ILJGVUYy3eLQCCaWJMXOb7o0kGInWc,8529
44 +jinja2/defaults.py,sha256=85B6YUUCyWPSdrSeVhcqFVuu_bHUAQXeey--FIwSeVQ,1126
45 +jinja2/environment.py,sha256=XDSLKc4SqNLMOwTSq3TbWEyA5WyXfuLuVD0wAVjEFwM,50629
46 +jinja2/exceptions.py,sha256=VjNLawcmf2ODffqVMCQK1cRmvFaUfQWF4u8ouP3QPcE,5425
47 +jinja2/ext.py,sha256=AtwL5O5enT_L3HR9-oBvhGyUTdGoyaqG_ICtnR_EVd4,26441
48 +jinja2/filters.py,sha256=_RpPgAlgIj7ExvyDzcHAC3B36cocfWK-1TEketbNeM0,41415
49 +jinja2/idtracking.py,sha256=J3O4VHsrbf3wzwiBc7Cro26kHb6_5kbULeIOzocchIU,9211
50 +jinja2/lexer.py,sha256=nUFLRKhhKmmEWkLI65nQePgcQs7qsRdjVYZETMt_v0g,30331
51 +jinja2/loaders.py,sha256=C-fST_dmFjgWkp0ZuCkrgICAoOsoSIF28wfAFink0oU,17666
52 +jinja2/meta.py,sha256=QjyYhfNRD3QCXjBJpiPl9KgkEkGXJbAkCUq4-Ur10EQ,4131
53 +jinja2/nativetypes.py,sha256=Ul__gtVw4xH-0qvUvnCNHedQeNDwmEuyLJztzzSPeRg,2753
54 +jinja2/nodes.py,sha256=Mk1oJPVgIjnQw9WOqILvcu3rLepcFZ0ahxQm2mbwDwc,31095
55 +jinja2/optimizer.py,sha256=gQLlMYzvQhluhzmAIFA1tXS0cwgWYOjprN-gTRcHVsc,1457
56 +jinja2/parser.py,sha256=fcfdqePNTNyvosIvczbytVA332qpsURvYnCGcjDHSkA,35660
57 +jinja2/runtime.py,sha256=0y-BRyIEZ9ltByL2Id6GpHe1oDRQAwNeQvI0SKobNMw,30618
58 +jinja2/sandbox.py,sha256=knayyUvXsZ-F0mk15mO2-ehK9gsw04UhB8td-iUOtLc,17127
59 +jinja2/tests.py,sha256=iO_Y-9Vo60zrVe1lMpSl5sKHqAxe2leZHC08OoZ8K24,4799
60 +jinja2/utils.py,sha256=OoVMlQe9S2-lWT6jJbTu9tDuDvGNyWUhHDcE51i5_Do,22522
61 +jinja2/visitor.py,sha256=DUHupl0a4PGp7nxRtZFttUzAi1ccxzqc2hzetPYUz8U,3240
1 +Wheel-Version: 1.0
2 +Generator: bdist_wheel (0.34.2)
3 +Root-Is-Purelib: true
4 +Tag: py2-none-any
5 +Tag: py3-none-any
6 +
1 +[babel.extractors]
2 +jinja2 = jinja2.ext:babel_extract [i18n]
3 +
1 +Copyright 2010 Pallets
2 +
3 +Redistribution and use in source and binary forms, with or without
4 +modification, are permitted provided that the following conditions are
5 +met:
6 +
7 +1. Redistributions of source code must retain the above copyright
8 + notice, this list of conditions and the following disclaimer.
9 +
10 +2. Redistributions in binary form must reproduce the above copyright
11 + notice, this list of conditions and the following disclaimer in the
12 + documentation and/or other materials provided with the distribution.
13 +
14 +3. Neither the name of the copyright holder nor the names of its
15 + contributors may be used to endorse or promote products derived from
16 + this software without specific prior written permission.
17 +
18 +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
19 +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
20 +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
21 +PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
22 +HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
23 +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
24 +TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
25 +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
26 +LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
27 +NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
28 +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
1 +Metadata-Version: 2.1
2 +Name: MarkupSafe
3 +Version: 1.1.1
4 +Summary: Safely add untrusted strings to HTML/XML markup.
5 +Home-page: https://palletsprojects.com/p/markupsafe/
6 +Author: Armin Ronacher
7 +Author-email: armin.ronacher@active-4.com
8 +Maintainer: The Pallets Team
9 +Maintainer-email: contact@palletsprojects.com
10 +License: BSD-3-Clause
11 +Project-URL: Documentation, https://markupsafe.palletsprojects.com/
12 +Project-URL: Code, https://github.com/pallets/markupsafe
13 +Project-URL: Issue tracker, https://github.com/pallets/markupsafe/issues
14 +Platform: UNKNOWN
15 +Classifier: Development Status :: 5 - Production/Stable
16 +Classifier: Environment :: Web Environment
17 +Classifier: Intended Audience :: Developers
18 +Classifier: License :: OSI Approved :: BSD License
19 +Classifier: Operating System :: OS Independent
20 +Classifier: Programming Language :: Python
21 +Classifier: Programming Language :: Python :: 2
22 +Classifier: Programming Language :: Python :: 2.7
23 +Classifier: Programming Language :: Python :: 3
24 +Classifier: Programming Language :: Python :: 3.4
25 +Classifier: Programming Language :: Python :: 3.5
26 +Classifier: Programming Language :: Python :: 3.6
27 +Classifier: Programming Language :: Python :: 3.7
28 +Classifier: Topic :: Internet :: WWW/HTTP :: Dynamic Content
29 +Classifier: Topic :: Software Development :: Libraries :: Python Modules
30 +Classifier: Topic :: Text Processing :: Markup :: HTML
31 +Requires-Python: >=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*
32 +Description-Content-Type: text/x-rst
33 +
34 +MarkupSafe
35 +==========
36 +
37 +MarkupSafe implements a text object that escapes characters so it is
38 +safe to use in HTML and XML. Characters that have special meanings are
39 +replaced so that they display as the actual characters. This mitigates
40 +injection attacks, meaning untrusted user input can safely be displayed
41 +on a page.
42 +
43 +
44 +Installing
45 +----------
46 +
47 +Install and update using `pip`_:
48 +
49 +.. code-block:: text
50 +
51 + pip install -U MarkupSafe
52 +
53 +.. _pip: https://pip.pypa.io/en/stable/quickstart/
54 +
55 +
56 +Examples
57 +--------
58 +
59 +.. code-block:: pycon
60 +
61 + >>> from markupsafe import Markup, escape
62 + >>> # escape replaces special characters and wraps in Markup
63 + >>> escape('<script>alert(document.cookie);</script>')
64 + Markup(u'&lt;script&gt;alert(document.cookie);&lt;/script&gt;')
65 + >>> # wrap in Markup to mark text "safe" and prevent escaping
66 + >>> Markup('<strong>Hello</strong>')
67 + Markup('<strong>hello</strong>')
68 + >>> escape(Markup('<strong>Hello</strong>'))
69 + Markup('<strong>hello</strong>')
70 + >>> # Markup is a text subclass (str on Python 3, unicode on Python 2)
71 + >>> # methods and operators escape their arguments
72 + >>> template = Markup("Hello <em>%s</em>")
73 + >>> template % '"World"'
74 + Markup('Hello <em>&#34;World&#34;</em>')
75 +
76 +
77 +Donate
78 +------
79 +
80 +The Pallets organization develops and supports MarkupSafe and other
81 +libraries that use it. In order to grow the community of contributors
82 +and users, and allow the maintainers to devote more time to the
83 +projects, `please donate today`_.
84 +
85 +.. _please donate today: https://palletsprojects.com/donate
86 +
87 +
88 +Links
89 +-----
90 +
91 +* Website: https://palletsprojects.com/p/markupsafe/
92 +* Documentation: https://markupsafe.palletsprojects.com/
93 +* License: `BSD-3-Clause <https://github.com/pallets/markupsafe/blob/master/LICENSE.rst>`_
94 +* Releases: https://pypi.org/project/MarkupSafe/
95 +* Code: https://github.com/pallets/markupsafe
96 +* Issue tracker: https://github.com/pallets/markupsafe/issues
97 +* Test status:
98 +
99 + * Linux, Mac: https://travis-ci.org/pallets/markupsafe
100 + * Windows: https://ci.appveyor.com/project/pallets/markupsafe
101 +
102 +* Test coverage: https://codecov.io/gh/pallets/markupsafe
103 +* Official chat: https://discord.gg/t6rrQZH
104 +
105 +
1 +MarkupSafe-1.1.1.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4
2 +MarkupSafe-1.1.1.dist-info/LICENSE.rst,sha256=RjHsDbX9kKVH4zaBcmTGeYIUM4FG-KyUtKV_lu6MnsQ,1503
3 +MarkupSafe-1.1.1.dist-info/METADATA,sha256=IFCP4hCNGjXJgMoSvdjPiKDLAMUTTWoxKXQsQvmyMNU,3653
4 +MarkupSafe-1.1.1.dist-info/RECORD,,
5 +MarkupSafe-1.1.1.dist-info/WHEEL,sha256=jovIjvNuo6l5lHtTPdXyjKVQ_5SCkmdptE5fkPNfjyM,101
6 +MarkupSafe-1.1.1.dist-info/top_level.txt,sha256=qy0Plje5IJuvsCBjejJyhDCjEAdcDLK_2agVcex8Z6U,11
7 +markupsafe/__init__.py,sha256=UAy1UKlykemnSZWIVn8RDqY0wvjV6lkeRwYOMNhw4bA,10453
8 +markupsafe/__pycache__/__init__.cpython-38.pyc,,
9 +markupsafe/__pycache__/_compat.cpython-38.pyc,,
10 +markupsafe/__pycache__/_constants.cpython-38.pyc,,
11 +markupsafe/__pycache__/_native.cpython-38.pyc,,
12 +markupsafe/_compat.py,sha256=XweNhJEcyTP_wIBUaIO6nxzIb6XFwweriXyZfiTpkdw,591
13 +markupsafe/_constants.py,sha256=IXLUQkLM6CTustG5vEQTEy6pBB3z5pm84NkYU1aW9qI,4954
14 +markupsafe/_native.py,sha256=LwsYk-GHoPsPboRD_tNC6_jTmCj3MLtsnDFis7HjE50,1942
15 +markupsafe/_speedups.cp38-win32.pyd,sha256=8nGEdcR_DUewvF72FxW6d-aD5SYoLMe2prWwEEnH9ck,12800
1 +Wheel-Version: 1.0
2 +Generator: bdist_wheel (0.33.6)
3 +Root-Is-Purelib: false
4 +Tag: cp38-cp38-win32
5 +
This diff is collapsed. Click to expand it.
1 +Metadata-Version: 2.1
2 +Name: PyKomoran
3 +Version: 0.1.5
4 +Summary: PyKomoran is Python wrapper for KOMORAN, KOrean MORphical ANalyzer.
5 +Home-page: https://pydocs.komoran.kr
6 +Author: Junghwan Park, Junsoo Shin, Geunho Lee
7 +Author-email: shineware.contact.form@gmail.com
8 +Maintainer: Junghwan Park, Junsoo Shin, Geunho Lee
9 +Maintainer-email: shineware.contact.form@gmail.com
10 +License: Apache 2.0
11 +Download-URL: https://github.com/shineware/PyKOMORAN/releases/download/0.1.5/PyKomoran-0.1.5.tar.gz
12 +Keywords: KOMORAN,KOrean MORphical ANalyzer,MORphical Analyzer,Text Analyzer,Tokenizer,PoS Tagger,Korean,Linguistic,NLP,Natural Language Processing
13 +Platform: UNKNOWN
14 +Classifier: Development Status :: 4 - Beta
15 +Classifier: Environment :: Console
16 +Classifier: Intended Audience :: Developers
17 +Classifier: Intended Audience :: Education
18 +Classifier: Intended Audience :: Information Technology
19 +Classifier: Intended Audience :: Science/Research
20 +Classifier: License :: OSI Approved :: Apache Software License
21 +Classifier: Natural Language :: Korean
22 +Classifier: Programming Language :: Java
23 +Classifier: Programming Language :: Python :: 3 :: Only
24 +Classifier: Programming Language :: Python :: 3.4
25 +Classifier: Programming Language :: Python :: 3.5
26 +Classifier: Programming Language :: Python :: 3.6
27 +Classifier: Programming Language :: Python :: 3.7
28 +Classifier: Topic :: Scientific/Engineering :: Information Analysis
29 +Classifier: Topic :: Software Development :: Libraries :: Java Libraries
30 +Classifier: Topic :: Text Processing :: Linguistic
31 +Description-Content-Type: text/markdown
32 +Requires-Dist: py4j (==0.10.8.1)
33 +Provides-Extra: test
34 +Requires-Dist: coverage (==4.5.3) ; extra == 'test'
35 +Requires-Dist: nose (==1.3.7) ; extra == 'test'
36 +
37 +# PyKOMORAN
38 +
39 +[![PyPI](https://img.shields.io/pypi/v/PyKomoran.svg)](https://pypi.org/project/PyKomoran)
40 +[![PyPI - Python Version](https://img.shields.io/pypi/pyversions/PyKomoran.svg)](https://pypi.org/project/PyKomoran)
41 +[![Downloads](https://img.shields.io/pypi/dm/PyKomoran.svg)](https://pypi.org/project/PyKomoran)
42 +[![License](https://img.shields.io/github/license/shineware/PyKOMORAN.svg)](https://www.apache.org/licenses/LICENSE-2.0)
43 +
44 +## Introduction
45 +
46 +* PyKOMORAN is Python wrapper project for [KOMORAN, KOrean MORphical ANalyzer](https://github.com/shin285/KOMORAN).
47 +* PyKOMORAN is using [Py4J](https://github.com/bartdag/py4j) for wrapping [KOMORAN Java library](https://github.com/shin285/KOMORAN).
48 +* If you have any issue or question, please leave an issue on [PyKOMORAN Project](https://github.com/shineware/PyKOMORAN/issues).
49 +
50 +## Installation
51 +
52 +### Requirements
53 +
54 +* To use PyKomoran, the following requirements must be installed
55 + * Java 8+ JDK Environment
56 + * Python 3.4+
57 + * We recommend you use Python 3.4 or higher.
58 + * [Py4J](https://www.py4j.org/install.html), 0.10 (or higher)
59 + * This will be installed when installing PyKomoran using `pip`.
60 +
61 +### How to install
62 +
63 +* You can install PyKomoran using `pip`.
64 +
65 +```bash
66 + pip install PyKomoran
67 +```
68 +
69 +* Or, just clone this repository and install by yourself.
70 +
71 +```sh
72 + git clone https://github.com/shineware/PyKOMORAN
73 + cd PyKOMORAN/python
74 + python setup.py install
75 +```
76 +
77 +* Please refer to [installation document](https://pydocs.komoran.kr/firststep/installation.html?utm_source=PyPI&utm_medium=Referral&utm_campaign=PyKomoran) for detailed installation method.
78 +
79 +## Usage
80 +
81 +### Quick start
82 +
83 +* After import dependencies, create a Komoran instance.
84 +
85 +```python
86 + from PyKomoran import *
87 + komoran = Komoran(DEFAULT_MODEL['LIGHT'])
88 +```
89 +
90 +* After then, run analyzing method.
91 +
92 +```python
93 + komoran.get_plain_text("① 대한민국은 민주공화국이다.")
94 + # # Result
95 + # '①/SW 대한민국/NNP 은/JX 민주/NNP 공화국/NNG 이/VCP 다/EF ./SF'
96 +```
97 +
98 +### Usage in detail
99 +
100 +* Please refer [KOMORAN Document site](https://pydocs.komoran.kr/firststep/tutorial.html?utm_source=PyPI&utm_medium=Referral&utm_campaign=PyKomoran) for more information.
101 +
102 +## Citation
103 +
104 +* Please use BibTeX below.
105 +
106 + ```tex
107 + @misc{komoran,
108 + author = {Junsoo Shin, Junghwan Park, Geunho Lee},
109 + title = {KOMORAN},
110 + publisher = {GitHub},
111 + journal = {GitHub repository},
112 + howpublished = {\url{https://github.com/shineware/PyKOMORAN}}
113 + }
114 + ```
115 +
116 +## License
117 +
118 +* PyKOMORAN is distributed with the Apache 2.0 license, same as [KOMORAN](https://github.com/shin285/KOMORAN). See `LICENSE` for more information.
119 +
120 +## Contributing
121 +
122 +* We're always happy to receive any contributions including code, bug reports and documentation fixes.
123 +* Please visit our [Website](https://www.shineware.co.kr/products/komoran/#demo?utm_source=PyPI&utm_medium=Referral&utm_campaign=PyKomoran) and/or [Project Organization at GitHub](https://github.com/komoran) for more information.
124 +* Or, if you have any necessary features or suggestion? Please leave your idea on [Request to add new feature](https://github.com/shineware/PyKOMORAN/issues/new?template=FEATURE_REQUEST.md)
125 +
126 +
1 +PyKomoran-0.1.5.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4
2 +PyKomoran-0.1.5.dist-info/LICENSE,sha256=UtNyw2WS0eTx084aAQgS78aSf8eu7DMsP7NuMrUQpFs,11368
3 +PyKomoran-0.1.5.dist-info/METADATA,sha256=aoMajFbgssRAKsO4dRCHS8GEn0kgRZW1_eZr6Wyp-dg,4894
4 +PyKomoran-0.1.5.dist-info/RECORD,,
5 +PyKomoran-0.1.5.dist-info/WHEEL,sha256=U88EhGIw8Sj2_phqajeu_EAi3RAo8-C6zV3REsWbWbs,92
6 +PyKomoran-0.1.5.dist-info/top_level.txt,sha256=StNoH0MU5kSXO7HgUsom4XDvsZeL6l7gpAKWI9qD6BQ,10
7 +PyKomoran/__init__.py,sha256=0c5kKfwMgsX9gy3a1pD1J70ywAlwE4Qnyna6CHBJlWA,330
8 +PyKomoran/__pycache__/__init__.cpython-38.pyc,,
9 +PyKomoran/__pycache__/__version__.cpython-38.pyc,,
10 +PyKomoran/__pycache__/core.cpython-38.pyc,,
11 +PyKomoran/__pycache__/jvm.cpython-38.pyc,,
12 +PyKomoran/__pycache__/type.cpython-38.pyc,,
13 +PyKomoran/__version__.py,sha256=PwxxnnJLSeaMf7ASGFpIiVa1Zja9XxDkp-57FqqDnv4,908
14 +PyKomoran/core.py,sha256=1PQQO9lnD_cyHmMPwtpztFFYSoKN9aiw6g2c4579kiA,13546
15 +PyKomoran/jvm.py,sha256=XWokVZtzW7pjszQ2ngcA1KNIOileQ0EWmrk1fmnfBBk,2078
16 +PyKomoran/libs/KOMORAN-4e7b5ef.jar,sha256=yPpjjhZZRSoFxMS3Ez6RcYlL9mjcysvHfCwwI6Hy7Sc,3918398
17 +PyKomoran/libs/KOMORANEntryPoint-0.1.0.jar,sha256=Sn6IPGZUVYFbWAn_zVXCrRs92d3kMAwmLY6iwVlft80,4597
18 +PyKomoran/libs/py4j0.10.8.1.jar,sha256=fEwxgFcQMdKtZl8bbIP5hJxUatAbzetQJKcD_N9vqOM,121248
19 +PyKomoran/models_full/irregular.model,sha256=h1-Pa1ym5ICrcHlvBg85ly8MscgonZ6Suf3PutHxeh0,191920
20 +PyKomoran/models_full/observation.model,sha256=DrQ00QDT5hFRgqXaTkIC5uKCdi7PAj6078XI5csMD3I,2934034
21 +PyKomoran/models_full/pos.table,sha256=GM6uiQ8igV7KYa3F1_rNqpnQPkvRsdnIlxxYKk-CayI,282
22 +PyKomoran/models_full/transition.model,sha256=oA3gVMoObMcxxRVI4bSLcdqsHn538Qjl70obFw1-Zf8,6680
23 +PyKomoran/models_light/irregular.model,sha256=a7TW3yHYm2dXoQudpA40ZoxWC2szfbFpyj1X_StXBHQ,191919
24 +PyKomoran/models_light/observation.model,sha256=Le1RR_EIqHx_4hvaXyeqeDA9tAhJ8dyXndndxZBtm-c,479047
25 +PyKomoran/models_light/pos.table,sha256=GM6uiQ8igV7KYa3F1_rNqpnQPkvRsdnIlxxYKk-CayI,282
26 +PyKomoran/models_light/transition.model,sha256=oA3gVMoObMcxxRVI4bSLcdqsHn538Qjl70obFw1-Zf8,6680
27 +PyKomoran/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
28 +PyKomoran/tests/__pycache__/__init__.cpython-38.pyc,,
29 +PyKomoran/tests/__pycache__/test__jvm.cpython-38.pyc,,
30 +PyKomoran/tests/__pycache__/test_core.cpython-38.pyc,,
31 +PyKomoran/tests/__pycache__/test_type.cpython-38.pyc,,
32 +PyKomoran/tests/test__jvm.py,sha256=9EPpke1xTflVJm3F9SAD88WCDzmH-vmBArs0ThCT51I,1833
33 +PyKomoran/tests/test_core.py,sha256=zo9XXC8XAc7QpX51pP5k3a7eVYuQy1p6BadnfTLiKGs,14188
34 +PyKomoran/tests/test_data/dic.user,sha256=B_eXKO0--32cLmqYgKFKVe3vUWaMn-MLI_Zch2EPUPY,16
35 +PyKomoran/tests/test_data/fwd.user,sha256=Zms7ImebfBPpBJ-HSsFW48bGNbvngq9aG7Z7Gkgyu1s,39
36 +PyKomoran/tests/test_type.py,sha256=AsosO84dv6HVajCfpnVIsilRiBqpfOWlidt3b8v6qWc,2617
37 +PyKomoran/type.py,sha256=21CKx7mvqwdPu8w3c6XPxUWUbCVnkwNpMhybf-uyxlw,7524
1 +Wheel-Version: 1.0
2 +Generator: bdist_wheel (0.33.1)
3 +Root-Is-Purelib: true
4 +Tag: py3-none-any
5 +
1 +from .__version__ import __title__, __description__, __url__, __copyright__
2 +from .__version__ import __author__, __author_email__, __license__, __version__
3 +
4 +from .jvm import init_jvm
5 +from .type import Pair, Token, Pos, DEFAULT_MODEL
6 +from .core import Komoran
7 +
8 +__all__ = ['jvm', 'Pair', 'Token', 'Pos', 'DEFAULT_MODEL', 'Komoran']
1 +# ,------. ,--. ,--.
2 +# | .--. ',--. ,--.| .' / ,---. ,--,--,--. ,---. ,--.--. ,--,--.,--,--,
3 +# | '--' | \ ' / | . ' | .-. || || .-. || .--'' ,-. || \
4 +# | | --' \ ' | |\ \' '-' '| | | |' '-' '| | \ '-' || || |
5 +# `--' .-' / `--' '--' `---' `--`--`--' `---' `--' `--`--'`--''--'
6 +# `---'
7 +
8 +__title__ = 'PyKomoran'
9 +__description__ = 'PyKomoran is Python wrapper for KOMORAN, KOrean MORphical ANalyzer.'
10 +__url__ = 'https://pydocs.komoran.kr'
11 +__version__ = '0.1.5'
12 +__author__ = 'Junghwan Park, Junsoo Shin, Geunho Lee'
13 +__author_email__ = 'shineware.contact.form@gmail.com'
14 +__license__ = 'Apache 2.0'
15 +__copyright__ = 'Copyright 2019 SHINEWARE'
16 +__download_url__ = 'https://github.com/shineware/PyKOMORAN/releases/download/{0}/PyKomoran-{0}.tar.gz'.format(__version__)
17 +__keywords__ = 'KOMORAN, PyKomoran, KOrean MORphical ANalyzer, Morph Analyzer',
This diff is collapsed. Click to expand it.
1 +import os
2 +import logging
3 +
4 +from py4j.java_gateway import GatewayParameters
5 +from py4j.java_gateway import JavaGateway
6 +from py4j.java_gateway import launch_gateway
7 +
8 +__all__ = ['jvm_gateway', 'init_jvm', 'get_jvm']
9 +
10 +jvm_gateway = None
11 +
12 +
13 +def init_jvm(max_heap=1024, jar_path="./libs"):
14 + """KOMORAN Jar를 포함한 JVM을 초기화한 후, 반환합니다.
15 +
16 + Args:
17 + max_heap (int): JVM 실행 시 Max Heap Size (기본값: ``1024``, 단위: ``MB``)
18 + jar_path (str): JVM 실행 시 포함할 Jar Path 지정 (기본값: ``"./libs"``)
19 +
20 + Returns:
21 + py4j.java_gateway.JavaGateway: 초기화된 JVM 객체
22 + """
23 + base_path = os.path.dirname(os.path.realpath(__file__))
24 + jar_path = os.path.abspath(os.path.join(base_path, jar_path))
25 +
26 + assert os.path.exists(jar_path)
27 +
28 + global jvm_gateway
29 +
30 + if jvm_gateway is not None:
31 + return
32 +
33 + libraries = [
34 + '{0}{1}KOMORAN-4e7b5ef.jar',
35 + '{0}{1}KOMORANEntryPoint-0.1.0.jar',
36 + # '{0}{1}*'
37 + ]
38 +
39 + classpath = os.pathsep.join([lib.format(jar_path, os.sep) for lib in libraries])
40 + py4j_path = "{0}{1}py4j0.10.8.1.jar".format(jar_path, os.sep)
41 +
42 + port = launch_gateway(jarpath=py4j_path,
43 + classpath=classpath,
44 + javaopts=['-Dfile.encoding=UTF8', '-ea', '-Xmx{}m'.format(max_heap)],
45 + die_on_exit=True)
46 +
47 + logging.debug("initializing JVM... ")
48 + try:
49 + jvm_gateway = JavaGateway(gateway_parameters=GatewayParameters(port=port, auto_convert=True))
50 + # # for debugging with Java-side
51 + # jvm_gateway = JavaGateway(gateway_parameters=GatewayParameters(port=25335, auto_convert=True))
52 + except Exception as e:
53 + jvm_gateway = None
54 + logging.debug("fail")
55 + logging.debug("success")
56 +
57 + return jvm_gateway.jvm
58 +
59 +
60 +def get_jvm():
61 + """현재 생성된 JVM 객체를 반환합니다.
62 +
63 + Returns:
64 + py4j.java_gateway.JavaGateway: 초기화된 JVM 객체
65 + """
66 + global jvm_gateway
67 +
68 + if jvm_gateway is None:
69 + return None
70 +
71 + return jvm_gateway.jvm
1 +VV 0
2 +VCN 1
3 +VX 2
4 +VCP 3
5 +NP 4
6 +NNB 5
7 +NR 6
8 +NNG 7
9 +JX 8
10 +NNP 9
11 +SE 10
12 +SF 11
13 +SH 12
14 +XPN 13
15 +BOE 14
16 +SL 15
17 +IC 16
18 +EOE 44
19 +SN 17
20 +SO 18
21 +SP 19
22 +EC 20
23 +JKB 21
24 +SS 22
25 +MM 23
26 +EF 24
27 +JKC 25
28 +SW 26
29 +JKG 27
30 +XSA 28
31 +VA 29
32 +EP 30
33 +JKO 31
34 +JKQ 32
35 +MAG 33
36 +XSN 34
37 +JKS 35
38 +NA 36
39 +JKV 37
40 +MAJ 38
41 +JC 39
42 +XSV 40
43 +XR 41
44 +ETN 42
45 +ETM 43
1 +VV 0
2 +VCN 1
3 +VX 2
4 +VCP 3
5 +NP 4
6 +NNB 5
7 +NR 6
8 +NNG 7
9 +JX 8
10 +NNP 9
11 +SE 10
12 +SF 11
13 +SH 12
14 +XPN 13
15 +BOE 14
16 +SL 15
17 +IC 16
18 +EOE 44
19 +SN 17
20 +SO 18
21 +SP 19
22 +EC 20
23 +JKB 21
24 +SS 22
25 +MM 23
26 +EF 24
27 +JKC 25
28 +SW 26
29 +JKG 27
30 +XSA 28
31 +VA 29
32 +EP 30
33 +JKO 31
34 +JKQ 32
35 +MAG 33
36 +XSN 34
37 +JKS 35
38 +NA 36
39 +JKV 37
40 +MAJ 38
41 +JC 39
42 +XSV 40
43 +XR 41
44 +ETN 42
45 +ETM 43
1 +""" This test filename has 'a' prefix because this test should run before running other tests """
2 +import nose
3 +
4 +from PyKomoran.jvm import *
5 +
6 +global jvm_gateway
7 +if jvm_gateway is not None:
8 + jvm_gateway.shutdown()
9 +test_jvm1 = None
10 +
11 +
12 +def test_to_before_init_Jvm():
13 + """
14 + JVM Test: before jvm_init(), jvm_gateway should be None
15 + :return:
16 + """
17 + global jvm_gateway
18 +
19 + assert jvm_gateway is None
20 +
21 +
22 +def test_to_get_Jvm_before_init():
23 + """
24 + JVM Test: before jvm_init(), get_jvm() should be None
25 + :return:
26 + """
27 + global test_jvm1
28 +
29 + test_jvm1 = get_jvm()
30 +
31 + assert test_jvm1 is None
32 +
33 +
34 +def test_to_init_Jvm():
35 + """
36 + JVM Test: when call jvm_init() first time, jvm object should be returned
37 + :return:
38 + """
39 + global test_jvm1
40 +
41 + test_jvm1 = init_jvm(1024)
42 +
43 + assert test_jvm1 is not None
44 +
45 +
46 +def test_to_duplicate_init_Jvm():
47 + """
48 + JVM Test: when call jvm_init() more than once, None should be returned
49 + :return:
50 + """
51 + global test_jvm1
52 +
53 + test_jvm2 = init_jvm(1024)
54 + test_jvm3 = init_jvm(1024)
55 +
56 + assert test_jvm1 is not None
57 + assert test_jvm2 is None
58 + assert test_jvm3 is None
59 +
60 +
61 +def test_to_get_Jvm_after_init():
62 + """
63 + JVM Test: when call get_jvm() after init_jvm(), jvm object should be returned
64 + :return:
65 + """
66 + test_jvm2 = get_jvm()
67 +
68 + assert test_jvm2 is not None
69 +
70 +
71 +def test_to_duplicate_get_Jvm_after_init():
72 + """
73 + JVM Test: when call get_jvm() after init_jvm() more than once, returned values should be same
74 + :return:
75 + """
76 + global test_jvm1
77 +
78 + test_jvm2 = get_jvm()
79 + test_jvm3 = get_jvm()
80 +
81 + assert test_jvm1 is not None
82 + assert test_jvm2 is not None
83 + assert test_jvm3 is not None
84 + assert id(test_jvm1) == id(test_jvm2)
85 + assert id(test_jvm1) == id(test_jvm3)
86 +
87 +
88 +if __name__ == '__main__':
89 + nose.runmodule()
This diff is collapsed. Click to expand it.
1 +테스트 단어
...\ No newline at end of file ...\ No newline at end of file
1 +감겼다 감/NNB 기/VCP 었/EP 다/EC
...\ No newline at end of file ...\ No newline at end of file
1 +import nose
2 +
3 +from PyKomoran.type import *
4 +
5 +
6 +def test_to_init_Token():
7 + """
8 + Type Test: init Token using given Dict, and validate given values with Token methods
9 + :return:
10 + """
11 + # @formatter:off
12 + token = Token({
13 + 'morph': '테스트',
14 + 'pos': 'NNP',
15 + 'beginIndex': 0,
16 + 'endIndex': 3
17 + })
18 + # @formatter:on
19 +
20 + assert token.get_morph() == '테스트'
21 + assert token.get_pos() == 'NNP'
22 + assert token.get_begin_index() == 0
23 + assert token.get_end_index() == 3
24 + assert str(token) == '테스트/NNP(0,3)'
25 + # @formatter:off
26 + assert token == Token({
27 + 'morph': '테스트',
28 + 'pos': 'NNP',
29 + 'beginIndex': 0,
30 + 'endIndex': 3
31 + })
32 + # @formatter:on
33 +
34 +
35 +def test_to_init_Token_using_Pos_name():
36 + """
37 + Type Test: init Token using given Dict with use_pos_name parameter, and validate given values with Token methods
38 + :return:
39 + """
40 + # @formatter:off
41 + token = Token({
42 + 'morph': '테스트',
43 + 'pos': 'NNP',
44 + 'beginIndex': 0,
45 + 'endIndex': 3
46 + }, use_pos_name=True)
47 + # @formatter:on
48 +
49 + assert token.get_morph() == '테스트'
50 + assert token.get_pos() == '고유 명사'
51 + assert token.get_begin_index() == 0
52 + assert token.get_end_index() == 3
53 + assert str(token) == '테스트/고유 명사(0,3)'
54 + # @formatter:off
55 + assert token == Token({
56 + 'morph': '테스트',
57 + 'pos': 'NNP',
58 + 'beginIndex': 0,
59 + 'endIndex': 3
60 + })
61 + # @formatter:on
62 +
63 +
64 +def test_to_init_Pair():
65 + """
66 + Type Test: init Pair using given Dict, and validate given values with Pair methods
67 + :return:
68 + """
69 + # @formatter:off
70 + pair = Pair({
71 + 'first': '테스트',
72 + 'second': 'NNP'
73 + })
74 + # @formatter:on
75 +
76 + assert pair.get_first() == '테스트'
77 + assert pair.get_second() == 'NNP'
78 + assert str(pair) == '테스트/NNP'
79 + # @formatter:off
80 + assert pair == Pair({
81 + 'first': '테스트',
82 + 'second': 'NNP'
83 + })
84 + # @formatter:on
85 +
86 +
87 +def test_to_pos_table():
88 + """
89 + Type Test: check pos_table is initialized well
90 + :return:
91 + """
92 + pos_table = Pos()
93 +
94 + assert len(pos_table) == 45
95 + assert pos_table['NNP'] == '고유 명사'
96 + assert 'NA' in pos_table
97 + assert 'ABC' not in pos_table
98 +
99 +
100 +if __name__ == '__main__':
101 + nose.runmodule()
1 +import os
2 +
3 +__all__ = ['Token', 'Pair', 'Pos', 'DEFAULT_MODEL']
4 +
5 +
6 +class Token:
7 + """Komoran(Java)의 Token Class에 대응합니다. 형태소 분석 결과 저장을 위해 사용합니다.
8 +
9 + Args:
10 + token_in_dict (dict): Token으로 만들 Dict
11 + use_pos_name (bool): Token 출력 시 품사 이름 사용 여부 (기본값: ``False``) \n
12 + ``True`` 인 경우 품사 기호 대신 품사 이름을 사용합니다. \n
13 + ``False`` 인 경우 품사 기호를 사용합니다.
14 +
15 + Examples:
16 +
17 + >>> # komoran은 Komoran 객체입니다.
18 + >>> tokens = komoran.get_token_list("① 대한민국은 민주공화국이다.")
19 + >>> token = tokens[1]
20 + >>> token
21 + 대한민국/NNP(2,6)
22 + >>> token.get_morph()
23 + '대한민국'
24 + >>> token.get_pos()
25 + 'NNP'
26 + >>> token.get_begin_index()
27 + 2
28 + >>> token.get_end_index()
29 + 6
30 +
31 + """
32 + def __init__(self, token_in_dict, use_pos_name=False):
33 + self.pos_table = Pos()
34 + self.morph = token_in_dict.get('morph')
35 + self.pos = token_in_dict.get('pos')
36 + self.begin_index = token_in_dict.get('beginIndex')
37 + self.end_index = token_in_dict.get('endIndex')
38 + self.use_pos_name = use_pos_name
39 +
40 + def get_morph(self):
41 + """형태소를 반환합니다.
42 +
43 + Returns:
44 + str: 형태소
45 + """
46 + return self.morph
47 +
48 + def get_pos(self):
49 + """품사를 반환합니다.
50 +
51 + Returns:
52 + str: 품사 기호 (또는 이름)
53 + """
54 + if self.use_pos_name:
55 + return self.pos_table[self.pos]
56 + return self.pos
57 +
58 + def get_begin_index(self):
59 + """형태소의 시작 인덱스를 반환합니다.
60 +
61 + Returns:
62 + int: 시작 인덱스
63 + """
64 + return self.begin_index
65 +
66 + def get_end_index(self):
67 + """형태소의 종료 인덱스를 반환합니다.
68 +
69 + Returns:
70 + int: 종료 인덱스
71 + """
72 + return self.end_index
73 +
74 + def __eq__(self, other):
75 + return (self.morph == other.get_morph()
76 + and self.pos == other.get_pos()
77 + and self.begin_index == other.get_begin_index()
78 + and self.end_index == other.get_end_index())
79 +
80 + def __str__(self):
81 + return "{0}/{1}({2},{3})".format(self.morph, self.get_pos(), self.begin_index, self.end_index)
82 +
83 + def __repr__(self):
84 + return self.__str__()
85 +
86 +
87 +class Pair:
88 + """Komoran(Java)의 Pair Class에 대응합니다. 형태소 분석 결과 저장을 위해 사용합니다.
89 +
90 + Args:
91 + pair_in_dict (dict): Pair로 만들 Dict
92 +
93 + Examples:
94 +
95 + >>> # komoran은 Komoran 객체입니다.
96 + >>> pairs = komoran.get_list("① 대한민국은 민주공화국이다.")
97 + >>> pair = pairs[1]
98 + >>> pair
99 + 대한민국/NNP
100 + >>> pair.get_first()
101 + '대한민국'
102 + >>> pair.get_second()
103 + 'NNP'
104 +
105 + """
106 + def __init__(self, pair_in_dict):
107 + self.first = pair_in_dict.get('first')
108 + self.second = pair_in_dict.get('second')
109 +
110 + def get_first(self):
111 + """형태소를 반환합니다.
112 +
113 + Returns:
114 + str: 형태소
115 + """
116 + return self.first
117 +
118 + def get_second(self):
119 + """품사를 반환합니다.
120 +
121 + Returns:
122 + str: 품사 기호
123 + """
124 + return self.second
125 +
126 + def __eq__(self, other):
127 + return (self.first == other.get_first()
128 + and self.second == other.get_second())
129 +
130 + def __str__(self):
131 + return "{0}/{1}".format(self.first, self.second)
132 +
133 + def __repr__(self):
134 + return self.__str__()
135 +
136 +
137 +class Pos:
138 + """형태소 분석 결과로 나올 수 있는 모든 품사들에 대한 정보를 갖고 있습니다. \n
139 + 전체 품사표는 :doc:`/firststep/postypes` 를 참고해주세요.
140 +
141 + Examples:
142 +
143 + >>> pos_table = Pos()
144 + >>> pos['NNP']
145 + '고유 명사'
146 + >>> pos['SW']
147 + '기타기호(논리수학기호,화폐기호)'
148 + >>> len(pos_table)
149 + 45
150 +
151 + """
152 + def __init__(self):
153 + self.pos_table = {
154 + # 체언
155 + 'NNG': '일반 명사',
156 + 'NNP': '고유 명사',
157 + 'NNB': '의존 명사',
158 + 'NP': '대명사',
159 + 'NR': '수사',
160 +
161 + # 용언
162 + 'VV': '동사',
163 + 'VA': '형용사',
164 + 'VX': '보조 용언',
165 + 'VCP': '긍정 지정사',
166 + 'VCN': '부정 지정사',
167 +
168 + # 수식언
169 + 'MM': '관형사',
170 + 'MAG': '일반 부사',
171 + 'MAJ': '접속 부사',
172 +
173 + # 독립언
174 + 'IC': '감탄사',
175 +
176 + # 관계언
177 + 'JKS': '주격 조사',
178 + 'JKC': '보격 조사',
179 + 'JKG': '관형격 조사',
180 + 'JKO': '목적격 조사',
181 + 'JKB': '부사격 조사',
182 + 'JKV': '호격 조사',
183 + 'JKQ': '인용격 조사',
184 + 'JX': '보조사',
185 + 'JC': '접속 조사',
186 +
187 + # 의존형태
188 + 'EP': '선어말 어미',
189 + 'EF': '종결 어미',
190 + 'EC': '연결 어미',
191 + 'ETN': '명사형 전성 어미',
192 + 'ETM': '관형형 전성 어미 ',
193 + 'XPN': '체언 접두사',
194 + 'XSN': '명사 파생 접미사',
195 + 'XSV': '동사 파생 접미사',
196 + 'XSA': '형용사 파생 접미사',
197 + 'XR': '어근',
198 +
199 + # 기호
200 + 'SF': '마침표,물음표,느낌표',
201 + 'SP': '쉼표,가운뎃점,콜론,빗금',
202 + 'SS': '따옴표,괄호표,줄표',
203 + 'SE': '줄임표',
204 + 'SO': '붙임표(물결,숨김,빠짐)',
205 + 'SL': '외국어',
206 + 'SH': '한자',
207 + 'SW': '기타기호(논리수학기호,화폐기호)',
208 + 'NF': '명사추정범주',
209 + 'NV': '용언추정범주',
210 + 'SN': '숫자',
211 + 'NA': '분석불능범주'
212 + }
213 + self.pos_type = self.pos_table.keys()
214 + self.pos_size = len(self.pos_type)
215 +
216 + def __getitem__(self, pos):
217 + if pos in self.pos_type:
218 + return self.pos_table[pos]
219 + else:
220 + return ''
221 +
222 + def __len__(self):
223 + return self.pos_size
224 +
225 + def __contains__(self, pos):
226 + return pos in self.pos_type
227 +
228 + def __iter__(self):
229 + return iter(self.pos_table)
230 +
231 + def __str__(self):
232 + return str(self.pos_table)
233 +
234 + def __repr__(self):
235 + return repr(self.pos_table)
236 +
237 + def values(self):
238 + return self.pos_table.values()
239 +
240 + def keys(self):
241 + return self.pos_table.keys()
242 +
243 + def items(self):
244 + return self.pos_table.items()
245 +
246 + def has_key(self, key):
247 + return key in self.pos_type
248 +
249 +
250 +class DefaultModel:
251 + def __init__(self):
252 + base_path = os.path.dirname(os.path.realpath(__file__))
253 +
254 + self._models = {
255 + 'FULL': '{0}{1}models_full'.format(base_path, os.sep),
256 + 'LIGHT': "{0}{1}models_light".format(base_path, os.sep)
257 + }
258 +
259 + def __getitem__(self, model):
260 + if model in self._models.keys():
261 + return self._models[model]
262 + else:
263 + return ''
264 +
265 + def __contains__(self, model):
266 + return model in self._models
267 +
268 + def __str__(self):
269 + return str(self._models)
270 +
271 + def __repr__(self):
272 + return repr(self._models)
273 +
274 +DEFAULT_MODEL = DefaultModel()
...\ No newline at end of file ...\ No newline at end of file
1 +Copyright 2007 Pallets
2 +
3 +Redistribution and use in source and binary forms, with or without
4 +modification, are permitted provided that the following conditions are
5 +met:
6 +
7 +1. Redistributions of source code must retain the above copyright
8 + notice, this list of conditions and the following disclaimer.
9 +
10 +2. Redistributions in binary form must reproduce the above copyright
11 + notice, this list of conditions and the following disclaimer in the
12 + documentation and/or other materials provided with the distribution.
13 +
14 +3. Neither the name of the copyright holder nor the names of its
15 + contributors may be used to endorse or promote products derived from
16 + this software without specific prior written permission.
17 +
18 +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
19 +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
20 +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
21 +PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
22 +HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
23 +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
24 +TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
25 +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
26 +LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
27 +NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
28 +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
1 +Metadata-Version: 2.1
2 +Name: Werkzeug
3 +Version: 1.0.1
4 +Summary: The comprehensive WSGI web application library.
5 +Home-page: https://palletsprojects.com/p/werkzeug/
6 +Author: Armin Ronacher
7 +Author-email: armin.ronacher@active-4.com
8 +Maintainer: Pallets
9 +Maintainer-email: contact@palletsprojects.com
10 +License: BSD-3-Clause
11 +Project-URL: Documentation, https://werkzeug.palletsprojects.com/
12 +Project-URL: Code, https://github.com/pallets/werkzeug
13 +Project-URL: Issue tracker, https://github.com/pallets/werkzeug/issues
14 +Platform: UNKNOWN
15 +Classifier: Development Status :: 5 - Production/Stable
16 +Classifier: Environment :: Web Environment
17 +Classifier: Intended Audience :: Developers
18 +Classifier: License :: OSI Approved :: BSD License
19 +Classifier: Operating System :: OS Independent
20 +Classifier: Programming Language :: Python
21 +Classifier: Programming Language :: Python :: 2
22 +Classifier: Programming Language :: Python :: 2.7
23 +Classifier: Programming Language :: Python :: 3
24 +Classifier: Programming Language :: Python :: 3.5
25 +Classifier: Programming Language :: Python :: 3.6
26 +Classifier: Programming Language :: Python :: 3.7
27 +Classifier: Programming Language :: Python :: 3.8
28 +Classifier: Programming Language :: Python :: Implementation :: CPython
29 +Classifier: Programming Language :: Python :: Implementation :: PyPy
30 +Classifier: Topic :: Internet :: WWW/HTTP :: Dynamic Content
31 +Classifier: Topic :: Internet :: WWW/HTTP :: WSGI
32 +Classifier: Topic :: Internet :: WWW/HTTP :: WSGI :: Application
33 +Classifier: Topic :: Internet :: WWW/HTTP :: WSGI :: Middleware
34 +Classifier: Topic :: Software Development :: Libraries :: Application Frameworks
35 +Classifier: Topic :: Software Development :: Libraries :: Python Modules
36 +Requires-Python: >=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*
37 +Description-Content-Type: text/x-rst
38 +Provides-Extra: dev
39 +Requires-Dist: pytest ; extra == 'dev'
40 +Requires-Dist: pytest-timeout ; extra == 'dev'
41 +Requires-Dist: coverage ; extra == 'dev'
42 +Requires-Dist: tox ; extra == 'dev'
43 +Requires-Dist: sphinx ; extra == 'dev'
44 +Requires-Dist: pallets-sphinx-themes ; extra == 'dev'
45 +Requires-Dist: sphinx-issues ; extra == 'dev'
46 +Provides-Extra: watchdog
47 +Requires-Dist: watchdog ; extra == 'watchdog'
48 +
49 +Werkzeug
50 +========
51 +
52 +*werkzeug* German noun: "tool". Etymology: *werk* ("work"), *zeug* ("stuff")
53 +
54 +Werkzeug is a comprehensive `WSGI`_ web application library. It began as
55 +a simple collection of various utilities for WSGI applications and has
56 +become one of the most advanced WSGI utility libraries.
57 +
58 +It includes:
59 +
60 +- An interactive debugger that allows inspecting stack traces and
61 + source code in the browser with an interactive interpreter for any
62 + frame in the stack.
63 +- A full-featured request object with objects to interact with
64 + headers, query args, form data, files, and cookies.
65 +- A response object that can wrap other WSGI applications and handle
66 + streaming data.
67 +- A routing system for matching URLs to endpoints and generating URLs
68 + for endpoints, with an extensible system for capturing variables
69 + from URLs.
70 +- HTTP utilities to handle entity tags, cache control, dates, user
71 + agents, cookies, files, and more.
72 +- A threaded WSGI server for use while developing applications
73 + locally.
74 +- A test client for simulating HTTP requests during testing without
75 + requiring running a server.
76 +
77 +Werkzeug is Unicode aware and doesn't enforce any dependencies. It is up
78 +to the developer to choose a template engine, database adapter, and even
79 +how to handle requests. It can be used to build all sorts of end user
80 +applications such as blogs, wikis, or bulletin boards.
81 +
82 +`Flask`_ wraps Werkzeug, using it to handle the details of WSGI while
83 +providing more structure and patterns for defining powerful
84 +applications.
85 +
86 +
87 +Installing
88 +----------
89 +
90 +Install and update using `pip`_:
91 +
92 +.. code-block:: text
93 +
94 + pip install -U Werkzeug
95 +
96 +
97 +A Simple Example
98 +----------------
99 +
100 +.. code-block:: python
101 +
102 + from werkzeug.wrappers import Request, Response
103 +
104 + @Request.application
105 + def application(request):
106 + return Response('Hello, World!')
107 +
108 + if __name__ == '__main__':
109 + from werkzeug.serving import run_simple
110 + run_simple('localhost', 4000, application)
111 +
112 +
113 +Links
114 +-----
115 +
116 +- Website: https://palletsprojects.com/p/werkzeug/
117 +- Documentation: https://werkzeug.palletsprojects.com/
118 +- Releases: https://pypi.org/project/Werkzeug/
119 +- Code: https://github.com/pallets/werkzeug
120 +- Issue tracker: https://github.com/pallets/werkzeug/issues
121 +- Test status: https://dev.azure.com/pallets/werkzeug/_build
122 +- Official chat: https://discord.gg/t6rrQZH
123 +
124 +.. _WSGI: https://wsgi.readthedocs.io/en/latest/
125 +.. _Flask: https://www.palletsprojects.com/p/flask/
126 +.. _pip: https://pip.pypa.io/en/stable/quickstart/
127 +
128 +
1 +Werkzeug-1.0.1.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4
2 +Werkzeug-1.0.1.dist-info/LICENSE.rst,sha256=O0nc7kEF6ze6wQ-vG-JgQI_oXSUrjp3y4JefweCUQ3s,1475
3 +Werkzeug-1.0.1.dist-info/METADATA,sha256=d0zmVNa4UC2-nAo2A8_81oiy123D6JTGRSuY_Ymgyt4,4730
4 +Werkzeug-1.0.1.dist-info/RECORD,,
5 +Werkzeug-1.0.1.dist-info/WHEEL,sha256=kGT74LWyRUZrL4VgLh6_g12IeVl_9u9ZVhadrgXZUEY,110
6 +Werkzeug-1.0.1.dist-info/top_level.txt,sha256=QRyj2VjwJoQkrwjwFIOlB8Xg3r9un0NtqVHQF-15xaw,9
7 +werkzeug/__init__.py,sha256=rb-yPiXOjTLbtDOl5fQp5hN7oBdaoXAoQ-slAAvfZAo,502
8 +werkzeug/__pycache__/__init__.cpython-38.pyc,,
9 +werkzeug/__pycache__/_compat.cpython-38.pyc,,
10 +werkzeug/__pycache__/_internal.cpython-38.pyc,,
11 +werkzeug/__pycache__/_reloader.cpython-38.pyc,,
12 +werkzeug/__pycache__/datastructures.cpython-38.pyc,,
13 +werkzeug/__pycache__/exceptions.cpython-38.pyc,,
14 +werkzeug/__pycache__/filesystem.cpython-38.pyc,,
15 +werkzeug/__pycache__/formparser.cpython-38.pyc,,
16 +werkzeug/__pycache__/http.cpython-38.pyc,,
17 +werkzeug/__pycache__/local.cpython-38.pyc,,
18 +werkzeug/__pycache__/posixemulation.cpython-38.pyc,,
19 +werkzeug/__pycache__/routing.cpython-38.pyc,,
20 +werkzeug/__pycache__/security.cpython-38.pyc,,
21 +werkzeug/__pycache__/serving.cpython-38.pyc,,
22 +werkzeug/__pycache__/test.cpython-38.pyc,,
23 +werkzeug/__pycache__/testapp.cpython-38.pyc,,
24 +werkzeug/__pycache__/urls.cpython-38.pyc,,
25 +werkzeug/__pycache__/useragents.cpython-38.pyc,,
26 +werkzeug/__pycache__/utils.cpython-38.pyc,,
27 +werkzeug/__pycache__/wsgi.cpython-38.pyc,,
28 +werkzeug/_compat.py,sha256=zjufTNrhQ8BgYSGSh-sVu6iW3r3O9WzjE9j-qJobx-g,6671
29 +werkzeug/_internal.py,sha256=d_4AqheyS6dHMViwdc0drFrjs67ZzT6Ej2gWf-Z-Iys,14351
30 +werkzeug/_reloader.py,sha256=I3mg3oRQ0lLzl06oEoVopN3bN7CtINuuUQdqDcmTnEs,11531
31 +werkzeug/datastructures.py,sha256=AonxOcwU0TPMEzfKF1368ySULxHgxE-JE-DEAGdo2ts,100480
32 +werkzeug/debug/__init__.py,sha256=3RtUMc5Y9hYyK11ugHltgkQ9Dt-ViR945Vy_X5NV7zU,17289
33 +werkzeug/debug/__pycache__/__init__.cpython-38.pyc,,
34 +werkzeug/debug/__pycache__/console.cpython-38.pyc,,
35 +werkzeug/debug/__pycache__/repr.cpython-38.pyc,,
36 +werkzeug/debug/__pycache__/tbtools.cpython-38.pyc,,
37 +werkzeug/debug/console.py,sha256=OATaO7KHYMqpbzIFe1HeW9Mnl3wZgA3jMQoGDPn5URc,5488
38 +werkzeug/debug/repr.py,sha256=lIwuhbyrMwVe3P_cFqNyqzHL7P93TLKod7lw9clydEw,9621
39 +werkzeug/debug/shared/FONT_LICENSE,sha256=LwAVEI1oYnvXiNMT9SnCH_TaLCxCpeHziDrMg0gPkAI,4673
40 +werkzeug/debug/shared/console.png,sha256=bxax6RXXlvOij_KeqvSNX0ojJf83YbnZ7my-3Gx9w2A,507
41 +werkzeug/debug/shared/debugger.js,sha256=rOhqZMRfpZnnu6_XCGn6wMWPhtfwRAcyZKksdIxPJas,6400
42 +werkzeug/debug/shared/jquery.js,sha256=CSXorXvZcTkaix6Yvo6HppcZGetbYMGWSFlBw8HfCJo,88145
43 +werkzeug/debug/shared/less.png,sha256=-4-kNRaXJSONVLahrQKUxMwXGm9R4OnZ9SxDGpHlIR4,191
44 +werkzeug/debug/shared/more.png,sha256=GngN7CioHQoV58rH6ojnkYi8c_qED2Aka5FO5UXrReY,200
45 +werkzeug/debug/shared/source.png,sha256=RoGcBTE4CyCB85GBuDGTFlAnUqxwTBiIfDqW15EpnUQ,818
46 +werkzeug/debug/shared/style.css,sha256=gZ9uhmb5zj3XLuT9RvnMp6jMINgQ-VVBCp-2AZbG3YQ,6604
47 +werkzeug/debug/shared/ubuntu.ttf,sha256=1eaHFyepmy4FyDvjLVzpITrGEBu_CZYY94jE0nED1c0,70220
48 +werkzeug/debug/tbtools.py,sha256=2iJ8RURUZUSbopOIehy53LnVJWx47lsHN2V2l6hc7Wc,20363
49 +werkzeug/exceptions.py,sha256=UTYSDkmAsH-vt8VSidlEffwqBVNXuT7bRg-_NqgUe8A,25188
50 +werkzeug/filesystem.py,sha256=HzKl-j0Hd8Jl66j778UbPTAYNnY6vUZgYLlBZ0e7uw0,2101
51 +werkzeug/formparser.py,sha256=Sto0jZid9im9ZVIf56vilCdyX-arK33wSftkYsLCnzo,21788
52 +werkzeug/http.py,sha256=KVRV3yFK14PJeI56qClEq4qxFdvKUQVy4C_dwuWz9_Q,43107
53 +werkzeug/local.py,sha256=_Tk7gB238pPWUU7habxFkZF02fiCMRVW6d62YWL1Rh0,14371
54 +werkzeug/middleware/__init__.py,sha256=f1SFZo67IlW4k1uqKzNHxYQlsakUS-D6KK_j0e3jjwQ,549
55 +werkzeug/middleware/__pycache__/__init__.cpython-38.pyc,,
56 +werkzeug/middleware/__pycache__/dispatcher.cpython-38.pyc,,
57 +werkzeug/middleware/__pycache__/http_proxy.cpython-38.pyc,,
58 +werkzeug/middleware/__pycache__/lint.cpython-38.pyc,,
59 +werkzeug/middleware/__pycache__/profiler.cpython-38.pyc,,
60 +werkzeug/middleware/__pycache__/proxy_fix.cpython-38.pyc,,
61 +werkzeug/middleware/__pycache__/shared_data.cpython-38.pyc,,
62 +werkzeug/middleware/dispatcher.py,sha256=_-KoMzHtcISHS7ouWKAOraqlCLprdh83YOAn_8DjLp8,2240
63 +werkzeug/middleware/http_proxy.py,sha256=lRjTdMmghHiZuZrS7_UJ3gZc-vlFizhBbFZ-XZPLwIA,7117
64 +werkzeug/middleware/lint.py,sha256=ItTwuWJnflF8xMT1uqU_Ty1ryhux-CjeUfskqaUpxsw,12967
65 +werkzeug/middleware/profiler.py,sha256=8B_s23d6BGrU_q54gJsm6kcCbOJbTSqrXCsioHON0Xs,4471
66 +werkzeug/middleware/proxy_fix.py,sha256=K5oZ3DPXOzdZi0Xba5zW7ClPOxgUuqXHQHvY2-AWCGw,6431
67 +werkzeug/middleware/shared_data.py,sha256=sPSRTKqtKSVBUyN8fr6jOJbdq9cdOLu6pg3gz4Y_1Xo,9599
68 +werkzeug/posixemulation.py,sha256=gSSiv1SCmOyzOM_nq1ZaZCtxP__C5MeDJl_4yXJmi4Q,3541
69 +werkzeug/routing.py,sha256=6-iZ7CKeUILYAehoKXLbmi5E6LgLbwuzUh8TNplnf5Q,79019
70 +werkzeug/security.py,sha256=81149MplFq7-hD4RK4sKp9kzXXejjV9D4lWBzaRyeQ8,8106
71 +werkzeug/serving.py,sha256=YvTqvurA-Mnj8mkqRe2kBdVr2ap4ibCq1ByQjOA6g1w,38694
72 +werkzeug/test.py,sha256=GJ9kxTMSJ-nB7kfGtxuROr9JGmXxDRev-2U1SkeUJGE,39564
73 +werkzeug/testapp.py,sha256=bHekqMsqRfVxwgFbvOMem-DYa_sdB7R47yUXpt1RUTo,9329
74 +werkzeug/urls.py,sha256=T8-hV_1vwhu6xhX93FwsHteK-W-kIE2orj5WoMf-WFw,39322
75 +werkzeug/useragents.py,sha256=TSoGv5IOvP375eK5gLLpsLQCeUgTR6sO1WftmAP_YvM,5563
76 +werkzeug/utils.py,sha256=hrVK4u_wi8z9viBO9bgOLlm1aaIvCpn-p2d1FeZQDEo,25251
77 +werkzeug/wrappers/__init__.py,sha256=S4VioKAmF_av9Ec9zQvG71X1EOkYfPx1TYck9jyDiyY,1384
78 +werkzeug/wrappers/__pycache__/__init__.cpython-38.pyc,,
79 +werkzeug/wrappers/__pycache__/accept.cpython-38.pyc,,
80 +werkzeug/wrappers/__pycache__/auth.cpython-38.pyc,,
81 +werkzeug/wrappers/__pycache__/base_request.cpython-38.pyc,,
82 +werkzeug/wrappers/__pycache__/base_response.cpython-38.pyc,,
83 +werkzeug/wrappers/__pycache__/common_descriptors.cpython-38.pyc,,
84 +werkzeug/wrappers/__pycache__/cors.cpython-38.pyc,,
85 +werkzeug/wrappers/__pycache__/etag.cpython-38.pyc,,
86 +werkzeug/wrappers/__pycache__/json.cpython-38.pyc,,
87 +werkzeug/wrappers/__pycache__/request.cpython-38.pyc,,
88 +werkzeug/wrappers/__pycache__/response.cpython-38.pyc,,
89 +werkzeug/wrappers/__pycache__/user_agent.cpython-38.pyc,,
90 +werkzeug/wrappers/accept.py,sha256=TIvjUc0g73fhTWX54wg_D9NNzKvpnG1X8u1w26tK1o8,1760
91 +werkzeug/wrappers/auth.py,sha256=Pmn6iaGHBrUyHbJpW0lZhO_q9RVoAa5QalaTqcavdAI,1158
92 +werkzeug/wrappers/base_request.py,sha256=4TuGlKWeKQdlq4eU94hJYcXSfWo8Rk7CS1Ef5lJ3ZM0,26012
93 +werkzeug/wrappers/base_response.py,sha256=JTxJZ8o-IBetpoWJqt2HFwPaNWNDAlM3_GXJe1Whw80,27784
94 +werkzeug/wrappers/common_descriptors.py,sha256=X2Ktd5zUWsmcd4ciaF62Dd8Lru9pLGP_XDUNukc8cXs,12829
95 +werkzeug/wrappers/cors.py,sha256=XMbaCol4dWTGvb-dCJBoN0p3JX91v93AIAHd7tnB3L4,3466
96 +werkzeug/wrappers/etag.py,sha256=XMXtyfByBsOjxwaX8U7ZtUY7JXkbQLP45oXZ0qkyTNs,12217
97 +werkzeug/wrappers/json.py,sha256=HvK_A4NpO0sLqgb10sTJcoZydYOwyNiPCJPV7SVgcgE,4343
98 +werkzeug/wrappers/request.py,sha256=QbHGqDpGPN684pnOPEokwkPESfm-NnfYM7ydOMxW_NI,1514
99 +werkzeug/wrappers/response.py,sha256=Oqv8TMG_dnOKTq_V30ddgkO5B7IJhkVPODvm7cbhZ3c,2524
100 +werkzeug/wrappers/user_agent.py,sha256=YJb-vr12cujG7sQMG9V89VsJa-03SWSenhg1W4cT0EY,435
101 +werkzeug/wsgi.py,sha256=ZGk85NzRyQTzkYis-xl8V9ydJgfClBdStvhzDzER2mw,34367
1 +Wheel-Version: 1.0
2 +Generator: bdist_wheel (0.34.2)
3 +Root-Is-Purelib: true
4 +Tag: py2-none-any
5 +Tag: py3-none-any
6 +
1 +Copyright 2014 Pallets
2 +
3 +Redistribution and use in source and binary forms, with or without
4 +modification, are permitted provided that the following conditions are
5 +met:
6 +
7 +1. Redistributions of source code must retain the above copyright
8 + notice, this list of conditions and the following disclaimer.
9 +
10 +2. Redistributions in binary form must reproduce the above copyright
11 + notice, this list of conditions and the following disclaimer in the
12 + documentation and/or other materials provided with the distribution.
13 +
14 +3. Neither the name of the copyright holder nor the names of its
15 + contributors may be used to endorse or promote products derived from
16 + this software without specific prior written permission.
17 +
18 +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
19 +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
20 +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
21 +PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
22 +HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
23 +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
24 +TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
25 +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
26 +LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
27 +NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
28 +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
1 +Metadata-Version: 2.1
2 +Name: click
3 +Version: 7.1.2
4 +Summary: Composable command line interface toolkit
5 +Home-page: https://palletsprojects.com/p/click/
6 +Maintainer: Pallets
7 +Maintainer-email: contact@palletsprojects.com
8 +License: BSD-3-Clause
9 +Project-URL: Documentation, https://click.palletsprojects.com/
10 +Project-URL: Code, https://github.com/pallets/click
11 +Project-URL: Issue tracker, https://github.com/pallets/click/issues
12 +Platform: UNKNOWN
13 +Classifier: Development Status :: 5 - Production/Stable
14 +Classifier: Intended Audience :: Developers
15 +Classifier: License :: OSI Approved :: BSD License
16 +Classifier: Operating System :: OS Independent
17 +Classifier: Programming Language :: Python
18 +Classifier: Programming Language :: Python :: 2
19 +Classifier: Programming Language :: Python :: 3
20 +Requires-Python: >=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*
21 +
22 +\$ click\_
23 +==========
24 +
25 +Click is a Python package for creating beautiful command line interfaces
26 +in a composable way with as little code as necessary. It's the "Command
27 +Line Interface Creation Kit". It's highly configurable but comes with
28 +sensible defaults out of the box.
29 +
30 +It aims to make the process of writing command line tools quick and fun
31 +while also preventing any frustration caused by the inability to
32 +implement an intended CLI API.
33 +
34 +Click in three points:
35 +
36 +- Arbitrary nesting of commands
37 +- Automatic help page generation
38 +- Supports lazy loading of subcommands at runtime
39 +
40 +
41 +Installing
42 +----------
43 +
44 +Install and update using `pip`_:
45 +
46 +.. code-block:: text
47 +
48 + $ pip install -U click
49 +
50 +.. _pip: https://pip.pypa.io/en/stable/quickstart/
51 +
52 +
53 +A Simple Example
54 +----------------
55 +
56 +.. code-block:: python
57 +
58 + import click
59 +
60 + @click.command()
61 + @click.option("--count", default=1, help="Number of greetings.")
62 + @click.option("--name", prompt="Your name", help="The person to greet.")
63 + def hello(count, name):
64 + """Simple program that greets NAME for a total of COUNT times."""
65 + for _ in range(count):
66 + click.echo(f"Hello, {name}!")
67 +
68 + if __name__ == '__main__':
69 + hello()
70 +
71 +.. code-block:: text
72 +
73 + $ python hello.py --count=3
74 + Your name: Click
75 + Hello, Click!
76 + Hello, Click!
77 + Hello, Click!
78 +
79 +
80 +Donate
81 +------
82 +
83 +The Pallets organization develops and supports Click and other popular
84 +packages. In order to grow the community of contributors and users, and
85 +allow the maintainers to devote more time to the projects, `please
86 +donate today`_.
87 +
88 +.. _please donate today: https://palletsprojects.com/donate
89 +
90 +
91 +Links
92 +-----
93 +
94 +- Website: https://palletsprojects.com/p/click/
95 +- Documentation: https://click.palletsprojects.com/
96 +- Releases: https://pypi.org/project/click/
97 +- Code: https://github.com/pallets/click
98 +- Issue tracker: https://github.com/pallets/click/issues
99 +- Test status: https://dev.azure.com/pallets/click/_build
100 +- Official chat: https://discord.gg/t6rrQZH
101 +
102 +
1 +click-7.1.2.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4
2 +click-7.1.2.dist-info/LICENSE.rst,sha256=morRBqOU6FO_4h9C9OctWSgZoigF2ZG18ydQKSkrZY0,1475
3 +click-7.1.2.dist-info/METADATA,sha256=LrRgakZKV7Yg3qJqX_plu2WhFW81MzP3EqQmZhHIO8M,2868
4 +click-7.1.2.dist-info/RECORD,,
5 +click-7.1.2.dist-info/WHEEL,sha256=kGT74LWyRUZrL4VgLh6_g12IeVl_9u9ZVhadrgXZUEY,110
6 +click-7.1.2.dist-info/top_level.txt,sha256=J1ZQogalYS4pphY_lPECoNMfw0HzTSrZglC4Yfwo4xA,6
7 +click/__init__.py,sha256=FkyGDQ-cbiQxP_lxgUspyFYS48f2S_pTcfKPz-d_RMo,2463
8 +click/__pycache__/__init__.cpython-38.pyc,,
9 +click/__pycache__/_bashcomplete.cpython-38.pyc,,
10 +click/__pycache__/_compat.cpython-38.pyc,,
11 +click/__pycache__/_termui_impl.cpython-38.pyc,,
12 +click/__pycache__/_textwrap.cpython-38.pyc,,
13 +click/__pycache__/_unicodefun.cpython-38.pyc,,
14 +click/__pycache__/_winconsole.cpython-38.pyc,,
15 +click/__pycache__/core.cpython-38.pyc,,
16 +click/__pycache__/decorators.cpython-38.pyc,,
17 +click/__pycache__/exceptions.cpython-38.pyc,,
18 +click/__pycache__/formatting.cpython-38.pyc,,
19 +click/__pycache__/globals.cpython-38.pyc,,
20 +click/__pycache__/parser.cpython-38.pyc,,
21 +click/__pycache__/termui.cpython-38.pyc,,
22 +click/__pycache__/testing.cpython-38.pyc,,
23 +click/__pycache__/types.cpython-38.pyc,,
24 +click/__pycache__/utils.cpython-38.pyc,,
25 +click/_bashcomplete.py,sha256=9J98IHQYmCAr2Jup6TDshUr5FJEen-AoQCZR0K5nKxQ,12309
26 +click/_compat.py,sha256=AoMaYnZ-3pwtNXuHtlb6_UXsayoG0QZiHKIRy2VFezc,24169
27 +click/_termui_impl.py,sha256=yNktUMAdjYOU1HMkq915jR3zgAzUNtGSQqSTSSMn3eQ,20702
28 +click/_textwrap.py,sha256=ajCzkzFly5tjm9foQ5N9_MOeaYJMBjAltuFa69n4iXY,1197
29 +click/_unicodefun.py,sha256=apLSNEBZgUsQNPMUv072zJ1swqnm0dYVT5TqcIWTt6w,4201
30 +click/_winconsole.py,sha256=6YDu6Rq1Wxx4w9uinBMK2LHvP83aerZM9GQurlk3QDo,10010
31 +click/core.py,sha256=V6DJzastGhrC6WTDwV9MSLwcJUdX2Uf1ypmgkjBdn_Y,77650
32 +click/decorators.py,sha256=3TvEO_BkaHl7k6Eh1G5eC7JK4LKPdpFqH9JP0QDyTlM,11215
33 +click/exceptions.py,sha256=3pQAyyMFzx5A3eV0Y27WtDTyGogZRbrC6_o5DjjKBbw,8118
34 +click/formatting.py,sha256=Wb4gqFEpWaKPgAbOvnkCl8p-bEZx5KpM5ZSByhlnJNk,9281
35 +click/globals.py,sha256=ht7u2kUGI08pAarB4e4yC8Lkkxy6gJfRZyzxEj8EbWQ,1501
36 +click/parser.py,sha256=mFK-k58JtPpqO0AC36WAr0t5UfzEw1mvgVSyn7WCe9M,15691
37 +click/termui.py,sha256=G7QBEKIepRIGLvNdGwBTYiEtSImRxvTO_AglVpyHH2s,23998
38 +click/testing.py,sha256=EUEsDUqNXFgCLhZ0ZFOROpaVDA5I_rijwnNPE6qICgA,12854
39 +click/types.py,sha256=wuubik4VqgqAw5dvbYFkDt-zSAx97y9TQXuXcVaRyQA,25045
40 +click/utils.py,sha256=4VEcJ7iEHwjnFuzEuRtkT99o5VG3zqSD7Q2CVzv13WU,15940
1 +Wheel-Version: 1.0
2 +Generator: bdist_wheel (0.34.2)
3 +Root-Is-Purelib: true
4 +Tag: py2-none-any
5 +Tag: py3-none-any
6 +
1 +"""
2 +Click is a simple Python module inspired by the stdlib optparse to make
3 +writing command line scripts fun. Unlike other modules, it's based
4 +around a simple API that does not come with too much magic and is
5 +composable.
6 +"""
7 +from .core import Argument
8 +from .core import BaseCommand
9 +from .core import Command
10 +from .core import CommandCollection
11 +from .core import Context
12 +from .core import Group
13 +from .core import MultiCommand
14 +from .core import Option
15 +from .core import Parameter
16 +from .decorators import argument
17 +from .decorators import command
18 +from .decorators import confirmation_option
19 +from .decorators import group
20 +from .decorators import help_option
21 +from .decorators import make_pass_decorator
22 +from .decorators import option
23 +from .decorators import pass_context
24 +from .decorators import pass_obj
25 +from .decorators import password_option
26 +from .decorators import version_option
27 +from .exceptions import Abort
28 +from .exceptions import BadArgumentUsage
29 +from .exceptions import BadOptionUsage
30 +from .exceptions import BadParameter
31 +from .exceptions import ClickException
32 +from .exceptions import FileError
33 +from .exceptions import MissingParameter
34 +from .exceptions import NoSuchOption
35 +from .exceptions import UsageError
36 +from .formatting import HelpFormatter
37 +from .formatting import wrap_text
38 +from .globals import get_current_context
39 +from .parser import OptionParser
40 +from .termui import clear
41 +from .termui import confirm
42 +from .termui import echo_via_pager
43 +from .termui import edit
44 +from .termui import get_terminal_size
45 +from .termui import getchar
46 +from .termui import launch
47 +from .termui import pause
48 +from .termui import progressbar
49 +from .termui import prompt
50 +from .termui import secho
51 +from .termui import style
52 +from .termui import unstyle
53 +from .types import BOOL
54 +from .types import Choice
55 +from .types import DateTime
56 +from .types import File
57 +from .types import FLOAT
58 +from .types import FloatRange
59 +from .types import INT
60 +from .types import IntRange
61 +from .types import ParamType
62 +from .types import Path
63 +from .types import STRING
64 +from .types import Tuple
65 +from .types import UNPROCESSED
66 +from .types import UUID
67 +from .utils import echo
68 +from .utils import format_filename
69 +from .utils import get_app_dir
70 +from .utils import get_binary_stream
71 +from .utils import get_os_args
72 +from .utils import get_text_stream
73 +from .utils import open_file
74 +
75 +# Controls if click should emit the warning about the use of unicode
76 +# literals.
77 +disable_unicode_literals_warning = False
78 +
79 +__version__ = "7.1.2"
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff could not be displayed because it is too large.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff could not be displayed because it is too large.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff could not be displayed because it is too large.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff could not be displayed because it is too large.
This diff could not be displayed because it is too large.
This diff could not be displayed because it is too large.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff could not be displayed because it is too large.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff could not be displayed because it is too large.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff could not be displayed because it is too large.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.