Revision 9471fece

b/tools/lib/client.py
34 34
from httplib import HTTPConnection, HTTP
35 35
from sys import stdin
36 36
from xml.dom import minidom
37
from StringIO import StringIO
37 38

  
38 39
import json
39 40
import types
......
72 73
        self.token = token
73 74
    
74 75
    def _req(self, method, path, body=None, headers={}, format='text', params={}):
75
        full_path = '/%s%s?format=%s' % (self.api, path, format)
76
        slash = '/' if self.api else ''
77
        full_path = '%s%s%s?format=%s' % (slash, self.api, path, format)
76 78
        
77 79
        for k,v in params.items():
78 80
            if v:
......
204 206
        return self._req('POST', path, body, headers=headers, format=format,
205 207
                        params=params)
206 208
    
207
    def put(self, path, body=None, format='text', headers=None):
208
        return self._req('PUT', path, body, headers=headers, format=format)
209
    def put(self, path, body=None, format='text', headers=None, params={}):
210
        return self._req('PUT', path, body, headers=headers, format=format,
211
                         params=params)
209 212
    
210 213
    def _list(self, path, format='text', params={}, **headers):
211 214
        status, headers, data = self.get(path, format=format, headers=headers,
......
399 402
    def retrieve_object_hashmap(self, container, object, params={},
400 403
                        account=None, **headers):
401 404
        """returns the hashmap representing object's data"""
402
        args = locals()
405
        args = locals().copy()
403 406
        for elem in ['self', 'container', 'object']:
404 407
            args.pop(elem)
405 408
        data = self.retrieve_object(container, object, format='json', **args)
......
415 418
                                              **h)
416 419
    
417 420
    def create_object(self, container, object, f=stdin, format='text', meta={},
418
                      etag=None, content_type=None, content_encoding=None,
421
                      params={}, etag=None, content_type=None, content_encoding=None,
419 422
                      content_disposition=None, account=None, **headers):
420 423
        """creates a zero-length object"""
421 424
        account = account or self.account
......
433 436
        for k,v in meta.items():
434 437
            headers['x-object-meta-%s' %k.strip()] = v.strip()
435 438
        data = f.read() if f else None
436
        return self.put(path, data, format, headers=headers)
439
        return self.put(path, data, format, headers=headers, params=params)
437 440
    
438 441
    def create_zero_length_object(self, container, object, meta={}, etag=None,
439 442
                                  content_type=None, content_encoding=None,
440 443
                                  content_disposition=None, account=None,
441 444
                                  **headers):
442 445
        account = account or self.account
443
        args = locals()
446
        args = locals().copy()
444 447
        for elem in ['self', 'container', 'headers', 'account']:
445 448
            args.pop(elem)
446 449
        args.update(headers)
......
681 684
        params = {'until':until, 'meta':meta}
682 685
        if shared:
683 686
            params['shared'] = None
684
        args = locals()
687
        args = locals().copy()
685 688
        for elem in ['self', 'container', 'params', 'until', 'meta']:
686 689
            args.pop(elem)
687 690
        return OOS_Client.list_objects(self, container, params=params, **args)
......
728 731
        l = [elem for elem in l if eval(elem)]
729 732
        for elem in l:
730 733
            headers.update({elem:eval(elem)})
734
        if format != 'text':
735
            params['hashmap'] = None
731 736
        return OOS_Client.retrieve_object(self, container, object,
732 737
                                          account=account, format=format,
733 738
                                          params=params, **headers)
......
739 744
                                account=None):
740 745
        """returns a specific object version"""
741 746
        account = account or self.account
742
        args = locals()
747
        args = locals().copy()
743 748
        l = ['self', 'container', 'object']
744 749
        for elem in l:
745 750
            args.pop(elem)
......
752 757
                                    if_unmodified_since=None, account=None):
753 758
        """returns the object version list"""
754 759
        account = account or self.account
755
        args = locals()
760
        args = locals().copy()
756 761
        l = ['self', 'container', 'object']
757 762
        for elem in l:
758 763
            args.pop(elem)
......
768 773
                                  x_object_public=None, account=None):
769 774
        """createas a zero length object"""
770 775
        account = account or self.account
771
        args = locals()
776
        args = locals().copy()
772 777
        for elem in ['self', 'container', 'object']:
773 778
            args.pop(elem)
774 779
        return OOS_Client.create_zero_length_object(self, container, object,
775 780
                                                    **args)
776 781
    
777
    def create_object(self, container, object, f=stdin, 
778
                      meta={}, etag=None, content_type=None,
782
    def create_object(self, container, object, f=stdin, format='text',
783
                      meta={}, params={}, etag=None, content_type=None,
779 784
                      content_encoding=None, content_disposition=None,
780 785
                      x_object_manifest=None, x_object_sharing=None,
781 786
                      x_object_public=None, account=None):
782 787
        """creates an object"""
783 788
        account = account or self.account
784
        args = locals()
789
        args = locals().copy()
785 790
        for elem in ['self', 'container', 'object']:
786 791
            args.pop(elem)
787 792
        return OOS_Client.create_object(self, container, object, **args)
......
810 815
        return self._chunked_transfer(path, 'PUT', f, headers=headers,
811 816
                                      blocksize=blocksize)
812 817
    
813
    def create_object_by_hashmap(container, object, f=stdin, format='json',
818
    def create_object_by_hashmap(self, container, object, hashmap={},
814 819
                                 meta={}, etag=None, content_encoding=None,
815 820
                                 content_disposition=None, content_type=None,
816 821
                                 x_object_sharing=None, x_object_manifest=None,
817 822
                                 x_object_public = None, account=None):
818 823
        """creates an object by uploading hashes representing data instead of data"""
819 824
        account = account or self.account
820
        args = locals()
821
        for elem in ['self', 'container', 'object']:
825
        args = locals().copy()
826
        for elem in ['self', 'container', 'object', 'hashmap']:
822 827
            args.pop(elem)
823 828
            
824
        data = f.read() if f else None
825
        if data and format == 'json':
826
            try:
827
                data = eval(data)
828
                data = json.dumps(data)
829
            except SyntaxError:
830
                raise Fault('Invalid formatting')
829
        try:
830
            data = json.dumps(hashmap)
831
        except SyntaxError:
832
            raise Fault('Invalid formatting')
833
        args['params'] = {'hashmap':None}
834
        args['format'] = 'json'
831 835
        
832
        #TODO check with xml
833
        return self.create_object(container, object, **args)
836
        return self.create_object(container, object, f=StringIO(data), **args)
834 837
    
835 838
    def create_manifestation(self, container, object, manifest, account=None):
836 839
        """creates a manifestation"""
......
848 851
                      x_source_object=None, account=None):
849 852
        """updates an object"""
850 853
        account = account or self.account
851
        args = locals()
854
        args = locals().copy()
852 855
        for elem in ['self', 'container', 'object', 'replace']:
853 856
            args.pop(elem)
854 857
        if not replace:
......
863 866
                                   x_object_public=None, account=None):
864 867
        """updates an object (incremental upload)"""
865 868
        account = account or self.account
866
        args = locals()
869
        args = locals().copy()
867 870
        for elem in ['self', 'container', 'object', 'replace']:
868 871
            args.pop(elem)
869 872
        if not replace:
......
877 880
                      x_object_sharing=None, x_object_public=None, account=None):
878 881
        """updates an object"""
879 882
        account = account or self.account
880
        args = locals()
883
        args = locals().copy()
881 884
        for elem in ['self', 'container', 'object', 'source']:
882 885
            args.pop(elem)
883 886
        

Also available in: Unified diff