spreadsheet_architect 4.2.0 → 5.0.0

Sign up to get free protection for your applications and to get access to all the features.
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