1
+ (* Wolfram Language Package *)
2
+
3
+ BeginPackage ["TestCreater`" ]
4
+ (* Exported symbols added here with SymbolName::usage *)
5
+ generateServiceRequests ::usage = "generateServiceRequests[] generate set of requests for given service"
6
+ customExport ::usage = "customExport[file_,expr_,JSON] exports service requests data to json file"
7
+ customImport ::usage = "customExport[file_,JSON] imports service requests data from json file"
8
+
9
+ Begin ["`Private`" ] (* Begin Private Context *)
10
+
11
+ flickrdata = {
12
+ "ServiceName" -> "Flickr" ,
13
+ "Requests" -> {
14
+ {"Name" -> "ImageSearch" , "RequiredParameters" -> {},
15
+ "OptionalParameters" -> {"User" -> {"testwolfram13" ,
16
+ "testwolfram1" },
17
+ "Keywords" -> {"sunset" , "casino" , "waterfall" },
18
+ "DateTaken" -> {{DateObject [{2015 , 1 , 1 }],
19
+ Today }, {DateObject [{2015 , 4 , 4 }], Today }},
20
+ "MaxItems" -> {2 , 10 , 15 , 20 },
21
+ "Description" -> {"canyon" , "water" , "nature" },
22
+ "DateUploaded" -> {{DateObject [{2015 , 1 , 1 }],
23
+ Today }, {DateObject [{2015 , 4 , 4 }], Today }},
24
+ "Location" -> {Entity [
25
+ "City" , {"Miami" , "Florida" , "UnitedStates" }],
26
+ Entity ["City" , {"LasVegas" , "Nevada" , "UnitedStates" }]},
27
+ "Elements" -> {"Data" , "LinkedThumbnails" , "Images" },
28
+ "ImageSize" -> {"Small" , "Medium" , "Large" },
29
+ "Format" -> {"Dataset" }}
30
+ },
31
+ {"Name" -> "AlbumImages" ,
32
+ "RequiredParameters" -> {"AlbumID" -> {"72157644874295829" ,
33
+ "72157626881403859" , "72157621364913858" }},
34
+ "OptionalParameters" -> {"MaxItems" -> {2 , 10 , 15 , 20 },
35
+ "Elements" -> {"Data" , "Images" , "LinkedThumbnails" },
36
+ "Format" -> {"Dataset" }, "ImageSize" -> {"Small" , "Medium" , "Large" }}
37
+ }
38
+ }
39
+ };
40
+
41
+ $EXPRWRAPPER = stringifiedExpression ;
42
+
43
+ (*helper functions*)
44
+ validExpressionAsJSONDataQ [expr_ ? AtomQ ] :=
45
+ MatchQ [expr , Null | _ String | _ Integer | _ Real ];
46
+
47
+ validExpressionAsJSONDataQ [expr_ ] :=
48
+ MatchQ [expr , {___ ? validExpressionAsJSONDataQ }];
49
+
50
+ expressionToString [a : Null | _ String | _ Integer | _ Real ] := a ;
51
+
52
+ expressionToString [exprList_ List ] := expressionToString /@ exprList ;
53
+
54
+ expressionToString [expr_ Rule ] := ruleParse [expr ];
55
+
56
+ expressionToString [expr : Except [_ List ]] :=
57
+ ToString [$EXPRWRAPPER [expr ], InputForm ,
58
+ CharacterEncoding -> "ASCII" ];
59
+
60
+ stringToExpression [str_ String ] :=
61
+ With [{regex =
62
+ RegularExpression [ToString [$EXPRWRAPPER ] <> "\\ [.*\\ ]" ]},
63
+ Replace [str ,
64
+ s_ ? (StringMatchQ [# , regex ] & ) :> (ToExpression [
65
+ s ] /. $EXPRWRAPPER -> Identity )]]
66
+
67
+
68
+ ruleParse [expr_ Rule ] :=
69
+ (
70
+ expr [[1 ]] ->
71
+ Replace [expr [[2 ]],
72
+ rhs : Except [_ ? validExpressionAsJSONDataQ ] :>
73
+ expressionToString [rhs ]]
74
+ );
75
+
76
+ (*Define function generating parameters randomly*)
77
+ randomParamGen [rparams_ ,oparams_ , count_ Integer ] := Module [{orandomkeys ,orandomvalues ,reqrandomkeys ,reqrandomvalues },
78
+ orandomkeys = RandomSample [Keys [oparams ], count ];
79
+ orandomvalues = Map [RandomChoice [oparams [# ]]& , orandomkeys ];
80
+ If [Length [rparams ]=!= 0 ,
81
+ reqrandomkeys = Keys [rparams ];
82
+ reqrandomvalues = Map [RandomChoice [rparams [# ]]& , reqrandomkeys ];
83
+ (*finally join the required and optional params*)
84
+ Normal @ AssociationThread [Join [reqrandomkeys ,orandomkeys ], Join [reqrandomvalues ,orandomvalues ]]
85
+ ,
86
+ Normal @ AssociationThread [orandomkeys , orandomvalues ]
87
+ ]
88
+ ];
89
+
90
+ randomParamGen [sname_ String ,request_ ] := Module [{rname ,rparams ,oparams ,len ,arg },
91
+ rname = "Name" /. request ;
92
+ rparams = Association @ "RequiredParameters" /. request ;
93
+ oparams = Association @ "OptionalParameters" /. request ;
94
+ len = Length [oparams ];
95
+ {sname ,rname ,arg = randomParamGen [rparams ,oparams ,# ]}& /@ Range @ len
96
+ ];
97
+
98
+ generateServiceRequests [servicedata_ List ] := Module [{sname ,requests ,requestset = {}},
99
+ sname = "ServiceName" /. servicedata ;
100
+ requests = "Requests" /. servicedata ;
101
+ (*generating dynamic requests for a given service*)
102
+ AppendTo [requestset ,randomParamGen [sname ,# ]]& /@ requests ;
103
+ Flatten [requestset ,1 ]
104
+ ];
105
+
106
+ (*Need to see if today symbol can be holded at all!*)
107
+ generateServiceRequests [file_ String ] := Module [{servicedata ,sname ,requests ,requestset = {}},
108
+ (*first import the data*)
109
+ servicedata = customImport [file ,"JSON" ];
110
+ sname = "ServiceName" /. servicedata ;
111
+ requests = "Requests" /. servicedata ;
112
+ (*generating dynamic requests for a given service*)
113
+ AppendTo [requestset ,randomParamGen [sname ,# ]]& /@ requests ;
114
+ Flatten [requestset ,1 ]
115
+ ];
116
+
117
+ (*Custom export function exports stringified mathematica expressions*)
118
+ customExport [file_ , expr_ , "JSON" ] :=
119
+ Composition [Export [file , # , "JSON" ] & , Map [ruleParse [# ] & , # ] & ][expr ];
120
+
121
+ customImport [file_ , "JSON" ] :=
122
+ Composition [Sort ,
123
+ With [{regex =
124
+ RegularExpression [ToString [$EXPRWRAPPER ] <> "\\ [.*\\ ]" ]},
125
+ Map [# [[1 ]] ->
126
+ ReplaceAll [# [[2 ]],
127
+ rhs_ String ? (StringMatchQ [# , regex ] & ) :>
128
+ stringToExpression [rhs ]] & , # ]] & , Import [# , "JSON" ] & ][file ];
129
+
130
+
131
+ End [] (* End Private Context *)
132
+
133
+ EndPackage []
0 commit comments