Add lab 14 content and journal skeleton
This commit is contained in:
parent
f45f47b572
commit
d5c907859b
9
journal/_src/posts/2022-10-31-lab-14.md
Normal file
9
journal/_src/posts/2022-10-31-lab-14.md
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
Title: Lab Fourteen
|
||||||
|
Date: 2022-10-31T08:30:00
|
||||||
|
Tags: cs2613, lab, python
|
||||||
|
|
||||||
|
Sample description
|
||||||
|
<!-- more -->
|
||||||
|
|
||||||
|
## Sample Body
|
||||||
|
Sample Body
|
8
labs/L14/.idea/.gitignore
vendored
Normal file
8
labs/L14/.idea/.gitignore
vendored
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
# Default ignored files
|
||||||
|
/shelf/
|
||||||
|
/workspace.xml
|
||||||
|
# Editor-based HTTP Client requests
|
||||||
|
/httpRequests/
|
||||||
|
# Datasource local storage ignored files
|
||||||
|
/dataSources/
|
||||||
|
/dataSources.local.xml
|
10
labs/L14/.idea/L14.iml
Normal file
10
labs/L14/.idea/L14.iml
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<module type="PYTHON_MODULE" version="4">
|
||||||
|
<component name="NewModuleRootManager">
|
||||||
|
<content url="file://$MODULE_DIR$">
|
||||||
|
<excludeFolder url="file://$MODULE_DIR$/venv" />
|
||||||
|
</content>
|
||||||
|
<orderEntry type="inheritedJdk" />
|
||||||
|
<orderEntry type="sourceFolder" forTests="false" />
|
||||||
|
</component>
|
||||||
|
</module>
|
12
labs/L14/.idea/dataSources.xml
Normal file
12
labs/L14/.idea/dataSources.xml
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project version="4">
|
||||||
|
<component name="DataSourceManagerImpl" format="xml" multifile-model="true">
|
||||||
|
<data-source source="LOCAL" name=".coverage" uuid="af2f1fdd-3241-4470-93b5-53f58bcdd0d2">
|
||||||
|
<driver-ref>sqlite.xerial</driver-ref>
|
||||||
|
<synchronize>true</synchronize>
|
||||||
|
<jdbc-driver>org.sqlite.JDBC</jdbc-driver>
|
||||||
|
<jdbc-url>jdbc:sqlite:C:\Users\Isaac\OneDrive - University of New Brunswick\Year 3 UNB\CS2613\Git\cs2613-ishoebot\labs\L14\.coverage</jdbc-url>
|
||||||
|
<working-dir>$ProjectFileDir$</working-dir>
|
||||||
|
</data-source>
|
||||||
|
</component>
|
||||||
|
</project>
|
6
labs/L14/.idea/inspectionProfiles/profiles_settings.xml
Normal file
6
labs/L14/.idea/inspectionProfiles/profiles_settings.xml
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
<component name="InspectionProjectProfileManager">
|
||||||
|
<settings>
|
||||||
|
<option name="USE_PROJECT_PROFILE" value="false" />
|
||||||
|
<version value="1.0" />
|
||||||
|
</settings>
|
||||||
|
</component>
|
4
labs/L14/.idea/misc.xml
Normal file
4
labs/L14/.idea/misc.xml
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project version="4">
|
||||||
|
<component name="ProjectRootManager" version="2" project-jdk-name="Python 3.10 (L14)" project-jdk-type="Python SDK" />
|
||||||
|
</project>
|
8
labs/L14/.idea/modules.xml
Normal file
8
labs/L14/.idea/modules.xml
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project version="4">
|
||||||
|
<component name="ProjectModuleManager">
|
||||||
|
<modules>
|
||||||
|
<module fileurl="file://$PROJECT_DIR$/.idea/L14.iml" filepath="$PROJECT_DIR$/.idea/L14.iml" />
|
||||||
|
</modules>
|
||||||
|
</component>
|
||||||
|
</project>
|
6
labs/L14/.idea/vcs.xml
Normal file
6
labs/L14/.idea/vcs.xml
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project version="4">
|
||||||
|
<component name="VcsDirectoryMappings">
|
||||||
|
<mapping directory="$PROJECT_DIR$/../.." vcs="Git" />
|
||||||
|
</component>
|
||||||
|
</project>
|
BIN
labs/L14/__pycache__/client.cpython-310.pyc
Normal file
BIN
labs/L14/__pycache__/client.cpython-310.pyc
Normal file
Binary file not shown.
BIN
labs/L14/__pycache__/divisive.cpython-310.pyc
Normal file
BIN
labs/L14/__pycache__/divisive.cpython-310.pyc
Normal file
Binary file not shown.
BIN
labs/L14/__pycache__/humansize.cpython-310.pyc
Normal file
BIN
labs/L14/__pycache__/humansize.cpython-310.pyc
Normal file
Binary file not shown.
BIN
labs/L14/__pycache__/test_client.cpython-310-pytest-7.2.0.pyc
Normal file
BIN
labs/L14/__pycache__/test_client.cpython-310-pytest-7.2.0.pyc
Normal file
Binary file not shown.
BIN
labs/L14/__pycache__/test_divisive.cpython-310-pytest-7.2.0.pyc
Normal file
BIN
labs/L14/__pycache__/test_divisive.cpython-310-pytest-7.2.0.pyc
Normal file
Binary file not shown.
BIN
labs/L14/__pycache__/test_humansize.cpython-310-pytest-7.2.0.pyc
Normal file
BIN
labs/L14/__pycache__/test_humansize.cpython-310-pytest-7.2.0.pyc
Normal file
Binary file not shown.
16
labs/L14/client.py
Normal file
16
labs/L14/client.py
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
import humansize
|
||||||
|
|
||||||
|
|
||||||
|
def approximate_size(size):
|
||||||
|
"""Returns the size of a file in a human-readable format where kilobytes are 1000 bytes
|
||||||
|
|
||||||
|
:param size: the size of a file
|
||||||
|
:return: string
|
||||||
|
"""
|
||||||
|
return humansize.approximate_size(size, False)
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == '__main__': # pragma: no cover
|
||||||
|
print(approximate_size(1_000))
|
||||||
|
print(approximate_size(100_000_000))
|
||||||
|
print(approximate_size(1_000_000_000))
|
8
labs/L14/divisive.py
Normal file
8
labs/L14/divisive.py
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
import math
|
||||||
|
|
||||||
|
|
||||||
|
def fraction(a, b):
|
||||||
|
try:
|
||||||
|
return a / b
|
||||||
|
except ZeroDivisionError:
|
||||||
|
return math.nan
|
10
labs/L14/fizzbuzz.py
Normal file
10
labs/L14/fizzbuzz.py
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
if __name__ == '__main__':
|
||||||
|
for i in range(1, 101):
|
||||||
|
if i % 3 == 0 and i % 5 == 0:
|
||||||
|
print("FizzBuzz")
|
||||||
|
elif i % 3 == 0:
|
||||||
|
print("Fizz")
|
||||||
|
elif i % 5 == 0:
|
||||||
|
print("Buzz")
|
||||||
|
else:
|
||||||
|
print(i)
|
67
labs/L14/humansize.py
Normal file
67
labs/L14/humansize.py
Normal file
@ -0,0 +1,67 @@
|
|||||||
|
"""Convert file sizes to human-readable form.
|
||||||
|
|
||||||
|
Available functions:
|
||||||
|
approximate_size(size, a_kilobyte_is_1024_bytes)
|
||||||
|
takes a file size and returns a human-readable string
|
||||||
|
|
||||||
|
Examples:
|
||||||
|
>>> approximate_size(1024)
|
||||||
|
'1.0 KiB'
|
||||||
|
>>> approximate_size(1000, False)
|
||||||
|
'1.0 KB'
|
||||||
|
|
||||||
|
"""
|
||||||
|
|
||||||
|
SUFFIXES = {1000: ['KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'],
|
||||||
|
1024: ['KiB', 'MiB', 'GiB', 'TiB', 'PiB', 'EiB', 'ZiB', 'YiB']}
|
||||||
|
|
||||||
|
|
||||||
|
def approximate_size(size, a_kilobyte_is_1024_bytes=True):
|
||||||
|
"""Convert a file size to human-readable form.
|
||||||
|
|
||||||
|
Keyword arguments:
|
||||||
|
size -- file size in bytes
|
||||||
|
a_kilobyte_is_1024_bytes -- if True (default), use multiples of 1024
|
||||||
|
if False, use multiples of 1000
|
||||||
|
|
||||||
|
Returns: string
|
||||||
|
|
||||||
|
"""
|
||||||
|
if size < 0:
|
||||||
|
raise ValueError('number must be non-negative')
|
||||||
|
|
||||||
|
multiple = 1024 if a_kilobyte_is_1024_bytes else 1000
|
||||||
|
for suffix in SUFFIXES[multiple]:
|
||||||
|
size /= multiple
|
||||||
|
if size < multiple:
|
||||||
|
return '{0:.1f} {1}'.format(size, suffix)
|
||||||
|
|
||||||
|
raise ValueError('number too large')
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == '__main__': # pragma: no cover
|
||||||
|
print(approximate_size(1000000000000, False))
|
||||||
|
print(approximate_size(1000000000000))
|
||||||
|
|
||||||
|
# Copyright (c) 2009, Mark Pilgrim, All rights reserved.
|
||||||
|
#
|
||||||
|
# Redistribution and use in source and binary forms, with or without modification,
|
||||||
|
# are permitted provided that the following conditions are met:
|
||||||
|
#
|
||||||
|
# * Redistributions of source code must retain the above copyright notice,
|
||||||
|
# this list of conditions and the following disclaimer.
|
||||||
|
# * Redistributions in binary form must reproduce the above copyright notice,
|
||||||
|
# this list of conditions and the following disclaimer in the documentation
|
||||||
|
# and/or other materials provided with the distribution.
|
||||||
|
#
|
||||||
|
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS'
|
||||||
|
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
|
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||||
|
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||||
|
# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||||
|
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||||
|
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||||
|
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||||
|
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||||
|
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||||
|
# POSSIBILITY OF SUCH DAMAGE.
|
18
labs/L14/test_client.py
Normal file
18
labs/L14/test_client.py
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
import pytest
|
||||||
|
from client import approximate_size
|
||||||
|
|
||||||
|
|
||||||
|
def test_1kb():
|
||||||
|
assert approximate_size(1_000) == "1.0 KB"
|
||||||
|
|
||||||
|
|
||||||
|
def test_100mb():
|
||||||
|
assert approximate_size(100_000_000) == "100.0 MB"
|
||||||
|
|
||||||
|
|
||||||
|
def test_1gb():
|
||||||
|
assert approximate_size(1_000_000_000) == "1.0 GB"
|
||||||
|
|
||||||
|
|
||||||
|
def test_docstring():
|
||||||
|
assert approximate_size.__doc__ is not None
|
10
labs/L14/test_divisive.py
Normal file
10
labs/L14/test_divisive.py
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
from divisive import fraction
|
||||||
|
import math
|
||||||
|
|
||||||
|
|
||||||
|
def test_fraction_int():
|
||||||
|
assert fraction(4, 2) == 2
|
||||||
|
|
||||||
|
|
||||||
|
def test_fraction_NaN():
|
||||||
|
assert math.isnan(fraction(4, 0))
|
20
labs/L14/test_humansize.py
Normal file
20
labs/L14/test_humansize.py
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
import pytest
|
||||||
|
from humansize import approximate_size
|
||||||
|
|
||||||
|
|
||||||
|
def test_1000():
|
||||||
|
assert approximate_size(1000000000000, False) == "1.0 TB"
|
||||||
|
|
||||||
|
|
||||||
|
def test_1024():
|
||||||
|
assert approximate_size(1000000000000) == "931.3 GiB"
|
||||||
|
|
||||||
|
|
||||||
|
def test_negative():
|
||||||
|
with pytest.raises(ValueError):
|
||||||
|
approximate_size(-1)
|
||||||
|
|
||||||
|
|
||||||
|
def test_huge_number():
|
||||||
|
with pytest.raises(ValueError):
|
||||||
|
approximate_size(1_000_000_000_000_000_000_000_000_000_000)
|
Loading…
Reference in New Issue
Block a user