changeset 245:1dfba457a9e1

Implement __len__ and len in AudioRegion and views
author Amine Sehili <amine.sehili@gmail.com>
date Mon, 19 Aug 2019 20:18:51 +0100
parents ee6d2294cdd5
children 936511b60745
files auditok/core.py tests/test_core.py
diffstat 2 files changed, 39 insertions(+), 8 deletions(-) [+]
line wrap: on
line diff
--- a/auditok/core.py	Wed Jul 31 20:07:27 2019 +0100
+++ b/auditok/core.py	Mon Aug 19 20:18:51 2019 +0100
@@ -296,6 +296,13 @@
         stop_sample = None if stop_s is None else round(stop_s * sr)
         return self._region[start_sample:stop_sample]
 
+    @property
+    def len(self):
+        """
+        Return region duration in seconds.
+        """
+        return self._region.duration
+
 
 class _MillisView(_SecondsView):
     def __getitem__(self, index):
@@ -309,6 +316,19 @@
         index = slice(start_sec, stop_sec)
         return super(_MillisView, self).__getitem__(index)
 
+    def __len__(self):
+        """
+        Return region duration in milliseconds.
+        """
+        return round(self._region.duration * 1000)
+
+    @property
+    def len(self):
+        """
+        Return region duration in milliseconds.
+        """
+        return len(self)
+
 
 class _AudioRegionMetadata(dict):
     def __getattr__(self, name):
@@ -515,9 +535,16 @@
 
     def __len__(self):
         """
-        Returns region duration in milliseconds.
+        Return region length in number of samples.
         """
-        return round(self.duration * 1000)
+        return len(self._data) // (self.sample_width * self.channels)
+
+    @property
+    def len(self):
+        """
+        Return region length in number of samples.
+        """
+        return len(self)
 
     def __bytes__(self):
         return self._data
--- a/tests/test_core.py	Wed Jul 31 20:07:27 2019 +0100
+++ b/tests/test_core.py	Mon Aug 19 20:18:51 2019 +0100
@@ -923,7 +923,7 @@
         self.assertEqual(region.meta.start, start)
         self.assertEqual(region.meta.end, expected_end)
         self.assertEqual(region.duration, expected_duration_s)
-        self.assertEqual(len(region), expected_duration_ms)
+        self.assertEqual(len(region.ms), expected_duration_ms)
         self.assertEqual(bytes(region), data)
 
     def test_creation_invalid_data_exception(self):
@@ -1297,12 +1297,12 @@
         )
 
     @genty_dataset(
-        simple=(0.01, 0.03, 30),
-        rounded_len_floor=(0.00575, 0.01725, 17),
-        rounded_len_ceil=(0.00625, 0.01875, 19),
+        simple=(0.01, 0.03, 240, 30),
+        rounded_len_floor=(0.00575, 0.01725, 138, 17),
+        rounded_len_ceil=(0.00625, 0.01875, 150, 19),
     )
     def test_multiplication(
-        self, duration, expected_duration, expected_length
+        self, duration, expected_duration, expected_len, expected_len_ms
     ):
         sw = 2
         data = b"0" * int(duration * 8000 * sw)
@@ -1313,7 +1313,11 @@
         self.assertEqual(m_region.sw, 2)
         self.assertEqual(m_region.ch, 1)
         self.assertEqual(m_region.duration, expected_duration)
-        self.assertEqual(len(m_region), expected_length)
+        self.assertEqual(len(m_region), expected_len)
+        self.assertEqual(m_region.len, expected_len)
+        self.assertEqual(m_region.s.len, expected_duration)
+        self.assertEqual(len(m_region.ms), expected_len_ms)
+        self.assertEqual(m_region.ms.len, expected_len_ms)
 
     @genty_dataset(_str=("x", "str"), _float=(1.4, "float"))
     def test_multiplication_non_int(self, factor, _type):