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,2 @@
1
+ require File.dirname(__FILE__) + '/config'
2
+ require File.dirname(__FILE__) + '/application'
data/lib/request.rb ADDED
@@ -0,0 +1,113 @@
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 'date'
10
+ require File.dirname(__FILE__) + '/utils/string_utils'
11
+ require File.dirname(__FILE__) + '/wc_data/init'
12
+
13
+ # HealtVault doesn't adhere to valid xml standards.
14
+ # Attribute values must be in double quotes to be parseable
15
+ # So we redefine REXML::Attribute.to_string to accommodate
16
+ REXML::Attribute.class_eval {def to_string() "#@expanded_name=\"#{to_s().gsub(/"/, '"')}\"" end}
17
+
18
+ module HealthVault
19
+ class Request < HealthVault::WCData::ComplexType
20
+ include WCData
21
+ include REXML
22
+ include StringUtils
23
+
24
+ # HealthVault::WCData::Types::HMACFinalized
25
+ def auth=(value)
26
+ @children['auth'][:value] = value
27
+ end
28
+
29
+ def auth
30
+ return @children['auth'][:value]
31
+ end
32
+
33
+ # HealthVault::WCData::Request::Header
34
+ def header=(value)
35
+ @children['header'][:value] = value
36
+ end
37
+
38
+ def header
39
+ return @children['header'][:value]
40
+ end
41
+
42
+ # HealthVault::WCData::Request::Info
43
+ def info=(value)
44
+ @children['info'][:value] = value
45
+ end
46
+
47
+ def info
48
+ return @children['info'][:value]
49
+ end
50
+
51
+ def initialize(connection)
52
+ super()
53
+ @connection = connection
54
+ @children['auth'] = {:name => 'auth', :class => HealthVault::WCData::Types::HMACFinalized, :value => nil, :min => 0, :max => 1, :order => 1, :place => :element }
55
+ @children['header'] = {:name => 'header', :class => HealthVault::WCData::Request::Header, :value => nil, :min => 1, :max => 1, :order => 2, :place => :element }
56
+ @children['header'][:value] = WCData::Request::Header.new
57
+ @children['info'] = {:name => 'info', :class => HealthVault::WCData::Request::Info, :value => nil, :min => 1, :max => 1, :order => 3, :place => :element }
58
+ end
59
+
60
+ def self.create(method_name, connection)
61
+ request = Request.new(connection)
62
+ request.header.method = method_name
63
+ request.header.method_version = "1"
64
+ request.header.language = "en"
65
+ request.header.country = "US"
66
+ request.header.msg_time = DateTime.now
67
+ request.header.msg_ttl = 29100
68
+ request.header.version = "0.0.0.1"
69
+ request.info = request.new_request_info
70
+ return request
71
+ end
72
+
73
+ def new_request_info
74
+ begin
75
+ class_new = "HealthVault::WCData::Methods::#{header.method}::Info.new"
76
+ return eval(class_new)
77
+ rescue
78
+ Configuration.instance.logger.error "No Info class for #{header.method}"
79
+ return HealthVault::WCData::RawInfoXml.new
80
+ end
81
+ end
82
+
83
+ def element
84
+ e = Element.new('wc-request:request')
85
+ e.add_namespace("wc-request", "urn:com.microsoft.wc.request")
86
+ super(e)
87
+ end
88
+
89
+ def send
90
+ if @connection.authenticated?
91
+ header.info_hash = Types::HashFinalized.new
92
+ header.info_hash.hash_data = Types::HashFinalizedData.new
93
+ header.info_hash.hash_data.alg_name = "SHA1"
94
+ header.info_hash.hash_data.data = CryptoUtils.encode64(CryptoUtils.digest(info.element.to_s))
95
+ header.auth_session = WCData::Request::AuthenticatedSessionInfo.new
96
+ header.auth_session.auth_token = @connection.session_token
97
+ header.auth_session.user_auth_token = @connection.user_auth_token #or offline_person_info
98
+ #INFO: call the auth= method, not create an auth variable
99
+ self.auth = Types::HMACFinalized.new
100
+ auth.hmac_data = Types::HMACFinalizedData.new
101
+ auth.hmac_data.alg_name = "HMACSHA1"
102
+ auth.hmac_data.data = CryptoUtils.encode64(CryptoUtils.hmac(@connection.shared_secret, header.element.to_s))
103
+ else
104
+ header.app_id = @connection.application.id
105
+ end
106
+ #if self.valid?
107
+ return @connection.send(self)
108
+ #else
109
+ # raise StandardError.new("request is not valid")
110
+ #end
111
+ end
112
+ end
113
+ end
data/lib/response.rb ADDED
@@ -0,0 +1,50 @@
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 File.dirname(__FILE__) + '/utils/string_utils'
10
+
11
+ module HealthVault
12
+ class Response
13
+ include REXML
14
+ include StringUtils
15
+ include WCData
16
+
17
+ attr_reader :xml, :info
18
+
19
+ def initialize(http_response)
20
+ @http_response = http_response
21
+ @xml = Document.new(@http_response.body)
22
+ code = XPath.first(@xml, "//code").text
23
+ if code.to_i > 0
24
+ msg = XPath.first(@xml, "//error/message").text
25
+ Configuration.instance.logger.error "ERRORCODE: #{code.to_s} MESSAGE: #{msg}"
26
+ raise StandardError.new(msg)
27
+ end
28
+ Configuration.instance.logger.debug @xml.to_s
29
+ info_node = XPath.first(@xml, '//wc:info')
30
+ response_namespace = info_node.attribute('xmlns:wc').to_s
31
+ m = response_namespace.match(/urn\:com\.microsoft\.wc\.(.*)/)
32
+ if m.nil?
33
+ @info = nil
34
+ else
35
+ begin
36
+ mod = (m[1].split('.').collect {|s| classify(s)}).join('::') + "::Info.new"
37
+ # eval may as well be called evil
38
+ nfo = eval mod
39
+ @info = nfo
40
+ @info.parse_element(info_node)
41
+ rescue => e
42
+ puts e
43
+ Configuration.instance.logger.error e
44
+ @info = nil
45
+ end
46
+ end
47
+ end
48
+
49
+ end
50
+ end
@@ -0,0 +1,64 @@
1
+ # -*- ruby -*-
2
+ #--
3
+ # Copyright 2008 Danny Coates, Ashkan Farhadtouski
4
+ # All rights reserved.
5
+ # See LICENSE for permissions.
6
+ #++
7
+ # AUTOGENERATED ComplexType
8
+
9
+ module HealthVault
10
+ module WCData
11
+ <% modules.each do |m| %>module <%= classify(m) %>
12
+ <% end %>
13
+ class <%= class_name %> < ComplexType
14
+
15
+ <% children.each do |child| %>
16
+ <% if child[:max] == '1' %>
17
+ <% if child[:min].to_i > 0 %>#<b>REQUIRED</b><% end %>
18
+ <%= child[:doc] %><%= "#<em>value</em> is a #{child[:class]}" %>
19
+ def <%= underscore(child[:name]) %>=(value)
20
+ @children['<%= child[:name] %>'][:value] = value
21
+ end
22
+
23
+ <%= "#<b>returns</b>: a #{child[:class]}" %>
24
+ def <%= underscore(child[:name]) %>
25
+ return @children['<%= child[:name] %>'][:value]
26
+ end
27
+ <% else %>
28
+ <%= "#<em>value</em> is a #{child[:class]}" %>
29
+ def add_<%= underscore(child[:name]) %>(value)
30
+ @children['<%= child[:name] %>'][:value] << value
31
+ end
32
+
33
+ <%= "#<em>value</em> is a ##{child[:class]}" %>
34
+ def remove_<%= underscore(child[:name]) %>(value)
35
+ @children['<%= child[:name] %>'][:value].delete(value)
36
+ end
37
+
38
+ <% if child[:min].to_i > 0 %>#<b>REQUIRED</b><% end %>
39
+ <%= child[:doc] %><%= "#<b>returns</b>: a #{child[:class]} Array" %>
40
+ def <%= underscore(child[:name]) %>
41
+ return @children['<%= child[:name] %>'][:value]
42
+ end
43
+ <% end %>
44
+ <% end %>
45
+
46
+ def initialize
47
+ super
48
+ self.tag_name = '<%= tag_name %>'
49
+ <% children.each do |child| %>
50
+ <% if child[:max] == '1' %>
51
+ @children['<%= child[:name] %>'] = {:name => '<%= child[:name] %>', :class => <%= child[:class] %>, :value => nil, :min => <%= child[:min] %>, :max => <%= child[:max] %>, :order => <%= child[:order] %>, :place => :<%= child[:type] %>, :choice => <%= child[:choice].to_i %> }
52
+ <% if child[:min] == '1' && child[:choice].nil? %>
53
+ @children['<%= child[:name] %>'][:value] = <%= child[:class] %>.new
54
+ <% end %>
55
+ <% else %>
56
+ @children['<%= child[:name] %>'] = {:name => '<%= child[:name] %>', :class => <%= child[:class] %>, :value => Array.new, :min => <%= child[:min] %>, :max => <%= child[:max] %>, :order => <%= child[:order] %>, :place => :<%= child[:type] %>, :choice => <%= child[:choice].to_i %> }
57
+ <% end %>
58
+ <% end %>
59
+ end
60
+ end
61
+ <%modules.length.times do %>end
62
+ <% end %>
63
+ end
64
+ end
@@ -0,0 +1,65 @@
1
+ # -*- ruby -*-
2
+ #--
3
+ # Copyright 2008 Danny Coates, Ashkan Farhadtouski
4
+ # All rights reserved.
5
+ # See LICENSE for permissions.
6
+ #++
7
+ # AUTOGENERATED class
8
+
9
+ module HealthVault
10
+ module WCData
11
+ <% modules.each do |m| %>module <%= classify(m) + "\n" %><% end %>
12
+ <%= "##{class_name} is a #{children['base'].to_s}" %>
13
+ class <%= class_name %> < SimpleType
14
+ <% children.each do |name, target| %>
15
+ <% if name == 'enumeration' %>
16
+ <% target.each do |enum| %>
17
+ def self.<%= enum.empty? ? 'empty' : underscore(enum.to_s.downcase.strip.gsub(' ', '_')) %>
18
+ return '<%= enum.to_s %>'
19
+ end
20
+ <% end %>
21
+ def self.enum
22
+ return ['<%= target.join("','") %>']
23
+ end
24
+ <% elsif name != 'base' %>
25
+ <%= "##{name} = #{target.to_s}" %>
26
+ def <%= name %>(value)
27
+ <% case name
28
+ when 'minExclusive' %>
29
+ return value > <%= target %>
30
+ <% when 'minInclusive' %>
31
+ return value >= <%= target %>
32
+ <% when 'maxExclusive' %>
33
+ return value < <%= target %>
34
+ <% when 'minInclusive' %>
35
+ return value <= <%= target %>
36
+ <% when 'length' %>
37
+ return value.length == <%= target %>
38
+ <% when 'minLength' %>
39
+ return value.length > <%= target %>
40
+ <% when 'maxLength' %>
41
+ return value.length < <%= target %>
42
+ <% else %>
43
+ return true
44
+ <% end %>
45
+ end
46
+ <% end %>
47
+ <% end %>
48
+ def self.valid?(value)
49
+ result = true
50
+ <% children.each do |name, target| %>
51
+ <% case name
52
+ when 'enumeration'%>
53
+ result = result && self.enum.include?(value)
54
+ <% when 'base' %>
55
+ <% else %>
56
+ result = result && self.<%= name %>(value)
57
+ <% end %>
58
+ <% end %>
59
+ return result
60
+ end
61
+ end
62
+ <%modules.length.times do %>end
63
+ <% end %>
64
+ end
65
+ end
@@ -0,0 +1,22 @@
1
+ # -*- ruby -*-
2
+ #--
3
+ # Copyright 2008 Danny Coates, Ashkan Farhadtouski
4
+ # All rights reserved.
5
+ # See LICENSE for permissions.
6
+ #++
7
+ #AUTOGENERATED Thing extension
8
+
9
+ module HealthVault
10
+ module WCData
11
+ module Thing
12
+ class Thing
13
+ @@class_hash = Hash.new
14
+ <% class_hash.each do |key, val| %>
15
+ @@class_hash['<%= key %>'] = <%= val %><% end %>
16
+ def self.guid_to_class(guid)
17
+ return @@class_hash[guid]
18
+ end
19
+ end
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,69 @@
1
+ # -*- ruby -*-
2
+ #--
3
+ # Copyright 2008 Danny Coates, Ashkan Farhadtouski
4
+ # All rights reserved.
5
+ # See LICENSE for permissions.
6
+ #++
7
+
8
+ require 'openssl'
9
+ require 'base64'
10
+
11
+ module HealthVault
12
+ class CryptoUtils
13
+ include OpenSSL
14
+ def self.create_shared_secret
15
+ unless File.exist?("/dev/urandom")
16
+ Random.seed(rand(0).to_s + Time.now.usec.to_s)
17
+ end
18
+ data = BN.rand(2048, -1, false).to_s
19
+ return OpenSSL::Digest::SHA1.new(data).digest
20
+ end
21
+
22
+ def self.encode64(text)
23
+ return Base64.encode64(text).gsub(/\n/, "")
24
+ end
25
+
26
+ def self.hmac(key, text)
27
+ return HMAC.digest(OpenSSL::Digest::Digest.new("SHA1"), key, text)
28
+ end
29
+
30
+ def self.digest(text)
31
+ return OpenSSL::Digest::SHA1.new(text).digest
32
+ end
33
+ end
34
+
35
+ class CryptoKey
36
+ def initialize(pfx_or_pem_filename, password = nil)
37
+ begin
38
+ #INFO: I can't get OpenSSL::PKCS12 working on windows.
39
+ # This call fails with 'mac verify failed'
40
+ # To work around this I created a pem on the command line like:
41
+ # openssl pkcs12 -in xxx.pfx -out xxx.pem -nodes
42
+ @pfx = OpenSSL::PKCS12::PKCS12.new(File.read(pfx_or_pem_filename), password)
43
+ #TODO if pfx files are going to be a problem, maybe we just ought to remove
44
+ rescue
45
+ @pfx = nil
46
+ @pkey = OpenSSL::PKey::RSA.new(File.read(pfx_or_pem_filename),password)
47
+ @cert = OpenSSL::X509::Certificate.new(File.read(pfx_or_pem_filename))
48
+ end
49
+ end
50
+
51
+ def sign(text)
52
+ if @pfx.nil?
53
+ return @pkey.sign(OpenSSL::Digest::SHA1.new, text)
54
+ else
55
+ return @pfx.key.sign(OpenSSL::Digest::SHA1.new, text)
56
+ end
57
+
58
+ end
59
+
60
+ def fingerprint
61
+ if @pfx.nil?
62
+ return OpenSSL::Digest::SHA1.hexdigest(@cert.to_der)
63
+ else
64
+ return OpenSSL::Digest::SHA1.hexdigest(@pfx.certificate.to_der)
65
+ end
66
+
67
+ end
68
+ end
69
+ end
@@ -0,0 +1,35 @@
1
+ # -*- ruby -*-
2
+ #--
3
+ # Copyright 2008 Danny Coates, Ashkan Farhadtouski
4
+ # All rights reserved.
5
+ # See LICENSE for permissions.
6
+ #++
7
+
8
+ module HealthVault
9
+ module StringUtils
10
+ def camelize(string)
11
+ result = ""
12
+ parts = string.split('_')
13
+ result << parts.first.downcase
14
+ parts[1..-1].each {|s| result << s.downcase.capitalize}
15
+ return result
16
+ end
17
+
18
+ def underscore(camel_cased_word)
19
+ return camel_cased_word.to_s.gsub(/::/, '/').
20
+ gsub(/([A-Z]+)([A-Z][a-z])/,'\1_\2').
21
+ gsub(/([a-z\d])([A-Z])/,'\1_\2').
22
+ tr("-", "_").
23
+ downcase
24
+ end
25
+
26
+ def classify(string)
27
+ if string.length > 1
28
+ class_name = string[/./].upcase + string[1..-1]
29
+ else
30
+ class_name = string
31
+ end
32
+ return class_name.gsub('-', '')
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,249 @@
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
+
10
+ module HealthVault
11
+ module WCData
12
+ class ComplexType
13
+ include REXML
14
+ attr_accessor :tag_name
15
+
16
+ def initialize
17
+ @children = Hash.new
18
+ end
19
+
20
+ def required_elements
21
+ return query_elements {|v| v[:min] > 0}
22
+ end
23
+
24
+ def optional_elements
25
+ return query_elements {|v| v[:min] == 0}
26
+ end
27
+
28
+ def query_elements
29
+ result = Array.new
30
+ if block_given?
31
+ @children.each do |key, value|
32
+ if yield value
33
+ result << key
34
+ end
35
+ end
36
+ else
37
+ result = @children.keys
38
+ end
39
+ return result
40
+ end
41
+
42
+ # construct REXML::Element tree from children
43
+ def element(container = nil)
44
+ #cname = self.class.to_s
45
+ my_name = tag_name.to_s.strip.downcase#cname.split('::')[-1].downcase#
46
+ if container.nil?
47
+ me = Element.new(my_name)
48
+ elsif container.is_a?(String)
49
+ me = Element.new(container)
50
+ else
51
+ me = container
52
+ end
53
+ elements = @children.values.sort{|a,b| a[:order] <=> b[:order]}
54
+ elements.each do |el|
55
+ val = el[:value]
56
+ next if val.nil?
57
+ if val.is_a?(Array)
58
+ val.each do |v|
59
+ sub_element(el[:name], v, me)
60
+ end
61
+ else
62
+ if el[:place] == :extension
63
+ sub_element(el[:name], val, me, false)
64
+ elsif el[:place] == :attribute
65
+ me.add_attribute(el[:name], val.to_s)
66
+ else
67
+ sub_element(el[:name], val, me)
68
+ end
69
+ end
70
+ end
71
+ return me
72
+ end
73
+
74
+ # parse WCData from the given xml element
75
+ def parse_element(e)
76
+ # parse elements
77
+ e.elements.each do |child|
78
+ node = child.name
79
+ if @children[node].nil?
80
+ begin
81
+ unless @children['anything'].nil?
82
+ #see if the parent is a 'thing'
83
+ types = e.parent.get_elements('type-id')
84
+ unless types.empty?
85
+ type_guid = types[0].text.to_s
86
+ type = WCData::Thing::Thing.guid_to_class(type_guid)
87
+ #add_new_to_children(@children['anything'][:value], child, type)
88
+ x = type.new
89
+ #TODO make SimpleTypes behave like their base types
90
+ #<HACK>
91
+ if x.is_a?(SimpleType) || x.is_a?(String)
92
+ x = child.text
93
+ end
94
+ #</HACK>
95
+ if x.respond_to?(:parse_element)
96
+ x.parse_element(child)
97
+ end
98
+ @children['anything'][:class] = type
99
+ if @children['anything'][:value].is_a?(Array)
100
+ @children['anything'][:value] << x
101
+ else
102
+ @children['anything'][:value] = x
103
+ end
104
+ end
105
+ end
106
+ rescue => err
107
+ Configuration.instance.logger.error err
108
+ end
109
+ # unknown node type
110
+ Configuration.instance.logger.debug "unknown node of #{node} for #{self.class.to_s}"
111
+ else
112
+ #add_new_to_children(@children[node][:value],child, @children[node][:class])
113
+ x = @children[node][:class].new
114
+ #TODO make SimpleTypes behave like their base types
115
+ #<HACK>
116
+ if x.is_a?(SimpleType) || x.is_a?(String)
117
+ x = child.text
118
+ end
119
+ #</HACK>
120
+ if x.respond_to?(:parse_element)
121
+ x.parse_element(child)
122
+ end
123
+ if @children[node][:value].is_a?(Array)
124
+ @children[node][:value] << x
125
+ else
126
+ @children[node][:value] = x
127
+ end
128
+ end
129
+ end
130
+ # parse inner text
131
+ if !@children['data'].nil? && !e.text.empty?
132
+ @children['data'][:value] = e.text
133
+ end
134
+ # parse attributes
135
+ e.attributes.each_attribute do |attr|
136
+ name = attr.name
137
+ if @children[name].nil?
138
+ # unknown attribute type
139
+ Configuration.instance.logger.debug "unknown attribute of #{name} for #{self.class.to_s}"
140
+ else
141
+ @children[name][:value] = attr.value.to_s
142
+ end
143
+ end
144
+ end
145
+
146
+ def add_new_to_children(target, node, klass)
147
+ x = klass.new
148
+ #TODO make SimpleTypes behave like their base types
149
+ #<HACK>
150
+ if x.is_a?(SimpleType) || x.is_a?(String)
151
+ x = node.text
152
+ end
153
+ #</HACK>
154
+ if x.respond_to?(:parse_element)
155
+ x.parse_element(node)
156
+ end
157
+ if target.is_a?(Array)
158
+ target << x
159
+ else
160
+ target = x
161
+ end
162
+ end
163
+
164
+ def valid?
165
+ valid = true
166
+ choices = Hash.new
167
+ @children.values.each do |child|
168
+ if child[:place] == :element && child[:choice].to_i > 0
169
+ choices[child[:choice]] ||= false
170
+ #TODO: validate choices
171
+ elsif child[:min] > 1
172
+ len = child[:value].length
173
+ valid = valid && (len > child[:min])
174
+ valid = valid && (len < child[:max])
175
+ child[:value].each do |v|
176
+ break if !valid
177
+ begin
178
+ if child[:class].superclass == ComplexType
179
+ valid = valid && v.valid?
180
+ elsif child[:class].superclass == SimpleType
181
+ valid = valid && child[:class].valid?(v)
182
+ else
183
+ valid = valid && !(v.nil? || v.to_s.empty?)
184
+ end
185
+ rescue => e
186
+ Configuration.instance.logger.error e
187
+ valid = false
188
+ break
189
+ end
190
+ end
191
+ elsif child[:min] == 1
192
+ #TODO extract the checks to a seperate method
193
+ begin
194
+ if child[:class].superclass == ComplexType
195
+ valid = valid && child[:value].valid?
196
+ elsif child[:class].superclass == SimpleType
197
+ valid = valid && child[:class].valid?(child[:value])
198
+ else
199
+ valid = valid && !(child[:value].nil? || child[:value].to_s.empty?)
200
+ end
201
+ rescue => e
202
+ Configuration.instance.logger.error e
203
+ valid = false
204
+ break
205
+ end
206
+ end
207
+ end
208
+ return valid
209
+ end
210
+
211
+ # xml string
212
+ def to_s
213
+ return element.to_s
214
+ end
215
+
216
+ def method_missing(name, *args, &blk)
217
+ #For more ease of use, forward method calls for
218
+ #complexTypes that contain 'anything' nodes
219
+ #to the 'anything', i.e. try to make 'anything' transparent
220
+ unless @children['anything'].nil?
221
+ #INFO: this will only work for single 'anythings'
222
+ if @children['anything'][:value].respond_to?(name)
223
+ return @children['anything'][:value].send(name, *args, &blk)
224
+ end
225
+ end
226
+ raise NoMethodError
227
+ end
228
+
229
+ private
230
+
231
+ def sub_element(name, obj, parent, tag = true)
232
+ if tag
233
+ n = Element.new(name, parent)
234
+ if obj.is_a?(ComplexType)
235
+ obj.element(n)
236
+ else
237
+ n.text = obj.to_s
238
+ end
239
+ else
240
+ if obj.is_a?(ComplexType)
241
+ parent << obj.element
242
+ else
243
+ parent.text = obj.to_s
244
+ end
245
+ end
246
+ end
247
+ end
248
+ end
249
+ end