rubyhealthvault 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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