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!).
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
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
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
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
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
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
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
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)
- 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 🍻!
- Marc Chabot (@marcchabot)
- David Wilt - Whicata, Michagin (@wiltdavi)
- Cody (@Intecpsp)
- Nick Harlson (@nickharlson)
- Patrick Monineau (@patrickmoineau)
- Colin Kaminski - Napa, CA (@colinluthier)
- R.J. Roark (@RJRoark)
- Tommy Morris (@tommymorris)
- Dayton Gray (@daytongray)