cratonapi 0.1.0__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.
Files changed (58) hide show
  1. cratonapi/__init__.py +8 -0
  2. cratonapi/dataconnector.py +99 -0
  3. cratonapi/datacontainers/__init__.py +11 -0
  4. cratonapi/datacontainers/color.py +9 -0
  5. cratonapi/datacontainers/grid.py +18 -0
  6. cratonapi/datacontainers/griddisplayproperties.py +22 -0
  7. cratonapi/datacontainers/gridinfo.py +9 -0
  8. cratonapi/datacontainers/stratigraphiclevel.py +8 -0
  9. cratonapi/datacontainers/well.py +11 -0
  10. cratonapi/datacontainers/wellcurve.py +11 -0
  11. cratonapi/datacontainers/wellhodograph.py +10 -0
  12. cratonapi/datacontainers/wellinfo.py +7 -0
  13. cratonapi/datacontainers/wellstratigraphiclevel.py +7 -0
  14. cratonapi/datacontainers/welltrajectory.py +11 -0
  15. cratonapi/ioconnections/__init__.py +4 -0
  16. cratonapi/ioconnections/iobase.py +23 -0
  17. cratonapi/ioconnections/iofile.py +30 -0
  18. cratonapi/ioconnections/iopipe.py +77 -0
  19. cratonapi/ioconnections/ioreader.py +30 -0
  20. cratonapi/parsers/__init__.py +0 -0
  21. cratonapi/parsers/dataparsers/__init__.py +12 -0
  22. cratonapi/parsers/dataparsers/griddisplaypropertiesparser.py +73 -0
  23. cratonapi/parsers/dataparsers/gridlistparser.py +31 -0
  24. cratonapi/parsers/dataparsers/gridparser.py +36 -0
  25. cratonapi/parsers/dataparsers/stratigraphiclevelsparser.py +31 -0
  26. cratonapi/parsers/dataparsers/wellcurvesparser.py +43 -0
  27. cratonapi/parsers/dataparsers/wellhodographparser.py +31 -0
  28. cratonapi/parsers/dataparsers/welllistparser.py +31 -0
  29. cratonapi/parsers/dataparsers/wellsparser.py +33 -0
  30. cratonapi/parsers/dataparsers/wellstratigraphiclevelsparser.py +27 -0
  31. cratonapi/parsers/dataparsers/welltrajectoryparser.py +34 -0
  32. cratonapi/parsers/signalparsers/__init__.py +4 -0
  33. cratonapi/parsers/signalparsers/griddisplaypropertieschangesignalparser.py +8 -0
  34. cratonapi/parsers/signalparsers/signalcodeparser.py +23 -0
  35. cratonapi/requests/__init__.py +0 -0
  36. cratonapi/requests/datarequests/__init__.py +12 -0
  37. cratonapi/requests/datarequests/griddisplaypropertiesrequest.py +10 -0
  38. cratonapi/requests/datarequests/gridlistrequest.py +10 -0
  39. cratonapi/requests/datarequests/gridrequest.py +10 -0
  40. cratonapi/requests/datarequests/stratigraphiclevellistrequest.py +10 -0
  41. cratonapi/requests/datarequests/wellcurvesrequest.py +10 -0
  42. cratonapi/requests/datarequests/wellhodographrequest.py +10 -0
  43. cratonapi/requests/datarequests/welllistrequest.py +10 -0
  44. cratonapi/requests/datarequests/wellsrequest.py +28 -0
  45. cratonapi/requests/datarequests/wellstratigraphiclevellistrequest.py +10 -0
  46. cratonapi/requests/datarequests/welltrajectoryrequest.py +10 -0
  47. cratonapi/requests/utilityrequests/__init__.py +1 -0
  48. cratonapi/requests/utilityrequests/dataconnectorgreetingrequest.py +8 -0
  49. cratonapi/requests/utilityrequests/listenergreetingrequest.py +17 -0
  50. cratonapi/signalconnector.py +35 -0
  51. cratonapi/signals/__init__.py +4 -0
  52. cratonapi/signals/abstractsignal.py +7 -0
  53. cratonapi/signals/griddisplaypropertieschangedsignal.py +8 -0
  54. cratonapi/signals/gridlistchangedsignal.py +8 -0
  55. cratonapi/signals/signaltype.py +6 -0
  56. cratonapi-0.1.0.dist-info/METADATA +16 -0
  57. cratonapi-0.1.0.dist-info/RECORD +58 -0
  58. cratonapi-0.1.0.dist-info/WHEEL +4 -0
cratonapi/__init__.py ADDED
@@ -0,0 +1,8 @@
1
+ import cratonapi.datacontainers
2
+ import cratonapi.ioconnections
3
+ import cratonapi.parsers
4
+ import cratonapi.requests
5
+ import cratonapi.signals
6
+
7
+ from .dataconnector import DataConnector
8
+ from .signalconnector import SignalConnector
@@ -0,0 +1,99 @@
1
+ import numpy as np
2
+
3
+ from cratonapi.datacontainers import (
4
+ Grid,
5
+ GridDisplayProperties,
6
+ WellHodograph,
7
+ WellTrajectory,
8
+ )
9
+ from cratonapi.ioconnections import IOBase, IOPipe
10
+ from cratonapi.parsers.dataparsers import *
11
+ from cratonapi.requests.datarequests import *
12
+ from cratonapi.requests.utilityrequests import dataconnectorgreetingrequest
13
+
14
+
15
+ class DataConnector:
16
+ connection: IOBase
17
+ app_id: int
18
+
19
+ def __init__(self, connection: IOBase, new_app_id: int = 1):
20
+ self.connection = connection
21
+ self.app_id = new_app_id
22
+ self.__greeting()
23
+
24
+ def __greeting(self) -> None:
25
+ message = dataconnectorgreetingrequest.request(self.app_id)
26
+ self.connection.write(message)
27
+
28
+ def get_wells_list(self) -> np.ndarray:
29
+ """Request code 1"""
30
+ message = welllistrequest.request()
31
+ self.connection.write(message)
32
+ answer = self.connection.read()
33
+ return welllistparser.parse(answer)
34
+
35
+ def get_wells_data(self, count: int = 0, *wells_ids: int) -> np.ndarray:
36
+ """Request code 2"""
37
+ message = wellsrequest.request(count, *wells_ids)
38
+ self.connection.write(message)
39
+ answer = self.connection.read()
40
+ return wellsparser.parse(answer)
41
+
42
+ def get_well_curves(self, well_id: int) -> np.ndarray:
43
+ """Request code 3"""
44
+ message = wellcurvesrequest.request(well_id)
45
+ self.connection.write(message)
46
+ answer = self.connection.read()
47
+ return wellcurvesparser.parse(answer)
48
+
49
+ def get_stratigraphic_levels(self) -> np.ndarray:
50
+ """Request code 4"""
51
+ message = stratigraphiclevellistrequest.request()
52
+ self.connection.write(message)
53
+ answer = self.connection.read()
54
+ return stratigraphiclevelsparser.parse(answer)
55
+
56
+ def get_well_stratigraphic_levels(self, well_id: int) -> np.ndarray:
57
+ """Request code 5"""
58
+ message = wellstratigraphiclevellistrequest.request(well_id)
59
+ self.connection.write(message)
60
+ answer = self.connection.read()
61
+ return wellstratigraphiclevelsparser.parse(answer)
62
+
63
+ def get_grids_list(self) -> np.ndarray:
64
+ """Request code 6"""
65
+ message = gridlistrequest.request()
66
+ self.connection.write(message)
67
+ answer = self.connection.read()
68
+ return gridlistparser.parse(answer)
69
+
70
+ def get_grid(self, grid_id: int) -> Grid:
71
+ """Request code 7"""
72
+ message = gridrequest.request(grid_id)
73
+ self.connection.write(message)
74
+ answer = self.connection.read()
75
+ return gridparser.parse(answer)
76
+
77
+ def get_well_hodograph(self, well_id: int) -> WellHodograph:
78
+ """Request code 8"""
79
+ message = wellhodographrequest.request(well_id)
80
+ self.connection.write(message)
81
+ answer = self.connection.read()
82
+ return wellhodographparser.parse(answer)
83
+
84
+ def get_well_trajectory(self, well_id: int) -> WellTrajectory:
85
+ """Request code 9"""
86
+ message = welltrajectoryrequest.request(well_id)
87
+ self.connection.write(message)
88
+ answer = self.connection.read()
89
+ return welltrajectoryparser.parse(answer)
90
+
91
+ def get_grid_display_properties(self, grid_id: int) -> GridDisplayProperties:
92
+ """Request code 10"""
93
+ message = griddisplaypropertiesrequest.request(grid_id)
94
+ self.connection.write(message)
95
+ answer = self.connection.read()
96
+ return griddisplaypropertiesparser.parse(answer)
97
+
98
+ def disconnect(self) -> None:
99
+ self.connection.disconnect()
@@ -0,0 +1,11 @@
1
+ from .color import Color
2
+ from .grid import Grid
3
+ from .griddisplayproperties import GridDisplayProperties
4
+ from .gridinfo import GridInfo
5
+ from .stratigraphiclevel import StratigraphicLevel
6
+ from .well import Well
7
+ from .wellcurve import WellCurve
8
+ from .wellhodograph import WellHodograph
9
+ from .wellinfo import WellInfo
10
+ from .wellstratigraphiclevel import WellStratigraphicLevel
11
+ from .welltrajectory import WellTrajectory
@@ -0,0 +1,9 @@
1
+ from dataclasses import dataclass
2
+
3
+
4
+ @dataclass
5
+ class Color:
6
+ alpha: int
7
+ red: int
8
+ green: int
9
+ blue: int
@@ -0,0 +1,18 @@
1
+ from dataclasses import dataclass
2
+
3
+ from numpy import ndarray
4
+
5
+
6
+ @dataclass
7
+ class Grid:
8
+ n_id: int
9
+ n_x: int
10
+ n_y: int
11
+ x_min: float
12
+ x_max: float
13
+ y_min: float
14
+ y_max: float
15
+ z_min: float
16
+ z_max: float
17
+ blank_code: float
18
+ data: ndarray
@@ -0,0 +1,22 @@
1
+ from dataclasses import dataclass
2
+
3
+ from numpy import ndarray
4
+
5
+ from . import Color
6
+
7
+
8
+ @dataclass
9
+ class GridDisplayProperties:
10
+ isoline_min_level: float
11
+ isoline_max_level: float
12
+ isoline_level_step: float
13
+ minor_isoline_color: Color
14
+ minor_isoline_thickness: float
15
+ major_isoline_color: Color
16
+ major_isoline_thickness: float
17
+ major_isoline_step: int
18
+ min_palette_level: float
19
+ max_palette_level: float
20
+ color_interpolation_type: int
21
+ palette_values: ndarray
22
+ palette_colors: ndarray
@@ -0,0 +1,9 @@
1
+ from dataclasses import dataclass
2
+
3
+
4
+ @dataclass
5
+ class GridInfo:
6
+ grid_id: int
7
+ grid_name: str
8
+ grid_type: int
9
+ grid_visibility: int
@@ -0,0 +1,8 @@
1
+ from dataclasses import dataclass
2
+
3
+
4
+ @dataclass
5
+ class StratigraphicLevel:
6
+ level_id: int
7
+ level_age: float
8
+ level_name: str
@@ -0,0 +1,11 @@
1
+ from dataclasses import dataclass
2
+
3
+
4
+ @dataclass
5
+ class Well:
6
+ well_id: int
7
+ well_name: str
8
+ outfall_x: float
9
+ outfall_y: float
10
+ altitude: float
11
+ bottom: float
@@ -0,0 +1,11 @@
1
+ from dataclasses import dataclass
2
+
3
+ from numpy import ndarray
4
+
5
+
6
+ @dataclass
7
+ class WellCurve:
8
+ curve_type: int
9
+ curve_name: str
10
+ point_values: ndarray
11
+ point_depths: ndarray
@@ -0,0 +1,10 @@
1
+ from dataclasses import dataclass
2
+
3
+ from numpy import ndarray
4
+
5
+
6
+ @dataclass
7
+ class WellHodograph:
8
+ time_shift: float
9
+ point_times: ndarray
10
+ point_depths: ndarray
@@ -0,0 +1,7 @@
1
+ from dataclasses import dataclass
2
+
3
+
4
+ @dataclass
5
+ class WellInfo:
6
+ well_id: int
7
+ well_name: str
@@ -0,0 +1,7 @@
1
+ from dataclasses import dataclass
2
+
3
+
4
+ @dataclass
5
+ class WellStratigraphicLevel:
6
+ level_id: int
7
+ level_depth: float
@@ -0,0 +1,11 @@
1
+ from dataclasses import dataclass
2
+
3
+ from numpy import ndarray
4
+
5
+
6
+ @dataclass
7
+ class WellTrajectory:
8
+ point_depths: ndarray
9
+ point_x_shifts: ndarray
10
+ point_y_shifts: ndarray
11
+ point_z_shifts: ndarray
@@ -0,0 +1,4 @@
1
+ from .iobase import IOBase
2
+ from .iofile import IOFile
3
+ from .iopipe import IOPipe
4
+ from .ioreader import IOReader
@@ -0,0 +1,23 @@
1
+ from abc import ABC, abstractmethod
2
+
3
+
4
+ class IOBase(ABC):
5
+ @abstractmethod
6
+ def __init__(self, path: str) -> None:
7
+ pass
8
+
9
+ @abstractmethod
10
+ def connect(self) -> None:
11
+ pass
12
+
13
+ @abstractmethod
14
+ def disconnect(self) -> None:
15
+ pass
16
+
17
+ @abstractmethod
18
+ def read(self) -> bytes:
19
+ pass
20
+
21
+ @abstractmethod
22
+ def write(self, message: bytes) -> None:
23
+ pass
@@ -0,0 +1,30 @@
1
+ import sys
2
+ from typing import BinaryIO, TextIO
3
+
4
+ from . import IOBase
5
+
6
+
7
+ class IOFile(IOBase):
8
+ file: BinaryIO
9
+ path: str
10
+ mode: str
11
+
12
+ def __init__(self, path: str) -> None:
13
+ self.path = path
14
+ self.connect()
15
+
16
+ def connect(self) -> None:
17
+ try:
18
+ self.file = open(self.path, "rb+")
19
+ except OSError:
20
+ print("Unable to open file!")
21
+ sys.exit(-1)
22
+
23
+ def read(self) -> bytes:
24
+ return self.file.read()
25
+
26
+ def write(self, message: bytes) -> None:
27
+ self.file.write(message)
28
+
29
+ def disconnect(self) -> None:
30
+ self.file.close()
@@ -0,0 +1,77 @@
1
+ import time
2
+ from ctypes.wintypes import HANDLE
3
+
4
+ import win32con
5
+ import win32event
6
+ import win32file
7
+ import win32pipe
8
+ from win32ctypes.pywin32.pywintypes import error
9
+
10
+ from . import IOBase
11
+
12
+
13
+ class IOPipe(IOBase):
14
+ handler: HANDLE
15
+ overlapped: win32file.OVERLAPPED
16
+ continue_work: bool
17
+ path: str
18
+
19
+ def __init__(self, path: str) -> None:
20
+ self.overlapped = win32file.OVERLAPPED()
21
+ self.overlapped.hEvent = win32event.CreateEvent(None, True, 0, None)
22
+ self.continue_work = True
23
+ self.path = path
24
+ self.connect()
25
+
26
+ def connect(self) -> None:
27
+ try:
28
+ self.handler = win32file.CreateFile(
29
+ self.path,
30
+ win32file.GENERIC_READ | win32file.GENERIC_WRITE,
31
+ 0,
32
+ None,
33
+ win32file.OPEN_EXISTING,
34
+ win32con.FILE_FLAG_OVERLAPPED,
35
+ None,
36
+ )
37
+ if self.handler != win32file.INVALID_HANDLE_VALUE:
38
+ win32pipe.SetNamedPipeHandleState(
39
+ self.handler, win32pipe.PIPE_READMODE_BYTE, None, None
40
+ )
41
+ self.continue_work = True
42
+ else:
43
+ raise RuntimeError("Connection failed! ")
44
+ except error:
45
+ raise RuntimeError("Connection failed! ")
46
+
47
+ def read(self) -> bytes:
48
+ try:
49
+ _, available_data, _ = win32pipe.PeekNamedPipe(self.handler, 0)
50
+ while available_data == 0 and self.continue_work:
51
+ _, available_data, _ = win32pipe.PeekNamedPipe(self.handler, 0)
52
+ if not self.continue_work:
53
+ return bytes()
54
+ result, data = win32file.ReadFile(
55
+ self.handler, available_data, self.overlapped
56
+ )
57
+ buf = data.obj
58
+ available_data = 0
59
+ while available_data == 0:
60
+ _, available_data, _ = win32pipe.PeekNamedPipe(self.handler, 0)
61
+ while available_data != 0:
62
+ result, data = win32file.ReadFile(
63
+ self.handler, available_data, self.overlapped
64
+ )
65
+ buf += data.obj
66
+ time.sleep(0.1)
67
+ _, available_data, _ = win32pipe.PeekNamedPipe(self.handler, 0)
68
+ return buf
69
+ except error:
70
+ raise RuntimeError("Listening has been stopped")
71
+
72
+ def write(self, message: bytes) -> None:
73
+ win32file.WriteFile(self.handler, message)
74
+
75
+ def disconnect(self) -> None:
76
+ self.continue_work = False
77
+ win32file.CloseHandle(self.handler)
@@ -0,0 +1,30 @@
1
+ import sys
2
+ from typing import BinaryIO, TextIO
3
+
4
+ from . import IOBase
5
+
6
+
7
+ class IOReader(IOBase):
8
+ file: BinaryIO
9
+
10
+ mode: str
11
+
12
+ def __init__(self, path: str) -> None:
13
+ self.path = path
14
+ self.connect()
15
+
16
+ def connect(self) -> None:
17
+ try:
18
+ self.file = open(self.path, "rb+")
19
+ except OSError:
20
+ print("Unable to open file!")
21
+ sys.exit(-1)
22
+
23
+ def read(self) -> bytes:
24
+ return self.file.read()
25
+
26
+ def write(self, message: bytes) -> None:
27
+ pass
28
+
29
+ def disconnect(self) -> None:
30
+ self.file.close()
File without changes
@@ -0,0 +1,12 @@
1
+ from . import (
2
+ griddisplaypropertiesparser,
3
+ gridlistparser,
4
+ gridparser,
5
+ stratigraphiclevelsparser,
6
+ wellcurvesparser,
7
+ wellhodographparser,
8
+ welllistparser,
9
+ wellsparser,
10
+ wellstratigraphiclevelsparser,
11
+ welltrajectoryparser,
12
+ )
@@ -0,0 +1,73 @@
1
+ import struct
2
+
3
+ import numpy as np
4
+
5
+ from cratonapi.datacontainers import Color, GridDisplayProperties
6
+
7
+
8
+ def parse(message: bytes) -> GridDisplayProperties:
9
+ if len(message) < 16:
10
+ raise RuntimeError("Incomplete message!")
11
+ signature = message[0:4].decode("utf-8")
12
+ if signature != "WSPM":
13
+ raise RuntimeError("Incorrect signature!")
14
+ size, operation, request, uid = struct.unpack("<IHHI", message[4:16])
15
+ if operation != 3 or request != 10:
16
+ raise RuntimeError("Incorrect operation or request codes!")
17
+ if len(message) - 8 != size:
18
+ raise RuntimeError("Incomplete message!")
19
+ (
20
+ isoline_min_level,
21
+ isoline_max_level,
22
+ isoline_level_step,
23
+ minor_isoline_alpha,
24
+ minor_isoline_red,
25
+ minor_isoline_green,
26
+ minor_isoline_blue,
27
+ minor_isoline_thickness,
28
+ major_isoline_alpha,
29
+ major_isoline_red,
30
+ major_isoline_green,
31
+ major_isoline_blue,
32
+ major_isoline_thickness,
33
+ major_isoline_step,
34
+ palette_min_level,
35
+ palette_max_level,
36
+ color_interpolation_type,
37
+ points_count,
38
+ ) = struct.unpack("<3f4Bf4BfH2dBI", message[16:67])
39
+ offset: int = 0
40
+ point_values = np.empty(points_count)
41
+ point_colors = np.empty(points_count, Color)
42
+ for point in range(points_count):
43
+ value, alpha, red, green, blue = struct.unpack(
44
+ "<f4B", message[67 + offset : 75 + offset]
45
+ )
46
+ offset += 8
47
+ point_values[point] = value
48
+ point_colors[point] = Color(alpha, red, green, blue)
49
+ return GridDisplayProperties(
50
+ isoline_min_level,
51
+ isoline_max_level,
52
+ isoline_level_step,
53
+ Color(
54
+ minor_isoline_alpha,
55
+ minor_isoline_red,
56
+ minor_isoline_green,
57
+ minor_isoline_blue,
58
+ ),
59
+ minor_isoline_thickness,
60
+ Color(
61
+ major_isoline_alpha,
62
+ major_isoline_red,
63
+ major_isoline_green,
64
+ major_isoline_blue,
65
+ ),
66
+ major_isoline_thickness,
67
+ major_isoline_step,
68
+ palette_min_level,
69
+ palette_max_level,
70
+ color_interpolation_type,
71
+ point_values,
72
+ point_colors,
73
+ )
@@ -0,0 +1,31 @@
1
+ import struct
2
+
3
+ import numpy as np
4
+
5
+ from cratonapi.datacontainers import GridInfo
6
+
7
+
8
+ def parse(message: bytes) -> np.ndarray:
9
+ if len(message) < 16:
10
+ raise RuntimeError("Incomplete message!")
11
+ signature = message[0:4].decode("utf-8")
12
+ if signature != "WSPM":
13
+ raise RuntimeError("Incorrect signature!")
14
+ size, operation, request, uid = struct.unpack("<IHHI", message[4:16])
15
+ if operation != 3 or request != 6:
16
+ raise RuntimeError("Incorrect operation or request codes!")
17
+ if len(message) - 8 != size:
18
+ raise RuntimeError("Incomplete message!")
19
+ grids_count = struct.unpack("<I", message[16:20])[0]
20
+ offset = 0
21
+ grid_list = np.empty(grids_count, GridInfo)
22
+ for grid_num in range(grids_count):
23
+ grid_id, grid_type, grid_visibility, grid_name_symbols_count = struct.unpack(
24
+ "<IBBH", message[20 + offset : 28 + offset]
25
+ )
26
+ grid_name_bytes = message[28 + offset : 28 + offset + grid_name_symbols_count]
27
+ offset += grid_name_symbols_count + 8
28
+ grid_name = grid_name_bytes.decode("cp1251")
29
+ new_grid = GridInfo(grid_id, grid_name, grid_type, grid_visibility)
30
+ grid_list[grid_num] = new_grid
31
+ return grid_list
@@ -0,0 +1,36 @@
1
+ import struct
2
+
3
+ import numpy as np
4
+
5
+ from cratonapi.datacontainers import Grid
6
+
7
+
8
+ def parse(message: bytes) -> Grid:
9
+ if len(message) < 16:
10
+ raise RuntimeError("Incomplete message!")
11
+ signature = message[0:4].decode("utf-8")
12
+ if signature != "WSPM":
13
+ raise RuntimeError("Incorrect signature!")
14
+ size, operation, request, uid = struct.unpack("<IHHI", message[4:16])
15
+ if operation != 3 or request != 7:
16
+ raise RuntimeError("Incorrect operation or request codes!")
17
+ if len(message) - 8 != size:
18
+ raise RuntimeError("Incomplete message!")
19
+ grid_identifier = struct.unpack("<I", message[16:20])[0]
20
+ n_x, n_y, x_min, x_max, y_min, y_max, z_min, z_max, blank_code = struct.unpack(
21
+ "<2H7d", message[20:80]
22
+ )
23
+ data = struct.unpack(f"<{n_x * n_y}d", message[80 : 80 + (8 * n_x * n_y)])
24
+ return Grid(
25
+ grid_identifier,
26
+ n_x,
27
+ n_y,
28
+ x_min,
29
+ x_max,
30
+ y_min,
31
+ y_max,
32
+ z_min,
33
+ z_max,
34
+ blank_code,
35
+ np.asarray(data),
36
+ )
@@ -0,0 +1,31 @@
1
+ import struct
2
+
3
+ import numpy as np
4
+
5
+ from cratonapi.datacontainers import StratigraphicLevel
6
+
7
+
8
+ def parse(message: bytes) -> np.ndarray:
9
+ if len(message) < 16:
10
+ raise RuntimeError("Incomplete message!")
11
+ signature = message[0:4].decode("utf-8")
12
+ if signature != "WSPM":
13
+ raise RuntimeError("Incorrect signature!")
14
+ size, operation, request, uid = struct.unpack("<IHHI", message[4:16])
15
+ if operation != 3 or request != 4:
16
+ raise RuntimeError("Incorrect operation or request codes!")
17
+ if len(message) - 8 != size:
18
+ raise RuntimeError("Incomplete message!")
19
+ levels_count = struct.unpack("<I", message[16:20])[0]
20
+ offset = 0
21
+ level_list = np.empty(levels_count, StratigraphicLevel)
22
+ for level_num in range(levels_count):
23
+ level_id, level_age, level_name_symbols_count = struct.unpack(
24
+ "<IfH", message[20 + offset : 30 + offset]
25
+ )
26
+ level_name_bytes = message[30 + offset : 30 + offset + level_name_symbols_count]
27
+ offset += level_name_symbols_count + 10
28
+ level_name = level_name_bytes.decode("cp1251")
29
+ new_level = StratigraphicLevel(level_id, level_age, level_name)
30
+ level_list[level_num] = new_level
31
+ return level_list
@@ -0,0 +1,43 @@
1
+ import struct
2
+
3
+ import numpy as np
4
+
5
+ from cratonapi.datacontainers import WellCurve
6
+
7
+
8
+ def parse(message: bytes) -> np.ndarray:
9
+ if len(message) < 16:
10
+ raise RuntimeError("Incomplete message!")
11
+ signature = message[0:4].decode("utf-8")
12
+ if signature != "WSPM":
13
+ raise RuntimeError("Incorrect signature!")
14
+ size, operation, request, uid = struct.unpack("<IHHI", message[4:16])
15
+ if operation != 3 or request != 3:
16
+ raise RuntimeError("Incorrect operation or request codes!")
17
+ if len(message) - 8 != size:
18
+ raise RuntimeError("Incomplete message!")
19
+ curves_count = struct.unpack("<I", message[16:20])[0]
20
+ curve_list = np.empty(curves_count, WellCurve)
21
+ offset = 0
22
+ for curve_num in range(curves_count):
23
+ curve_type, curve_name_symbols_count = struct.unpack(
24
+ "<BH", message[20 + offset : 23 + offset]
25
+ )
26
+ curve_name_bytes = message[23 + offset : 23 + offset + curve_name_symbols_count]
27
+ offset += curve_name_symbols_count
28
+ curve_name = curve_name_bytes.decode("cp1251")
29
+ points_count = struct.unpack("<I", message[23 + offset : 27 + offset])[0]
30
+ point_values = np.empty(points_count)
31
+ point_depths = np.empty(points_count)
32
+ for point in range(points_count):
33
+ point_value, point_depth = struct.unpack(
34
+ "<dd", message[27 + offset : 43 + offset]
35
+ )
36
+ point_values[point] = point_value
37
+ point_depths[point] = point_depth
38
+ offset += 16
39
+ offset += 7
40
+ curve_list[curve_num] = WellCurve(
41
+ curve_type, curve_name, point_values, point_depths
42
+ )
43
+ return curve_list
@@ -0,0 +1,31 @@
1
+ import struct
2
+
3
+ import numpy as np
4
+
5
+ from cratonapi.datacontainers import WellHodograph
6
+
7
+
8
+ def parse(message: bytes) -> WellHodograph:
9
+ if len(message) < 16:
10
+ raise RuntimeError("Incomplete message!")
11
+ signature = message[0:4].decode("utf-8")
12
+ if signature != "WSPM":
13
+ raise RuntimeError("Incorrect signature!")
14
+ size, operation, request, uid = struct.unpack("<IHHI", message[4:16])
15
+ if operation != 3 or request != 8:
16
+ raise RuntimeError("Incorrect operation or request codes!")
17
+ if len(message) - 8 != size:
18
+ raise RuntimeError("Incomplete message!")
19
+ points_count = struct.unpack("<I", message[16:20])[0]
20
+ point_times = np.empty(points_count)
21
+ point_depths = np.empty(points_count)
22
+ offset = 0
23
+ for point in range(points_count):
24
+ point_depth, point_time = struct.unpack(
25
+ "<2d", message[20 + offset : 36 + offset]
26
+ )
27
+ point_times[point] = point_time
28
+ point_depths[point] = point_depth
29
+ offset += 16
30
+ time_shift = struct.unpack("<d", message[20 + offset : 28 + offset])[0]
31
+ return WellHodograph(time_shift, point_times, point_depths)
@@ -0,0 +1,31 @@
1
+ import struct
2
+
3
+ import numpy as np
4
+
5
+ from cratonapi.datacontainers import WellInfo
6
+
7
+
8
+ def parse(message: bytes) -> np.ndarray:
9
+ if len(message) < 16:
10
+ raise RuntimeError("Incomplete message!")
11
+ signature = message[0:4].decode("utf-8")
12
+ if signature != "WSPM":
13
+ raise RuntimeError("Incorrect signature!")
14
+ size, operation, request, uid = struct.unpack("<IHHI", message[4:16])
15
+ if operation != 3 or request != 1:
16
+ raise RuntimeError("Incorrect operation or request codes!")
17
+ if len(message) - 8 != size:
18
+ raise RuntimeError("Incomplete message!")
19
+ wells_count = struct.unpack("<H", message[16:18])[0]
20
+ offset = 0
21
+ well_list = np.empty(wells_count, WellInfo)
22
+ for well_num in range(wells_count):
23
+ well_id, well_name_symbols_count = struct.unpack(
24
+ "<IH", message[18 + offset : 24 + offset]
25
+ )
26
+ well_name_bytes = message[24 + offset : 24 + offset + well_name_symbols_count]
27
+ offset += well_name_symbols_count + 6
28
+ well_name = well_name_bytes.decode("cp1251")
29
+ new_well = WellInfo(well_id, well_name)
30
+ well_list[well_num] = new_well
31
+ return well_list
@@ -0,0 +1,33 @@
1
+ import struct
2
+
3
+ import numpy as np
4
+
5
+ from cratonapi.datacontainers import Well
6
+
7
+
8
+ def parse(message: bytes) -> np.ndarray:
9
+ if len(message) < 16:
10
+ raise RuntimeError("Incomplete message!")
11
+ signature = message[0:4].decode("utf-8")
12
+ if signature != "WSPM":
13
+ raise RuntimeError("Incorrect signature!")
14
+ size, operation, request, uid = struct.unpack("<IHHI", message[4:16])
15
+ if operation != 3 or request != 2:
16
+ raise RuntimeError("Incorrect operation or request codes!")
17
+ if len(message) - 8 != size:
18
+ raise RuntimeError("Incomplete message!")
19
+ wells_count = struct.unpack("<H", message[16:18])[0]
20
+ well_list = np.empty(wells_count, Well)
21
+ offset = 0
22
+ for well_num in range(wells_count):
23
+ well_id, well_name_symbols_count = struct.unpack(
24
+ "<IH", message[18 + offset : 24 + offset]
25
+ )
26
+ well_name_bytes = message[24 + offset : 24 + offset + well_name_symbols_count]
27
+ well_name = well_name_bytes.decode("cp1251")
28
+ offset += well_name_symbols_count
29
+ x, y = struct.unpack("<dd", message[24 + offset : 40 + offset])
30
+ altitude, bottom = struct.unpack("<ff", message[40 + offset : 48 + offset])
31
+ well_list[well_num] = Well(well_id, well_name, x, y, altitude, bottom)
32
+ offset += 30
33
+ return well_list
@@ -0,0 +1,27 @@
1
+ import struct
2
+
3
+ import numpy as np
4
+
5
+ from cratonapi.datacontainers import WellStratigraphicLevel
6
+
7
+
8
+ def parse(message: bytes) -> np.ndarray:
9
+ if len(message) < 16:
10
+ raise RuntimeError("Incomplete message!")
11
+ signature = message[0:4].decode("utf-8")
12
+ if signature != "WSPM":
13
+ raise RuntimeError("Incorrect signature!")
14
+ size, operation, request, uid = struct.unpack("<IHHI", message[4:16])
15
+ if operation != 3 or request != 5:
16
+ raise RuntimeError("Incorrect operation or request codes!")
17
+ if len(message) - 8 != size:
18
+ raise RuntimeError("Incomplete message!")
19
+ levels_count = struct.unpack("<I", message[16:20])[0]
20
+ offset = 0
21
+ level_list = np.empty(levels_count, WellStratigraphicLevel)
22
+ for level_num in range(levels_count):
23
+ level_id, level_depth = struct.unpack("<If", message[20 + offset : 28 + offset])
24
+ new_level = WellStratigraphicLevel(level_id, level_depth)
25
+ level_list[level_num] = new_level
26
+ offset += 8
27
+ return level_list
@@ -0,0 +1,34 @@
1
+ import struct
2
+
3
+ import numpy as np
4
+
5
+ from cratonapi.datacontainers import WellTrajectory
6
+
7
+
8
+ def parse(message: bytes) -> WellTrajectory:
9
+ if len(message) < 16:
10
+ raise RuntimeError("Incomplete message!")
11
+ signature = message[0:4].decode("utf-8")
12
+ if signature != "WSPM":
13
+ raise RuntimeError("Incorrect signature!")
14
+ size, operation, request, uid = struct.unpack("<IHHI", message[4:16])
15
+ if operation != 3 or request != 9:
16
+ raise RuntimeError("Incorrect operation or request codes!")
17
+ if len(message) - 8 != size:
18
+ raise RuntimeError("Incomplete message!")
19
+ points_count = struct.unpack("<I", message[16:20])[0]
20
+ point_depths = np.empty(points_count)
21
+ point_x_shifts = np.empty(points_count)
22
+ point_y_shifts = np.empty(points_count)
23
+ point_z_shifts = np.empty(points_count)
24
+ offset = 0
25
+ for point in range(points_count):
26
+ depth, shift_x, shift_y, shift_z = struct.unpack(
27
+ "<4f", message[20 + offset : 36 + offset]
28
+ )
29
+ point_depths[point] = depth
30
+ point_x_shifts[point] = shift_x
31
+ point_y_shifts[point] = shift_y
32
+ point_z_shifts[point] = shift_z
33
+ offset += 16
34
+ return WellTrajectory(point_depths, point_x_shifts, point_y_shifts, point_z_shifts)
@@ -0,0 +1,4 @@
1
+ from cratonapi.parsers.signalparsers import (
2
+ griddisplaypropertieschangesignalparser,
3
+ signalcodeparser,
4
+ )
@@ -0,0 +1,8 @@
1
+ import struct
2
+
3
+
4
+ def parse(message: bytes) -> int:
5
+ if len(message) != 16:
6
+ raise RuntimeError("Incomplete message!")
7
+ grid_id = struct.unpack("<I", message[12:16])[0]
8
+ return grid_id
@@ -0,0 +1,23 @@
1
+ import struct
2
+
3
+ from cratonapi.parsers.signalparsers import griddisplaypropertieschangesignalparser
4
+ from cratonapi.signals import *
5
+
6
+
7
+ def parse(message: bytes) -> AbstractSignal:
8
+ if len(message) < 12:
9
+ raise RuntimeError("Incomplete message!")
10
+ signature = message[0:4].decode("utf-8")
11
+ if signature != "WSPM":
12
+ raise RuntimeError("Incorrect signature!")
13
+ size, operation, signal_id = struct.unpack("<IHH", message[4:12])
14
+ if operation != 4:
15
+ raise RuntimeError("Message is not a signal!")
16
+ match signal_id:
17
+ case SignalType.grid_list_changed:
18
+ return GridListChangedSignal()
19
+ case SignalType.grid_display_properties_changed:
20
+ grid_id = griddisplaypropertieschangesignalparser.parse(message)
21
+ return GridDisplayPropertiesChangedSignal(grid_id)
22
+ case _:
23
+ return AbstractSignal()
File without changes
@@ -0,0 +1,12 @@
1
+ from . import (
2
+ griddisplaypropertiesrequest,
3
+ gridlistrequest,
4
+ gridrequest,
5
+ stratigraphiclevellistrequest,
6
+ wellcurvesrequest,
7
+ wellhodographrequest,
8
+ welllistrequest,
9
+ wellsrequest,
10
+ wellstratigraphiclevellistrequest,
11
+ welltrajectoryrequest,
12
+ )
@@ -0,0 +1,10 @@
1
+ import struct
2
+
3
+
4
+ def request(grid_id: int) -> bytes:
5
+ signature = int.from_bytes(str.encode("WSPM"), "little")
6
+ size = 12
7
+ operation = 2
8
+ request_id = 10
9
+ uid = 0
10
+ return struct.pack("<IIHHII", signature, size, operation, request_id, uid, grid_id)
@@ -0,0 +1,10 @@
1
+ import struct
2
+
3
+
4
+ def request() -> bytes:
5
+ signature = int.from_bytes(str.encode("WSPM"), "little")
6
+ size = 8
7
+ operation = 2
8
+ request_id = 6
9
+ uid = 0
10
+ return struct.pack("<IIHHI", signature, size, operation, request_id, uid)
@@ -0,0 +1,10 @@
1
+ import struct
2
+
3
+
4
+ def request(grid_id: int) -> bytes:
5
+ signature = int.from_bytes(str.encode("WSPM"), "little")
6
+ size = 12
7
+ operation = 2
8
+ request_id = 7
9
+ uid = 0
10
+ return struct.pack("<IIHHII", signature, size, operation, request_id, uid, grid_id)
@@ -0,0 +1,10 @@
1
+ import struct
2
+
3
+
4
+ def request() -> bytes:
5
+ signature = int.from_bytes(str.encode("WSPM"), "little")
6
+ size = 8
7
+ operation = 2
8
+ request_id = 4
9
+ uid = 0
10
+ return struct.pack("<IIHHI", signature, size, operation, request_id, uid)
@@ -0,0 +1,10 @@
1
+ import struct
2
+
3
+
4
+ def request(well_id: int) -> bytes:
5
+ signature = int.from_bytes(str.encode("WSPM"), "little")
6
+ size = 12
7
+ operation = 2
8
+ request_id = 3
9
+ uid = 0
10
+ return struct.pack("<IIHHII", signature, size, operation, request_id, uid, well_id)
@@ -0,0 +1,10 @@
1
+ import struct
2
+
3
+
4
+ def request(well_id: int) -> bytes:
5
+ signature = int.from_bytes(str.encode("WSPM"), "little")
6
+ size = 12
7
+ operation = 2
8
+ request_id = 8
9
+ uid = 0
10
+ return struct.pack("<IIHHII", signature, size, operation, request_id, uid, well_id)
@@ -0,0 +1,10 @@
1
+ import struct
2
+
3
+
4
+ def request() -> bytes:
5
+ signature = int.from_bytes(str.encode("WSPM"), "little")
6
+ size = 8
7
+ operation = 2
8
+ request_id = 1
9
+ uid = 0
10
+ return struct.pack("<IIHHI", signature, size, operation, request_id, uid)
@@ -0,0 +1,28 @@
1
+ import struct
2
+
3
+
4
+ def request(count: int, *wells_ids: int) -> bytes:
5
+ signature = int.from_bytes(str.encode("WSPM"), "little")
6
+ size = 10 + count * 4
7
+ operation = 2
8
+ request_id = 2
9
+ uid = 0
10
+ if count == 0:
11
+ return struct.pack(
12
+ "<IIHHIH", signature, size, operation, request_id, uid, count
13
+ )
14
+ elif count == 1:
15
+ return struct.pack(
16
+ "<IIHHIHI", signature, size, operation, request_id, uid, count, wells_ids[0]
17
+ )
18
+ else:
19
+ return struct.pack(
20
+ f"<IIHHIH{count}I",
21
+ signature,
22
+ size,
23
+ operation,
24
+ request_id,
25
+ uid,
26
+ count,
27
+ *wells_ids,
28
+ )
@@ -0,0 +1,10 @@
1
+ import struct
2
+
3
+
4
+ def request(well_id: int) -> bytes:
5
+ signature = int.from_bytes(str.encode("WSPM"), "little")
6
+ size = 12
7
+ operation = 2
8
+ request_id = 5
9
+ uid = 0
10
+ return struct.pack("<IIHHII", signature, size, operation, request_id, uid, well_id)
@@ -0,0 +1,10 @@
1
+ import struct
2
+
3
+
4
+ def request(well_id: int) -> bytes:
5
+ signature = int.from_bytes(str.encode("WSPM"), "little")
6
+ size = 12
7
+ operation = 2
8
+ request_id = 9
9
+ uid = 0
10
+ return struct.pack("<IIHHII", signature, size, operation, request_id, uid, well_id)
@@ -0,0 +1 @@
1
+ from . import dataconnectorgreetingrequest, listenergreetingrequest
@@ -0,0 +1,8 @@
1
+ import struct
2
+
3
+
4
+ def request(app_id: int = 1) -> bytes:
5
+ signature = int.from_bytes(str.encode("WSPM"), "little")
6
+ operation = 1
7
+ size = 3
8
+ return struct.pack("<IIHB", signature, size, operation, app_id)
@@ -0,0 +1,17 @@
1
+ import struct
2
+
3
+
4
+ def request(signals_to_listen: tuple) -> bytes:
5
+ signature = int.from_bytes(str.encode("WSPM"), "little")
6
+ operation = 1
7
+ app_id = 0
8
+ size = 5 + 2 * len(signals_to_listen)
9
+ return struct.pack(
10
+ f"<IIHBH{len(signals_to_listen)}H",
11
+ signature,
12
+ size,
13
+ operation,
14
+ app_id,
15
+ len(signals_to_listen),
16
+ *signals_to_listen,
17
+ )
@@ -0,0 +1,35 @@
1
+ from typing import Callable
2
+
3
+ from cratonapi.ioconnections import IOBase, IOPipe
4
+ from cratonapi.parsers.signalparsers import *
5
+ from cratonapi.requests.utilityrequests import listenergreetingrequest
6
+
7
+
8
+ class SignalConnector:
9
+ connection: IOBase
10
+ signals_to_listen: tuple
11
+ continue_listening: bool
12
+
13
+ def __init__(self, signals_to_listen: tuple, connection: IOBase):
14
+ self.connection = connection
15
+ self.signals_to_listen = signals_to_listen
16
+ self.continue_listening = True
17
+ self.__greeting()
18
+
19
+ def __greeting(self) -> None:
20
+ message = listenergreetingrequest.request(self.signals_to_listen)
21
+ self.connection.write(message)
22
+
23
+ def listen(self, callback: Callable) -> None:
24
+ answer: bytes
25
+ while self.continue_listening:
26
+ try:
27
+ answer = self.connection.read()
28
+ signal = signalcodeparser.parse(answer)
29
+ callback(signal)
30
+ except RuntimeError:
31
+ continue
32
+
33
+ def disconnect(self) -> None:
34
+ self.continue_listening = False
35
+ self.connection.disconnect()
@@ -0,0 +1,4 @@
1
+ from .abstractsignal import AbstractSignal
2
+ from .griddisplaypropertieschangedsignal import GridDisplayPropertiesChangedSignal
3
+ from .gridlistchangedsignal import GridListChangedSignal
4
+ from .signaltype import SignalType
@@ -0,0 +1,7 @@
1
+ from abc import ABC
2
+ from dataclasses import dataclass
3
+
4
+
5
+ @dataclass
6
+ class AbstractSignal(ABC):
7
+ pass
@@ -0,0 +1,8 @@
1
+ from dataclasses import dataclass
2
+
3
+ from .abstractsignal import AbstractSignal
4
+
5
+
6
+ @dataclass
7
+ class GridDisplayPropertiesChangedSignal(AbstractSignal):
8
+ grid_id: int
@@ -0,0 +1,8 @@
1
+ from dataclasses import dataclass
2
+
3
+ from .abstractsignal import AbstractSignal
4
+
5
+
6
+ @dataclass
7
+ class GridListChangedSignal(AbstractSignal):
8
+ pass
@@ -0,0 +1,6 @@
1
+ from enum import IntEnum
2
+
3
+
4
+ class SignalType(IntEnum):
5
+ grid_list_changed = 1
6
+ grid_display_properties_changed = 2
@@ -0,0 +1,16 @@
1
+ Metadata-Version: 2.1
2
+ Name: cratonapi
3
+ Version: 0.1.0
4
+ Summary: Python support for W-Seis interprocess communication API
5
+ Author: Kirill Natalin
6
+ Author-email: natalin.2000@mail.ru
7
+ Requires-Python: >=3.11,<4.0
8
+ Classifier: Programming Language :: Python :: 3
9
+ Classifier: Programming Language :: Python :: 3.11
10
+ Classifier: Programming Language :: Python :: 3.12
11
+ Requires-Dist: numpy (>=1.26.4,<2.0.0)
12
+ Requires-Dist: pywin32 (>=306,<307)
13
+ Requires-Dist: pywin32-ctypes (>=0.2.2,<0.3.0)
14
+ Description-Content-Type: text/markdown
15
+
16
+
@@ -0,0 +1,58 @@
1
+ cratonapi/__init__.py,sha256=hJigtrhgjg4xZDUCXUiaeqz-qbU_49mVDV9msEBEkNo,234
2
+ cratonapi/dataconnector.py,sha256=Pnqleuv7dDwyrGyk5nrTjeuOKuzfFlgKz_ptVnci6w4,3628
3
+ cratonapi/datacontainers/__init__.py,sha256=lumPmBLEwcUf6aGbxDSOetft8Yz11GvXg-AEsQ6J0cU,428
4
+ cratonapi/datacontainers/color.py,sha256=wp1-Lp8rQLHCxH0PWwfWVVQsCt-IRdxHlneBZ7F7MiQ,126
5
+ cratonapi/datacontainers/grid.py,sha256=4GVTeRXhLntTxn-1VbaVrwl5DRMQJb9yggUeFP5Kbts,286
6
+ cratonapi/datacontainers/griddisplayproperties.py,sha256=Jvf9TlQNeajzgT31f00zx0fx7pHy8oPrEvCpkXKOygg,542
7
+ cratonapi/datacontainers/gridinfo.py,sha256=ZFeh0PiZ8uexHfvkT4O1klTHK5gqTeLd6oQL7pqpftc,152
8
+ cratonapi/datacontainers/stratigraphiclevel.py,sha256=hYvnFCC6_YsdntAY3iEqAQTNrcfWxeuyedX4zXj16Fg,140
9
+ cratonapi/datacontainers/well.py,sha256=bJDuEzDazLkI_iG2TznoCtugOrv89IR5vrxkUKEJ-pw,186
10
+ cratonapi/datacontainers/wellcurve.py,sha256=sM7-3oB_zhcbarIID_5JRphz43vhP2cznXoJ_c-apcE,194
11
+ cratonapi/datacontainers/wellhodograph.py,sha256=zBP51YPOF_FJHS0Twar0fM9ydq_KOc2Wz6Clork4Urw,178
12
+ cratonapi/datacontainers/wellinfo.py,sha256=hsSMyOerKu9bTlBR0fhgcyIKzIqrVr-2pbIIKQ3q3k4,106
13
+ cratonapi/datacontainers/wellstratigraphiclevel.py,sha256=1jJ3Fa1lW0kjKR3Xa0-ZFJjw-6eBQb3oV3BaubPwZ-g,125
14
+ cratonapi/datacontainers/welltrajectory.py,sha256=8IhCzsoj0r5HCdhnd5AXS8W2wi9SVvg539P4HhB4TY4,217
15
+ cratonapi/ioconnections/__init__.py,sha256=1nzJJagK93u9HOxaxSMQ8A-Av8Dv8vqOajH4nPQae00,116
16
+ cratonapi/ioconnections/iobase.py,sha256=uXfHBsTJG3lAu7om5Gmzza9dHsUAIyjnmvnmpbVCsnc,431
17
+ cratonapi/ioconnections/iofile.py,sha256=aisFTPutIFjsVofDlyL1xuQimv9hhPfCMVXgksN1WzA,647
18
+ cratonapi/ioconnections/iopipe.py,sha256=IHRdE4wYd4pNw9vrM17QNw0E4V6ZxIlk9qC9ozO4dYU,2654
19
+ cratonapi/ioconnections/ioreader.py,sha256=OCGlbvibf-03WIU7b1QT88NG9ggMi4PCMa19cj1744c,616
20
+ cratonapi/parsers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
21
+ cratonapi/parsers/dataparsers/__init__.py,sha256=jwcYi-hxfJwS32MqD_xqWnWbSTaPtqUjrWlRk1_f1ck,275
22
+ cratonapi/parsers/dataparsers/griddisplaypropertiesparser.py,sha256=-HpOcEMf8fztldyPqu01f7cbE6gn6P0Je99Opj-4HOM,2312
23
+ cratonapi/parsers/dataparsers/gridlistparser.py,sha256=-9aS3TOzsRTjkaE47jJ86aQs_uNVKW8IEKikn_zLXMw,1253
24
+ cratonapi/parsers/dataparsers/gridparser.py,sha256=1CZv2KOh7lZy1nFrOBes5q27HGQvbCKN_DGHB_eREy4,1086
25
+ cratonapi/parsers/dataparsers/stratigraphiclevelsparser.py,sha256=SCVZ3uxg-5_xK0B8dutSNsNI_a_-JQSApWgXPH_-lPQ,1268
26
+ cratonapi/parsers/dataparsers/wellcurvesparser.py,sha256=y8LDjBdga8eod2umImzFvbZkK5ufmT0Bnyy0ad4kkyk,1728
27
+ cratonapi/parsers/dataparsers/wellhodographparser.py,sha256=eeKhnWPimU9b5CWl7_zQIS7kr7KudMjOiG2vBjSLPGs,1177
28
+ cratonapi/parsers/dataparsers/welllistparser.py,sha256=oLEqhmXUo9m-AZBkmfA9pQMHbtBiEmziNLZXFi7lBZ4,1195
29
+ cratonapi/parsers/dataparsers/wellsparser.py,sha256=X8kSaZJpHi1qTe4eSHH4uTpiLvg_OPQVeCAmvyeyOnc,1354
30
+ cratonapi/parsers/dataparsers/wellstratigraphiclevelsparser.py,sha256=rJCz-NdGrzErlPCVjaOqByr_IeVowV-OKPSnZe6cB2g,1047
31
+ cratonapi/parsers/dataparsers/welltrajectoryparser.py,sha256=ZBu9p_cvzOM-4dtjjjgjzdGfSpngDg6M8cbKAv82wEA,1304
32
+ cratonapi/parsers/signalparsers/__init__.py,sha256=KopqzxAaUgb3B6Lyq63YMly67dWZzIVU2noIw_D14A0,119
33
+ cratonapi/parsers/signalparsers/griddisplaypropertieschangesignalparser.py,sha256=ysjOhSj42v7TvWjsv4ZE2id9PYlK6s9YC3lF1FKox28,207
34
+ cratonapi/parsers/signalparsers/signalcodeparser.py,sha256=2n_lZm3kuXROEFCjPgitP6svam0ON8ft8pX5Dd9xdIY,905
35
+ cratonapi/requests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
36
+ cratonapi/requests/datarequests/__init__.py,sha256=_uHqFkUacjwls7nXu-agH4vJJbJ_OOwh_V1Cs5A4AkM,291
37
+ cratonapi/requests/datarequests/griddisplaypropertiesrequest.py,sha256=hdKzWd3rXInKvNc_eyRiRhdWqpWQJak80cd2jgm-G3s,275
38
+ cratonapi/requests/datarequests/gridlistrequest.py,sha256=LQaL4Ddt4AJWJua3QGYfa3bCEkU17jdLZcL4xPistSM,251
39
+ cratonapi/requests/datarequests/gridrequest.py,sha256=VWkIN3e4Wf39TuTXVQEy8I_KiMyj-cyOgy1nKlfpsJ4,274
40
+ cratonapi/requests/datarequests/stratigraphiclevellistrequest.py,sha256=f8UNFVGOulwjDVlmfqTFdPWe1flEHZJM3QOSM_ATnJs,251
41
+ cratonapi/requests/datarequests/wellcurvesrequest.py,sha256=zqNJE_lIeK0TpICwhOjAKhbcB3X8IDEA_KKdzGTCzt0,274
42
+ cratonapi/requests/datarequests/wellhodographrequest.py,sha256=Ycf59nRudUvvLBMmcko6Apm_kLCThBokJbA7iJVVf6U,274
43
+ cratonapi/requests/datarequests/welllistrequest.py,sha256=QyTbn5iy1W4uzdoEzX0oUJ_xo5HasFKgjPAzfwM-QC0,251
44
+ cratonapi/requests/datarequests/wellsrequest.py,sha256=45sqngNutSAf4_IEzE6Vcn4zqfdILhTnMaen1YJUxLk,738
45
+ cratonapi/requests/datarequests/wellstratigraphiclevellistrequest.py,sha256=BLFBnBG9jsaZzR-XRcjezCTvMmiBdbiwP6rg_EVPlVI,274
46
+ cratonapi/requests/datarequests/welltrajectoryrequest.py,sha256=v99HUMlc1HZ0WYpiuj7A0SW2-BH6XHfskJ6eCUnoMS4,274
47
+ cratonapi/requests/utilityrequests/__init__.py,sha256=mH9Noqp3FlAWrIAzm0qutjJ26q9qynoF8o_iN7DNqq0,69
48
+ cratonapi/requests/utilityrequests/dataconnectorgreetingrequest.py,sha256=FLEXpZADK7x5qPuA85mLpS9Xb6QHnYWjZN0AU2mHAgk,223
49
+ cratonapi/requests/utilityrequests/listenergreetingrequest.py,sha256=FD5KvUtxU1chfQ2g7AF8htBcYhK7m6yz_lEKGUrFCsQ,419
50
+ cratonapi/signalconnector.py,sha256=IivNyxlR-hDZ1UPlpHJx_oMBw53M7N8gu7m_4_UwJ5Q,1146
51
+ cratonapi/signals/__init__.py,sha256=r-5w2wFYWDodX4Rah3QcAfU68wBLnq4f-ktrkuJFzFY,222
52
+ cratonapi/signals/abstractsignal.py,sha256=miz_95asmXAxdIp-3he4Lmi9JwyFu56W3u0bORjR8kA,110
53
+ cratonapi/signals/griddisplaypropertieschangedsignal.py,sha256=mupU0M3tL5d92YDGqOJkEs0EcyFjHuzs7i1ZgGchVMs,174
54
+ cratonapi/signals/gridlistchangedsignal.py,sha256=3ZljPCVwjQuXPjlJHNZcwZrkg6U8f1lTD2-A6us849k,153
55
+ cratonapi/signals/signaltype.py,sha256=21rgt_2f1dPzCHAe5GsVi5ptpqkPpP8WmRc6YDB6QQc,126
56
+ cratonapi-0.1.0.dist-info/METADATA,sha256=h9VRfEOPHne1yUzzxXklluC2UAbGS-BkGA5EHtg0K_8,520
57
+ cratonapi-0.1.0.dist-info/WHEEL,sha256=FMvqSimYX_P7y0a7UY-_Mc83r5zkBZsCYPm7Lr0Bsq4,88
58
+ cratonapi-0.1.0.dist-info/RECORD,,
@@ -0,0 +1,4 @@
1
+ Wheel-Version: 1.0
2
+ Generator: poetry-core 1.8.1
3
+ Root-Is-Purelib: true
4
+ Tag: py3-none-any