homa 0.23__py3-none-any.whl → 0.25__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of homa might be problematic. Click here for more details.

homa/__init__.py CHANGED
@@ -1,5 +1,4 @@
1
1
  from .main import *
2
- from .filters import *
3
2
  from .camera import *
4
3
  from .orientation import *
5
4
  from .spaces import *
@@ -7,3 +6,6 @@ from .events import *
7
6
  from .shapes import *
8
7
 
9
8
  from .helpers import *
9
+
10
+ from .classes.Window import Window
11
+ from .classes.Image import Image
homa/camera.py CHANGED
@@ -1,15 +1,18 @@
1
1
  import cv2
2
- from .classes.Repository import Repository
3
2
  from typing import Iterator
3
+ from .classes.Repository import Repository
4
+ from .classes.Window import Window
4
5
 
5
6
 
6
7
  def camera(delay: int = 10, exit_on: str = "q") -> Iterator[int]:
8
+ cameraWindow = Window(640, 480)
9
+
7
10
  pressed_key = None
8
11
  capture = cv2.VideoCapture(0)
9
12
  frame_number = 0
10
13
  while pressed_key != ord(exit_on):
11
14
  _, frame = capture.read()
12
- Repository.images["camera"] = frame
15
+ cameraWindow.update(frame)
13
16
 
14
17
  frame_number += 1
15
18
  yield frame_number
homa/classes/Image.py ADDED
@@ -0,0 +1,19 @@
1
+ from .Window import Window
2
+ from ..helpers.string import randomLowercaseString
3
+ import cv2
4
+
5
+
6
+ class Image(Window):
7
+ def __init__(self, filename: str | Window):
8
+ if isinstance(filename, Window):
9
+ image = filename.getImage()
10
+ title = f"{filename.getTitle()} Cloned"
11
+
12
+ elif isinstance(filename, str):
13
+ image = cv2.imread(filename)
14
+ title = filename
15
+
16
+ super().__init__(
17
+ image=image,
18
+ title=title
19
+ )
@@ -1,14 +1,16 @@
1
1
  from ..helpers.environment import is_colab
2
+ from ..helpers.string import randomLowercaseString
2
3
 
3
4
 
4
5
  class RepositoryWrapper:
5
6
  def __init__(self):
6
- self.sigmaX = 0
7
- self.sigmaY = 0
8
-
9
7
  self.directory = "./"
10
- self.images = {}
11
- self.windows = {}
8
+
9
+ self.settings = {
10
+ "thickness": 2,
11
+ "color": (0, 0, 0),
12
+ "sigma": [0, 0]
13
+ }
12
14
 
13
15
  if is_colab():
14
16
  from google.colab.patches import cv2_imshow as imshow
@@ -23,5 +25,11 @@ class RepositoryWrapper:
23
25
 
24
26
  self.imshow = final_imshow
25
27
 
28
+ def addImageWithRandomKey(self, image):
29
+ self.addImage(randomLowercaseString(), image)
30
+
31
+ def addImage(self, key, image):
32
+ Repository.images[key] = image
33
+
26
34
 
27
35
  Repository = RepositoryWrapper()
homa/classes/Window.py ADDED
@@ -0,0 +1,115 @@
1
+ import numpy
2
+ import cv2
3
+
4
+ from ..helpers.kernel import createKernel
5
+ from ..helpers.string import randomLowercaseString
6
+
7
+ from ..classes.Repository import Repository
8
+
9
+ from ..events import createMouseCallback
10
+
11
+ from typing_extensions import Self
12
+ from typing import List
13
+
14
+ from ..shapes import color
15
+ from ..shapes import stroke
16
+
17
+ from ..main import setting
18
+
19
+
20
+ class Window:
21
+ def __init__(self, width: int = 300, height: int = 300, image=None, title: str | None = None, channels: int = 3, dtype="uint8") -> None:
22
+ if title is None:
23
+ title = randomLowercaseString(10)
24
+
25
+ if image is None:
26
+ image = numpy.zeros([height, width, channels], dtype=dtype)
27
+
28
+ self.__title = title
29
+ self.__image = image
30
+ self.__events = {}
31
+
32
+ def show(self):
33
+ cv2.namedWindow(self.__title)
34
+ cv2.setMouseCallback(self.__title, createMouseCallback(self.__events))
35
+ Repository.imshow(self.__title, self.__image)
36
+
37
+ def title(self, newTitle: str) -> Self:
38
+ self.__title = newTitle
39
+ return self
40
+
41
+ def update(self, newImage) -> Self:
42
+ self.__image = newImage
43
+ self.refresh()
44
+ return self
45
+
46
+ def click(self, handler: callable) -> Self:
47
+ self.__events["click"] = (handler, self)
48
+ return self
49
+
50
+ def move(self, handler: callable) -> Self:
51
+ self.__events["mousemove"] = (handler, self)
52
+ return self
53
+
54
+ def white(self) -> Self:
55
+ self.__image = numpy.ones([
56
+ self.__image.shape[0],
57
+ self.__image.shape[1],
58
+ self.__image.shape[2]
59
+ ]) * (2 ** 8 - 1)
60
+ return self
61
+
62
+ def blur(self, kernel: int | List[int] = (7, 7)) -> Self:
63
+ self.update(cv2.blur(
64
+ self.__image,
65
+ createKernel(kernel),
66
+ ))
67
+
68
+ return self
69
+
70
+ def gaussian(self, kernel: int | List[int] = (7, 7)) -> Self:
71
+ self.update(cv2.GaussianBlur(
72
+ self.__image,
73
+ createKernel(kernel),
74
+ setting("sigma")[0],
75
+ setting("sigma")[1],
76
+ ))
77
+
78
+ return self
79
+
80
+ def median(self, kernel: int) -> Self:
81
+ self.update(cv2.medianBlur(
82
+ self.__image, kernel
83
+ ))
84
+
85
+ return self
86
+
87
+ def refresh(self):
88
+ Repository.imshow(self.__title, self.__image)
89
+
90
+ def circle(self, x: int, y: int, radius: int, circleColor: tuple | None = None, thickness: int | None = None):
91
+ if circleColor is not None:
92
+ color(*circleColor)
93
+
94
+ if thickness is not None:
95
+ stroke(thickness)
96
+
97
+ self.update(cv2.circle(
98
+ self.__image,
99
+ (x, y),
100
+ radius,
101
+ setting("color"),
102
+ setting("thickness")
103
+ ))
104
+
105
+ def getImage(self):
106
+ return self.__image
107
+
108
+ def getTitle(self):
109
+ return self.__title
110
+
111
+ def __getattr__(self, key):
112
+ if key == "shape":
113
+ return self.__image.shape
114
+
115
+ return None
homa/events.py CHANGED
@@ -1,21 +1,6 @@
1
- # enum MouseEventTypes
2
- # {
3
- # EVENT_MOUSEMOVE = 0,
4
- # EVENT_LBUTTONDOWN = 1,
5
- # EVENT_RBUTTONDOWN = 2,
6
- # EVENT_MBUTTONDOWN = 3,
7
- # EVENT_LBUTTONUP = 4,
8
- # EVENT_RBUTTONUP = 5,
9
- # EVENT_MBUTTONUP = 6,
10
- # EVENT_LBUTTONDBLCLK = 7,
11
- # EVENT_RBUTTONDBLCLK = 8,
12
- # EVENT_MBUTTONDBLCLK = 9,
13
- # EVENT_MOUSEWHEEL = 10,
14
- # EVENT_MOUSEHWHEEL = 11,
15
- # };
16
1
  import cv2
17
- from .main import win
18
2
  from inspect import signature
3
+ from .classes.Repository import Repository
19
4
 
20
5
  event_map = {
21
6
  "click": cv2.EVENT_LBUTTONDOWN,
@@ -25,46 +10,31 @@ event_map = {
25
10
  "rmouseup": cv2.EVENT_RBUTTONUP,
26
11
  "dblclick": cv2.EVENT_LBUTTONDBLCLK,
27
12
  "rdblclick": cv2.EVENT_RBUTTONDBLCLK,
28
- "move": cv2.EVENT_MOUSEMOVE
13
+ "mousemove": cv2.EVENT_MOUSEMOVE
29
14
  }
30
15
 
31
16
 
32
- def create_wrapper_function(event_name: str, handler: callable):
33
- def wrapper_function(event, x, y, flags, param):
34
- if event != event_map[event_name]:
35
- return
36
-
37
- argument_count = len(signature(handler).parameters)
38
- if argument_count == 2:
39
- handler(x, y)
40
- elif argument_count == 3:
41
- handler(x, y, flags)
42
- elif argument_count == 4:
43
- handler(x, y, flags, param)
44
-
45
- return wrapper_function
46
-
47
-
48
- def onClick(key: str, handler: callable):
49
- win(key)
50
- cv2.setMouseCallback(key, create_wrapper_function("click", handler))
51
-
52
-
53
- def onRightClick(key: str, handler: callable):
54
- win(key)
55
- cv2.setMouseCallback(key, create_wrapper_function("rclick", handler))
56
-
57
-
58
- def onMouseUp(key: str, handler: callable):
59
- win(key)
60
- cv2.setMouseCallback(key, create_wrapper_function("mouseup", handler))
61
-
62
-
63
- def onMove(key: str, handler: callable):
64
- win(key)
65
- cv2.setMouseCallback(key, create_wrapper_function("mousemove", handler))
66
-
67
-
68
- def onDoubleClick(key: str, handler: callable):
69
- win(key)
70
- cv2.setMouseCallback(key, create_wrapper_function("dblclick", handler))
17
+ def createMouseCallback(events: dict):
18
+ def innerMouseCallback(event, x, y, flags, param):
19
+ for e, values in events.items():
20
+ if event != event_map[e]:
21
+ continue
22
+
23
+ handler, context = values
24
+ argumentCount = len(signature(handler).parameters)
25
+ if argumentCount == 2:
26
+ args = (x, y)
27
+ elif argumentCount == 3:
28
+ args = (x, y, context)
29
+ elif argumentCount == 4:
30
+ args = (x, y, context, flags)
31
+ elif argumentCount == 5:
32
+ args = (x, y, context, flags, param)
33
+ elif argumentCount == 1:
34
+ args = (context,)
35
+ elif args == 0:
36
+ args = tuple()
37
+
38
+ handler(*args)
39
+
40
+ return innerMouseCallback
homa/helpers/alias.py CHANGED
@@ -1,13 +1,17 @@
1
1
  from ..classes.Repository import Repository
2
- from ..classes import Collection
2
+ from ..classes.Collection import Collection
3
3
  from typing import List
4
4
 
5
5
 
6
- def repo(key: str|None = None):
7
- if key is None:
6
+ def repo(key: str | None = None, value: any = None) -> any:
7
+ if key is None and value is None:
8
8
  return Repository.images
9
9
 
10
- return Repository.images[key]
10
+ if key is not None and value is None:
11
+ return Repository.addImage(key, value)
12
+
13
+ Repository.addImage(key, value)
14
+ return True
11
15
 
12
16
 
13
17
  def collection(items: List[any]):
homa/helpers/kernel.py CHANGED
@@ -1,7 +1,7 @@
1
1
  from typing import Tuple
2
2
 
3
3
 
4
- def create_kernel(value: int | Tuple[int, int]) -> Tuple[int, int]:
4
+ def createKernel(value: int | Tuple[int, int]) -> Tuple[int, int]:
5
5
  if isinstance(value, tuple):
6
6
  x, y = value
7
7
 
homa/helpers/string.py ADDED
@@ -0,0 +1,16 @@
1
+ import numpy
2
+ import string
3
+
4
+
5
+ def randomLowercaseString(length: int = 10):
6
+ return randomString(length, string.ascii_lowercase)
7
+
8
+
9
+ def randomUppercaseString(length: int = 10):
10
+ return randomString(length, string.ascii_uppercase)
11
+
12
+
13
+ def randomString(length: int = 10, letters: str = string.ascii_letters):
14
+ return "".join(
15
+ numpy.random.choice(list(letters), length)
16
+ )
homa/main.py CHANGED
@@ -1,5 +1,4 @@
1
1
  import cv2
2
- from .classes.Logger import Logger
3
2
  from .classes.Repository import Repository
4
3
 
5
4
 
@@ -11,36 +10,12 @@ def destroy(key: str | None = None) -> None:
11
10
  cv2.destroyAllWindows()
12
11
 
13
12
 
14
- def win(key: str):
15
- cv2.namedWindow(key)
13
+ def show(*windows, **settings):
14
+ for window in windows:
15
+ window.show()
16
16
 
17
-
18
- def path(directory: str) -> None:
19
- Repository.directory = directory
20
-
21
-
22
- def write(key: str, filename: str) -> None:
23
- cv2.imwrite(
24
- filename=filename,
25
- img=Repository.images[key]
26
- )
27
-
28
-
29
- def save(*args, **kwargs) -> None:
30
- write(args, kwargs)
31
-
32
-
33
- def image(filename: str, key: str | None = None, color: bool = True) -> None:
34
- # TODO: add no extension in the file
35
- if key is None:
36
- key = filename.split(".")[0]
37
-
38
- Repository.images[key] = cv2.imread(filename, int(color))
39
- return Repository.images[key]
40
-
41
-
42
- def wait(delay=0):
43
- cv2.waitKey(delay)
17
+ if settings["wait"] == True:
18
+ cv2.waitKey()
44
19
 
45
20
 
46
21
  def showWait(*args, **kwargs):
@@ -48,28 +23,10 @@ def showWait(*args, **kwargs):
48
23
  show(*args, **kwargs)
49
24
 
50
25
 
51
- def show(key: any = None, wait: bool = False, window: str = "Homa Window") -> None:
52
- # TODO: add functionality to distinguish between camera and images
53
-
54
- if key is not None and not isinstance(key, str):
55
- Repository.imshow(window, key)
56
- Repository.windows[key] = window
57
-
58
- elif key is None:
59
- for key, image in Repository.images.items():
60
- Repository.imshow(key, image)
61
- Repository.windows[key] = key
62
-
63
- elif key is not None:
64
- if key in Repository.images:
65
- Repository.imshow(key, Repository.images[key])
66
- Repository.windows[key] = key
67
- else:
68
- Logger.danger(f"No image found with key {key}")
69
-
70
- if wait:
71
- cv2.waitKey(0)
72
-
26
+ def setting(key: str, value: any = None) -> any:
27
+ if value is not None:
28
+ Repository.settings[key] = value
29
+ return True
73
30
 
74
- def refresh(key: str) -> None:
75
- cv2.imshow(Repository.windows[key], Repository.images[key])
31
+ setting_value = Repository.settings[key]
32
+ return setting_value if setting_value else None
homa/shapes.py CHANGED
@@ -1,9 +1,50 @@
1
1
  import cv2
2
- from .main import refresh
2
+ from .main import setting
3
3
  from .helpers.alias import repo
4
- from .classes.Repository import Repository
4
+ from typing import Tuple
5
+ import numpy
5
6
 
6
7
 
7
- def circle(key: str, x: int = 0, y: int = 0, r: int = 1, color=(0, 0, 255), thickness: int = 1):
8
- cv2.circle(repo(key), (x, y), r, color, thickness)
9
- refresh(key)
8
+ def stroke(value: int = 1):
9
+ setting("thickness", value)
10
+
11
+
12
+ def fill(*args):
13
+ setting("thickness", -1)
14
+
15
+ if len(args) == 3:
16
+ color(*args)
17
+
18
+
19
+ def randomColor() -> Tuple[int, int, int]:
20
+ r = numpy.random.randint(0, 255)
21
+ g = numpy.random.randint(0, 255)
22
+ b = numpy.random.randint(0, 255)
23
+
24
+ return (b, g, r)
25
+
26
+
27
+ def color(*args):
28
+ if len(args) == 1 and isinstance(args[0], str) and args[0] in ["random", "rand"]:
29
+ args = randomColor()
30
+
31
+ setting("color", args)
32
+
33
+
34
+ def circle(key: str, x: int, y: int, radius: int = 1):
35
+ cv2.circle(
36
+ repo(key),
37
+ (x, y),
38
+ radius,
39
+ setting("color"),
40
+ setting("thickness")
41
+ )
42
+
43
+
44
+ def rect(key: str, x: int, y: int, width: int, height: int):
45
+ cv2.rectangle(
46
+ repo(key),
47
+ (x - width // 2, y - height // 2), (x + width // 2, y + height // 2),
48
+ thickness=setting("thickness"),
49
+ color=setting("color")
50
+ )
homa/spaces.py CHANGED
@@ -1,8 +1,24 @@
1
1
  from typing import Tuple
2
2
  from .helpers.alias import repo
3
+ import cv2
3
4
 
4
5
 
5
- def rgb(key: str) -> Tuple[int, int, int]:
6
+ def hsv(key: str):
7
+ image = repo(key)
8
+ cv2.cvtColor(image, cv2.COLOR_BGR2HSV)
9
+
10
+ h = image[:, :, 0]
11
+ s = image[:, :, 1]
12
+ v = image[:, :, 2]
13
+
14
+ return (h, s, v)
15
+
16
+
17
+ def bgr(key: str) -> Tuple[int, int, int]:
18
+ return rgb(key, bgr_flag=True)
19
+
20
+
21
+ def rgb(key: str, bgr_flag: bool = False) -> Tuple[int, int, int]:
6
22
  image = repo(key)
7
23
 
8
24
  if image.shape[2] == 3:
@@ -13,6 +29,9 @@ def rgb(key: str) -> Tuple[int, int, int]:
13
29
  g = image[:, :, 0]
14
30
  r = image[:, :, 0]
15
31
 
32
+ if bgr_flag:
33
+ return (b, g, r)
34
+
16
35
  return (r, g, b)
17
36
 
18
37
  if image.shape[2] == 1:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: homa
3
- Version: 0.23
3
+ Version: 0.25
4
4
  Maintainer: Taha Shieenavaz
5
5
  Maintainer-email: tahashieenavaz@gmail.com
6
6
  Description-Content-Type: text/markdown
@@ -27,6 +27,10 @@ Images could be loaded with the `image` helper, that accepts the file name and a
27
27
  from homa import *
28
28
 
29
29
  image("horse.jpg", "horse")
30
+ show("horse", wait=True)
31
+
32
+ # or alternatively
33
+ showWait("horse")
30
34
  ```
31
35
 
32
36
  Alternatively, following code will load the file into the repository with a key of everything before the last in the filename.
@@ -35,6 +39,7 @@ Alternatively, following code will load the file into the repository with a key
35
39
  from homa import *
36
40
 
37
41
  image("horse.jpg") # stored as "horse"
42
+ showWait("horse")
38
43
  ```
39
44
 
40
45
  ## Smoothing
@@ -67,6 +72,20 @@ gaussian("horse", 9, "gaussian blurred horse") # as a new key in the repositor
67
72
  showWait("gaussian blurred horse")
68
73
  ```
69
74
 
75
+ ### Median Blur
76
+
77
+ ```python
78
+ from homa import *
79
+
80
+ image("horse.jpg")
81
+
82
+ median("horse", 7) # rewrites "horse" key
83
+ median("horse", (7, 19)) # rewrites "horse" key
84
+ median("horse", 9, "median blurred horse") # as a new key in the repository
85
+
86
+ showWait("median blurred horse")
87
+ ```
88
+
70
89
  ## Stacking
71
90
 
72
91
  ```python
@@ -0,0 +1,28 @@
1
+ homa/__init__.py,sha256=N3G5CLd0gFelUgQzWFj0IGI_8TUMlX8GfyWFp9lrWb0,228
2
+ homa/camera.py,sha256=erui7LWTqZQNBVVxIChw-JCrYchpUjgplgU7d5jSR-E,527
3
+ homa/constants.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
4
+ homa/events.py,sha256=WTVUPh0MqRiknA390_vvMSFNhdFeX9iZCrBphGbdTHY,1223
5
+ homa/filters.py,sha256=lEwUZtCUSH59D4J9lWQ-d0ObSk_ikZBGRnNAZWMnpPo,1058
6
+ homa/helpers.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
7
+ homa/main.py,sha256=jFVKuW1mNS21As7pY4XnXVQ6TaDOHxC2dAmUzE5HG-U,660
8
+ homa/orientation.py,sha256=kR7mEmbjCdyxNeQ7UuGpwTFD6EaNbXmErzaln3gpzfk,804
9
+ homa/shapes.py,sha256=0_THluO4mUg1F4FmP4YQuB5A3W4Ns9Z2tPmhmSyTBlI,1044
10
+ homa/spaces.py,sha256=W2UjzEP54dDgOV4c8xNCu8qJ__j-hwRbnyIOGnwpHwE,804
11
+ homa/classes/Collection.py,sha256=7hskbC8wxTAC3hHmFYXtzR5W05lsA4GaYTzjiez_6Zg,222
12
+ homa/classes/Image.py,sha256=kpIZQjJMUcT9b2V1daX87KFQooAtsHUDR4Fcgk9Qfco,490
13
+ homa/classes/Logger.py,sha256=2VjXJzBLMW5joArFpu2wGrbWUw7S-77z7LNhKUG1Iow,93
14
+ homa/classes/Repository.py,sha256=vvX36nK-sN0eQAf7vNR2KVwosj76VCeQwaGT5pw8Lkw,840
15
+ homa/classes/Window.py,sha256=orhuI7RmM5I_bmlWicR1G-be74EEexHixCuYIX46Y3E,2941
16
+ homa/classes/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
17
+ homa/helpers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
18
+ homa/helpers/alias.py,sha256=Gv4esGK5SWKbmqvFUAKUfzDqlofdC27ZtndXxfaxE7E,453
19
+ homa/helpers/environment.py,sha256=I7rD9B5zv3W8lkspntcshm5PZZRRSW81OqIjKOdZW6U,78
20
+ homa/helpers/kernel.py,sha256=QIbwvx3XzG23TMCj7nUOgSirx3WK_29lkBeVlp2uzQw,329
21
+ homa/helpers/string.py,sha256=nyNcQgZ9l5zf0QwI5gZCMX4dqMWi63VCqtl26ExDZsI,385
22
+ tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
23
+ tests/test_images.py,sha256=4k5tDcMc2YZOKAq3wNQnbJ_cO1Y_DQ-YUn82yzy__ww,772
24
+ homa-0.25.dist-info/LICENSE,sha256=js3WDbJn9k5EN6sy1uuP2QBXxyPgS5DjO4Bf5yE35hQ,1072
25
+ homa-0.25.dist-info/METADATA,sha256=wcp0pCuuQkPF9GxcanpkT6Ci_b1f17ogjsQiyAtYgfo,2472
26
+ homa-0.25.dist-info/WHEEL,sha256=G16H4A3IeoQmnOrYV4ueZGKSjhipXx8zc8nu9FGlvMA,92
27
+ homa-0.25.dist-info/top_level.txt,sha256=i1-Cx_lkcOD5QJEK9JYp1uDEBhtshAN7No-99mhpOZ0,11
28
+ homa-0.25.dist-info/RECORD,,
@@ -1,25 +0,0 @@
1
- homa/__init__.py,sha256=fImpDDouSHoDdq-q-O0p8RirzGTgXXRI4Ol_LU4f9sI,182
2
- homa/camera.py,sha256=PHZb3sX0EFdwLDixYindluVDftg6JZlG_Ssbd3hgiNE,464
3
- homa/constants.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
4
- homa/events.py,sha256=Q077YcaM8-VjfKYhPQCQ7dasdu-mACKMf5cupiLNDoY,1946
5
- homa/filters.py,sha256=lEwUZtCUSH59D4J9lWQ-d0ObSk_ikZBGRnNAZWMnpPo,1058
6
- homa/helpers.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
7
- homa/main.py,sha256=1bRjOrU-Frdlj5a1cLvM2pUVLpk3K9EK6J0bFBC5hQU,1774
8
- homa/orientation.py,sha256=kR7mEmbjCdyxNeQ7UuGpwTFD6EaNbXmErzaln3gpzfk,804
9
- homa/shapes.py,sha256=MVZWkOtqkby8KiL04mK4nrirDGeQM3k8dDEZIpDt8AU,283
10
- homa/spaces.py,sha256=yEIXofkM0ebvRBbRp-e7epETHW_xmwSrCoTyYUYV-uA,460
11
- homa/classes/Collection.py,sha256=7hskbC8wxTAC3hHmFYXtzR5W05lsA4GaYTzjiez_6Zg,222
12
- homa/classes/Logger.py,sha256=2VjXJzBLMW5joArFpu2wGrbWUw7S-77z7LNhKUG1Iow,93
13
- homa/classes/Repository.py,sha256=w7hlbj6QIWNV2lWNs5-j6OXacSm6UGQ9DtX1zxaUA7c,589
14
- homa/classes/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
15
- homa/helpers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
16
- homa/helpers/alias.py,sha256=a-wq7UUnT_nYIh5nP-bc_EZb-0zF5VfnKwVhSuLSjw8,288
17
- homa/helpers/environment.py,sha256=I7rD9B5zv3W8lkspntcshm5PZZRRSW81OqIjKOdZW6U,78
18
- homa/helpers/kernel.py,sha256=sAdIW92coy0BoAPlk5Ez4sE5iFU207TU7OfjP7sPSkM,330
19
- tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
20
- tests/test_images.py,sha256=4k5tDcMc2YZOKAq3wNQnbJ_cO1Y_DQ-YUn82yzy__ww,772
21
- homa-0.23.dist-info/LICENSE,sha256=js3WDbJn9k5EN6sy1uuP2QBXxyPgS5DjO4Bf5yE35hQ,1072
22
- homa-0.23.dist-info/METADATA,sha256=rBFjHYZz3mSqydiHvPLzLoTGAbMtkJF18zVnqPZvcUk,2071
23
- homa-0.23.dist-info/WHEEL,sha256=G16H4A3IeoQmnOrYV4ueZGKSjhipXx8zc8nu9FGlvMA,92
24
- homa-0.23.dist-info/top_level.txt,sha256=i1-Cx_lkcOD5QJEK9JYp1uDEBhtshAN7No-99mhpOZ0,11
25
- homa-0.23.dist-info/RECORD,,
File without changes
File without changes