Posts

Showing posts with the label python

GitLab - Spawn a job with any command you want

The problem : you have many scripts (let's say that they are written in python and you just want to run them typing  python your-script.py ) and sometimes you want to run some of them, sometimes only one, etc. There is no pattern. Additionally you want to trigger these scripts via GitLab API. How can you do this? The first idea: let's create a job for each of them! But... then what? You want to run only a small subset of them and each time this subset might be different ☹️. You might add variables, check them and run only these jobs when IF evaluates to true, like: But, I think that you see the problem of this approach. What about creating a common job without any command? It will be your job to provide a command for script section (for example python run-something-and-upload-to-s3.py ). This way we will have only one job in GitLab and during triggering you must provide a command. The code: 8 lines. Woah! We used rules keyword, because we want to spawn only this job w...

Bug in (datetime|time).strptime - AttributeError: _strptime

 Issue 7980 This bug occurs only when you use threads and only once. Of course, this method is thread safe, but there is a severe warning. The first use of strptime is not thread secure (underneath _strptime is imported, and the import may throw AttributeError ). If you want to avoid this problem, either you have to call strptime or import _strptime before starting a thread. How to fix it? Just import _strptime or call strptime before starting a thread. It seems that it happens since 2010.

Py.test - Splitting conftest file

If you have to maintain a massive project, you probably have many fixtures in conftest file. And there is a problem; this file grows and grows. So, at some point, you decide to split this huge file into smaller files. But, py.test has to know the fixtures are keeping in these files. So, what you can do? I see three patterns here for this: import these guys inside conftest.py file create more conftest.py files use pytest_plugins Import fixtures inside conftest file You can for example do this: 1 2 3 4 5 6 7 8 9 from tests.my_fixtures.fixs1 import ( fix11, fix12, fix13, fix14, fix15, ... ) from tests.my_fixtures.fixs2 import ( fix21, fix22, fix23, ) from tests.my_fixtures.fixs3 import ( fix31, fix32, fix33 ) But, there are some problems with this approach. You import them in an explicit way, so if you create a new fixture, you have to remember to add this guy in the import clause. So, this strategy is not the best solution. If you have many fi...

DynamoDB in pytest-dbfixtures

pytest-dbfixtures If you use pytest maybe you have heard about pytest-dbfixtures : Pytest dbfixtures is a pytest plugin that makes it a lot easier to set up proper database or storage engine for testing. Simply use one of provided fixtures that start predefined clean database server for your tests or creates server more tailored for your application by using one of provided factories. This plugin is very useful if you have integration tests in your project, and you want to perform tests on a database for example. You will find information how to use it in the documentation . Currently, the plugin supports: Postgresql MySQL Redis Mongo Elasticsearch RabbitMQ And recently, we have added support for DynamoDB . Here , you will find how to run DynamoDB on your computer. And, here we are. If you want to use it in production, you want to test it locally. dynamodb fixture If you still do not use pytest, go to the pytest page and read how to use it, now. If you want to ...

PyCharm - tips, tricks and plugins

Image
Introduction I have been using Vim for a long time, but recently I have started using PyCharm too. This tool has many proper features and plugins. I will show you some of them. You will find here many gifs instead of text. In this way, you can easily see how it works, how it looks, etc. Plugins   .ignore This plugin was written by my friend. Here is more info about it. It will generate new ignore files for you. BashSupport Supports syntax highlighting, rename refactoring, documentation lookup, inspections, quickfixes, etc. Dash A smart and simple plugin that provides keyboard shortcut access for Dash . KeyPromoter Shows you how easy you can make the same action using only a keyboard. Lua Support for LUA. Markdown Support for markdown. YAML/Ansible support I don't want to write again "Support for YAML/Ansible". Tips & Tricks You do not know what to do? Do not be scared! Just use TODO. You have access to Termin...

AWS Lambda and Python

Image
What is the AWS Lambda? AWS Lambda lets you run code without provisioning or managing servers. You pay only for the compute time you consume - there is no charge when your code is not running. So, you can build a scalable application without managing servers. Something like a microservice without servers. Serverless! Hence, your function must be written in a stateless style. If you want to store something somewhere, you can connect to S3, Redshift, DynamoDB, etc. AWS Lambda will start to execute your code within milliseconds. I am not going to write a tutorial step by step. You will find here only a handful necessary information. Limits Let's look at the limits (all limits are default, you can ask guys from AWS to increase them). You have access to an ephemeral disk with limit 512 MB (access to /tmp only). Your function must be finished within 300 seconds (it is a default max value; if you want you can set 10 seconds also); if not AWS Lambda will terminate it. Zip...

How you can use watchdog to improve your productivity.

Watchdog is a python API and shell utilities to monitor file system events . I am using it for tasks like build sphinx docs or run tests after changes in file/directory. It's very easy to use. For instance, you are writing documentation and after each saving file you have to run command like "make html". So, why you don't this automatically?   Simple command: watchmedo shell-command --command="make html" --wait source What does it? Watchdog began to watch source directory. If something in this directory will be changed, then watchdog will run your command (make html). Simply, right? If you use Firefox you can install Auto Reload add-on. Auto Reload automatically reloads matching tabs when selected local files change. So, after saving file, your documentation will build automatically and Firefox automatically will refresh tab with documentation in browser, brilliant! You can also use patterns. For example, you want to run tests after saving file...

Rzadko wykorzystywane typy danych

Wstęp Przy codziennej pracy z pythonem często korzystasz z takich typów danych jak słownik, lista, krotka czy zbiór. Ale warto pamiętać, że istnieją również inne typy danych, które często mogą Ci się przydać, a o których niekoniecznie słyszałeś. Przedstawię kilka z nich, które moim zdaniem są warte uwagi. Counter Typ ten przydaje się wtedy gdy chcesz np. sprawdzić ile razy występuje dany obiekt w zbiorze i dodatkowo chcesz to trzymać jako słownik. Przykład: deque Obiekt deque idealnie nadaje się do stosu lub kolejki . Dodawanie oraz pobieranie elementu jest zbliżone do O(1); nie ważne czy pobierasz z końca czy z początku. Jeżeli jednak chcesz dostać się do elementów po indeksach lepiej jest skorzystać z listy, która jest do tego przystosowana, więc siłą rzeczy jest szybsza. Poniżej, krótkie porównanie: defaultdict defaultdict przydaje się tam, gdzie chcesz stworzyć słownik w którym przy dostępie ma już mieć zdefiniowaną domyślną wartość. Zamiast martwić się sprawdz...

Pylibmc, ultramemcache i python-memcached

Wstęp W ubiegłym roku pisałem o ultrajsonie , który wypadł bardzo dobrze. Przedwczoraj natrafiłem na bibliotekę ultramemcache , którą również postanowiłem przetestować i sprawdzić czy jest ultra. Do porównania wykorzystam biblioteki python-memcached oraz pylibmc . Pierwszy test odbył się standardowo poprzez odpalenie jednego procesu. Drugi natomiast z wykorzystaniem czterech procesów co znacznie przyspieszyło działanie. Jeden proces: python-memcached ultramemcache pylibmc Cztery procesy: python-memcached ultramemcache pylibmc Wyniki Testy wykonałem kilka razy dla każdego ze skryptów i wybrałem najlepsze wyniki dla danej biblioteki. Był to bardzo prosty test, ale da się zauważyć spore różnice w szybkości działania tych bibliotek. W przypadku jednego procesu ultramemcache poradził sobie najlepiej, chociaż pylibmc jest tuż tuż... Jeżeli chodzi o cztery procesy to pylibmc jest zdecydowanym zwycięzcą . Zachęcam do robienia swoich testów. Do sporządzen...

bumpversion

Image
bumpversion to ciekawa paczka do automatycznego podbijania wersji twojej paczki ;). ( screencast )  Jedną komendą jesteś w stanie podbić wersję w swojej paczce w kilku miejscach (oczywiście, najlepiej informację o wersji trzymać w jednym miejscu, ale czasami jesteś zmuszony, aby zrobić to w kilku plikach). Przykładowo, twoja aktualna wersja to 0.1.10, zrobiłeś małego fixa i chcesz podbić wersję do 0.1.11. Dodatkowo informacje na temat wersji trzymasz w pliku setup.py oraz w random_words/__init__.py . Zapomniałem dodać; jak chcesz to zajrzyj do paczki RandomWords , bo to na niej jest przykład. Teraz wystarczy odpalić: bumpversion --current-version 0.1.10 patch setup.py random_words/__init__.py i gotowe. Skrypt podbił wersję w pliku setup.py oraz w random_words/__init__.py Dokumentację i więcej przykładów użycia znajdziesz na githubie . P.S. Screena musiałem zrobić lokówką bo ubuntu odmówiło przed chwilą posłuszeństwa, a nie chce mi się resetować systemu.

Travis CI oraz PyPI badges

Image
Jeżeli korzystasz z Travis-CI do testowania swojego repozytorium na githubie oraz trzymasz paczkę na pypi , możesz w łatwy i prosty sposób dodać informacje na temat statusu do pliku README. Dzięki temu userzy będą widzieć czy wszystkie testy przeszły pomyślnie, jaka jest aktualna wersja paczki oraz jaka jest ilość ściągnięć. U mnie dla repo RandomWords wygląda to tak: Travis-CI W dokumentacji travis-ci znajdziesz informacje o tym co musisz umiejscowić w odpowiednim pliku. PyPI Osobiście korzystam z dwóch formatów. Markdown dla github oraz reStructuredText dla PyPI. Markdown : [![PyPi version](https://pypip.in/v/$REPO-NAME/badge.png)](https://crate.io/packages/$REPO-NAME/) [![PyPi downloads](https://pypip.in/d/$REPO-NAME/badge.png)](https://crate.io/packages/$REPO-NAME/) reStructuredText : .. image:: https://pypip.in/v/$REPO-NAME/badge.png :target: https://crate.io/packages/$REPO-NAME/ :alt: Latest PyPI version .. image:: https://pypip.in/d/$REPO-NAME/badge.pn...

gift

Image
Stworzyłem skrypt do pobierania obrazków z tumblera, znajdziesz go w repo gift (get images from tumblr). Pobieranie informacji na temat danego bloga opiera się o tumblerowe API, więc musisz mieć swoją appkę. Tutaj możesz ją szybko założyć. Obrazki są zapisywane w katalogu images/nazwa-bloga . Instalacja Repo ściągasz poleceniem: git clone https://github.com/tomislater/gift.git Wchodzisz do katalogu gift i instalujesz zależności: pip install -r requirements.txt Jak używać Po założeniu aplikacji w pliku config.cfg podajesz swój consumer key: [tumblr] consumer_key = your_consumer_key Jak korzystać ze skryptu najlepiej dowiesz się wpisując w konsoli: python gift.py -h Poniżej kilka screenów: python gift.py perfectboard python gift.py joeyxbadass ./gift skate--n--surf -l 100

TFDPronunciation nowa wersja (progressbar)

Image
Dodałem dzisiaj do skryptu TFDProunciation progressbar . Czasami strasznie mi muli net i fajnie mniej więcej wiedzieć kiedy skrypt skończy się wykonywać.

bpython i dzielenie się kodem

Image
Przy codziennej pracy z pythonem moimi ulubionymi konsolami są bpython (szybkość) i IPython (kombajn). Dzisiaj będzie krótko na temat jednej z funkcji jaką oferuje bpython, a chodzi tutaj o wrzucenie kodu z konsoli do internetu ;) bpaste Aby wysłać kod z konsoli bpython wystarczy wcisnąć F8 i potwierdzić to klawiszem y . Domyślnie kod jest wysyłany na bpaste i z poziomu konsoli wygląda to mniej więcej tak: http://bpaste.net/show/cVuvrhTrBZB8ZSM9DVxP/ I to tyle jeśli chodzi o wrzucanie na bpaste. gist Ale co jeśli, chcę szybko umieścić kod na gist ? Oczywiście da się, lecz trzeba poczynić kilka kroków. Pierwsze co musisz zrobić to stworzyć plik konfiguracyjny dla bpythona w którym zamieścisz informację, jakiego skryptu ma używać do wypychania kodu. Jeśli nie masz pliku ~/.config/bpython/config to go stwórz i dodaj w sekcji general linijkę: pastebin_helper = do_gist_json. Przykładowo u mnie wygląda to tak: Nazwa do_gist_json to oczywiście nazwa skryptu, który będzi...

Python test framework - splinter

Trafiłem dzisiaj na framework splinter , który służy do testowania webowych aplikacji. Po przeczytaniu dokumentacji i przejrzeniu krótkiego tutoriala postanowiłem sprawdzić czy może mi się przydać. Framework poznałem u siebie lokalnie, wykonując testy na jednej z moich appek do testów, ale tutaj przedstawię to na istniejącej witrynie w sieci . Na początek garść informacji. Możliwości wykonywanie skryptów javascript bardzo proste api multi webdrivers (chrome, firefox, phantomjs, zopetestbrowser, remote) wsparcie dla xpath i css działające iframe i alerty działający ajax oraz asynchroniczny javascript    Instalacja pip install splinter Po jakże trudnej instalacji możesz wziąć się za testowanie web aplikacji. Poniżej znajduje się lista, które przetestuję na stronie sonyvegas : skorzystanie z wyszukiwarki próba skorzystania z kalendarza próba zalogowania na nieistniejące konto Pierwsze co musisz zrobić to stworzyć instancję przeglądarki, a robisz to tak:...

Vim tagbar

Image
Tagbar pomaga wtedy gdy w module masz dużo kodu i jest ci trudno ogarnąć, co gdzie jest (np. po wcześniejszej osobie, która pisała kod). Jeżeli korzystasz z pathogen to instalacja jak się domyślasz jest banalna: cd ~/.vim/bundle git clone https://github.com/majutsushi/tagbar.git Dodatkowo musisz mieć w systemie Exuberant Ctags . Szybka instalacja pod Ubuntu: sudo apt-get install ctags W pliku .vimrc możesz jeszcze dodać: nmap <F8> :TagbarToggle<CR> Umożliwi ci to na szybki dostęp do Tagbar wciskając F8 . Tak to wygląda dla kodu pythona: Tagbar vim  Kilka przydatnych skrótów klawiszowych: enter/double click - przenosi Cię do taga, na który wskazałeś kursorem (na screenie widać, że przeniosło mnie do metody route ) s - sortowanie tagów według kolejności występowania lub według nazwy (domyślnie jest według kolejności występowania) p - przenosi do danego tagu, lecz kursor pozostaje w tagbarze -/+ - zwija/rozwija tagi, np. importy czy klasy =/* - ...

Vim-snipmate i python

Image
Trafiłem ostatnio na dość ciekawy plugin do vima, a mianowicie na vim-snipmate . Jest to fork z repo snipmate.vim , które autor przestał rozwijać jakieś 3-4 lata temu. vim-snipmate Czym jest snipmate? Jest to plugin, który pomaga dopełniać  pisany przez ciebie kod. Przykładowo, wpisujesz def  lub cl , wciskasz <tab>  i plugin sam dalej tworzy funkcję czy klasę. Postanowiłem, że stworzę video i pokażę jak plugin się sprawdza przy pisaniu w pythonie. Bardzo mocno go polecam. Tym bardziej, że wspiera praktycznie każdy popularniejszy  format . Video Instalacja Zakładam, że używasz pathogen . Jeżeli nie, zajrzyj tutaj . Przy okazji polecam ten post , w którym opisuję praktycznie krok po kroku jak zrobić sobie Python IDE. cd ~/.vim/bundle git clone git://github.com/garbas/vim-snipmate.git git clone https://github.com/tomtom/tlib_vim.git git clone https://github.com/MarcWeber/vim-addon-mw-utils.git git clone https://github.com/honza/snipmate-snippets....

Cron i zc.lockfile

Musiałem dzisiaj napisać skrypt, który odpalał się co minutę poprzez crona i mogło się zdarzyć, że będzie wykonywał się trochę dłużej niż jedna minuta. Dlatego też, trzeba było wymyślić jakiś mechanizm, który by mnie uchronił przed odpaleniem skryptu kolejny raz, gdy ten jeszcze się nie wykonał. Z pomocą przyszedł mi moduł zc.lockfile . Instalujesz go normalnie poprzez pipa: pip install zc.lockfile Jak działa zc.lockfile? Krótki opis: The zc.lockfile package provides a basic portable implementation of interprocess locks using lock files. The purpose if not specifically to lock files, but to simply provide locks with an implementation based on file-locking primitives. Of course, these locks could be used to mediate access to  other  files. For example, the ZODB file storage implementation uses file locks to mediate access to file-storage database files. The database files and lock file files are separate files. Ja go użyłem w następujący sposób, w skrypcie zdefiniow...

Vim jako Python IDE

Image
Wstęp Trochę mi zajęło zabranie się za napisanie tego posta, ale oto jest. Mam nadzieję, że Ci się przyda. Post pisany trochę po to by utrwalić wiedzę, trochę po to, aby pomóc innym, którzy chcą spróbować Vima i trochę po to, by mieć coś ciekawego na tym blogu. Zacznę od tego dlaczego nie inne edytory. Wypróbowałem naprawdę mnóstwo różnych IDE do Pythona, zaczynając od Eclipse , poprzez PyCharm , Komodo , erci5 , Sublime Text 2 i wiele wiele innych, na Wingware kończąc. Wszystko z czego korzystałem po pewnym czasie albo i na początku "muliło", miało mnóstwo opcji z których nie skorzystałem i pewnie nie skorzystam nigdy w życiu, zaśmiecało mi system, dużo ważyło, etc. A odpalenie kilku instancji programu, tak aby można było porobić coś jeszcze na komputerze? Zapomnij. Dlatego zacząłem szukać czegoś lekkiego, czegoś co będę mógł szybko odpalić z terminala i od razu pracować, czegoś co będę mógł w łatwy sposób odpalić na innej maszynie, czegoś co jest darmowe, czegoś co...