rubyhealthvault 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (477) hide show
  1. data/LICENSE +52 -0
  2. data/README +19 -0
  3. data/Rakefile +149 -0
  4. data/bin/certs/HelloWorld-SDK_ID-05a059c9-c309-46af-9b86-b06d42510550.pfx +0 -0
  5. data/bin/certs/helloWorld.pem +52 -0
  6. data/bin/example.rb +80 -0
  7. data/bin/hv.log +118 -0
  8. data/lib/application.rb +37 -0
  9. data/lib/code_generation/xsd_parser.rb +376 -0
  10. data/lib/config.rb +28 -0
  11. data/lib/connection.rb +61 -0
  12. data/lib/healthvault.rb +2 -0
  13. data/lib/request.rb +113 -0
  14. data/lib/response.rb +50 -0
  15. data/lib/templates/complex_type_template.erb +64 -0
  16. data/lib/templates/simple_type_template.erb +65 -0
  17. data/lib/templates/thing_class_extension_template.erb +22 -0
  18. data/lib/utils/crypto_utils.rb +69 -0
  19. data/lib/utils/string_utils.rb +35 -0
  20. data/lib/wc_data/complex_type.rb +249 -0
  21. data/lib/wc_data/generated/application/app.rb +217 -0
  22. data/lib/wc_data/generated/application/app_id_and_incr_auth.rb +118 -0
  23. data/lib/wc_data/generated/application/app_large_logo.rb +56 -0
  24. data/lib/wc_data/generated/application/app_large_logo_info.rb +66 -0
  25. data/lib/wc_data/generated/application/app_persistent_tokens.rb +64 -0
  26. data/lib/wc_data/generated/application/app_small_logo.rb +56 -0
  27. data/lib/wc_data/generated/application/app_small_logo_info.rb +66 -0
  28. data/lib/wc_data/generated/application/app_with_logos.rb +291 -0
  29. data/lib/wc_data/generated/application/public_key.rb +43 -0
  30. data/lib/wc_data/generated/application/public_keys.rb +48 -0
  31. data/lib/wc_data/generated/application/statement.rb +30 -0
  32. data/lib/wc_data/generated/application/statement_info.rb +66 -0
  33. data/lib/wc_data/generated/auth/app_record_auth_action.rb +61 -0
  34. data/lib/wc_data/generated/auth/associated_cred_info.rb +70 -0
  35. data/lib/wc_data/generated/auth/auth.rb +44 -0
  36. data/lib/wc_data/generated/auth/auth_session_credential.rb +68 -0
  37. data/lib/wc_data/generated/auth/auth_session_sub_credential.rb +45 -0
  38. data/lib/wc_data/generated/auth/auth_xml.rb +44 -0
  39. data/lib/wc_data/generated/auth/federating_cred.rb +48 -0
  40. data/lib/wc_data/generated/auth/rule.rb +187 -0
  41. data/lib/wc_data/generated/auth/rules.rb +48 -0
  42. data/lib/wc_data/generated/auth/set.rb +70 -0
  43. data/lib/wc_data/generated/auth/simple_card_space_credential.rb +48 -0
  44. data/lib/wc_data/generated/auth/simple_passport_credential.rb +47 -0
  45. data/lib/wc_data/generated/auth/simple_user_pass_credential.rb +48 -0
  46. data/lib/wc_data/generated/auth/textual_permissions.rb +66 -0
  47. data/lib/wc_data/generated/auth/textual_permissions_type.rb +81 -0
  48. data/lib/wc_data/generated/auth/textual_rule.rb +154 -0
  49. data/lib/wc_data/generated/auth/token.rb +90 -0
  50. data/lib/wc_data/generated/auth/user_pass_auth_session_cred.rb +92 -0
  51. data/lib/wc_data/generated/auth/user_pass_cred.rb +70 -0
  52. data/lib/wc_data/generated/dates/approx_date.rb +82 -0
  53. data/lib/wc_data/generated/dates/approx_date_time.rb +62 -0
  54. data/lib/wc_data/generated/dates/date.rb +86 -0
  55. data/lib/wc_data/generated/dates/date_time.rb +82 -0
  56. data/lib/wc_data/generated/dates/day.rb +56 -0
  57. data/lib/wc_data/generated/dates/hour.rb +56 -0
  58. data/lib/wc_data/generated/dates/millisecond.rb +56 -0
  59. data/lib/wc_data/generated/dates/minute.rb +56 -0
  60. data/lib/wc_data/generated/dates/month.rb +56 -0
  61. data/lib/wc_data/generated/dates/second.rb +56 -0
  62. data/lib/wc_data/generated/dates/structured_approx_date.rb +82 -0
  63. data/lib/wc_data/generated/dates/time.rb +102 -0
  64. data/lib/wc_data/generated/dates/year.rb +56 -0
  65. data/lib/wc_data/generated/methods/add_application/info.rb +375 -0
  66. data/lib/wc_data/generated/methods/create_authenticated_session_token/auth_token_info.rb +72 -0
  67. data/lib/wc_data/generated/methods/create_authenticated_session_token/credential.rb +88 -0
  68. data/lib/wc_data/generated/methods/create_authenticated_session_token/info.rb +50 -0
  69. data/lib/wc_data/generated/methods/create_connect_request/info.rb +136 -0
  70. data/lib/wc_data/generated/methods/delete_open_query/info.rb +50 -0
  71. data/lib/wc_data/generated/methods/delete_pending_connect_request/info.rb +49 -0
  72. data/lib/wc_data/generated/methods/get_authorized_connect_requests/info.rb +48 -0
  73. data/lib/wc_data/generated/methods/get_authorized_records/info.rb +52 -0
  74. data/lib/wc_data/generated/methods/get_open_query_info/info.rb +50 -0
  75. data/lib/wc_data/generated/methods/get_person_info/info.rb +48 -0
  76. data/lib/wc_data/generated/methods/get_thing_type/info.rb +118 -0
  77. data/lib/wc_data/generated/methods/get_thing_type/thing_type_section_spec.rb +63 -0
  78. data/lib/wc_data/generated/methods/get_things/info.rb +51 -0
  79. data/lib/wc_data/generated/methods/get_things/thing_filter_spec.rb +296 -0
  80. data/lib/wc_data/generated/methods/get_things/thing_format_spec.rb +75 -0
  81. data/lib/wc_data/generated/methods/get_things/thing_request_group.rb +197 -0
  82. data/lib/wc_data/generated/methods/get_things/thing_section_spec.rb +67 -0
  83. data/lib/wc_data/generated/methods/get_vocabulary/info.rb +48 -0
  84. data/lib/wc_data/generated/methods/get_vocabulary/vocabulary_parameters.rb +73 -0
  85. data/lib/wc_data/generated/methods/put_things/info.rb +51 -0
  86. data/lib/wc_data/generated/methods/query_permissions/info.rb +51 -0
  87. data/lib/wc_data/generated/methods/remove_things/info.rb +52 -0
  88. data/lib/wc_data/generated/methods/response/add_application/info.rb +51 -0
  89. data/lib/wc_data/generated/methods/response/any/info.rb +52 -0
  90. data/lib/wc_data/generated/methods/response/create_authenticated_session_token/app_auth_token_absence_reason.rb +72 -0
  91. data/lib/wc_data/generated/methods/response/create_authenticated_session_token/auth_token_absence_reason.rb +49 -0
  92. data/lib/wc_data/generated/methods/response/create_authenticated_session_token/info.rb +78 -0
  93. data/lib/wc_data/generated/methods/response/create_connect_request/info.rb +52 -0
  94. data/lib/wc_data/generated/methods/response/delete_open_query/info.rb +52 -0
  95. data/lib/wc_data/generated/methods/response/get_application_settings/app_settings.rb +54 -0
  96. data/lib/wc_data/generated/methods/response/get_application_settings/info.rb +70 -0
  97. data/lib/wc_data/generated/methods/response/get_authorized_connect_requests/connect_request.rb +114 -0
  98. data/lib/wc_data/generated/methods/response/get_authorized_connect_requests/info.rb +72 -0
  99. data/lib/wc_data/generated/methods/response/get_authorized_records/info.rb +53 -0
  100. data/lib/wc_data/generated/methods/response/get_people_for_record/info.rb +76 -0
  101. data/lib/wc_data/generated/methods/response/get_person_info/info.rb +52 -0
  102. data/lib/wc_data/generated/methods/response/get_service_definition/configuration_entry.rb +71 -0
  103. data/lib/wc_data/generated/methods/response/get_service_definition/info.rb +141 -0
  104. data/lib/wc_data/generated/methods/response/get_service_definition/platform.rb +98 -0
  105. data/lib/wc_data/generated/methods/response/get_service_definition/sdk_assembly.rb +94 -0
  106. data/lib/wc_data/generated/methods/response/get_service_definition/shell.rb +95 -0
  107. data/lib/wc_data/generated/methods/response/get_service_definition/shell_redirect_token.rb +93 -0
  108. data/lib/wc_data/generated/methods/response/get_service_definition/xml_method.rb +75 -0
  109. data/lib/wc_data/generated/methods/response/get_service_definition/xml_method_version.rb +92 -0
  110. data/lib/wc_data/generated/methods/response/get_thing_type/column.rb +130 -0
  111. data/lib/wc_data/generated/methods/response/get_thing_type/columns.rb +52 -0
  112. data/lib/wc_data/generated/methods/response/get_thing_type/image.rb +71 -0
  113. data/lib/wc_data/generated/methods/response/get_thing_type/info.rb +53 -0
  114. data/lib/wc_data/generated/methods/response/get_thing_type/thing_type_info.rb +232 -0
  115. data/lib/wc_data/generated/methods/response/get_thing_type/transform_source.rb +72 -0
  116. data/lib/wc_data/generated/methods/response/get_thing_type/transforms.rb +52 -0
  117. data/lib/wc_data/generated/methods/response/get_things/info.rb +54 -0
  118. data/lib/wc_data/generated/methods/response/get_things/thing_response_group.rb +118 -0
  119. data/lib/wc_data/generated/methods/response/get_things/unprocessed_thing_key_info.rb +95 -0
  120. data/lib/wc_data/generated/methods/response/get_vocabulary/info.rb +76 -0
  121. data/lib/wc_data/generated/methods/response/put_things/info.rb +53 -0
  122. data/lib/wc_data/generated/methods/response/query_permissions/info.rb +54 -0
  123. data/lib/wc_data/generated/methods/response/query_permissions/permissions.rb +53 -0
  124. data/lib/wc_data/generated/methods/response/query_permissions/thing_type_permission.rb +89 -0
  125. data/lib/wc_data/generated/methods/response/search_vocabulary/info.rb +74 -0
  126. data/lib/wc_data/generated/methods/save_open_query/info.rb +227 -0
  127. data/lib/wc_data/generated/methods/search_vocabulary/info.rb +70 -0
  128. data/lib/wc_data/generated/methods/search_vocabulary/vocabulary_search_params.rb +69 -0
  129. data/lib/wc_data/generated/methods/search_vocabulary/vocabulary_search_string.rb +68 -0
  130. data/lib/wc_data/generated/methods/send_insecure_message/info.rb +155 -0
  131. data/lib/wc_data/generated/methods/send_insecure_message_from_application/from_mailbox.rb +71 -0
  132. data/lib/wc_data/generated/methods/send_insecure_message_from_application/info.rb +178 -0
  133. data/lib/wc_data/generated/methods/set_application_settings/app_settings.rb +52 -0
  134. data/lib/wc_data/generated/methods/set_application_settings/info.rb +48 -0
  135. data/lib/wc_data/generated/methods/update_application/info.rb +384 -0
  136. data/lib/wc_data/generated/methods/update_external_id/info.rb +70 -0
  137. data/lib/wc_data/generated/record/active_app_authorization.rb +196 -0
  138. data/lib/wc_data/generated/record/active_person_authorization.rb +290 -0
  139. data/lib/wc_data/generated/record/active_person_authorization_no_ids.rb +250 -0
  140. data/lib/wc_data/generated/record/authorized_record_state.rb +53 -0
  141. data/lib/wc_data/generated/record/non_active_authorization.rb +340 -0
  142. data/lib/wc_data/generated/record/non_active_authorization_no_ids.rb +300 -0
  143. data/lib/wc_data/generated/request/authenticated_session_info.rb +88 -0
  144. data/lib/wc_data/generated/request/header.rb +274 -0
  145. data/lib/wc_data/generated/request/info.rb +48 -0
  146. data/lib/wc_data/generated/request/offline_person_info.rb +46 -0
  147. data/lib/wc_data/generated/request/request.rb +86 -0
  148. data/lib/wc_data/generated/request/xsl.rb +64 -0
  149. data/lib/wc_data/generated/thing/access_avenue.rb +49 -0
  150. data/lib/wc_data/generated/thing/aerobic/aerobic_session.rb +112 -0
  151. data/lib/wc_data/generated/thing/aerobic_profile/aerobic_profile.rb +153 -0
  152. data/lib/wc_data/generated/thing/aerobic_profile/heartrate_zone.rb +90 -0
  153. data/lib/wc_data/generated/thing/aerobic_profile/heartrate_zone_group.rb +72 -0
  154. data/lib/wc_data/generated/thing/aerobic_profile/max_vo2.rb +68 -0
  155. data/lib/wc_data/generated/thing/aerobic_profile/zone_boundary.rb +68 -0
  156. data/lib/wc_data/generated/thing/aerobic_weekly/aerobic_weekly.rb +72 -0
  157. data/lib/wc_data/generated/thing/allergic_episode/allergic_episode.rb +108 -0
  158. data/lib/wc_data/generated/thing/allergy/allergy.rb +186 -0
  159. data/lib/wc_data/generated/thing/annotation/annotation.rb +144 -0
  160. data/lib/wc_data/generated/thing/application/app_specific.rb +137 -0
  161. data/lib/wc_data/generated/thing/appointment/appointment.rb +166 -0
  162. data/lib/wc_data/generated/thing/audit.rb +150 -0
  163. data/lib/wc_data/generated/thing/audit_action.rb +53 -0
  164. data/lib/wc_data/generated/thing/basic/basic.rb +180 -0
  165. data/lib/wc_data/generated/thing/basic/birthyear.rb +58 -0
  166. data/lib/wc_data/generated/thing/basic/country.rb +45 -0
  167. data/lib/wc_data/generated/thing/basic/firstdow.rb +58 -0
  168. data/lib/wc_data/generated/thing/basic/gender.rb +51 -0
  169. data/lib/wc_data/generated/thing/blood_glucose/blood_glucose.rb +172 -0
  170. data/lib/wc_data/generated/thing/blood_pressure/blood_pressure.rb +133 -0
  171. data/lib/wc_data/generated/thing/cardiac_profile/cardiac_profile.rb +209 -0
  172. data/lib/wc_data/generated/thing/cholesterol_profile/cholesterol_profile.rb +129 -0
  173. data/lib/wc_data/generated/thing/common.rb +126 -0
  174. data/lib/wc_data/generated/thing/concern/concern.rb +71 -0
  175. data/lib/wc_data/generated/thing/condition/condition.rb +127 -0
  176. data/lib/wc_data/generated/thing/contact/contact.rb +49 -0
  177. data/lib/wc_data/generated/thing/contraindication/contraindication.rb +129 -0
  178. data/lib/wc_data/generated/thing/daily_medication_usage/daily_medication_usage.rb +218 -0
  179. data/lib/wc_data/generated/thing/data_other.rb +82 -0
  180. data/lib/wc_data/generated/thing/data_xml.rb +80 -0
  181. data/lib/wc_data/generated/thing/diabetic_profile/diabetic_profile.rb +92 -0
  182. data/lib/wc_data/generated/thing/diabetic_profile/target_glucose_zone.rb +90 -0
  183. data/lib/wc_data/generated/thing/diabetic_profile/target_glucose_zone_group.rb +72 -0
  184. data/lib/wc_data/generated/thing/diabetic_profile/zone_boundary.rb +68 -0
  185. data/lib/wc_data/generated/thing/dietary_intake_daily/dietary_intake_daily.rb +249 -0
  186. data/lib/wc_data/generated/thing/directive/directive.rb +343 -0
  187. data/lib/wc_data/generated/thing/discharge_summary/discharge_summary.rb +366 -0
  188. data/lib/wc_data/generated/thing/effective_permissions.rb +66 -0
  189. data/lib/wc_data/generated/thing/emotion/emotion.rb +109 -0
  190. data/lib/wc_data/generated/thing/encounter/encounter.rb +143 -0
  191. data/lib/wc_data/generated/thing/equipment/device.rb +163 -0
  192. data/lib/wc_data/generated/thing/extension.rb +123 -0
  193. data/lib/wc_data/generated/thing/family_history/family_history.rb +203 -0
  194. data/lib/wc_data/generated/thing/family_history_condition/family_history_condition.rb +49 -0
  195. data/lib/wc_data/generated/thing/family_history_person/family_history_person.rb +107 -0
  196. data/lib/wc_data/generated/thing/file/file.rb +90 -0
  197. data/lib/wc_data/generated/thing/guid_and_name.rb +66 -0
  198. data/lib/wc_data/generated/thing/hb_a1_c/hb_a1_c.rb +111 -0
  199. data/lib/wc_data/generated/thing/healthcare_proxy/healthcare_proxy.rb +144 -0
  200. data/lib/wc_data/generated/thing/height/height.rb +71 -0
  201. data/lib/wc_data/generated/thing/immunization/immunization.rb +244 -0
  202. data/lib/wc_data/generated/thing/inhaler/alert.rb +74 -0
  203. data/lib/wc_data/generated/thing/inhaler/asthma_inhaler.rb +272 -0
  204. data/lib/wc_data/generated/thing/inhaler/dow.rb +58 -0
  205. data/lib/wc_data/generated/thing/inhaler/purpose.rb +55 -0
  206. data/lib/wc_data/generated/thing/inhaler_use/asthma_inhaler_use.rb +152 -0
  207. data/lib/wc_data/generated/thing/insulin/insulin_injection.rb +93 -0
  208. data/lib/wc_data/generated/thing/insulin_injection_use/diabetes_insulin_injection_use.rb +114 -0
  209. data/lib/wc_data/generated/thing/lab_test_results/lab_test_results.rb +89 -0
  210. data/lib/wc_data/generated/thing/life_goal/life_goal.rb +68 -0
  211. data/lib/wc_data/generated/thing/link/link.rb +68 -0
  212. data/lib/wc_data/generated/thing/medication/dose_value.rb +107 -0
  213. data/lib/wc_data/generated/thing/medication/medication.rb +491 -0
  214. data/lib/wc_data/generated/thing/microbiology/microbiology_lab_results.rb +186 -0
  215. data/lib/wc_data/generated/thing/password/protected/package/algorithm_name.rb +59 -0
  216. data/lib/wc_data/generated/thing/password/protected/package/package_encryption_type.rb +71 -0
  217. data/lib/wc_data/generated/thing/password/protected/package/password_protected_package.rb +53 -0
  218. data/lib/wc_data/generated/thing/password/protected/package/pbe_parameters_type.rb +97 -0
  219. data/lib/wc_data/generated/thing/payer/payer.rb +265 -0
  220. data/lib/wc_data/generated/thing/personal/personal.rb +303 -0
  221. data/lib/wc_data/generated/thing/personal_image/personal_image.rb +28 -0
  222. data/lib/wc_data/generated/thing/problem/importance.rb +45 -0
  223. data/lib/wc_data/generated/thing/problem/problem.rb +114 -0
  224. data/lib/wc_data/generated/thing/procedure/procedure.rb +125 -0
  225. data/lib/wc_data/generated/thing/radiology_lab_results/radiology_lab_results.rb +106 -0
  226. data/lib/wc_data/generated/thing/related_thing.rb +88 -0
  227. data/lib/wc_data/generated/thing/respiratory_profile/respiratory_profile.rb +109 -0
  228. data/lib/wc_data/generated/thing/sjam/awakening.rb +70 -0
  229. data/lib/wc_data/generated/thing/sjam/sleep_am.rb +195 -0
  230. data/lib/wc_data/generated/thing/sjam/wake_state.rb +58 -0
  231. data/lib/wc_data/generated/thing/sjpm/activity.rb +70 -0
  232. data/lib/wc_data/generated/thing/sjpm/sleep_pm.rb +162 -0
  233. data/lib/wc_data/generated/thing/sjpm/sleepiness.rb +58 -0
  234. data/lib/wc_data/generated/thing/spirometer/spirometer.rb +317 -0
  235. data/lib/wc_data/generated/thing/spirometer/volume_value.rb +69 -0
  236. data/lib/wc_data/generated/thing/thing.rb +213 -0
  237. data/lib/wc_data/generated/thing/thing_key.rb +66 -0
  238. data/lib/wc_data/generated/thing/thing_state.rb +49 -0
  239. data/lib/wc_data/generated/thing/thing_type.rb +64 -0
  240. data/lib/wc_data/generated/thing/types/address.rb +176 -0
  241. data/lib/wc_data/generated/thing/types/aerobic_lap_session.rb +86 -0
  242. data/lib/wc_data/generated/thing/types/aerobic_session.rb +745 -0
  243. data/lib/wc_data/generated/thing/types/aerobic_session_samples.rb +310 -0
  244. data/lib/wc_data/generated/thing/types/altitude_value.rb +70 -0
  245. data/lib/wc_data/generated/thing/types/blood_glucose_value.rb +69 -0
  246. data/lib/wc_data/generated/thing/types/codable_value.rb +74 -0
  247. data/lib/wc_data/generated/thing/types/coded_value.rb +112 -0
  248. data/lib/wc_data/generated/thing/types/communication_type.rb +112 -0
  249. data/lib/wc_data/generated/thing/types/condition.rb +148 -0
  250. data/lib/wc_data/generated/thing/types/contact.rb +97 -0
  251. data/lib/wc_data/generated/thing/types/display_value.rb +90 -0
  252. data/lib/wc_data/generated/thing/types/document_reference_type.rb +112 -0
  253. data/lib/wc_data/generated/thing/types/double_range.rb +70 -0
  254. data/lib/wc_data/generated/thing/types/dow.rb +58 -0
  255. data/lib/wc_data/generated/thing/types/duration_value.rb +69 -0
  256. data/lib/wc_data/generated/thing/types/email.rb +89 -0
  257. data/lib/wc_data/generated/thing/types/flow_value.rb +69 -0
  258. data/lib/wc_data/generated/thing/types/general_measurement.rb +74 -0
  259. data/lib/wc_data/generated/thing/types/goal.rb +86 -0
  260. data/lib/wc_data/generated/thing/types/goal_status.rb +55 -0
  261. data/lib/wc_data/generated/thing/types/insulin_injection_value.rb +69 -0
  262. data/lib/wc_data/generated/thing/types/lab_result_type.rb +149 -0
  263. data/lib/wc_data/generated/thing/types/lab_test_result_type.rb +167 -0
  264. data/lib/wc_data/generated/thing/types/lab_test_result_value_type.rb +99 -0
  265. data/lib/wc_data/generated/thing/types/lab_test_results_group_type.rb +138 -0
  266. data/lib/wc_data/generated/thing/types/lab_test_type.rb +209 -0
  267. data/lib/wc_data/generated/thing/types/language.rb +69 -0
  268. data/lib/wc_data/generated/thing/types/length_value.rb +69 -0
  269. data/lib/wc_data/generated/thing/types/name.rb +148 -0
  270. data/lib/wc_data/generated/thing/types/non_negative_double.rb +45 -0
  271. data/lib/wc_data/generated/thing/types/one_to_five.rb +58 -0
  272. data/lib/wc_data/generated/thing/types/organization.rb +106 -0
  273. data/lib/wc_data/generated/thing/types/pace_value.rb +69 -0
  274. data/lib/wc_data/generated/thing/types/percentage.rb +58 -0
  275. data/lib/wc_data/generated/thing/types/person.rb +146 -0
  276. data/lib/wc_data/generated/thing/types/phone.rb +89 -0
  277. data/lib/wc_data/generated/thing/types/positive_double.rb +45 -0
  278. data/lib/wc_data/generated/thing/types/power_value.rb +69 -0
  279. data/lib/wc_data/generated/thing/types/sample.rb +88 -0
  280. data/lib/wc_data/generated/thing/types/sample_set.rb +116 -0
  281. data/lib/wc_data/generated/thing/types/speed_value.rb +69 -0
  282. data/lib/wc_data/generated/thing/types/structured_measurement.rb +71 -0
  283. data/lib/wc_data/generated/thing/types/temperature_value.rb +69 -0
  284. data/lib/wc_data/generated/thing/types/test_result_range.rb +71 -0
  285. data/lib/wc_data/generated/thing/types/torque_value.rb +69 -0
  286. data/lib/wc_data/generated/thing/types/weight_value.rb +69 -0
  287. data/lib/wc_data/generated/thing/vital_signs/vital_sign_result_type.rb +166 -0
  288. data/lib/wc_data/generated/thing/vital_signs/vital_signs.rb +110 -0
  289. data/lib/wc_data/generated/thing/weight/weight.rb +70 -0
  290. data/lib/wc_data/generated/thing/weight_goal/weight_goal.rb +106 -0
  291. data/lib/wc_data/generated/types/address.rb +162 -0
  292. data/lib/wc_data/generated/types/app_info.rb +66 -0
  293. data/lib/wc_data/generated/types/app_server_cred.rb +70 -0
  294. data/lib/wc_data/generated/types/app_server_cred_info.rb +70 -0
  295. data/lib/wc_data/generated/types/app_settings.rb +50 -0
  296. data/lib/wc_data/generated/types/base64_sha1.rb +56 -0
  297. data/lib/wc_data/generated/types/card_space_cred.rb +50 -0
  298. data/lib/wc_data/generated/types/char2.rb +56 -0
  299. data/lib/wc_data/generated/types/codable_value.rb +72 -0
  300. data/lib/wc_data/generated/types/coded_value.rb +110 -0
  301. data/lib/wc_data/generated/types/culture.rb +64 -0
  302. data/lib/wc_data/generated/types/date_range.rb +62 -0
  303. data/lib/wc_data/generated/types/email.rb +82 -0
  304. data/lib/wc_data/generated/types/email_address.rb +56 -0
  305. data/lib/wc_data/generated/types/gender.rb +49 -0
  306. data/lib/wc_data/generated/types/group.rb +91 -0
  307. data/lib/wc_data/generated/types/groups.rb +50 -0
  308. data/lib/wc_data/generated/types/guid.rb +43 -0
  309. data/lib/wc_data/generated/types/hash_finalized.rb +48 -0
  310. data/lib/wc_data/generated/types/hash_finalized_data.rb +68 -0
  311. data/lib/wc_data/generated/types/hmac_algorithm.rb +48 -0
  312. data/lib/wc_data/generated/types/hmac_algorithm_data.rb +68 -0
  313. data/lib/wc_data/generated/types/hmac_finalized.rb +48 -0
  314. data/lib/wc_data/generated/types/hmac_finalized_data.rb +68 -0
  315. data/lib/wc_data/generated/types/iso3166.rb +1001 -0
  316. data/lib/wc_data/generated/types/iso4217.rb +733 -0
  317. data/lib/wc_data/generated/types/iso639_1.rb +585 -0
  318. data/lib/wc_data/generated/types/language_competency.rb +64 -0
  319. data/lib/wc_data/generated/types/localized_string.rb +64 -0
  320. data/lib/wc_data/generated/types/login_name.rb +56 -0
  321. data/lib/wc_data/generated/types/name_match_type.rb +53 -0
  322. data/lib/wc_data/generated/types/omb_ethnicity.rb +65 -0
  323. data/lib/wc_data/generated/types/open_query_info.rb +149 -0
  324. data/lib/wc_data/generated/types/permission.rb +61 -0
  325. data/lib/wc_data/generated/types/person_info.rb +214 -0
  326. data/lib/wc_data/generated/types/phone.rb +82 -0
  327. data/lib/wc_data/generated/types/positive_long.rb +43 -0
  328. data/lib/wc_data/generated/types/puid.rb +43 -0
  329. data/lib/wc_data/generated/types/rcpt_address.rb +69 -0
  330. data/lib/wc_data/generated/types/rcpt_person.rb +68 -0
  331. data/lib/wc_data/generated/types/rcpt_record.rb +48 -0
  332. data/lib/wc_data/generated/types/record.rb +264 -0
  333. data/lib/wc_data/generated/types/record_state.rb +57 -0
  334. data/lib/wc_data/generated/types/sig.rb +112 -0
  335. data/lib/wc_data/generated/types/string1024.rb +56 -0
  336. data/lib/wc_data/generated/types/string128.rb +56 -0
  337. data/lib/wc_data/generated/types/string16.rb +56 -0
  338. data/lib/wc_data/generated/types/string255.rb +56 -0
  339. data/lib/wc_data/generated/types/string32.rb +56 -0
  340. data/lib/wc_data/generated/types/string512.rb +56 -0
  341. data/lib/wc_data/generated/types/string64.rb +56 -0
  342. data/lib/wc_data/generated/types/stringnz.rb +43 -0
  343. data/lib/wc_data/generated/types/stringz1024.rb +56 -0
  344. data/lib/wc_data/generated/types/stringz128.rb +56 -0
  345. data/lib/wc_data/generated/types/stringz16.rb +56 -0
  346. data/lib/wc_data/generated/types/stringz255.rb +56 -0
  347. data/lib/wc_data/generated/types/stringz32.rb +56 -0
  348. data/lib/wc_data/generated/types/stringz512.rb +56 -0
  349. data/lib/wc_data/generated/types/stringz64.rb +56 -0
  350. data/lib/wc_data/generated/types/url.rb +56 -0
  351. data/lib/wc_data/generated/types/version.rb +56 -0
  352. data/lib/wc_data/generated/vocab/info_xml.rb +46 -0
  353. data/lib/wc_data/generated/vocab/vocabulary_code_item.rb +104 -0
  354. data/lib/wc_data/generated/vocab/vocabulary_code_set.rb +133 -0
  355. data/lib/wc_data/generated/vocab/vocabulary_key.rb +106 -0
  356. data/lib/wc_data/generated/vocab/vocabulary_key_info.rb +26 -0
  357. data/lib/wc_data/init.rb +27 -0
  358. data/lib/wc_data/raw_info_xml.rb +12 -0
  359. data/lib/wc_data/simple_type.rb +16 -0
  360. data/lib/wc_data/thing.rb +78 -0
  361. data/lib/xsd/bootstrap/request.xsd +107 -0
  362. data/lib/xsd/bootstrap/response-getservicedefinition.xsd +119 -0
  363. data/lib/xsd/bootstrap/types.xsd +1117 -0
  364. data/lib/xsd/common/application.xsd +766 -0
  365. data/lib/xsd/common/auth.xsd +1093 -0
  366. data/lib/xsd/common/dates.xsd +510 -0
  367. data/lib/xsd/common/record.xsd +1160 -0
  368. data/lib/xsd/common/request.xsd +524 -0
  369. data/lib/xsd/common/thing.xsd +881 -0
  370. data/lib/xsd/common/types.xsd +3131 -0
  371. data/lib/xsd/common/vocab.xsd +359 -0
  372. data/lib/xsd/requests/method-addapplication.xsd +349 -0
  373. data/lib/xsd/requests/method-createauthenticatedsessiontoken.xsd +216 -0
  374. data/lib/xsd/requests/method-createconnectrequest.xsd +143 -0
  375. data/lib/xsd/requests/method-deleteopenquery.xsd +75 -0
  376. data/lib/xsd/requests/method-deletependingconnectrequest.xsd +77 -0
  377. data/lib/xsd/requests/method-getauthorizedconnectrequests.xsd +78 -0
  378. data/lib/xsd/requests/method-getauthorizedrecords.xsd +82 -0
  379. data/lib/xsd/requests/method-getopenqueryinfo.xsd +74 -0
  380. data/lib/xsd/requests/method-getpersoninfo.xsd +80 -0
  381. data/lib/xsd/requests/method-getthings.xsd +516 -0
  382. data/lib/xsd/requests/method-getthingtype.xsd +201 -0
  383. data/lib/xsd/requests/method-getvocabulary.xsd +135 -0
  384. data/lib/xsd/requests/method-putthings.xsd +80 -0
  385. data/lib/xsd/requests/method-querypermissions.xsd +79 -0
  386. data/lib/xsd/requests/method-removethings.xsd +78 -0
  387. data/lib/xsd/requests/method-saveopenquery.xsd +219 -0
  388. data/lib/xsd/requests/method-searchvocabulary.xsd +222 -0
  389. data/lib/xsd/requests/method-sendinsecuremessage.xsd +185 -0
  390. data/lib/xsd/requests/method-sendinsecuremessagefromapplication.xsd +274 -0
  391. data/lib/xsd/requests/method-setapplicationsettings.xsd +166 -0
  392. data/lib/xsd/requests/method-updateapplication.xsd +357 -0
  393. data/lib/xsd/requests/method-updateexternalid.xsd +84 -0
  394. data/lib/xsd/responses/response-addapplication.xsd +79 -0
  395. data/lib/xsd/responses/response-any.xsd +59 -0
  396. data/lib/xsd/responses/response-createauthenticatedsessiontoken.xsd +167 -0
  397. data/lib/xsd/responses/response-createconnectrequest.xsd +88 -0
  398. data/lib/xsd/responses/response-deleteopenquery.xsd +87 -0
  399. data/lib/xsd/responses/response-getapplicationsettings.xsd +192 -0
  400. data/lib/xsd/responses/response-getauthorizedconnectrequests.xsd +135 -0
  401. data/lib/xsd/responses/response-getauthorizedrecords.xsd +76 -0
  402. data/lib/xsd/responses/response-getopenqueryinfo.xsd +64 -0
  403. data/lib/xsd/responses/response-getpeopleforrecord.xsd +95 -0
  404. data/lib/xsd/responses/response-getpersoninfo.xsd +87 -0
  405. data/lib/xsd/responses/response-getservicedefinition.xsd +515 -0
  406. data/lib/xsd/responses/response-getthings.xsd +198 -0
  407. data/lib/xsd/responses/response-getthingtype.xsd +457 -0
  408. data/lib/xsd/responses/response-getvocabulary.xsd +93 -0
  409. data/lib/xsd/responses/response-putthings.xsd +63 -0
  410. data/lib/xsd/responses/response-querypermissions.xsd +182 -0
  411. data/lib/xsd/responses/response-saveopenquery.xsd +62 -0
  412. data/lib/xsd/responses/response-searchvocabulary.xsd +90 -0
  413. data/lib/xsd/things/Advance Directive.xsd +60 -0
  414. data/lib/xsd/things/Aerobic Exercise Session.xsd +19 -0
  415. data/lib/xsd/things/Aerobic Profile.xsd +143 -0
  416. data/lib/xsd/things/Allergic Episode.xsd +17 -0
  417. data/lib/xsd/things/Allergy.xsd +39 -0
  418. data/lib/xsd/things/Application-Specific Information.xsd +42 -0
  419. data/lib/xsd/things/Appointment.xsd +24 -0
  420. data/lib/xsd/things/Asthma Inhaler Usage.xsd +44 -0
  421. data/lib/xsd/things/Asthma Inhaler.xsd +99 -0
  422. data/lib/xsd/things/Base Thing Type.xsd +1000 -0
  423. data/lib/xsd/things/Basic Demographic Information.xsd +49 -0
  424. data/lib/xsd/things/Blood Glucose Measurement.xsd +28 -0
  425. data/lib/xsd/things/Blood Pressure Measurement.xsd +30 -0
  426. data/lib/xsd/things/Cardiac Profile.xsd +80 -0
  427. data/lib/xsd/things/Cholesterol Profile (Lipid Profile).xsd +38 -0
  428. data/lib/xsd/things/Concern.xsd +17 -0
  429. data/lib/xsd/things/Condition.xsd +28 -0
  430. data/lib/xsd/things/Continuity of Care Record.xsd +3 -0
  431. data/lib/xsd/things/Contraindication.xsd +27 -0
  432. data/lib/xsd/things/Daily Dietary Intake.xsd +51 -0
  433. data/lib/xsd/things/Daily Medication Usage.xsd +41 -0
  434. data/lib/xsd/things/Device.xsd +24 -0
  435. data/lib/xsd/things/Diabetes Insulin Injection Use.xsd +26 -0
  436. data/lib/xsd/things/Diabetic Profile.xsd +92 -0
  437. data/lib/xsd/things/Discharge Summary.xsd +43 -0
  438. data/lib/xsd/things/Emergency or Provider Contact.xsd +11 -0
  439. data/lib/xsd/things/Emotional State.xsd +24 -0
  440. data/lib/xsd/things/Encounter (old).xsd +21 -0
  441. data/lib/xsd/things/Encounter.xsd +19 -0
  442. data/lib/xsd/things/Family History Condition.xsd +12 -0
  443. data/lib/xsd/things/Family History Person.xsd +18 -0
  444. data/lib/xsd/things/Family History.xsd +27 -0
  445. data/lib/xsd/things/File.xsd +28 -0
  446. data/lib/xsd/things/HL7 Continuity of Care Document.xsd +33 -0
  447. data/lib/xsd/things/HbA1C Measurement.xsd +23 -0
  448. data/lib/xsd/things/Healthcare Proxy.xsd +21 -0
  449. data/lib/xsd/things/Height Measurement.xsd +13 -0
  450. data/lib/xsd/things/Immunization.xsd +32 -0
  451. data/lib/xsd/things/Insulin Injection.xsd +30 -0
  452. data/lib/xsd/things/Insurance Plan.xsd +46 -0
  453. data/lib/xsd/things/Lab Test Result.xsd +11 -0
  454. data/lib/xsd/things/Life Goal.xsd +19 -0
  455. data/lib/xsd/things/Link.xsd +12 -0
  456. data/lib/xsd/things/Medical Annotation.xsd +21 -0
  457. data/lib/xsd/things/Medical Problem.xsd +15 -0
  458. data/lib/xsd/things/Medication.xsd +82 -0
  459. data/lib/xsd/things/Microbiology Lab Test Result.xsd +25 -0
  460. data/lib/xsd/things/Password Protected Package.xsd +23 -0
  461. data/lib/xsd/things/Personal Contact Information.xsd +18 -0
  462. data/lib/xsd/things/Personal Demographic Information.xsd +63 -0
  463. data/lib/xsd/things/Personal Image.xsd +13 -0
  464. data/lib/xsd/things/Procedure.xsd +19 -0
  465. data/lib/xsd/things/Radiology Lab Result.xsd +19 -0
  466. data/lib/xsd/things/Respiratory Profile.xsd +33 -0
  467. data/lib/xsd/things/Sleep Related Activity.xsd +45 -0
  468. data/lib/xsd/things/Sleep Session.xsd +51 -0
  469. data/lib/xsd/things/Spirometer Measurement.xsd +113 -0
  470. data/lib/xsd/things/Vital Signs.xsd +31 -0
  471. data/lib/xsd/things/Weekly Aerobic Exercise Goal.xsd +25 -0
  472. data/lib/xsd/things/Weight Goal.xsd +33 -0
  473. data/lib/xsd/things/Weight Measurement.xsd +10 -0
  474. data/spec/connection_spec.rb +17 -0
  475. data/spec/request_spec.rb +42 -0
  476. data/spec/support/test_server.rb +42 -0
  477. metadata +646 -0
@@ -0,0 +1,37 @@
1
+ # -*- ruby -*-
2
+ #--
3
+ # Copyright 2008 Danny Coates, Ashkan Farhadtouski
4
+ # All rights reserved.
5
+ # See LICENSE for permissions.
6
+ #++
7
+
8
+ require 'uri'
9
+ require File.dirname(__FILE__) + '/config'
10
+ require File.dirname(__FILE__) + '/connection'
11
+ require File.dirname(__FILE__) + '/utils/crypto_utils'
12
+
13
+ module HealthVault
14
+ class Application
15
+ attr_reader :id, :uri
16
+
17
+ def initialize(id, hv_uri, certificate_location, certificate_password)
18
+ @id = id
19
+ @uri = URI.parse(hv_uri)
20
+ @cert_file = certificate_location
21
+ @cert_pass = certificate_password
22
+ end
23
+
24
+ def key
25
+ return CryptoKey.new(@cert_file, @cert_pass)
26
+ end
27
+
28
+ def self.default
29
+ config = Configuration.instance
30
+ return Application.new(config.app_id, config.hv_url, config.cert_file, config.cert_pass)
31
+ end
32
+
33
+ def create_connection
34
+ return Connection.new(self)
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,376 @@
1
+ # -*- ruby -*-
2
+ #--
3
+ # Copyright 2008 Danny Coates, Ashkan Farhadtouski
4
+ # All rights reserved.
5
+ # See LICENSE for permissions.
6
+ #++
7
+
8
+ require 'rexml/document'
9
+ require 'erb'
10
+ require File.dirname(__FILE__) + "/../wc_data/complex_type"
11
+ require File.dirname(__FILE__) + "/../config"
12
+ require File.dirname(__FILE__) + "/../utils/string_utils"
13
+
14
+ module HealthVault
15
+ module CodeGeneration
16
+ class XSDParser
17
+ include StringUtils
18
+ include REXML
19
+
20
+ def initialize(filename)
21
+ cdir = File.dirname(__FILE__)
22
+ @filename = filename
23
+ @simple_template = cdir + "/../templates/simple_type_template.erb"
24
+ @complex_template = cdir + "/../templates/complex_type_template.erb"
25
+ @thing_ex_template = cdir + "/../templates/thing_class_extension_template.erb"
26
+ @file_path = cdir + "/../wc_data/generated"
27
+ @logger = Configuration.instance.logger
28
+ end
29
+
30
+ def add_thing(filename)
31
+ file = File.open(filename)
32
+ @xml = Document.new(file)
33
+ tgt_namespace = @xml.root.attribute('targetNamespace').to_s
34
+ mods = Array.new
35
+ begin
36
+ mods = (tgt_namespace.match(/urn\:com\.microsoft\.wc\.(.*)/)[1]).split('.')
37
+ guid = XPath.first(@xml.root, "//type-id").text.to_s#@xml.root.get_elements('annotation/documentation/type-id')[0].text.to_s
38
+ el = @xml.root.get_elements('element')[0]
39
+ cname = el.attribute('name').to_s
40
+ type = el.attribute('type').to_s
41
+ class_path = "HealthVault::WCData::"
42
+ if type.empty?
43
+ class_path += (mods.collect {|s| classify(s)}).join('::') + "::" + classify(cname)
44
+ else
45
+ namespaces = get_namespaces
46
+ class_path = get_class_path(type)
47
+ end
48
+ @thing_hash ||= Hash.new
49
+ @thing_hash[guid] = class_path
50
+ rescue
51
+ @logger.error "Not a HealthVault targetNamespace, can't parse #{@filename}"
52
+ return
53
+ end
54
+ end
55
+
56
+ def create_things
57
+ class_hash = @thing_hash
58
+ result = ""
59
+ File.open(File.dirname(__FILE__) + "/../wc_data/thing.rb", 'w') do |f|
60
+ e = ERB.new(File.read(@thing_ex_template), 0, '<>', 'result')
61
+ e.result(binding)
62
+ f << result
63
+ end
64
+ end
65
+
66
+ # creates ruby class files for the types defined in the xsd
67
+ def run(test = :no)
68
+ @test = test
69
+ file = File.open(@filename)
70
+ @xml = Document.new(file)
71
+ @namespaces = get_namespaces
72
+ @namespace = @xml.root.attribute('targetNamespace').to_s
73
+ begin
74
+ @modules = (@namespace.match(/urn\:com\.microsoft\.wc\.(.*)/)[1]).split('.')
75
+ rescue
76
+ @logger.error "Not a HealthVault targetNamespace, can't parse #{@filename}"
77
+ return
78
+ end
79
+ create_directories
80
+ root = @xml.root
81
+ root.elements.each do |e|
82
+ @element_order = 0
83
+ case e.name
84
+ when 'simpleType'
85
+ create_simple_type(e)
86
+ when 'complexType'
87
+ create_complex_type(e)
88
+ when 'element'
89
+ #root elements
90
+ parse_element(e)
91
+ # type = e.attribute('type').to_s
92
+ # #if the element has a type we can skip it
93
+ # #since we are only looking for new types
94
+ # next unless type.empty?
95
+ # #this element defines an anonymous type
96
+ # cname = e.attribute('name').to_s
97
+ # e.elements.each do |child|
98
+ # case child.name
99
+ # when 'simpleType'
100
+ # create_simple_type(child, cname)
101
+ # when 'complexType'
102
+ # create_complex_type(child, cname)
103
+ # end
104
+ # end
105
+ end
106
+ end
107
+ end
108
+
109
+ private
110
+
111
+ # get the wc namespaces used in this document
112
+ def get_namespaces
113
+ namespaces = Hash.new
114
+ root = @xml.root
115
+ root_attributes = root.attributes
116
+ root_attributes.each do |name, value|
117
+ if name.include?('xmlns:')
118
+ m = value.match(/urn\:com\.microsoft\.wc\.(.*)/)
119
+ unless m.nil?
120
+ mod = (m[1].split('.').collect {|s| classify(s)}).join('::')
121
+ namespaces[name.split(':')[-1]]= mod
122
+ end
123
+ end
124
+ end
125
+ return namespaces
126
+ end
127
+
128
+ # create the directory structure from the xsd namespace
129
+ def create_directories
130
+ unless File.exists?(@file_path)
131
+ Dir.mkdir(@file_path)
132
+ end
133
+ @modules.each do |m|
134
+ @file_path << "/#{underscore(m)}"
135
+ unless File.exists?(@file_path)
136
+ Dir.mkdir(@file_path)
137
+ end
138
+ end
139
+ end
140
+
141
+ # creates a ruby class file that extends SimpleType
142
+ def create_simple_type(e, cname = '')
143
+ cname = e.attribute('name').to_s if cname.empty?
144
+ cname = 'info' if cname.empty?
145
+ file_name = underscore(cname)
146
+ class_name = classify(cname)
147
+ restrictions = Hash.new
148
+ e.get_elements('restriction').each do |r|
149
+ restrictions = restrictions.merge(parse_restriction(r))
150
+ end
151
+ create_class_from_template(@simple_template, file_name, class_name, cname.downcase, "", restrictions)
152
+ end
153
+
154
+ # creates a ruby class file that extends ComplexType
155
+ def create_complex_type(e, cname = '')
156
+ cname = e.attribute('name').to_s if cname.empty?
157
+ children = Array.new
158
+ file_name = underscore(cname)
159
+ class_name = classify(cname)
160
+ cdoc = doc(e)
161
+ e.elements.each do |child|
162
+ case child.name
163
+ when 'sequence'
164
+ children += parse_sequence(child)
165
+ when 'simpleContent'
166
+ children += parse_simple_content(child)
167
+ when 'attribute'
168
+ n = parse_attribute(child)
169
+ children << n unless n.nil?
170
+ when 'choice'
171
+ children += parse_choice(child)
172
+ end
173
+ end
174
+ create_class_from_template(@complex_template, file_name, class_name, cname.downcase, cdoc, children)
175
+ end
176
+
177
+ #returns an Array of child node Hashes
178
+ def parse_sequence(e)
179
+ children = Array.new
180
+ e.elements.each do |child|
181
+ case child.name
182
+ when 'element'
183
+ n = parse_element(child)
184
+ children << n unless n.nil?
185
+ when 'choice'
186
+ children += parse_choice(child)
187
+ #TODO parse 'any' nodes
188
+ when 'any'
189
+ children << parse_any(child)
190
+ next
191
+ end
192
+ end
193
+ return children
194
+ end
195
+
196
+ #returns an Array of child node Hashes
197
+ def parse_simple_content(e)
198
+ children = Array.new
199
+ e.elements.each do |child|
200
+ case child.name
201
+ when 'extension'
202
+ children += parse_extension(child)
203
+ end
204
+ end
205
+ return children
206
+ end
207
+
208
+ #returns an Array of child node Hashes
209
+ def parse_extension(e)
210
+ children = Array.new
211
+ class_path = get_class_path(e.attribute('base').to_s)
212
+ children << {:name => 'data',
213
+ :class => class_path,
214
+ :min => '1',
215
+ :max => '1',
216
+ :order => 0,
217
+ :doc => doc(e),
218
+ :type => :extension
219
+ }
220
+ e.elements.each do |child|
221
+ case child.name
222
+ when 'attribute'
223
+ a = parse_attribute(child)
224
+ children << a unless a.nil?
225
+ end
226
+ end
227
+ return children
228
+ end
229
+
230
+ def parse_any(e)
231
+ min = e.attribute('minOccurs').to_s
232
+ max = e.attribute('maxOccurs').to_s
233
+ max = '1' if max.empty?
234
+ #TODO: make unbounded really unbounded
235
+ max = '999999' if max == 'unbounded'
236
+ min = '1' if min.empty?
237
+ @element_order += 1
238
+ return {:name => 'anything',
239
+ :class => HealthVault::WCData::ComplexType,
240
+ :min => min,
241
+ :max => max,
242
+ :order => @element_order,
243
+ :doc => doc(e),
244
+ :type => :extension,
245
+ :choice => 0
246
+ }
247
+ end
248
+
249
+ #returns a Hash of attribute properties for the template
250
+ def parse_attribute(e)
251
+ return {:name => e.attribute('name').to_s,
252
+ :class => get_class_path(e.attribute('type').to_s),
253
+ :min => e.attribute('use').to_s == 'required' ? '1' : '0',
254
+ :max => '1',
255
+ :order => 0,
256
+ :doc => doc(e),
257
+ :type => :attribute
258
+ }
259
+ end
260
+
261
+ #returns an Array of parsed elements (parse_element)
262
+ def parse_choice(e)
263
+ children = Array.new
264
+ min = e.attribute('minOccurs').to_s
265
+ max = e.attribute('maxOccurs').to_s
266
+ choice_id = rand(1 << 29).to_s
267
+ e.elements.each do |child|
268
+ case child.name
269
+ when 'element'
270
+ n = parse_element(child, choice_id, min, max)
271
+ children << n unless n.nil?
272
+ end
273
+ end
274
+ return children
275
+ end
276
+
277
+ #returns a Hash of element properties for the template
278
+ def parse_element(e, choice = nil, min = '', max = '')
279
+ type = e.attribute('type').to_s
280
+ cname = e.attribute('name').to_s
281
+ #TODO decide what to do with ref elements
282
+ return nil if cname.empty?
283
+ if type.empty?
284
+ #this element defines an anonymous type
285
+ e.elements.each do |child|
286
+ case child.name
287
+ when 'simpleType'
288
+ create_simple_type(child, cname)
289
+ when 'complexType'
290
+ create_complex_type(child, cname)
291
+ end
292
+ end
293
+ end
294
+ class_path = get_class_path(type)
295
+ max = e.attribute('maxOccurs').to_s if max.empty?
296
+ min = e.attribute('minOccurs').to_s if min.empty?
297
+ max = '1' if max.empty?
298
+ #TODO: make unbounded really unbounded
299
+ max = '999999' if max == 'unbounded'
300
+ min = '1' if min.empty?
301
+ @element_order += 1
302
+ return {:name => cname,
303
+ :class => class_path,
304
+ :min => min,
305
+ :max => max,
306
+ :doc => doc(e),
307
+ :choice => choice,
308
+ :type => :element,
309
+ :order => @element_order
310
+ }
311
+ end
312
+
313
+ def parse_restriction(e)
314
+ restrictions = Hash.new
315
+ restrictions['base'] = e.attribute('base').to_s
316
+ e.elements.each do |child|
317
+ name = child.name
318
+ case name
319
+ when 'enumeration'
320
+ restrictions[name] ||= Array.new
321
+ restrictions[name] << child.attribute('value').to_s
322
+ when 'annotation'
323
+ #noop
324
+ else
325
+ restrictions[name] = child.attribute('value').to_s
326
+ end
327
+ end
328
+ return restrictions
329
+ end
330
+
331
+ # returns a string from parsing the annotation/documentation of the given node
332
+ def doc(node)
333
+ result = ""
334
+ node.get_elements('annotation/documentation').each do |d|
335
+ d.elements.each do |e|
336
+ t = e.text.to_s.gsub(/\r|\n/, '').squeeze(' ').strip
337
+ unless t.empty?
338
+ result << "#<b>#{e.name}</b>: #{t}\n"
339
+ end
340
+ end
341
+ end
342
+ return result
343
+ end
344
+
345
+ # get the full classpath for the given type attribute
346
+ def get_class_path(type)
347
+ base = "HealthVault::WCData::"
348
+ comp = type.split(':')
349
+ @namespaces.each do |k,v|
350
+ if comp[0] == k
351
+ return base + v + "::#{classify(type.gsub(/.*:/, ''))}"
352
+ end
353
+ end
354
+ #TODO: parse xsd primatives
355
+ return "String"#base + classify(type.gsub(/wc-.*:/, ''))
356
+ end
357
+
358
+ # generate the .rb file with the given template
359
+ def create_class_from_template(template, file_name, class_name, tag_name, cdoc, children = [])
360
+ result = ''
361
+ modules = @modules
362
+ if @test == :yes
363
+ e = ERB.new(File.read(template), 0, '<>', 'result')
364
+ e.run(binding)
365
+ else
366
+ File.open(@file_path + "/#{file_name}.rb", 'w') do |f|
367
+ e = ERB.new(File.read(template), 0, '<>', 'result')
368
+ e.result(binding)
369
+ f << result
370
+ end
371
+ end
372
+ end
373
+
374
+ end
375
+ end
376
+ end
data/lib/config.rb ADDED
@@ -0,0 +1,28 @@
1
+ # -*- ruby -*-
2
+ #--
3
+ # Copyright 2008 Danny Coates, Ashkan Farhadtouski
4
+ # All rights reserved.
5
+ # See LICENSE for permissions.
6
+ #++
7
+
8
+ require 'logger'
9
+ require 'singleton'
10
+
11
+ module HealthVault
12
+ class Configuration
13
+ include Singleton
14
+ attr_accessor :app_id, :cert_file, :cert_pass, :shell_url, :hv_url, :logger
15
+
16
+ #default values to the HelloWorld sample.
17
+ #theses should be set by your application
18
+ #using HealthVault::Configuration.instance accessor methods
19
+ def initialize
20
+ @app_id = "05a059c9-c309-46af-9b86-b06d42510550"
21
+ @cert_file = File.dirname(__FILE__) + "/../bin/certs/helloWorld.pem"
22
+ @cert_pass = ""
23
+ @shell_url = "https://account.healthvault-ppe.com"
24
+ @hv_url = "https://platform.healthvault-ppe.com/platform/wildcat.ashx"
25
+ @logger = Logger.new("hv.log")
26
+ end
27
+ end
28
+ end
data/lib/connection.rb ADDED
@@ -0,0 +1,61 @@
1
+ # -*- ruby -*-
2
+ #--
3
+ # Copyright 2008 Danny Coates, Ashkan Farhadtouski
4
+ # All rights reserved.
5
+ # See LICENSE for permissions.
6
+ #++
7
+
8
+ require 'net/https'
9
+ require File.dirname(__FILE__) + '/request'
10
+ require File.dirname(__FILE__) + '/response'
11
+ require File.dirname(__FILE__) + '/utils/crypto_utils'
12
+
13
+ module HealthVault
14
+ class Connection
15
+ include WCData
16
+ attr_accessor :user_auth_token
17
+ attr_reader :session_token, :shared_secret, :application
18
+
19
+ def initialize(application)
20
+ @application = application
21
+ end
22
+
23
+ def authenticate
24
+ @shared_secret = CryptoUtils.create_shared_secret
25
+ @session_token = nil
26
+ request = Request.create("CreateAuthenticatedSessionToken", self)
27
+ request.info.auth_info.app_id.data = application.id
28
+ request.info.auth_info.credential.appserver = Types::AppServerCred.new
29
+ request.info.auth_info.credential.appserver.content.app_id = application.id
30
+ request.info.auth_info.credential.appserver.content.shared_secret.hmac_alg.alg_name = "HMACSHA1"
31
+ request.info.auth_info.credential.appserver.content.shared_secret.hmac_alg.data = CryptoUtils.encode64(shared_secret)
32
+ request.info.auth_info.credential.appserver.sig.digest_method = "SHA1"
33
+ request.info.auth_info.credential.appserver.sig.sig_method = "RSA-SHA1"
34
+ request.info.auth_info.credential.appserver.sig.thumbprint = application.key.fingerprint
35
+ request.info.auth_info.credential.appserver.sig.data =
36
+ CryptoUtils.encode64(application.key.sign(
37
+ request.info.auth_info.credential.appserver.content.element('content').to_s))
38
+
39
+ response = request.send
40
+ @session_token = response.info.token[0].data
41
+ end
42
+
43
+ def authenticated?(user_or_app = :app)
44
+ if user_or_app == :app
45
+ return !session_token.nil?
46
+ else
47
+ return !user_auth_token.nil?
48
+ end
49
+ end
50
+
51
+ def send(request)
52
+ http_endpoint = Net::HTTP.new(application.uri.host, application.uri.port)
53
+ http_endpoint.use_ssl = true
54
+ #http_endpoint.verify_mode = OpenSSL::SSL::VERIFY_PEER
55
+ content = request.to_s
56
+ Configuration.instance.logger.debug content
57
+ http_header = {'Content-Type' => 'text/xml'}
58
+ return Response.new(http_endpoint.post(application.uri.path, content, http_header))
59
+ end
60
+ end
61
+ end