spreadsheet_architect 4.2.0 → 5.0.0

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 (217) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +12 -1
  3. data/README.md +10 -14
  4. data/lib/spreadsheet_architect/class_methods/ods.rb +18 -8
  5. data/lib/spreadsheet_architect/class_methods/xlsx.rb +76 -32
  6. data/lib/spreadsheet_architect/exceptions.rb +30 -13
  7. data/lib/spreadsheet_architect/utils/ods.rb +66 -0
  8. data/lib/spreadsheet_architect/utils/xlsx.rb +29 -8
  9. data/lib/spreadsheet_architect/utils.rb +13 -38
  10. data/lib/spreadsheet_architect/version.rb +1 -1
  11. data/lib/spreadsheet_architect.rb +3 -2
  12. data/test/dummy_app/app/controllers/spreadsheets_controller.rb +1 -1
  13. data/test/dummy_app/config/application.rb +4 -12
  14. data/test/dummy_app/config/routes.rb +1 -1
  15. data/test/dummy_app/db/test.sqlite3 +0 -0
  16. data/test/dummy_app/log/test.log +79842 -63691
  17. data/test/dummy_app/tmp/2.0.1/integration/alt_xlsx.xlsx +0 -0
  18. data/test/dummy_app/tmp/2.0.1/integration/csv.csv +6 -0
  19. data/test/dummy_app/tmp/2.0.1/integration/ods.ods +0 -0
  20. data/test/dummy_app/tmp/2.0.1/integration/xlsx.xlsx +0 -0
  21. data/test/dummy_app/tmp/2.0.1/kitchen_sink.ods +0 -0
  22. data/test/dummy_app/tmp/2.0.1/kitchen_sink.xlsx +0 -0
  23. data/test/dummy_app/tmp/2.0.1/models/ActiveModelObject/data.csv +3 -0
  24. data/test/dummy_app/tmp/2.0.1/models/ActiveModelObject/data.ods +0 -0
  25. data/test/dummy_app/tmp/2.0.1/models/ActiveModelObject/data.xlsx +0 -0
  26. data/test/dummy_app/tmp/2.0.1/models/ActiveModelObject/empty.csv +1 -0
  27. data/test/dummy_app/tmp/2.0.1/models/ActiveModelObject/empty.ods +0 -0
  28. data/test/dummy_app/tmp/2.0.1/models/ActiveModelObject/empty.xlsx +0 -0
  29. data/test/dummy_app/tmp/2.0.1/models/ActiveModelObject/instances.csv +6 -0
  30. data/test/dummy_app/tmp/2.0.1/models/ActiveModelObject/instances.ods +0 -0
  31. data/test/dummy_app/tmp/2.0.1/models/ActiveModelObject/instances.xlsx +0 -0
  32. data/test/dummy_app/tmp/2.0.1/models/CustomColumnsMethodPost/data.csv +3 -0
  33. data/test/dummy_app/tmp/2.0.1/models/CustomColumnsMethodPost/data.ods +0 -0
  34. data/test/dummy_app/tmp/2.0.1/models/CustomColumnsMethodPost/data.xlsx +0 -0
  35. data/test/dummy_app/tmp/2.0.1/models/CustomColumnsMethodPost/empty.csv +0 -0
  36. data/test/dummy_app/tmp/2.0.1/models/CustomColumnsMethodPost/empty.ods +0 -0
  37. data/test/dummy_app/tmp/2.0.1/models/CustomColumnsMethodPost/empty.xlsx +0 -0
  38. data/test/dummy_app/tmp/2.0.1/models/CustomColumnsMethodPost/instances.csv +6 -0
  39. data/test/dummy_app/tmp/2.0.1/models/CustomColumnsMethodPost/instances.ods +0 -0
  40. data/test/dummy_app/tmp/2.0.1/models/CustomColumnsMethodPost/instances.xlsx +0 -0
  41. data/test/dummy_app/tmp/2.0.1/models/CustomPost/data.csv +3 -0
  42. data/test/dummy_app/tmp/2.0.1/models/CustomPost/data.ods +0 -0
  43. data/test/dummy_app/tmp/2.0.1/models/CustomPost/data.xlsx +0 -0
  44. data/test/dummy_app/tmp/2.0.1/models/CustomPost/empty.csv +1 -0
  45. data/test/dummy_app/tmp/2.0.1/models/CustomPost/empty.ods +0 -0
  46. data/test/dummy_app/tmp/2.0.1/models/CustomPost/empty.xlsx +0 -0
  47. data/test/dummy_app/tmp/2.0.1/models/CustomPost/instances.csv +6 -0
  48. data/test/dummy_app/tmp/2.0.1/models/CustomPost/instances.ods +0 -0
  49. data/test/dummy_app/tmp/2.0.1/models/CustomPost/instances.xlsx +0 -0
  50. data/test/dummy_app/tmp/2.0.1/models/LegacyPlainRubyObject/data.csv +3 -0
  51. data/test/dummy_app/tmp/2.0.1/models/LegacyPlainRubyObject/data.ods +0 -0
  52. data/test/dummy_app/tmp/2.0.1/models/LegacyPlainRubyObject/data.xlsx +0 -0
  53. data/test/dummy_app/tmp/2.0.1/models/LegacyPlainRubyObject/empty.csv +1 -0
  54. data/test/dummy_app/tmp/2.0.1/models/LegacyPlainRubyObject/empty.ods +0 -0
  55. data/test/dummy_app/tmp/2.0.1/models/LegacyPlainRubyObject/empty.xlsx +0 -0
  56. data/test/dummy_app/tmp/2.0.1/models/LegacyPlainRubyObject/instances.csv +6 -0
  57. data/test/dummy_app/tmp/2.0.1/models/LegacyPlainRubyObject/instances.ods +0 -0
  58. data/test/dummy_app/tmp/2.0.1/models/LegacyPlainRubyObject/instances.xlsx +0 -0
  59. data/test/dummy_app/tmp/2.0.1/models/PlainRubyObject/data.csv +3 -0
  60. data/test/dummy_app/tmp/2.0.1/models/PlainRubyObject/data.ods +0 -0
  61. data/test/dummy_app/tmp/2.0.1/models/PlainRubyObject/data.xlsx +0 -0
  62. data/test/dummy_app/tmp/2.0.1/models/PlainRubyObject/empty.csv +1 -0
  63. data/test/dummy_app/tmp/2.0.1/models/PlainRubyObject/empty.ods +0 -0
  64. data/test/dummy_app/tmp/2.0.1/models/PlainRubyObject/empty.xlsx +0 -0
  65. data/test/dummy_app/tmp/2.0.1/models/PlainRubyObject/instances.csv +6 -0
  66. data/test/dummy_app/tmp/2.0.1/models/PlainRubyObject/instances.ods +0 -0
  67. data/test/dummy_app/tmp/2.0.1/models/PlainRubyObject/instances.xlsx +0 -0
  68. data/test/dummy_app/tmp/2.0.1/models/Post/data.csv +3 -0
  69. data/test/dummy_app/tmp/2.0.1/models/Post/data.ods +0 -0
  70. data/test/dummy_app/tmp/2.0.1/models/Post/data.xlsx +0 -0
  71. data/test/dummy_app/tmp/2.0.1/models/Post/empty.csv +0 -0
  72. data/test/dummy_app/tmp/2.0.1/models/Post/empty.ods +0 -0
  73. data/test/dummy_app/tmp/2.0.1/models/Post/empty.xlsx +0 -0
  74. data/test/dummy_app/tmp/2.0.1/models/Post/instances.csv +6 -0
  75. data/test/dummy_app/tmp/2.0.1/models/Post/instances.ods +0 -0
  76. data/test/dummy_app/tmp/2.0.1/models/Post/instances.xlsx +0 -0
  77. data/test/dummy_app/tmp/2.0.1/multi_sheet.ods +0 -0
  78. data/test/dummy_app/tmp/2.0.1/multi_sheet.xlsx +0 -0
  79. data/test/dummy_app/tmp/3.0.0.pre/integration/alt_xlsx.xlsx +0 -0
  80. data/test/dummy_app/tmp/3.0.0.pre/integration/csv.csv +5 -5
  81. data/test/dummy_app/tmp/3.0.0.pre/integration/ods.ods +0 -0
  82. data/test/dummy_app/tmp/3.0.0.pre/integration/xlsx.xlsx +0 -0
  83. data/test/dummy_app/tmp/3.0.0.pre/kitchen_sink.ods +0 -0
  84. data/test/dummy_app/tmp/3.0.0.pre/kitchen_sink.xlsx +0 -0
  85. data/test/dummy_app/tmp/3.0.0.pre/models/ActiveModelObject/data.csv +1 -1
  86. data/test/dummy_app/tmp/3.0.0.pre/models/ActiveModelObject/data.ods +0 -0
  87. data/test/dummy_app/tmp/3.0.0.pre/models/ActiveModelObject/data.xlsx +0 -0
  88. data/test/dummy_app/tmp/3.0.0.pre/models/ActiveModelObject/empty.ods +0 -0
  89. data/test/dummy_app/tmp/3.0.0.pre/models/ActiveModelObject/empty.xlsx +0 -0
  90. data/test/dummy_app/tmp/3.0.0.pre/models/ActiveModelObject/instances.csv +5 -5
  91. data/test/dummy_app/tmp/3.0.0.pre/models/ActiveModelObject/instances.ods +0 -0
  92. data/test/dummy_app/tmp/3.0.0.pre/models/ActiveModelObject/instances.xlsx +0 -0
  93. data/test/dummy_app/tmp/3.0.0.pre/models/CustomColumnsMethodPost/data.csv +1 -1
  94. data/test/dummy_app/tmp/3.0.0.pre/models/CustomColumnsMethodPost/data.ods +0 -0
  95. data/test/dummy_app/tmp/3.0.0.pre/models/CustomColumnsMethodPost/data.xlsx +0 -0
  96. data/test/dummy_app/tmp/3.0.0.pre/models/CustomColumnsMethodPost/empty.ods +0 -0
  97. data/test/dummy_app/tmp/3.0.0.pre/models/CustomColumnsMethodPost/empty.xlsx +0 -0
  98. data/test/dummy_app/tmp/3.0.0.pre/models/CustomColumnsMethodPost/instances.csv +5 -5
  99. data/test/dummy_app/tmp/3.0.0.pre/models/CustomColumnsMethodPost/instances.ods +0 -0
  100. data/test/dummy_app/tmp/3.0.0.pre/models/CustomColumnsMethodPost/instances.xlsx +0 -0
  101. data/test/dummy_app/tmp/3.0.0.pre/models/CustomPost/data.csv +1 -1
  102. data/test/dummy_app/tmp/3.0.0.pre/models/CustomPost/data.ods +0 -0
  103. data/test/dummy_app/tmp/3.0.0.pre/models/CustomPost/data.xlsx +0 -0
  104. data/test/dummy_app/tmp/3.0.0.pre/models/CustomPost/empty.ods +0 -0
  105. data/test/dummy_app/tmp/3.0.0.pre/models/CustomPost/empty.xlsx +0 -0
  106. data/test/dummy_app/tmp/3.0.0.pre/models/CustomPost/instances.csv +5 -5
  107. data/test/dummy_app/tmp/3.0.0.pre/models/CustomPost/instances.ods +0 -0
  108. data/test/dummy_app/tmp/3.0.0.pre/models/CustomPost/instances.xlsx +0 -0
  109. data/test/dummy_app/tmp/3.0.0.pre/models/LegacyPlainRubyObject/data.csv +1 -1
  110. data/test/dummy_app/tmp/3.0.0.pre/models/LegacyPlainRubyObject/data.ods +0 -0
  111. data/test/dummy_app/tmp/3.0.0.pre/models/LegacyPlainRubyObject/data.xlsx +0 -0
  112. data/test/dummy_app/tmp/3.0.0.pre/models/LegacyPlainRubyObject/empty.ods +0 -0
  113. data/test/dummy_app/tmp/3.0.0.pre/models/LegacyPlainRubyObject/empty.xlsx +0 -0
  114. data/test/dummy_app/tmp/3.0.0.pre/models/LegacyPlainRubyObject/instances.csv +5 -5
  115. data/test/dummy_app/tmp/3.0.0.pre/models/LegacyPlainRubyObject/instances.ods +0 -0
  116. data/test/dummy_app/tmp/3.0.0.pre/models/LegacyPlainRubyObject/instances.xlsx +0 -0
  117. data/test/dummy_app/tmp/3.0.0.pre/models/PlainRubyObject/data.csv +1 -1
  118. data/test/dummy_app/tmp/3.0.0.pre/models/PlainRubyObject/data.ods +0 -0
  119. data/test/dummy_app/tmp/3.0.0.pre/models/PlainRubyObject/data.xlsx +0 -0
  120. data/test/dummy_app/tmp/3.0.0.pre/models/PlainRubyObject/empty.csv +0 -1
  121. data/test/dummy_app/tmp/3.0.0.pre/models/PlainRubyObject/empty.ods +0 -0
  122. data/test/dummy_app/tmp/3.0.0.pre/models/PlainRubyObject/empty.xlsx +0 -0
  123. data/test/dummy_app/tmp/3.0.0.pre/models/PlainRubyObject/instances.csv +5 -5
  124. data/test/dummy_app/tmp/3.0.0.pre/models/PlainRubyObject/instances.ods +0 -0
  125. data/test/dummy_app/tmp/3.0.0.pre/models/PlainRubyObject/instances.xlsx +0 -0
  126. data/test/dummy_app/tmp/3.0.0.pre/models/Post/data.csv +1 -1
  127. data/test/dummy_app/tmp/3.0.0.pre/models/Post/data.ods +0 -0
  128. data/test/dummy_app/tmp/3.0.0.pre/models/Post/data.xlsx +0 -0
  129. data/test/dummy_app/tmp/3.0.0.pre/models/Post/empty.csv +1 -0
  130. data/test/dummy_app/tmp/3.0.0.pre/models/Post/empty.ods +0 -0
  131. data/test/dummy_app/tmp/3.0.0.pre/models/Post/empty.xlsx +0 -0
  132. data/test/dummy_app/tmp/3.0.0.pre/models/Post/instances.csv +5 -5
  133. data/test/dummy_app/tmp/3.0.0.pre/models/Post/instances.ods +0 -0
  134. data/test/dummy_app/tmp/3.0.0.pre/models/Post/instances.xlsx +0 -0
  135. data/test/dummy_app/tmp/3.0.0.pre/multi_sheet.ods +0 -0
  136. data/test/dummy_app/tmp/3.0.0.pre/multi_sheet.xlsx +0 -0
  137. data/test/dummy_app/tmp/axlsx-master/integration/alt_xlsx.xlsx +0 -0
  138. data/test/dummy_app/tmp/axlsx-master/integration/csv.csv +6 -0
  139. data/test/dummy_app/tmp/axlsx-master/integration/ods.ods +0 -0
  140. data/test/dummy_app/tmp/axlsx-master/integration/xlsx.xlsx +0 -0
  141. data/test/dummy_app/tmp/axlsx-master/kitchen_sink.ods +0 -0
  142. data/test/dummy_app/tmp/axlsx-master/kitchen_sink.xlsx +0 -0
  143. data/test/dummy_app/tmp/axlsx-master/models/ActiveModelObject/data.csv +4 -0
  144. data/test/dummy_app/tmp/axlsx-master/models/ActiveModelObject/data.ods +0 -0
  145. data/test/dummy_app/tmp/axlsx-master/models/ActiveModelObject/data.xlsx +0 -0
  146. data/test/dummy_app/tmp/axlsx-master/models/ActiveModelObject/empty.csv +1 -0
  147. data/test/dummy_app/tmp/axlsx-master/models/ActiveModelObject/empty.ods +0 -0
  148. data/test/dummy_app/tmp/axlsx-master/models/ActiveModelObject/empty.xlsx +0 -0
  149. data/test/dummy_app/tmp/axlsx-master/models/ActiveModelObject/instances.csv +6 -0
  150. data/test/dummy_app/tmp/axlsx-master/models/ActiveModelObject/instances.ods +0 -0
  151. data/test/dummy_app/tmp/axlsx-master/models/ActiveModelObject/instances.xlsx +0 -0
  152. data/test/dummy_app/tmp/axlsx-master/models/CustomColumnsMethodPost/data.csv +4 -0
  153. data/test/dummy_app/tmp/axlsx-master/models/CustomColumnsMethodPost/data.ods +0 -0
  154. data/test/dummy_app/tmp/axlsx-master/models/CustomColumnsMethodPost/data.xlsx +0 -0
  155. data/test/dummy_app/tmp/axlsx-master/models/CustomColumnsMethodPost/empty.csv +1 -0
  156. data/test/dummy_app/tmp/axlsx-master/models/CustomColumnsMethodPost/empty.ods +0 -0
  157. data/test/dummy_app/tmp/axlsx-master/models/CustomColumnsMethodPost/empty.xlsx +0 -0
  158. data/test/dummy_app/tmp/axlsx-master/models/CustomColumnsMethodPost/instances.csv +6 -0
  159. data/test/dummy_app/tmp/axlsx-master/models/CustomColumnsMethodPost/instances.ods +0 -0
  160. data/test/dummy_app/tmp/axlsx-master/models/CustomColumnsMethodPost/instances.xlsx +0 -0
  161. data/test/dummy_app/tmp/axlsx-master/models/CustomPost/data.csv +4 -0
  162. data/test/dummy_app/tmp/axlsx-master/models/CustomPost/data.ods +0 -0
  163. data/test/dummy_app/tmp/axlsx-master/models/CustomPost/data.xlsx +0 -0
  164. data/test/dummy_app/tmp/axlsx-master/models/CustomPost/empty.csv +1 -0
  165. data/test/dummy_app/tmp/axlsx-master/models/CustomPost/empty.ods +0 -0
  166. data/test/dummy_app/tmp/axlsx-master/models/CustomPost/empty.xlsx +0 -0
  167. data/test/dummy_app/tmp/axlsx-master/models/CustomPost/instances.csv +6 -0
  168. data/test/dummy_app/tmp/axlsx-master/models/CustomPost/instances.ods +0 -0
  169. data/test/dummy_app/tmp/axlsx-master/models/CustomPost/instances.xlsx +0 -0
  170. data/test/dummy_app/tmp/axlsx-master/models/LegacyPlainRubyObject/data.csv +4 -0
  171. data/test/dummy_app/tmp/axlsx-master/models/LegacyPlainRubyObject/data.ods +0 -0
  172. data/test/dummy_app/tmp/axlsx-master/models/LegacyPlainRubyObject/data.xlsx +0 -0
  173. data/test/dummy_app/tmp/axlsx-master/models/LegacyPlainRubyObject/empty.csv +1 -0
  174. data/test/dummy_app/tmp/axlsx-master/models/LegacyPlainRubyObject/empty.ods +0 -0
  175. data/test/dummy_app/tmp/axlsx-master/models/LegacyPlainRubyObject/empty.xlsx +0 -0
  176. data/test/dummy_app/tmp/axlsx-master/models/LegacyPlainRubyObject/instances.csv +6 -0
  177. data/test/dummy_app/tmp/axlsx-master/models/LegacyPlainRubyObject/instances.ods +0 -0
  178. data/test/dummy_app/tmp/axlsx-master/models/LegacyPlainRubyObject/instances.xlsx +0 -0
  179. data/test/dummy_app/tmp/axlsx-master/models/PlainRubyObject/data.csv +4 -0
  180. data/test/dummy_app/tmp/axlsx-master/models/PlainRubyObject/data.ods +0 -0
  181. data/test/dummy_app/tmp/axlsx-master/models/PlainRubyObject/data.xlsx +0 -0
  182. data/test/dummy_app/tmp/axlsx-master/models/PlainRubyObject/empty.csv +1 -0
  183. data/test/dummy_app/tmp/axlsx-master/models/PlainRubyObject/empty.ods +0 -0
  184. data/test/dummy_app/tmp/axlsx-master/models/PlainRubyObject/empty.xlsx +0 -0
  185. data/test/dummy_app/tmp/axlsx-master/models/PlainRubyObject/instances.csv +6 -0
  186. data/test/dummy_app/tmp/axlsx-master/models/PlainRubyObject/instances.ods +0 -0
  187. data/test/dummy_app/tmp/axlsx-master/models/PlainRubyObject/instances.xlsx +0 -0
  188. data/test/dummy_app/tmp/axlsx-master/models/Post/data.csv +4 -0
  189. data/test/dummy_app/tmp/axlsx-master/models/Post/data.ods +0 -0
  190. data/test/dummy_app/tmp/axlsx-master/models/Post/data.xlsx +0 -0
  191. data/test/dummy_app/tmp/axlsx-master/models/Post/empty.csv +1 -0
  192. data/test/dummy_app/tmp/axlsx-master/models/Post/empty.ods +0 -0
  193. data/test/dummy_app/tmp/axlsx-master/models/Post/empty.xlsx +0 -0
  194. data/test/dummy_app/tmp/axlsx-master/models/Post/instances.csv +6 -0
  195. data/test/dummy_app/tmp/axlsx-master/models/Post/instances.ods +0 -0
  196. data/test/dummy_app/tmp/axlsx-master/models/Post/instances.xlsx +0 -0
  197. data/test/dummy_app/tmp/axlsx-master/multi_sheet.ods +0 -0
  198. data/test/dummy_app/tmp/axlsx-master/multi_sheet.xlsx +0 -0
  199. data/test/integration/application_test.rb +8 -16
  200. data/test/models/all_models_test.rb +15 -19
  201. data/test/test_helper.rb +38 -9
  202. data/test/unit/ods/general_test.rb +121 -0
  203. data/test/unit/{formats_test.rb → rails/formats_test.rb} +1 -1
  204. data/test/unit/{exceptions_test.rb → spreadsheet_architect/exceptions_test.rb} +19 -15
  205. data/test/unit/{general_test.rb → spreadsheet_architect/spreadsheet_architect_test.rb} +3 -3
  206. data/test/unit/spreadsheet_architect/utils/ods_test.rb +58 -0
  207. data/test/unit/{xlsx_utils_test.rb → spreadsheet_architect/utils/xlsx_test.rb} +13 -21
  208. data/test/unit/{utils_test.rb → spreadsheet_architect/utils_test.rb} +12 -35
  209. data/test/unit/xlsx/freeze_test.rb +79 -0
  210. data/test/unit/xlsx/general_test.rb +199 -0
  211. metadata +381 -128
  212. data/test/dummy_app/config/environments/development.rb +0 -30
  213. data/test/dummy_app/config/environments/production.rb +0 -60
  214. data/test/unit/kitchen_sink_test.rb +0 -110
  215. data/test/unit/multi_sheet_test.rb +0 -29
  216. data/test/unit/options_test.rb +0 -9
  217. data/test/unit/xlsx_freeze_test.rb +0 -44
@@ -0,0 +1,4 @@
1
+
2
+ row1,test1
3
+ 123.456,,123
4
+ 123,2019-09-05,2019-09-05 04:38:44 -0700
@@ -0,0 +1,6 @@
1
+ Name,Content,Object ID
2
+ 0,2,70178248097220
3
+ 1,3,70178248097180
4
+ 2,4,70178248097140
5
+ 3,5,70178248097100
6
+ 4,6,70178248097060
@@ -0,0 +1,4 @@
1
+
2
+ row1,test1
3
+ 123.456,,123
4
+ 123,2019-09-05,2019-09-05 04:38:44 -0700
@@ -0,0 +1,6 @@
1
+ Name,Content,Object ID
2
+ 0,2,70178248093200
3
+ 1,3,70178248093160
4
+ 2,4,70178248093120
5
+ 3,5,70178248093080
6
+ 4,6,70178248093040
@@ -0,0 +1,4 @@
1
+
2
+ row1,test1
3
+ 123.456,,123
4
+ 123,2019-09-05,2019-09-05 04:38:44 -0700
@@ -0,0 +1,6 @@
1
+ Id,Name,Content,Age,Created At,Updated At
2
+ ,0,2,,2019-09-05 04:38:44 -0700,
3
+ ,1,3,,2019-09-05 04:38:44 -0700,
4
+ ,2,4,,2019-09-05 04:38:44 -0700,
5
+ ,3,5,,2019-09-05 04:38:44 -0700,
6
+ ,4,6,,2019-09-05 04:38:44 -0700,
@@ -4,43 +4,35 @@ require 'test_helper'
4
4
 
5
5
  class ApplicationTest < ActionDispatch::IntegrationTest
6
6
  def setup
7
- @path = VERSIONED_BASE_PATH.join("integration")
7
+ @path = TMP_PATH.join("integration")
8
8
  FileUtils.mkdir_p(@path)
9
9
  end
10
10
 
11
11
  def test_csv
12
- get '/spreadsheets/csv', params: {format: :csv}
12
+ get '/spreadsheets/csv'
13
13
  assert_response :success
14
14
 
15
- File.open(File.join(@path, 'csv.csv'), 'w+b') do |f|
16
- f.write @response.body
17
- end
15
+ save_file('integration/test.csv', @response.body)
18
16
  end
19
17
 
20
18
  def test_ods
21
19
  get '/spreadsheets/ods'
22
20
  assert_response :success
23
21
 
24
- File.open(File.join(@path, 'ods.ods'), 'w+b') do |f|
25
- f.write @response.body
26
- end
22
+ save_file('integration/test.ods', @response.body)
27
23
  end
28
24
 
29
25
  def test_xlsx
30
26
  get '/spreadsheets/xlsx'
31
27
  assert_response :success
32
28
 
33
- File.open(File.join(@path, 'xlsx.xlsx'), 'w+b') do |f|
34
- f.write @response.body
35
- end
29
+ save_file('integration/test.xlsx', @response.body)
36
30
  end
37
31
 
38
- def test_alt_xlsx
39
- get '/spreadsheets/alt_xlsx', params: {format: :xlsx}
32
+ def test_respond_with
33
+ get '/spreadsheets/test_respond_with', params: {format: :xlsx}
40
34
  assert_response :success
41
35
 
42
- File.open(File.join(@path, 'alt_xlsx.xlsx'), 'w+b') do |f|
43
- f.write @response.body
44
- end
36
+ save_file('integration/test_respond_with.xlsx', @response.body)
45
37
  end
46
38
  end
@@ -14,7 +14,7 @@ class AllModelsTest < ActiveSupport::TestCase
14
14
  end
15
15
 
16
16
  def set_path(klass)
17
- @path = VERSIONED_BASE_PATH.join("models/#{klass}")
17
+ @path = TMP_PATH.join("models/#{klass}")
18
18
  FileUtils.mkdir_p(@path)
19
19
  end
20
20
 
@@ -47,9 +47,7 @@ class AllModelsTest < ActiveSupport::TestCase
47
47
 
48
48
  data = which.send(method, instances: instances)
49
49
 
50
- File.open(File.join(@path, "instances.#{format}"), 'w+b') do |f|
51
- f.write data
52
- end
50
+ save_file("models/#{klass}/instances.#{format}", data)
53
51
  end
54
52
 
55
53
  test "Empty :instances #{klass} #{format}" do
@@ -58,9 +56,9 @@ class AllModelsTest < ActiveSupport::TestCase
58
56
  method = "to_#{format}"
59
57
  which = klass.respond_to?(method) ? klass : SpreadsheetArchitect
60
58
 
61
- File.open(File.join(@path, "empty.#{format}"),'w+b') do |f|
62
- f.write which.send(method, instances: [])
63
- end
59
+ data = which.send(method, instances: [])
60
+
61
+ save_file("models/#{klass}/empty.#{format}", data)
64
62
  end
65
63
 
66
64
  test ":data #{klass} #{format}" do
@@ -71,9 +69,7 @@ class AllModelsTest < ActiveSupport::TestCase
71
69
 
72
70
  data = which.send(method, data: @data)
73
71
 
74
- File.open(File.join(@path, "data.#{format}"), 'w+b') do |f|
75
- f.write data
76
- end
72
+ save_file("models/#{klass}/data.#{format}", data)
77
73
  end
78
74
 
79
75
  test "Empty :data #{klass} #{format}" do
@@ -82,26 +78,26 @@ class AllModelsTest < ActiveSupport::TestCase
82
78
  method = "to_#{format}"
83
79
  which = klass.respond_to?(method) ? klass : SpreadsheetArchitect
84
80
 
85
- File.open(File.join(@path, "empty.#{format}"),'w+b') do |f|
86
- f.write which.send(method, data: [])
87
- end
81
+ data = which.send(method, data: [])
82
+
83
+ save_file("models/#{klass}/empty.#{format}", data)
88
84
  end
89
85
 
90
86
  if klass.is_a?(ActiveRecord::Base)
91
87
  test "ActiveRecord::Relation" do
92
88
  method = "to_#{format}"
93
89
 
94
- File.open(File.join(@path, "active_record_relation.#{format}"),'w+b') do |f|
95
- f.write klass.all.send(method)
96
- end
90
+ data = klass.all.send(method)
91
+
92
+ save_file("models/#{klass}/active_record_relation.#{format}", data)
97
93
  end
98
94
 
99
95
  test "Empty ActiveRecord::Relation" do
100
96
  method = "to_#{format}"
101
97
 
102
- File.open(File.join(@path, "empty_active_record_relation.#{format}"),'w+b') do |f|
103
- f.write klass.limit(0).send(method)
104
- end
98
+ data = klass.limit(0).send(method)
99
+
100
+ save_file("models/#{klass}/empty_active_record_relation.#{format}", data)
105
101
  end
106
102
  end
107
103
 
data/test/test_helper.rb CHANGED
@@ -1,5 +1,7 @@
1
1
  ENV["RAILS_ENV"] = "test"
2
2
 
3
+ require 'pry'
4
+
3
5
  begin
4
6
  require 'warning'
5
7
 
@@ -10,6 +12,8 @@ rescue LoadError
10
12
  # Do nothing
11
13
  end
12
14
 
15
+ require 'pry'
16
+
13
17
  require File.expand_path("../dummy_app/config/environment.rb", __FILE__)
14
18
 
15
19
  migration_path = Rails.root.join('db/migrate')
@@ -30,6 +34,8 @@ class ActiveSupport::TestCase
30
34
  fixtures :all
31
35
  end
32
36
 
37
+ require 'minitest-spec-rails' ### for describe blocks
38
+
33
39
  require 'minitest/reporters'
34
40
  Minitest::Reporters.use!(
35
41
  Minitest::Reporters::DefaultReporter.new,
@@ -37,6 +43,8 @@ Minitest::Reporters.use!(
37
43
  Minitest.backtrace_filter
38
44
  )
39
45
 
46
+ require 'minitest-spec-rails'
47
+
40
48
  post_count = Post.count
41
49
  if post_count < 5
42
50
  (5 - post_count).times do |i|
@@ -44,15 +52,36 @@ if post_count < 5
44
52
  end
45
53
  end
46
54
 
47
- caxlsx_spec = Gem.loaded_specs['caxlsx']
48
- if caxlsx_spec.source.is_a?(Bundler::Source::Rubygems)
49
- caxlsx_version = caxlsx_spec.version.to_s
50
- else
51
- caxlsx_version = 'caxlsx-master'
55
+ TMP_PATH = Rails.root.join("../../tmp/")
56
+
57
+ ### Cleanup old test spreadsheets
58
+ FileUtils.remove_dir(TMP_PATH, true)
59
+ FileUtils.mkdir_p(TMP_PATH)
60
+
61
+ def save_file(path, file_data)
62
+ if file_data.is_a?(Axlsx::Package)
63
+ file_data = file_data.to_stream.read
64
+ elsif file_data.is_a?(RODF::Spreadsheet)
65
+ file_data = file_data.bytes
66
+ end
67
+
68
+ path = Rails.root.join("../../tmp/", path)
69
+
70
+ FileUtils.mkdir_p(File.dirname(path))
71
+
72
+ File.open(TMP_PATH.join(path), "w+b") do |f|
73
+ f.write file_data
74
+ end
52
75
  end
53
76
 
54
- VERSIONED_BASE_PATH = Rails.root.join("../../tmp/#{caxlsx_version}")
77
+ def parse_ods_spreadsheet(spreadsheet)
78
+ Nokogiri::XML(spreadsheet.xml)
79
+ end
55
80
 
56
- ### Cleanup old test spreadsheets
57
- FileUtils.remove_dir(VERSIONED_BASE_PATH, true)
58
- FileUtils.mkdir_p(VERSIONED_BASE_PATH)
81
+ def parse_axlsx_package(package)
82
+ Nokogiri::XML(package.workbook.worksheets.first.to_xml_string)
83
+ end
84
+
85
+ def parse_axlsx_worksheet(worksheet)
86
+ Nokogiri::XML(worksheet.to_xml_string)
87
+ end
@@ -0,0 +1,121 @@
1
+ require "test_helper"
2
+
3
+ class OdsGeneralTest < ActiveSupport::TestCase
4
+
5
+ test "multisheet" do
6
+ test_data = [[1,2,3], [4,5,6], [7,8,9]]
7
+
8
+ spreadsheet = Post.to_rodf_spreadsheet
9
+ spreadsheet = CustomPost.to_rodf_spreadsheet({sheet_name: 'Latest Projects'}, spreadsheet)
10
+ spreadsheet = SpreadsheetArchitect.to_rodf_spreadsheet({data: test_data, sheet_name: 'Another Sheet'}, spreadsheet)
11
+
12
+ save_file("ods/multi_sheet.ods", spreadsheet.bytes)
13
+ end
14
+
15
+ test "kitchen sink" do
16
+ options = {
17
+ headers: [
18
+ ['Latest Posts'],
19
+ ['Title','Category','Author','Posted on','Posted At','Earnings']
20
+ ],
21
+ data: 50.times.map{|i| [i, "foobar-#{i}", 5.4*i, true, Date.today, Time.now]},
22
+ header_style: {background_color: "000000", color: "FFFFFF", align: :center, font_size: 12, bold: true},
23
+ row_style: {background_color: nil, color: "000000", align: :left, font_size: 12},
24
+ sheet_name: 'Kitchen Sink',
25
+ freeze_headers: true,
26
+ column_types: [
27
+ :string,
28
+ :float,
29
+ :float,
30
+ :boolean,
31
+ :date,
32
+ :time,
33
+ nil
34
+ ],
35
+ }
36
+
37
+ # Using Array Data
38
+ file_data = SpreadsheetArchitect.to_ods(options)
39
+
40
+ save_file("ods/kitchen_sink.ods", file_data)
41
+ end
42
+
43
+ describe "column_types" do
44
+ test "validates provided types" do
45
+ assert_raise SpreadsheetArchitect::Exceptions::ArgumentError do
46
+ SpreadsheetArchitect.to_ods(
47
+ data: [],
48
+ column_types: [""]
49
+ )
50
+ end
51
+
52
+ SpreadsheetArchitect.to_ods(
53
+ data: [],
54
+ column_types: [:string, :float, :date, :time, :boolean, :hyperlink, nil, ->(x){ :foo }]
55
+ )
56
+ end
57
+
58
+ test "works with Proc types" do
59
+ url = "https://github.com/westonganger/spreadsheet_architect"
60
+
61
+ data = [
62
+ [1, 2],
63
+ [1, url],
64
+ ]
65
+
66
+ ss = SpreadsheetArchitect.to_rodf_spreadsheet(
67
+ data: data,
68
+ column_types: [
69
+ :string,
70
+ ->(x){ x.to_s.start_with?("http") ? :hyperlink : :string }
71
+ ]
72
+ )
73
+
74
+ doc = parse_ods_spreadsheet(ss)
75
+
76
+ cells = doc.xpath("//table:table-cell")
77
+ hyperlinks = doc.xpath("//text:a")
78
+
79
+ assert_equal 4, cells.size
80
+ assert_equal 1, hyperlinks.size
81
+
82
+ cell = cells[3]
83
+ assert_equal url, cell.text
84
+ assert_equal url, cell.at_xpath(".//text:a").attributes["href"].value
85
+
86
+ save_file("ods/hyperlinks.ods", ss)
87
+ end
88
+
89
+ describe "hyperlinks" do
90
+ test "shows the text and have the correct attributes" do
91
+ url = "https://github.com/westonganger/spreadsheet_architect"
92
+
93
+ data = [
94
+ [1,2,3],
95
+ [1, url, "https://github.com/caxlsx/caxlsx"],
96
+ ]
97
+
98
+ ss = SpreadsheetArchitect.to_rodf_spreadsheet(data: data, column_types: [:string, :hyperlink, :string])
99
+
100
+ doc = parse_ods_spreadsheet(ss)
101
+
102
+ cells = doc.xpath("//table:table-cell")
103
+ hyperlinks = doc.xpath("//text:a")
104
+
105
+ assert_equal 6, cells.size
106
+ assert_equal 2, hyperlinks.size
107
+
108
+ cell = cells[1]
109
+ assert_equal "2", cell.text
110
+ assert_equal "2", cell.at_xpath(".//text:a").attributes["href"].value
111
+
112
+ cell = cells[4]
113
+ assert_equal url, cell.text
114
+ assert_equal url, cell.at_xpath(".//text:a").attributes["href"].value
115
+
116
+ save_file("ods/hyperlinks.ods", ss)
117
+ end
118
+ end
119
+ end
120
+
121
+ end
@@ -1,6 +1,6 @@
1
1
  require 'test_helper'
2
2
 
3
- class FormatsTest < ActiveSupport::TestCase
3
+ class RailsFormatsTest < ActiveSupport::TestCase
4
4
 
5
5
  [:xlsx, :ods, :csv].each do |format|
6
6
  test "Registers :#{format} mime type" do
@@ -1,6 +1,6 @@
1
1
  require 'test_helper'
2
2
 
3
- class ExceptionsTest < ActiveSupport::TestCase
3
+ class SpreadsheetArchitectExceptionsTest < ActiveSupport::TestCase
4
4
 
5
5
  test "ArgumentError" do
6
6
  error = SpreadsheetArchitect::Exceptions::ArgumentError
@@ -129,8 +129,8 @@ class ExceptionsTest < ActiveSupport::TestCase
129
129
  end
130
130
  end
131
131
 
132
- test "InvalidRangeStylesOptionError" do
133
- error = SpreadsheetArchitect::Exceptions::InvalidRangeStylesOptionError
132
+ test "InvalidRangeOptionError" do
133
+ error = SpreadsheetArchitect::Exceptions::InvalidRangeOptionError
134
134
 
135
135
  assert_raise ArgumentError do
136
136
  error.new
@@ -149,6 +149,22 @@ class ExceptionsTest < ActiveSupport::TestCase
149
149
  end
150
150
  end
151
151
 
152
+ test "InvalidRangeValue" do
153
+ error = SpreadsheetArchitect::Exceptions::InvalidRangeValue
154
+
155
+ assert_raise error do
156
+ SpreadsheetArchitect::Utils::XLSX.verify_range("foo:foo", 1)
157
+ end
158
+
159
+ assert_raise error do
160
+ SpreadsheetArchitect::Utils::XLSX.verify_range("@1:A2", 1)
161
+ end
162
+
163
+ assert_raise error do
164
+ SpreadsheetArchitect::Utils::XLSX.verify_range("A1:A2", 1)
165
+ end
166
+ end
167
+
152
168
  test "InvalidRangeError" do
153
169
  error = SpreadsheetArchitect::Exceptions::InvalidRangeError
154
170
 
@@ -174,18 +190,6 @@ class ExceptionsTest < ActiveSupport::TestCase
174
190
  assert_raise error do
175
191
  SpreadsheetArchitect::Utils::XLSX.verify_range("foo", 1)
176
192
  end
177
-
178
- assert_raise error do
179
- SpreadsheetArchitect::Utils::XLSX.verify_range("foo:foo", 1)
180
- end
181
-
182
- assert_raise error do
183
- SpreadsheetArchitect::Utils::XLSX.verify_range("A1:A2", 1)
184
- end
185
-
186
- assert_raise error do
187
- SpreadsheetArchitect::Utils::XLSX.verify_range("@1:A2", 1)
188
- end
189
193
  end
190
194
 
191
195
  end
@@ -1,12 +1,12 @@
1
1
  require 'test_helper'
2
2
 
3
- class GeneralTest < ActiveSupport::TestCase
3
+ class SpreadsheetArchitectTest < ActiveSupport::TestCase
4
4
 
5
- test "Version accessible by default" do
5
+ test "version accessible by default" do
6
6
  assert_not_nil SpreadsheetArchitect::VERSION
7
7
  end
8
8
 
9
- test "Constants dont change" do
9
+ test "constants dont change" do
10
10
  x = SpreadsheetArchitect.default_options.to_s
11
11
  SpreadsheetArchitect.to_xlsx(headers: [[1]], data: [[1]], header_style: {b: false}, row_style: {background_color: '000000'})
12
12
  assert_equal(x, SpreadsheetArchitect.default_options.to_s)
@@ -0,0 +1,58 @@
1
+ require 'test_helper'
2
+
3
+ class SpreadsheetArchitect::Utils::OdsTest < ActiveSupport::TestCase
4
+ klass = SpreadsheetArchitect::Utils::ODS
5
+
6
+ describe "get_cell_type" do
7
+ describe "without passing the type argument" do
8
+ test "it gets the correct cell type" do
9
+ assert_equal :string, klass.get_cell_type("foobar")
10
+ assert_equal :float, klass.get_cell_type(1)
11
+ end
12
+ end
13
+
14
+ describe "when passing the type argument" do
15
+ test "returns the given type" do
16
+ assert_equal "foobar", klass.get_cell_type(1, "foobar")
17
+ end
18
+
19
+ describe "hyperlinks" do
20
+ test "returns :string" do
21
+ assert_equal :string, klass.get_cell_type("foobar", :hyperlink)
22
+ assert_equal :string, klass.get_cell_type(1, :hyperlink)
23
+ end
24
+ end
25
+ end
26
+ end
27
+
28
+ describe "convert_styles" do
29
+ test "convert_styles_to_ods" do
30
+ ods_styles = klass.convert_styles({
31
+ background_color: '333333',
32
+ color: '000000',
33
+ align: true,
34
+ bold: true,
35
+ font_size: 14,
36
+ italic: true,
37
+ underline: true,
38
+ test: true
39
+ })
40
+
41
+ assert_equal(ods_styles, {
42
+ 'cell' => {
43
+ 'background-color' => '#333333'
44
+ },
45
+ 'text' => {
46
+ 'color' => '#000000',
47
+ 'align' => true,
48
+ 'font-weight' => 'bold',
49
+ 'font-size' => 14,
50
+ 'font-style' => 'italic',
51
+ 'text-underline-type' => 'single',
52
+ 'text-underline-style' => 'solid'
53
+ }
54
+ })
55
+ end
56
+ end
57
+
58
+ end
@@ -1,6 +1,6 @@
1
1
  require 'test_helper'
2
2
 
3
- class XlsxUtilsTest < ActiveSupport::TestCase
3
+ class SpreadsheetArchitectXlsxUtilsTest < ActiveSupport::TestCase
4
4
  klass = SpreadsheetArchitect::Utils::XLSX
5
5
 
6
6
  def setup
@@ -30,26 +30,22 @@ class XlsxUtilsTest < ActiveSupport::TestCase
30
30
  num_columns = 26
31
31
  num_rows = 10
32
32
 
33
- assert_raise SpreadsheetArchitect::Exceptions::InvalidRangeStylesOptionError do
33
+ assert_raise SpreadsheetArchitect::Exceptions::InvalidRangeError do
34
34
  klass.range_hash_to_str({}, num_columns, num_rows)
35
35
  end
36
36
 
37
- assert_raise SpreadsheetArchitect::Exceptions::InvalidRangeStylesOptionError do
38
- klass.range_hash_to_str({columns: 1}, num_columns, num_rows)
39
- end
40
-
41
- assert_raise SpreadsheetArchitect::Exceptions::InvalidRangeStylesOptionError do
42
- klass.range_hash_to_str({rows: 1}, num_columns, num_rows)
43
- end
44
-
45
- assert_raise SpreadsheetArchitect::Exceptions::InvalidRangeStylesOptionError do
37
+ assert_raise SpreadsheetArchitect::Exceptions::InvalidRangeOptionError do
46
38
  klass.range_hash_to_str({columns: [1,2,3], rows: 1}, num_columns, num_rows)
47
39
  end
48
40
 
49
- assert_raise SpreadsheetArchitect::Exceptions::InvalidRangeStylesOptionError do
41
+ assert_raise SpreadsheetArchitect::Exceptions::InvalidRangeOptionError do
50
42
  klass.range_hash_to_str({columns: 1, rows: [1,2,3]}, num_columns, num_rows)
51
43
  end
52
44
 
45
+ assert_equal klass.range_hash_to_str({columns: 1}, num_columns, num_rows), "B1:B10"
46
+
47
+ assert_equal klass.range_hash_to_str({rows: 1}, num_columns, num_rows), "A1:Z1"
48
+
53
49
  assert_equal klass.range_hash_to_str({columns: 0, rows: 1}, num_columns, num_rows), "A1:A1"
54
50
 
55
51
  assert_equal klass.range_hash_to_str({columns: (0..2), rows: (1..3)}, num_columns, num_rows), "A1:C3"
@@ -58,7 +54,7 @@ class XlsxUtilsTest < ActiveSupport::TestCase
58
54
 
59
55
  assert_equal klass.range_hash_to_str({columns: :all, rows: :all}, num_columns, num_rows), "A1:Z10"
60
56
 
61
- assert_raise SpreadsheetArchitect::Exceptions::InvalidRangeError do
57
+ assert_raise SpreadsheetArchitect::Exceptions::InvalidRangeValue do
62
58
  assert_equal klass.range_hash_to_str({columns: ('foobar'..'asd'), rows: (1..3)}, num_columns, num_rows), "foobar1:asd3"
63
59
  end
64
60
  end
@@ -76,13 +72,11 @@ class XlsxUtilsTest < ActiveSupport::TestCase
76
72
  klass.verify_range("A1Z10", num_rows)
77
73
  end
78
74
 
79
- assert_raise SpreadsheetArchitect::Exceptions::InvalidRangeError do
80
- klass.verify_range("A1:A11", num_rows)
75
+ assert_raise SpreadsheetArchitect::Exceptions::InvalidRangeValue do
76
+ klass.verify_range("A1:A#{num_rows+1}", num_rows)
81
77
  end
82
78
 
83
- #assert_raise SpreadsheetArchitect::Exceptions::InvalidRangeError do
84
- klass.verify_range("A1:AAA1", num_rows)
85
- #end
79
+ klass.verify_range("A1:AAA1", num_rows)
86
80
  end
87
81
 
88
82
  test "verify_column" do
@@ -108,9 +102,7 @@ class XlsxUtilsTest < ActiveSupport::TestCase
108
102
  klass.verify_column([], num_columns)
109
103
  end
110
104
 
111
- #assert_raise SpreadsheetArchitect::Exceptions::InvalidColumnError do
112
- klass.verify_column("ZZ", num_columns)
113
- #end
105
+ klass.verify_column("ZZ", num_columns)
114
106
  end
115
107
 
116
108
  test "constants" do