5
5
from typing import (
6
6
Any ,
7
7
AnyStr ,
8
+ Callable ,
8
9
Dict ,
9
10
List ,
10
11
MutableMapping ,
11
12
MutableSequence ,
12
13
Optional ,
13
14
Sequence ,
15
+ Type ,
14
16
Union ,
15
17
cast ,
16
18
)
19
+ import urllib
17
20
18
21
from schema_salad .ref_resolver import file_uri
19
22
@@ -716,26 +719,34 @@ class FSAction(argparse.Action):
716
719
objclass = None # type: str
717
720
718
721
def __init__ (
719
- self , option_strings : List [str ], dest : str , nargs : Any = None , ** kwargs : Any
722
+ self ,
723
+ option_strings : List [str ],
724
+ dest : str ,
725
+ nargs : Any = None ,
726
+ urljoin : Callable [[str , str ], str ] = urllib .parse .urljoin ,
727
+ base_uri : str = "" ,
728
+ ** kwargs : Any ,
720
729
) -> None :
721
730
"""Fail if nargs is used."""
722
731
if nargs is not None :
723
732
raise ValueError ("nargs not allowed" )
733
+ self .urljoin = urljoin
734
+ self .base_uri = base_uri
724
735
super ().__init__ (option_strings , dest , ** kwargs )
725
736
726
737
def __call__ (
727
738
self ,
728
739
parser : argparse .ArgumentParser ,
729
740
namespace : argparse .Namespace ,
730
- values : Union [AnyStr , Sequence [Any ], None ],
741
+ values : Union [str , Sequence [Any ], None ],
731
742
option_string : Optional [str ] = None ,
732
743
) -> None :
733
744
setattr (
734
745
namespace ,
735
746
self .dest ,
736
747
{
737
748
"class" : self .objclass ,
738
- "location" : file_uri ( str ( os . path . abspath ( cast (AnyStr , values )) )),
749
+ "location" : self . urljoin ( self . base_uri , cast (str , values )),
739
750
},
740
751
)
741
752
@@ -744,18 +755,26 @@ class FSAppendAction(argparse.Action):
744
755
objclass = None # type: str
745
756
746
757
def __init__ (
747
- self , option_strings : List [str ], dest : str , nargs : Any = None , ** kwargs : Any
758
+ self ,
759
+ option_strings : List [str ],
760
+ dest : str ,
761
+ nargs : Any = None ,
762
+ urljoin : Callable [[str , str ], str ] = urllib .parse .urljoin ,
763
+ base_uri : str = "" ,
764
+ ** kwargs : Any ,
748
765
) -> None :
749
766
"""Initialize."""
750
767
if nargs is not None :
751
768
raise ValueError ("nargs not allowed" )
769
+ self .urljoin = urljoin
770
+ self .base_uri = base_uri
752
771
super ().__init__ (option_strings , dest , ** kwargs )
753
772
754
773
def __call__ (
755
774
self ,
756
775
parser : argparse .ArgumentParser ,
757
776
namespace : argparse .Namespace ,
758
- values : Union [AnyStr , Sequence [Any ], None ],
777
+ values : Union [str , Sequence [Any ], None ],
759
778
option_string : Optional [str ] = None ,
760
779
) -> None :
761
780
g = getattr (namespace , self .dest )
@@ -765,7 +784,7 @@ def __call__(
765
784
g .append (
766
785
{
767
786
"class" : self .objclass ,
768
- "location" : file_uri ( str ( os . path . abspath ( cast (AnyStr , values )) )),
787
+ "location" : self . urljoin ( self . base_uri , cast (str , values )),
769
788
}
770
789
)
771
790
@@ -794,6 +813,8 @@ def add_argument(
794
813
description : str = "" ,
795
814
default : Any = None ,
796
815
input_required : bool = True ,
816
+ urljoin : Callable [[str , str ], str ] = urllib .parse .urljoin ,
817
+ base_uri : str = "" ,
797
818
) -> None :
798
819
if len (name ) == 1 :
799
820
flag = "-"
@@ -804,27 +825,32 @@ def add_argument(
804
825
# parameter required.
805
826
required = default is None and input_required
806
827
if isinstance (inptype , MutableSequence ):
807
- if inptype [0 ] == "null" :
828
+ if len (inptype ) == 1 :
829
+ inptype = inptype [0 ]
830
+ elif len (inptype ) == 2 and inptype [0 ] == "null" :
831
+ required = False
832
+ inptype = inptype [1 ]
833
+ elif len (inptype ) == 2 and inptype [1 ] == "null" :
808
834
required = False
809
- if len (inptype ) == 2 :
810
- inptype = inptype [1 ]
811
- else :
812
- _logger .debug ("Can't make command line argument from %s" , inptype )
813
- return None
835
+ inptype = inptype [0 ]
836
+ else :
837
+ _logger .debug ("Can't make command line argument from %s" , inptype )
838
+ return None
814
839
815
840
ahelp = description .replace ("%" , "%%" )
816
- action = None # type: Optional[Union[argparse.Action, str]]
841
+ action = None # type: Optional[Union[Type[ argparse.Action] , str]]
817
842
atype = None # type: Any
843
+ typekw = {} # type: Dict[str, Any]
818
844
819
845
if inptype == "File" :
820
- action = cast ( argparse . Action , FileAction )
846
+ action = FileAction
821
847
elif inptype == "Directory" :
822
- action = cast ( argparse . Action , DirectoryAction )
848
+ action = DirectoryAction
823
849
elif isinstance (inptype , MutableMapping ) and inptype ["type" ] == "array" :
824
850
if inptype ["items" ] == "File" :
825
- action = cast ( argparse . Action , FileAppendAction )
851
+ action = FileAppendAction
826
852
elif inptype ["items" ] == "Directory" :
827
- action = cast ( argparse . Action , DirectoryAppendAction )
853
+ action = DirectoryAppendAction
828
854
else :
829
855
action = "append"
830
856
elif isinstance (inptype , MutableMapping ) and inptype ["type" ] == "enum" :
@@ -851,18 +877,20 @@ def add_argument(
851
877
_logger .debug ("Can't make command line argument from %s" , inptype )
852
878
return None
853
879
880
+ if action in (FileAction , DirectoryAction , FileAppendAction , DirectoryAppendAction ):
881
+ typekw ["urljoin" ] = urljoin
882
+ typekw ["base_uri" ] = base_uri
883
+
854
884
if inptype != "boolean" :
855
- typekw = {"type" : atype }
856
- else :
857
- typekw = {}
885
+ typekw ["type" ] = atype
858
886
859
887
toolparser .add_argument (
860
888
flag + name ,
861
889
required = required ,
862
890
help = ahelp ,
863
891
action = action , # type: ignore
864
892
default = default ,
865
- ** typekw
893
+ ** typekw ,
866
894
)
867
895
868
896
@@ -872,6 +900,8 @@ def generate_parser(
872
900
namemap : Dict [str , str ],
873
901
records : List [str ],
874
902
input_required : bool = True ,
903
+ urljoin : Callable [[str , str ], str ] = urllib .parse .urljoin ,
904
+ base_uri : str = "" ,
875
905
) -> argparse .ArgumentParser :
876
906
toolparser .description = tool .tool .get ("doc" , None )
877
907
toolparser .add_argument ("job_order" , nargs = "?" , help = "Job input json file" )
@@ -884,7 +914,15 @@ def generate_parser(
884
914
description = inp .get ("doc" , "" )
885
915
default = inp .get ("default" , None )
886
916
add_argument (
887
- toolparser , name , inptype , records , description , default , input_required
917
+ toolparser ,
918
+ name ,
919
+ inptype ,
920
+ records ,
921
+ description ,
922
+ default ,
923
+ input_required ,
924
+ urljoin ,
925
+ base_uri ,
888
926
)
889
927
890
928
return toolparser
0 commit comments