Skip to content

Commit 6b0b9f1

Browse files
authored
Merge pull request #40 from alexander255/master
Add support for `ipfs files` (MFS) APIs
2 parents 4cfd3a4 + 903a1b0 commit 6b0b9f1

File tree

3 files changed

+110
-11
lines changed

3 files changed

+110
-11
lines changed

ipfsApi/client.py

Lines changed: 63 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,17 @@ def __init__(self,
9191
self._config_show = Command('/config/show')
9292
self._config_replace = ArgCommand('/config/replace')
9393
self._version = Command('/version')
94+
95+
# MFS COMMANDS
96+
self._files_cp = ArgCommand('/files/cp')
97+
self._files_ls = ArgCommand('/files/ls')
98+
self._files_mkdir = ArgCommand('/files/mkdir')
99+
self._files_stat = ArgCommand('/files/stat')
100+
self._files_rm = ArgCommand('/files/rm')
101+
self._files_read = ArgCommand('/files/read')
102+
self._files_write = FileCommand('/files/write')
103+
self._files_mv = ArgCommand('/files/mv')
104+
94105

95106
def add(self, files, recursive=False, **kwargs):
96107
"""
@@ -102,7 +113,7 @@ def add(self, files, recursive=False, **kwargs):
102113
{u'Hash': u'QmZfF6C9j4VtoCsTp4KSrhYH47QMd3DNXVZBKaxJdhaPab',
103114
u'Name': u'nurseryrhyme.txt'}
104115
"""
105-
return self._add.request(self._client, files,
116+
return self._add.request(self._client, (), files,
106117
recursive=recursive, **kwargs)
107118

108119
def get(self, multihash, **kwargs):
@@ -181,7 +192,7 @@ def block_put(self, file, **kwargs):
181192
{u'Key': u'QmeV6C6XVt1wf7V7as7Yak3mxPma8jzpqyhtRtCvpKcfBb',
182193
u'Size': 22}
183194
"""
184-
return self._block_put.request(self._client, file, **kwargs)
195+
return self._block_put.request(self._client, (), file, **kwargs)
185196

186197
def object_data(self, multihash, **kwargs):
187198
r"""
@@ -240,7 +251,7 @@ def object_get(self, multihash, **kwargs):
240251
def object_put(self, file, **kwargs):
241252
"""
242253
"""
243-
return self._object_put.request(self._client, file, **kwargs)
254+
return self._object_put.request(self._client, (), file, **kwargs)
244255

245256
def object_stat(self, multihash, **kwargs):
246257
"""
@@ -486,6 +497,55 @@ def version(self, **kwargs):
486497
{u'Version': u'0.3...'}
487498
"""
488499
return self._version.request(self._client, **kwargs)
500+
501+
def files_cp(self, source, dest, **kwargs):
502+
"""
503+
MFS - Copy files into mfs
504+
"""
505+
return self._files_cp.request(self._client, source, dest, **kwargs)
506+
507+
def files_ls(self, path, **kwargs):
508+
"""
509+
MFS - List directory contents
510+
"""
511+
return self._files_ls.request(self._client, path, **kwargs)
512+
513+
def files_mkdir(self, path, **kwargs):
514+
"""
515+
MFS - Create directory
516+
"""
517+
return self._files_mkdir.request(self._client, path, **kwargs)
518+
519+
def files_stat(self, path, **kwargs):
520+
"""
521+
MFS - Display file status (including it's hash)
522+
"""
523+
return self._files_stat.request(self._client, path, **kwargs)
524+
525+
def files_rm(self, path, **kwargs):
526+
"""
527+
MFS - Remove a file
528+
"""
529+
return self._files_rm.request(self._client, path, **kwargs)
530+
531+
def files_read(self, path, **kwargs):
532+
"""
533+
MFS - Read a file stored in MFS
534+
"""
535+
return self._files_read.request(self._client, path, **kwargs)
536+
537+
def files_write(self, path, file, **kwargs):
538+
"""
539+
MFS - Write to a mutable file
540+
"""
541+
return self._files_write.request(self._client, (path,), file, **kwargs)
542+
543+
def files_mv(self, source, dest, **kwargs):
544+
"""
545+
MFS - Move MFS files
546+
"""
547+
return self._files_mv.request(self._client, source, dest, **kwargs)
548+
489549

490550
###########
491551
# HELPERS #

ipfsApi/commands.py

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -33,29 +33,29 @@ def request(self, client, *args, **kwargs):
3333

3434
class FileCommand(Command):
3535

36-
def request(self, client, f, **kwargs):
36+
def request(self, client, args, f, **kwargs):
3737
"""
3838
Takes either a file object, a filename, an iterable of filenames, an
3939
iterable of file objects, or a heterogeneous iterable of file objects
4040
and filenames. Can only take one directory at a time, which will be
4141
traversed (optionally recursive).
4242
"""
4343
if kwargs.pop('recursive', False):
44-
return self.directory(client, f, recursive=True, **kwargs)
44+
return self.directory(client, args, f, recursive=True, **kwargs)
4545
if isinstance(f, six.string_types) and os.path.isdir(f):
46-
return self.directory(client, f, **kwargs)
46+
return self.directory(client, args, f, **kwargs)
4747
else:
48-
return self.files(client, f, **kwargs)
48+
return self.files(client, args, f, **kwargs)
4949

50-
def files(self, client, files, chunk_size=default_chunk_size, **kwargs):
50+
def files(self, client, args, files, chunk_size=default_chunk_size, **kwargs):
5151
"""
5252
Adds file-like objects as a multipart request to IPFS.
5353
"""
5454
body, headers = multipart.stream_files(files,
5555
chunk_size=chunk_size)
56-
return client.request(self.path, data=body, headers=headers, **kwargs)
56+
return client.request(self.path, args=args, data=body, headers=headers, **kwargs)
5757

58-
def directory(self, client, dirname,
58+
def directory(self, client, args, dirname,
5959
match='*', recursive=False,
6060
chunk_size=default_chunk_size, **kwargs):
6161
"""
@@ -66,7 +66,7 @@ def directory(self, client, dirname,
6666
fnpattern=match,
6767
recursive=recursive,
6868
chunk_size=chunk_size)
69-
return client.request(self.path, data=body, headers=headers, **kwargs)
69+
return client.request(self.path, args=args, data=body, headers=headers, **kwargs)
7070

7171

7272
class DownloadCommand(Command):

test/functional/tests.py

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -114,6 +114,45 @@ def test_add_get_pyobject(self):
114114
self.assertEqual(data,
115115
self.api.get_pyobj(res))
116116

117+
class IpfsApiMFSTest(unittest.TestCase):
118+
119+
test_files = {
120+
'/test_file1': {
121+
u'Name': u'fake_dir/popoiopiu',
122+
u'Stat': {u'Type': 'file',
123+
u'Hash': 'QmUvobKqcCE56brA8pGTRRRsGy2SsDEKSxFLZkBQFv7Vvv',
124+
u'Blocks': 1,
125+
u'CumulativeSize': 73,
126+
u'Size': 15}
127+
}
128+
}
129+
130+
def setUp(self):
131+
self.api = ipfsApi.Client()
132+
self._olddir = os.getcwd()
133+
os.chdir(HERE)
134+
135+
def tearDown(self):
136+
os.chdir(self._olddir)
137+
138+
def test_write_stat_read_delete(self):
139+
for target, desc in self.test_files.items():
140+
# Create target file
141+
self.api.files_write(target, desc[u'Name'], opts={'create':True})
142+
143+
# Verify stat information of file
144+
stat = self.api.files_stat(target)
145+
self.assertEqual(sorted(desc[u'Stat'].items()), sorted(stat.items()))
146+
147+
# Read back (and compare file contents)
148+
with open(desc[u'Name'], 'r') as file:
149+
content = self.api.files_read(target)
150+
self.assertEqual(content, file.read())
151+
152+
# Delete file
153+
self.api.files_rm(target)
154+
155+
117156

118157
if __name__ == "__main__":
119158
unittest.main()

0 commit comments

Comments
 (0)