@@ -3,7 +3,7 @@ use std::sync::Arc;
33
44use bytes:: Bytes ;
55use object_store:: buffered:: { BufReader , BufWriter } ;
6- use object_store:: ObjectStore ;
6+ use object_store:: { ObjectMeta , ObjectStore } ;
77use pyo3:: exceptions:: { PyIOError , PyStopAsyncIteration , PyStopIteration } ;
88use pyo3:: prelude:: * ;
99use pyo3:: types:: PyString ;
@@ -15,6 +15,7 @@ use tokio::io::{AsyncBufReadExt, AsyncReadExt, AsyncSeekExt, AsyncWriteExt, Line
1515use tokio:: sync:: Mutex ;
1616
1717use crate :: attributes:: PyAttributes ;
18+ use crate :: list:: PyObjectMeta ;
1819use crate :: runtime:: get_runtime;
1920use crate :: tags:: PyTagSet ;
2021
@@ -28,8 +29,9 @@ pub(crate) fn open_reader(
2829) -> PyObjectStoreResult < PyReadableFile > {
2930 let store = store. into_inner ( ) ;
3031 let runtime = get_runtime ( py) ?;
31- let reader = py. allow_threads ( || runtime. block_on ( create_reader ( store, path, buffer_size) ) ) ?;
32- Ok ( PyReadableFile :: new ( reader, false ) )
32+ let ( reader, meta) =
33+ py. allow_threads ( || runtime. block_on ( create_reader ( store, path, buffer_size) ) ) ?;
34+ Ok ( PyReadableFile :: new ( reader, meta, false ) )
3335}
3436
3537#[ pyfunction]
@@ -42,34 +44,37 @@ pub(crate) fn open_reader_async(
4244) -> PyResult < Bound < PyAny > > {
4345 let store = store. into_inner ( ) ;
4446 future_into_py ( py, async move {
45- let reader = create_reader ( store, path, buffer_size) . await ?;
46- Ok ( PyReadableFile :: new ( reader, true ) )
47+ let ( reader, meta ) = create_reader ( store, path, buffer_size) . await ?;
48+ Ok ( PyReadableFile :: new ( reader, meta , true ) )
4749 } )
4850}
4951
5052async fn create_reader (
5153 store : Arc < dyn ObjectStore > ,
5254 path : String ,
5355 capacity : usize ,
54- ) -> PyObjectStoreResult < Arc < Mutex < BufReader > > > {
56+ ) -> PyObjectStoreResult < ( BufReader , ObjectMeta ) > {
5557 let meta = store
5658 . head ( & path. into ( ) )
5759 . await
5860 . map_err ( PyObjectStoreError :: ObjectStoreError ) ?;
59- Ok ( Arc :: new ( Mutex :: new ( BufReader :: with_capacity (
60- store, & meta, capacity,
61- ) ) ) )
61+ Ok ( ( BufReader :: with_capacity ( store, & meta, capacity) , meta) )
6262}
6363
6464#[ pyclass( name = "ReadableFile" , frozen) ]
6565pub ( crate ) struct PyReadableFile {
6666 reader : Arc < Mutex < BufReader > > ,
67+ meta : ObjectMeta ,
6768 r#async : bool ,
6869}
6970
7071impl PyReadableFile {
71- fn new ( reader : Arc < Mutex < BufReader > > , r#async : bool ) -> Self {
72- Self { reader, r#async }
72+ fn new ( reader : BufReader , meta : ObjectMeta , r#async : bool ) -> Self {
73+ Self {
74+ reader : Arc :: new ( Mutex :: new ( reader) ) ,
75+ meta,
76+ r#async,
77+ }
7378 }
7479}
7580
@@ -88,6 +93,11 @@ impl PyReadableFile {
8893 // `Option<Arc<Mutex<BufReader>>>`.
8994 fn close ( & self ) { }
9095
96+ #[ getter]
97+ fn meta ( & self ) -> PyObjectMeta {
98+ self . meta . clone ( ) . into ( )
99+ }
100+
91101 #[ pyo3( signature = ( size = None , /) ) ]
92102 fn read < ' py > ( & ' py self , py : Python < ' py > , size : Option < usize > ) -> PyResult < PyObject > {
93103 let reader = self . reader . clone ( ) ;
@@ -163,6 +173,11 @@ impl PyReadableFile {
163173 true
164174 }
165175
176+ #[ getter]
177+ fn size ( & self ) -> usize {
178+ self . meta . size
179+ }
180+
166181 fn tell < ' py > ( & ' py self , py : Python < ' py > ) -> PyResult < PyObject > {
167182 let reader = self . reader . clone ( ) ;
168183 if self . r#async {
0 commit comments