Picobrew Server Lines of Code Analysis
How much code went into building the chiefwigms/picobrew-pico server? If you don't know, now you know... Picobrew Server Edition
A bunch of people have now asked me how many lines of code did it take to build out the Picobrew server that we are using that is multi-platform and provides a fairly simple bundled image for bootstrapping people with a RaspberryPi (again the server isn't platform dependent feel free to get it setup on Win/Mac/Linux/etc).
So what did I do... well I programmatically measured out how many lines of code written in our shared community repo that was started by Pete Marinec (not me BTW!).
Server Code
The code that answers the API from both your web browser and from the Picobrew machines attached to the server.
Python Lines (including tests)
git ls-files | grep "\.py$" | xargs wc -l
99 app/__init__.py
6 app/main/__init__.py
88 app/main/config.py
37 app/main/firmware.py
140 app/main/model.py
121 app/main/recipe_import.py
322 app/main/recipe_parser.py
752 app/main/routes_frontend.py
69 app/main/routes_iSpindel_api.py
270 app/main/routes_pico_api.py
129 app/main/routes_picoferm_api.py
37 app/main/routes_picostill_api.py
670 app/main/routes_zseries_api.py
232 app/main/routes_zymatic_api.py
276 app/main/session_parser.py
62 app/main/test_recipe_import.py
44 app/main/test_routes_frontend.py
19 server.py
18 test_server.py
3391 total
Python Lines (only tests...)
yeah test coverage sucks... yay side projects
git ls-files | grep "test.*\.py$" | xargs wc -l
62 app/main/test_recipe_import.py
44 app/main/test_routes_frontend.py
18 test_server.py
124 total
Base Recipes (Zymatic only)
The Zymatic had a way for Picobrew to push some base utilities that later were bundled in the firmware for the ZSeries devices this is for Utilities > Cleaning v1, Utilities > Rinse v3, and Utilities > New Clean Beta v6 while connecting to the "mothership" can be edited remotely by Picobrew staff and sent updated to your device just like your recipe instructions... after all a clean or rinse is just a brew with no grains and no hops.
git ls-files | grep "\.json" | xargs wc -l
90 app/recipes/zymatic/Cleaning_v1.json
139 app/recipes/zymatic/New_Clean_Beta_v6.json
13 app/recipes/zymatic/Rinse_v3.json
242 total
Static Code / Website
All the markup and javascript that powers the web experience you see at http://raspberrypi or http://picobrew.com or http://192.168.72.1 or http://<ip-of-flask/python-server> depending on your setup.
HTML Markup (webpage structure)
git ls-files | grep "\.html$" | xargs wc -l
55 app/templates/about.html
24 app/templates/base.html
29 app/templates/brew_history.html
29 app/templates/ferm_history.html
26 app/templates/iSpindel_history.html
54 app/templates/import_brewhouse_recipe.html
79 app/templates/index.html
12 app/templates/invalid_file.html
50 app/templates/navbar.html
30 app/templates/new_pico_recipe.html
25 app/templates/new_zseries_recipe.html
25 app/templates/new_zymatic_recipe.html
10 app/templates/pico_recipes.html
48 app/templates/recipe_list.html
104 app/templates/setup.html
11 app/templates/units_selector.html
10 app/templates/zseries_recipes.html
10 app/templates/zymatic_recipes.html
631 total
Javascript (dynamic code powering experience)
The majority of this code is libraries so I'll split that out separately like test coverage above. Though for now still including all of these libraries (which some have been minified meaning all lines are collapsed to a single set of them instead of "source" it won't do much...)
git ls-files | grep "\.js$" | xargs wc -l
6 app/static/js/bootstrap/bootstrap.min.js
48 app/static/js/brew_graph.js
67 app/static/js/brew_graph_socketio.js
2 app/static/js/brew_history.js
105 app/static/js/convert_units.js
58 app/static/js/ferm_graph.js
74 app/static/js/ferm_graph_socketio.js
2 app/static/js/ferm_history.js
113 app/static/js/highcharts/annotations.js
13 app/static/js/highcharts/dark-unica.js
29 app/static/js/highcharts/export-data.js
42 app/static/js/highcharts/exporting.js
544 app/static/js/highcharts/highcharts.js
58 app/static/js/iSpindel_graph.js
74 app/static/js/iSpindel_graph_socketio.js
41 app/static/js/import_recipe.js
2 app/static/js/jquery/jquery.min.js
331 app/static/js/pico_recipe.js
22 app/static/js/server_management.js
95 app/static/js/setup.js
8 app/static/js/socketio/socket.io.slim.js
1 app/static/js/tabulator/accessor.min.js
1 app/static/js/tabulator/ajax.min.js
1 app/static/js/tabulator/edit.min.js
1 app/static/js/tabulator/filter.min.js
1 app/static/js/tabulator/format.min.js
1 app/static/js/tabulator/frozen_rows.min.js
1 app/static/js/tabulator/jquery_wrapper.min.js
1 app/static/js/tabulator/menu.min.js
1 app/static/js/tabulator/moveable_rows.min.js
1 app/static/js/tabulator/responsive_layout.min.js
1 app/static/js/tabulator/sort.min.js
12 app/static/js/tabulator/tabulator.min.js
5 app/static/js/tabulator/tabulator_core.min.js
1 app/static/js/tabulator/validate.min.js
313 app/static/js/zseries_recipe.js
310 app/static/js/zymatic_recipe.js
2386 total
Tabulator (minified)
git ls-files | grep "\.js$" | grep "tabulator" | xargs wc -l
1 app/static/js/tabulator/accessor.min.js
1 app/static/js/tabulator/ajax.min.js
1 app/static/js/tabulator/edit.min.js
1 app/static/js/tabulator/filter.min.js
1 app/static/js/tabulator/format.min.js
1 app/static/js/tabulator/frozen_rows.min.js
1 app/static/js/tabulator/jquery_wrapper.min.js
1 app/static/js/tabulator/menu.min.js
1 app/static/js/tabulator/moveable_rows.min.js
1 app/static/js/tabulator/responsive_layout.min.js
1 app/static/js/tabulator/sort.min.js
12 app/static/js/tabulator/tabulator.min.js
5 app/static/js/tabulator/tabulator_core.min.js
1 app/static/js/tabulator/validate.min.js
29 total
SocketIo (minified)
git ls-files | grep "\.js$" | grep "socketio" | xargs wc -l
67 app/static/js/brew_graph_socketio.js
74 app/static/js/ferm_graph_socketio.js
74 app/static/js/iSpindel_graph_socketio.js
8 app/static/js/socketio/socket.io.slim.js
223 total
Highcharts (minified)
git ls-files | grep "\.js$" | grep "highcharts" | xargs wc -l
113 app/static/js/highcharts/annotations.js
13 app/static/js/highcharts/dark-unica.js
29 app/static/js/highcharts/export-data.js
42 app/static/js/highcharts/exporting.js
544 app/static/js/highcharts/highcharts.js
741 total
jQuery (minified+ tabulator wrapper)
git ls-files | grep "\.js$" | grep "jquery" | xargs wc -l
2 app/static/js/jquery/jquery.min.js
1 app/static/js/tabulator/jquery_wrapper.min.js
3 total
Stylesheets (CSS)
AKA the stuff that makes websites "pretty".
git ls-files | grep "\.css" | xargs wc -l
6 app/static/css/bootstrap/bootstrap.min.css
4 app/static/css/fontawesome/all.min.css
4 app/static/css/fontawesome/fontawesome.min.css
43 app/static/css/main.css
3 app/static/css/tabulator/tabulator_bootstrap4.min.css
3 app/static/css/tabulator/tabulator_midnight.min.css
63 total
Binary (firmware...)
No this isn't code anyone from the community has written nor anyone really... this is compiled and packaged code that is shipped to your Picobrew devices via our server and thus included in the repository... wanted to include just for simple data collection (I personally love data even the "useless" kinds).
git ls-files | grep "\.bin" | xargs wc -l
0 app/firmware/pico/pico_0_1_34.bin
0 app/firmware/pico_c/pico_c_0_1_34.bin
849 app/firmware/picoferm/picoferm_0_1_0.bin
848 app/firmware/picoferm/picoferm_0_1_2.bin
848 app/firmware/picoferm/picoferm_0_1_3.bin
848 app/firmware/picoferm/picoferm_0_1_4.bin
905 app/firmware/picoferm/picoferm_0_1_5.bin
903 app/firmware/picoferm/picoferm_0_1_6.bin
905 app/firmware/picoferm/picoferm_0_1_7.bin
911 app/firmware/picoferm/picoferm_0_1_8.bin
1122 app/firmware/picoferm/picoferm_0_2_0.bin
1129 app/firmware/picoferm/picoferm_0_2_1.bin
1117 app/firmware/picoferm/picoferm_0_2_2.bin
1116 app/firmware/picoferm/picoferm_0_2_3.bin
1113 app/firmware/picoferm/picoferm_0_2_4.bin
1114 app/firmware/picoferm/picoferm_0_2_5.bin
1120 app/firmware/picoferm/picoferm_0_2_6.bin
1114 app/firmware/picoferm/picoferm_0_2_7.bin
6510 app/firmware/picostill/picostill_0_0_30.bin
6494 app/firmware/picostill/picostill_0_0_31.bin
6480 app/firmware/picostill/picostill_0_0_32.bin
7986 app/firmware/picostill/picostill_0_0_33.bin
8053 app/firmware/picostill/picostill_0_0_34.bin
8071 app/firmware/picostill/picostill_0_0_35.bin
15012 app/firmware/zseries/zseries_0_0_116.bin
16189 app/firmware/zseries/zseries_0_0_119.bin
90757 total
Contribution Info and Statistics
The server as it exists today is largely built on top of another OSS project, hotzenklotz/picobrew-server, that had only support for Zymatic with no web UI or graph/visualization support. Pete took it from there as a prototype and a learning bed for new stuff (what us engineers like to do all the time). A few members from the community, myself included, have been working on adding additional features and fixes along the way. Now numbering 11 total people have contributed code where even more have been submitting feedback, bugs, and feature requests.
- Pete Marinec - Denver, CO (@chiefwigms)
- Trevor Mack - Boston, MA (@tmack8001)
- @zuiko42
- Todd Humes - Seattle, WA (@BuckoWA)
- Troy Foster - Denver, CO (@troyef)
- Tom O'Neil - Seattle, WA (@therevendtom)
- Mark Weddle - Seattle, WA (@mweddle)
- Matt Johnson - Manchester, UK (@metahetz)
- Andrew Berryman - Manchester, UK (@barndoor101)
- Seth Hettich
- Austin Chambers (@austinchambers)
Lines of Code Changed by Author
(technically I cheated as all the binary files are being reported as written by me...)
7882 author Pete
7732 author Trevor Mack
1747 author Todd
350 author Tom O'Neil
146 author zuiko42
59 author Austin Chambers
30 author troyef
22 author Andrew Berryman
4 author mweddle
2 author Matt Johnson
Can't quite comprehend what this means and want to see a video of it instead... well your wish is my command. Here is a fairly cool animation showing the actual server being built and maintained over time.
Additional thanks to the 34 additional people who have filed Github Issues some more detailed than others, but each are appreciated and glad you are finding value and helping to push for a better overall experience for everyone.
Much appreciated, Cheers 🍻!
- @msav72
- @ddrum2000
- Marc Chabot (@marcchabot)
- @Rudder2
- David Wilt - Whicata, Michagin (@wiltdavi)
- @b0nadrag
- @DarkJaeger
- Cody (@Intecpsp)
- Nick Harlson (@nickharlson)
- @LEFsher
- @PhracturedBlue
- @chaterpaul
- Patrick Monineau (@patrickmoineau)
- @goston6858
- @rizmarino
- @WTremml
- @thormj
- @ecraigsmit
- @randombrand
- @artybartflast
- @hanahwill
- @metfoo
- @wizzlebippi
- @Moinster
- @NCAvian
- @shettich
- Colin Kaminski - Napa, CA (@colinluthier)
- R.J. Roark (@RJRoark)
- @RafaSP
- @metalp-epfl
- Tommy Morris (@tommymorris)
- Dayton Gray (@daytongray)
- @joeg72