~cjwatson/lazr.restful/newer-grokcore-martian

« back to all changes in this revision

Viewing changes to src/lazr/restful/docs/multiversion.rst

  • Committer: Colin Watson
  • Date: 2020-02-04 12:16:21 UTC
  • mfrom: (231.1.1 py3-print)
  • Revision ID: cjwatson@canonical.com-20200204121621-i1zrdaykvsgg4rz6
[r=doismellburning] Apply absolute_import and print_function __future__ imports.

Show diffs side-by-side

added added

removed removed

Lines of Context:
433
433
    >>> request_beta = create_web_service_request('/beta/')
434
434
    >>> alsoProvides(request_beta, IBetaVersion)
435
435
    >>> beta_entry = getMultiAdapter((C1, request_beta), IEntry)
436
 
    >>> print beta_entry.fax
 
436
    >>> print(beta_entry.fax)
437
437
    111-2121
438
438
 
439
439
    >>> request_10 = create_web_service_request('/1.0/')
440
440
    >>> alsoProvides(request_10, I10Version)
441
441
    >>> one_oh_entry = getMultiAdapter((C1, request_10), IEntry)
442
 
    >>> print one_oh_entry.fax_number
 
442
    >>> print(one_oh_entry.fax_number)
443
443
    111-2121
444
444
 
445
445
    >>> request_dev = create_web_service_request('/dev/')
446
446
    >>> alsoProvides(request_dev, IDevVersion)
447
447
    >>> dev_entry = getMultiAdapter((C1, request_dev), IEntry)
448
 
    >>> print dev_entry.fax
 
448
    >>> print(dev_entry.fax)
449
449
    Traceback (most recent call last):
450
450
    ...
451
451
    AttributeError: 'ContactEntryDev' object has no attribute 'fax'
636
636
    ...         RootResourceAbsoluteURL, [cls, IBrowserRequest])
637
637
 
638
638
    >>> beta_request = create_web_service_request('/beta/')
639
 
    >>> print beta_request.traverse(None)
 
639
    >>> print(beta_request.traverse(None))
640
640
    <BetaServiceRootResource object...>
641
641
 
642
 
    >>> print absoluteURL(beta_app, beta_request)
 
642
    >>> print(absoluteURL(beta_app, beta_request))
643
643
    http://api.multiversion.dev/beta/
644
644
 
645
645
    >>> dev_request = create_web_service_request('/dev/')
646
 
    >>> print dev_request.traverse(None)
 
646
    >>> print(dev_request.traverse(None))
647
647
    <PostBetaServiceRootResource object...>
648
648
 
649
 
    >>> print absoluteURL(dev_app, dev_request)
 
649
    >>> print(absoluteURL(dev_app, dev_request))
650
650
    http://api.multiversion.dev/dev/
651
651
 
652
652
Request lifecycle
668
668
    <BetaServiceRootResource object ...>
669
669
    >>> IBetaVersion.providedBy(request_beta)
670
670
    True
671
 
    >>> print request_beta.version
 
671
    >>> print(request_beta.version)
672
672
    beta
673
673
 
674
674
Using the web service
686
686
    >>> request = create_web_service_request('/beta/')
687
687
    >>> resource = request.traverse(None)
688
688
    >>> body = simplejson.loads(resource())
689
 
    >>> print sorted(body.keys())
 
689
    >>> print(sorted(body.keys()))
690
690
    ['contacts_collection_link', 'resource_type_link']
691
691
 
692
 
    >>> print body['contacts_collection_link']
 
692
    >>> print(body['contacts_collection_link'])
693
693
    http://api.multiversion.dev/beta/contact_list
694
694
 
695
695
Here's the contact list.
701
701
but since we happen to know which object it is, we can pass it into
702
702
absoluteURL along with the request object, and get the correct URL.
703
703
 
704
 
    >>> print absoluteURL(contact_set, request)
 
704
    >>> print(absoluteURL(contact_set, request))
705
705
    http://api.multiversion.dev/beta/contact_list
706
706
 
707
707
    >>> body = simplejson.loads(resource())
709
709
    3
710
710
    >>> for link in sorted(
711
711
    ...     [contact['self_link'] for contact in body['entries']]):
712
 
    ...     print link
 
712
    ...     print(link)
713
713
    http://api.multiversion.dev/beta/contact_list/Cleo%20Python
714
714
    http://api.multiversion.dev/beta/contact_list/Fax-your-order%20Pizza
715
715
    http://api.multiversion.dev/beta/contact_list/Oliver%20Bluth
725
725
pass it into absoluteURL along with this request object, and get the
726
726
object's URL.
727
727
 
728
 
    >>> print C1.name
 
728
    >>> print(C1.name)
729
729
    Cleo Python
730
 
    >>> print absoluteURL(C1, request_beta)
 
730
    >>> print(absoluteURL(C1, request_beta))
731
731
    http://api.multiversion.dev/beta/contact_list/Cleo%20Python
732
732
 
733
733
    >>> body = simplejson.loads(resource())
734
734
    >>> sorted(body.keys())
735
735
    ['fax', 'http_etag', 'name', 'phone', 'resource_type_link', 'self_link']
736
 
    >>> print body['name']
 
736
    >>> print(body['name'])
737
737
    Cleo Python
738
738
 
739
739
We can traverse through an entry to one of its fields.
741
741
    >>> request_beta = create_web_service_request(
742
742
    ...     '/beta/contact_list/Cleo Python/fax')
743
743
    >>> field = request_beta.traverse(None)
744
 
    >>> print simplejson.loads(field())
 
744
    >>> print(simplejson.loads(field()))
745
745
    111-2121
746
746
 
747
747
We can invoke a named operation, and it returns a total_size (because
778
778
    >>> request = create_web_service_request('/1.0/')
779
779
    >>> resource = request.traverse(None)
780
780
    >>> body = simplejson.loads(resource())
781
 
    >>> print sorted(body.keys())
 
781
    >>> print(sorted(body.keys()))
782
782
    ['contacts_collection_link', 'resource_type_link']
783
783
 
784
784
Note that 'contacts_collection_link' points to a different URL in
785
785
'1.0' than in 'dev'.
786
786
 
787
 
    >>> print body['contacts_collection_link']
 
787
    >>> print(body['contacts_collection_link'])
788
788
    http://api.multiversion.dev/1.0/contacts
789
789
 
790
790
An attempt to use the 'beta' name of the contact list in the '1.0' web
800
800
 
801
801
    >>> request = create_web_service_request('/1.0/contacts')
802
802
    >>> resource = request.traverse(None)
803
 
    >>> print absoluteURL(contact_set, request)
 
803
    >>> print(absoluteURL(contact_set, request))
804
804
    http://api.multiversion.dev/1.0/contacts
805
805
 
806
806
    >>> body = simplejson.loads(resource())
808
808
    3
809
809
    >>> for link in sorted(
810
810
    ...     [contact['self_link'] for contact in body['entries']]):
811
 
    ...     print link
 
811
    ...     print(link)
812
812
    http://api.multiversion.dev/1.0/contacts/Cleo%20Python
813
813
    http://api.multiversion.dev/1.0/contacts/Fax-your-order%20Pizza
814
814
    http://api.multiversion.dev/1.0/contacts/Oliver%20Bluth
818
818
    >>> request_10 = create_web_service_request(
819
819
    ...     '/1.0/contacts/Cleo Python')
820
820
    >>> resource = request_10.traverse(None)
821
 
    >>> print absoluteURL(C1, request_10)
 
821
    >>> print(absoluteURL(C1, request_10))
822
822
    http://api.multiversion.dev/1.0/contacts/Cleo%20Python
823
823
 
824
824
Note that the 'fax' and 'phone' fields are now called 'fax_number' and
828
828
    >>> sorted(body.keys())
829
829
    ['fax_number', 'http_etag', 'name', 'phone_number',
830
830
     'resource_type_link', 'self_link']
831
 
    >>> print body['name']
 
831
    >>> print(body['name'])
832
832
    Cleo Python
833
833
 
834
834
We can traverse through an entry to one of its fields.
836
836
    >>> request_10 = create_web_service_request(
837
837
    ...     '/1.0/contacts/Cleo Python/fax_number')
838
838
    >>> field = request_10.traverse(None)
839
 
    >>> print simplejson.loads(field())
 
839
    >>> print(simplejson.loads(field()))
840
840
    111-2121
841
841
 
842
842
The fax field in '1.0' is called 'fax_number', and attempting
867
867
    ...
868
868
    KeyError: 'total_size'
869
869
 
870
 
    >>> print result['total_size_link']
 
870
    >>> print(result['total_size_link'])
871
871
    http://.../1.0/contacts?string=e&ws.op=find&ws.show=total_size
872
872
    >>> size_request = create_web_service_request(
873
873
    ...     '/1.0/contacts',
875
875
    ...         'string=e&ws.op=find&ws.show=total_size'})
876
876
    >>> operation = size_request.traverse(None)
877
877
    >>> result = simplejson.loads(operation())
878
 
    >>> print result
 
878
    >>> print(result)
879
879
    3
880
880
 
881
881
If the resultset fits on a single page, total_size will be provided
897
897
    ...     '/1.0/contacts',
898
898
    ...     environ={'QUERY_STRING' : 'ws.op=findContacts&string=Cleo'})
899
899
    >>> operation = request_10.traverse(None)
900
 
    >>> print operation()
 
900
    >>> print(operation())
901
901
    No such operation: findContacts
902
902
 
903
903
Dev
908
908
    >>> request = create_web_service_request('/dev/')
909
909
    >>> resource = request.traverse(None)
910
910
    >>> body = simplejson.loads(resource())
911
 
    >>> print sorted(body.keys())
 
911
    >>> print(sorted(body.keys()))
912
912
    ['contacts_collection_link', 'resource_type_link']
913
913
 
914
 
    >>> print body['contacts_collection_link']
 
914
    >>> print(body['contacts_collection_link'])
915
915
    http://api.multiversion.dev/dev/contacts
916
916
 
917
917
Here's the contact list.
918
918
 
919
919
    >>> request_dev = create_web_service_request('/dev/contacts')
920
920
    >>> resource = request_dev.traverse(None)
921
 
    >>> print absoluteURL(contact_set, request_dev)
 
921
    >>> print(absoluteURL(contact_set, request_dev))
922
922
    http://api.multiversion.dev/dev/contacts
923
923
 
924
924
    >>> body = simplejson.loads(resource())
926
926
    2
927
927
    >>> for link in sorted(
928
928
    ...     [contact['self_link'] for contact in body['entries']]):
929
 
    ...     print link
 
929
    ...     print(link)
930
930
    http://api.multiversion.dev/dev/contacts/Cleo%20Python
931
931
    http://api.multiversion.dev/dev/contacts/Oliver%20Bluth
932
932
 
935
935
    >>> request_dev = create_web_service_request(
936
936
    ...     '/dev/contacts/Cleo Python')
937
937
    >>> resource = request_dev.traverse(None)
938
 
    >>> print absoluteURL(C1, request_dev)
 
938
    >>> print(absoluteURL(C1, request_dev))
939
939
    http://api.multiversion.dev/dev/contacts/Cleo%20Python
940
940
 
941
941
Note that the published field names have changed between 'dev' and
945
945
    >>> body = simplejson.loads(resource())
946
946
    >>> sorted(body.keys())
947
947
    ['http_etag', 'name', 'phone_number', 'resource_type_link', 'self_link']
948
 
    >>> print body['name']
 
948
    >>> print(body['name'])
949
949
    Cleo Python
950
950
 
951
951
We can traverse through an entry to one of its fields.
953
953
    >>> request_dev = create_web_service_request(
954
954
    ...     '/dev/contacts/Cleo Python/name')
955
955
    >>> field = request_dev.traverse(None)
956
 
    >>> print simplejson.loads(field())
 
956
    >>> print(simplejson.loads(field()))
957
957
    Cleo Python
958
958
 
959
959
We cannot use 'dev' to traverse to a field not published in the 'dev'