meeting-noter 0.6.1__tar.gz → 1.0.0__tar.gz

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 meeting-noter might be problematic. Click here for more details.

Files changed (52) hide show
  1. {meeting_noter-0.6.1 → meeting_noter-1.0.0}/PKG-INFO +14 -3
  2. {meeting_noter-0.6.1 → meeting_noter-1.0.0}/README.md +12 -2
  3. {meeting_noter-0.6.1 → meeting_noter-1.0.0}/pyproject.toml +57 -1
  4. {meeting_noter-0.6.1 → meeting_noter-1.0.0}/src/meeting_noter/audio/encoder.py +8 -3
  5. meeting_noter-1.0.0/src/meeting_noter/cli.py +980 -0
  6. {meeting_noter-0.6.1 → meeting_noter-1.0.0}/src/meeting_noter/daemon.py +100 -16
  7. {meeting_noter-0.6.1 → meeting_noter-1.0.0}/src/meeting_noter/meeting_detector.py +97 -60
  8. {meeting_noter-0.6.1 → meeting_noter-1.0.0}/src/meeting_noter/mic_monitor.py +77 -22
  9. meeting_noter-1.0.0/src/meeting_noter/transcription/live_transcription.py +250 -0
  10. {meeting_noter-0.6.1 → meeting_noter-1.0.0}/src/meeting_noter.egg-info/PKG-INFO +14 -3
  11. {meeting_noter-0.6.1 → meeting_noter-1.0.0}/src/meeting_noter.egg-info/SOURCES.txt +8 -1
  12. {meeting_noter-0.6.1 → meeting_noter-1.0.0}/src/meeting_noter.egg-info/entry_points.txt +1 -0
  13. {meeting_noter-0.6.1 → meeting_noter-1.0.0}/src/meeting_noter.egg-info/requires.txt +1 -0
  14. meeting_noter-1.0.0/tests/test_cli.py +804 -0
  15. meeting_noter-1.0.0/tests/test_config.py +297 -0
  16. meeting_noter-1.0.0/tests/test_daemon.py +917 -0
  17. meeting_noter-1.0.0/tests/test_meeting_detector.py +641 -0
  18. meeting_noter-1.0.0/tests/test_mic_monitor.py +596 -0
  19. meeting_noter-1.0.0/tests/test_output_writer.py +205 -0
  20. meeting_noter-0.6.1/src/meeting_noter/cli.py +0 -308
  21. {meeting_noter-0.6.1 → meeting_noter-1.0.0}/setup.cfg +0 -0
  22. {meeting_noter-0.6.1 → meeting_noter-1.0.0}/src/meeting_noter/__init__.py +0 -0
  23. {meeting_noter-0.6.1 → meeting_noter-1.0.0}/src/meeting_noter/__main__.py +0 -0
  24. {meeting_noter-0.6.1 → meeting_noter-1.0.0}/src/meeting_noter/audio/__init__.py +0 -0
  25. {meeting_noter-0.6.1 → meeting_noter-1.0.0}/src/meeting_noter/audio/capture.py +0 -0
  26. {meeting_noter-0.6.1 → meeting_noter-1.0.0}/src/meeting_noter/audio/system_audio.py +0 -0
  27. {meeting_noter-0.6.1 → meeting_noter-1.0.0}/src/meeting_noter/config.py +0 -0
  28. {meeting_noter-0.6.1 → meeting_noter-1.0.0}/src/meeting_noter/gui/__init__.py +0 -0
  29. {meeting_noter-0.6.1 → meeting_noter-1.0.0}/src/meeting_noter/gui/__main__.py +0 -0
  30. {meeting_noter-0.6.1 → meeting_noter-1.0.0}/src/meeting_noter/gui/app.py +0 -0
  31. {meeting_noter-0.6.1 → meeting_noter-1.0.0}/src/meeting_noter/gui/main_window.py +0 -0
  32. {meeting_noter-0.6.1 → meeting_noter-1.0.0}/src/meeting_noter/gui/meetings_tab.py +0 -0
  33. {meeting_noter-0.6.1 → meeting_noter-1.0.0}/src/meeting_noter/gui/recording_tab.py +0 -0
  34. {meeting_noter-0.6.1 → meeting_noter-1.0.0}/src/meeting_noter/gui/settings_tab.py +0 -0
  35. {meeting_noter-0.6.1 → meeting_noter-1.0.0}/src/meeting_noter/install/__init__.py +0 -0
  36. {meeting_noter-0.6.1 → meeting_noter-1.0.0}/src/meeting_noter/install/macos.py +0 -0
  37. {meeting_noter-0.6.1 → meeting_noter-1.0.0}/src/meeting_noter/menubar.py +0 -0
  38. {meeting_noter-0.6.1 → meeting_noter-1.0.0}/src/meeting_noter/output/__init__.py +0 -0
  39. {meeting_noter-0.6.1 → meeting_noter-1.0.0}/src/meeting_noter/output/writer.py +0 -0
  40. {meeting_noter-0.6.1 → meeting_noter-1.0.0}/src/meeting_noter/resources/__init__.py +0 -0
  41. {meeting_noter-0.6.1 → meeting_noter-1.0.0}/src/meeting_noter/resources/icon.icns +0 -0
  42. {meeting_noter-0.6.1 → meeting_noter-1.0.0}/src/meeting_noter/resources/icon.png +0 -0
  43. {meeting_noter-0.6.1 → meeting_noter-1.0.0}/src/meeting_noter/resources/icon_128.png +0 -0
  44. {meeting_noter-0.6.1 → meeting_noter-1.0.0}/src/meeting_noter/resources/icon_16.png +0 -0
  45. {meeting_noter-0.6.1 → meeting_noter-1.0.0}/src/meeting_noter/resources/icon_256.png +0 -0
  46. {meeting_noter-0.6.1 → meeting_noter-1.0.0}/src/meeting_noter/resources/icon_32.png +0 -0
  47. {meeting_noter-0.6.1 → meeting_noter-1.0.0}/src/meeting_noter/resources/icon_512.png +0 -0
  48. {meeting_noter-0.6.1 → meeting_noter-1.0.0}/src/meeting_noter/resources/icon_64.png +0 -0
  49. {meeting_noter-0.6.1 → meeting_noter-1.0.0}/src/meeting_noter/transcription/__init__.py +0 -0
  50. {meeting_noter-0.6.1 → meeting_noter-1.0.0}/src/meeting_noter/transcription/engine.py +0 -0
  51. {meeting_noter-0.6.1 → meeting_noter-1.0.0}/src/meeting_noter.egg-info/dependency_links.txt +0 -0
  52. {meeting_noter-0.6.1 → meeting_noter-1.0.0}/src/meeting_noter.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: meeting-noter
3
- Version: 0.6.1
3
+ Version: 1.0.0
4
4
  Summary: Offline meeting transcription for macOS with automatic meeting detection
5
5
  Author: Victor
6
6
  License: MIT
@@ -40,6 +40,7 @@ Requires-Dist: meeting-noter-models>=0.1.0; extra == "offline"
40
40
  Provides-Extra: dev
41
41
  Requires-Dist: pytest>=7.0; extra == "dev"
42
42
  Requires-Dist: pytest-cov; extra == "dev"
43
+ Requires-Dist: pytest-mock; extra == "dev"
43
44
  Requires-Dist: black; extra == "dev"
44
45
  Requires-Dist: ruff; extra == "dev"
45
46
  Requires-Dist: mypy; extra == "dev"
@@ -63,9 +64,19 @@ Offline meeting transcription tool for macOS. Captures both your voice and meeti
63
64
  pipx install meeting-noter
64
65
  ```
65
66
 
66
- Or with pip:
67
+ **For corporate/offline environments** (bundles Whisper model, no download needed):
67
68
  ```bash
68
- pip install meeting-noter
69
+ pipx install "meeting-noter[offline]"
70
+ ```
71
+
72
+ ### Upgrading
73
+
74
+ ```bash
75
+ # Standard
76
+ pipx upgrade meeting-noter
77
+
78
+ # With offline model
79
+ pipx reinstall "meeting-noter[offline]"
69
80
  ```
70
81
 
71
82
  No system dependencies required - ffmpeg is bundled automatically.
@@ -17,9 +17,19 @@ Offline meeting transcription tool for macOS. Captures both your voice and meeti
17
17
  pipx install meeting-noter
18
18
  ```
19
19
 
20
- Or with pip:
20
+ **For corporate/offline environments** (bundles Whisper model, no download needed):
21
21
  ```bash
22
- pip install meeting-noter
22
+ pipx install "meeting-noter[offline]"
23
+ ```
24
+
25
+ ### Upgrading
26
+
27
+ ```bash
28
+ # Standard
29
+ pipx upgrade meeting-noter
30
+
31
+ # With offline model
32
+ pipx reinstall "meeting-noter[offline]"
23
33
  ```
24
34
 
25
35
  No system dependencies required - ffmpeg is bundled automatically.
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "meeting-noter"
7
- version = "0.6.1"
7
+ version = "1.0.0"
8
8
  description = "Offline meeting transcription for macOS with automatic meeting detection"
9
9
  readme = "README.md"
10
10
  license = {text = "MIT"}
@@ -51,6 +51,7 @@ offline = [
51
51
  dev = [
52
52
  "pytest>=7.0",
53
53
  "pytest-cov",
54
+ "pytest-mock",
54
55
  "black",
55
56
  "ruff",
56
57
  "mypy",
@@ -58,6 +59,7 @@ dev = [
58
59
 
59
60
  [project.scripts]
60
61
  meeting-noter = "meeting_noter.cli:cli"
62
+ mn = "meeting_noter.cli:cli"
61
63
 
62
64
  [project.urls]
63
65
  Homepage = "https://github.com/tech4vision/meeting-noter"
@@ -77,3 +79,57 @@ target-version = ["py39", "py310", "py311", "py312"]
77
79
  [tool.ruff]
78
80
  line-length = 100
79
81
  select = ["E", "F", "I", "N", "W"]
82
+
83
+ [tool.pytest.ini_options]
84
+ testpaths = ["tests"]
85
+ python_files = ["test_*.py"]
86
+ python_functions = ["test_*"]
87
+ addopts = [
88
+ "--cov=meeting_noter",
89
+ "--cov-report=term-missing",
90
+ "--cov-report=html",
91
+ "-v",
92
+ ]
93
+ filterwarnings = [
94
+ "ignore::DeprecationWarning",
95
+ ]
96
+
97
+ [tool.coverage.run]
98
+ source = ["src/meeting_noter"]
99
+ branch = true
100
+ omit = [
101
+ "*/gui/*",
102
+ "*/menubar.py",
103
+ "*/__main__.py",
104
+ "*/audio/system_audio.py", # ScreenCaptureKit-based, requires macOS runtime
105
+ ]
106
+
107
+ [tool.coverage.report]
108
+ exclude_lines = [
109
+ "pragma: no cover",
110
+ "def __repr__",
111
+ "raise NotImplementedError",
112
+ "if TYPE_CHECKING:",
113
+ "if __name__ == .__main__.:",
114
+ # Exclude macOS-specific framework code that can't be unit tested
115
+ "import ScreenCaptureKit",
116
+ "import CoreMedia",
117
+ "import AppKit",
118
+ "from AppKit import",
119
+ "from EventKit import",
120
+ "from Foundation import NSObject",
121
+ "from libdispatch import",
122
+ "from dispatch import",
123
+ "class StreamOutput",
124
+ "def stream_didOutputSampleBuffer_ofType_",
125
+ "def stream_didStopWithError_",
126
+ "except ImportError:",
127
+ # Exclude daemon fork code (requires OS process fork)
128
+ "def daemonize",
129
+ "os.fork()",
130
+ "os.setsid()",
131
+ "os.chdir",
132
+ "os.dup2",
133
+ "sys.exit(0)",
134
+ "sys.exit(1)",
135
+ ]
@@ -105,12 +105,17 @@ class MP3Encoder:
105
105
 
106
106
  def finalize(self) -> bytes:
107
107
  """Finalize encoding."""
108
- if self._process is not None and self._process.stdin is not None:
108
+ if self._process is not None:
109
109
  try:
110
- self._process.stdin.close()
110
+ if self._process.stdin is not None:
111
+ self._process.stdin.close()
111
112
  except Exception:
112
113
  pass
113
- self._process.wait()
114
+ try:
115
+ self._process.wait(timeout=5.0)
116
+ except subprocess.TimeoutExpired:
117
+ self._process.kill()
118
+ self._process.wait()
114
119
  self._process = None
115
120
  return b""
116
121