common_core_parser 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 (345) hide show
  1. data/.gitignore +4 -0
  2. data/Gemfile +7 -0
  3. data/Gemfile.lock +31 -0
  4. data/MIT-LICENSE +20 -0
  5. data/README.md +14 -0
  6. data/Rakefile +53 -0
  7. data/common_core_parser.gemspec +26 -0
  8. data/data/ELA/Domain/ELACCXMLDomain_L_1.xml +23 -0
  9. data/data/ELA/Domain/ELACCXMLDomain_L_11-12.xml +23 -0
  10. data/data/ELA/Domain/ELACCXMLDomain_L_2.xml +23 -0
  11. data/data/ELA/Domain/ELACCXMLDomain_L_3.xml +23 -0
  12. data/data/ELA/Domain/ELACCXMLDomain_L_4.xml +23 -0
  13. data/data/ELA/Domain/ELACCXMLDomain_L_5.xml +23 -0
  14. data/data/ELA/Domain/ELACCXMLDomain_L_6.xml +23 -0
  15. data/data/ELA/Domain/ELACCXMLDomain_L_7.xml +23 -0
  16. data/data/ELA/Domain/ELACCXMLDomain_L_8.xml +23 -0
  17. data/data/ELA/Domain/ELACCXMLDomain_L_9-10.xml +23 -0
  18. data/data/ELA/Domain/ELACCXMLDomain_L_K-12.xml +23 -0
  19. data/data/ELA/Domain/ELACCXMLDomain_L_K.xml +23 -0
  20. data/data/ELA/Domain/ELACCXMLDomain_RF_1.xml +23 -0
  21. data/data/ELA/Domain/ELACCXMLDomain_RF_2.xml +23 -0
  22. data/data/ELA/Domain/ELACCXMLDomain_RF_3.xml +23 -0
  23. data/data/ELA/Domain/ELACCXMLDomain_RF_4.xml +23 -0
  24. data/data/ELA/Domain/ELACCXMLDomain_RF_5.xml +23 -0
  25. data/data/ELA/Domain/ELACCXMLDomain_RF_K.xml +23 -0
  26. data/data/ELA/Domain/ELACCXMLDomain_RH_11-12.xml +23 -0
  27. data/data/ELA/Domain/ELACCXMLDomain_RH_6-8.xml +23 -0
  28. data/data/ELA/Domain/ELACCXMLDomain_RH_9-10.xml +23 -0
  29. data/data/ELA/Domain/ELACCXMLDomain_RI_1.xml +23 -0
  30. data/data/ELA/Domain/ELACCXMLDomain_RI_11-12.xml +23 -0
  31. data/data/ELA/Domain/ELACCXMLDomain_RI_2.xml +23 -0
  32. data/data/ELA/Domain/ELACCXMLDomain_RI_3.xml +23 -0
  33. data/data/ELA/Domain/ELACCXMLDomain_RI_4.xml +23 -0
  34. data/data/ELA/Domain/ELACCXMLDomain_RI_5.xml +23 -0
  35. data/data/ELA/Domain/ELACCXMLDomain_RI_6.xml +23 -0
  36. data/data/ELA/Domain/ELACCXMLDomain_RI_7.xml +23 -0
  37. data/data/ELA/Domain/ELACCXMLDomain_RI_8.xml +23 -0
  38. data/data/ELA/Domain/ELACCXMLDomain_RI_9-10.xml +23 -0
  39. data/data/ELA/Domain/ELACCXMLDomain_RI_K.xml +23 -0
  40. data/data/ELA/Domain/ELACCXMLDomain_RL_1.xml +23 -0
  41. data/data/ELA/Domain/ELACCXMLDomain_RL_11-12.xml +23 -0
  42. data/data/ELA/Domain/ELACCXMLDomain_RL_2.xml +23 -0
  43. data/data/ELA/Domain/ELACCXMLDomain_RL_3.xml +23 -0
  44. data/data/ELA/Domain/ELACCXMLDomain_RL_4.xml +23 -0
  45. data/data/ELA/Domain/ELACCXMLDomain_RL_5.xml +23 -0
  46. data/data/ELA/Domain/ELACCXMLDomain_RL_6.xml +23 -0
  47. data/data/ELA/Domain/ELACCXMLDomain_RL_7.xml +23 -0
  48. data/data/ELA/Domain/ELACCXMLDomain_RL_8.xml +23 -0
  49. data/data/ELA/Domain/ELACCXMLDomain_RL_9-10.xml +23 -0
  50. data/data/ELA/Domain/ELACCXMLDomain_RL_K.xml +23 -0
  51. data/data/ELA/Domain/ELACCXMLDomain_RST_11-12.xml +23 -0
  52. data/data/ELA/Domain/ELACCXMLDomain_RST_6-8.xml +23 -0
  53. data/data/ELA/Domain/ELACCXMLDomain_RST_9-10.xml +23 -0
  54. data/data/ELA/Domain/ELACCXMLDomain_R_K-12.xml +23 -0
  55. data/data/ELA/Domain/ELACCXMLDomain_SL_1.xml +23 -0
  56. data/data/ELA/Domain/ELACCXMLDomain_SL_11-12.xml +23 -0
  57. data/data/ELA/Domain/ELACCXMLDomain_SL_2.xml +23 -0
  58. data/data/ELA/Domain/ELACCXMLDomain_SL_3.xml +23 -0
  59. data/data/ELA/Domain/ELACCXMLDomain_SL_4.xml +23 -0
  60. data/data/ELA/Domain/ELACCXMLDomain_SL_5.xml +23 -0
  61. data/data/ELA/Domain/ELACCXMLDomain_SL_6.xml +23 -0
  62. data/data/ELA/Domain/ELACCXMLDomain_SL_7.xml +23 -0
  63. data/data/ELA/Domain/ELACCXMLDomain_SL_8.xml +23 -0
  64. data/data/ELA/Domain/ELACCXMLDomain_SL_9-10.xml +23 -0
  65. data/data/ELA/Domain/ELACCXMLDomain_SL_K-12.xml +23 -0
  66. data/data/ELA/Domain/ELACCXMLDomain_SL_K.xml +23 -0
  67. data/data/ELA/Domain/ELACCXMLDomain_WHST_11-12.xml +23 -0
  68. data/data/ELA/Domain/ELACCXMLDomain_WHST_6-8.xml +23 -0
  69. data/data/ELA/Domain/ELACCXMLDomain_WHST_9-10.xml +23 -0
  70. data/data/ELA/Domain/ELACCXMLDomain_W_1.xml +23 -0
  71. data/data/ELA/Domain/ELACCXMLDomain_W_11-12.xml +23 -0
  72. data/data/ELA/Domain/ELACCXMLDomain_W_2.xml +23 -0
  73. data/data/ELA/Domain/ELACCXMLDomain_W_3.xml +23 -0
  74. data/data/ELA/Domain/ELACCXMLDomain_W_4.xml +23 -0
  75. data/data/ELA/Domain/ELACCXMLDomain_W_5.xml +23 -0
  76. data/data/ELA/Domain/ELACCXMLDomain_W_6.xml +23 -0
  77. data/data/ELA/Domain/ELACCXMLDomain_W_7.xml +23 -0
  78. data/data/ELA/Domain/ELACCXMLDomain_W_8.xml +23 -0
  79. data/data/ELA/Domain/ELACCXMLDomain_W_9-10.xml +23 -0
  80. data/data/ELA/Domain/ELACCXMLDomain_W_K-12.xml +23 -0
  81. data/data/ELA/Domain/ELACCXMLDomain_W_K.xml +23 -0
  82. data/data/ELA/Standard Type/ELACCXMLStandardType.xml +20 -0
  83. data/data/ELA/Subject/ELACCXMLStandardDocument.xml +21 -0
  84. data/data/ELA/Subject Grade/ELACCXMLGrade1.xml +23 -0
  85. data/data/ELA/Subject Grade/ELACCXMLGrade11-12.xml +23 -0
  86. data/data/ELA/Subject Grade/ELACCXMLGrade2.xml +23 -0
  87. data/data/ELA/Subject Grade/ELACCXMLGrade3.xml +23 -0
  88. data/data/ELA/Subject Grade/ELACCXMLGrade4.xml +23 -0
  89. data/data/ELA/Subject Grade/ELACCXMLGrade5.xml +23 -0
  90. data/data/ELA/Subject Grade/ELACCXMLGrade6-8.xml +23 -0
  91. data/data/ELA/Subject Grade/ELACCXMLGrade6.xml +23 -0
  92. data/data/ELA/Subject Grade/ELACCXMLGrade7.xml +23 -0
  93. data/data/ELA/Subject Grade/ELACCXMLGrade8.xml +23 -0
  94. data/data/ELA/Subject Grade/ELACCXMLGrade9-10.xml +23 -0
  95. data/data/ELA/Subject Grade/ELACCXMLGradeK-12.xml +23 -0
  96. data/data/ELA/Subject Grade/ELACCXMLGradeK.xml +23 -0
  97. data/data/ELA-Literacy.xml +21374 -0
  98. data/data/Math.xml +11027 -0
  99. data/data/Mathematics/Grade1/Domain/Clusters/Math_Grade1_G_1.xml +21 -0
  100. data/data/Mathematics/Grade1/Domain/Clusters/Math_Grade1_MD_1.xml +21 -0
  101. data/data/Mathematics/Grade1/Domain/Clusters/Math_Grade1_MD_2.xml +22 -0
  102. data/data/Mathematics/Grade1/Domain/Clusters/Math_Grade1_MD_3.xml +22 -0
  103. data/data/Mathematics/Grade1/Domain/Clusters/Math_Grade1_NBT_1.xml +21 -0
  104. data/data/Mathematics/Grade1/Domain/Clusters/Math_Grade1_NBT_2.xml +21 -0
  105. data/data/Mathematics/Grade1/Domain/Clusters/Math_Grade1_NBT_3.xml +21 -0
  106. data/data/Mathematics/Grade1/Domain/Clusters/Math_Grade1_OA_1.xml +22 -0
  107. data/data/Mathematics/Grade1/Domain/Clusters/Math_Grade1_OA_2.xml +21 -0
  108. data/data/Mathematics/Grade1/Domain/Clusters/Math_Grade1_OA_3.xml +22 -0
  109. data/data/Mathematics/Grade1/Domain/Clusters/Math_Grade1_OA_4.xml +20 -0
  110. data/data/Mathematics/Grade1/Domain/Math_Grade1_G.xml +21 -0
  111. data/data/Mathematics/Grade1/Domain/Math_Grade1_MD.xml +21 -0
  112. data/data/Mathematics/Grade1/Domain/Math_Grade1_NBT.xml +21 -0
  113. data/data/Mathematics/Grade1/Domain/Math_Grade1_OA.xml +24 -0
  114. data/data/Mathematics/Grade1/Mathematics_Grade_1.xml +18 -0
  115. data/data/Mathematics/Grade2/Domain/Clusters/Math_Grade2_G_1.xml +20 -0
  116. data/data/Mathematics/Grade2/Domain/Clusters/Math_Grade2_MD_1.xml +22 -0
  117. data/data/Mathematics/Grade2/Domain/Clusters/Math_Grade2_MD_2.xml +21 -0
  118. data/data/Mathematics/Grade2/Domain/Clusters/Math_Grade2_MD_3.xml +20 -0
  119. data/data/Mathematics/Grade2/Domain/Clusters/Math_Grade2_MD_4.xml +21 -0
  120. data/data/Mathematics/Grade2/Domain/Clusters/Math_Grade2_NBT_1.xml +21 -0
  121. data/data/Mathematics/Grade2/Domain/Clusters/Math_Grade2_NBT_2.xml +20 -0
  122. data/data/Mathematics/Grade2/Domain/Clusters/Math_Grade2_OA_1.xml +22 -0
  123. data/data/Mathematics/Grade2/Domain/Clusters/Math_Grade2_OA_2.xml +22 -0
  124. data/data/Mathematics/Grade2/Domain/Clusters/Math_Grade2_OA_3.xml +21 -0
  125. data/data/Mathematics/Grade2/Domain/Math_Grade2_G.xml +21 -0
  126. data/data/Mathematics/Grade2/Domain/Math_Grade2_MD.xml +21 -0
  127. data/data/Mathematics/Grade2/Domain/Math_Grade2_NBT.xml +21 -0
  128. data/data/Mathematics/Grade2/Domain/Math_Grade2_OA.xml +24 -0
  129. data/data/Mathematics/Grade2/Mathematics_Grade_2.xml +18 -0
  130. data/data/Mathematics/Grade3/Domain/Clusters/Math_Grade3_G_1.xml +20 -0
  131. data/data/Mathematics/Grade3/Domain/Clusters/Math_Grade3_MD_1.xml +21 -0
  132. data/data/Mathematics/Grade3/Domain/Clusters/Math_Grade3_MD_2.xml +20 -0
  133. data/data/Mathematics/Grade3/Domain/Clusters/Math_Grade3_MD_3.xml +20 -0
  134. data/data/Mathematics/Grade3/Domain/Clusters/Math_Grade3_MD_4.xml +20 -0
  135. data/data/Mathematics/Grade3/Domain/Clusters/Math_Grade3_NBT_1.xml +22 -0
  136. data/data/Mathematics/Grade3/Domain/Clusters/Math_Grade3_NF_1.xml +22 -0
  137. data/data/Mathematics/Grade3/Domain/Clusters/Math_Grade3_OA_1.xml +21 -0
  138. data/data/Mathematics/Grade3/Domain/Clusters/Math_Grade3_OA_2.xml +20 -0
  139. data/data/Mathematics/Grade3/Domain/Clusters/Math_Grade3_OA_3.xml +21 -0
  140. data/data/Mathematics/Grade3/Domain/Clusters/Math_Grade3_OA_4.xml +21 -0
  141. data/data/Mathematics/Grade3/Domain/Math_Grade3_G.xml +21 -0
  142. data/data/Mathematics/Grade3/Domain/Math_Grade3_MD.xml +21 -0
  143. data/data/Mathematics/Grade3/Domain/Math_Grade3_NBT.xml +21 -0
  144. data/data/Mathematics/Grade3/Domain/Math_Grade3_NF.xml +21 -0
  145. data/data/Mathematics/Grade3/Domain/Math_Grade3_OA.xml +21 -0
  146. data/data/Mathematics/Grade3/Mathematics_Grade_3.xml +18 -0
  147. data/data/Mathematics/Grade4/Domain/Clusters/Math_Grade4_G_1.xml +20 -0
  148. data/data/Mathematics/Grade4/Domain/Clusters/Math_Grade4_MD_1.xml +21 -0
  149. data/data/Mathematics/Grade4/Domain/Clusters/Math_Grade4_MD_2.xml +21 -0
  150. data/data/Mathematics/Grade4/Domain/Clusters/Math_Grade4_MD_3.xml +21 -0
  151. data/data/Mathematics/Grade4/Domain/Clusters/Math_Grade4_NBT_1.xml +20 -0
  152. data/data/Mathematics/Grade4/Domain/Clusters/Math_Grade4_NBT_2.xml +20 -0
  153. data/data/Mathematics/Grade4/Domain/Clusters/Math_Grade4_NF_1.xml +21 -0
  154. data/data/Mathematics/Grade4/Domain/Clusters/Math_Grade4_NF_2.xml +21 -0
  155. data/data/Mathematics/Grade4/Domain/Clusters/Math_Grade4_NF_3.xml +21 -0
  156. data/data/Mathematics/Grade4/Domain/Clusters/Math_Grade4_OA_1.xml +21 -0
  157. data/data/Mathematics/Grade4/Domain/Clusters/Math_Grade4_OA_2.xml +21 -0
  158. data/data/Mathematics/Grade4/Domain/Clusters/Math_Grade4_OA_3.xml +21 -0
  159. data/data/Mathematics/Grade4/Domain/Math_Grade4_G.xml +21 -0
  160. data/data/Mathematics/Grade4/Domain/Math_Grade4_MD.xml +21 -0
  161. data/data/Mathematics/Grade4/Domain/Math_Grade4_NBT.xml +21 -0
  162. data/data/Mathematics/Grade4/Domain/Math_Grade4_NF.xml +21 -0
  163. data/data/Mathematics/Grade4/Domain/Math_Grade4_OA.xml +21 -0
  164. data/data/Mathematics/Grade4/Mathematics_Grade_4.xml +18 -0
  165. data/data/Mathematics/Grade5/Domain/Clusters/Math_Grade5_G_1.xml +20 -0
  166. data/data/Mathematics/Grade5/Domain/Clusters/Math_Grade5_G_2.xml +20 -0
  167. data/data/Mathematics/Grade5/Domain/Clusters/Math_Grade5_MD_1.xml +21 -0
  168. data/data/Mathematics/Grade5/Domain/Clusters/Math_Grade5_MD_2.xml +20 -0
  169. data/data/Mathematics/Grade5/Domain/Clusters/Math_Grade5_MD_3.xml +20 -0
  170. data/data/Mathematics/Grade5/Domain/Clusters/Math_Grade5_NBT_1.xml +20 -0
  171. data/data/Mathematics/Grade5/Domain/Clusters/Math_Grade5_NBT_2.xml +20 -0
  172. data/data/Mathematics/Grade5/Domain/Clusters/Math_Grade5_NF_1.xml +20 -0
  173. data/data/Mathematics/Grade5/Domain/Clusters/Math_Grade5_NF_2.xml +21 -0
  174. data/data/Mathematics/Grade5/Domain/Clusters/Math_Grade5_OA_1.xml +20 -0
  175. data/data/Mathematics/Grade5/Domain/Clusters/Math_Grade5_OA_2.xml +20 -0
  176. data/data/Mathematics/Grade5/Domain/Math_Grade5_G.xml +20 -0
  177. data/data/Mathematics/Grade5/Domain/Math_Grade5_MD.xml +20 -0
  178. data/data/Mathematics/Grade5/Domain/Math_Grade5_NBT.xml +20 -0
  179. data/data/Mathematics/Grade5/Domain/Math_Grade5_NF.xml +20 -0
  180. data/data/Mathematics/Grade5/Domain/Math_Grade5_OA.xml +20 -0
  181. data/data/Mathematics/Grade5/Mathematics_Grade_5.xml +18 -0
  182. data/data/Mathematics/Grade6/Domain/Clusters/Math_Grade6_EE_1.xml +20 -0
  183. data/data/Mathematics/Grade6/Domain/Clusters/Math_Grade6_EE_2.xml +20 -0
  184. data/data/Mathematics/Grade6/Domain/Clusters/Math_Grade6_EE_3.xml +20 -0
  185. data/data/Mathematics/Grade6/Domain/Clusters/Math_Grade6_G_1.xml +20 -0
  186. data/data/Mathematics/Grade6/Domain/Clusters/Math_Grade6_NS_1.xml +20 -0
  187. data/data/Mathematics/Grade6/Domain/Clusters/Math_Grade6_NS_2.xml +20 -0
  188. data/data/Mathematics/Grade6/Domain/Clusters/Math_Grade6_NS_3.xml +20 -0
  189. data/data/Mathematics/Grade6/Domain/Clusters/Math_Grade6_RP_1.xml +20 -0
  190. data/data/Mathematics/Grade6/Domain/Clusters/Math_Grade6_SP_1.xml +20 -0
  191. data/data/Mathematics/Grade6/Domain/Clusters/Math_Grade6_SP_2.xml +20 -0
  192. data/data/Mathematics/Grade6/Domain/Math_Grade6_EE.xml +20 -0
  193. data/data/Mathematics/Grade6/Domain/Math_Grade6_G.xml +21 -0
  194. data/data/Mathematics/Grade6/Domain/Math_Grade6_NS.xml +20 -0
  195. data/data/Mathematics/Grade6/Domain/Math_Grade6_RP.xml +20 -0
  196. data/data/Mathematics/Grade6/Domain/Math_Grade6_SP.xml +20 -0
  197. data/data/Mathematics/Grade6/Mathematics_Grade_6.xml +18 -0
  198. data/data/Mathematics/Grade7/Domain/Clusters/Math_Grade7_EE_1.xml +20 -0
  199. data/data/Mathematics/Grade7/Domain/Clusters/Math_Grade7_EE_2.xml +20 -0
  200. data/data/Mathematics/Grade7/Domain/Clusters/Math_Grade7_G_1.xml +20 -0
  201. data/data/Mathematics/Grade7/Domain/Clusters/Math_Grade7_G_2.xml +20 -0
  202. data/data/Mathematics/Grade7/Domain/Clusters/Math_Grade7_NS_1.xml +21 -0
  203. data/data/Mathematics/Grade7/Domain/Clusters/Math_Grade7_RP_1.xml +20 -0
  204. data/data/Mathematics/Grade7/Domain/Clusters/Math_Grade7_SP_1.xml +20 -0
  205. data/data/Mathematics/Grade7/Domain/Clusters/Math_Grade7_SP_2.xml +20 -0
  206. data/data/Mathematics/Grade7/Domain/Clusters/Math_Grade7_SP_3.xml +20 -0
  207. data/data/Mathematics/Grade7/Domain/Math_Grade7_EE.xml +20 -0
  208. data/data/Mathematics/Grade7/Domain/Math_Grade7_G.xml +20 -0
  209. data/data/Mathematics/Grade7/Domain/Math_Grade7_NS.xml +20 -0
  210. data/data/Mathematics/Grade7/Domain/Math_Grade7_RP.xml +21 -0
  211. data/data/Mathematics/Grade7/Domain/Math_Grade7_SP.xml +20 -0
  212. data/data/Mathematics/Grade7/Mathematics_Grade_7.xml +18 -0
  213. data/data/Mathematics/Grade8/Domain/Clusters/Math_Grade8_EE_1.xml +21 -0
  214. data/data/Mathematics/Grade8/Domain/Clusters/Math_Grade8_EE_2.xml +20 -0
  215. data/data/Mathematics/Grade8/Domain/Clusters/Math_Grade8_EE_3.xml +22 -0
  216. data/data/Mathematics/Grade8/Domain/Clusters/Math_Grade8_F_1.xml +20 -0
  217. data/data/Mathematics/Grade8/Domain/Clusters/Math_Grade8_F_2.xml +20 -0
  218. data/data/Mathematics/Grade8/Domain/Clusters/Math_Grade8_G_1.xml +21 -0
  219. data/data/Mathematics/Grade8/Domain/Clusters/Math_Grade8_G_2.xml +21 -0
  220. data/data/Mathematics/Grade8/Domain/Clusters/Math_Grade8_G_3.xml +20 -0
  221. data/data/Mathematics/Grade8/Domain/Clusters/Math_Grade8_NS_1.xml +20 -0
  222. data/data/Mathematics/Grade8/Domain/Clusters/Math_Grade8_SP_1.xml +20 -0
  223. data/data/Mathematics/Grade8/Domain/Math_Grade8_EE.xml +20 -0
  224. data/data/Mathematics/Grade8/Domain/Math_Grade8_F.xml +21 -0
  225. data/data/Mathematics/Grade8/Domain/Math_Grade8_G.xml +20 -0
  226. data/data/Mathematics/Grade8/Domain/Math_Grade8_NS.xml +20 -0
  227. data/data/Mathematics/Grade8/Domain/Math_Grade8_SP.xml +20 -0
  228. data/data/Mathematics/Grade8/Mathematics_Grade_8.xml +18 -0
  229. data/data/Mathematics/HighSchool/Algebra/Domain/Clusters/Math_Algebra_APR_1.xml +20 -0
  230. data/data/Mathematics/HighSchool/Algebra/Domain/Clusters/Math_Algebra_APR_2.xml +20 -0
  231. data/data/Mathematics/HighSchool/Algebra/Domain/Clusters/Math_Algebra_APR_3.xml +21 -0
  232. data/data/Mathematics/HighSchool/Algebra/Domain/Clusters/Math_Algebra_APR_4.xml +21 -0
  233. data/data/Mathematics/HighSchool/Algebra/Domain/Clusters/Math_Algebra_CED_1.xml +21 -0
  234. data/data/Mathematics/HighSchool/Algebra/Domain/Clusters/Math_Algebra_REI_1.xml +21 -0
  235. data/data/Mathematics/HighSchool/Algebra/Domain/Clusters/Math_Algebra_REI_2.xml +21 -0
  236. data/data/Mathematics/HighSchool/Algebra/Domain/Clusters/Math_Algebra_REI_3.xml +21 -0
  237. data/data/Mathematics/HighSchool/Algebra/Domain/Clusters/Math_Algebra_REI_4.xml +21 -0
  238. data/data/Mathematics/HighSchool/Algebra/Domain/Clusters/Math_Algebra_SSE_1.xml +20 -0
  239. data/data/Mathematics/HighSchool/Algebra/Domain/Clusters/Math_Algebra_SSE_2.xml +20 -0
  240. data/data/Mathematics/HighSchool/Algebra/Domain/Math_Algebra_APR.xml +20 -0
  241. data/data/Mathematics/HighSchool/Algebra/Domain/Math_Algebra_CED.xml +21 -0
  242. data/data/Mathematics/HighSchool/Algebra/Domain/Math_Algebra_REI.xml +21 -0
  243. data/data/Mathematics/HighSchool/Algebra/Domain/Math_Algebra_SSE.xml +21 -0
  244. data/data/Mathematics/HighSchool/Algebra/Mathematics_Algebra.xml +17 -0
  245. data/data/Mathematics/HighSchool/Functions/Domain/Clusters/Math_F_BF_1.xml +20 -0
  246. data/data/Mathematics/HighSchool/Functions/Domain/Clusters/Math_F_BF_2.xml +20 -0
  247. data/data/Mathematics/HighSchool/Functions/Domain/Clusters/Math_F_IF_1.xml +20 -0
  248. data/data/Mathematics/HighSchool/Functions/Domain/Clusters/Math_F_IF_2.xml +20 -0
  249. data/data/Mathematics/HighSchool/Functions/Domain/Clusters/Math_F_IF_3.xml +20 -0
  250. data/data/Mathematics/HighSchool/Functions/Domain/Clusters/Math_F_LQE_1.xml +20 -0
  251. data/data/Mathematics/HighSchool/Functions/Domain/Clusters/Math_F_LQE_2.xml +20 -0
  252. data/data/Mathematics/HighSchool/Functions/Domain/Clusters/Math_F_TF_1.xml +20 -0
  253. data/data/Mathematics/HighSchool/Functions/Domain/Clusters/Math_F_TF_2.xml +20 -0
  254. data/data/Mathematics/HighSchool/Functions/Domain/Clusters/Math_F_TF_3.xml +20 -0
  255. data/data/Mathematics/HighSchool/Functions/Domain/Math_F_BF.xml +20 -0
  256. data/data/Mathematics/HighSchool/Functions/Domain/Math_F_IF.xml +20 -0
  257. data/data/Mathematics/HighSchool/Functions/Domain/Math_F_LQE.xml +20 -0
  258. data/data/Mathematics/HighSchool/Functions/Domain/Math_F_TF.xml +20 -0
  259. data/data/Mathematics/HighSchool/Functions/Mathematics_Functions.xml +17 -0
  260. data/data/Mathematics/HighSchool/Geometry/Domain/Clusters/Math_Geometry_CO_1.xml +21 -0
  261. data/data/Mathematics/HighSchool/Geometry/Domain/Clusters/Math_Geometry_CO_2.xml +21 -0
  262. data/data/Mathematics/HighSchool/Geometry/Domain/Clusters/Math_Geometry_CO_3.xml +21 -0
  263. data/data/Mathematics/HighSchool/Geometry/Domain/Clusters/Math_Geometry_CO_4.xml +21 -0
  264. data/data/Mathematics/HighSchool/Geometry/Domain/Clusters/Math_Geometry_C_1.xml +20 -0
  265. data/data/Mathematics/HighSchool/Geometry/Domain/Clusters/Math_Geometry_C_2.xml +21 -0
  266. data/data/Mathematics/HighSchool/Geometry/Domain/Clusters/Math_Geometry_GMD_1.xml +22 -0
  267. data/data/Mathematics/HighSchool/Geometry/Domain/Clusters/Math_Geometry_GMD_2.xml +21 -0
  268. data/data/Mathematics/HighSchool/Geometry/Domain/Clusters/Math_Geometry_GPE_1.xml +21 -0
  269. data/data/Mathematics/HighSchool/Geometry/Domain/Clusters/Math_Geometry_GPE_2.xml +21 -0
  270. data/data/Mathematics/HighSchool/Geometry/Domain/Clusters/Math_Geometry_MG_1.xml +21 -0
  271. data/data/Mathematics/HighSchool/Geometry/Domain/Clusters/Math_Geometry_SRT_1.xml +20 -0
  272. data/data/Mathematics/HighSchool/Geometry/Domain/Clusters/Math_Geometry_SRT_2.xml +21 -0
  273. data/data/Mathematics/HighSchool/Geometry/Domain/Clusters/Math_Geometry_SRT_3.xml +21 -0
  274. data/data/Mathematics/HighSchool/Geometry/Domain/Clusters/Math_Geometry_SRT_4.xml +21 -0
  275. data/data/Mathematics/HighSchool/Geometry/Domain/Math_Geometry_C.xml +21 -0
  276. data/data/Mathematics/HighSchool/Geometry/Domain/Math_Geometry_CO.xml +21 -0
  277. data/data/Mathematics/HighSchool/Geometry/Domain/Math_Geometry_GMD.xml +21 -0
  278. data/data/Mathematics/HighSchool/Geometry/Domain/Math_Geometry_GPE.xml +21 -0
  279. data/data/Mathematics/HighSchool/Geometry/Domain/Math_Geometry_MG.xml +21 -0
  280. data/data/Mathematics/HighSchool/Geometry/Domain/Math_Geometry_SRT.xml +21 -0
  281. data/data/Mathematics/HighSchool/Geometry/Mathematics_Geometry.xml +17 -0
  282. data/data/Mathematics/HighSchool/Modeling/Domain/Clusters/Math_M_1.xml +20 -0
  283. data/data/Mathematics/HighSchool/Modeling/Mathematics_Modeling.xml +17 -0
  284. data/data/Mathematics/HighSchool/Number and Quantity/Domain/Clusters/Math_N_CN_1.xml +21 -0
  285. data/data/Mathematics/HighSchool/Number and Quantity/Domain/Clusters/Math_N_CN_2.xml +20 -0
  286. data/data/Mathematics/HighSchool/Number and Quantity/Domain/Clusters/Math_N_CN_3.xml +20 -0
  287. data/data/Mathematics/HighSchool/Number and Quantity/Domain/Clusters/Math_N_Q_1.xml +20 -0
  288. data/data/Mathematics/HighSchool/Number and Quantity/Domain/Clusters/Math_N_RN_1.xml +22 -0
  289. data/data/Mathematics/HighSchool/Number and Quantity/Domain/Clusters/Math_N_RN_2.xml +20 -0
  290. data/data/Mathematics/HighSchool/Number and Quantity/Domain/Clusters/Math_N_VM_1.xml +21 -0
  291. data/data/Mathematics/HighSchool/Number and Quantity/Domain/Clusters/Math_N_VM_2.xml +20 -0
  292. data/data/Mathematics/HighSchool/Number and Quantity/Domain/Clusters/Math_N_VM_3.xml +20 -0
  293. data/data/Mathematics/HighSchool/Number and Quantity/Domain/Math_N_CN.xml +21 -0
  294. data/data/Mathematics/HighSchool/Number and Quantity/Domain/Math_N_Q.xml +20 -0
  295. data/data/Mathematics/HighSchool/Number and Quantity/Domain/Math_N_RN.xml +21 -0
  296. data/data/Mathematics/HighSchool/Number and Quantity/Domain/Math_N_VM.xml +20 -0
  297. data/data/Mathematics/HighSchool/Number and Quantity/Mathematics_Number_and_Quantity.xml +17 -0
  298. data/data/Mathematics/HighSchool/Statistics and Probability/Domain/Clusters/Math_S_CP_1.xml +20 -0
  299. data/data/Mathematics/HighSchool/Statistics and Probability/Domain/Clusters/Math_S_CP_2.xml +20 -0
  300. data/data/Mathematics/HighSchool/Statistics and Probability/Domain/Clusters/Math_S_IC_1.xml +21 -0
  301. data/data/Mathematics/HighSchool/Statistics and Probability/Domain/Clusters/Math_S_IC_2.xml +21 -0
  302. data/data/Mathematics/HighSchool/Statistics and Probability/Domain/Clusters/Math_S_ID_1.xml +21 -0
  303. data/data/Mathematics/HighSchool/Statistics and Probability/Domain/Clusters/Math_S_ID_2.xml +21 -0
  304. data/data/Mathematics/HighSchool/Statistics and Probability/Domain/Clusters/Math_S_ID_3.xml +21 -0
  305. data/data/Mathematics/HighSchool/Statistics and Probability/Domain/Clusters/Math_S_MD_1.xml +20 -0
  306. data/data/Mathematics/HighSchool/Statistics and Probability/Domain/Clusters/Math_S_MD_2.xml +20 -0
  307. data/data/Mathematics/HighSchool/Statistics and Probability/Domain/Math_S_CP.xml +21 -0
  308. data/data/Mathematics/HighSchool/Statistics and Probability/Domain/Math_S_IC.xml +20 -0
  309. data/data/Mathematics/HighSchool/Statistics and Probability/Domain/Math_S_ID.xml +21 -0
  310. data/data/Mathematics/HighSchool/Statistics and Probability/Domain/Math_S_MD.xml +20 -0
  311. data/data/Mathematics/HighSchool/Statistics and Probability/Mathematics_Statistics_and_Probability.xml +17 -0
  312. data/data/Mathematics/Kindergarten/Domain/Clusters/Math_K_CC_1.xml +24 -0
  313. data/data/Mathematics/Kindergarten/Domain/Clusters/Math_K_CC_2.xml +24 -0
  314. data/data/Mathematics/Kindergarten/Domain/Clusters/Math_K_CC_3.xml +23 -0
  315. data/data/Mathematics/Kindergarten/Domain/Clusters/Math_K_G_1.xml +21 -0
  316. data/data/Mathematics/Kindergarten/Domain/Clusters/Math_K_G_2.xml +23 -0
  317. data/data/Mathematics/Kindergarten/Domain/Clusters/Math_K_MD_1.xml +22 -0
  318. data/data/Mathematics/Kindergarten/Domain/Clusters/Math_K_MD_2.xml +22 -0
  319. data/data/Mathematics/Kindergarten/Domain/Clusters/Math_K_NBT_1.xml +21 -0
  320. data/data/Mathematics/Kindergarten/Domain/Clusters/Math_K_OA_1.xml +23 -0
  321. data/data/Mathematics/Kindergarten/Domain/Math_K_CC.xml +25 -0
  322. data/data/Mathematics/Kindergarten/Domain/Math_K_G.xml +21 -0
  323. data/data/Mathematics/Kindergarten/Domain/Math_K_MD.xml +21 -0
  324. data/data/Mathematics/Kindergarten/Domain/Math_K_NBT.xml +21 -0
  325. data/data/Mathematics/Kindergarten/Domain/Math_K_OA.xml +22 -0
  326. data/data/Mathematics/Kindergarten/Mathematics_Kindergarten.xml +17 -0
  327. data/doc/CCSSI_ELA Standards.pdf +9781 -23
  328. data/doc/CCSSI_Math Standards.pdf +6652 -17
  329. data/lib/common_core_parser/broken_data_corrector.rb +172 -0
  330. data/lib/common_core_parser/element.rb +100 -0
  331. data/lib/common_core_parser/elements/cluster.rb +10 -0
  332. data/lib/common_core_parser/elements/component.rb +10 -0
  333. data/lib/common_core_parser/elements/domain.rb +13 -0
  334. data/lib/common_core_parser/elements/standard.rb +31 -0
  335. data/lib/common_core_parser/elements/standard_type.rb +10 -0
  336. data/lib/common_core_parser/elements/subject_grade.rb +10 -0
  337. data/lib/common_core_parser/master.rb +85 -0
  338. data/lib/common_core_parser/version.rb +3 -0
  339. data/lib/common_core_parser.rb +30 -0
  340. data/test/jenkins.bash +3 -0
  341. data/test/test_helper.rb +32 -0
  342. data/test/unit/domain_test.rb +40 -0
  343. data/test/unit/loader_test.rb +203 -0
  344. data/test/unit/standard_test.rb +91 -0
  345. metadata +477 -0
@@ -0,0 +1,172 @@
1
+ module CommonCoreParser
2
+ class BrokenDataCorrector
3
+
4
+ class << self
5
+ def run
6
+ Master.instance.elements.each do |element|
7
+ self.private_methods.select { |method_name| method_name.to_s.match(/^correct_/) }.each do |corrector_method|
8
+ self.send(corrector_method,element)
9
+ end
10
+ end
11
+ end
12
+
13
+ # There are a some cases where multiple items are sharing the same ref_id.
14
+ # * Two cases of an ELA Standard and Domain having the same ref_id.
15
+ # * Three cases of pairs of clusters sharing the same ref_id.
16
+ # * Two standards that both have the same ref_id
17
+ # This patch corrects the ref_ids to remove conflucts.
18
+ # See also patch_duplicated_parent_ref_ids()
19
+ def patch_duplicated_ref_ids(element,candidate_ref_id)
20
+ flagged_standard_domain_ref_ids = ['7CB154907B5743c7B97BFCFF452D7977','F053D3437D1E4338A2C18B25DACBED85']
21
+ flagged_cluster_ref_ids = ['B1AC98EADE4145689E70EEEBD9B8CC18','834B17E279C64263AA83F7625F5D2993','91FABAB899814C55851003A0EE98F8FB']
22
+ flagged_duplicated_stadard_ref_ids = ['FBCBB7C696FE475695920CA622B1C857']
23
+ if candidate_ref_id == 'F053D3437D1E4338A2C18B25DACBED85' and element.is_a?(Standard)
24
+ return "Standard:DUPLICATEDREF_ID:#{candidate_ref_id}"
25
+ elsif candidate_ref_id == 'F053D3437D1E4338A2C18B25DACBED85' and element.is_a?(Domain)
26
+ return "Domain:DUPLICATEDREF_ID:#{candidate_ref_id}"
27
+ elsif flagged_standard_domain_ref_ids.include?(candidate_ref_id) and element.is_a?(Standard)
28
+ return "Standard:DUPLICATEDREF_ID:#{candidate_ref_id}"
29
+ elsif flagged_cluster_ref_ids.include?(candidate_ref_id) and element.is_a?(Cluster)
30
+ return "Cluster:DUPLICATEDREF_ID:#{candidate_ref_id}:#{element.code}"
31
+ elsif flagged_duplicated_stadard_ref_ids.include?(candidate_ref_id) and element.is_a?(Standard)
32
+ return "Standard:DUPLICATEDREF_ID:#{candidate_ref_id}:#{element.code}"
33
+ else
34
+ return candidate_ref_id
35
+ end
36
+ end
37
+
38
+ # See comments on patch_duplicated_ref_ids() above.
39
+ def patch_duplicated_parent_ref_ids(element,candidate_parent_ref_id)
40
+ flagged_cluster_ref_ids = ['B1AC98EADE4145689E70EEEBD9B8CC18','834B17E279C64263AA83F7625F5D2993','91FABAB899814C55851003A0EE98F8FB']
41
+ if candidate_parent_ref_id == 'F053D3437D1E4338A2C18B25DACBED85' and element.is_a?(Component)
42
+ return "Standard:DUPLICATEDREF_ID:#{candidate_parent_ref_id}"
43
+ elsif candidate_parent_ref_id == 'F053D3437D1E4338A2C18B25DACBED85' and element.is_a?(Standard)
44
+ return "Domain:DUPLICATEDREF_ID:#{candidate_parent_ref_id}"
45
+ elsif flagged_cluster_ref_ids.include?(candidate_parent_ref_id) and element.is_a?(Standard) and element.code.match(/\.K\.G\./)
46
+ return "Cluster:DUPLICATEDREF_ID:#{candidate_parent_ref_id}:Mathematics.K.G.1"
47
+ elsif flagged_cluster_ref_ids.include?(candidate_parent_ref_id) and element.is_a?(Standard) and element.code == 'CCSS.Math.Content.K.MD.B.3'
48
+ return "Cluster:DUPLICATEDREF_ID:#{candidate_parent_ref_id}:Mathematics.K.MD.2"
49
+ elsif flagged_cluster_ref_ids.include?(candidate_parent_ref_id) and element.is_a?(Standard) and element.code.match(/\.3\.G\.A\./)
50
+ return "Cluster:DUPLICATEDREF_ID:#{candidate_parent_ref_id}:Mathematics.3.G.1"
51
+ elsif flagged_cluster_ref_ids.include?(candidate_parent_ref_id) and element.is_a?(Standard) and element.code == 'CCSS.Math.Content.6.NS.A.1'
52
+ return "Cluster:DUPLICATEDREF_ID:#{candidate_parent_ref_id}:Mathematics.6.NS.1"
53
+ elsif flagged_cluster_ref_ids.include?(candidate_parent_ref_id) and element.is_a?(Standard) and element.code.match(/\.3\.MD\.C\./)
54
+ return "Cluster:DUPLICATEDREF_ID:#{candidate_parent_ref_id}:Mathematics.3.MD.3"
55
+ elsif flagged_cluster_ref_ids.include?(candidate_parent_ref_id) and element.is_a?(Standard) and element.code.match(/\.6\.RP\.A\./)
56
+ return "Cluster:DUPLICATEDREF_ID:#{candidate_parent_ref_id}:Mathematics.6.RP.1"
57
+ else
58
+ return candidate_parent_ref_id
59
+ end
60
+ end
61
+
62
+ #######
63
+ private
64
+ #######
65
+
66
+ # A few standards in the new xml files are are pointed to cluster ids that
67
+ # don't exist in the old xml files. Point them to their old clusters for now
68
+ # This shouldn't be necessary when corestandards.org makes a complete set of
69
+ # updated xml files available.
70
+ def correct_standards_pointed_to_missing_ref_ids(element)
71
+ ref_id_map = {
72
+ 'B1AC98EADE4145689E70EEEBD9B8CC19' => patch_duplicated_parent_ref_ids(element,'B1AC98EADE4145689E70EEEBD9B8CC18'),
73
+ '834B17E279C64263AA83F7625F5D2994' => patch_duplicated_parent_ref_ids(element,'834B17E279C64263AA83F7625F5D2993'),
74
+ '91FABAB899814C55851003A0EE98F8FC' => patch_duplicated_parent_ref_ids(element,'91FABAB899814C55851003A0EE98F8FB')
75
+ }
76
+ return unless (element.is_a?(Standard) and ref_id_map.keys.include?(element.parent_ref_id))
77
+ element.instance_variable_set(:@parent_ref_id,ref_id_map[element.parent_ref_id])
78
+ end
79
+
80
+ # The "Standards for Mathematical Practice" point to each other instead of
81
+ # a cluster or domain. WTF? Let's just orphanize them for now.
82
+ def correct_parent_ref_id_for_practice_standards(element)
83
+ return unless (element.is_a?(Standard) and element.code.match(/CCSS\.Math\.Practice\.MP[0-9]+/))
84
+ element.instance_variable_set(:@parent_ref_id,'INTENTIONALLYORPHANED')
85
+ end
86
+
87
+ # The ELA "Anchor Standards" don't have a parent in the xml.
88
+ # Flagging as intentionally orphaned until it gets corrected.
89
+ def correct_ela_anchor_standards(element)
90
+ return unless (element.is_a?(Standard) and element.parent_ref_id.blank? and element.code.match(/CCSS\.ELA\-Literacy\.CCRA.[RWSL]+\.[0-9]+/))
91
+ element.instance_variable_set(:@parent_ref_id,'INTENTIONALLYORPHANED')
92
+ end
93
+
94
+ # The ELA Grade 3 "Language" Standards don't have a parent in the xml.
95
+ # Point them to the correct Domain
96
+ def correct_ela_grade_3_language_standards(element)
97
+ return unless (element.is_a?(Standard) and element.parent_ref_id.blank? and element.code.match(/CCSS\.ELA\-Literacy\.L\.3/))
98
+ element.instance_variable_set(:@parent_ref_id,patch_duplicated_parent_ref_ids(element,'F053D3437D1E4338A2C18B25DACBED85'))
99
+ end
100
+
101
+ def correct_unnecessarily_unicoded_characters(element)
102
+ # http://www.htmlescape.net/unicode_chart_general_punctuation.html
103
+ # http://www.htmlescape.net/unicode_chart_miscellaneous_symbols.html
104
+ element.instance_variable_set(:@statement,element.statement.gsub(/\u2013/,%q{-})) # &#8211;
105
+ element.instance_variable_set(:@statement,element.statement.gsub(/\u2019/,%q{'})) # &#8217;
106
+ element.instance_variable_set(:@statement,element.statement.gsub(/\u2020/,%q{"})) # &#8220;
107
+ element.instance_variable_set(:@statement,element.statement.gsub(/\u2021/,%q{"})) # &#8221;
108
+ element.instance_variable_set(:@statement,element.statement.gsub(/\u2605/,%q{*})) # &#9733;
109
+ end
110
+
111
+ # Math.xml contains a lot of unnecessarily escaped tags.
112
+ def correct_unncessarily_escaped_html_tags(element)
113
+ statement = element.statement
114
+ [:sup, :i].each do |tag|
115
+ statement.gsub!(/&lt;#{tag}&gt;/,%Q{<#{tag}>})
116
+ statement.gsub!(/&lt;\/#{tag}&gt;/,%Q{</#{tag}>})
117
+ end
118
+ element.instance_variable_set(:@statement,statement)
119
+ end
120
+
121
+ # One ELA standard has it's own RefID (currently 32D9C8830A6C4fd5B715A1DFFC4D4BA4) set as it's code.
122
+ def correct_literacy_rh_11_12_1_code(element)
123
+ if (element.ref_id == '32D9C8830A6C4fd5B715A1DFFC4D4BA4' or element.parent_ref_id == 'F9877ECD38D8432185F96C5EC5A050AF') and element.statement.match('^Cite specific textual evidence')
124
+ element.instance_variable_set(:@code,'CCSS.ELA-Literacy.RH.11-12.1')
125
+ end
126
+ end
127
+
128
+ # Many standards contain html tags that are closed at the beginning of the following standard.
129
+ def correct_unclosed_html_tags(element)
130
+ [:i, :sup].each do |tag|
131
+ strip_stray_close_tags(element,tag)
132
+ append_missing_close_tags(element,tag)
133
+ end
134
+ end
135
+
136
+
137
+
138
+
139
+
140
+
141
+
142
+ ######################################################################################
143
+
144
+ def strip_stray_close_tags(element,tag)
145
+ if starts_with_close?(element,tag)
146
+ element.instance_variable_set(:@statement,element.statement.sub(/^<\/#{tag}>/,''))
147
+ end
148
+ end
149
+
150
+ def append_missing_close_tags(element,tag)
151
+ if more_opens_than_closes?(element,tag)
152
+ element.instance_variable_set(:@statement,"#{element.statement}</#{tag}>")
153
+ end
154
+ end
155
+
156
+ def starts_with_close?(element,tag)
157
+ element.statement.match(/^<\/#{tag}>/)
158
+ end
159
+
160
+
161
+ def more_opens_than_closes?(element,tag)
162
+ opens = element.statement.match(/<#{tag}>/)
163
+ closes = element.statement.match(/<\/#{tag}>/)
164
+ return false if opens.nil?
165
+ return true if closes.nil? or (opens.size == closes.size + 1)
166
+ raise "too many unclosed open <#{tag}> tags to deal with" if opens.size > closes.size + 1 # just in case this becomes an issue in the future so it can be identified immediately
167
+ return false
168
+ end
169
+ end
170
+
171
+ end
172
+ end
@@ -0,0 +1,100 @@
1
+ module CommonCoreParser
2
+ class Element
3
+
4
+ attr_accessor :data
5
+ attr_reader :children_hash
6
+
7
+ def initialize(xmldoc)
8
+ raise(ArgumentError, "Not a LearningStandardItem\n #{xmldoc}") unless xmldoc.name == 'LearningStandardItem'
9
+ @data = xmldoc
10
+ @children_hash = {}
11
+ end
12
+
13
+ def to_s
14
+ "<#{self.class} ref_id: #{ref_id}, parent_ref_id: #{parent_ref_id}, code: #{code}, statement: #{statement}, grades: #{grades.join(',')}>"
15
+ end
16
+
17
+ def ref_id
18
+ @ref_id ||= BrokenDataCorrector.patch_duplicated_ref_ids(self,(data.attributes['RefID'] || data.attributes['RefId']).value.strip)
19
+ end
20
+
21
+ def parent
22
+ @parent ||= Master.instance.elements_hash[parent_ref_id]
23
+ end
24
+
25
+ def children
26
+ children_hash.values
27
+ end
28
+
29
+ def parent_ref_id
30
+ return @parent_ref_id if @parent_ref_id
31
+
32
+ #new file format
33
+ data.xpath('./RelatedLearningStandardItems/LearningStandardItemRefId').each do |lsiri|
34
+ return @parent_ref_id = BrokenDataCorrector.patch_duplicated_parent_ref_ids(self,lsiri.text.strip) if lsiri.attributes['RelationshipType'].value == 'childOf'
35
+ end
36
+
37
+ #old file format
38
+ data.xpath('./PredecessorItems/LearningStandardItemRefId').each do |lsiri|
39
+ return @parent_ref_id = BrokenDataCorrector.patch_duplicated_parent_ref_ids(self,lsiri.text.strip)
40
+ end
41
+
42
+ return nil
43
+ end
44
+
45
+ def add_child(element)
46
+ @children_hash[element.ref_id] = element
47
+ end
48
+
49
+ def code
50
+ @code ||= data.xpath('./StatementCodes/StatementCode').first.text.strip
51
+ end
52
+
53
+ def statement
54
+ @statement ||= data.xpath('./Statements/Statement').first.text.strip
55
+ end
56
+
57
+ def grades
58
+ @grades ||= data.xpath('./GradeLevels/GradeLevel').map(&:text).map {|string| convert_grade_string_to_grades(string) }.flatten
59
+ end
60
+
61
+ def valid_grades?
62
+ (grades & %w(K HS K-12 01 02 03 04 05 06 07 08 09 10 11 12)) == grades
63
+ end
64
+
65
+ def valid?
66
+ errors.blank?
67
+ end
68
+
69
+ def errors
70
+ raise RuntimeError
71
+ end
72
+
73
+ def error_message
74
+ errors.join(',')
75
+ end
76
+
77
+ def illigit?
78
+ return false unless ref_id.blank?
79
+ case
80
+ when (ref_id.blank? and statement.match(/not applicable/)) then true
81
+ when (ref_id.blank? and statement.match(/begins in grade [0-9]+/)) then true
82
+ else false
83
+ end
84
+ end
85
+
86
+ #######
87
+ private
88
+ #######
89
+
90
+ def convert_grade_string_to_grades(string)
91
+ grades = case
92
+ when string == 'K-12' then ['K',*(1..12)]
93
+ when string == 'HS' then [*(9..12)]
94
+ when string.match(/([0-9]+)-([0-9]+)/) then [*($1..$2)]
95
+ else [string]
96
+ end
97
+ grades.map{|string| string == 'K' ? string : sprintf('%02d',string.to_i) }
98
+ end
99
+ end
100
+ end
@@ -0,0 +1,10 @@
1
+ module CommonCoreParser
2
+ class Cluster < CommonCoreParser::Element
3
+
4
+ def errors
5
+ errors = []
6
+ return errors
7
+ end
8
+
9
+ end
10
+ end
@@ -0,0 +1,10 @@
1
+ module CommonCoreParser
2
+ class Component < CommonCoreParser::Element
3
+
4
+ def errors
5
+ errors = []
6
+ return errors
7
+ end
8
+
9
+ end
10
+ end
@@ -0,0 +1,13 @@
1
+ module CommonCoreParser
2
+ class Domain < CommonCoreParser::Element
3
+
4
+ def errors
5
+ errors = []
6
+ errors << 'Refid is blank' if ref_id.blank?
7
+ errors << 'Code is blank' if code.blank?
8
+ errors << 'Statement is blank' if statement.blank?
9
+ errors << "invalid grades: #{grades}" unless valid_grades?
10
+ return errors
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,31 @@
1
+ module CommonCoreParser
2
+ class Standard < CommonCoreParser::Element
3
+
4
+ def errors
5
+ errors = []
6
+ errors << 'Refid is blank' if ref_id.blank?
7
+ errors << 'PRI is blank' if parent_ref_id.blank?
8
+ errors << 'Code is blank' if code.blank?
9
+ errors << 'Statement is blank' if statement.blank?
10
+ errors << 'invalid grades' unless valid_grades?
11
+ return errors
12
+ end
13
+
14
+ def error_message
15
+ errors.join(',')
16
+ end
17
+
18
+ def cluster
19
+ @cluster ||= self.parent.is_a?(Cluster) ? self.parent : nil
20
+ end
21
+
22
+ def domain
23
+ @domain ||= cluster ? cluster.parent : self.parent
24
+ end
25
+
26
+ def subject
27
+ @subject ||= domain.try(:parent)
28
+ end
29
+
30
+ end
31
+ end
@@ -0,0 +1,10 @@
1
+ module CommonCoreParser
2
+ class StandardType < CommonCoreParser::Element
3
+
4
+ def errors
5
+ errors = []
6
+ return errors
7
+ end
8
+
9
+ end
10
+ end
@@ -0,0 +1,10 @@
1
+ module CommonCoreParser
2
+ class SubjectGrade < CommonCoreParser::Element
3
+
4
+ def errors
5
+ errors = []
6
+ return errors
7
+ end
8
+
9
+ end
10
+ end
@@ -0,0 +1,85 @@
1
+ module CommonCoreParser
2
+ class Master
3
+ include Singleton
4
+
5
+ ELEMENT_NAMES = [:elements, :domains, :clusters, :standards, :components, :subject_grades, :standard_types]
6
+ attr_reader *( ELEMENT_NAMES.map { |element_name| "#{element_name}_hash" } )
7
+
8
+ def initialize
9
+ ELEMENT_NAMES.each do |element_name|
10
+ instance_variable_set("@#{element_name}_hash",{})
11
+ end
12
+ end
13
+
14
+ def load_math
15
+ load_elements_from_paths(DATA_PATH+'/Math.xml',DATA_PATH+'/Mathematics/**/*.xml')
16
+ end
17
+
18
+ def load_ela
19
+ load_elements_from_paths(DATA_PATH+'/ELA-Literacy.xml',DATA_PATH+'/ELA/**/*.xml')
20
+ end
21
+
22
+ def load_elements_from_paths(*paths)
23
+ self.send(:initialize)
24
+ paths.flatten.each do |path|
25
+ Dir.glob(path).map do |filename|
26
+ xml = Nokogiri::XML(File.open(filename))
27
+ xml.xpath('//LearningStandardItem').each do |learning_standard_item|
28
+ klass = get_class_from_element(learning_standard_item)
29
+ add_element(klass.new(learning_standard_item))
30
+ end
31
+ end
32
+ end
33
+ correct_bad_data
34
+ reunite_children_with_parents
35
+ return standards
36
+ end
37
+
38
+ def add_element(element)
39
+ return if element.illigit?
40
+ raise "#{element} has same ref_id as #{@elements_hash[element.ref_id]}" if @elements_hash[element.ref_id]
41
+ @elements_hash[element.ref_id] = element
42
+ instance_variable_get(instance_variable_name_for_element(element))[element.ref_id] = element
43
+ end
44
+
45
+ def delete_element(element)
46
+ @elements_hash.delete(element.classified_ref_id)
47
+ instance_variable_get(instance_variable_name_for_element(element)).delete(element.ref_id)
48
+ end
49
+
50
+ # Create methods for each element type that returns
51
+ # and array of elements instead of a hash
52
+ ELEMENT_NAMES.each do |element_name|
53
+ define_method(element_name) do
54
+ instance_variable_get(instance_variable_name_for_element_name(element_name)).values
55
+ end
56
+ end
57
+
58
+ #######
59
+ private
60
+ #######
61
+
62
+ def correct_bad_data
63
+ BrokenDataCorrector.run
64
+ end
65
+
66
+ def reunite_children_with_parents
67
+ elements.each do |element|
68
+ elements_hash[element.parent_ref_id].add_child(element) unless elements_hash[element.parent_ref_id].nil?
69
+ end
70
+ end
71
+
72
+ def get_class_from_element(xml_element)
73
+ hierarcy_level_description = xml_element.xpath('./StandardHierarchyLevel/description').first || xml_element.xpath('./StandardHierarchyLevel/Description').first
74
+ return "CommonCoreParser::#{hierarcy_level_description.text}".gsub(/\s/,'').constantize
75
+ end
76
+
77
+ def instance_variable_name_for_element(element)
78
+ instance_variable_name_for_element_name(element.class.name.sub(/^.*::/, '').underscore.pluralize)
79
+ end
80
+
81
+ def instance_variable_name_for_element_name(element_name)
82
+ "@#{element_name}_hash"
83
+ end
84
+ end
85
+ end
@@ -0,0 +1,3 @@
1
+ module CommonCoreParser
2
+ VERSION = '0.0.1'
3
+ end
@@ -0,0 +1,30 @@
1
+ #!/usr/bin/env ruby
2
+ # encoding: UTF-8
3
+
4
+ require 'rubygems'
5
+ require 'bundler/setup'
6
+ require 'nokogiri'
7
+ require 'singleton'
8
+ require 'active_support/core_ext'
9
+
10
+ require File.expand_path('../common_core_parser', __FILE__)
11
+ require File.expand_path('../common_core_parser/master', __FILE__)
12
+ require File.expand_path('../common_core_parser/broken_data_corrector', __FILE__)
13
+
14
+ require File.expand_path('../common_core_parser/element', __FILE__)
15
+ require File.expand_path('../common_core_parser/elements/component', __FILE__)
16
+ require File.expand_path('../common_core_parser/elements/standard', __FILE__)
17
+ require File.expand_path('../common_core_parser/elements/cluster', __FILE__)
18
+ require File.expand_path('../common_core_parser/elements/domain', __FILE__)
19
+ require File.expand_path('../common_core_parser/elements/subject_grade', __FILE__)
20
+ require File.expand_path('../common_core_parser/elements/standard_type', __FILE__)
21
+
22
+ module CommonCoreParser
23
+ DATA_PATH = File.expand_path('../../data', __FILE__)
24
+ end
25
+
26
+ class Object
27
+ def blank?
28
+ respond_to?(:empty?) ? empty? : !self
29
+ end
30
+ end
data/test/jenkins.bash ADDED
@@ -0,0 +1,3 @@
1
+ #!/bin/bash
2
+ bundle install
3
+ bundle exec rake test
@@ -0,0 +1,32 @@
1
+ #!/usr/bin/env ruby
2
+ # encoding: UTF-8
3
+
4
+ require 'simplecov'
5
+ SimpleCov.start
6
+
7
+ require File.expand_path('../../lib/common_core_parser', __FILE__)
8
+ require 'active_support'
9
+ require 'active_support/test_case'
10
+ require 'test/unit'
11
+
12
+ class ActiveSupport::TestCase
13
+ class << self
14
+ # test "verify something" do
15
+ # ...
16
+ # end
17
+ def test(name, &block)
18
+ test_name = "test_#{name.gsub(/\s+/,'_')}".to_sym
19
+ defined = instance_method(test_name) rescue false
20
+ raise "#{test_name} is already defined in #{self}" if defined
21
+ if block_given?
22
+ define_method(test_name, &block)
23
+ else
24
+ define_method(test_name) do
25
+ flunk "No implementation provided for #{name}"
26
+ end
27
+ end
28
+ end
29
+ end
30
+ end
31
+
32
+ require 'mocha'
@@ -0,0 +1,40 @@
1
+ #!/usr/bin/env ruby
2
+ # encoding: UTF-8
3
+
4
+ require 'test_helper'
5
+
6
+ module CommonCoreParser
7
+ class DomainTest < ActiveSupport::TestCase
8
+
9
+ # to_s
10
+ test "should return string representation of domain" do
11
+ assert_equal '<CommonCoreParser::Domain ref_id: 4246B738DA224018B6D20C12F9ED0073, parent_ref_id: C235350E091D437FBE2794CE93FBE949, code: Mathematics.1.G, statement: Geometry, grades: 01>', math_domain.to_s
12
+ end
13
+
14
+ # valid?
15
+ test "should return true for valid?" do
16
+ assert_equal true, math_domain.valid?
17
+ end
18
+
19
+ test "should return false for valid? when statement is blank" do
20
+ saved_math_domain = math_domain
21
+ saved_math_domain.stubs(:statement).returns('')
22
+ assert_equal true, saved_math_domain.statement.blank?
23
+ assert_equal false, saved_math_domain.valid?
24
+ end
25
+
26
+ test 'should return repdecessor ref id' do
27
+ assert_equal('C235350E091D437FBE2794CE93FBE949',math_domain.parent_ref_id)
28
+ end
29
+
30
+ private
31
+
32
+ def math_domain
33
+ Domain.new(math_domain_xml)
34
+ end
35
+
36
+ def math_domain_xml
37
+ @math_domain_xml ||= Nokogiri::XML(File.read(DATA_PATH+'/Mathematics/Grade1/Domain/Math_Grade1_G.xml')).xpath('//LearningStandardItem').first
38
+ end
39
+ end
40
+ end