Skip to content

Commit ef7c45e

Browse files
committed
fix: all the small issues of dotnet and python generation
1 parent 255093a commit ef7c45e

File tree

10 files changed

+117
-81
lines changed

10 files changed

+117
-81
lines changed

dev/user.clj

+27-30
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
[aidbox-sdk.converter :as converter]
66
[aidbox-sdk.fixtures.schemas :as fixtures]
77
[aidbox-sdk.generator :as gen]
8+
[aidbox-sdk.generator.python :as gen.python]
89
[aidbox-sdk.schema :as import]
910
[aidbox-sdk.cli :as cli]
1011
[clojure.data]
@@ -40,48 +41,44 @@
4041

4142
(resource-types aidbox-schemas)
4243
;; => ("FHIRSchema"
44+
;; "SearchParameter"
45+
;; "CompartmentDefinition"
46+
;; "ValueSet"
4347
;; "StructureDefinition")
4448

4549
(->> aidbox-schemas
4650
(filter #(= "Patient" (:id %)))
4751
(converter/convert))
4852

49-
(->> aidbox-schemas
50-
(filter fhir/fhir-schema?)
51-
(converter/convert))
52-
53-
(->> aidbox-schemas
54-
(filter fhir/fhir-schema?)
55-
(filter fhir/constraint?)
56-
(converter/convert))
57-
58-
(->> r4-schemas
59-
(filter #(= nil (:resourceType %)))
60-
(filter fhir/constraint?))
61-
62-
(gen/build-all!
63-
:input "resources/schemas"
64-
:target-language "dotnet"
65-
:output "dist")
53+
(converter/convert-search-params
54+
(->> aidbox-schemas
55+
(filter fhir/search-parameter?)
56+
(remove fhir/search-parameter-from-extension?))
57+
(->> aidbox-schemas
58+
(filter fhir/fhir-schema?)))
6659

67-
(gen/build-all!
68-
:auth "YmFzaWM6c2VjcmV0"
69-
:target-language "dotnet"
70-
:input "http://localhost:8765/api/sdk/fhir-packages"
71-
:output "dist1")
60+
(let [all-schemas aidbox-schemas
7261

73-
(sdk/generate :dotnet "http://localhost:8765/api/sdk/fhir-packages"
74-
{:auth-token "YmFzaWM6c2VjcmV0"
75-
:output-dir "dist-new"})
62+
datatype? (every-pred fhir/fhir-schema? fhir/base-schema? fhir/datatype?)
63+
domain-resource? (every-pred fhir/fhir-schema? fhir/base-schema? fhir/domain-resource?)
64+
constraint? (every-pred fhir/fhir-schema? fhir/constraint? (complement fhir/extension?))
65+
search-param? (every-pred fhir/search-parameter? (complement fhir/search-parameter-from-extension?))
7666

77-
(cli/app {:exit (fn [s])} ["-h"])
67+
fhir-schemas (filter fhir/fhir-schema? all-schemas)
68+
datatype-schemas (filter datatype? all-schemas)
69+
resource-schemas (filter domain-resource? all-schemas)
70+
constraint-schemas (filter constraint? all-schemas)
71+
search-param-schemas (filter search-param? all-schemas)
7872

79-
(cli/parse-args ["generate" "dotnet" "-h"])
73+
ir-schemas (converter/convert fhir-schemas)
74+
datatype-ir-schemas (converter/convert datatype-schemas)
75+
resource-ir-schemas (converter/convert resource-schemas)
76+
search-param-ir-schemas (converter/convert-search-params search-param-schemas
77+
fhir-schemas)]
78+
(gen/generate-datatypes gen.python/generator resource-ir-schemas)
79+
)
8080

81-
(clojure.walk/postwalk (fn [x] (prn x)
8281

83-
x)
8482

85-
fixtures/unflattened-backbone-elements)
8683

8784
:rcf)

src/aidbox_sdk/cli.clj

+2-2
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
["-h" "--help"]])
1212

1313
(def supported-commands #{"generate"})
14-
(def supported-languages #{"dotnet"})
14+
(def supported-languages #{"dotnet" "python"})
1515

1616
(defn validate-args [args]
1717
(let [[command target-language input] args]
@@ -59,7 +59,7 @@
5959

6060
(= command "generate")
6161
(try
62-
(generate target-language input options)
62+
(generate (keyword target-language) input options)
6363
(exit 0)
6464

6565
(catch Throwable e

src/aidbox_sdk/converter.clj

+17
Original file line numberDiff line numberDiff line change
@@ -192,3 +192,20 @@
192192
(map (fn [schema] (update schema
193193
:backbone-elements #(resolve-choices (flatten-backbones % [])))))
194194
(resolve-choices)))
195+
196+
(defn resolve-elements [schemas resource]
197+
(->> schemas
198+
(filter #(contains? (set (:base %)) resource))
199+
(map :code)
200+
(distinct)
201+
(sort)))
202+
203+
(defn convert-search-params [search-params-schemas all-schemas]
204+
(->> all-schemas
205+
(map (fn [schema]
206+
{:name (:id schema)
207+
:base (when-let [base (:base schema)]
208+
(->pascal-case (url->resource-name base)))
209+
:elements (->> (resolve-elements search-params-schemas (:id schema))
210+
(map (fn [el] {:type "string" :name el})))}))
211+
(remove #(empty? (:elements %)))))

src/aidbox_sdk/core.clj

+21-10
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
[aidbox-sdk.converter :as converter]
77
[aidbox-sdk.generator :as generator]
88
[aidbox-sdk.generator.dotnet :as dotnet]
9+
[aidbox-sdk.generator.python :as python]
910
[aidbox-sdk.schema :as importer]
1011
[clojure.java.io :as io]))
1112

@@ -16,7 +17,7 @@
1617
;; I/O Helpers
1718
;;
1819

19-
(defn create-directory! [dir]
20+
(defn create-directory! [^java.io.File dir]
2021
(when-not (.mkdir dir)
2122
(throw (Exception. (str "Can't create directory: " dir)))))
2223

@@ -42,13 +43,12 @@
4243

4344
;;
4445
;;
45-
;;
4646

4747
(defn lang->generator [lang]
4848
(case lang
4949
:dotnet dotnet/generator
50-
#_#_#_#_#_#_:python python/generator
51-
:typescript typescript/generator
50+
:python python/generator
51+
#_#_#_#_:typescript typescript/generator
5252
:java java/generator))
5353

5454
(defn generate! [target-language input options]
@@ -60,17 +60,21 @@
6060
datatype? (every-pred fhir/fhir-schema? fhir/base-schema? fhir/datatype?)
6161
domain-resource? (every-pred fhir/fhir-schema? fhir/base-schema? fhir/domain-resource?)
6262
constraint? (every-pred fhir/fhir-schema? fhir/constraint? (complement fhir/extension?))
63+
search-param? (every-pred fhir/search-parameter? (complement fhir/search-parameter-from-extension?))
6364

6465
fhir-schemas (filter fhir/fhir-schema? all-schemas)
6566
datatype-schemas (filter datatype? all-schemas)
6667
resource-schemas (filter domain-resource? all-schemas)
6768
constraint-schemas (filter constraint? all-schemas)
68-
search-param-schemas (filter fhir/search-parameter? all-schemas)
69+
search-param-schemas (filter search-param? all-schemas)
70+
71+
ir-schemas (converter/convert fhir-schemas)
72+
datatype-ir-schemas (converter/convert datatype-schemas)
73+
resource-ir-schemas (converter/convert resource-schemas)
74+
search-param-ir-schemas (converter/convert-search-params search-param-schemas
75+
fhir-schemas)
6976

70-
ir-schemas (converter/convert fhir-schemas)
71-
datatype-ir-schemas (converter/convert datatype-schemas)
72-
resource-ir-schemas (converter/convert resource-schemas)
73-
generator' (lang->generator target-language)
77+
generator' (lang->generator target-language)
7478

7579
generate-resource-module #(generator/generate-resource-module generator' %)]
7680

@@ -90,7 +94,7 @@
9094
(save-files! (generator/generate-constraints generator' constraint-schemas ir-schemas))
9195

9296
(println "Generating search parameters")
93-
(save-files! (generator/generate-search-params generator' search-param-schemas fhir-schemas))
97+
(save-files! (generator/generate-search-params generator' search-param-ir-schemas))
9498

9599
(println "Generating common SDK files")
96100
(save-files! (generator/generate-sdk-files generator'))
@@ -102,3 +106,10 @@
102106

103107
(defn -main [& args]
104108
(cli/app system args))
109+
110+
(comment
111+
(require 'aidbox-sdk.generator.dotnet.templates)
112+
113+
(map #(update % :path io/file) aidbox-sdk.generator.dotnet.templates/files)
114+
115+
(save-files! (io/file "/tmp/dotnet") (map #(update % :path io/file) aidbox-sdk.generator.dotnet.templates/files)))

src/aidbox_sdk/generator.clj

+1-1
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,6 @@
3939
(defprotocol CodeGenerator
4040
(generate-datatypes [this ir-schemas])
4141
(generate-resource-module [this ir-schema])
42-
(generate-search-params [this search-schemas fhir-schemas])
42+
(generate-search-params [this ir-schemas])
4343
(generate-constraints [this constraint-schemas ir-schemas])
4444
(generate-sdk-files [this]))

src/aidbox_sdk/generator/dotnet.clj

+13-12
Original file line numberDiff line numberDiff line change
@@ -341,18 +341,19 @@
341341
:classes [(generate-class ir-schema
342342
(generate-backbone-classes ir-schema))])})
343343

344-
(generate-search-params [_ search-schemas fhir-schemas]
345-
(for [{:keys [name base elements]}
346-
(generator/search-parameters-structures search-schemas fhir-schemas)]
347-
{:path (io/file "search" (str name "SearchParameters.cs"))
348-
:content
349-
(generate-module
350-
:name "Aidbox.FHIR.Search"
351-
:classes (generate-class
352-
{:name (str name "SearchParameters")
353-
:base (when base
354-
(str base "SearchParameters"))
355-
:elements (map #(hash-map :value "string" :name (->pascal-case %)) elements)}))}))
344+
(generate-search-params [_ ir-schemas]
345+
(map (fn [ir-schema]
346+
{:path (io/file "search" (str (:name ir-schema) "SearchParameters.cs"))
347+
:content
348+
(generate-module
349+
:name "Aidbox.FHIR.Search"
350+
:classes (generate-class
351+
{:name (str (:name ir-schema) "SearchParameters")
352+
:base (when (:base ir-schema)
353+
(str (:base ir-schema) "SearchParameters"))
354+
:elements (map (fn [el] (update el :name ->pascal-case))
355+
(:elements ir-schema))}))})
356+
ir-schemas))
356357

357358
(generate-constraints [_ constraint-schemas ir-schemas]
358359
(->> (apply-constraints constraint-schemas (vector->map ir-schemas))

src/aidbox_sdk/generator/dotnet/templates.clj

+2-2
Original file line numberDiff line numberDiff line change
@@ -349,7 +349,7 @@ public class Client
349349
(def files
350350
[{:path "Aidbox.csproj"
351351
:content aidbox-csproj}
352-
{:name "Api.cs"
352+
{:path "Api.cs"
353353
:content api-cs}
354-
{:name "Client.cs"
354+
{:path "Client.cs"
355355
:content client-cs}])

src/aidbox_sdk/generator/python.clj

+22-20
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,9 @@
7676
(io/file (package->directory (:package ir-schema))
7777
(str (->pascal-case (url->resource-name name)) ".py")))
7878

79+
(defn search-param-filepath [ir-schema]
80+
(io/file "search" (str (:name ir-schema) "SearchParameters.py")))
81+
7982
(defn generate-polymorphic-property [element]
8083
nil)
8184

@@ -166,14 +169,14 @@
166169
(defrecord PythonCodeGenerator []
167170
CodeGenerator
168171
(generate-datatypes [_ ir-schemas]
169-
{:path (datatypes-file-path)
170-
:content (generate-module
171-
:deps [{:module "pydantic" :members ["*"]}
172-
{:module "typing" :members ["Optional" "List"]}]
173-
:classes (map (fn [ir-schema]
174-
(generate-class ir-schema
175-
(generate-backbone-classes ir-schema)))
176-
ir-schemas))})
172+
[{:path (datatypes-file-path)
173+
:content (generate-module
174+
:deps [{:module "pydantic" :members ["*"]}
175+
{:module "typing" :members ["Optional" "List"]}]
176+
:classes (map (fn [ir-schema]
177+
(generate-class ir-schema
178+
(generate-backbone-classes ir-schema)))
179+
ir-schemas))}])
177180

178181
(generate-resource-module [_ ir-schema]
179182
{:path (resource-file-path ir-schema)
@@ -184,18 +187,17 @@
184187
:classes [(generate-class ir-schema
185188
(generate-backbone-classes ir-schema))])})
186189

187-
(generate-search-params [_ search-schemas fhir-schemas]
188-
(for [{:keys [name base elements]}
189-
(generator/search-parameters-structures search-schemas fhir-schemas)]
190-
{:path (io/file "search" (str name "SearchParameters.py"))
191-
:content
192-
(generate-module
193-
:deps [{:module "typing" :members ["Optional"]}]
194-
:classes [(generate-class
195-
{:name (str name "SearchParameters")
196-
:base (when base
197-
(str base "SearchParameters"))
198-
:elements (map #(hash-map :type "string" :name %) elements)})])}))
190+
(generate-search-params [_ ir-schemas]
191+
(map (fn [ir-schema]
192+
{:path (search-param-filepath ir-schema)
193+
:content (generate-module
194+
:deps [{:module "typing" :members ["Optional"]}]
195+
:classes [(generate-class
196+
{:name (format "%sSearchParameters" (:name ir-schema))
197+
:base (when (:base ir-schema)
198+
(format "%sSearchParameters" (:base ir-schema)))
199+
:elements (:elements ir-schema)})])})
200+
ir-schemas))
199201

200202
(generate-constraints [_ _schemas all-schemas] "")
201203
(generate-sdk-files [_] templates/files))

src/aidbox_sdk/models.clj

+9-1
Original file line numberDiff line numberDiff line change
@@ -40,8 +40,16 @@
4040
[:backbone-elements
4141
[:vector BackboneElement]]])
4242

43+
(def SearchParamIRSchema
44+
[:map {:closed true}
45+
[:name string?]
46+
[:base string?]
47+
[:elements [:vector [:map
48+
[:type "string"]
49+
[:name string?]]]]])
50+
4351
(comment
4452
(m/validate IRSchema fix/patient-ir-schema)
4553

46-
;
54+
;
4755
)

test/aidbox_sdk/generator/python_test.clj

+3-3
Original file line numberDiff line numberDiff line change
@@ -103,10 +103,10 @@
103103
:content
104104
"from typing import Optional\n\nclass PatientSearchParameters(DomainResourceSearchParameters):\n id: Optional[str] = None\n active: Optional[str] = None\n address: Optional[str] = None\n address_city: Optional[str] = None\n address_country: Optional[str] = None\n address_postalcode: Optional[str] = None\n address_state: Optional[str] = None\n address_use: Optional[str] = None\n birthdate: Optional[str] = None\n death_date: Optional[str] = None\n deceased: Optional[str] = None\n email: Optional[str] = None\n ethnicity: Optional[str] = None\n family: Optional[str] = None\n gender: Optional[str] = None\n general_practitioner: Optional[str] = None\n given: Optional[str] = None\n identifier: Optional[str] = None\n language: Optional[str] = None\n link: Optional[str] = None\n name: Optional[str] = None\n organization: Optional[str] = None\n part_agree: Optional[str] = None\n phone: Optional[str] = None\n phonetic: Optional[str] = None\n race: Optional[str] = None\n telecom: Optional[str] = None"}])))
105105

106-
;; TODO
107-
#_(deftest generate-constraints
106+
#_
107+
(deftest generate-constraints
108108
(is
109-
(= (sut/generate-constraints generator fixtures/some-sonstraint-ir-schema)
109+
(= (sut/generate-constraints generator fixtures/some-constraint-ir-schema)
110110
{:path (io/file "hl7-fhir-r4-core/Patient.cs"),
111111
:content
112112
"using Aidbox.FHIR.Base;\nusing Aidbox.FHIR.Utils;\n\nnamespace Aidbox.FHIR.R4.Core;\n\npublic class Patient : DomainResource, IResource\n{\n public bool? MultipleBirthBoolean { get; set; }\n public Base.Address[]? Address { get; set; }\n public string? DeceasedDateTime { get; set; }\n public Base.ResourceReference? ManagingOrganization { get; set; }\n public bool? DeceasedBoolean { get; set; }\n public Base.HumanName[]? Name { get; set; }\n public string? BirthDate { get; set; }\n public int? MultipleBirthInteger { get; set; }\n public object? MultipleBirth \n {\n get\n {\n if (MultipleBirthBoolean is not null)\n {\n return MultipleBirthBoolean;\n }\n \n if (MultipleBirthInteger is not null)\n {\n return MultipleBirthInteger;\n }\n \n return null;\n }\n \n set\n {\n if (value?.GetType() == typeof(bool))\n {\n MultipleBirthBoolean = (bool)value;return;\n }\n \n if (value?.GetType() == typeof(int))\n {\n MultipleBirthInteger = (int)value;return;\n }\n \n throw new ArgumentException(\"Invalid type provided\");\n }\n }\n public object? Deceased \n {\n get\n {\n if (DeceasedDateTime is not null)\n {\n return DeceasedDateTime;\n }\n \n if (DeceasedBoolean is not null)\n {\n return DeceasedBoolean;\n }\n \n return null;\n }\n \n set\n {\n if (value?.GetType() == typeof(string))\n {\n DeceasedDateTime = (string)value;return;\n }\n \n if (value?.GetType() == typeof(bool))\n {\n DeceasedBoolean = (bool)value;return;\n }\n \n throw new ArgumentException(\"Invalid type provided\");\n }\n }\n public Base.Attachment[]? Photo { get; set; }\n public Patient_Link[]? Link { get; set; }\n public bool? Active { get; set; }\n public Patient_Communication[]? Communication { get; set; }\n public Base.Identifier[]? Identifier { get; set; }\n public Base.ContactPoint[]? Telecom { get; set; }\n public Base.ResourceReference[]? GeneralPractitioner { get; set; }\n public string? Gender { get; set; }\n public Base.CodeableConcept? MaritalStatus { get; set; }\n public Patient_Contact[]? Contact { get; set; }\n\n public class Patient_Link : BackboneElement\n {\n public required string Type { get; set; }\n public required Base.ResourceReference Other { get; set; }\n }\n\n public class Patient_Communication : BackboneElement\n {\n public required Base.CodeableConcept Language { get; set; }\n public bool? Preferred { get; set; }\n }\n\n public class Patient_Contact : BackboneElement\n {\n public Base.HumanName? Name { get; set; }\n public string? Gender { get; set; }\n public Base.Period? Period { get; set; }\n public Base.Address? Address { get; set; }\n public Base.ContactPoint[]? Telecom { get; set; }\n public Base.ResourceReference? Organization { get; set; }\n public Base.CodeableConcept[]? Relationship { get; set; }\n }\n}"})))

0 commit comments

Comments
 (0)