{ "info": { "author": "Jos\u00e9 Lopes de Oliveira Jr.", "author_email": "", "bugtrack_url": null, "classifiers": [ "Development Status :: 4 - Beta", "Intended Audience :: Developers", "License :: OSI Approved :: MIT License", "Programming Language :: Python :: 2.7", "Programming Language :: Python :: 3" ], "description": "Acan\n====\n\nMaths around brewing. Acan implements some known equations used by\nhomebrewers. All of them are well documented, so anyone could check\nwhere they came from and why.\n\nAcan only needs Python 3 to run. Having it, just install Acan and import\nit in your programs:\n\n::\n\n $ pip3 install acan\n $ python3\n >>> import acan\n\nClasses\n-------\n\nAcan is a object-oriented calculator, so classes were implemented to do\nall the job.\n\nHydrometer\n~~~~~~~~~~\n\nHydrometer class has all the methods needed to support hydrometer usage.\nThe basic usage of this class is to instantiate it with the value read\non hydrometer --in SG. Alternatively you can set up the temperatures to\ncalibrate your results.\n\nMore info on its docstring.\n\nExamples\n^^^^^^^^\n\nIn the first example, we only instantiate an Hydrometer object with the\nvalue read on hydrometer --e.g., 1.010.\n\nIn the second example, we calibrate the hydrometer using the\ntemperatures. The first parameter is the value, the second is the\ncurrent temperature of the sample, and the last value is the temperature\nin which the hydrometer was calibrated.\n\n.. code:: python\n\n >>> from acan.tools import Hydrometer\n >>> # First example\n ...\n >>> h = Hydrometer(1.010)\n >>> print(h)\n SG...: 1.010\n Plato: 2.56\n Brix.: 2.34\n >>> # Second example\n ...\n >>> h1 = Hydrometer(1.010, 37, 20)\n >>> print(h1)\n SG...: 1.015\n Plato: 3.78\n Brix.: 3.56\n\nRefractometer\n~~~~~~~~~~~~~\n\nRefractometer class implements methods specific to refractometers. The\nmost common way to use it is to inform the value --in Plato (ideally) or\nBrix-- and it'll correct this value automatically with the default\ncorrection factor. Read the class' docstring for more information.\n\nCalibration\n^^^^^^^^^^^\n\nIf you wish to set the calibration of your refractometer, you can use\nthe ``calibration`` parameter, which accepts an iterable object with a\ntuple of refractometer value and the corresponding hydrometer value.\nLet's go to examples to understand how it works.\n\nExamples\n^^^^^^^^\n\n.. code:: python\n\n >>> from acan.tools import Refractometer\n >>> # First example\n ...\n >>> r = Refractometer(23.75)\n r.calibration\n 1.04\n >>> print(r)\n SG...: 1.097\n Plato: 23.029\n Brix.: 22.837\n >>> # Second example\n ...\n >>> r1 = Refractometer(23.75, calibration=[(12.6, 1.050), (11.5, 1.045), (13.7, 1.055)])\n >>> r1.calibration\n 1.0395278561663661\n >>> print(r1)\n SG...: 1.097\n Plato: 23.040\n Brix.: 22.847\n\nPalette\n~~~~~~~\n\nThis class has methods relative to color calculations. The easiest way\nto use it is to instantiate an object with the corresponding color value\nin SRM, EBC or Lovibond.\n\nExamples\n^^^^^^^^\n\n.. code:: python\n\n >>> from acan.tools import Palette\n >>> # First example\n ...\n >>> p = Palette(15)\n >>> print(p)\n SRM: 15.00\n EBC: 29.55\n L..: 11.63\n Hex: #964726\n >>> # Second example\n ...\n >>> p1 = Palette(20, 'ebc')\n >>> print(p1)\n SRM: 10.16\n EBC: 20.00\n L..: 8.06\n Hex: #a45a2d\n\nWort\n~~~~\n\nWort class aggregates all methods used to measure the wort quality. To\nuse it, just take original and final gravities, and pass them as\nparameter to this class --for final gravity, you can assume the last\nsample taken from the wort.\n\nExamples\n^^^^^^^^\n\n.. code:: python\n\n >>> from acan.wort import Wort\n >>> w = Wort(1.051, 1.013)\n >>> print(w)\n Original gravity....[SG]: 1.051\n Final gravity.......[SG]: 1.013\n Volume...............[L]: 0.000\n Efficiency...........[%]: 0.000\n Original extract.[Plato]: 12.625\n Actual extract...[Plato]: 3.321\n Real extract.....[Plato]: 5.003\n Apparent attenuation.[%]: 73.692\n Real attenuation.....[%]: 60.368\n Alcohol by weight....[%]: 3.951\n Alcohol by volume....[%]: 5.067\n Calories in 355 mL.[Cal]: 168.579\n\nTo calculate the efficiency, use the parameters ``grains`` and\n``volume``. Consider the example below:\n\n- 2948.3 grams of 36 maximum efficiency --in PPG-- malt;\n- 226.8 grams of 34 m.e. malt (x2);\n- 226.8 grams of 35 m.e. malt;\n- 226.8 grams of 30 m.e. malt;\n- 22.71 litres of wort; and\n- OG == 1.038.\n\nThe efficiency could be calculated like this:\n\n.. code:: python\n\n >>> from acan.wort import Wort\n >>> print(Wort(1.038, 1.013, grains=[(2948.3, 36), (226.8, 34),(226.8, 34), (226.8, 35), (226.8, 30)], volume=22.71))\n Original gravity.....[SG]: 1.038\n Final gravity........[SG]: 1.013\n Original extract..[Plato]: 9.510\n Apparent extract..[Plato]: 3.321\n Real extract......[Plato]: 4.440\n Volume................[L]: 22.710\n Points/Pound/Gallon.[PPG]: 26.821\n Mash efficiency.......[%]: 75.866\n Apparent attenuation..[%]: 65.789\n Real attenuation......[%]: 59.573\n Alcohol by weight.....[%]: 2.600\n Alcohol by volume.....[%]: 3.333\n Calories in 355 mL..[Cal]: 126.936\n\nFor more information, read the class' docstring. It's important to note\nthat in this work, brewhose and mash efficiencies are the same.\n\nHops\n~~~~\n\nThis class have common equations to calculate hop bitterness. Methods\nlike Tinseth, Rager, and Garetz are covered here as well as those used\nby John Palmer and Ray Daniels.\n\nExamples\n^^^^^^^^\n\n.. code:: python\n\n >>> from acan.wort import Hops\n >>> h = Hops(56.69904, 7, 18.92706, 1.020, 12)\n >>> print(h)\n Hops weight.......[g]: 56.70\n Hops alpha acids..[%]: 7.00\n Wort volume.......[L]: 18.93\n Wort SG...........[L]: 1.020\n Hops boil time....[m]: 12\n Wort bitterness.[IBU]: 26.554\n >>> h.daniels(28.34952, 12.5, 22.712471, 1.048, 60, 'whole')\n 37.44575392083054\n\nPyPI\n----\n\nAcan is now `published at Python Package Index\n(PyPI) `__. A ``Makefile`` was\ncreated to automate all the job of packaging, but some things must to be\nset first.\n\nThe steps below were based on:\n\n- `Packaging and Distributing\n Projects `__\n- `How to submit a package to\n PyPI `__\n\nConfiguration\n~~~~~~~~~~~~~\n\nThe very first thing to be set up is the ``setup.py``. This file must\nupdated with the new version at least. The versioning adopted by Acan\nis: ````.\\ ````.\\ ````. By\n````, we can understand very big changes in the code.\n```` means new features in the current version, like new\nclasses. Finally, ```` are, of course, bug fixes, or little\nchanges in the code, like typo fixes.\n\nIn order to upload this new version to PyPI, a ``~/.pypirc`` file must\nbe created with a content like this --considering you already have a\nPyPI account:\n\n.. code:: bash\n\n [distutils]\n index-servers =\n pypi\n\n [pypi]\n repository=https://www.python.org/pypi\n username=USERNAME\n password=PASSWORD\n\nNote that I had problems using some special characters in ``PASSWORD``.\n\nAfter all of this, just run ``$ make pypi`` to create the package and\nupload it to PyPI.\n\nThis way, the process I follow is:\n\n1. Clone, create virtualenv, and modify the project.\n2. Update the version in ``setup.py``.\n3. Commit to GitHub.\n4. Run ``make pypi``.\n\nReferences\n----------\n\n1. NIST. Polarimetry, Saccharimetry and the Sugars. 1942. Available at:\n http://www.boulder.nist.gov/div838/SelectedPubs/Circular%20440%20Table%20114.pdf.\n2. Brew Your Own. Calculating Alcohol Content, Attenuation, Extract and\n Calories: Advanced Homebrewing. 2005. Available at:\n http://byo.com/hops/item/408-calculating-alcohol-content-attenuation-extract-and-calories-advanced-homebrewing.\n3. HAYNES, W.N. CRC Handbook of Chemistry and Physics Internet Version.\n 2015. 96th edition.\n4. Brewtoad. Alcohol Calculator. Available at:\n https://www.brewtoad.com/tools/alcohol-calculator.\n5. Onebeer. Refractometer Calculator. Available at:\n http://onebeer.net/refractometer.shtml.\n6. DEVRIES, J. Specific Gravity and Brix/Plato Conversion. Available\n at:\n http://jayson.devri.es/2010/08/specific-gravity-and-brixplato.html.\n7. Brewtarget. HydrometerTool.cpp. Available at:\n https://github.com/Brewtarget/brewtarget/blob/develop/src/HydrometerTool.cpp#L134\n8. PALMER, J.J. How to Brew. 2006. 3rd edition.\n9. Brewer's Friend. Using your Refractometer Correctly for Maximum\n Accuracy in Home Brewing. Available at:\n http://www.brewersfriend.com/2013/04/24/using-your-refractometer-correctly-for-maximum-accuracy-in-home-brewing/.\n10. Brew Your Own. Refractometers. Available at: <\n http://byo.com/stories/item/1313-refractometers>.\n11. Zymurgy. Using a Refractometer. 2013. Vol 36, no. 4. p.48-53.\n12. BeerSmith. Beer Color: Understanding SRM, Lovibond and EBC.\n Available at:\n http://beersmith.com/blog/2008/04/29/beer-color-understanding-srm-lovibond-and-ebc/.\n13. Brewtoad. Color Converter. Available at:\n https://www.brewtoad.com/tools/color-converter.\n14. Beer Judge Certification Program (BJCP). 2015 Style Guidelines -\n Beer Style Guidelines. Available at:\n http://www.bjcp.org/docs/2015_Guidelines_Beer.pdf.\n15. Home Brew Digest. Brewing Calculator 2.41. Available at:\n http://hbd.org/deb/downloads.html.\n16. DANIELS, R. Designing Great Beers. 2000.\n17. BeerSmith. Apparent and Real Attenuation for Beer Brewers - Part 2.\n Available at:\n http://beersmith.com/blog/2010/09/14/apparent-and-real-attenuation-for-beer-brewers-part-2/.\n18. Kegerator. How to Calculate Brewhouse Efficiency. Available at:\n http://learn.kegerator.com/brewhouse-efficiency/.\n19. PYLE, N. Norm Pyle's Hops FAQ. Available at:\n http://www.realbeer.com/hops/FAQ.html.\n20. Real Beer. The Hop Page. Available at: http://www.realbeer.com/hops.\n\nAbout\n-----\n\nAccording to `Wikipedia `__, Acan is\nthe Maya god of wine and intoxication, and his name means 'belch'. He is\nidentified with the local brew,\n`balch\u00e9 `__, made from\nfermented honey to which the bark of the balch\u00e9 tree has been added.\n\nThis project was conceived by Jos\u00e9 Lopes as part of his brewing project,\n`Bierminen `__. Join us on\n`Facebook `__.\n\n`Bierminen `__: Zug von verr\u00fckten!\n\nCheers!\n\nProst!\n\nSa\u00fade!\n", "description_content_type": null, "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/bierminen/acan", "keywords": "acan", "license": "MIT License", "maintainer": "", "maintainer_email": "", "name": "acan", "package_url": "https://pypi.org/project/acan/", "platform": "", "project_url": "https://pypi.org/project/acan/", "project_urls": { "Homepage": "https://github.com/bierminen/acan" }, "release_url": "https://pypi.org/project/acan/0.7.0/", "requires_dist": null, "requires_python": "", "summary": "Maths around brewing", "version": "0.7.0" }, "last_serial": 2438639, "releases": { "0.1.0": [ { "comment_text": "", "digests": { "md5": "5b5fd5f05290c116cbf1b96c425c423f", "sha256": "7dec15c88bd0b67cb507305f9bbd0f36be4e6b3cc95b342694e9437ad09861f4" }, "downloads": -1, "filename": "acan-0.1.0.tar.gz", "has_sig": false, "md5_digest": "5b5fd5f05290c116cbf1b96c425c423f", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 4269, "upload_time": "2016-07-12T13:25:04", "url": "https://files.pythonhosted.org/packages/a1/ca/348c5aeaf3fda29ee3de9364c9c47a66277dfc647fc5c18b9a759cbe64e5/acan-0.1.0.tar.gz" } ], "0.1.1": [ { "comment_text": "", "digests": { "md5": "3d3e0c483a89572883e43a5e4c61718d", "sha256": "d80c22517a1f040c8a0e3b338ef7142a9615ad175819356a08a2ee4f73311a0a" }, "downloads": -1, "filename": "acan-0.1.1.tar.gz", "has_sig": false, "md5_digest": "3d3e0c483a89572883e43a5e4c61718d", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 6062, "upload_time": "2016-07-12T14:20:35", "url": "https://files.pythonhosted.org/packages/78/12/29aa6401eb5e4bd2265f84f40eddbf9e64a183e9de8d6f90946e98c28eb3/acan-0.1.1.tar.gz" } ], "0.1.2": [ { "comment_text": "", "digests": { "md5": "f4d51c03e46970ef3c66d7f05734f4c0", "sha256": "a83bc5082c3491c62976ad5cf68349794aee66ad0a7f7eaf284ccb65a3a4c1b7" }, "downloads": -1, "filename": "acan-0.1.2.tar.gz", "has_sig": false, "md5_digest": "f4d51c03e46970ef3c66d7f05734f4c0", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 6687, "upload_time": "2016-07-12T15:32:20", "url": "https://files.pythonhosted.org/packages/d6/6f/785169c71df249cfac91d31be90231cc2bcf99de284e31d4c1bc76e98d84/acan-0.1.2.tar.gz" } ], "0.1.3": [ { "comment_text": "", "digests": { "md5": "6c994264117c94fe27c95bdaaa2aebc2", "sha256": "9e508b72c23e552302a16520b96b19518d74d8187813c316bc1e759012b2651d" }, "downloads": -1, "filename": "acan-0.1.3.tar.gz", "has_sig": false, "md5_digest": "6c994264117c94fe27c95bdaaa2aebc2", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 6698, "upload_time": "2016-07-12T15:43:11", "url": "https://files.pythonhosted.org/packages/b2/bd/b1e67cbb148d393c20ef67ae21f38b574cd86fb028dd8725d6654c0ee5a1/acan-0.1.3.tar.gz" } ], "0.2.0": [ { "comment_text": "", "digests": { "md5": "1315bbd952893f1fcd81e9932da32536", "sha256": "d485a2eeddf057deb6a415c6e31eda43e2134a87e202c8108b309ad1c680d4f3" }, "downloads": -1, "filename": "acan-0.2.0.tar.gz", "has_sig": false, "md5_digest": "1315bbd952893f1fcd81e9932da32536", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 6691, "upload_time": "2016-07-12T17:00:36", "url": "https://files.pythonhosted.org/packages/8c/5b/b11ff094e275d69b10bde4f95f4ceb98dd7d31cf9c0fc704baa41b412b7d/acan-0.2.0.tar.gz" } ], "0.2.1": [ { "comment_text": "", "digests": { "md5": "c73ab45ea5757f6816904cce8761dd20", "sha256": "f13e3fd89ab3e26e81dec82b96398e9fb28aabcbd64f19baf14dd0e941ae13cc" }, "downloads": -1, "filename": "acan-0.2.1.tar.gz", "has_sig": false, "md5_digest": "c73ab45ea5757f6816904cce8761dd20", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 6689, "upload_time": "2016-07-12T17:12:33", "url": "https://files.pythonhosted.org/packages/52/85/677c7bc45f0233898aa67f5cf691580e1ce38454ec6f9002e49b8ca95d66/acan-0.2.1.tar.gz" } ], "0.2.2": [ { "comment_text": "", "digests": { "md5": "e5469280df4d004503b5d55696787822", "sha256": "3ab1ffeaa226d42406ea65c42b5e83ed025156b965e28938eac1511866d943fc" }, "downloads": -1, "filename": "acan-0.2.2.tar.gz", "has_sig": false, "md5_digest": "e5469280df4d004503b5d55696787822", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 6808, "upload_time": "2016-07-12T17:32:58", "url": "https://files.pythonhosted.org/packages/5e/d7/9c48af11283510b467c5dd3279c49cd73da3ea23780a65de2cf5d20c1279/acan-0.2.2.tar.gz" } ], "0.3.0": [ { "comment_text": "", "digests": { "md5": "1d4f572c490ddf482fb1b77676d0afa4", "sha256": "394976ad35a0be915841cffb7e0a457b1bfed07d890714b22a1d8dc29ca85138" }, "downloads": -1, "filename": "acan-0.3.0.tar.gz", "has_sig": false, "md5_digest": "1d4f572c490ddf482fb1b77676d0afa4", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 7844, "upload_time": "2016-07-20T00:22:03", "url": "https://files.pythonhosted.org/packages/d6/a2/259463ec1abf0946ceea3033b96c3092de8150c52aed6a9a33f272271bcb/acan-0.3.0.tar.gz" } ], "0.4.0": [ { "comment_text": "", "digests": { "md5": "b486675e04ed2458bfc92c2513343e59", "sha256": "b702a615fe0891c221c27808150fc4c6ef2546db82fa74fb12d6d02724270110" }, "downloads": -1, "filename": "acan-0.4.0.tar.gz", "has_sig": false, "md5_digest": "b486675e04ed2458bfc92c2513343e59", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 8907, "upload_time": "2016-07-21T16:42:02", "url": "https://files.pythonhosted.org/packages/dc/d9/a5e1f99a439865eb6a60b1d56753f11949faf666f5553d7ae7e7ef137385/acan-0.4.0.tar.gz" } ], "0.4.1": [ { "comment_text": "", "digests": { "md5": "0fefe494b80ec44c985f03536a9d5362", "sha256": "39fd24e839e83659d40c85ec5e300a412a9372e06a563d598f3fe98054007147" }, "downloads": -1, "filename": "acan-0.4.1.tar.gz", "has_sig": false, "md5_digest": "0fefe494b80ec44c985f03536a9d5362", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 9385, "upload_time": "2016-07-21T19:59:02", "url": "https://files.pythonhosted.org/packages/07/6e/9f8ab44b76d7119a222c52b9d85823dfc6e041bae1d47b2409cd1ef5581f/acan-0.4.1.tar.gz" } ], "0.5.0": [ { "comment_text": "", "digests": { "md5": "b270a86f34c63fe122e11842cc6f07f7", "sha256": "f519c0215e84aecb0e890399007dadf44895f8afb159764b0c482a08cd0639e5" }, "downloads": -1, "filename": "acan-0.5.0.tar.gz", "has_sig": false, "md5_digest": "b270a86f34c63fe122e11842cc6f07f7", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 9325, "upload_time": "2016-07-25T19:46:58", "url": "https://files.pythonhosted.org/packages/06/e0/67291871579aac5ddcc276bee44ae59fc0be0bd282e0ec1f109a084381cb/acan-0.5.0.tar.gz" } ], "0.5.1": [ { "comment_text": "", "digests": { "md5": "35f7c210f065de5255902991b79fc951", "sha256": "ef94f09361b19bc851f29d10857509d64ed9bd493fcfab02af407f25e3e6e4b2" }, "downloads": -1, "filename": "acan-0.5.1.tar.gz", "has_sig": false, "md5_digest": "35f7c210f065de5255902991b79fc951", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 10050, "upload_time": "2016-07-25T23:39:53", "url": "https://files.pythonhosted.org/packages/b4/49/9a7f96600ebe50e61b5409006b93e27ab6234c4ffaadba6ff1bfb048c0f3/acan-0.5.1.tar.gz" } ], "0.5.2": [ { "comment_text": "", "digests": { "md5": "3d9f09333bbba20ee11365b27b8ea284", "sha256": "20624f6ea405badc68f92f8fef5236aa0ed374607ca2d092604122813cb1c7cd" }, "downloads": -1, "filename": "acan-0.5.2.tar.gz", "has_sig": false, "md5_digest": "3d9f09333bbba20ee11365b27b8ea284", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 10695, "upload_time": "2016-07-26T18:52:24", "url": "https://files.pythonhosted.org/packages/7e/79/1ec162a79ce9ac6425342c7bf1dabf67ac98ee5af073a9cb93d72e5e861e/acan-0.5.2.tar.gz" } ], "0.6.0": [ { "comment_text": "", "digests": { "md5": "8af60be9eb75b01e23fbbcf126b03a2c", "sha256": "2dc6d728140f275c531731296fe5af32718d62fae2a6dad63ba58b6feb0f2197" }, "downloads": -1, "filename": "acan-0.6.0.tar.gz", "has_sig": false, "md5_digest": "8af60be9eb75b01e23fbbcf126b03a2c", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 12177, "upload_time": "2016-08-26T18:31:27", "url": "https://files.pythonhosted.org/packages/98/fb/f2914192469c7ea490a3b591136de84b68b87b15bd8ce08dfad995f1cd4b/acan-0.6.0.tar.gz" } ], "0.7.0": [ { "comment_text": "", "digests": { "md5": "00b18ce1ba2015a7693c261687154801", "sha256": "eea5e8619616653fe3c5cfda43c99af397ed5bc0d6bc6b8f82bc37ea4b8cc6e9" }, "downloads": -1, "filename": "acan-0.7.0.tar.gz", "has_sig": false, "md5_digest": "00b18ce1ba2015a7693c261687154801", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 12129, "upload_time": "2016-11-02T20:52:18", "url": "https://files.pythonhosted.org/packages/9d/4d/a26010d586e91a1ef3dbb9964d28d88aa3a6843b0894f22a1587093d75f0/acan-0.7.0.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "00b18ce1ba2015a7693c261687154801", "sha256": "eea5e8619616653fe3c5cfda43c99af397ed5bc0d6bc6b8f82bc37ea4b8cc6e9" }, "downloads": -1, "filename": "acan-0.7.0.tar.gz", "has_sig": false, "md5_digest": "00b18ce1ba2015a7693c261687154801", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 12129, "upload_time": "2016-11-02T20:52:18", "url": "https://files.pythonhosted.org/packages/9d/4d/a26010d586e91a1ef3dbb9964d28d88aa3a6843b0894f22a1587093d75f0/acan-0.7.0.tar.gz" } ] }