├── .github └── workflows │ └── build.yml ├── .gitignore ├── .plugins ├── bootstrapify │ ├── LICENSE │ ├── README.md │ ├── __init__.py │ └── bootstrapify.py ├── replacer │ ├── LICENSE │ ├── README.rst │ ├── __init__.py │ └── replacer.py ├── sitemap │ ├── __init__.py │ └── sitemap.py └── welcome-helpers │ ├── __init__.py │ └── welcomehelpers.py ├── Dockerfile ├── Makefile ├── README.md ├── baseconf.py ├── content ├── comunidades-locais │ ├── grupy-abc.json │ ├── grupy-al.json │ ├── grupy-ba.json │ ├── grupy-bauru.json │ ├── grupy-blumenau.json │ ├── grupy-cps.json │ ├── grupy-df.json │ ├── grupy-es.json │ ├── grupy-go.json │ ├── grupy-mt.json │ ├── grupy-pb.json │ ├── grupy-pr.json │ ├── grupy-rn.json │ ├── grupy-ro.json │ ├── grupy-rp.json │ ├── grupy-sanca.json │ ├── grupy-sp.json │ ├── grupy-sul-fluminense.json │ ├── pug-am.json │ ├── pug-ce.json │ ├── pug-ma.json │ ├── pug-mg.json │ ├── pug-pe.json │ ├── pug-pi.json │ ├── pug-sc.json │ ├── pug-se.json │ ├── py013.json │ ├── pydata-bsb.json │ ├── pynorte.json │ ├── pytche.json │ ├── pythonfloripa.json │ ├── pythononrio.json │ └── pythonsorocaba.json ├── extra │ ├── CNAME │ └── pages │ │ └── denuncia.html ├── images │ ├── comunidades-locais │ │ ├── default.png │ │ ├── grupy-abc.png │ │ ├── grupy-df.png │ │ ├── grupy-rn.png │ │ ├── grupy-sanca.png │ │ ├── grupypr.png │ │ ├── grupysp.png │ │ ├── pug-ce.png │ │ ├── pug-ma.png │ │ ├── pug-pb.png │ │ ├── pug-pe.png │ │ ├── pug-pi.png │ │ ├── pug-se.png │ │ ├── py013.png │ │ ├── pytche.png │ │ ├── python-goias.png │ │ ├── python-mg.png │ │ └── pythonrio.png │ └── instalacao-windows │ │ ├── 01.png │ │ ├── 02.png │ │ ├── 03.png │ │ ├── 04.png │ │ ├── 05.png │ │ ├── 06.png │ │ ├── 09.png │ │ └── 11.gif └── pages │ ├── apyb-faq.md │ ├── apyb-fundo-inclusão.md │ ├── apyb-historia.md │ ├── apyb.md │ ├── cdc.md │ ├── cientifico.md │ ├── comunidades-locais.md │ ├── contribua.md │ ├── empresas.md │ ├── estatuto.md │ ├── ferramentas.md │ ├── games.md │ ├── gruposonline.md │ ├── home.md │ ├── instalacao-linux.md │ ├── instalacao-mac.md │ ├── instalacao-windows.md │ ├── introducao.md │ ├── lista-de-discussoes.md │ ├── mobile.md │ ├── premio-dorneles-tremea-jean-ferri.md │ ├── premio-dorneles-tremea.md │ ├── projetos.md │ ├── pyladies.md │ ├── python-brasil.md │ ├── qual-python.md │ ├── traducao.md │ ├── web.md │ └── wiki.md ├── develop_server.sh ├── empresas_generator.py ├── install_os_dependencies.sh ├── pelicanconf.py ├── publish-key.enc ├── publishconf.py ├── pyladies_generator.py ├── requirements.apt ├── requirements.txt └── themes └── pybr ├── gulpfile.js ├── package.json ├── static ├── css │ ├── pybr.min.css │ └── pygment.css ├── fonts │ ├── FontAwesome.otf │ ├── fontawesome-webfont.eot │ ├── fontawesome-webfont.svg │ ├── fontawesome-webfont.ttf │ ├── fontawesome-webfont.woff │ └── fontawesome-webfont.woff2 ├── img │ ├── favicon.ico │ ├── ponteiro_mapa.png │ └── site-logo.svg ├── js │ ├── bootstrap.min.js │ ├── jquery.min.js │ └── tether.min.js └── scss │ ├── _base.scss │ ├── _components.scss │ ├── _home.scss │ ├── _variables.scss │ └── pybr.scss └── templates ├── base.html ├── comunidade-google-group.html ├── comunidades-locais.html ├── empresas.html ├── google_tools.html ├── home.html ├── page.html ├── pyladies.html └── redirect.html /.github/workflows/build.yml: -------------------------------------------------------------------------------- 1 | name: Build 2 | 3 | on: 4 | push: 5 | branches: [ pelican ] 6 | 7 | jobs: 8 | build: 9 | runs-on: ubuntu-latest 10 | steps: 11 | - uses: actions/checkout@v2 12 | 13 | - uses: actions/setup-python@v2 14 | with: 15 | python-version: "3.10" 16 | 17 | - name: Install dependencies 18 | run: pip install -r requirements.txt 19 | 20 | - name: Build wiki 21 | run: make html 22 | 23 | - name: Publish wiki to gh-pages branch 24 | run: make push ping 25 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Byte-compiled / optimized / DLL files 2 | __pycache__/ 3 | *.py[cod] 4 | 5 | # C extensions 6 | *.so 7 | 8 | # Distribution / packaging 9 | .Python 10 | env/ 11 | build/ 12 | develop-eggs/ 13 | dist/ 14 | downloads/ 15 | eggs/ 16 | .eggs/ 17 | lib/ 18 | lib64/ 19 | parts/ 20 | sdist/ 21 | var/ 22 | *.egg-info/ 23 | .installed.cfg 24 | *.egg 25 | 26 | # PyInstaller 27 | # Usually these files are written by a python script from a template 28 | # before PyInstaller builds the exe, so as to inject date/other infos into it. 29 | *.manifest 30 | *.spec 31 | 32 | # Installer logs 33 | pip-log.txt 34 | pip-delete-this-directory.txt 35 | 36 | # Unit test / coverage reports 37 | htmlcov/ 38 | .tox/ 39 | .coverage 40 | .coverage.* 41 | .cache 42 | nosetests.xml 43 | coverage.xml 44 | *,cover 45 | 46 | # Translations 47 | *.mo 48 | *.pot 49 | 50 | # Django stuff: 51 | *.log 52 | 53 | # Sphinx documentation 54 | docs/_build/ 55 | 56 | # PyBuilder 57 | target/ 58 | output/ 59 | cache/ 60 | 61 | # pelican process id files 62 | srv.pid 63 | pelican.pid 64 | 65 | # Pycharm 66 | .idea/ 67 | 68 | venv 69 | .venv 70 | 71 | # virtualenv 72 | bin/ 73 | include/ 74 | lib64 75 | pip-selfcheck.json 76 | 77 | # pyladies 78 | content/pyladies/ 79 | 80 | # empresas 81 | content/empresas/ 82 | 83 | # node 84 | package-lock.json 85 | node_modules/ 86 | -------------------------------------------------------------------------------- /.plugins/bootstrapify/LICENSE: -------------------------------------------------------------------------------- 1 | GNU GENERAL PUBLIC LICENSE 2 | Version 2, June 1991 3 | 4 | Copyright (C) 1989, 1991 Free Software Foundation, Inc., 5 | 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 6 | Everyone is permitted to copy and distribute verbatim copies 7 | of this license document, but changing it is not allowed. 8 | 9 | Preamble 10 | 11 | The licenses for most software are designed to take away your 12 | freedom to share and change it. By contrast, the GNU General Public 13 | License is intended to guarantee your freedom to share and change free 14 | software--to make sure the software is free for all its users. This 15 | General Public License applies to most of the Free Software 16 | Foundation's software and to any other program whose authors commit to 17 | using it. (Some other Free Software Foundation software is covered by 18 | the GNU Lesser General Public License instead.) You can apply it to 19 | your programs, too. 20 | 21 | When we speak of free software, we are referring to freedom, not 22 | price. Our General Public Licenses are designed to make sure that you 23 | have the freedom to distribute copies of free software (and charge for 24 | this service if you wish), that you receive source code or can get it 25 | if you want it, that you can change the software or use pieces of it 26 | in new free programs; and that you know you can do these things. 27 | 28 | To protect your rights, we need to make restrictions that forbid 29 | anyone to deny you these rights or to ask you to surrender the rights. 30 | These restrictions translate to certain responsibilities for you if you 31 | distribute copies of the software, or if you modify it. 32 | 33 | For example, if you distribute copies of such a program, whether 34 | gratis or for a fee, you must give the recipients all the rights that 35 | you have. You must make sure that they, too, receive or can get the 36 | source code. And you must show them these terms so they know their 37 | rights. 38 | 39 | We protect your rights with two steps: (1) copyright the software, and 40 | (2) offer you this license which gives you legal permission to copy, 41 | distribute and/or modify the software. 42 | 43 | Also, for each author's protection and ours, we want to make certain 44 | that everyone understands that there is no warranty for this free 45 | software. If the software is modified by someone else and passed on, we 46 | want its recipients to know that what they have is not the original, so 47 | that any problems introduced by others will not reflect on the original 48 | authors' reputations. 49 | 50 | Finally, any free program is threatened constantly by software 51 | patents. We wish to avoid the danger that redistributors of a free 52 | program will individually obtain patent licenses, in effect making the 53 | program proprietary. To prevent this, we have made it clear that any 54 | patent must be licensed for everyone's free use or not licensed at all. 55 | 56 | The precise terms and conditions for copying, distribution and 57 | modification follow. 58 | 59 | GNU GENERAL PUBLIC LICENSE 60 | TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 61 | 62 | 0. This License applies to any program or other work which contains 63 | a notice placed by the copyright holder saying it may be distributed 64 | under the terms of this General Public License. The "Program", below, 65 | refers to any such program or work, and a "work based on the Program" 66 | means either the Program or any derivative work under copyright law: 67 | that is to say, a work containing the Program or a portion of it, 68 | either verbatim or with modifications and/or translated into another 69 | language. (Hereinafter, translation is included without limitation in 70 | the term "modification".) Each licensee is addressed as "you". 71 | 72 | Activities other than copying, distribution and modification are not 73 | covered by this License; they are outside its scope. The act of 74 | running the Program is not restricted, and the output from the Program 75 | is covered only if its contents constitute a work based on the 76 | Program (independent of having been made by running the Program). 77 | Whether that is true depends on what the Program does. 78 | 79 | 1. You may copy and distribute verbatim copies of the Program's 80 | source code as you receive it, in any medium, provided that you 81 | conspicuously and appropriately publish on each copy an appropriate 82 | copyright notice and disclaimer of warranty; keep intact all the 83 | notices that refer to this License and to the absence of any warranty; 84 | and give any other recipients of the Program a copy of this License 85 | along with the Program. 86 | 87 | You may charge a fee for the physical act of transferring a copy, and 88 | you may at your option offer warranty protection in exchange for a fee. 89 | 90 | 2. You may modify your copy or copies of the Program or any portion 91 | of it, thus forming a work based on the Program, and copy and 92 | distribute such modifications or work under the terms of Section 1 93 | above, provided that you also meet all of these conditions: 94 | 95 | a) You must cause the modified files to carry prominent notices 96 | stating that you changed the files and the date of any change. 97 | 98 | b) You must cause any work that you distribute or publish, that in 99 | whole or in part contains or is derived from the Program or any 100 | part thereof, to be licensed as a whole at no charge to all third 101 | parties under the terms of this License. 102 | 103 | c) If the modified program normally reads commands interactively 104 | when run, you must cause it, when started running for such 105 | interactive use in the most ordinary way, to print or display an 106 | announcement including an appropriate copyright notice and a 107 | notice that there is no warranty (or else, saying that you provide 108 | a warranty) and that users may redistribute the program under 109 | these conditions, and telling the user how to view a copy of this 110 | License. (Exception: if the Program itself is interactive but 111 | does not normally print such an announcement, your work based on 112 | the Program is not required to print an announcement.) 113 | 114 | These requirements apply to the modified work as a whole. If 115 | identifiable sections of that work are not derived from the Program, 116 | and can be reasonably considered independent and separate works in 117 | themselves, then this License, and its terms, do not apply to those 118 | sections when you distribute them as separate works. But when you 119 | distribute the same sections as part of a whole which is a work based 120 | on the Program, the distribution of the whole must be on the terms of 121 | this License, whose permissions for other licensees extend to the 122 | entire whole, and thus to each and every part regardless of who wrote it. 123 | 124 | Thus, it is not the intent of this section to claim rights or contest 125 | your rights to work written entirely by you; rather, the intent is to 126 | exercise the right to control the distribution of derivative or 127 | collective works based on the Program. 128 | 129 | In addition, mere aggregation of another work not based on the Program 130 | with the Program (or with a work based on the Program) on a volume of 131 | a storage or distribution medium does not bring the other work under 132 | the scope of this License. 133 | 134 | 3. You may copy and distribute the Program (or a work based on it, 135 | under Section 2) in object code or executable form under the terms of 136 | Sections 1 and 2 above provided that you also do one of the following: 137 | 138 | a) Accompany it with the complete corresponding machine-readable 139 | source code, which must be distributed under the terms of Sections 140 | 1 and 2 above on a medium customarily used for software interchange; or, 141 | 142 | b) Accompany it with a written offer, valid for at least three 143 | years, to give any third party, for a charge no more than your 144 | cost of physically performing source distribution, a complete 145 | machine-readable copy of the corresponding source code, to be 146 | distributed under the terms of Sections 1 and 2 above on a medium 147 | customarily used for software interchange; or, 148 | 149 | c) Accompany it with the information you received as to the offer 150 | to distribute corresponding source code. (This alternative is 151 | allowed only for noncommercial distribution and only if you 152 | received the program in object code or executable form with such 153 | an offer, in accord with Subsection b above.) 154 | 155 | The source code for a work means the preferred form of the work for 156 | making modifications to it. For an executable work, complete source 157 | code means all the source code for all modules it contains, plus any 158 | associated interface definition files, plus the scripts used to 159 | control compilation and installation of the executable. However, as a 160 | special exception, the source code distributed need not include 161 | anything that is normally distributed (in either source or binary 162 | form) with the major components (compiler, kernel, and so on) of the 163 | operating system on which the executable runs, unless that component 164 | itself accompanies the executable. 165 | 166 | If distribution of executable or object code is made by offering 167 | access to copy from a designated place, then offering equivalent 168 | access to copy the source code from the same place counts as 169 | distribution of the source code, even though third parties are not 170 | compelled to copy the source along with the object code. 171 | 172 | 4. You may not copy, modify, sublicense, or distribute the Program 173 | except as expressly provided under this License. Any attempt 174 | otherwise to copy, modify, sublicense or distribute the Program is 175 | void, and will automatically terminate your rights under this License. 176 | However, parties who have received copies, or rights, from you under 177 | this License will not have their licenses terminated so long as such 178 | parties remain in full compliance. 179 | 180 | 5. You are not required to accept this License, since you have not 181 | signed it. However, nothing else grants you permission to modify or 182 | distribute the Program or its derivative works. These actions are 183 | prohibited by law if you do not accept this License. Therefore, by 184 | modifying or distributing the Program (or any work based on the 185 | Program), you indicate your acceptance of this License to do so, and 186 | all its terms and conditions for copying, distributing or modifying 187 | the Program or works based on it. 188 | 189 | 6. Each time you redistribute the Program (or any work based on the 190 | Program), the recipient automatically receives a license from the 191 | original licensor to copy, distribute or modify the Program subject to 192 | these terms and conditions. You may not impose any further 193 | restrictions on the recipients' exercise of the rights granted herein. 194 | You are not responsible for enforcing compliance by third parties to 195 | this License. 196 | 197 | 7. If, as a consequence of a court judgment or allegation of patent 198 | infringement or for any other reason (not limited to patent issues), 199 | conditions are imposed on you (whether by court order, agreement or 200 | otherwise) that contradict the conditions of this License, they do not 201 | excuse you from the conditions of this License. If you cannot 202 | distribute so as to satisfy simultaneously your obligations under this 203 | License and any other pertinent obligations, then as a consequence you 204 | may not distribute the Program at all. For example, if a patent 205 | license would not permit royalty-free redistribution of the Program by 206 | all those who receive copies directly or indirectly through you, then 207 | the only way you could satisfy both it and this License would be to 208 | refrain entirely from distribution of the Program. 209 | 210 | If any portion of this section is held invalid or unenforceable under 211 | any particular circumstance, the balance of the section is intended to 212 | apply and the section as a whole is intended to apply in other 213 | circumstances. 214 | 215 | It is not the purpose of this section to induce you to infringe any 216 | patents or other property right claims or to contest validity of any 217 | such claims; this section has the sole purpose of protecting the 218 | integrity of the free software distribution system, which is 219 | implemented by public license practices. Many people have made 220 | generous contributions to the wide range of software distributed 221 | through that system in reliance on consistent application of that 222 | system; it is up to the author/donor to decide if he or she is willing 223 | to distribute software through any other system and a licensee cannot 224 | impose that choice. 225 | 226 | This section is intended to make thoroughly clear what is believed to 227 | be a consequence of the rest of this License. 228 | 229 | 8. If the distribution and/or use of the Program is restricted in 230 | certain countries either by patents or by copyrighted interfaces, the 231 | original copyright holder who places the Program under this License 232 | may add an explicit geographical distribution limitation excluding 233 | those countries, so that distribution is permitted only in or among 234 | countries not thus excluded. In such case, this License incorporates 235 | the limitation as if written in the body of this License. 236 | 237 | 9. The Free Software Foundation may publish revised and/or new versions 238 | of the General Public License from time to time. Such new versions will 239 | be similar in spirit to the present version, but may differ in detail to 240 | address new problems or concerns. 241 | 242 | Each version is given a distinguishing version number. If the Program 243 | specifies a version number of this License which applies to it and "any 244 | later version", you have the option of following the terms and conditions 245 | either of that version or of any later version published by the Free 246 | Software Foundation. If the Program does not specify a version number of 247 | this License, you may choose any version ever published by the Free Software 248 | Foundation. 249 | 250 | 10. If you wish to incorporate parts of the Program into other free 251 | programs whose distribution conditions are different, write to the author 252 | to ask for permission. For software which is copyrighted by the Free 253 | Software Foundation, write to the Free Software Foundation; we sometimes 254 | make exceptions for this. Our decision will be guided by the two goals 255 | of preserving the free status of all derivatives of our free software and 256 | of promoting the sharing and reuse of software generally. 257 | 258 | NO WARRANTY 259 | 260 | 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY 261 | FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN 262 | OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES 263 | PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED 264 | OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 265 | MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS 266 | TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE 267 | PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, 268 | REPAIR OR CORRECTION. 269 | 270 | 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING 271 | WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR 272 | REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, 273 | INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING 274 | OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED 275 | TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY 276 | YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER 277 | PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE 278 | POSSIBILITY OF SUCH DAMAGES. 279 | 280 | END OF TERMS AND CONDITIONS 281 | 282 | How to Apply These Terms to Your New Programs 283 | 284 | If you develop a new program, and you want it to be of the greatest 285 | possible use to the public, the best way to achieve this is to make it 286 | free software which everyone can redistribute and change under these terms. 287 | 288 | To do so, attach the following notices to the program. It is safest 289 | to attach them to the start of each source file to most effectively 290 | convey the exclusion of warranty; and each file should have at least 291 | the "copyright" line and a pointer to where the full notice is found. 292 | 293 | {description} 294 | Copyright (C) {year} {fullname} 295 | 296 | This program is free software; you can redistribute it and/or modify 297 | it under the terms of the GNU General Public License as published by 298 | the Free Software Foundation; either version 2 of the License, or 299 | (at your option) any later version. 300 | 301 | This program is distributed in the hope that it will be useful, 302 | but WITHOUT ANY WARRANTY; without even the implied warranty of 303 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 304 | GNU General Public License for more details. 305 | 306 | You should have received a copy of the GNU General Public License along 307 | with this program; if not, write to the Free Software Foundation, Inc., 308 | 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. 309 | 310 | Also add information on how to contact you by electronic and paper mail. 311 | 312 | If the program is interactive, make it output a short notice like this 313 | when it starts in an interactive mode: 314 | 315 | Gnomovision version 69, Copyright (C) year name of author 316 | Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. 317 | This is free software, and you are welcome to redistribute it 318 | under certain conditions; type `show c' for details. 319 | 320 | The hypothetical commands `show w' and `show c' should show the appropriate 321 | parts of the General Public License. Of course, the commands you use may 322 | be called something other than `show w' and `show c'; they could even be 323 | mouse-clicks or menu items--whatever suits your program. 324 | 325 | You should also get your employer (if you work as a programmer) or your 326 | school, if any, to sign a "copyright disclaimer" for the program, if 327 | necessary. Here is a sample; alter the names: 328 | 329 | Yoyodyne, Inc., hereby disclaims all copyright interest in the program 330 | `Gnomovision' (which makes passes at compilers) written by James Hacker. 331 | 332 | {signature of Ty Coon}, 1 April 1989 333 | Ty Coon, President of Vice 334 | 335 | This General Public License does not permit incorporating your program into 336 | proprietary programs. If your program is a subroutine library, you may 337 | consider it more useful to permit linking proprietary applications with the 338 | library. If this is what you want to do, use the GNU Lesser General 339 | Public License instead of this License. 340 | -------------------------------------------------------------------------------- /.plugins/bootstrapify/README.md: -------------------------------------------------------------------------------- 1 | bootstrapify 2 | =================================== 3 | 4 | This [pelican](https://github.com/getpelican/pelican) plugin modifies article and page html to use bootstrap's default classes. This is especially handy if you want to write tables in markdown, since the `attr_list` extension does not play nice with `tables`. 5 | 6 | #Requirements 7 | * Beautifulsoup4 - install via `pip install beautifulsoup4` 8 | 9 | #Features 10 | * Adds `table table-striped table-hover` to all `` elements. 11 | * Adds `img-responsive` to all `` elements. 12 | * Use `BOOTSTRAPIFY` in your Pelican configuration file to pass a `{'css-selector': ['list-of-classes']}` dictionary to the plugin. Bootstrapify will append `list-of-classes` to all tags that match `css-selector`. The selector can be as simple as a tag name (`table` or `p`) or as complicated as `a.menu:nth-of-type(3)` (see the [Beautifulsoup4 documentation](http://www.crummy.com/software/BeautifulSoup/bs4/doc/#css-selectors)). 13 | 14 | #Example for md tables 15 | 1. Write your table in markdown 16 | 17 | ``` 18 | | Protocol | Contact Information 19 | |:-------------- |:-----------------------------------------------------| 20 | | jabber/xmpp | [winlu@jabber.at](winlu@jabber.at) | 21 | | email | [derwinlu@gmail.com](mailto:derwinlu@gmail.com) | 22 | | IRC - freenode | winlu | 23 | ``` 24 | 25 | 26 | 2. there is no step 2, the plugin adds the needed classes to the `
` node, resulting in the following output: 27 | 28 | 29 | ``` 30 |
31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 |
ProtocolContact Information
jabber/xmppwinlu@jabber.at
emailderwinlu@gmail.com
IRC - freenodewinlu
52 | ``` 53 | 54 | 55 | #Known Issues 56 | * plugin seems not to fire for drafts 57 | * not enough customization possible, maybe read article,page metadata for more options 58 | -------------------------------------------------------------------------------- /.plugins/bootstrapify/__init__.py: -------------------------------------------------------------------------------- 1 | from .bootstrapify import * 2 | -------------------------------------------------------------------------------- /.plugins/bootstrapify/bootstrapify.py: -------------------------------------------------------------------------------- 1 | ''' 2 | bootstrapify 3 | =================================== 4 | This pelican plugin adds css classes to nonstatic html output. 5 | 6 | This is especially useful if you want to use bootstrap and want 7 | to add its default classes to your tables and images. 8 | ''' 9 | 10 | from bs4 import BeautifulSoup 11 | from pelican import signals, contents 12 | 13 | 14 | def set_default_config(settings, bootstrapify_default): 15 | settings.setdefault('BOOTSTRAPIFY', bootstrapify_default) 16 | 17 | 18 | def init_default_config(pelican): 19 | from pelican.settings import DEFAULT_CONFIG 20 | bootstrapify_default = { 21 | 'table': ['table', 'table-striped', 'table-hover'], 22 | 'img': ['img-responsive'] 23 | } 24 | 25 | set_default_config(DEFAULT_CONFIG, bootstrapify_default) 26 | if(pelican): 27 | set_default_config(pelican.settings, bootstrapify_default) 28 | 29 | 30 | def replace_in_with(searchterm, soup, attributes): 31 | for item in soup.select(searchterm): 32 | attribute_set = set(item.attrs.get('class', []) + attributes) 33 | item.attrs['class'] = list(attribute_set) 34 | 35 | 36 | def bootstrapify(content): 37 | if isinstance(content, contents.Static): 38 | return 39 | 40 | replacements = content.settings['BOOTSTRAPIFY'] 41 | soup = BeautifulSoup(content._content, 'html.parser') 42 | 43 | for selector, classes in replacements.items(): 44 | replace_in_with(selector, soup, classes) 45 | 46 | content._content = soup.decode() 47 | 48 | 49 | def register(): 50 | signals.initialized.connect(init_default_config) 51 | signals.content_object_init.connect(bootstrapify) 52 | -------------------------------------------------------------------------------- /.plugins/replacer/README.rst: -------------------------------------------------------------------------------- 1 | `Replacer `_ 2 | ====================================================== 3 | 4 | This is plugin of Pelican. You can replace a text of a generated HTML. You can write replacing rule in your pelicanconf.py. 5 | 6 | Example 7 | ======= 8 | 9 | This example is replacing from '' to '
'. 10 | 11 | :: 12 | 13 | REPLACES = ( 14 | (u'
', u'
'), 15 | ) 16 | -------------------------------------------------------------------------------- /.plugins/replacer/__init__.py: -------------------------------------------------------------------------------- 1 | from .replacer import * 2 | -------------------------------------------------------------------------------- /.plugins/replacer/replacer.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | import pelican 3 | import sys 4 | 5 | python3 = sys.version_info >= (3, 0, 0) 6 | 7 | 8 | def init(pelican_object): 9 | # I have no good idea. Pass settings to replace function. 10 | global replaces 11 | replaces = pelican_object.settings.get('REPLACES', ()) 12 | 13 | 14 | def replace(path, context): 15 | with open(path, 'r') as f: 16 | s = f.read() 17 | for src, tgt in replaces: 18 | if python3: 19 | s = s.replace(src, tgt) 20 | else: 21 | if type(s) is str: 22 | s = s.decode('utf-8').replace(src.decode('utf-8'), tgt.decode('utf-8')) 23 | else: 24 | s = s.replace(src, tgt) 25 | 26 | with open(path, 'w') as f: 27 | if python3: 28 | f.write(s) 29 | else: 30 | f.write(s.encode('utf-8')) 31 | 32 | 33 | def register(): 34 | pelican.signals.initialized.connect(init) 35 | pelican.signals.content_written.connect(replace) 36 | -------------------------------------------------------------------------------- /.plugins/sitemap/__init__.py: -------------------------------------------------------------------------------- 1 | from .sitemap import * -------------------------------------------------------------------------------- /.plugins/sitemap/sitemap.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | ''' 3 | Sitemap 4 | ------- 5 | 6 | The sitemap plugin generates plain-text or XML sitemaps. 7 | ''' 8 | 9 | from __future__ import unicode_literals 10 | 11 | import collections 12 | import os.path 13 | 14 | from datetime import datetime 15 | from logging import warning, info 16 | from codecs import open 17 | from pytz import timezone 18 | 19 | from pelican import signals, contents 20 | from pelican.utils import get_date 21 | 22 | TXT_HEADER = """{0}/index.html 23 | {0}/archives.html 24 | {0}/tags.html 25 | {0}/categories.html 26 | """ 27 | 28 | XML_HEADER = """ 29 | 32 | """ 33 | 34 | XML_URL = """ 35 | 36 | {0}/{1} 37 | {2} 38 | {3} 39 | {4} 40 | 41 | """ 42 | 43 | XML_FOOTER = """ 44 | 45 | """ 46 | 47 | 48 | def format_date(date): 49 | if date.tzinfo: 50 | tz = date.strftime('%z') 51 | tz = tz[:-2] + ':' + tz[-2:] 52 | else: 53 | tz = "-00:00" 54 | return date.strftime("%Y-%m-%dT%H:%M:%S") + tz 55 | 56 | class SitemapGenerator(object): 57 | 58 | def __init__(self, context, settings, path, theme, output_path, *null): 59 | 60 | self.output_path = output_path 61 | self.context = context 62 | self.now = datetime.now() 63 | self.siteurl = settings.get('SITEURL') 64 | 65 | 66 | self.default_timezone = settings.get('TIMEZONE', 'UTC') 67 | self.timezone = getattr(self, 'timezone', self.default_timezone) 68 | self.timezone = timezone(self.timezone) 69 | 70 | self.format = 'xml' 71 | 72 | self.changefreqs = { 73 | 'articles': 'monthly', 74 | 'indexes': 'daily', 75 | 'pages': 'monthly' 76 | } 77 | 78 | self.priorities = { 79 | 'articles': 0.5, 80 | 'indexes': 0.5, 81 | 'pages': 0.5 82 | } 83 | 84 | config = settings.get('SITEMAP', {}) 85 | 86 | if not isinstance(config, dict): 87 | warning("sitemap plugin: the SITEMAP setting must be a dict") 88 | else: 89 | fmt = config.get('format') 90 | pris = config.get('priorities') 91 | chfreqs = config.get('changefreqs') 92 | 93 | if fmt not in ('xml', 'txt'): 94 | warning("sitemap plugin: SITEMAP['format'] must be `txt' or `xml'") 95 | warning("sitemap plugin: Setting SITEMAP['format'] on `xml'") 96 | elif fmt == 'txt': 97 | self.format = fmt 98 | return 99 | 100 | valid_keys = ('articles', 'indexes', 'pages') 101 | valid_chfreqs = ('always', 'hourly', 'daily', 'weekly', 'monthly', 102 | 'yearly', 'never') 103 | 104 | if isinstance(pris, dict): 105 | # We use items for Py3k compat. .iteritems() otherwise 106 | for k, v in pris.items(): 107 | if k in valid_keys and not isinstance(v, (int, float)): 108 | default = self.priorities[k] 109 | warning("sitemap plugin: priorities must be numbers") 110 | warning("sitemap plugin: setting SITEMAP['priorities']" 111 | "['{0}'] on {1}".format(k, default)) 112 | pris[k] = default 113 | self.priorities.update(pris) 114 | elif pris is not None: 115 | warning("sitemap plugin: SITEMAP['priorities'] must be a dict") 116 | warning("sitemap plugin: using the default values") 117 | 118 | if isinstance(chfreqs, dict): 119 | # .items() for py3k compat. 120 | for k, v in chfreqs.items(): 121 | if k in valid_keys and v not in valid_chfreqs: 122 | default = self.changefreqs[k] 123 | warning("sitemap plugin: invalid changefreq `{0}'".format(v)) 124 | warning("sitemap plugin: setting SITEMAP['changefreqs']" 125 | "['{0}'] on '{1}'".format(k, default)) 126 | chfreqs[k] = default 127 | self.changefreqs.update(chfreqs) 128 | elif chfreqs is not None: 129 | warning("sitemap plugin: SITEMAP['changefreqs'] must be a dict") 130 | warning("sitemap plugin: using the default values") 131 | 132 | def write_url(self, page, fd): 133 | 134 | if getattr(page, 'status', 'published') != 'published': 135 | return 136 | 137 | # We can disable categories/authors/etc by using False instead of '' 138 | if not page.save_as: 139 | return 140 | 141 | page_path = os.path.join(self.output_path, page.save_as) 142 | if not os.path.exists(page_path): 143 | return 144 | 145 | lastdate = getattr(page, 'date', self.now) 146 | try: 147 | lastdate = self.get_date_modified(page, lastdate) 148 | except ValueError: 149 | warning("sitemap plugin: " + page.save_as + " has invalid modification date,") 150 | warning("sitemap plugin: using date value as lastmod.") 151 | lastmod = format_date(lastdate) 152 | 153 | if isinstance(page, contents.Article): 154 | pri = self.priorities['articles'] 155 | chfreq = self.changefreqs['articles'] 156 | elif isinstance(page, contents.Page): 157 | pri = self.priorities['pages'] 158 | chfreq = self.changefreqs['pages'] 159 | else: 160 | pri = self.priorities['indexes'] 161 | chfreq = self.changefreqs['indexes'] 162 | 163 | pageurl = '' if page.url == 'index.html' else page.url 164 | 165 | #Exclude URLs from the sitemap: 166 | sitemapExclude = [] 167 | 168 | if self.format == 'xml': 169 | if pageurl not in sitemapExclude: 170 | fd.write(XML_URL.format(self.siteurl, pageurl, lastmod, chfreq, pri)) 171 | else: 172 | fd.write(self.siteurl + '/' + pageurl + '\n') 173 | 174 | def get_date_modified(self, page, default): 175 | if hasattr(page, 'modified'): 176 | if isinstance(page.modified, datetime): 177 | return page.modified 178 | return get_date(page.modified) 179 | else: 180 | return default 181 | 182 | def set_url_wrappers_modification_date(self, wrappers): 183 | for (wrapper, articles) in wrappers: 184 | lastmod = datetime.min.replace(tzinfo=self.timezone) 185 | for article in articles: 186 | lastmod = max(lastmod, article.date.replace(tzinfo=self.timezone)) 187 | try: 188 | modified = self.get_date_modified(article, datetime.min).replace(tzinfo=self.timezone) 189 | lastmod = max(lastmod, modified) 190 | except ValueError: 191 | # Supressed: user will be notified. 192 | pass 193 | setattr(wrapper, 'modified', str(lastmod)) 194 | 195 | def generate_output(self, writer): 196 | path = os.path.join(self.output_path, 'sitemap.{0}'.format(self.format)) 197 | 198 | pages = self.context['pages'] + self.context['articles'] \ 199 | + [ c for (c, a) in self.context['categories']] \ 200 | + [ t for (t, a) in self.context['tags']] \ 201 | + [ a for (a, b) in self.context['authors']] 202 | 203 | self.set_url_wrappers_modification_date(self.context['categories']) 204 | self.set_url_wrappers_modification_date(self.context['tags']) 205 | self.set_url_wrappers_modification_date(self.context['authors']) 206 | 207 | for article in self.context['articles']: 208 | pages += article.translations 209 | 210 | info('writing {0}'.format(path)) 211 | 212 | with open(path, 'w', encoding='utf-8') as fd: 213 | 214 | if self.format == 'xml': 215 | fd.write(XML_HEADER) 216 | else: 217 | fd.write(TXT_HEADER.format(self.siteurl)) 218 | 219 | FakePage = collections.namedtuple('FakePage', 220 | ['status', 221 | 'date', 222 | 'url', 223 | 'save_as']) 224 | 225 | for standard_page_url in ['index.html', 226 | 'archives.html', 227 | 'tags.html', 228 | 'categories.html']: 229 | fake = FakePage(status='published', 230 | date=self.now, 231 | url=standard_page_url, 232 | save_as=standard_page_url) 233 | self.write_url(fake, fd) 234 | 235 | for page in pages: 236 | self.write_url(page, fd) 237 | 238 | if self.format == 'xml': 239 | fd.write(XML_FOOTER) 240 | 241 | 242 | def get_generators(generators): 243 | return SitemapGenerator 244 | 245 | 246 | def register(): 247 | signals.get_generators.connect(get_generators) 248 | -------------------------------------------------------------------------------- /.plugins/welcome-helpers/__init__.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | __title__ = 'welcome-helpers' 4 | 5 | from .welcomehelpers import register 6 | -------------------------------------------------------------------------------- /.plugins/welcome-helpers/welcomehelpers.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | from __future__ import unicode_literals 4 | 5 | from docutils import nodes 6 | from docutils.parsers.rst import directives, Directive 7 | 8 | class WelcomeButton(Directive): 9 | """ Include a Button 10 | 11 | Usage: 12 | .. welcome-button:: Title 13 | :color: css-color 14 | :target: URL 15 | """ 16 | 17 | required_arguments = 1 18 | optional_arguments = 3 19 | option_spec = { 20 | 'color': str, 21 | 'target': str, 22 | } 23 | 24 | final_argument_whitespace = False 25 | has_content = True 26 | 27 | def run(self): 28 | html = '{}' 29 | if 'color' in self.options: 30 | color = self.options['color'] 31 | else: 32 | color = 'blue-grey' 33 | 34 | if 'target' in self.options: 35 | target = self.options['target'] 36 | else: 37 | target = '#' 38 | 39 | if self.arguments: 40 | title = ' '.join(self.arguments) 41 | else: 42 | title = 'Mais...' 43 | 44 | html = html.format(color, target, title) 45 | return [nodes.raw('', html, format='html')] 46 | 47 | class WelcomeIcon(Directive): 48 | """ Include a Welcome Icon 49 | 50 | Usage: 51 | .. welcome-icon:: Title 52 | :icon: icon-name 53 | :class: class 54 | 55 | Body text 56 | """ 57 | 58 | required_arguments = 0 59 | optional_arguments = 2 60 | option_spec = { 61 | 'icon': str, 62 | 'class': str, 63 | } 64 | 65 | final_argument_whitespace = False 66 | has_content = True 67 | node_class = nodes.TextElement 68 | 69 | def run(self): 70 | html_class = self.options.get('class', '') 71 | html = ['
'.format(html_class)] 72 | if 'icon' in self.options: 73 | icon = '

\n' +\ 74 | ' \n' +\ 75 | '

' 76 | html.append(icon.format(self.options['icon'])) 77 | 78 | if self.arguments: 79 | title = ' '.join(self.arguments) 80 | title = '
{}
'.format(title) 81 | html.append(title) 82 | 83 | if self.content: 84 | text = '\n'.join(self.content) 85 | body = self.node_class(rawsource=text) 86 | self.state.nested_parse(self.content, self.content_offset, body) 87 | 88 | if isinstance(body[0], nodes.paragraph): 89 | html.append('

{}

'.format(body[0].astext())) 90 | buttons = body[1:] 91 | else: 92 | buttons = body 93 | 94 | if buttons: 95 | pre_html = ['
'] 96 | for button in buttons: 97 | pre_html.append(button.astext()) 98 | pre_html.append("
") 99 | pre_html = "\n".join(pre_html) 100 | html.append(pre_html) 101 | 102 | html.append("
") 103 | html = "\n".join(html) 104 | return [nodes.raw('', html, format='html')] 105 | 106 | class WelcomeSection(Directive): 107 | """ Include a Welcome Section 108 | 109 | Usage: 110 | .. welcome-section:: Title 111 | :color: css color 112 | 113 | Body text including home icons 114 | """ 115 | 116 | required_arguments = 0 117 | optional_arguments = 20 118 | option_spec = { 119 | 'color': str, 120 | } 121 | 122 | final_argument_whitespace = False 123 | has_content = True 124 | node_class = nodes.TextElement 125 | 126 | def run(self): 127 | html = [] 128 | if 'color' in self.options: 129 | color_class = self.options['color'] 130 | html.append('
'.format(color_class)) 131 | else: 132 | html.append('
') 133 | 134 | html.append('
') 135 | html.append('
') 136 | 137 | if self.arguments: 138 | title = ' '.join(self.arguments) 139 | title = '

{}

'.format(title) 140 | html.append(title) 141 | 142 | html.append('
') 143 | 144 | if self.content: 145 | text = '\n'.join(self.content) 146 | body = self.node_class(rawsource=text) 147 | self.state.nested_parse(self.content, self.content_offset, body) 148 | html.append(body.astext()) 149 | 150 | html.append("
") 151 | html.append("
") 152 | html.append("
") 153 | html.append("
") 154 | html = "\n".join(html) 155 | return [nodes.raw('', html, format='html')] 156 | 157 | 158 | def register(): 159 | directives.register_directive('welcome-icon', WelcomeIcon) 160 | directives.register_directive('welcome-section', WelcomeSection) 161 | directives.register_directive('welcome-button', WelcomeButton) 162 | -------------------------------------------------------------------------------- /Dockerfile: -------------------------------------------------------------------------------- 1 | FROM ubuntu:24.04 2 | 3 | RUN mkdir -p /home/wiki 4 | COPY . /home/wiki 5 | WORKDIR /home/wiki 6 | RUN bash install_os_dependencies.sh install 7 | RUN python3 -m venv /opt/venv 8 | RUN /opt/venv/bin/python3 -m pip install -r requirements.txt 9 | ENV PATH="/opt/venv/bin:$PATH" 10 | CMD ["/bin/bash", "develop_server.sh", "docker_start"] 11 | -------------------------------------------------------------------------------- /Makefile: -------------------------------------------------------------------------------- 1 | PY?=python 2 | PELICAN?=pelican 3 | PELICANOPTS= 4 | 5 | BASEDIR=$(CURDIR) 6 | INPUTDIR=$(BASEDIR)/content 7 | OUTPUTDIR=$(BASEDIR)/output 8 | CONFFILE=$(BASEDIR)/pelicanconf.py 9 | PUBLISHCONF=$(BASEDIR)/publishconf.py 10 | 11 | GITHUB_PAGES_BRANCH=gh-pages 12 | 13 | DEBUG ?= 0 14 | ifeq ($(DEBUG), 1) 15 | PELICANOPTS += -D 16 | endif 17 | 18 | help: 19 | @echo 'Makefile for a pelican Web site ' 20 | @echo ' ' 21 | @echo 'Usage: ' 22 | @echo ' make html (re)generate the web site ' 23 | @echo ' make clean remove the generated files ' 24 | @echo ' make regenerate regenerate files upon modification ' 25 | @echo ' make publish generate using production settings ' 26 | @echo ' make serve [PORT=8000] serve site at http://localhost:8000' 27 | @echo ' make devserver [PORT=8000] start/restart develop_server.sh ' 28 | @echo ' make stopserver stop local server ' 29 | @echo ' make github upload the web site via gh-pages ' 30 | @echo ' ' 31 | @echo 'Set the DEBUG variable to 1 to enable debugging, e.g. make DEBUG=1 html' 32 | @echo ' ' 33 | 34 | html: import_pyladies import_empresas 35 | $(PELICAN) $(INPUTDIR) -o $(OUTPUTDIR) -s $(CONFFILE) $(PELICANOPTS) 36 | 37 | clean: 38 | [ ! -d $(OUTPUTDIR) ] || rm -rf $(OUTPUTDIR) 39 | 40 | regenerate: import_pyladies import_empresas 41 | $(PELICAN) -r $(INPUTDIR) -o $(OUTPUTDIR) -s $(CONFFILE) $(PELICANOPTS) 42 | 43 | serve: import_pyladies import_empresas 44 | ifdef PORT 45 | cd $(OUTPUTDIR) && $(PY) -m pelican.server $(PORT) 46 | else 47 | cd $(OUTPUTDIR) && $(PY) -m pelican.server 48 | endif 49 | 50 | devserver: import_pyladies import_empresas 51 | ifdef PORT 52 | $(BASEDIR)/develop_server.sh restart $(PORT) 53 | else 54 | $(BASEDIR)/develop_server.sh restart 55 | endif 56 | 57 | stopserver: 58 | kill -9 `cat pelican.pid` 59 | kill -9 `cat srv.pid` 60 | @echo 'Stopped Pelican and SimpleHTTPServer processes running in background.' 61 | 62 | publish: import_pyladies import_empresas 63 | $(PELICAN) $(INPUTDIR) -o $(OUTPUTDIR) -s $(PUBLISHCONF) $(PELICANOPTS) 64 | 65 | github: publish 66 | ghp-import -m "Generate APyB site" -b $(GITHUB_PAGES_BRANCH) $(OUTPUTDIR) 67 | git push origin $(GITHUB_PAGES_BRANCH) 68 | 69 | push: publish 70 | git config --global user.email "contato@python.org.br" 71 | git config --global user.name "APyB Bot" 72 | ghp-import -m "Updated APyB site." -b $(GITHUB_PAGES_BRANCH) $(OUTPUTDIR) 73 | git push -fq origin $(GITHUB_PAGES_BRANCH) > /dev/null 74 | 75 | import_pyladies: 76 | python pyladies_generator.py 77 | 78 | import_empresas: 79 | python empresas_generator.py 80 | 81 | ping: 82 | curl -Is http://www.google.com/webmasters/tools/ping?sitemap=http://pythonbrasil.github.io/wiki/sitemap.xml | grep "200 OK" || echo "Erro pinging Google" 83 | curl -Is http://www.bing.com/webmaster/ping.aspx?siteMap=http://pythonbrasil.github.io/wiki/sitemap.xml | grep "200 OK" || echo "Erro pinging Bing" 84 | 85 | .PHONY: html help clean regenerate serve devserver publish github 86 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | 2 | # Site estático python.org.br 3 | 4 | [![Build Status](https://github.com///actions/workflows//badge.svg)](https://github.com/pythonbrasil/wiki/actions/workflows/build.yml) 5 | 6 | Site Live: [http://python.org.br/](http://python.org.br/) 7 | 8 | Repositório: [https://github.com/pythonbrasil/wiki](https://github.com/pythonbrasil/wiki) 9 | 10 | Para contribuír com a melhoria do conteúdo deste site basta acessar alguma das páginas mapeadas abaixo, editar seu conteúdo e submeter sua alteração como um pull request. 11 | 12 | ### Páginas do Impressione-se 13 | 14 | 1. **Empresas** - O conteúdo em formato JSON criado através de uma importação do 15 | conteúdo encontrado em 16 | [pyBusinesses-BR](https://github.com/pythonbrasil/pyBusinesses-BR). 17 | Essa importação é feita quando *make html* é executado (ver abaixo), pelo 18 | arquivo [empresas_generator.py](empresas_generator.py) e os arquivos são salvos 19 | em content/empresas. 20 | 1. **Projetos Brasileiros** - Conteúdo em formato markdown no arquivo 21 | [content/pages/projetos.md](content/pages/projetos.md) 22 | 23 | ### Páginas do Inicie-se 24 | 25 | 1. **Introdução** - Conteúdo em formato markdown no arquivo 26 | [content/pages/introducao.md](content/pages/introducao.md). 27 | 28 | 1. **Qual python?** - Conteúdo em formato markdown no arquivo 29 | [content/pages/qual-python.md](content/pages/qual-python.md). 30 | 31 | 1. **Download do Python** - Apenas um link para [página de download do Python] 32 | (https://www.python.org/downloads/). Esse link, assim como todos os itens do 33 | menu principal, são definidos na arquivo [pelicanconf.py](pelicanconf.py) na 34 | variável *NAVBAR_HOME_LINKS*. 35 | 36 | 1. **Instalação Linux** - Conteúdo em formato markdown no arquivo 37 | [content/pages/instalacao-linux.md](content/pages/instalacao-linux.md). 38 | 39 | 1. **Instalação Mac** - Conteúdo em formato markdown no arquivo 40 | [content/pages/instalacao-mac.md](content/pages/instalacao-mac.md). 41 | 42 | 1. **Instalação Windows** - Conteúdo em formato markdown no arquivo 43 | [content/pages/instalacao-windows.md](content/pages/instalacao-windows.md). 44 | 45 | 1. **Ferramentas** - Conteúdo em formato markdown no arquivo [content/pages/ferramentas.md](content/pages/ferramentas.md) 46 | 47 | ### Páginas do Aprenda mais 48 | 49 | 1. **Web** - Conteúdo em formato markdown no arquivo 50 | [content/pages/web.md](content/pages/web.md). 51 | 52 | 1. **Mobile** - Conteúdo em formato markdown no arquivo 53 | [content/pages/mobile.md](content/pages/mobile.md). 54 | 55 | 1. **Games** - Conteúdo em formato markdown no arquivo 56 | [content/pages/games.md](content/pages/games.md). 57 | 58 | 1. **Científico** - Conteúdo em formato markdown no arquivo 59 | [content/pages/cientifico.md](content/pages/cientifico.md). 60 | 61 | 1. **Wiki** - Apenas um link para o [wiki antigo](https://wiki.python.org.br) 62 | da comunidade Python Brasil. 63 | 64 | ### Páginas do Participe 65 | 66 | 1. **Comunidades Locais** - O Conteúdo está em formato estruturado JSON. Para adicionar uma nova comunidade basta criar um arquivo com extensão .json na pasta [content/comunidades-locais/](https://github.com/pythonbrasil/wiki/tree/pelican/content/comunidades-locais) seguindo o padrão dos demais arquivos desta pasta e caso queira adicionar o logo da comunidade basta colocar o arquivo de extensão .png de tamanho 400X400 na pasta [content/images/comunidades-locais/](https://github.com/pythonbrasil/wiki/tree/pelican/content/images/comunidades-locais). 67 | 68 | 2. **Pyladies** - O Conteúdo das pyladies é uma importação do conteúdo encontrado em [https://github.com/pyladies-brazil/br-pyladies-pelican/blob/master/data/ladies.yml](https://github.com/pyladies-brazil/br-pyladies-pelican/blob/master/data/ladies.yml). 69 | 70 | 3. **Eventos** - O Conteúdo está em formato estruturado JSON. Para adicionar um novo evento basta criar um arquivo com extensão .json na pasta [content/eventos/YYYY/](https://github.com/pythonbrasil/wiki/tree/pelican/content/eventos). 71 | 72 | 4. **Contribua** - Conteúdo em formato markdown no arquivo [content/pages/contribua.md](https://github.com/pythonbrasil/wiki/blob/pelican/content/pages/contribua.md). 73 | 74 | 5. **Tradução** - Conteúdo em formato markdown no arquivo [content/pages/traducao.md](https://github.com/pythonbrasil/wiki/blob/pelican/content/pages/traducao.md). 75 | 76 | ### Páginas da APyB 77 | 78 | 1. **Python Brasil** - Conteúdo em formato markdown no arquivo [content/pages/python-brasil.md](https://github.com/pythonbrasil/wiki/blob/pelican/content/pages/python-brasil.md). 79 | 80 | 2. **A APyB** - Conteúdo em formato markdown no arquivo [content/pages/apyb.md](https://github.com/pythonbrasil/wiki/blob/pelican/content/pages/apyb.md). 81 | 82 | 3. **Premio Dorneles Tremea** - Conteúdo em formato markdown no arquivo [content/pages/premio-dorneles-tremea.md](https://github.com/pythonbrasil/wiki/blob/pelican/content/pages/premio-dorneles-tremea.md). 83 | 84 | ### Para contribuir com desenvolvimento 85 | *(ao contribuir com o Repositório utilizar a branch 'pelican')* 86 | 87 | Clone o repositório do projeto para o seu computador e depois navegue para o 88 | diretório criado: 89 | 90 | ``` 91 | $ git clone git@github.com:pythonbrasil/wiki.git 92 | 93 | $ cd wiki 94 | ``` 95 | 96 | Crie um [virtualenv](https://virtualenv.readthedocs.org/en/latest/) com o nome que desejar, acesse a pasta e ative o virtualenv (Considerando os comandos em sistemas Linux e OS X): 97 | 98 | ``` 99 | $ virtualenv -p python3 .venv 100 | 101 | $ source .venv/bin/activate 102 | ``` 103 | 104 | Provavelmente irá aparecer em seu terminal algo como *(.venv)$*: 105 | 106 | 107 | Pronto! Você já está na pasta do projeto e com o virtualenv ativado! 108 | Certifique-se disso. Agora vamos instalar os programas necessários: 109 | 110 | ``` 111 | $ pip install -r requirements.txt 112 | ``` 113 | 114 | Podem ocorrer problemas variados na instalação dos programas, se isso acontecer tente instalar as depêndencias do sistema operacional. No Ubuntu você pode usar o seguinte comando: 115 | 116 | ``` 117 | $ sudo ./install_os_dependencies.sh install 118 | ``` 119 | 120 | No Mac OS X Yosemite, use o seguinte comando para instalar ferramentas e utilitários como (libtool, lxml, cpp, etc...)que já é default em distros Linux: 121 | 122 | ``` 123 | $ x-code-select --install 124 | ``` 125 | 126 | Se der erro de locale, tente comando abaixo, o ideal é colocar no ~/.bash_profile 127 | 128 | ``` 129 | $ export LC_ALL=en_US.UTF-8 130 | 131 | $ export LANG=en_US.UTF-8 132 | ``` 133 | 134 | Se der erro de pycripto instale: 135 | 136 | ``` 137 | $ sudo apt install python3-dev 138 | ``` 139 | 140 | 141 | Ou verifique pelo Stackoverflow e pelo Google quais as soluções possíveis. Se o problema persistir, nos informe nas issues. 142 | 143 | Legal, agora já instalei todos os programas, vamos fazê-lo rodar em nosso computador? 144 | 145 | ``` 146 | $ make html 147 | 148 | $ make serve 149 | ``` 150 | 151 | O *make html* irá gerar o HTML e o *make serve* irá criar o servidor. Basta acessar *localhost:8000* e pronto! O site já está rodando em seu computador localmente! 152 | 153 | Agora basta fazer as modificações na pasta *content/pages*, rodar os comandos *make html* e *make serve* e suas alterações já serão visíveis. 154 | 155 | Resta então fazer o commit de suas alterações em seu repositório local e enviar-nos o Pull Request! o/ 156 | 157 | Mais informações sobre como funciona o Pelican, indicamos o artigo - [http://mindbending.org/pt/instalando-o-pelican](http://mindbending.org/pt/instalando-o-pelican). 158 | 159 | Se você quiser gerar o site automaticamente a cada alteração, utilize: 160 | 161 | ``` 162 | $ make devserver 163 | ``` 164 | 165 | Caso queira contribuir com o tema é preciso ter o node instalado em sua máquina. Sua instalação é bem direta e pode ser obtida em: 166 | 167 | [https://nodejs.org/en/download/](https://nodejs.org/en/download/) 168 | 169 | Após a instalação do node você pode instalar as dependências do tema indo a seu diretório e rodando o npm: 170 | 171 | ``` 172 | $ cd themes/pybr 173 | $ npm install 174 | ``` 175 | 176 | Com as dependências instaladas para rodar a montagem do css com live reload basta rodar: 177 | 178 | ``` 179 | $ npm run gulp 180 | ``` 181 | 182 | E caso queira rodar sem o live reload, somente para gerar o css para publicação rode: 183 | 184 | ``` 185 | $ npm run gulp build 186 | ``` 187 | 188 | #### Rodando com Docker 189 | 190 | Criando a imagem: 191 | ``` 192 | docker build -t wiki . 193 | ``` 194 | 195 | Rodando: 196 | ``` 197 | docker run --rm -t -i -p 8000:8000 -v .:/home/wiki --name pelican wiki 198 | ``` 199 | 200 | Parando a imagem: 201 | ``` 202 | docker stop pelican 203 | ``` -------------------------------------------------------------------------------- /baseconf.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | # -*- coding: utf-8 -*- # 3 | from __future__ import unicode_literals 4 | 5 | ### Base settings 6 | SITEURL = '' 7 | DEFAULT_LANG = u'pt' 8 | DEFAULT_PAGINATION = False 9 | TIMEZONE = 'America/Sao_Paulo' 10 | SUMMARY_MAX_LENGTH = 35 11 | 12 | ### URL and Page generation settings 13 | ARTICLE_URL = 'vagas/{slug}' 14 | ARTICLE_SAVE_AS = 'vagas/{slug}/index.html' 15 | 16 | PAGE_URL = '{slug}' 17 | PAGE_SAVE_AS = '{slug}/index.html' 18 | 19 | CATEGORIES_URL = 'vagas/categorias' 20 | CATEGORIES_SAVE_AS = 'vagas/categorias/index.html' 21 | CATEGORY_URL = 'vagas/categorias/{slug}' 22 | CATEGORY_SAVE_AS = 'vagas/categorias/{slug}/index.html' 23 | 24 | TAG_URL = 'vagas/tags/{slug}' 25 | TAG_SAVE_AS = 'vagas/tags/{slug}/index.html' 26 | TAGS_URL = 'vagas/tags' 27 | TAGS_SAVE_AS = 'vagas/tags/index.html' 28 | 29 | AUTHOR_URL = 'vagas/autores/{slug}' 30 | AUTHOR_SAVE_AS = 'vagas/autores/{slug}/index.html' 31 | AUTHORS_URL = 'vagas/autores' 32 | AUTHORS_SAVE_AS = 'vagas/autores/index.html' 33 | 34 | INDEX_SAVE_AS = "vagas/index.html" 35 | 36 | PAGINATION_PATTERNS = ( 37 | (1, '{base_name}/', '{base_name}/index.html'), 38 | (2, '{base_name}/page/{number}/', '{base_name}/page/{number}/index.html'), 39 | ) 40 | 41 | ### Feed settings 42 | FEED_ALL_ATOM = None 43 | FEED_ALL_RSS = None 44 | TRANSLATION_FEED_ATOM = None 45 | TRANSLATION_FEED_RSS = None 46 | AUTHOR_FEED_ATOM = None 47 | AUTHOR_FEED_RSS = None 48 | CATEGORY_FEED_ATOM = None 49 | CATEGORY_FEED_RSS = None 50 | 51 | ## Plugins 52 | PLUGIN_PATHS = ['./.plugins'] 53 | PLUGINS = [ 54 | 'sitemap', 55 | 'welcome-helpers', 56 | 'bootstrapify', 57 | 'pelican_alias', 58 | 'replacer', 59 | ] 60 | 61 | REPLACES = ( 62 | (u'', u'
'), 64 | ) 65 | 66 | # Plugins settings 67 | RESPONSIVE_IMAGES = True 68 | SITEMAP = { 69 | 'format': 'xml', 70 | 'priorities': { 71 | 'articles': 0.8, 72 | 'indexes': 0.2, 73 | 'pages': 0.7 74 | }, 75 | 'changefreqs': { 76 | 'articles': 'daily', 77 | 'indexes': 'daily', 78 | 'pages': 'daily' 79 | }, 80 | } 81 | -------------------------------------------------------------------------------- /content/comunidades-locais/grupy-abc.json: -------------------------------------------------------------------------------- 1 | { 2 | "links": [ 3 | [ 4 | "Site", 5 | "http://grupyabc.org/" 6 | ], 7 | [ 8 | "Github", 9 | "https://github.com/Grupy-ABC" 10 | ], 11 | [ 12 | "Telegram", 13 | "https://t.me/grupyabc" 14 | ] 15 | ], 16 | "nome": "Grupo de usu\u00e1rios do Grande ABC (S\u00e3o Paulo)", 17 | "imagem": "images/comunidades-locais/grupy-abc.png", 18 | "sigla": "GruPy-ABC" 19 | } 20 | -------------------------------------------------------------------------------- /content/comunidades-locais/grupy-al.json: -------------------------------------------------------------------------------- 1 | { 2 | "links": [ 3 | [ 4 | "Google Groups", 5 | "https://groups.google.com/forum/#!forum/grupy-al" 6 | ] 7 | ], 8 | "nome": "Grupo de usu\u00e1rios de Alagoas", 9 | "sigla": "GruPy-Al" 10 | } -------------------------------------------------------------------------------- /content/comunidades-locais/grupy-ba.json: -------------------------------------------------------------------------------- 1 | { 2 | "links": [ 3 | [ 4 | "Google Groups", 5 | "https://groups.google.com/forum/#!forum/grupy-ba" 6 | ], 7 | [ 8 | "Meetup", 9 | "http://www.meetup.com/pt/Salvador-Python-Meetup/" 10 | ], 11 | [ 12 | "Telegram", 13 | "https://t.me/grupyba" 14 | ] 15 | ], 16 | "nome": "Grupo de usu\u00e1rios da Bahia", 17 | "sigla": "GruPy-BA" 18 | } 19 | -------------------------------------------------------------------------------- /content/comunidades-locais/grupy-bauru.json: -------------------------------------------------------------------------------- 1 | { 2 | "links": [ 3 | [ 4 | "Telegram", 5 | "https://t.me/grupy_bauru" 6 | ], 7 | [ 8 | "Discord", 9 | "https://discord.gg/YsGGXAagAv" 10 | ] 11 | ], 12 | "nome": "Comunidade Python de Bauru/SP e região", 13 | "sigla": "GrupyBauru" 14 | } 15 | -------------------------------------------------------------------------------- /content/comunidades-locais/grupy-blumenau.json: -------------------------------------------------------------------------------- 1 | { 2 | "links": [ 3 | [ 4 | "Site", 5 | "https://pythonbnu.github.io/" 6 | ], 7 | [ 8 | "Facebook", 9 | "https://www.facebook.com/pythonbnu" 10 | ], 11 | [ 12 | "Telegram", 13 | "https://t.me/GruPyBnu" 14 | ], 15 | [ 16 | "Twitter", 17 | "https://twitter.com/pythonbnu" 18 | ], 19 | [ 20 | "Slack", 21 | "https://hackerspaceblumenau.slack.com/messages/C6U70HXK4" 22 | ] 23 | 24 | ], 25 | "nome": "Grupo de usu\u00e1rios de Blumenau SC", 26 | "sigla": "GruPy Blumenau" 27 | } 28 | -------------------------------------------------------------------------------- /content/comunidades-locais/grupy-cps.json: -------------------------------------------------------------------------------- 1 | { 2 | "links": [ 3 | [ 4 | "Telegram", 5 | "https://t.me/joinchat/BCCTWj_O8w9uJKNSoEuaVA" 6 | ], 7 | [ 8 | "Meetup", 9 | "https://www.meetup.com/pt-BR/GruPy-Campinas/" 10 | ] 11 | ], 12 | "nome": "Grupo de usu\u00e1rios de Campinas-SP", 13 | "sigla": "GruPy-Campinas" 14 | } 15 | -------------------------------------------------------------------------------- /content/comunidades-locais/grupy-df.json: -------------------------------------------------------------------------------- 1 | { 2 | "links": [ 3 | [ 4 | "Google Groups", 5 | "https://groups.google.com/forum/#!forum/grupy-df" 6 | ], 7 | [ 8 | "Site", 9 | "http://df.python.org.br/" 10 | ], 11 | [ 12 | "Github", 13 | "https://github.com/grupydf/" 14 | ], 15 | [ 16 | "Meetup", 17 | "https://www.meetup.com/pt-BR/pythondf/" 18 | ], 19 | [ 20 | "Telegram", 21 | "https://t.me/grupydf" 22 | ], 23 | [ 24 | "Facebook", 25 | "https://www.facebook.com/groups/grupydf/about/" 26 | ] 27 | ], 28 | "nome": "Grupo de usu\u00e1rios do Distrito Federal", 29 | "imagem": "images/comunidades-locais/grupy-df.png", 30 | "sigla": "GruPy-DF" 31 | } 32 | -------------------------------------------------------------------------------- /content/comunidades-locais/grupy-es.json: -------------------------------------------------------------------------------- 1 | { 2 | "links": [ 3 | [ 4 | "Google Groups", 5 | "https://groups.google.com/forum/#!forum/grupy_es" 6 | ] 7 | ], 8 | "nome": "Grupo de usu\u00e1rios do Esp\u00edrito Santo", 9 | "sigla": "GruPy-ES" 10 | } -------------------------------------------------------------------------------- /content/comunidades-locais/grupy-go.json: -------------------------------------------------------------------------------- 1 | { 2 | "links": [ 3 | [ 4 | "Google Groups", 5 | "https://groups.google.com/forum/#!forum/grupy-go" 6 | ], 7 | [ 8 | "Telegram", 9 | "https://t.me/grupygo" 10 | ], 11 | [ 12 | "GitHub", 13 | "https://github.com/Grupy-GO" 14 | ], 15 | [ 16 | "Facebook", 17 | "https://www.facebook.com/groups/grupygo/" 18 | ] 19 | ], 20 | "nome": "Grupo de usu\u00e1rios de Goi\u00e1s", 21 | "imagem": "images/comunidades-locais/python-goias.png", 22 | "sigla": "GruPy-GO" 23 | } 24 | -------------------------------------------------------------------------------- /content/comunidades-locais/grupy-mt.json: -------------------------------------------------------------------------------- 1 | { 2 | "links": [["Telegram", "https://t.me/grupymt"]], 3 | "nome": "Grupo de usu\u00e1rios do Mato Grosso", 4 | "imagem": "images/comunidades-locais/default.png", 5 | "sigla": "GruPy-MT" 6 | } 7 | -------------------------------------------------------------------------------- /content/comunidades-locais/grupy-pb.json: -------------------------------------------------------------------------------- 1 | { 2 | "links": [ 3 | [ 4 | "Telegram", 5 | "https://t.me/pugpb" 6 | ], 7 | [ 8 | "Github", 9 | "https://github.com/pug-pb" 10 | ], 11 | [ 12 | "Google Groups", 13 | "https://groups.google.com/forum/#!forum/pug-pb" 14 | ], 15 | [ 16 | "Twitter", 17 | "http://twitter.com/pug_pb" 18 | ] 19 | ], 20 | "nome": "Grupo de usu\u00e1rios da Para\u00edba", 21 | "imagem": "images/comunidades-locais/pug-pb.png", 22 | "sigla": "PUG-PB" 23 | } -------------------------------------------------------------------------------- /content/comunidades-locais/grupy-pr.json: -------------------------------------------------------------------------------- 1 | { 2 | "links": [ 3 | [ 4 | "Google Groups", 5 | "https://groups.google.com/forum/#!forum/grupy-pr" 6 | ], 7 | [ 8 | "Github", 9 | "https://github.com/GruPyPR" 10 | ], 11 | [ 12 | "Mobilize", 13 | "https://grupypr.mobilize.io/registrations/groups/3334" 14 | ], 15 | [ 16 | "Slack", 17 | "http://grupypr.herokuapp.com/" 18 | ], 19 | [ 20 | "Telegram", 21 | "https://telegram.me/joinchat/AKcLJQkMbfHhN6LOju_s9g" 22 | ] 23 | ], 24 | "nome": "Grupo de usu\u00e1rios do Paran\u00e1", 25 | "imagem": "images/comunidades-locais/grupypr.png", 26 | "sigla": "GruPy-PR" 27 | } 28 | -------------------------------------------------------------------------------- /content/comunidades-locais/grupy-rn.json: -------------------------------------------------------------------------------- 1 | { 2 | "links": [ 3 | [ "Telegram", 4 | "https://t.me/GrupyRN" 5 | 6 | ], 7 | [ 8 | "GitHub", 9 | "https://github.com/GruPy-RN" 10 | ], 11 | [ 12 | "Facebook", 13 | "https://www.facebook.com/grupyrn/" 14 | ], 15 | [ 16 | "Google Groups", 17 | "https://groups.google.com/forum/#!forum/grupy-rn" 18 | ] 19 | ], 20 | "nome": "Grupo de usu\u00e1rios do Rio Grande do Norte", 21 | "imagem": "images/comunidades-locais/grupy-rn.png", 22 | "sigla": "GruPy-RN" 23 | } 24 | -------------------------------------------------------------------------------- /content/comunidades-locais/grupy-ro.json: -------------------------------------------------------------------------------- 1 | { 2 | "links": [ 3 | [ 4 | "Google Groups", 5 | "https://groups.google.com/forum/#!forum/grupy-ro" 6 | ] 7 | ], 8 | "nome": "Grupo de usu\u00e1rios de Rond\u00f4nia", 9 | "sigla": "GruPy-RO" 10 | } -------------------------------------------------------------------------------- /content/comunidades-locais/grupy-rp.json: -------------------------------------------------------------------------------- 1 | { 2 | "links": [ 3 | [ 4 | "Slack", 5 | "https://grupyrp.herokuapp.com" 6 | ], 7 | [ 8 | "Meetup", 9 | "http://www.meetup.com/pt/grupy-rp/" 10 | ], 11 | [ 12 | "Github", 13 | "https://github.com/grupyrp" 14 | ], 15 | [ 16 | "Google Groups", 17 | "https://groups.google.com/forum/#!forum/grupy-rp" 18 | ] 19 | ], 20 | "nome": "Grupo de usu\u00e1rios de Ribeir\u00e3o Preto", 21 | "sigla": "GruPy-RP" 22 | } 23 | -------------------------------------------------------------------------------- /content/comunidades-locais/grupy-sanca.json: -------------------------------------------------------------------------------- 1 | { 2 | "links": [ 3 | [ 4 | "Github", 5 | "https://github.com/grupy-sanca/" 6 | ], 7 | [ 8 | "Facebook (página)", 9 | "https://www.facebook.com/grupysanca" 10 | ], 11 | [ 12 | "Facebook (grupo)", 13 | "https://www.facebook.com/groups/grupysanca" 14 | ], 15 | [ 16 | "Meetup", 17 | "https://meetup.com/grupy-sanca" 18 | ], 19 | [ 20 | "Telegram", 21 | "https://t.me/grupysanca" 22 | ] 23 | ], 24 | "nome": "Grupo de usu\u00e1rios Python de S\u00e3o Carlos (SP)", 25 | "imagem": "images/comunidades-locais/grupy-sanca.png", 26 | "sigla": "grupy-sanca" 27 | } 28 | -------------------------------------------------------------------------------- /content/comunidades-locais/grupy-sp.json: -------------------------------------------------------------------------------- 1 | { 2 | "links": [ 3 | [ 4 | "Google Groups", 5 | "https://groups.google.com/forum/#!forum/grupy-sp" 6 | ], 7 | [ 8 | "Github", 9 | "https://github.com/grupy-sp/encontros" 10 | ], 11 | [ 12 | "Facebook", 13 | "https://www.facebook.com/grupysp" 14 | ], 15 | [ 16 | "Twitter", 17 | "https://twitter.com/grupysp" 18 | ], 19 | [ 20 | "Slack", 21 | "https://grupysp.herokuapp.com" 22 | ] 23 | ], 24 | "nome": "Grupo de usu\u00e1rios de S\u00e3o Paulo", 25 | "imagem": "images/comunidades-locais/grupysp.png", 26 | "sigla": "GruPy-SP" 27 | } 28 | -------------------------------------------------------------------------------- /content/comunidades-locais/grupy-sul-fluminense.json: -------------------------------------------------------------------------------- 1 | { 2 | "links": [ 3 | [ 4 | "Whatsapp", 5 | "https://chat.whatsapp.com/LUlfeFVxrxA7n77pp9rb52" 6 | ], 7 | [ 8 | "Discord", 9 | "https://discord.gg/Cc49kNjaF2" 10 | ] 11 | ], 12 | "nome": "Grupo de usu\u00e1rios do Sul Fluminense do Rio de Janeiro", 13 | "imagem": "images/comunidades-locais/default.png", 14 | "sigla": "GruPy Sul Fluminense" 15 | } 16 | -------------------------------------------------------------------------------- /content/comunidades-locais/pug-am.json: -------------------------------------------------------------------------------- 1 | { 2 | "links": [ 3 | [ 4 | "Google Groups", 5 | "https://groups.google.com/forum/#!forum/grupy-am" 6 | ] 7 | ], 8 | "nome": "Grupo de usu\u00e1rios de Amazonas", 9 | "sigla": "Pug-Am" 10 | } -------------------------------------------------------------------------------- /content/comunidades-locais/pug-ce.json: -------------------------------------------------------------------------------- 1 | { 2 | "links": [ 3 | [ 4 | "Google Groups", 5 | "https://groups.google.com/forum/#!forum/pug-ce" 6 | ] 7 | ], 8 | "nome": "Grupo de usu\u00e1rios do Cear\u00e1", 9 | "imagem": "images/comunidades-locais/pug-ce.png", 10 | "sigla": "Pug-CE" 11 | } 12 | -------------------------------------------------------------------------------- /content/comunidades-locais/pug-ma.json: -------------------------------------------------------------------------------- 1 | { 2 | "links": [ 3 | [ 4 | "Google Groups", 5 | "https://groups.google.com/forum/#!forum/pug-ma" 6 | ], 7 | [ 8 | "Github", 9 | "https://github.com/pug-ma" 10 | ], 11 | [ 12 | "Telegram", 13 | "https://t.me/pugma" 14 | ], 15 | [ 16 | "Facebook", 17 | "https://www.facebook.com/pugmaranhao/" 18 | ] 19 | ], 20 | "nome": "Grupo de usu\u00e1rios do Maranh\u00e3o", 21 | "imagem": "images/comunidades-locais/pug-ma.png", 22 | "sigla": "Pug-MA" 23 | } 24 | -------------------------------------------------------------------------------- /content/comunidades-locais/pug-mg.json: -------------------------------------------------------------------------------- 1 | { 2 | "links": [ 3 | [ 4 | "Site", 5 | "http://http://pythonmg.com.br/" 6 | ], 7 | [ 8 | "Google Groups", 9 | "https://groups.google.com/forum/#!forum/python-mg" 10 | ], 11 | [ 12 | "Github", 13 | "https://github.com/python-mg" 14 | ], 15 | [ 16 | "Twitter", 17 | "https://twitter.com/pythonMG" 18 | ], 19 | [ 20 | "Youtube", 21 | "https://www.youtube.com/c/PythonMinasGerais" 22 | ], 23 | [ 24 | "Meetup", 25 | "http://www.meetup.com/pt/Belo-Horizonte-Python-User-Group/" 26 | ] 27 | ], 28 | "nome": "Grupo de usu\u00e1rios de Minas Gerais", 29 | "imagem": "images/comunidades-locais/python-mg.png", 30 | "sigla": "Pug-MG" 31 | } 32 | -------------------------------------------------------------------------------- /content/comunidades-locais/pug-pe.json: -------------------------------------------------------------------------------- 1 | { 2 | "links": [ 3 | [ 4 | "Telegram", 5 | "https://t.me/pugpe" 6 | ], 7 | [ 8 | "Github", 9 | "https://github.com/pugpe" 10 | ], 11 | [ 12 | "Instagram", 13 | "https://www.instagram.com/pug.pe/" 14 | ], 15 | [ 16 | "Google Groups", 17 | "https://groups.google.com/forum/#!forum/pug-pe" 18 | ] 19 | ], 20 | "nome": "Grupo de usu\u00e1rios de Pernambuco", 21 | "imagem": "images/comunidades-locais/pug-pe.png", 22 | "sigla": "Pug-PE" 23 | } 24 | -------------------------------------------------------------------------------- /content/comunidades-locais/pug-pi.json: -------------------------------------------------------------------------------- 1 | { 2 | "links": [ 3 | [ 4 | "Facebook", 5 | "https://www.facebook.com/groups/pugpi/" 6 | ], 7 | [ 8 | "Telegram", 9 | "https://t.me/pugpi" 10 | ] 11 | ], 12 | "nome": "Grupo de usu\u00e1rios do Piau\u00ed", 13 | "imagem": "images/comunidades-locais/pug-pi.png", 14 | "sigla": "Pug-PI" 15 | } 16 | -------------------------------------------------------------------------------- /content/comunidades-locais/pug-sc.json: -------------------------------------------------------------------------------- 1 | { 2 | "links": [ 3 | [ 4 | "Yahoo Groups", 5 | "https://br.groups.yahoo.com/neo/groups/pug-sc/info" 6 | ] 7 | ], 8 | "nome": "Grupo de usu\u00e1rios de Santa Catarina", 9 | "sigla": "Pug-SC" 10 | } -------------------------------------------------------------------------------- /content/comunidades-locais/pug-se.json: -------------------------------------------------------------------------------- 1 | { 2 | "links": [ 3 | [ 4 | "Telegram", 5 | "https://t.me/pugse" 6 | ], 7 | [ 8 | "Github", 9 | "https://github.com/pug-se" 10 | ], 11 | [ 12 | "Linkedin", 13 | "https://www.linkedin.com/company/pug-se/" 14 | ], 15 | [ 16 | "Site", 17 | "https://se.python.org.br/" 18 | ], 19 | [ 20 | "Google Groups", 21 | "https://groups.google.com/forum/#!forum/pug-se" 22 | ] 23 | ], 24 | "nome": "Grupo de usu\u00e1rios de Sergipe", 25 | "imagem": "images/comunidades-locais/pug-se.png", 26 | "sigla": "Pug-SE" 27 | } 28 | -------------------------------------------------------------------------------- /content/comunidades-locais/py013.json: -------------------------------------------------------------------------------- 1 | { 2 | "links": [ 3 | [ 4 | "Facebook", 5 | "https://web.facebook.com/Python013/" 6 | ], 7 | [ 8 | "Github", 9 | "https://github.com/Py013" 10 | ], 11 | [ 12 | "Telegram", 13 | "https://t.me/+aLIZYKBDc3qtD_Rd" 14 | ], 15 | [ 16 | "Linkedin", 17 | "https://www.linkedin.com/company/py013/" 18 | ] 19 | 20 | ], 21 | "nome": "Grupo de usu\u00e1rios da Baixada Santista DDD 013 (Litoral de SP)", 22 | "imagem": "images/comunidades-locais/py013.png", 23 | "sigla": "Py013" 24 | } 25 | -------------------------------------------------------------------------------- /content/comunidades-locais/pydata-bsb.json: -------------------------------------------------------------------------------- 1 | { 2 | "links": [ 3 | [ 4 | "Twitter", 5 | "https://twitter.com/PyDataBSB" 6 | ], 7 | 8 | [ 9 | "Meetup", 10 | "https://www.meetup.com/pt-BR/PyData-Brasilia/" 11 | ], 12 | 13 | [ 14 | "Telegram", 15 | "https://t.me/PyDataBSB" 16 | ] 17 | ], 18 | "nome": "Comunidade do programa educacional PyData de Brasília", 19 | "imagem": "images/comunidades-locais/default.png", 20 | "sigla": "Pydata BSB" 21 | } 22 | -------------------------------------------------------------------------------- /content/comunidades-locais/pynorte.json: -------------------------------------------------------------------------------- 1 | { 2 | "links": [ 3 | [ 4 | "Site", 5 | "http://pynorte.python.org.br/" 6 | ], 7 | [ 8 | "Facebook", 9 | "http://facebook.com/pynorte" 10 | ], 11 | [ 12 | "Telegram", 13 | "http://bit.ly/pynorte" 14 | ], 15 | [ 16 | "GitHub", 17 | "https://github.com/PyNorte" 18 | ], 19 | [ 20 | "Google Groups", 21 | "https://groups.google.com/d/forum/pynorte" 22 | ] 23 | 24 | ], 25 | "nome": "Grupo de usu\u00e1rios da Região Norte do Brasil", 26 | "imagem": "images/comunidades-locais/default.png", 27 | "sigla": "PyNorte" 28 | } 29 | -------------------------------------------------------------------------------- /content/comunidades-locais/pytche.json: -------------------------------------------------------------------------------- 1 | { 2 | "links": [ 3 | [ 4 | "Meetup", 5 | "http://www.meetup.com/pt/PyTche/" 6 | ], 7 | [ 8 | "Telegram", 9 | "https://telegram.me/pytche" 10 | ] 11 | ], 12 | "nome": "Grupo de usu\u00e1rios do Rio Grande do Sul", 13 | "imagem": "images/comunidades-locais/pytche.png", 14 | "sigla": "PyTche" 15 | } 16 | -------------------------------------------------------------------------------- /content/comunidades-locais/pythonfloripa.json: -------------------------------------------------------------------------------- 1 | { 2 | "links": [ 3 | [ 4 | "Site", 5 | "http://floripa.sc.python.org.br/" 6 | ], 7 | [ 8 | "Google groups", 9 | "https://groups.google.com/forum/#!forum/python-floripa" 10 | ], 11 | [ 12 | "Google Plus", 13 | "https://plus.google.com/communities/103743339273138251517" 14 | ], 15 | [ 16 | "Github", 17 | "https://github.com/PythonFloripa" 18 | ], 19 | [ 20 | "Facebook", 21 | "https://www.facebook.com/groups/python.floripa/" 22 | ], 23 | [ 24 | "Twitter", 25 | "https://twitter.com/pythonfloripa" 26 | ], 27 | [ 28 | "Slack", 29 | "https://pythonfloripa.slack.com/" 30 | ] 31 | ], 32 | "nome": "Grupo de usu\u00e1rios de Florian\u00f3polis", 33 | "sigla": "Python Floripa" 34 | } -------------------------------------------------------------------------------- /content/comunidades-locais/pythononrio.json: -------------------------------------------------------------------------------- 1 | { 2 | "links": [ 3 | [ 4 | "Site", 5 | "http://pythonrio.python.org.br/" 6 | ], 7 | [ 8 | "Facebook", 9 | "https://www.facebook.com/pythonrio" 10 | ], 11 | [ 12 | "Telegram", 13 | "https://t.me/pythonrio2023" 14 | ], 15 | [ 16 | "Twitter", 17 | "https://twitter.com/pythonrio" 18 | ] 19 | 20 | ], 21 | "nome": "Grupo de usu\u00e1rios do Rio de Janeiro", 22 | "imagem": "images/comunidades-locais/pythonrio.png", 23 | "sigla": "PythOnRio" 24 | } 25 | -------------------------------------------------------------------------------- /content/comunidades-locais/pythonsorocaba.json: -------------------------------------------------------------------------------- 1 | { 2 | "links": [ 3 | [ 4 | "Google Groups", 5 | "https://groups.google.com/forum/#!forum/python-sorocaba" 6 | ], 7 | [ 8 | "Github", 9 | "https://github.com/python-sorocaba" 10 | ], 11 | [ 12 | "Slack", 13 | "https://grupopythonsorocaba.herokuapp.com" 14 | ] 15 | ], 16 | "nome": "Grupo de usu\u00e1rios de Sorocaba", 17 | "sigla": "Python Sorocaba" 18 | } 19 | -------------------------------------------------------------------------------- /content/extra/CNAME: -------------------------------------------------------------------------------- 1 | python.org.br 2 | -------------------------------------------------------------------------------- /content/extra/pages/denuncia.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Denúncia Código de Conduta 6 | 7 | 8 |

Redirecionando para o formulário de denúncia do Código de Conduta Python Brasil 2022.

9 | 10 | 11 | -------------------------------------------------------------------------------- /content/images/comunidades-locais/default.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pythonbrasil/wiki/16c347c0b8ae90af70412d493fccb687390ce55b/content/images/comunidades-locais/default.png -------------------------------------------------------------------------------- /content/images/comunidades-locais/grupy-abc.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pythonbrasil/wiki/16c347c0b8ae90af70412d493fccb687390ce55b/content/images/comunidades-locais/grupy-abc.png -------------------------------------------------------------------------------- /content/images/comunidades-locais/grupy-df.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pythonbrasil/wiki/16c347c0b8ae90af70412d493fccb687390ce55b/content/images/comunidades-locais/grupy-df.png -------------------------------------------------------------------------------- /content/images/comunidades-locais/grupy-rn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pythonbrasil/wiki/16c347c0b8ae90af70412d493fccb687390ce55b/content/images/comunidades-locais/grupy-rn.png -------------------------------------------------------------------------------- /content/images/comunidades-locais/grupy-sanca.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pythonbrasil/wiki/16c347c0b8ae90af70412d493fccb687390ce55b/content/images/comunidades-locais/grupy-sanca.png -------------------------------------------------------------------------------- /content/images/comunidades-locais/grupypr.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pythonbrasil/wiki/16c347c0b8ae90af70412d493fccb687390ce55b/content/images/comunidades-locais/grupypr.png -------------------------------------------------------------------------------- /content/images/comunidades-locais/grupysp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pythonbrasil/wiki/16c347c0b8ae90af70412d493fccb687390ce55b/content/images/comunidades-locais/grupysp.png -------------------------------------------------------------------------------- /content/images/comunidades-locais/pug-ce.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pythonbrasil/wiki/16c347c0b8ae90af70412d493fccb687390ce55b/content/images/comunidades-locais/pug-ce.png -------------------------------------------------------------------------------- /content/images/comunidades-locais/pug-ma.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pythonbrasil/wiki/16c347c0b8ae90af70412d493fccb687390ce55b/content/images/comunidades-locais/pug-ma.png -------------------------------------------------------------------------------- /content/images/comunidades-locais/pug-pb.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pythonbrasil/wiki/16c347c0b8ae90af70412d493fccb687390ce55b/content/images/comunidades-locais/pug-pb.png -------------------------------------------------------------------------------- /content/images/comunidades-locais/pug-pe.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pythonbrasil/wiki/16c347c0b8ae90af70412d493fccb687390ce55b/content/images/comunidades-locais/pug-pe.png -------------------------------------------------------------------------------- /content/images/comunidades-locais/pug-pi.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pythonbrasil/wiki/16c347c0b8ae90af70412d493fccb687390ce55b/content/images/comunidades-locais/pug-pi.png -------------------------------------------------------------------------------- /content/images/comunidades-locais/pug-se.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pythonbrasil/wiki/16c347c0b8ae90af70412d493fccb687390ce55b/content/images/comunidades-locais/pug-se.png -------------------------------------------------------------------------------- /content/images/comunidades-locais/py013.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pythonbrasil/wiki/16c347c0b8ae90af70412d493fccb687390ce55b/content/images/comunidades-locais/py013.png -------------------------------------------------------------------------------- /content/images/comunidades-locais/pytche.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pythonbrasil/wiki/16c347c0b8ae90af70412d493fccb687390ce55b/content/images/comunidades-locais/pytche.png -------------------------------------------------------------------------------- /content/images/comunidades-locais/python-goias.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pythonbrasil/wiki/16c347c0b8ae90af70412d493fccb687390ce55b/content/images/comunidades-locais/python-goias.png -------------------------------------------------------------------------------- /content/images/comunidades-locais/python-mg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pythonbrasil/wiki/16c347c0b8ae90af70412d493fccb687390ce55b/content/images/comunidades-locais/python-mg.png -------------------------------------------------------------------------------- /content/images/comunidades-locais/pythonrio.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pythonbrasil/wiki/16c347c0b8ae90af70412d493fccb687390ce55b/content/images/comunidades-locais/pythonrio.png -------------------------------------------------------------------------------- /content/images/instalacao-windows/01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pythonbrasil/wiki/16c347c0b8ae90af70412d493fccb687390ce55b/content/images/instalacao-windows/01.png -------------------------------------------------------------------------------- /content/images/instalacao-windows/02.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pythonbrasil/wiki/16c347c0b8ae90af70412d493fccb687390ce55b/content/images/instalacao-windows/02.png -------------------------------------------------------------------------------- /content/images/instalacao-windows/03.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pythonbrasil/wiki/16c347c0b8ae90af70412d493fccb687390ce55b/content/images/instalacao-windows/03.png -------------------------------------------------------------------------------- /content/images/instalacao-windows/04.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pythonbrasil/wiki/16c347c0b8ae90af70412d493fccb687390ce55b/content/images/instalacao-windows/04.png -------------------------------------------------------------------------------- /content/images/instalacao-windows/05.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pythonbrasil/wiki/16c347c0b8ae90af70412d493fccb687390ce55b/content/images/instalacao-windows/05.png -------------------------------------------------------------------------------- /content/images/instalacao-windows/06.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pythonbrasil/wiki/16c347c0b8ae90af70412d493fccb687390ce55b/content/images/instalacao-windows/06.png -------------------------------------------------------------------------------- /content/images/instalacao-windows/09.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pythonbrasil/wiki/16c347c0b8ae90af70412d493fccb687390ce55b/content/images/instalacao-windows/09.png -------------------------------------------------------------------------------- /content/images/instalacao-windows/11.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pythonbrasil/wiki/16c347c0b8ae90af70412d493fccb687390ce55b/content/images/instalacao-windows/11.gif -------------------------------------------------------------------------------- /content/pages/apyb-faq.md: -------------------------------------------------------------------------------- 1 | Title: APyB - FAQ 2 | Slug: apyb-faq 3 | Template: redirect 4 | Redirect: https://apyb.python.org.br/apyb/faq/ -------------------------------------------------------------------------------- /content/pages/apyb-fundo-inclusão.md: -------------------------------------------------------------------------------- 1 | Title: Fundo para Inclusão 2 | Slug: fundo-para-inclusão 3 | Template: redirect 4 | Redirect: https://apyb.python.org.br/apyb/fundo-inclusão/ -------------------------------------------------------------------------------- /content/pages/apyb-historia.md: -------------------------------------------------------------------------------- 1 | Title: História da APyB 2 | Slug: apyb-historia 3 | Template: redirect 4 | Redirect: https://apyb.python.org.br/a-associacao/associacao/ -------------------------------------------------------------------------------- /content/pages/apyb.md: -------------------------------------------------------------------------------- 1 | Title: A APyB 2 | Slug: apyb 3 | Template: redirect 4 | Redirect: https://apyb.python.org.br/ -------------------------------------------------------------------------------- /content/pages/cdc.md: -------------------------------------------------------------------------------- 1 | Title: Código de Conduta do Evento Python Brasil 2 | Slug: cdc 3 | Template: redirect 4 | Redirect: https://apyb.python.org.br/pythonbrasil/cdc/ -------------------------------------------------------------------------------- /content/pages/cientifico.md: -------------------------------------------------------------------------------- 1 | Title: Python no Meio Científico 2 | Slug: cientifico 3 | Template: page 4 | 5 | A linguagem Python vêm se tornando cada vez mais popular no mundo científico, devido à sua facilidade de uso, legibilidade e comunidade. Existem muitos pacotes no ecossistema de Python científico para diversas funções, como por exemplo: 6 | 7 | - [**NumPy:**](https://numpy.org/) operações numéricas e estruturas de dados como arranjos n-dimensionais, geradores de numeros aleatórios, álgebra linear, e mais. Otimizado em C. 8 | - [**pandas:**](http://pandas.pydata.org/) biblioteca de estatística e análise de dados baseada na NumPy. Contém estruturas de dados como DataFrames, parsers para arquivos tabulares, planilhas, interação com bancos de dados e outras funções. 9 | - [**SciPy:**](https://www.scipy.org/) um conjunto de pacotes para diversas aplicações no domínio científico, como otimizadores, algoritmos numéricos, processamento de sinais, e muito mais. 10 | - [**Matplotlib:**](http://matplotlib.org/) Criação de figuras em 2D e 3D 11 | - [**scikit-learn:**](http://scikit-learn.org/) algoritmos e ferramentas para aprendizado de máquina. 12 | - [**scikit-image:**](http://scikit-image.org/) algoritmos e ferramentas para processamento de imagens. 13 | - [**BioPython:**](https://biopython.org/) estruturas de dados biológicos e algoritmos de bioinformática. 14 | - [**NetworkX:**](https://networkx.github.io/) ferramentas para análise de redes complexas. 15 | - [**SymPy:**](http://www.sympy.org/) biblioteca para matemática simbólica e álgebra computacional. 16 | - [**Dask**](https://dask.readthedocs.io/) **e** [**Joblib:**](https://joblib.readthedocs.io/) processamento paralelo e/ou distribuído. 17 | - [**conda:**](https://docs.conda.io/en/latest/) gerenciador de pacotes de código aberto, voltado para uso científico. 18 | 19 | Também existe a comunidade de [SciPy LA](https://www.scipyla.org/pt/), de Python científico na América Latina, que promove eventos e discussões. 20 | 21 | Texto inspirado na [página do SciPy.](https://www.scipy.org/about.html) 22 | -------------------------------------------------------------------------------- /content/pages/comunidades-locais.md: -------------------------------------------------------------------------------- 1 | Title: Comunidades Locais 2 | Slug: comunidades-locais 3 | Template: comunidades-locais 4 | 5 | Conheça os grupos de usuários de Python espalhados pelo Brasil. Mais informações, acesse: [http://wiki.python.org.br/GrupoDeUsuarios](http://wiki.python.org.br/GrupoDeUsuarios) 6 | -------------------------------------------------------------------------------- /content/pages/contribua.md: -------------------------------------------------------------------------------- 1 | Title: Contribua com este site 2 | Slug: contribua 3 | Template: page 4 | 5 | Site Live: [http://python.org.br/](http://python.org.br/) 6 | 7 | Repositório: [https://github.com/pythonbrasil/wiki](https://github.com/pythonbrasil/wiki) 8 | 9 | Para contribuír com a melhoria do conteúdo deste site basta acessar alguma das páginas mapeadas abaixo, editar seu conteúdo e submeter sua alteração como um pull request. 10 | 11 | ### Páginas do Impressione-se 12 | 13 | 1. **Empresas** - O Conteúdo das empresas é uma importação do conteúdo encontrado em [https://github.com/pythonbrasil/pyBusinesses-BR](https://github.com/pythonbrasil/pyBusinesses-BR). 14 | 15 | ### Páginas do Inicie-se 16 | 17 | 1. **Qual python?** - Conteúdo em formato markdown no arquivo [content/pages/qual-python.md](https://github.com/pythonbrasil/wiki/blob/pelican/content/pages/qual-python.md). 18 | 19 | 2. **Instalação Linux** - Conteúdo em formato markdown no arquivo [content/pages/instalacao-linux.md](https://github.com/pythonbrasil/wiki/blob/pelican/content/pages/instalacao-linux.md). 20 | 21 | 3. **Instalação Mac** - Conteúdo em formato markdown no arquivo [content/pages/instalacao-mac.md](https://github.com/pythonbrasil/wiki/blob/pelican/content/pages/instalacao-mac.md). 22 | 23 | 4. **Instalação Windows** - Conteúdo em formato markdown no arquivo [content/pages/instalacao-windows.md](https://github.com/pythonbrasil/wiki/blob/pelican/content/pages/instalacao-windows.md). 24 | 25 | 5. **Introdução** - Conteúdo em formato markdown no arquivo [content/pages/introducao.md](https://github.com/pythonbrasil/wiki/blob/pelican/content/pages/introducao.md). 26 | 27 | 6. **Ferramentas** - Conteúdo em formato markdown no arquivo [content/pages/ferramentas.md](https://github.com/pythonbrasil/wiki/blob/pelican/content/pages/ferramentas.md) 28 | 29 | ### Páginas do Aprenda mais 30 | 31 | 1. **Web** - Conteúdo em formato markdown no arquivo [content/pages/web.md](https://github.com/pythonbrasil/wiki/blob/pelican/content/pages/web.md). 32 | 33 | 2. **Mobile** - Conteúdo em formato markdown no arquivo [content/pages/mobile.md](https://github.com/pythonbrasil/wiki/blob/pelican/content/pages/mobile.md). 34 | 35 | 3. **Games** - Conteúdo em formato markdown no arquivo [content/pages/games.md](https://github.com/pythonbrasil/wiki/blob/pelican/content/pages/games.md). 36 | 37 | 4. **Científico** - Conteúdo em formato markdown no arquivo [content/pages/cientifico.md](https://github.com/pythonbrasil/wiki/blob/pelican/content/pages/cientifico.md). 38 | 39 | ### Páginas do Participe 40 | 41 | 1. **Comunidades Locais** - O Conteúdo está em formato estruturado JSON. Para adicionar uma nova comunidade basta criar um arquivo com extensão .json na pasta [content/comunidades-locais/](https://github.com/pythonbrasil/wiki/tree/pelican/content/comunidades-locais) seguindo o padrão dos demais arquivos desta pasta e caso queira adicionar o logo da comunidade basta colocar o arquivo de extensão .png de tamanho 400X400 na pasta [content/images/comunidades-locais/](https://github.com/pythonbrasil/wiki/tree/pelican/content/images/comunidades-locais). 42 | 43 | 2. **Pyladies** - O Conteúdo das pyladies é uma importação do conteúdo encontrado em [https://github.com/pyladies-brazil/br-pyladies-pelican/blob/master/data/ladies.yml](https://github.com/pyladies-brazil/br-pyladies-pelican/blob/master/data/ladies.yml). 44 | 45 | 3. **Eventos** - O Conteúdo está em formato estruturado JSON. Para adicionar um novo evento basta criar um arquivo com extensão .json na pasta [content/eventos/YYYY/](https://github.com/pythonbrasil/wiki/tree/pelican/content/eventos). 46 | 47 | 4. **Contribua** - Conteúdo em formato markdown no arquivo [content/pages/contribua.md](https://github.com/pythonbrasil/wiki/blob/pelican/content/pages/contribua.md). 48 | 49 | 5. **Tradução** - Conteúdo em formato markdown no arquivo [content/pages/traducao.md](https://github.com/pythonbrasil/wiki/blob/pelican/content/pages/traducao.md). 50 | 51 | ### Páginas da APyB 52 | 53 | 1. **Python Brasil** - Conteúdo em formato markdown no arquivo [content/pages/python-brasil.md](https://github.com/pythonbrasil/wiki/blob/pelican/content/pages/python-brasil.md). 54 | 55 | 2. **A APyB** - Conteúdo em formato markdown no arquivo [content/pages/apyb.md](https://github.com/pythonbrasil/wiki/blob/pelican/content/pages/apyb.md). 56 | 57 | 3. **Premio Dorneles Tremea** - Conteúdo em formato markdown no arquivo [content/pages/premio-dorneles-tremea.md](https://github.com/pythonbrasil/wiki/blob/pelican/content/pages/premio-dorneles-tremea.md). 58 | 59 | ### Para contribuir com desenvolvimento 60 | 61 | Crie um [virtualenv](https://virtualenv.readthedocs.org/en/latest/) com o nome que desejar, acesse a pasta e ative o virtualenv (Considerando os comandos em sistemas Linux e OS X): 62 | 63 | ``` 64 | $ virtualenv project-name 65 | 66 | $ cd project-name 67 | 68 | $ source bin/activate 69 | ``` 70 | 71 | Provavelmente irá aparecer em seu terminal algo como *(project-name)$*, agora vamos clonar o repositório do projeto: 72 | 73 | ``` 74 | $ git clone git@github.com:pythonbrasil/wiki.git 75 | 76 | $ cd wiki 77 | ``` 78 | 79 | Pronto! Você já está na pasta do projeto! Agora vamos instalar os programas necessários (Certifique-se que o virtualenv está ativado): 80 | 81 | ``` 82 | $ pip install -r requirements.txt 83 | ``` 84 | 85 | Podem ocorrer problemas variados na instalação dos programas, se isso acontecer tente instalar as depêndencias do sistema operacional. No Ubuntu você pode usar o seguinte comando: 86 | 87 | ``` 88 | $ sudo ./install_os_dependencies.sh install 89 | ``` 90 | 91 | No Mac OS X Yosemite, use o seguinte comando para instalar ferramentas e utilitários como (libtool, lxml, cpp, etc...)que já é default em distros Linux: 92 | 93 | ``` 94 | $ x-code-select --install 95 | ``` 96 | 97 | Se der erro de locale, tente comando abaixo, o ideal é colocar no ~/.bash_profile 98 | 99 | ``` 100 | $ export LC_ALL=en_US.UTF-8 101 | 102 | $ export LANG=en_US.UTF-8 103 | ``` 104 | 105 | Ou verifique pelo Stackoverflow e pelo Google quais as soluções possíveis. Se o problema persistir, nos informe nas issues. 106 | 107 | Legal, agora já instalei todos os programas, vamos fazê-lo rodar em nosso computador? 108 | 109 | ``` 110 | $ make html 111 | 112 | $ make serve 113 | ``` 114 | 115 | O *make html* irá gerar o HTML e o *make serve* irá criar o servidor. Basta acessar *localhost:8000* e pronto! O site já está rodando em seu computador localmente! 116 | 117 | Agora basta fazer as modificações na pasta *content/pages*, rodar os comandos *make html* e *make serve* e suas alterações já serão visíveis. 118 | 119 | Resta então fazer o commit de suas alterações em seu repositório local e enviar-nos o Pull Request! o/ 120 | 121 | Mais informações sobre como funciona o Pelican, indicamos o artigo - [http://mindbending.org/pt/instalando-o-pelican](http://mindbending.org/pt/instalando-o-pelican). 122 | 123 | Caso queira contribuir com o tema é preciso ter o node instalado em sua máquina. Sua instalação é bem direta e pode ser obtida em: 124 | 125 | [https://nodejs.org/en/download/](https://nodejs.org/en/download/) 126 | 127 | Após a instalação do node você pode instalar as dependências do tema indo a seu diretório e rodando o npm: 128 | 129 | ``` 130 | $ cd themes/pybr 131 | $ npm install 132 | ``` 133 | 134 | Com as dependências instaladas para rodar a montagem do css com live reload basta rodar: 135 | 136 | ``` 137 | $ gulp 138 | ``` 139 | 140 | E caso queira rodar sem o live reload, somente para gerar o css para publicação rode: 141 | 142 | ``` 143 | $ gulp build 144 | ``` 145 | -------------------------------------------------------------------------------- /content/pages/empresas.md: -------------------------------------------------------------------------------- 1 | Title: Empresas que usam Python 2 | Slug: empresas 3 | Template: empresas 4 | 5 | 6 | # Empresas que usam Python 7 | 8 | Conheça as empresas espalhadas pelo Brasil que utilizam Python. 9 | 10 | > Se você quer incluir alguma empresa que usa Python, faça sua contribuição, adicionando-a ao repositório [https://github.com/pythonbrasil/pyBusinesses-BR](https://github.com/pythonbrasil/pyBusinesses-BR). Todos os dados aqui apresentados encontram-se nesse mesmo repositório. 11 | 12 | 13 | ## Ranking 14 | 15 | Gráfico com o ranking das cidades com mais empresas utilizando a linguagem de programação Python no Brasil segundo o repositório mencionado acima. 16 | 17 | ![cidades](https://raw.githubusercontent.com/pythonbrasil/pyBusinesses-BR/master/ranking/ranking_cities.png) 18 | 19 | ![estados](https://raw.githubusercontent.com/pythonbrasil/pyBusinesses-BR/master/ranking/ranking_states.png) 20 | 21 | ![regiões](https://raw.githubusercontent.com/pythonbrasil/pyBusinesses-BR/master/ranking/ranking_regions.png) 22 | 23 | ## Empresas 24 | -------------------------------------------------------------------------------- /content/pages/estatuto.md: -------------------------------------------------------------------------------- 1 | Title: Estatuto da Associação Python Brasil 2 | Slug: estatuto 3 | Template: redirect 4 | Redirect: https://github.com/apyb/estatuto -------------------------------------------------------------------------------- /content/pages/ferramentas.md: -------------------------------------------------------------------------------- 1 | Title: Ferramentas de Desenvolvimento 2 | Slug: ferramentas 3 | Template: page 4 | 5 | Veja aqui uma listagem de ferramentas para te auxiliar no desenvolvimento python: 6 | 7 | 8 | # Editores de texto 9 | 10 | ### [Atom](https://atom.io/) 11 | 12 | Atom é open source e feito pelo Github e com suporte para várias linguagens, dentre elas o Python. É integrado ao Git e Github, sendo possível mexer com o Git e Github através da interface do editor de texto. Ótimo para iniciantes. 13 | 14 | ### [Visual Studio Code](https://code.visualstudio.com/) 15 | 16 | O VSCode é open source e free, desenvolvido pela Microsoft. Suporta inúmeras linguagens de programação. 17 | 18 | ### [Vim](http://www.vim.org/) 19 | 20 | Tem em todo GNU/Linux e é altamente configurável. Uma forma de transformar o vim em uma IDE Python completa é seguindo o tutorial em [vim a ide para programadores python](https://avelino.run/vim-a-ide-para-programadores-python/). 21 | 22 | ### [Emacs](http://www.gnu.org/software/emacs/emacs.html) 23 | 24 | Um editor (ou um sistema operacional com capacidades de edição?!) poderoso e amplamente extensível em eLisp (um dialeto Lisp). Vencida a curva de aprendizado (considerada difícil por algumas pessoas) é possível torná-lo em uma IDE Python poderosíssima. O python-mode.el prove diversas funcionalidades para edição, debug e desenvolvimento de programas em Python e o Ropemacs funcionalidades de refactoring. Mais "Emacs Goodies" na própria Wiki em PythonComEmacs. 25 | 26 | ### [SciTE](http://www.scintilla.org/SciTE.html) 27 | 28 | Excelente editor de texto voltado para programação. Suporta uma grande lista de linguagens, pode rodar e debugar os programas, é fácil de usar e é facilmente configurável. Disponível para Windows e X (ambiente gráfico dos UNIXes). 29 | 30 | ### [jext](https://sourceforge.net/projects/jext/) 31 | 32 | Muito bom editor! Suporta muitas linguagens e possui plugins para Python (executar, por exemplo). 33 | 34 | ### [joe](http://sourceforge.net/projects/joe-editor/) 35 | 36 | Editor de texto para dinossauros :-) Utiliza os mesmos comandos do WordStar, SideKick, etc. Disponivel via apt-get e emerge. 37 | 38 | ### [sublime](http://www.sublimetext.com/) 39 | 40 | Editor de texto proprietário e pago, porém disponibiliza uma versão beta para uso sem custo. Atualmente na versão 3, a compra de sua licensa permite o uso de ambas as versão existentes. 41 | 42 | ### [PS Pad](http://www.pspad.com/) 43 | 44 | Grátis (freeware) para Windows. Colore código Python e suporta edição com vários encodings. Tem também utilitários para HTML/XML, tabela ASCII e conversão DOS/UNIX. O Hex view quebra um galho na hora de procurar erros em arquivos com encoding incorreto. 45 | 46 | # IDEs gratuitas 47 | 48 | ### [Idle](http://www.python.org) 49 | 50 | A IDLE vem com o Python. É feita com Tkinter e se você se acostumar pode lhe ajudar bastante. É bem simples de ser usada também. 51 | 52 | ### [PyCharm community](https://www.jetbrains.com/pycharm/) 53 | 54 | É desenvolvido pela companhia JetBrains. Esta edição é liberada sob a licença da Apache. É multiplataforma. Essa IDE fornece análise de código, um depurador gráfico, um testador de unidade integrado, integração com sistemas de controle de versão (VCSes), e suporta desenvolvimento de web com Django. 55 | 56 | ### [Komodo-Edit](http://www.activestate.com/komodo_edit/) 57 | 58 | Também desenvolvido pela ActiveState o Komodo-Edit é uma excelente opção de editor, bastante rico em recursos tais como autocomplete, calltips, multi-language file support, syntax coloring, syntax checking, Vi emulation, Emacs key bindings e outros. 59 | 60 | ### [NetBeans](http://nbpython.org/) 61 | 62 | Analogamente ao Eclipse, o NetBeans também oferece suporte ao Python através de plugins. 63 | 64 | ### [NINJA-IDE](http://ninja-ide.org/) 65 | 66 | Do acrônimo recursivo: "Ninja-IDE Is Not Just Another IDE", é uma IDE multi-plataforma de desenvolvimento integrado. NINJA-IDE é executado em Linux/X11, Mac OS X e sistemas operacionais de desktop Windows, e permite aos desenvolvedores criarem aplicações para diversas finalidades, utilizando todas as ferramentas e utilitários de NINJA-IDE, tornando a tarefa de escrever software mais fácil e agradável. 67 | 68 | ### [SPE](http://pythonide.blogspot.com/) 69 | 70 | Desenvolvido com wxPython é livre e tem algumas funcionalidades interessantes. Tem wxGlade como plugin para desenho de telas gráficas. 71 | 72 | ### [Spyder 2](http://code.google.com/p/spyderlib/) 73 | 74 | Spyder (também conhecido como Pydee) é um poderoso ambiente de desenvolvimento interativo para a linguagem Python com edição avançada, testes interativos, recursos de depuração e introspecção 75 | 76 | ### [Pida](https://www.openhub.net/p/pida) 77 | 78 | É um IDE desenvolvido com PyGTK e visa a integração com o Vim. Oferece recursos como project management, source code management, code browser, code refactor, profiler, debugger entre outros. 79 | 80 | ### [Eric4](https://eric-ide.python-projects.org/) 81 | 82 | É feito com a biblioteca QT e se integra às ferramentas da QT e com outros softwares como o Bicycle Repair Man (refactoring) e TabNanny (verificação de indentações). O autor dos bindings python para o Qt4, lançou um instalador para Windows que contém as bibliotecas e os programas de desenvolvimento do Qt4, o pyqwt e o Eric4, o que facilita bastante a instalação no Windows. 83 | 84 | ### [Boa-Constructor](http://boa-constructor.sf.net) 85 | 86 | Essa é a "única" IDE ao estilo RAD do Delphi/VB. Funciona com o wxPython na versão 2.4 e acho que é a mais fácil de ser usada apesar de não promover boas práticas de desenvolvimento como a de separar lógica de negócios de apresentação (telas). As outras IDEs não possuem mecanismos para desenho de telas gráficas mas podem usar ferramentas como Glade e/ou wxGlade. 87 | 88 | ### [Eclipse](http://www.eclipse.org) 89 | 90 | Diferente de todos os outros. Pesado, grande, monstruoso mas muito poderoso. É feito em Java e é ideal para desenvolvimento Java. Mas existem plugins para se desenvolver em Python com ele (e detalhe: atualmente é um brasileiro quem o mantém) que é o [ppydev](http://pydev.sourceforge.net/). 91 | 92 | ### [EasyEclipse](http://easyeclipse.org/site-1.0.2/distributions/python.html) 93 | 94 | EasyEclipse é open source e hospedado pela Sourceforge que fornece muitas distribuições empacotadas do Eclipse pré-configuradas com plug-ins para Python, Ruby, etc. 95 | 96 | ### [DrPython](http://drpython.sourceforge.net/) 97 | 98 | Usa wxPython. Criado para ser utilizado em escolas. 99 | 100 | ### [IPython](https://ipython.org/) 101 | 102 | Um shell com muitos recursos, através das comandos "mágicos". Bastante útil, modo texto apenas. Você pode usá-lo como um shell "acoplado" aos seus programas também. 103 | 104 | ### [KDevelop](http://www.kdevelop.org/) 105 | 106 | IDE livre para GNU/Linux e outros *nixes-like. 107 | 108 | ### [PythonWin](http://pywin32.sf.net/) 109 | 110 | IDE que acompanha as extensões Win32 para Python (PyWin32). Oferece auto-completion e debugging, e tem recursos extras voltados à programação Windows (coletor de exceções para componentes COM criados, COM browser, geração de arquivos .py com informações sobre objetos COM (static dispatch), etc.). 111 | 112 | ### [PythonCard](http://pythoncard.sourceforge.net) 113 | 114 | É uma GUI para construção de aplicações multiplataforma em Windows, Mac OS X e Linux, usando a linguagem de programação Python. O lema de PythonCard é "coisas simples devem ser simples de fazer e coisas complexas devem devem ser possiveis". É a ferramenta para quem deseja desenvolver aplicações gráficas de maneira rápida e fácil, com um mínimo de esforço e codificação; simples mas poderoso. Utiliza a biblioteca wxPython, mas separa a lógica do código da apresentação utilizando um tipo de arquivo de definição de recursos. (RômuloCampelo - 08/04/2005) 115 | 116 | ### [PyScripter](https://sourceforge.net/projects/pyscripter/) 117 | 118 | Acompanha o conjunto de componentes python para Delphi (embora não requira que o Delphi esteja instalado para funcionar). Suporta debugging, auto-completion, navegação no código entre outros recursos. 119 | 120 | ### [PyPE](http://pype.sourceforge.net/index.shtml) 121 | 122 | Não se trata de uma IDE propriamente dita, mas é um editor Python, leve, funcional e rico em recursos interessantes e multiplataforma. Além disso, é desenvolvido utilizando wxPython. 123 | 124 | ### [Rodeo](https://rodeo.yhat.com/) 125 | 126 | Rodeo é uma IDE leve e intuitiva voltada para análise de dados. Com suporte a Jupyter Notebook, navegador de arquivos, busca de packages e visualização de gráficos, além de suporte a comandos VIM. 127 | 128 | # IDEs (pagas) 129 | 130 | ### [Wing](http://www.wingware.com) 131 | 132 | A empresa wingware recentemente lançou o wingide101 para auxiliar no ensino de Python e é uma versão com menos recursos que as versões professional e personal, mas que tem funcionalidades interessantes, como depurador gráfico, shell interativo. Segue o link: http://wingware.com/wingide-101/index 133 | 134 | ### [Komodo](http://www.activestate.com) 135 | 136 | Essa é outra IDE bem poderosa também. Trabalha com outras linguagens além de Python e roda em Linux e Windows. Existe uma licença gratuita que pode ser usada para aprendizado. 137 | 138 | ### [PyCharm](http://www.jetbrains.com/pycharm/) 139 | 140 | Possui um conjunto de ferramentas úteis para um desenvolvimento produtivo. Além disso, a IDE fornece capacidades de alta classe para o desenvolvimento Web profissional com framework Django e Flask, Google AppEngine. Possui suporte a diversos sistemas de controle de versão, integração com Github e atraves de plugin, com o Heroku. Possui gerador de Diagramas de Classe e ORM. Suporte para interpretador Python remoto. Criação de gerência de ambientes (virtualenv). Mais informações sobre funcionalidades e desenvolvimento do PyCharm veja http://confluence.jetbrains.net/display/PYH/PyCharm+IDE+and+Python+Plugin+for+IntelliJ+IDEA 141 | 142 | ### [Visual Studio 2010+](http://ironpython.net/) 143 | 144 | IDE completa para o mundo .NET que com o IronPython se torna uma excelente IDE. 145 | 146 | # Refactoring 147 | 148 | ### [Bycicle Repair Man](http://bicyclerepair.sourceforge.net/) 149 | 150 | Automatiza algumas operações básicas de refactoring para Python. Tem integração com vários editores, como o PyDev e o Emacs. 151 | 152 | ### [Rope](https://github.com/python-rope/rope) 153 | 154 | Uma biblioteca de refactoring para Python. Pode ser usada em outras IDEs. 155 | 156 | *Boa parte deste conteúdo foi retirado do link (http://wiki.python.org.br/IdesPython) 157 | -------------------------------------------------------------------------------- /content/pages/games.md: -------------------------------------------------------------------------------- 1 | Title: Python para desenvolvimento de Games 2 | Slug: games 3 | Template: page 4 | 5 | Confira as ferramentas e conteúdo sobre desenvolvimento de games com python: 6 | 7 | ## Pygame 8 | 9 | [Pygame](https://www.pygame.org/) é uma biblioteca usada na criação de aplicações multimídia como jogos. 10 | Ela é uma camada de abstração construída sobre a biblioteca [SDL](http://www.libsdl.org/), e assim como a SDL ela é altamente portável e roda em praticamente todas plataformas e sistemas operacionais. 11 | 12 | ### Cursos e Tutoriais 13 | 14 | - [Desbravando o pygame](https://humberto.io/pt-br/tags/pygame/): Série de postagens introduzindo o desenvolvimento de jogos com pygame por [Humberto Rocha](https://humberto.io/blog/). 15 | 16 | ### Documentação 17 | 18 | - [Documentação oficial em inglês](https://www.pygame.org/docs/): Esta é a documentação oficial da biblioteca, infelizmente somente em inglês. 19 | 20 | ## Pyxel 21 | 22 | [Pyxel](https://github.com/kitao/pyxel) é uma engine para desenvolvimentos de jogos retro seguindo as limitações dos consoles fictícios [PICO-8](https://www.lexaloffle.com/pico-8.php) e [TIC-80](https://tic.computer/). 23 | Ela vem com um editor embutido para criação de sprites, tilemaps e efeitos sonoros. 24 | -------------------------------------------------------------------------------- /content/pages/gruposonline.md: -------------------------------------------------------------------------------- 1 | Title: Grupos de discussão online 2 | Slug: gruposonline 3 | Template: page 4 | 5 | 6 | Estes grupos não são organizados pelo [Associação Python Brasil](https://apyb.python.org.br/). 7 | Os grupos listados abaixo são gerenciados e mantidos por iniciativas independentes da comunidade Python. 8 | 9 | Sites listados apenas para facilitar serem encontrados. 10 | 11 | 12 | ## Telegram 13 | 14 | - [Python Brasil - Roda de Conversa](https://t.me/pythonbr) 15 | - [Data Science Python](https://t.me/datasciencepython) 16 | - [Django Brasil](https://t.me/djangobrasil) 17 | - [Flask Brasil](https://t.me/flaskbrasil) 18 | - [Tradução da documentação da documentação do Python e correlatas](https://t.me/pybr_i18n) 19 | - [FastAPI Brasil](https://t.me/fastapibr) 20 | - [Live de Python - Dunossauro](https://t.me/livepython) 21 | 22 | Diversos grupos e comunidades locais também organizam seus próprios grupos no Telegram. 23 | [Lista completa das comunidades locais](/comunidades-locais) 24 | 25 | ## Discord 26 | 27 | - [Python Brasil](https://discord.gg/TuENdUjwQX) 28 | 29 | Caso você queira adicionar seu grupo Telegram ou servidor Discord, [faça um pull request no repositório desta wiki](https://github.com/pythonbrasil/wiki/). Lembre-se que ela deve ser sobre o ecossistema Python. 30 | -------------------------------------------------------------------------------- /content/pages/home.md: -------------------------------------------------------------------------------- 1 | Title: Home 2 | Slug: index 3 | Template: home 4 | save_as: index.html 5 | -------------------------------------------------------------------------------- /content/pages/instalacao-linux.md: -------------------------------------------------------------------------------- 1 | Title: Instalando o Python no Linux 2 | Slug: instalacao-linux 3 | Template: page 4 | 5 | Os sistemas GNU/Linux mais recentes ja possuem uma versão do Python instalada junto com o sistema operacional. Podemos checar com o seguinte comando: 6 | 7 | $ which python3 8 | /usr/bin/python3 9 | 10 | que nos mostra onde o Python padrão do sistema operacional está instalado. 11 | 12 | A versão do Python na distribuição Linux Ubuntu 22.04.2 LTS é a 3.10. 13 | 14 | $ python3 --version 15 | Python 3.10.6 16 | 17 | Para evitar conflitos com o Python do sistema operacional, sugere-se a instalação de um outro interpretador, que pode ser feita de 2 formas diferentes: através do de gerenciador de pacotes ou de repositórios. 18 | 19 | ## Instalação por gerenciadores de pacotes 20 | 21 | Os gerenciadores de pacotes mais comuns são `apt-get` (Debian, Ubuntu) e `yum` 22 | (RedHat, CentOS). Caso sua distribuição utilize um gerenciador de pacotes diferente, acesse a [página de downloads do Python](https://www.python.org/downloads/). 23 | 24 | ### Debian e Ubuntu 25 | 26 | Através do gerenciador de pacotes, é possível instalar versões específicas do Python. 27 | No exemplo abaixo, é instalada a versão, por exemplo, 3.9 do Python 28 | 29 | sudo apt-get install python3.9 30 | 31 | É possível instalar qualquer outra versão: `python3.8`, `python3.9`, `python.10` 32 | 33 | Desta forma, a instalação desta versão específica do Python acima difere da versão padrão do sistema operacional. 34 | 35 | $ which python3.9 36 | /usr/bin/python3.9 37 | 38 | $ which python3 39 | /usr/bin/python3 40 | 41 | ### RedHat e CentOS 42 | 43 | Assim como no tópico anterior, é possível instalar versões específicas do Python. 44 | No comando abaixo, é instalada a versão, por exemplo, 3.9 do Python. 45 | 46 | sudo yum install python3.9 47 | 48 | ## Instalação por repositório 49 | 50 | Os repositórios no GNU/Linux são chamados de PPAs (do inglês Personal Package Archives). 51 | 52 | Para adicionar repositórios ao nosso sistema, precisamos de um software chamado `software-properties-common`, que pode ser instalado com o comando abaixo: 53 | 54 | sudo apt-get install software-properties-common 55 | 56 | Habilitada a adição de repositórios ao nosso sitema operacional, podemos agora incluir o repositório que contém o Python. Este repositório é chamado de deadsnakes, cuja página oficial pode ser encontrada neste [link](https://launchpad.net/~deadsnakes/+archive/ubuntu/ppa). 57 | 58 | sudo add-apt-repository ppa:deadsnakes/ppa 59 | 60 | Agora a instalação do Python pode ser feita a partir deste repositório com o comando 61 | 62 | sudo apt-get install python3.9 63 | 64 | Da mesma forma, é possível instalar várias versões. Observem que a versão python correspondente à do sistema operacional padrão não está disponível no repositório deadsnakes. 65 | -------------------------------------------------------------------------------- /content/pages/instalacao-mac.md: -------------------------------------------------------------------------------- 1 | Title: Instalando o Python no Mac OS X 2 | Slug: instalacao-mac 3 | Template: page 4 | 5 | Verifique se já tem o Python instalado, se você usa macOS 10.2 ou superior, provavelmente já possui alguma versão do Python instalada por padrão. Para conferir, digite em um terminal: 6 | 7 | $ which python 8 | 9 | ou 10 | 11 | $ which python3 12 | 13 | que deve retornar algo como `/usr/bin/python`. Isso significa que o Python está instalado nesse endereço. 14 | 15 | ## Instalação 16 | 17 | Antes de fazer a instalação do Python, é preciso fazer a instalação do XCode, que pode ser baixado na [App Store](https://itunes.apple.com/br/app/xcode/id497799835), do pacote para desenvolvimento em linha de comando no macOS, command line tools e dos gerenciadores de pacotes pip e homebrew. 18 | 19 | Para instalar o command line tools, digite em um terminal: 20 | 21 | $ xcode-select --install 22 | 23 | Para instalar o pip, digite em um terminal: 24 | 25 | $ sudo easy_install pip 26 | 27 | Para atualizar o pip, digite em um terminal: 28 | 29 | $ sudo pip install --upgrade pip 30 | 31 | Para instalar o homebrew, digite em um terminal: 32 | 33 | $ ruby -e "$(curl -fsSL https://raw.github.com/mxcl/homebrew/go)" 34 | 35 | Para instalar o Python 2, digite em um terminal: 36 | 37 | $ brew install python 38 | 39 | Para instalar o Python 3, digite em um terminal: 40 | 41 | $ brew install python3 42 | 43 | -------------------------------------------------------------------------------- /content/pages/instalacao-windows.md: -------------------------------------------------------------------------------- 1 | Title: Instalando o Python 3 no Windows 2 | Slug: instalacao-windows 3 | Template: page 4 | 5 | Para instalar o Python no seu sistema operacional Windows, você precisa baixar o instalador. Acesse o site oficial [neste link](https://www.python.org/downloads/) e clique em download, como mostrado abaixo. 6 | 7 | ![passos](./../images/instalacao-windows/01.png) 8 | 9 | Isso fará o download do Python 3 para sitemas 64 bits. Para o instalador de 32 bits, acesse [](https://www.python.org/downloads/windows/) e selecione o instalador de 32 bits apropriado, como mostrado abaixo. 10 | 11 | ![passos](./../images/instalacao-windows/02.png) 12 | 13 | Faça o download do instalador executável do Windows (32 ou 64 bits) e clique duas vezes nele para iniciar o assistente de instalação do python, como mostrado abaixo. 14 | 15 | ![passos](./../images/instalacao-windows/03.png) 16 | 17 | O processo de instalação é bem simples. 18 | 19 | 1. Marque a opção "Add Python to PATH" 20 | 2. Clique em "Install Now" 21 | 22 | A tela abaixo será mostrada. Aguarde enquanto o instalador completa o processo de instalação. 23 | 24 | ![passos](./../images/instalacao-windows/04.png) 25 | 26 | Se tudo ocorrer bem, a próxima tela será mostrada. Clique em "Close". 27 | 28 | ![passos](./../images/instalacao-windows/05.png) 29 | 30 | Para verificar se a instalação do Python foi bem-sucedida, pesquise no menu iniciar por "cmd" e clique duas vezes para abri-lo. 31 | 32 | ![passos](./../images/instalacao-windows/06.png) 33 | 34 | Digite o seguinte comando: 35 | $ python --version 36 | Python 3.11.3 37 | 38 | Este comando retornará a versão do python que está instalada em sua máquina. Agora digite: 39 | 40 | $ pip --version 41 | pip 22.3.1 from C:\Users\...\AppData\Local\Programs\Python\Python311\Lib\site-packages\pip (python 3.11) 42 | 43 | Esse comando retornará a versão do pip que está instalada em sua máquina. O pip é o gerenciador de pacote do Python. Com ele você poderá adicionar novas funcionalidades ao seu Python. 44 | 45 | ## IDLE 46 | 47 | O IDLE (Ambiente de Desenvolvimento e Aprendizagem Integrado) é um ambiente de desenvolvimento integrado (IDE) para Python. O instalador do Python para Windows contém o módulo IDLE por padrão. 48 | 49 | O IDLE pode ser usado para executar uma única instrução, como o Python Shell, e também para criar, modificar e executar scripts Python. O IDLE fornece um editor de texto completo para criar scripts Python que incluem recursos como destaque de sintaxe, preenchimento automático e recuo inteligente. Ele também possui um depurador com recursos de etapas e pontos de interrupção. 50 | 51 | Para iniciar o shell interativo IDLE, procure o ícone IDLE no menu Iniciar e clique duas vezes nele. 52 | 53 | ![passos](./../images/instalacao-windows/09.png) 54 | 55 | Isso abrirá o IDLE, onde você pode escrever o código Python e executá-lo como mostrado abaixo. 56 | 57 | ![passos](./../images/instalacao-windows/11.gif) 58 | 59 | Parabéns, agora o Python, o pip e o Idle já estão instalados em seu sistema Windows. 60 | 61 | Happy Hacking! ^-^ 62 | -------------------------------------------------------------------------------- /content/pages/introducao.md: -------------------------------------------------------------------------------- 1 | Title: Python para quem está começando 2 | Slug: introducao 3 | Template: page 4 | 5 | Python é uma linguagem poderosa e divertida. Com ela você pode fazer diversas coisas como: 6 | 7 | * Construção de sistemas Web com Django, Flask, Pyramid, etc; 8 | * Análise de dados, Inteligência Artificial, Machine Learning e etc com Numpy, Pandas, Matplotlib, etc; 9 | * Construção de aplicativos com Kivy e Pybee; 10 | * Construção de sistemas desktop com Tkinter, WxPython, etc. 11 | 12 | Existem diversos cursos onlines onde você pode encontrar material. São cursos 13 | que você consegue aprender o básico da programação com Python, como tipos de 14 | variáveis, como escrever funções, etc. 15 | 16 | **Devo usar o Interpretador do Python puro?** 17 | Depende da sua preferência. Ele é uma ferramenta poderosa, mas boa parte de 18 | profissionais usa o interpretador [*ipython*](http://ipython.org/). Pois, este 19 | contém mais recursos visuais e de auxílio (como colorir as mensagens de erro). 20 | 21 | **Que IDE usar?** 22 | Depende muito da sua preferência. Você pode usar qualquer editor de texto puro, como o [Notepad++](https://notepad-plus-plus.org/), 23 | [gedit](https://help.gnome.org/users/gedit/stable/index.html.pt_BR) ou [Sublime](http://sublimetext.com/) e até editores orientados para 24 | a linha de comando, como o [Nano](https://www.nano-editor.org/). Ou editores com recursos de depuração, execução de tarefas e controle 25 | de versão, como o [VS Code](https://code.visualstudio.com/) ou sua versão sem telemetria e rastreamento, o [VSCodium](https://vscodium.com/). 26 | Não existe padrão. 27 | Para quem vem do MATLAB ou R, o [Spyder](https://www.spyder-ide.org/) pode ser muito útil. O [Pycharm](https://www.jetbrains.com/pycharm/) é outro IDE muito utilizado na comunidade e traz consigo muitas funções úteis para iniciantes e profissionais. 28 | 29 | **Aonde eu encontro os módulos para utilizar no meu projeto?** 30 | Alguns módulos já vem por padrão no Python puro, por exemplo o módulo matemático 31 | (math). Outros, devem ser baixados de um repositório, como é o caso do Django ou 32 | Numpy. Hoje, mais de 207 mil projetos estão cadastrados no 33 | [repositório oficial](https://pypi.org/). Caso você não ache o que procura, há 34 | muito incentivo para que você construa um novo módulo e inclua no repositório! 35 | 36 | Se você não tem a menor ideia de que módulo você precise, dê uma procurada no 37 | Google e StackOverflow. De certo, alguém já fez algo parecido com o que você 38 | precisa! 39 | 40 | **O que são ambientes virtuais?** 41 | O ideal para projetos Python é que você isole as bibliotecas que você usa, para evitar conflitos entre projetos. 42 | Isso é uma boa prática e pode evitar dores de cabeça futuras. [Dê uma lida](https://docs.python.org/pt-br/3/library/venv.html) sobre antes de iniciar um projeto, ok? 43 | 44 | **Indicação de material de estudo** 45 | 46 | Não sabe por onde começar? Veja nossa listagem de conteúdo para quem está começando na linguagem: 47 | 48 | Ano | Título | Autor | Tipo | Nível | Grátis? | Link 49 | -----|--------|-------|------|-------|---------|------ 50 | 2024 | Introdução à Programação com Python (4ª edição) | Nilo Ney Coutinho Menezes | Livro | Iniciante | Não | [link](http://python.nilo.pro.br/) 51 | 2021 | Curso para acesso ao mercado Python de Tecnologia | Renzo Nuccitelli | Curso | Intermediario | Não | [link](https://www.python.pro.br/) 52 | 2017 | Pycubator (Tradução PT-BR) | Noam Elfanbaum, Udi Oron e Gilson Filho (Tradução) | Material online | Iniciante | Sim | [link](http://df.python.org.br/pycubator/) 53 | 2016 | Python Básico | Solyd/Guilherme Junqueira | Curso | Iniciante | Sim | [link](https://solyd.com.br/treinamentos/python-basico) 54 | 2015 | Curso de Programação em Python para Iniciantes | PyLadies BH | Curso | Iniciante | Sim | [link](https://www.youtube.com/watch?v=O2xKiMl-d7Y&list=PL70CUfm2J_8SXFHovpVUbq8lB2JSuUXgk) 55 | -------------------------------------------------------------------------------- /content/pages/lista-de-discussoes.md: -------------------------------------------------------------------------------- 1 | Title: Lista de Discussões 2 | Slug: lista-de-discussoes 3 | Template: comunidade-google-group 4 | -------------------------------------------------------------------------------- /content/pages/mobile.md: -------------------------------------------------------------------------------- 1 | Title: Python para desenvolvimento Mobile 2 | Slug: mobile 3 | Template: page 4 | 5 | Encontre aqui referências de aprendizado em programação mobile com python: 6 | 7 | ## Kivy 8 | 9 | [Kivy](https://kivy.org/#home) é uma biblioteca para o desenvolvimento de software com código-fonte aberto, voltado ao rápido desenvolvimento de aplicações que utilizam novas interfaces de usuário, e projetada para também ser utilizada na como aplicações que serão executadas em dispositivos multi-touch. 10 | 11 | #### Documentação 12 | 13 | - [Documentação Oficial da Biblioteca Kivy em Português](http://excript.com/downloads/kivy-pt_br-excript.pdf) 14 | -------------------------------------------------------------------------------- /content/pages/premio-dorneles-tremea-jean-ferri.md: -------------------------------------------------------------------------------- 1 | Title: Prêmio Dorneles Treméa|Jean Ferri 2 | Slug: premio-dorneles-tremea-jean-ferri 3 | Template: redirect 4 | Redirect: https://apyb.python.org.br/apyb/premio-dorneles-tremea-jean-ferri/ -------------------------------------------------------------------------------- /content/pages/premio-dorneles-tremea.md: -------------------------------------------------------------------------------- 1 | Title: Prêmio Dorneles Treméa|Jean Ferri 2 | Slug: premio-dorneles-tremea 3 | Template: redirect 4 | Redirect: https://apyb.python.org.br/apyb/premio-dorneles-tremea-jean-ferri/ -------------------------------------------------------------------------------- /content/pages/projetos.md: -------------------------------------------------------------------------------- 1 | Title: Projetos brasileiros com Python 2 | Slug: projetos 3 | Template: page 4 | 5 | Diversos projetos de Python e outras linguagens estão disponíveis [neste post](https://medium.com/nossa-coletividad/projetos-brasileiros-para-fazer-pull-requests-nesse-hacktoberfest-4dc9b9b576c0)! 6 | 7 | Alguns projetos brasileiros que usam python: 8 | 9 | - [Site Pyladies Brasil](https://github.com/pyladies-brazil/br-pyladies-pelican) 10 | - [Import caipyra](https://github.com/jtemporal/caipyra) 11 | - [Algpedia](https://github.com/thaisviana/algpedia) 12 | - [Bottery](https://github.com/rougeth/bottery) 13 | - [Speakerfight](https://github.com/luanfonceca/speakerfight) 14 | - [Tapioca-Jarbas](https://github.com/daneoshiga/tapioca-jarbas) 15 | - [python-simple-rest-client](https://github.com/allisson/python-simple-rest-client) 16 | - [jinja-assets-compressor](https://github.com/jaysonsantos/jinja-assets-compressor) 17 | - [python-binary-memcached](https://github.com/jaysonsantos/python-binary-memcached) 18 | - [correios](https://github.com/olist/correios) 19 | - [simple-model](https://github.com/lamenezes/simple-model) 20 | - [python-ami](https://github.com/ettoreleandrotognoli/python-ami/) 21 | - [python-cdi](https://github.com/ettoreleandrotognoli/python-cdi) 22 | - [django-pycdi](https://github.com/ettoreleandrotognoli/django-pycdi) 23 | - [revelation](https://github.com/humrochagf/revelation) 24 | - [BotCity Framework Core](https://github.com/botcity-dev/botcity-framework-core-python) 25 | -------------------------------------------------------------------------------- /content/pages/pyladies.md: -------------------------------------------------------------------------------- 1 | Title: Pyladies 2 | Slug: pyladies 3 | Template: pyladies 4 | 5 | PyLadies é uma comunidade mundial que foi trazida ao Brasil com o propósito de ajudar mais e mais mulheres a se tornarem participantes ativas e líderes na comunidade open source Python. 6 | 7 | Para saber mais sobre esta iniciativa, acesse [brasil.pyladies.com](http://brasil.pyladies.com/) ou entre diretamente em contato com um dos grupos regionais listados abaixo: 8 | -------------------------------------------------------------------------------- /content/pages/python-brasil.md: -------------------------------------------------------------------------------- 1 | Title: Python Brasil 2 | Slug: python-brasil 3 | Alias: /pythonbrasil/ 4 | Template: redirect 5 | Redirect: https://apyb.python.org.br/pythonbrasil/o-que-é/ -------------------------------------------------------------------------------- /content/pages/qual-python.md: -------------------------------------------------------------------------------- 1 | Title: Qual Python? 2 | Slug: qual-python 3 | Template: page 4 | 5 | Uma das dúvidas mais recorrentes dentre iniciantes na linguagem é a respeito da escolha de versão: "Estou começando na linguagem, devo usar python 2 ou python 3?" Para responder a esta pergunta é importante entender o estado atual da linguagem: 6 | 7 | - Python 2 foi o padrão da linguagem por muito tempo. 8 | - Python 3 introduziu algumas mudanças que quebraram a compatibilidade com a versão anterior o que criou a necessidade de se manter duas versões da linguagem. 9 | - Python 2 receberá atualizações de segurança até 2020 quando seu suporte será descontinuado. 10 | - Python 3 está constantemente evoluindo e recebendo novas funcionalidades, que não estarão presentes na versão anterior. 11 | 12 | Sabendo disso, a recomendação é dar sempre que possível preferência ao Python 3, por ser o futuro da linguagem e pelo fato de sua versão anterior estar em processo de descontinuação. 13 | 14 | Use Python 2 somente quando estiver trabalhando com um software que ainda não foi migrado para Python 3 ou caso precise manter algum sistema legado. 15 | 16 | As diferenças entre as versões para quem está começando a aprender a linguagem não são tão grandes ao ponto de você não conseguir alternar entre as duas caso necessário. 17 | 18 | Se você possuir curiosidade quanto as mudanças entre as duas versões dê uma olhada neste [link](https://docs.python.org/3.0/whatsnew/3.0.html). 19 | -------------------------------------------------------------------------------- /content/pages/traducao.md: -------------------------------------------------------------------------------- 1 | Title: Como colaborar com a tradução 2 | Slug: traducao 3 | Template: page 4 | 5 | Uma excelente forma de contribuir com a comunidade é através da tradução da documentação da linguagem, de bibliotecas e de ferramentas. Com isso você contribui com o crescimento da comunidade aumentando o alcance da linguagem dentro de pessoas nativas do Português Brasileiro. 6 | 7 | Caso haja interesse em contribuir, a comunidade possui um grupo no Telegram destinado a essa tarefa que pode ser acessado através do seguinte link: 8 | 9 | [https://t.me/pybr_i18n](https://t.me/pybr_i18n) 10 | 11 | As traduções estão sendo feitas através da plataforma [transifex](https://www.transifex.com/). Para ajudar com a tradução basta criar uma conta e seguir para um dos projetos em andamento abaixo: 12 | 13 | ### Tradução da documentação da linguagem Python 14 | 15 | Para começar a traduzir faça sua requisição através de: 16 | 17 | [https://www.transifex.com/python-doc/public/](https://www.transifex.com/python-doc/public/) 18 | 19 | ### Tradução da documentação do framework Django 20 | 21 | Para começar a traduzir faça sua requisição através de: 22 | 23 | [https://www.transifex.com/django/public/](https://www.transifex.com/django/public/) 24 | 25 | Você pode também participar da lista de e-mails para 26 | discussão sobre tradução do Django: 27 | 28 | [https://groups.google.com/d/forum/django-i18n](https://groups.google.com/d/forum/django-i18n) 29 | 30 | E ler mais sobre a localização do projeto em: 31 | 32 | [https://docs.djangoproject.com/en/dev/internals/contributing/localizing/#documentation](https://docs.djangoproject.com/en/dev/internals/contributing/localizing/#documentation) 33 | 34 | ## Referências de tradução 35 | 36 | O Luciano Ramalho e mais uma galera, criaram algumas dicas para quando eles estavam traduzindo o tutorial oficial do Python 2.7 que podem ser usados como referência ao realizar as traduções: 37 | 38 | [http://turing.com.br/pydoc/2.7/tutorial/NOTAS.html#notas-para-os-tradutores-da-versao-pt-br](http://turing.com.br/pydoc/2.7/tutorial/NOTAS.html#notas-para-os-tradutores-da-versao-pt-br) 39 | 40 | ## Tradução offline 41 | 42 | Embora o processo de tradução possa ser feito diretamente pelo navegador web, também é possível gerar a documentação traduzida no computador. Isso pode facilitar o processo de revisão já que pelo browser fica mais difícil visualizar links quebrados e navegar pela documentação. 43 | 44 | Para gerar a documentação em português siga os passos a seguir (usaremos o Django como exemplo): 45 | 46 | **1** - Conforme a [documentação do Transifex](http://docs.transifex.com/client/config/), será preciso criar um arquivo chamado `.transifexrc` na raiz do seu diretório pessoal (ex.: `/home/user/.transifexrc`) contendo seu login e senha no Transifex: 47 | 48 | ``` 49 | [https://www.transifex.com] 50 | username = user 51 | token = 52 | password = passw0rd 53 | hostname = https://www.transifex.com 54 | ``` 55 | 56 | **2** - Será preciso baixar os repositórios e instalar algumas bibliotecas, para isso é recomendado criar uma pasta de trabalho: 57 | 58 | ``` 59 | mkdir ~/traducoes/django-br && cd ~/traducoes/django-br 60 | ``` 61 | 62 | **3** - Faça o clone do repositório no GitHub: 63 | 64 | ``` 65 | git clone https://github.com/django/django.git 66 | ``` 67 | 68 | **4** - Faça também o clone do repositório contendo as traduções do Django (como as traduções consomem muito espaço, elas foram movidas para um repositório separado): 69 | 70 | ``` 71 | git clone https://github.com/django/django-docs-translations.git 72 | ``` 73 | 74 | **5** - Para gerar a documentação em português, nós vamos trabalhar dentro do diretório `django-docs-translations`: 75 | 76 | ``` 77 | cd django-docs-translations/ 78 | ``` 79 | 80 | **6** - Existem várias traduções disponíveis, uma para cada versão do Django, nesse exemplo nós vamos gerar a documentação para a versão 1.10.x: 81 | 82 | ``` 83 | git checkout stable/1.10.x 84 | ``` 85 | 86 | **7** - Para a instalação das bibliotecas, é recomendado também criar e ativar um virtualenv: 87 | 88 | ``` 89 | python -m venv .django-br 90 | source .django-br/bin/activate 91 | ``` 92 | 93 | **6** - Para gerar a documentação, o Django utiliza uma biblioteca chamada Sphinx, você pode instalá-la rodando o comando abaixo: 94 | 95 | ``` 96 | pip install sphinx 97 | ``` 98 | 99 | **7** - Para baixar as últimas traduções do site Transifex, nós vamos precisar instalar também a biblioteca `Transifex-Client`: 100 | 101 | ``` 102 | pip install transifex-client 103 | ``` 104 | 105 | **8** - Com o `Transifex-Client` instalado e com o arquivo `.transifexrc` configurado na raiz do seu diretório pessoal, será possível executar o comando abaixo para baixar as traduções do Transifex: 106 | 107 | ``` 108 | tx pull -f -l pt_BR 109 | ``` 110 | 111 | **9** - Com o download das traduções concluído, agora é preciso executar o comando 'make translations' para compilá-las: 112 | 113 | ``` 114 | make translations 115 | ``` 116 | 117 | **10** - Também é necessário criar um link simbólico para que o Sphinx gere a documentação utilizando os arquivos baixados e compilados por você (ao invés dos arquivos padrão no repositório do Django): 118 | 119 | ``` 120 | ln -s ~/traducoes/django-br/django-docs-translations/translations/ ~/traducoes/django-br/django/docs/locale 121 | ``` 122 | 123 | **11** - Agora saia do repositório django-docs-translations e vá para o repositório django, onde vamos encontrar um diretório chamado `docs`. É dentro desse diretório que vamos poder gerar a documentação: 124 | 125 | ``` 126 | cd ../django/docs/ 127 | ``` 128 | 129 | **12** - Dentro do diretório docs do repositório do Django, após executar os passos acima, rode o comando abaixo para que o Sphinx gere a documentação em português: 130 | 131 | ``` 132 | make html LANGUAGE=pt_BR 133 | ``` 134 | 135 | **13** - Como medida de segurança, eu sugiro excluir o arquivo `~/.transifexrc` do seu home ou apagar a senha contida dentro dele já que o Transifex não oferece autenticação via tokens (ainda): 136 | 137 | ``` 138 | rm ~/.transifexrc 139 | ``` 140 | 141 | **14** - Ao final do processo, um novo diretório `_build` é criado e dentro desse diretório é possível encontrar também o diretório `html` contendo os arquivos gerados pelo Sphinx. Para visualizar a documentação entre em `_build/html/`: 142 | 143 | ``` 144 | cd _build/html/ 145 | ``` 146 | 147 | A página principal da documentação é a `index.html`, clique duas vezes nesse arquivo para que ele seja aberto no seu browser. Clique nos links para navegar pela documentação, embora sejam links html, todo o conteúdo está contido dentro da pasta `_build` e portanto disponível offline. O Sphinx permite ainda gerar a documentação em outros formatos como `.pdf`. 148 | 149 | ## Dicas de tradução 150 | 151 | Nesta seção apresentamos agumas dicas de tradução. 152 | 153 | ### Atenção com palavras de grafia parecida 154 | 155 | Model: Modelo -- Classe que representa uma tabela. 156 | Module: Módulo -- Módulo Python, e dentro do Django ainda pode ser o nome de uma Django "app". 157 | 158 | 159 | ### Cuidado com neologismo 160 | 161 | A maioria dos termos de computação vem do inglês. E muitas vezes usamos os termos em inglês sem nos dar conta, ou pior, usamos uma tradução cujo o sentido da palavra em português é outro. 162 | 163 | ### Adotando a linguagem neutra de gênero 164 | 165 | Tente usar a linguagem neutra de gênero, pois é uma forma inclusiva de comunicação. Usar 'x' ou '@' no final de termos masculinos ou femininos não é inclusivo e não é reconhecido por leitores de tela. Tente usar uma linguagem que se refira à pessoas, não somente ao masculino ou feminino. Por exemplo: 166 | 167 | **Se você está interessado em contribuir entre em contato conosco** 168 | 169 | Use ao invés disso: 170 | 171 | **Caso haja interesse em contribuir entre em contato conosco** 172 | 173 | Para saber mais sobre a linguagem neutra de gênero você poder ler este artigo da ThoughtWorks Brasil: [Adotando a linguagem neutra de gênero](https://medium.com/coragem/adotando-a-linguagem-neutra-de-g%C3%AAnero-e509e6e4e06c) 174 | 175 | ### Cuidado com os artigos 176 | 177 | Em inglês as palavras não possuem gênero, portando tenha atenção quanto a concordância dos artigos ao realizar a tradução: 178 | 179 | **Or use a common ancestor to hold the :class:\`~django.db.models.AutoField\`** 180 | 181 | alguém poderia traduzir como usando o artigo "o" referindo-se ao "autoField": 182 | 183 | **Ou use um acestral comum para manter o :class:\`~django.db.models.AutoField\`** 184 | 185 | Mas não seria correto. Talvez para uma leitura menos atenta fique até estranho, o que é bom pois chamará atenção se usarmos um artigo feminino neste caso. 186 | 187 | **Ou use um acestral comum para manter a :class:\`~django.db.models.AutoField\`** 188 | 189 | quer dizer, "ou use um acestral comum para a manter a classe ~django.db.models.AutoField" 190 | 191 | Depois do texto renderizado, a diretiva `:class:` não é mostrada, e usar o artigo correto ajuda a lembrar que referenciamos uma classe ou método por exemplo. 192 | 193 | ### Não tente explicar mais que na autoria original 194 | 195 | Cuidado ao achar que um texto em inglês não está bem explicado, ou falta detalhes. Você pode ter razão, e a solução é sugerir melhorias no texto original. 196 | 197 | Se ao invés disso, tentar escrever um texto melhor na tradução, 198 | além do problema raiz persistir, pode acontecer de estar sendo repetitivo. 199 | 200 | O erro no texto original pode existir, mas antes de afirmá-lo, procure ler o contexto todo e entender se aquele detalhe ou explicação deveria estar ali, ou já foi comentado em outra seção, 201 | ou se é realmente papel do texto explicar em detalhes tal condição. 202 | 203 | ### Glossário de tradução 204 | 205 | Este glossário tem como objetivo criar uma consistência de tradução entre os projetos: 206 | -------------------------------------------------------------------------------- /content/pages/web.md: -------------------------------------------------------------------------------- 1 | Title: Python para desenvolvimento Web 2 | Slug: web 3 | Template: page 4 | 5 | Descubra as ferramentas e conteúdo para desenvolvimento Web: 6 | 7 | ## Django 8 | 9 | [Django](https://www.djangoproject.com/) é um framework para desenvolvimento rápido para web, escrito em Python, que utiliza o padrão model-template-view (MTV). 10 | 11 | ### Cursos e Tutoriais 12 | 13 | - [Tutorial Django Girls](https://tutorial.djangogirls.org/pt/): Aprenda como construir uma pequena aplicação web funcional para um blog pessoal. Com foco no público iniciante. Criado pela comunidade [Django Girls](https://djangogirls.org). 14 | - [Python 3 na Web com Django](https://www.udemy.com/python-3-na-web-com-django-basico-intermediario): Curso voltado ao desenvolvimento de aplicações web de forma rápida. Voltado para um público iniciante para intermediário. Criado por [Gileno Filho](https://twitter.com/gilenofilho). 15 | - [Escrevendo seu primeiro app Django](https://docs.djangoproject.com/pt-br/2.1/intro/tutorial01/): Através deste tutorial, nós vamos caminhar através da criação de uma aplicação básica de enquetes. 16 | - [Dicas de django](https://humberto.io/pt-br/tags/django/): Postagens voltadas para tirar dúvidas de nível intermediário a respeito de diversos aspectos do Django como a criação de backend em Django para se comunicar com um frontend em Angular. Criado por [Humberto Rocha](https://humberto.io/blog/) 17 | 18 | ### Documentação 19 | 20 | - [v2.1](https://docs.djangoproject.com/pt-br/2.1/) Tradução da versão atual. 21 | - [v1.3.1](http://waltercruz.github.io/django-l10n-portuguese/): Esta é a tradução da documentação oficial do Django, mantida pelo grupo de localização do Django para o Português. No entanto, está desatualizada. 22 | 23 | ## Flask 24 | 25 | [Flask](https://flask.palletsprojects.com/en/1.1.x/) é um micro framework open-source de desenvolvimento web. Foi projetado para tornar o inicio rápido e fácil, com a capacidade de escalar até aplicações completas. 26 | 27 | ### Cursos e Tutoriais 28 | 29 | - [Curso em Video do Bruno Rocha](https://codeshow.com.br/tags/flask/): Curso Completo em vídeo do [Bruno Rocha](http://brunorocha.org/) 30 | - [Flask Tutorials](https://www.youtube.com/watch?v=MwZwr5Tvyxo&list=PL-osiE80TeTs4UjLw5MM6OjgkjFeUxCYH): Tutorial em Flask no Youtube (Inglês) 31 | 32 | ### Documentação 33 | 34 | - [Flask](https://flask.palletsprojects.com/en/1.1.x/): Documentação oficial do Flask (Inglês) 35 | - [Flask Brasil](https://flask-ptbr.readthedocs.io/en/latest/index.html): Documntação do Flask em PT-BR 36 | - [Grupo Telegram](https://t.me/flaskbrasil): Participe. 37 | 38 | ## web2py 39 | 40 | [Web2py](https://http://web2py.com/) é um framework web gratuito e open-source criado para desenvolvimento ágil de aplicações web baseadas em banco de dados seguros; ele é escrito em Python e programável em Python. web2py é um framework full-stack, o que significa que ele contém todos os componentes que você precisa para construir aplicações web completamente funcionais. 41 | 42 | ### Cursos e Tutoriais 43 | 44 | - [Passo-a-passo web2py - Julia Rizza](https://juliarizza.wordpress.com/2015/08/03/passo-a-passo-web2py-1o-passo): Ótimo curso com o básico do framework pela [Julia Rizza](https://juliarizza.wordpress.com). 45 | - [Curso em Video do Bruno Rocha](https://www.youtube.com/playlist?list=PL5CWed0-MqAPLiMS5gJvWKZDBez-vcRuN): Curso Completo em vídeo do [Bruno Rocha](http://brunorocha.org/) 46 | 47 | ### Documentação 48 | 49 | - [web2py.com.br](https://web2py.com.br/): Site Brasileiro do framework (em desenvolvimento). 50 | - [wiki na Python brasil](https://wiki.python.org.br/web2py/) 51 | - [Grupo Telegram](https://t.me/web2pybrasil): Participe. 52 | -------------------------------------------------------------------------------- /content/pages/wiki.md: -------------------------------------------------------------------------------- 1 | Title: Wiki 2 | Slug: wiki 3 | Template: redirect 4 | Redirect: http://wiki.python.org.br/ 5 | -------------------------------------------------------------------------------- /develop_server.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | ## 3 | # This section should match your Makefile 4 | ## 5 | 6 | PY=${PY:-python} 7 | PELICAN=${PELICAN:-pelican} 8 | PELICANOPTS= 9 | 10 | BASEDIR=$(pwd) 11 | INPUTDIR=$BASEDIR/content 12 | OUTPUTDIR=$BASEDIR/output 13 | CONFFILE=$BASEDIR/pelicanconf.py 14 | 15 | ### 16 | # Don't change stuff below here unless you are sure 17 | ### 18 | 19 | SRV_PID=$BASEDIR/srv.pid 20 | PELICAN_PID=$BASEDIR/pelican.pid 21 | 22 | function usage(){ 23 | echo "usage: $0 (stop) (start) (restart) (docker_start) [port]" 24 | echo "This starts Pelican in debug and reload mode and then launches" 25 | echo "an HTTP server to help site development. It doesn't read" 26 | echo "your Pelican settings, so if you edit any paths in your Makefile" 27 | echo "you will need to edit your settings as well." 28 | exit 3 29 | } 30 | 31 | function alive() { 32 | kill -0 $1 >/dev/null 2>&1 33 | } 34 | 35 | function shut_down(){ 36 | PID=$(cat $SRV_PID) 37 | if [[ $? -eq 0 ]]; then 38 | if alive $PID; then 39 | echo "Stopping HTTP server" 40 | kill $PID 41 | else 42 | echo "Stale PID, deleting" 43 | fi 44 | rm $SRV_PID 45 | else 46 | echo "HTTP server PIDFile not found" 47 | fi 48 | 49 | PID=$(cat $PELICAN_PID) 50 | if [[ $? -eq 0 ]]; then 51 | if alive $PID; then 52 | echo "Killing Pelican" 53 | kill $PID 54 | else 55 | echo "Stale PID, deleting" 56 | fi 57 | rm $PELICAN_PID 58 | else 59 | echo "Pelican PIDFile not found" 60 | fi 61 | } 62 | 63 | function start_up(){ 64 | local port=$1 65 | echo "Starting up Pelican and HTTP server" 66 | shift 67 | $PELICAN --debug --autoreload -r $INPUTDIR -o $OUTPUTDIR -s $CONFFILE $PELICANOPTS & 68 | pelican_pid=$! 69 | echo $pelican_pid > $PELICAN_PID 70 | mkdir -p $OUTPUTDIR && cd $OUTPUTDIR 71 | $PY -m pelican --listen $port & 72 | 73 | srv_pid=$! 74 | echo $srv_pid > $SRV_PID 75 | cd $BASEDIR 76 | 77 | sleep 1 78 | 79 | if ! alive $pelican_pid ; then 80 | echo "Pelican didn't start. Is the Pelican package installed?" 81 | return 1 82 | elif ! alive $srv_pid ; then 83 | echo "The HTTP server didn't start. Is there another service using port" $port "?" 84 | return 1 85 | fi 86 | echo 'Pelican and HTTP server processes now running in background.' 87 | } 88 | 89 | function docker_start(){ 90 | $PELICAN --debug --autoreload -r $INPUTDIR -o $OUTPUTDIR -s $CONFFILE $PELICANOPTS -l -b 0.0.0.0 -D 91 | } 92 | 93 | ### 94 | # MAIN 95 | ### 96 | [[ ($# -eq 0) || ($# -gt 2) ]] && usage 97 | port='' 98 | [[ $# -eq 2 ]] && port=$2 99 | 100 | if [[ $1 == "stop" ]]; then 101 | shut_down 102 | elif [[ $1 == "restart" ]]; then 103 | shut_down 104 | start_up $port 105 | elif [[ $1 == "start" ]]; then 106 | if ! start_up $port; then 107 | shut_down 108 | fi 109 | elif [[ $1 == "docker_start" ]]; then 110 | docker_start 111 | else 112 | usage 113 | fi 114 | -------------------------------------------------------------------------------- /empresas_generator.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python3 2 | # -*- coding: utf-8 -*- # 3 | 4 | import json 5 | import os 6 | import sys 7 | 8 | from urllib.request import urlopen 9 | try: 10 | from slugify import slugify 11 | except ImportError: 12 | print("Este programa requer python-slugify. Por favor, instale-o usando:\npython3 -m pip install python-slugify\n") 13 | sys.exit(1) 14 | 15 | 16 | # Diretório onde serão gerados os arquivos JSON 17 | PAGE_PATH = 'content/empresas/' 18 | 19 | # Arquivo que será consumido para gerar os arquivos JSON 20 | EMPRESAS_FILE = 'https://raw.githubusercontent.com/pythonbrasil/pyBusinesses-BR/master/README.md' 21 | EMPRESAS_LOGO_PATH = 'https://raw.githubusercontent.com/pythonbrasil/pyBusinesses-BR/master/' 22 | 23 | def scrapping_empresas(): 24 | file = urlopen(EMPRESAS_FILE) 25 | file = file.read().decode(encoding='utf-8') 26 | region = state = city = '' 27 | empresas = [] 28 | 29 | for line in file.split('\n'): 30 | if line.startswith('## '): 31 | region = line[2:].strip() 32 | elif line.startswith('### '): 33 | state = line[3:].strip() 34 | elif line.startswith('#### '): 35 | city = line[4:].strip() 36 | elif line.startswith('!') and region and state and city: 37 | parts = line.split('|') 38 | site = parts[2].split('(')[1].strip().strip(')') 39 | name = parts[1].strip() 40 | logo = EMPRESAS_LOGO_PATH + parts[0].split( 41 | '(')[1].strip().strip(')') 42 | 43 | empresas.append({ 44 | 'nome': name, 45 | 'regiao': region, 46 | 'estado': state, 47 | 'cidade': city, 48 | 'site': site, 49 | 'logo': logo, 50 | }) 51 | 52 | return empresas 53 | 54 | 55 | def main(): 56 | for empresa in scrapping_empresas(): 57 | filename = '{0}-{1}.json'.format( 58 | slugify(empresa['nome']), slugify(empresa['cidade'])) 59 | 60 | if not os.path.exists(PAGE_PATH): 61 | os.makedirs(PAGE_PATH) 62 | file_path = os.path.join(PAGE_PATH, filename) 63 | with open(file_path, mode='w', encoding='utf-8') as file: 64 | json.dump(empresa, file) 65 | print("Gerado: {}".format(file_path)) 66 | 67 | if __name__ == '__main__': 68 | main() 69 | 70 | -------------------------------------------------------------------------------- /install_os_dependencies.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | OS_REQUIREMENTS_FILENAME="requirements.apt" 4 | 5 | # Handle call with wrong command 6 | function wrong_command() 7 | { 8 | echo "${0##*/} - unknown command: '${1}'" 9 | usage_message 10 | } 11 | 12 | # Print help / script usage 13 | function usage_message() 14 | { 15 | echo "usage: ./${0##*/} " 16 | echo "available commands are:" 17 | echo -e "\tlist\t\tPrint a list of all packages defined on ${OS_REQUIREMENTS_FILENAME} file" 18 | echo -e "\thelp\t\tPrint this help" 19 | echo -e "\n\tCommands that require superuser permission:" 20 | echo -e "\tinstall\t\tInstall packages defined on ${OS_REQUIREMENTS_FILENAME} file. Note: This\n\t\t\t does not upgrade the packages already installed for new\n\t\t\t versions, even if new version is available in the repository." 21 | echo -e "\tupgrade\t\tSame that install, but upgrate the already installed packages,\n\t\t\t if new version is available." 22 | 23 | } 24 | 25 | # Read the requirements.apt file, and remove comments and blank lines 26 | function list_packages(){ 27 | grep -v "#" ${OS_REQUIREMENTS_FILENAME} | grep -v "^$"; 28 | } 29 | 30 | function install() 31 | { 32 | list_packages | xargs apt --no-upgrade install -y; 33 | } 34 | 35 | function upgrade() 36 | { 37 | list_packages | xargs apt install -y; 38 | } 39 | 40 | 41 | function install_or_upgrade() 42 | { 43 | P=${1} 44 | PARAN=${P:-"install"} 45 | 46 | if [[ $EUID -ne 0 ]]; then 47 | echo -e "\nYou must run this with root privilege" 2>&1 48 | echo -e "Please do:\n" 2>&1 49 | echo "sudo ./${0##*/} $PARAN" 2>&1 50 | echo -e "\n" 2>&1 51 | 52 | exit 1 53 | else 54 | 55 | apt update 56 | 57 | # Install the basic compilation dependencies and other required libraries of this project 58 | if [ "$PARAN" == "install" ]; then 59 | install; 60 | else 61 | upgrade; 62 | fi 63 | 64 | # cleaning downloaded packages from apt-get cache 65 | apt clean 66 | 67 | exit 0 68 | fi 69 | 70 | 71 | } 72 | 73 | 74 | # Handle command argument 75 | case "$1" in 76 | install) install_or_upgrade;; 77 | upgrade) install_or_upgrade "upgrade";; 78 | list) list_packages;; 79 | help) usage_message;; 80 | *) wrong_command $1;; 81 | esac 82 | 83 | -------------------------------------------------------------------------------- /pelicanconf.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | # -*- coding: utf-8 -*- # 3 | 4 | from __future__ import unicode_literals 5 | 6 | import datetime 7 | import glob 8 | import json 9 | import os 10 | import sys 11 | 12 | sys.path.append(os.curdir) 13 | 14 | from collections import OrderedDict 15 | 16 | from baseconf import * 17 | 18 | # Configurações Base 19 | SITENAME = 'Python Brasil' 20 | AUTHOR = 'Python Brasil' 21 | THEME = 'themes/pybr' 22 | 23 | # Referências à Github 24 | GITHUB_REPO = 'https://github.com/pythonbrasil/wiki' 25 | GITHUB_BRANCH = 'pelican' 26 | 27 | # Referencia ao Google Groups 28 | GOOGLE_GROUPS_MAIL_LIST_NAME = 'python-brasil' 29 | 30 | # GOOGLE_ANALYTICS 31 | GOOGLE_ANALYTICS_CODE = None 32 | 33 | # https://www.google.com/webmasters/tools/ 34 | # https://support.google.com/webmasters/answer/35659?hl=pt&ref_topic=4564314 35 | GOOGLE_SITE_VERIFICATION_METATAG_CODE = None 36 | 37 | # Imagens 38 | ARTICLE_BANNERS_FOLDER = 'images/banners' 39 | 40 | # Home settings 41 | WELCOME_TITLE = 'Python Brasil' 42 | WELCOME_TEXT = ( 43 | 'A comunidade Python Brasil reune grupos de usuários em todo ' 44 | 'o Brasil interessados em difundir e divulgar a linguagem de programação.' 45 | ) 46 | FOOTER_ABOUT = ( 47 | 'Este site busca reunir todo o conteúdo produzido e traduzido pela ' 48 | 'comunidade brasileira bem como informações relevantes em relação a mesma.' 49 | ) 50 | 51 | # Statics 52 | STATIC_PATHS = [ 53 | 'images', 54 | 'extra/CNAME', 55 | 'extra/pages', 56 | ] 57 | EXTRA_PATH_METADATA = { 58 | 'extra/CNAME': {'path': 'CNAME'}, 59 | 'extra/pages/denuncia.html': {'path': 'denuncia/index.html'}, 60 | } 61 | 62 | PAGE_EXCLUDES = ARTICLE_EXCLUDES = [ 63 | 'extra/pages', 64 | ] 65 | 66 | # Tema do Syntax Hightlight 67 | PYGMENTS_STYLE = 'monokai' 68 | 69 | # Navbar Links da Home Page 70 | NAVBAR_HOME_LINKS = [ 71 | { 72 | "title": "Impressione-se", 73 | "href": "#", 74 | "desc": "Descubra como Python está presente em seu dia-a-dia.", 75 | "children": [ 76 | { 77 | "title": "Empresas", 78 | "href": "empresas", 79 | }, 80 | { 81 | "title": "Projetos Brasileiros", 82 | "href": "projetos", 83 | }, 84 | ], 85 | }, 86 | { 87 | "title": "Inicie-se", 88 | "href": "#", 89 | "desc": "Veja como é fácil começar a usar a linguagem.", 90 | "children": [ 91 | { 92 | "title": "Introdução", 93 | "href": "introducao", 94 | }, 95 | { 96 | "title": "Qual Python?", 97 | "href": "qual-python", 98 | }, 99 | { 100 | "title": "Download do python", 101 | "href": "https://www.python.org/downloads/", 102 | }, 103 | { 104 | "title": "Instalação Linux", 105 | "href": "instalacao-linux", 106 | }, 107 | { 108 | "title": "Instalação Mac", 109 | "href": "instalacao-mac", 110 | }, 111 | { 112 | "title": "Instalação Windows", 113 | "href": "instalacao-windows", 114 | }, 115 | { 116 | "title": "Ferramentas", 117 | "href": "ferramentas", 118 | }, 119 | ], 120 | }, 121 | { 122 | "title": "Aprenda mais", 123 | "href": "#", 124 | "desc": ( 125 | "Conheça mais sobre a linguagem e torne-se um " "verdadeiro pythonista." 126 | ), 127 | "children": [ 128 | { 129 | "title": "Web", 130 | "href": "web", 131 | }, 132 | { 133 | "title": "Mobile", 134 | "href": "mobile", 135 | }, 136 | { 137 | "title": "Games", 138 | "href": "games", 139 | }, 140 | { 141 | "title": "Científico", 142 | "href": "cientifico", 143 | }, 144 | { 145 | "title": "Wiki", 146 | "href": "wiki", 147 | }, 148 | ], 149 | }, 150 | { 151 | "title": "Participe", 152 | "href": "#", 153 | "desc": ( 154 | "Encontre e participe da comunidade e compartilhe " "suas dúvidas e idéias." 155 | ), 156 | "children": [ 157 | { 158 | "title": "Lista de Discussões", 159 | "href": "lista-de-discussoes", 160 | }, 161 | { 162 | "title": "Comunidades Locais", 163 | "href": "comunidades-locais", 164 | }, 165 | { 166 | "title": "Pyladies", 167 | "href": "pyladies", 168 | }, 169 | { 170 | "title": "Eventos", 171 | "href": "https://eventos.python.org.br", 172 | }, 173 | { 174 | "title": "Contribua", 175 | "href": "contribua", 176 | }, 177 | { 178 | "title": "Grupos de Discussão On-line", 179 | "href": "gruposonline", 180 | }, 181 | { 182 | "title": "Tradução", 183 | "href": "traducao", 184 | }, 185 | ], 186 | }, 187 | { 188 | "title": "APyB", 189 | "href": "https://apyb.python.org.br/", 190 | "desc": "Conheça a Associação Python Brasil.", 191 | }, 192 | { 193 | "title": "Código de Conduta", 194 | "href": "https://apyb.python.org.br/pythonbrasil/cdc/", 195 | "desc": "Código de Conduta da comunidade Python Brasil.", 196 | }, 197 | ] 198 | 199 | # Links sociais do rodapé 200 | SOCIAL_LINKS = ( 201 | { 202 | "href": "https://github.com/pythonbrasil", 203 | "icon": "fa-github", 204 | "text": "GitHub", 205 | }, 206 | { 207 | "href": "https://twitter.com/pythonbrasil", 208 | "icon": "fa-twitter", 209 | "text": "Twitter", 210 | }, 211 | { 212 | "href": "https://www.instagram.com/pythonbrasil/", 213 | "icon": "fa-instagram", 214 | "text": "Instagram", 215 | }, 216 | { 217 | "href": "https://www.facebook.com/groups/python.brasil", 218 | "icon": "fa-facebook-official", 219 | "text": "Facebook", 220 | }, 221 | { 222 | "href": "https://groups.google.com/forum/#!forum/python-brasil", 223 | "icon": "fa-users", 224 | "text": "Lista de Discussões", 225 | }, 226 | {"href": "https://t.me/pythonbrasil", "icon": "fa-paper-plane", "text": "Telegram"}, 227 | { 228 | "href": "https://planet.python.org.br/", 229 | "icon": "fa-globe", 230 | "text": "Planet Python", 231 | }, 232 | ) 233 | 234 | 235 | def date_hook(json_dict): 236 | for (key, value) in json_dict.items(): 237 | try: 238 | json_dict[key] = datetime.datetime.strptime( 239 | value, "%Y-%m-%d").date() 240 | except: 241 | pass 242 | return json_dict 243 | 244 | 245 | def ordena_por_regiao(empresas): 246 | por_regiao = {} 247 | for empresa in empresas: 248 | regiao = empresa['regiao'] 249 | estado = empresa['estado'] 250 | 251 | por_estado = por_regiao.get(regiao, {}) 252 | no_estado = por_estado.get(estado, []) 253 | 254 | no_estado.append(empresa) 255 | por_estado[estado] = no_estado 256 | por_regiao[regiao] = por_estado 257 | 258 | empresas_ordenadas = OrderedDict() 259 | for regiao in sorted(por_regiao): 260 | empresas_ordenadas[regiao] = OrderedDict() 261 | for estado in sorted(por_regiao[regiao]): 262 | no_estado = por_regiao[regiao][estado] 263 | no_estado.sort(key=lambda x: x['nome']) 264 | no_estado.sort(key=lambda x: x['cidade']) 265 | empresas_ordenadas[regiao][estado] = no_estado 266 | return empresas_ordenadas 267 | 268 | 269 | # Configurações da página de comunidades locais 270 | COMUNIDADES_LOCAIS = [ 271 | json.load(open(fname, 'r')) 272 | for fname in glob.glob('content/comunidades-locais/*.json') 273 | ] 274 | DEFAULT_COMMUNITY_IMAGE = "images/comunidades-locais/default.png" 275 | 276 | # Configurações da página de empresas 277 | # EMPRESAS = import_empresas('content/empresas/*.json') 278 | EMPRESAS = [ 279 | json.load(open(fname, 'r')) 280 | for fname in glob.glob('content/empresas/*.json') 281 | ] 282 | EMPRESAS = ordena_por_regiao(EMPRESAS) 283 | DEFAULT_EMPRESA_IMAGE = "images/empresas/default.png" 284 | 285 | # Configurações da página das pyladies 286 | PYLADIES = [ 287 | json.load(open(fname, 'r')) 288 | for fname in glob.glob('content/pyladies/*.json') 289 | ] 290 | DEFAULT_PYLADIES_IMAGE = "images/pyladies/default.png" 291 | -------------------------------------------------------------------------------- /publish-key.enc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pythonbrasil/wiki/16c347c0b8ae90af70412d493fccb687390ce55b/publish-key.enc -------------------------------------------------------------------------------- /publishconf.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | # -*- coding: utf-8 -*- # 3 | 4 | from __future__ import unicode_literals 5 | 6 | import os 7 | import sys 8 | 9 | sys.path.append(os.curdir) 10 | 11 | from pelicanconf import * 12 | 13 | SITEURL = 'https://python.org.br' 14 | RELATIVE_URLS = False 15 | 16 | FEED_ALL_ATOM = 'feeds.atom' 17 | FEED_ALL_RSS = 'feeds.rss' 18 | 19 | DELETE_OUTPUT_DIRECTORY = True 20 | 21 | # Following items are often useful when publishing 22 | 23 | GOOGLE_ANALYTICS_CODE = 'UA-62093919-3' 24 | -------------------------------------------------------------------------------- /pyladies_generator.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | # -*- coding: utf-8 -*- # 3 | 4 | import json 5 | import os 6 | 7 | try: 8 | # python 2 9 | from urllib2 import urlopen 10 | except ImportError: 11 | # python 3 12 | from urllib.request import urlopen 13 | 14 | import yaml 15 | from slugify import slugify 16 | 17 | 18 | # Diretório onde serão gerados os arquivos JSON 19 | PAGE_PATH = 'content/pyladies/' 20 | 21 | # Site oficial da Pyladies 22 | PYLADIES_SITE = 'http://brasil.pyladies.com' 23 | 24 | # Arquivo YML que será consumido para gerar os arquivos JSON 25 | PYLADIES_YAML = 'https://raw.githubusercontent.com/pyladies-brazil/br-pyladies-pelican/master/data/locations.yml' 26 | 27 | 28 | def scrapping_pyladies(): 29 | """ 30 | Chamado para analisar o YML e retornar uma lista de dicionários 31 | com os dados das sedes da Pyladies. 32 | """ 33 | html = urlopen(PYLADIES_YAML).read() 34 | return yaml.safe_load(html) 35 | 36 | 37 | def get_filename(directory, locale): 38 | """ 39 | Chamado para retornar o nome do JSON de cada Pyladies com base 40 | na sua cidade sede. 41 | """ 42 | return '%spyladies-%s.json' % (directory, slugify(locale)) 43 | 44 | 45 | def list_pyladies(): 46 | """ 47 | Gera os arquivos JSON no diretório setado em PAGE_PATH. 48 | """ 49 | 50 | if not os.path.exists(PAGE_PATH): 51 | os.makedirs(PAGE_PATH) 52 | 53 | for item in scrapping_pyladies(): 54 | data = dict() 55 | 56 | data['nome'] = 'Pyladies %s' % item['city'] 57 | data['links'] = list() 58 | 59 | if item.get('image'): 60 | data['imagem'] = '%s%s' % (PYLADIES_SITE, item['image']) 61 | 62 | if item.get('github'): 63 | data['links'].append(['Github', item['github']]) 64 | 65 | if item.get('facebook'): 66 | data['links'].append(['Facebook', item['facebook']]) 67 | 68 | if item.get('twitter'): 69 | data['links'].append(['Twitter', item['twitter']]) 70 | 71 | if item.get('url'): 72 | data['links'].append(['Site', item['url']]) 73 | 74 | if item.get('email'): 75 | data['links'].append(['Email', 'mailto:%s' % item['email']]) 76 | 77 | if item.get('quitter'): 78 | data['links'].append(['Quitter', item['quitter']]) 79 | 80 | if item.get('telegram'): 81 | data['links'].append(['Telegram', item['telegram']]) 82 | 83 | filename = get_filename(PAGE_PATH, item['city'].lower()) 84 | 85 | with open(filename, 'w') as f: 86 | json.dump(data, f) 87 | 88 | 89 | if __name__ == '__main__': 90 | list_pyladies() 91 | -------------------------------------------------------------------------------- /requirements.apt: -------------------------------------------------------------------------------- 1 | # listar as dependencias nao python aqui (Ubuntu 14.04 de preferencia) 2 | python3-dev 3 | python-is-python3 4 | python3-pip 5 | python3-venv 6 | build-essential 7 | 8 | # lxml dependencies 9 | libxslt1-dev 10 | libxml2-dev 11 | 12 | ## Pillow dependencies 13 | zlib1g-dev 14 | libtiff-dev 15 | libjpeg8-dev 16 | libfreetype6-dev 17 | #liblcms1-dev 18 | libwebp-dev 19 | 20 | #cryptography dependecies 21 | libssl-dev 22 | libffi-dev 23 | -------------------------------------------------------------------------------- /requirements.txt: -------------------------------------------------------------------------------- 1 | argparse 2 | beautifulsoup4 3 | blinker 4 | docutils 5 | ecdsa 6 | feedgenerator 7 | jinja2 8 | lxml 9 | markdown==3.3.6 10 | markupsafe 11 | mdx-video 12 | paramiko 13 | pelican==4.7.1 14 | pelican-alias==1.1 15 | pillow 16 | pycryptodome 17 | pygments 18 | python-dateutil 19 | pytz 20 | six 21 | smartypants 22 | typogrify 23 | unidecode 24 | ghp-import 25 | pyyaml 26 | python-slugify 27 | -------------------------------------------------------------------------------- /themes/pybr/gulpfile.js: -------------------------------------------------------------------------------- 1 | var gulp = require('gulp'), 2 | sass = require('gulp-sass'), 3 | prefix = require('gulp-autoprefixer'), 4 | notify = require('gulp-notify'), 5 | cleanCSS = require('gulp-clean-css'), 6 | minifyJS = require('gulp-minify'), 7 | rename = require('gulp-rename'), 8 | sync = require('browser-sync'); 9 | 10 | gulp.task('scss', gulp.series(function (done) { 11 | gulp.src('./static/scss/pybr.scss') 12 | .pipe(sass({ errLogToConsole: true })) 13 | .pipe(prefix()) 14 | .pipe(cleanCSS({level: 2, inline: ['all']})) 15 | .pipe(rename({extname: '.min.css'})) 16 | .pipe(gulp.dest('./static/css')) 17 | .pipe(notify("styles compiled")) 18 | .pipe(sync.reload({ stream: true })); 19 | done(); 20 | })); 21 | 22 | gulp.task('js', gulp.series(function (done) { 23 | gulp.src(['./node_modules/jquery/dist/jquery.min.js', 24 | './node_modules/tether/dist/js/tether.min.js', 25 | './node_modules/bootstrap/dist/js/bootstrap.min.js']) 26 | .pipe(gulp.dest('./static/js')) 27 | .pipe(notify("javascript updated")); 28 | done(); 29 | })); 30 | 31 | gulp.task('fonts', gulp.series(function (done) { 32 | gulp.src('./node_modules/font-awesome/fonts/*') 33 | .pipe(gulp.dest('./static/fonts')) 34 | .pipe(notify("fonts updated")); 35 | done(); 36 | })); 37 | 38 | gulp.task('sync', gulp.series(function(done) { 39 | sync.init({ 40 | proxy: 'localhost:8000' 41 | }); 42 | gulp.watch('./static/scss/**/*.scss', gulp.series(['scss'])); 43 | gulp.watch('./static/js/**/*.js', gulp.series(sync.reload)); 44 | done(); 45 | })); 46 | 47 | gulp.task('build', gulp.series(['scss', 'js', 'fonts'])); 48 | gulp.task('default', gulp.series(['build', 'sync'])); 49 | -------------------------------------------------------------------------------- /themes/pybr/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "pybr", 3 | "version": "1.0.0", 4 | "description": "Python.org.br Pelican Theme", 5 | "main": "gulpfile.js", 6 | "scripts": { 7 | "gulp": "gulp", 8 | "test": "echo \"Error: no test specified\" && exit 1" 9 | }, 10 | "author": "", 11 | "license": "MIT", 12 | "devDependencies": { 13 | "bootstrap": "4.3.1", 14 | "browser-sync": "^2.18.12", 15 | "ecstatic": "^2.1.0", 16 | "font-awesome": "^4.7.0", 17 | "gulp": "^4.0.0", 18 | "gulp-autoprefixer": "^4.0.0", 19 | "gulp-clean-css": "^3.3.1", 20 | "gulp-cli": "^2.0.0", 21 | "gulp-minify": "^1.0.0", 22 | "gulp-notify": "^3.0.0", 23 | "gulp-rename": "^1.2.2", 24 | "gulp-sass": "^3.1.0", 25 | "jquery": "^3.3.1", 26 | "popper.js": "^1.14.3", 27 | "tether": "^1.3.3" 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /themes/pybr/static/css/pygment.css: -------------------------------------------------------------------------------- 1 | pre .hll { background-color: #49483e } 2 | pre { background: #272822; color: #f8f8f2 } 3 | pre .c { color: #75715e } /* Comment */ 4 | pre .err { color: #960050; background-color: #1e0010 } /* Error */ 5 | pre .k { color: #66d9ef } /* Keyword */ 6 | pre .l { color: #ae81ff } /* Literal */ 7 | pre .n { color: #f8f8f2 } /* Name */ 8 | pre .o { color: #f92672 } /* Operator */ 9 | pre .p { color: #f8f8f2 } /* Punctuation */ 10 | pre .ch { color: #75715e } /* Comment.Hashbang */ 11 | pre .cm { color: #75715e } /* Comment.Multiline */ 12 | pre .cp { color: #75715e } /* Comment.Preproc */ 13 | pre .cpf { color: #75715e } /* Comment.PreprocFile */ 14 | pre .c1 { color: #75715e } /* Comment.Single */ 15 | pre .cs { color: #75715e } /* Comment.Special */ 16 | pre .gd { color: #f92672 } /* Generic.Deleted */ 17 | pre .ge { font-style: italic } /* Generic.Emph */ 18 | pre .gi { color: #a6e22e } /* Generic.Inserted */ 19 | pre .gs { font-weight: bold } /* Generic.Strong */ 20 | pre .gu { color: #75715e } /* Generic.Subheading */ 21 | pre .kc { color: #66d9ef } /* Keyword.Constant */ 22 | pre .kd { color: #66d9ef } /* Keyword.Declaration */ 23 | pre .kn { color: #f92672 } /* Keyword.Namespace */ 24 | pre .kp { color: #66d9ef } /* Keyword.Pseudo */ 25 | pre .kr { color: #66d9ef } /* Keyword.Reserved */ 26 | pre .kt { color: #66d9ef } /* Keyword.Type */ 27 | pre .ld { color: #e6db74 } /* Literal.Date */ 28 | pre .m { color: #ae81ff } /* Literal.Number */ 29 | pre .s { color: #e6db74 } /* Literal.String */ 30 | pre .na { color: #a6e22e } /* Name.Attribute */ 31 | pre .nb { color: #f8f8f2 } /* Name.Builtin */ 32 | pre .nc { color: #a6e22e } /* Name.Class */ 33 | pre .no { color: #66d9ef } /* Name.Constant */ 34 | pre .nd { color: #a6e22e } /* Name.Decorator */ 35 | pre .ni { color: #f8f8f2 } /* Name.Entity */ 36 | pre .ne { color: #a6e22e } /* Name.Exception */ 37 | pre .nf { color: #a6e22e } /* Name.Function */ 38 | pre .nl { color: #f8f8f2 } /* Name.Label */ 39 | pre .nn { color: #f8f8f2 } /* Name.Namespace */ 40 | pre .nx { color: #a6e22e } /* Name.Other */ 41 | pre .py { color: #f8f8f2 } /* Name.Property */ 42 | pre .nt { color: #f92672 } /* Name.Tag */ 43 | pre .nv { color: #f8f8f2 } /* Name.Variable */ 44 | pre .ow { color: #f92672 } /* Operator.Word */ 45 | pre .w { color: #f8f8f2 } /* Text.Whitespace */ 46 | pre .mb { color: #ae81ff } /* Literal.Number.Bin */ 47 | pre .mf { color: #ae81ff } /* Literal.Number.Float */ 48 | pre .mh { color: #ae81ff } /* Literal.Number.Hex */ 49 | pre .mi { color: #ae81ff } /* Literal.Number.Integer */ 50 | pre .mo { color: #ae81ff } /* Literal.Number.Oct */ 51 | pre .sa { color: #e6db74 } /* Literal.String.Affix */ 52 | pre .sb { color: #e6db74 } /* Literal.String.Backtick */ 53 | pre .sc { color: #e6db74 } /* Literal.String.Char */ 54 | pre .dl { color: #e6db74 } /* Literal.String.Delimiter */ 55 | pre .sd { color: #e6db74 } /* Literal.String.Doc */ 56 | pre .s2 { color: #e6db74 } /* Literal.String.Double */ 57 | pre .se { color: #ae81ff } /* Literal.String.Escape */ 58 | pre .sh { color: #e6db74 } /* Literal.String.Heredoc */ 59 | pre .si { color: #e6db74 } /* Literal.String.Interpol */ 60 | pre .sx { color: #e6db74 } /* Literal.String.Other */ 61 | pre .sr { color: #e6db74 } /* Literal.String.Regex */ 62 | pre .s1 { color: #e6db74 } /* Literal.String.Single */ 63 | pre .ss { color: #e6db74 } /* Literal.String.Symbol */ 64 | pre .bp { color: #f8f8f2 } /* Name.Builtin.Pseudo */ 65 | pre .fm { color: #a6e22e } /* Name.Function.Magic */ 66 | pre .vc { color: #f8f8f2 } /* Name.Variable.Class */ 67 | pre .vg { color: #f8f8f2 } /* Name.Variable.Global */ 68 | pre .vi { color: #f8f8f2 } /* Name.Variable.Instance */ 69 | pre .vm { color: #f8f8f2 } /* Name.Variable.Magic */ 70 | pre .il { color: #ae81ff } /* Literal.Number.Integer.Long */ 71 | code .hll { background-color: #49483e } 72 | code { background: #272822; color: #f8f8f2 } 73 | code .c { color: #75715e } /* Comment */ 74 | code .err { color: #960050; background-color: #1e0010 } /* Error */ 75 | code .k { color: #66d9ef } /* Keyword */ 76 | code .l { color: #ae81ff } /* Literal */ 77 | code .n { color: #f8f8f2 } /* Name */ 78 | code .o { color: #f92672 } /* Operator */ 79 | code .p { color: #f8f8f2 } /* Punctuation */ 80 | code .ch { color: #75715e } /* Comment.Hashbang */ 81 | code .cm { color: #75715e } /* Comment.Multiline */ 82 | code .cp { color: #75715e } /* Comment.Preproc */ 83 | code .cpf { color: #75715e } /* Comment.PreprocFile */ 84 | code .c1 { color: #75715e } /* Comment.Single */ 85 | code .cs { color: #75715e } /* Comment.Special */ 86 | code .gd { color: #f92672 } /* Generic.Deleted */ 87 | code .ge { font-style: italic } /* Generic.Emph */ 88 | code .gi { color: #a6e22e } /* Generic.Inserted */ 89 | code .gs { font-weight: bold } /* Generic.Strong */ 90 | code .gu { color: #75715e } /* Generic.Subheading */ 91 | code .kc { color: #66d9ef } /* Keyword.Constant */ 92 | code .kd { color: #66d9ef } /* Keyword.Declaration */ 93 | code .kn { color: #f92672 } /* Keyword.Namespace */ 94 | code .kp { color: #66d9ef } /* Keyword.Pseudo */ 95 | code .kr { color: #66d9ef } /* Keyword.Reserved */ 96 | code .kt { color: #66d9ef } /* Keyword.Type */ 97 | code .ld { color: #e6db74 } /* Literal.Date */ 98 | code .m { color: #ae81ff } /* Literal.Number */ 99 | code .s { color: #e6db74 } /* Literal.String */ 100 | code .na { color: #a6e22e } /* Name.Attribute */ 101 | code .nb { color: #f8f8f2 } /* Name.Builtin */ 102 | code .nc { color: #a6e22e } /* Name.Class */ 103 | code .no { color: #66d9ef } /* Name.Constant */ 104 | code .nd { color: #a6e22e } /* Name.Decorator */ 105 | code .ni { color: #f8f8f2 } /* Name.Entity */ 106 | code .ne { color: #a6e22e } /* Name.Exception */ 107 | code .nf { color: #a6e22e } /* Name.Function */ 108 | code .nl { color: #f8f8f2 } /* Name.Label */ 109 | code .nn { color: #f8f8f2 } /* Name.Namespace */ 110 | code .nx { color: #a6e22e } /* Name.Other */ 111 | code .py { color: #f8f8f2 } /* Name.Property */ 112 | code .nt { color: #f92672 } /* Name.Tag */ 113 | code .nv { color: #f8f8f2 } /* Name.Variable */ 114 | code .ow { color: #f92672 } /* Operator.Word */ 115 | code .w { color: #f8f8f2 } /* Text.Whitespace */ 116 | code .mb { color: #ae81ff } /* Literal.Number.Bin */ 117 | code .mf { color: #ae81ff } /* Literal.Number.Float */ 118 | code .mh { color: #ae81ff } /* Literal.Number.Hex */ 119 | code .mi { color: #ae81ff } /* Literal.Number.Integer */ 120 | code .mo { color: #ae81ff } /* Literal.Number.Oct */ 121 | code .sa { color: #e6db74 } /* Literal.String.Affix */ 122 | code .sb { color: #e6db74 } /* Literal.String.Backtick */ 123 | code .sc { color: #e6db74 } /* Literal.String.Char */ 124 | code .dl { color: #e6db74 } /* Literal.String.Delimiter */ 125 | code .sd { color: #e6db74 } /* Literal.String.Doc */ 126 | code .s2 { color: #e6db74 } /* Literal.String.Double */ 127 | code .se { color: #ae81ff } /* Literal.String.Escape */ 128 | code .sh { color: #e6db74 } /* Literal.String.Heredoc */ 129 | code .si { color: #e6db74 } /* Literal.String.Interpol */ 130 | code .sx { color: #e6db74 } /* Literal.String.Other */ 131 | code .sr { color: #e6db74 } /* Literal.String.Regex */ 132 | code .s1 { color: #e6db74 } /* Literal.String.Single */ 133 | code .ss { color: #e6db74 } /* Literal.String.Symbol */ 134 | code .bp { color: #f8f8f2 } /* Name.Builtin.Pseudo */ 135 | code .fm { color: #a6e22e } /* Name.Function.Magic */ 136 | code .vc { color: #f8f8f2 } /* Name.Variable.Class */ 137 | code .vg { color: #f8f8f2 } /* Name.Variable.Global */ 138 | code .vi { color: #f8f8f2 } /* Name.Variable.Instance */ 139 | code .vm { color: #f8f8f2 } /* Name.Variable.Magic */ 140 | code .il { color: #ae81ff } /* Literal.Number.Integer.Long */ 141 | -------------------------------------------------------------------------------- /themes/pybr/static/fonts/FontAwesome.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pythonbrasil/wiki/16c347c0b8ae90af70412d493fccb687390ce55b/themes/pybr/static/fonts/FontAwesome.otf -------------------------------------------------------------------------------- /themes/pybr/static/fonts/fontawesome-webfont.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pythonbrasil/wiki/16c347c0b8ae90af70412d493fccb687390ce55b/themes/pybr/static/fonts/fontawesome-webfont.eot -------------------------------------------------------------------------------- /themes/pybr/static/fonts/fontawesome-webfont.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pythonbrasil/wiki/16c347c0b8ae90af70412d493fccb687390ce55b/themes/pybr/static/fonts/fontawesome-webfont.ttf -------------------------------------------------------------------------------- /themes/pybr/static/fonts/fontawesome-webfont.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pythonbrasil/wiki/16c347c0b8ae90af70412d493fccb687390ce55b/themes/pybr/static/fonts/fontawesome-webfont.woff -------------------------------------------------------------------------------- /themes/pybr/static/fonts/fontawesome-webfont.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pythonbrasil/wiki/16c347c0b8ae90af70412d493fccb687390ce55b/themes/pybr/static/fonts/fontawesome-webfont.woff2 -------------------------------------------------------------------------------- /themes/pybr/static/img/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pythonbrasil/wiki/16c347c0b8ae90af70412d493fccb687390ce55b/themes/pybr/static/img/favicon.ico -------------------------------------------------------------------------------- /themes/pybr/static/img/ponteiro_mapa.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pythonbrasil/wiki/16c347c0b8ae90af70412d493fccb687390ce55b/themes/pybr/static/img/ponteiro_mapa.png -------------------------------------------------------------------------------- /themes/pybr/static/img/site-logo.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 21 | 23 | 30 | 33 | 37 | 41 | 42 | 45 | 49 | 53 | 54 | 63 | 72 | 81 | 90 | 100 | 110 | 120 | 122 | 126 | 130 | 131 | 141 | 143 | 147 | 151 | 152 | 154 | 158 | 162 | 163 | 164 | 184 | 186 | 187 | 189 | image/svg+xml 190 | 192 | 193 | 194 | 195 | 196 | 201 | 204 | 207 | 212 | 216 | 219 | 224 | 229 | 235 | 240 | 245 | 250 | 251 | 256 | 257 | 258 | 261 | 263 | 271 | 276 | 277 | 279 | 287 | 292 | 293 | 294 | 295 | 296 | 297 | -------------------------------------------------------------------------------- /themes/pybr/static/scss/_base.scss: -------------------------------------------------------------------------------- 1 | a{ 2 | color:#2b5b84; 3 | } 4 | 5 | .master-wrapper { 6 | margin-top: 51px; 7 | 8 | @include media-breakpoint-down(md) { 9 | margin-top: 48px; 10 | } 11 | 12 | &.yellow-top-border { 13 | border-top: 4px solid $yellow; 14 | } 15 | 16 | &.blue-top-border { 17 | border-top: 4px solid $blue; 18 | } 19 | 20 | header { 21 | color: $white; 22 | padding: 50px 0 60px 0; 23 | text-align: center; 24 | 25 | /* gradient */ 26 | background-color: #2b5b84; 27 | background-image: linear-gradient(#1e415e 10%,#2b5b84 90%); 28 | box-shadow: inset 0 0 50px rgba(0,0,0,0.03),inset 0 0 20px rgba(0,0,0,0.03); 29 | 30 | .header-logo { 31 | width: 300px; 32 | margin-bottom: 30px; 33 | } 34 | 35 | .header-subtitle { 36 | font-size: 25px; 37 | color: $yellow; 38 | } 39 | } 40 | 41 | main { 42 | .page-content { 43 | margin: 40px 0; 44 | 45 | h1, h2, h3, h4, h5, h6 { 46 | margin-top: 1.5rem; 47 | margin-bottom: 1rem; 48 | } 49 | 50 | a { 51 | font-weight: bold; 52 | } 53 | 54 | ul, ol { 55 | 56 | li { 57 | margin-bottom: 10px; 58 | } 59 | } 60 | 61 | .table-wrapper { 62 | width: 100%; 63 | 64 | @include media-breakpoint-down(md) { 65 | overflow-x: scroll; 66 | } 67 | } 68 | 69 | img { 70 | max-width: 100%; 71 | } 72 | } 73 | } 74 | 75 | footer { 76 | padding: 60px 0 20px 0; 77 | background-color: $gray-900; 78 | color: $white; 79 | text-align: justify; 80 | 81 | ul { 82 | padding: 0; 83 | 84 | li { 85 | list-style: none; 86 | margin-bottom: 5px; 87 | 88 | a { 89 | color: $white; 90 | 91 | &:hover, &:active { 92 | color: $white; 93 | text-decoration: none; 94 | font-weight: bold; 95 | } 96 | } 97 | } 98 | } 99 | } 100 | } 101 | -------------------------------------------------------------------------------- /themes/pybr/static/scss/_components.scss: -------------------------------------------------------------------------------- 1 | pre, code { 2 | border-radius: 4px; 3 | color: #f8f8f2; 4 | line-height: 1.5em; 5 | margin: 0 0 1rem 0; 6 | padding: 8px 12px 6px 12px; 7 | } 8 | 9 | .thumbnail-container { 10 | margin: 50px 0; 11 | 12 | .thumbnail { 13 | border: solid 1px $gray-500; 14 | min-height: 415px; 15 | margin-bottom: 30px; 16 | 17 | &:hover { 18 | border: solid 1px $gray-700; 19 | } 20 | 21 | img { 22 | width: 100%; 23 | padding: 20px; 24 | max-height: 310px; 25 | } 26 | 27 | .caption { 28 | text-align: center; 29 | padding-bottom: 10px; 30 | 31 | h3 { 32 | padding-bottom: 15px; 33 | } 34 | 35 | .badge-group { 36 | padding: 0 5px; 37 | } 38 | } 39 | } 40 | } 41 | 42 | 43 | .event { 44 | margin: 20px 0; 45 | text-align: center; 46 | height: 200px; 47 | 48 | .event-date { 49 | padding: 40px 0; 50 | height: 100%; 51 | color: #ffffff; 52 | font-weight: bold; 53 | -webkit-border-top-left-radius: 5px; 54 | -webkit-border-bottom-left-radius: 5px; 55 | -moz-border-radius-topleft: 5px; 56 | -moz-border-radius-bottomleft: 5px; 57 | border-top-left-radius: 5px; 58 | border-bottom-left-radius: 5px; 59 | } 60 | 61 | .event-description{ 62 | height: 100%; 63 | padding: 40px 0; 64 | background-color: #666666; 65 | color: #ffffff; 66 | } 67 | 68 | .event-map { 69 | height: 100%; 70 | padding: 0; 71 | } 72 | 73 | .map { 74 | background-color: #dddddd; 75 | width: 100%; 76 | height: 100%; 77 | pointer-events: none; /* diseable zoon and scroll to map */ 78 | -webkit-border-top-right-radius: 5px; 79 | -webkit-border-bottom-right-radius: 5px; 80 | -moz-border-radius-topright: 5px; 81 | -moz-border-radius-bottomright: 5px; 82 | border-top-right-radius: 5px; 83 | border-bottom-right-radius: 5px; 84 | } 85 | 86 | .event-description h1, 87 | .event-description h2, 88 | .event-description a { 89 | color: #ffffff; 90 | } 91 | 92 | .event-description h1{ 93 | margin: 0; 94 | font-size: 30px; 95 | line-height: 50px; 96 | } 97 | 98 | .event-description h2 { 99 | margin: 0; 100 | font-size: 18px; 101 | line-height: 30px; 102 | } 103 | 104 | .event-description p { 105 | margin: 0; 106 | font-size: 22px; 107 | line-height: 40px; 108 | } 109 | 110 | @include media-breakpoint-down(md) { 111 | .event-description h1{ 112 | font-size: 18px; 113 | } 114 | 115 | .event-description h2 { 116 | font-size: 14px; 117 | } 118 | 119 | .event-description p { 120 | font-size: 16px; 121 | } 122 | } 123 | 124 | .event-description a { 125 | text-decoration: none; 126 | } 127 | 128 | .event-description a:hover { 129 | font-weight: bold; 130 | } 131 | 132 | .date-blue { 133 | background-color: #5088b7; 134 | } 135 | 136 | .date-yellow { 137 | background-color: #ffd545; 138 | } 139 | 140 | .event-day { 141 | margin: 0; 142 | font-size: 60px; 143 | line-height: 62px; 144 | } 145 | 146 | .event-month { 147 | margin: 0; 148 | font-size: 26px; 149 | line-height: 28px; 150 | } 151 | 152 | .event-year { 153 | margin: 0; 154 | font-size: 24px; 155 | line-height: 26px; 156 | } 157 | } 158 | 159 | .past-event { 160 | -webkit-filter: grayscale(1); 161 | -moz-filter: grayscale(1); 162 | -o-filter: grayscale(1); 163 | -ms-filter: grayscale(1); 164 | filter: grayscale(1); 165 | } 166 | -------------------------------------------------------------------------------- /themes/pybr/static/scss/_home.scss: -------------------------------------------------------------------------------- 1 | .home-background { 2 | background-color: $gray-300; 3 | 4 | .page-description-link { 5 | &:hover { 6 | text-decoration: none; 7 | } 8 | 9 | .page-description { 10 | display: inline-block; 11 | width: 19.7%; 12 | height: 230px; 13 | padding: 70px 20px; 14 | vertical-align: top; 15 | 16 | &:hover { 17 | background-color: $gray-500; 18 | } 19 | 20 | .page-description-title { 21 | font-size: 22px; 22 | } 23 | 24 | .page-description-text { 25 | font-size: 13px; 26 | } 27 | } 28 | 29 | @include media-breakpoint-down(md) { 30 | .page-description { 31 | display: block; 32 | width: inherit; 33 | height: inherit; 34 | } 35 | } 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /themes/pybr/static/scss/_variables.scss: -------------------------------------------------------------------------------- 1 | /* fonts */ 2 | 3 | $fa-font-path: "../fonts"; 4 | 5 | $font-size-base: 1rem; 6 | $spacer: 1rem; 7 | 8 | $h1-font-size: $font-size-base * 2.5; 9 | $h2-font-size: $font-size-base * 2; 10 | $h3-font-size: $font-size-base * 1.4; 11 | $h4-font-size: $font-size-base * 1.2; 12 | $h5-font-size: $font-size-base * 1.1; 13 | $h6-font-size: $font-size-base; 14 | 15 | $headings-font-weight: 700; 16 | 17 | /* colors */ 18 | 19 | $primary: #212529; 20 | $link-color: #495057; 21 | -------------------------------------------------------------------------------- /themes/pybr/static/scss/pybr.scss: -------------------------------------------------------------------------------- 1 | @import 'variables'; 2 | 3 | // bootstrap styles 4 | @import '../../node_modules/bootstrap/scss/bootstrap'; 5 | 6 | // font awesome styles 7 | @import '../../node_modules/font-awesome/scss/font-awesome'; 8 | 9 | // pybr styles 10 | @import 'base'; 11 | @import 'home'; 12 | @import 'components'; 13 | -------------------------------------------------------------------------------- /themes/pybr/templates/base.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | {% block title %}{{ SITENAME }}{% endblock %} 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | {% block aditional_styles %} 17 | {% endblock %} 18 | 19 | {% include 'google_tools.html' %} 20 | 21 | 22 | 23 | {% if page is defined %} 24 | {% set href = page.slug %} 25 | {% elif page_name is defined %} 26 | {% set href = page_name.replace("/index", "") %} 27 | {% else %} 28 | {% set href = None %} 29 | {% endif %} 30 | 31 |
32 | 68 | 69 | {% block header %} 70 |
71 | 72 | Fork me on GitHub 73 | 74 |
75 |
76 | 88 |
89 |
90 |
91 | {% endblock %} 92 | 93 |
94 | {% block content %} 95 | {% endblock %} 96 |
97 | 98 |
99 |
100 |
101 |
102 |

Sobre

103 |

{{ FOOTER_ABOUT }}

104 |
105 | 106 |
107 |

Social

108 | 109 | 114 |
115 |
116 |
117 | 118 | 119 | 120 | 121 | 122 | {% block aditional_scripts %} 123 | {% endblock %} 124 |
125 | 126 | 127 | -------------------------------------------------------------------------------- /themes/pybr/templates/comunidade-google-group.html: -------------------------------------------------------------------------------- 1 | {% extends 'page.html' %} 2 | 3 | {% block aditional_styles %} 4 | {{ super() }} 5 | 6 | 7 | 12 | {% endblock %} 13 | 14 | {% block post_content %} 15 |
16 |
17 |
18 | 19 |
20 | 21 |
22 | 23 |
24 |

25 |

26 | Carregando Lista de email no Google Groups, aguarde... 27 |

28 |

29 |
30 |
31 |
32 | {% endblock %} 33 | 34 | {% block aditional_scripts %} 35 | {{ super() }} 36 | 37 | 38 | 39 | 61 | {% endblock %} 62 | -------------------------------------------------------------------------------- /themes/pybr/templates/comunidades-locais.html: -------------------------------------------------------------------------------- 1 | {% extends 'page.html' %} 2 | 3 | {% block post_content %} 4 |
5 | {% for comunidade in COMUNIDADES_LOCAIS %} 6 |
7 |
8 | {{ comunidade.sigla }} 9 | 10 |
11 |

{{ comunidade.sigla }}

12 | 13 |

{{ comunidade.nome }}

14 | 15 |
16 | {% for link in comunidade.links %} 17 | 18 | {{ link.0 }} 19 | 20 | {% endfor %} 21 |
22 |
23 |
24 |
25 | {% endfor %} 26 |
27 | {% endblock %} 28 | -------------------------------------------------------------------------------- /themes/pybr/templates/empresas.html: -------------------------------------------------------------------------------- 1 | {% extends 'page.html' %} 2 | 3 | {% block page_title %}{% endblock %} 4 | 5 | {% block post_content %} 6 |
7 |
8 | 9 | {% for regiao in EMPRESAS %} 10 |

{{ regiao }}

11 |
12 | 13 | {% for estado in EMPRESAS[regiao] %} 14 |

{{ estado }}

15 |
16 | 17 | {% for empresa in EMPRESAS[regiao][estado] %} 18 |
19 |
20 | 21 | {{ empresa.nome }} 22 | 23 | 24 |
25 |

26 | {{ empresa.nome }} 27 | 28 | 29 | 30 | 31 | 32 | 33 |

34 | 35 | {% if empresa.contatos %} 36 | {% for contato in empresa.contatos %} 37 |

38 | {{ contato.texto }} 39 |

40 | {% endfor %} 41 | {% endif %} 42 |
43 |
44 |
45 | {% endfor %} 46 |
47 | {% endfor %} 48 | {% endfor %} 49 |
50 |
51 | {% endblock %} 52 | -------------------------------------------------------------------------------- /themes/pybr/templates/google_tools.html: -------------------------------------------------------------------------------- 1 | {% if GOOGLE_ANALYTICS_CODE %} 2 | 15 | {% endif %} 16 | {% if GOOGLE_SITE_VERIFICATION_METATAG_CODE %} 17 | 18 | {% endif %} 19 | -------------------------------------------------------------------------------- /themes/pybr/templates/home.html: -------------------------------------------------------------------------------- 1 | {% extends 'base.html' %} 2 | 3 | {% block content %} 4 |
5 |
6 |
7 |
8 | {% for item in NAVBAR_HOME_LINKS %} 9 | {% if item.children is defined and item.children|length %} 10 | 11 |
12 |

{{ item.title }}

13 | 14 |
15 | {{ item.desc }} 16 |
17 |
18 |
19 | {% elif item.desc is defined %} 20 | 21 |
22 |

{{ item.title }}

23 | 24 |
25 | {{ item.desc }} 26 |
27 |
28 |
29 | {% endif %} 30 | {% endfor %} 31 |
32 |
33 |
34 |
35 | 36 | 37 |
38 |

Grupos de Usuários Python no Brasil (GUPy)

39 |
40 | 41 | {% for comunidade in COMUNIDADES_LOCAIS %} 42 |
43 | 44 | 45 |
46 |

{{ comunidade.sigla }}

47 |
{{ comunidade.nome }}
48 |
49 | {% if comunidade.imagem %} 50 | 51 | {{ comunidade.sigla }} 52 | 53 | {% endif %} 54 | 55 | 56 |
57 | {% for link in comunidade.links %} 58 | {{ link.0 }} 59 | {% endfor %} 60 | 61 |
62 | 63 |
64 | {% endfor %} 65 |
66 |
67 | 68 | {% endblock %} 69 | -------------------------------------------------------------------------------- /themes/pybr/templates/page.html: -------------------------------------------------------------------------------- 1 | {% extends 'base.html' %} 2 | 3 | {% block title %}{{ super() }}-{{ page.title }}{% endblock %} 4 | 5 | {% block header %}{% endblock %} 6 | 7 | {% block content %} 8 |
9 | {% block pre_content %}{% endblock %} 10 | 11 |
12 |
13 | {% block page_title %} 14 |

{{ page.title }}

15 | {% endblock %} 16 | 17 | {% block page_content %} 18 | {{ page.content }} 19 | {% endblock %} 20 |
21 |
22 | 23 | {% block post_content %}{% endblock %} 24 |
25 | {% endblock %} 26 | -------------------------------------------------------------------------------- /themes/pybr/templates/pyladies.html: -------------------------------------------------------------------------------- 1 | {% extends 'page.html' %} 2 | 3 | {% block post_content %} 4 |
5 | {% for comunidade in PYLADIES %} 6 |
7 |
8 | {{ comunidade.sigla }} 9 | 10 |
11 |

{{ comunidade.nome }}

12 | 13 |
14 | {% for link in comunidade.links %} 15 | {{ link.0 }} 16 | {% endfor %} 17 |
18 |
19 |
20 |
21 | {% endfor %} 22 |
23 | {% endblock %} 24 | -------------------------------------------------------------------------------- /themes/pybr/templates/redirect.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | --------------------------------------------------------------------------------