Cross posted on mathematica.stackexchange: https://mathematica.stackexchange.com/q/148207/5478
Background
After failed attempt (1) to create a complex API, by nicely linking my APIFunction to a cloud based package, I decided to go with the flow and trust that:
CloudDeploy[expr, ...] automatically deploys all definitions needed to evaluate expr, much like CloudSave.
Problem
but either it can't be trusted or I'm missing the point. It seems that definitions are collected by scanning right-hand-sides of related definitions but not left-hand-sides.
Example
ClearAll[foo, check];
check = IntegerQ;
foo[x_?check] := $Failed;
foo[x_] := x^2
api = CloudDeploy[
APIFunction[{"x" -> "Number"}, foo[#x] &]
, Permissions -> "Public"
]
foo[2] (* -> $Failed*)
foo[1.2] (* -> 1.44 *)
URLExecute[api, {"x" -> 2}] (* -> 4*) !!!!!!!!!!!
URLExecute[api, {"x" -> 1.2}] (* -> 1.44*)
The first URLExecute is wrong, it is caused by missing definition of check.
One can confirm that by
Import[api, "Text"]
Language`ExtendedFullDefinition[] = Language`DefinitionList[
HoldForm[foo] -> {..., DownValues -> {
HoldPattern[foo[(x_)?check]] :> $Failed,
HoldPattern[foo[x_]] :> x^2
}, ...
}];
APIFunction[{"x" -> "Number"}, foo[#x] & ]
Questions
Is this expected? Are there any new guidelines how to write code so it could be collected well? Or is it a flaw in Language`?
Is there anything I could read to learn working with the Cloud features in such a way that I won't have to come back here with a question/problem about a basic issue like deployment of dependencies?
Links
Clean package update for API/FormFunctions
https://mathematica.stackexchange.com/q/104739/5478
https://mathematica.stackexchange.com/q/125837/5478