embulk-output-kintone 1.0.0 → 1.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (184) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +65 -1
  3. data/build.gradle +1 -0
  4. data/classpath/commons-csv-1.9.0.jar +0 -0
  5. data/classpath/embulk-output-kintone-1.2.0.jar +0 -0
  6. data/classpath/externalsortinginjava-0.6.2.jar +0 -0
  7. data/classpath/{shadow-kintone-java-client-1.0.0-all.jar → shadow-kintone-java-client-1.2.0-all.jar} +0 -0
  8. data/src/main/java/org/embulk/output/kintone/KintoneClient.java +117 -0
  9. data/src/main/java/org/embulk/output/kintone/KintoneColumnOption.java +5 -0
  10. data/src/main/java/org/embulk/output/kintone/KintoneColumnType.java +226 -5
  11. data/src/main/java/org/embulk/output/kintone/KintoneColumnVisitor.java +82 -13
  12. data/src/main/java/org/embulk/output/kintone/KintoneMode.java +52 -4
  13. data/src/main/java/org/embulk/output/kintone/KintoneOutputPlugin.java +12 -20
  14. data/src/main/java/org/embulk/output/kintone/KintonePageOutput.java +123 -127
  15. data/src/main/java/org/embulk/output/kintone/KintoneSortColumn.java +33 -0
  16. data/src/main/java/org/embulk/output/kintone/PluginTask.java +32 -0
  17. data/src/main/java/org/embulk/output/kintone/deserializer/DeserializeApplier.java +19 -0
  18. data/src/main/java/org/embulk/output/kintone/deserializer/DeserializeException.java +7 -0
  19. data/src/main/java/org/embulk/output/kintone/deserializer/Deserializer.java +279 -0
  20. data/src/main/java/org/embulk/output/kintone/record/Id.java +18 -0
  21. data/src/main/java/org/embulk/output/kintone/record/IdOrUpdateKey.java +45 -0
  22. data/src/main/java/org/embulk/output/kintone/record/Skip.java +14 -0
  23. data/src/main/java/org/embulk/output/kintone/reducer/CSVInputColumnVisitor.java +78 -0
  24. data/src/main/java/org/embulk/output/kintone/reducer/CSVOutputColumnVisitor.java +79 -0
  25. data/src/main/java/org/embulk/output/kintone/reducer/ReduceException.java +11 -0
  26. data/src/main/java/org/embulk/output/kintone/reducer/ReduceType.java +190 -0
  27. data/src/main/java/org/embulk/output/kintone/reducer/ReducedPageOutput.java +100 -0
  28. data/src/main/java/org/embulk/output/kintone/reducer/Reducer.java +355 -0
  29. data/src/main/java/org/embulk/output/kintone/util/Lazy.java +20 -0
  30. data/src/test/java/org/embulk/output/kintone/KintoneClientTest.java +139 -0
  31. data/src/test/java/org/embulk/output/kintone/KintoneColumnOptionBuilder.java +7 -0
  32. data/src/test/java/org/embulk/output/kintone/KintoneColumnTypeTest.java +194 -0
  33. data/src/test/java/org/embulk/output/kintone/KintoneColumnVisitorTest.java +183 -64
  34. data/src/test/java/org/embulk/output/kintone/KintoneColumnVisitorVerifier.java +19 -9
  35. data/src/test/java/org/embulk/output/kintone/KintonePageOutputVerifier.java +120 -51
  36. data/src/test/java/org/embulk/output/kintone/MockClient.java +112 -0
  37. data/src/test/java/org/embulk/output/kintone/TestKintoneOutputPlugin.java +147 -22
  38. data/src/test/java/org/embulk/output/kintone/TestTaskMode.java +1 -0
  39. data/src/test/java/org/embulk/output/kintone/TestTaskReduce.java +47 -0
  40. data/src/test/java/org/embulk/output/kintone/TestTaskReduceException.java +50 -0
  41. data/src/test/java/org/embulk/output/kintone/TestTaskReduceSubtable.java +47 -0
  42. data/src/test/java/org/embulk/output/kintone/TestTaskSkip.java +80 -0
  43. data/src/test/java/org/embulk/output/kintone/TestTaskSkipId.java +80 -0
  44. data/src/test/java/org/embulk/output/kintone/deserializer/DeserializerTest.java +165 -0
  45. data/src/test/java/org/embulk/output/kintone/reducer/ReduceTypeTest.java +154 -0
  46. data/src/test/resources/org/embulk/output/kintone/client/config.yml +1 -0
  47. data/src/test/resources/org/embulk/output/kintone/task/config.yml +2 -1
  48. data/src/test/resources/org/embulk/output/kintone/task/mode/config.yml +6 -0
  49. data/src/test/resources/org/embulk/output/kintone/task/mode/input.csv +7 -7
  50. data/src/test/resources/org/embulk/output/kintone/task/mode/insert_add_records.jsonl +6 -6
  51. data/src/test/resources/org/embulk/output/kintone/task/mode/{insert_add_ignore_nulls_records.jsonl → insert_ignore_nulls_add_records.jsonl} +2 -2
  52. data/src/test/resources/org/embulk/output/kintone/task/mode/{insert_add_prefer_nulls_records.jsonl → insert_prefer_nulls_add_records.jsonl} +6 -6
  53. data/src/test/resources/org/embulk/output/kintone/task/mode/{update_update_ignore_nulls_records.jsonl → update_ignore_nulls_update_records.jsonl} +2 -2
  54. data/src/test/resources/org/embulk/output/kintone/task/mode/{update_update_prefer_nulls_records.jsonl → update_prefer_nulls_update_records.jsonl} +3 -3
  55. data/src/test/resources/org/embulk/output/kintone/task/mode/update_update_records.jsonl +6 -6
  56. data/src/test/resources/org/embulk/output/kintone/task/mode/{upsert_add_records.jsonl → upsert_never_skip_add_records.jsonl} +2 -2
  57. data/src/test/resources/org/embulk/output/kintone/task/mode/upsert_never_skip_double_single_line_text_add_values.json +1 -0
  58. data/src/test/resources/org/embulk/output/kintone/task/mode/{upsert_update_ignore_nulls_records.jsonl → upsert_never_skip_ignore_nulls_update_records.jsonl} +2 -2
  59. data/src/test/resources/org/embulk/output/kintone/task/mode/{upsert_add_prefer_nulls_records.jsonl → upsert_never_skip_prefer_nulls_add_records.jsonl} +3 -3
  60. data/src/test/resources/org/embulk/output/kintone/task/mode/{upsert_update_prefer_nulls_records.jsonl → upsert_never_skip_prefer_nulls_update_records.jsonl} +3 -3
  61. data/src/test/resources/org/embulk/output/kintone/task/mode/{upsert_update_records.jsonl → upsert_never_skip_update_records.jsonl} +4 -4
  62. data/src/test/resources/org/embulk/output/kintone/task/reduce/config.yml +171 -0
  63. data/src/test/resources/org/embulk/output/kintone/task/reduce/input.csv +7 -0
  64. data/src/test/resources/org/embulk/output/kintone/task/reduce/insert_add_records.jsonl +6 -0
  65. data/src/test/resources/org/embulk/output/kintone/task/reduce/insert_ignore_nulls_add_records.jsonl +6 -0
  66. data/src/test/resources/org/embulk/output/kintone/task/reduce/insert_prefer_nulls_add_records.jsonl +6 -0
  67. data/src/test/resources/org/embulk/output/kintone/task/reduce/update_ignore_nulls_update_records.jsonl +3 -0
  68. data/src/test/resources/org/embulk/output/kintone/task/reduce/update_prefer_nulls_update_records.jsonl +3 -0
  69. data/src/test/resources/org/embulk/output/kintone/task/reduce/update_update_records.jsonl +6 -0
  70. data/src/test/resources/org/embulk/output/kintone/task/reduce/upsert_never_skip_add_records.jsonl +2 -0
  71. data/src/test/resources/org/embulk/output/kintone/task/reduce/upsert_never_skip_double_single_line_text_add_values.json +1 -0
  72. data/src/test/resources/org/embulk/output/kintone/task/reduce/upsert_never_skip_double_single_line_text_values.json +1 -0
  73. data/src/test/resources/org/embulk/output/kintone/task/reduce/upsert_never_skip_ignore_nulls_add_records.jsonl +3 -0
  74. data/src/test/resources/org/embulk/output/kintone/task/reduce/upsert_never_skip_ignore_nulls_double_single_line_text_values.json +1 -0
  75. data/src/test/resources/org/embulk/output/kintone/task/reduce/upsert_never_skip_ignore_nulls_update_records.jsonl +3 -0
  76. data/src/test/resources/org/embulk/output/kintone/task/reduce/upsert_never_skip_prefer_nulls_add_records.jsonl +3 -0
  77. data/src/test/resources/org/embulk/output/kintone/task/reduce/upsert_never_skip_prefer_nulls_double_single_line_text_values.json +1 -0
  78. data/src/test/resources/org/embulk/output/kintone/task/reduce/upsert_never_skip_prefer_nulls_update_records.jsonl +3 -0
  79. data/src/test/resources/org/embulk/output/kintone/task/reduce/upsert_never_skip_update_records.jsonl +4 -0
  80. data/src/test/resources/org/embulk/output/kintone/task/reduce_exception/config.yml +36 -0
  81. data/src/test/resources/org/embulk/output/kintone/task/reduce_exception/derived_columns.json +1 -0
  82. data/src/test/resources/org/embulk/output/kintone/task/reduce_exception/input.csv +13 -0
  83. data/src/test/resources/org/embulk/output/kintone/task/reduce_exception/insert_add_records.jsonl +2 -0
  84. data/src/test/resources/org/embulk/output/kintone/task/reduce_exception/update_update_records.jsonl +2 -0
  85. data/src/test/resources/org/embulk/output/kintone/task/reduce_subtable/config.yml +343 -0
  86. data/src/test/resources/org/embulk/output/kintone/task/reduce_subtable/derived_columns.json +1 -0
  87. data/src/test/resources/org/embulk/output/kintone/task/reduce_subtable/input.csv +13 -0
  88. data/src/test/resources/org/embulk/output/kintone/task/reduce_subtable/insert_add_records.jsonl +6 -0
  89. data/src/test/resources/org/embulk/output/kintone/task/reduce_subtable/insert_ignore_nulls_add_records.jsonl +6 -0
  90. data/src/test/resources/org/embulk/output/kintone/task/reduce_subtable/insert_prefer_nulls_add_records.jsonl +6 -0
  91. data/src/test/resources/org/embulk/output/kintone/task/reduce_subtable/update_ignore_nulls_update_records.jsonl +3 -0
  92. data/src/test/resources/org/embulk/output/kintone/task/reduce_subtable/update_prefer_nulls_update_records.jsonl +3 -0
  93. data/src/test/resources/org/embulk/output/kintone/task/reduce_subtable/update_update_records.jsonl +6 -0
  94. data/src/test/resources/org/embulk/output/kintone/task/reduce_subtable/upsert_never_skip_double_single_line_text_values.json +1 -0
  95. data/src/test/resources/org/embulk/output/kintone/task/reduce_subtable/upsert_never_skip_ignore_nulls_add_records.jsonl +3 -0
  96. data/src/test/resources/org/embulk/output/kintone/task/reduce_subtable/upsert_never_skip_ignore_nulls_double_single_line_text_values.json +1 -0
  97. data/src/test/resources/org/embulk/output/kintone/task/reduce_subtable/upsert_never_skip_ignore_nulls_update_records.jsonl +3 -0
  98. data/src/test/resources/org/embulk/output/kintone/task/reduce_subtable/upsert_never_skip_prefer_nulls_add_records.jsonl +3 -0
  99. data/src/test/resources/org/embulk/output/kintone/task/reduce_subtable/upsert_never_skip_prefer_nulls_double_single_line_text_values.json +1 -0
  100. data/src/test/resources/org/embulk/output/kintone/task/reduce_subtable/upsert_never_skip_prefer_nulls_update_records.jsonl +3 -0
  101. data/src/test/resources/org/embulk/output/kintone/task/reduce_subtable/upsert_never_skip_update_records.jsonl +6 -0
  102. data/src/test/resources/org/embulk/output/kintone/task/skip/config.yml +1 -0
  103. data/src/test/resources/org/embulk/output/kintone/task/skip/input.csv +7 -0
  104. data/src/test/resources/org/embulk/output/kintone/task/skip/insert_add_records.jsonl +6 -0
  105. data/src/test/resources/org/embulk/output/kintone/task/skip/insert_always_skip_add_records.jsonl +6 -0
  106. data/src/test/resources/org/embulk/output/kintone/task/skip/insert_always_skip_prefer_nulls_add_records.jsonl +6 -0
  107. data/src/test/resources/org/embulk/output/kintone/task/skip/insert_never_skip_add_records.jsonl +6 -0
  108. data/src/test/resources/org/embulk/output/kintone/task/skip/insert_never_skip_prefer_nulls_add_records.jsonl +6 -0
  109. data/src/test/resources/org/embulk/output/kintone/task/skip/insert_prefer_nulls_add_records.jsonl +6 -0
  110. data/src/test/resources/org/embulk/output/kintone/task/skip/update_always_skip_long_number_add_values.json +1 -0
  111. data/src/test/resources/org/embulk/output/kintone/task/skip/update_always_skip_long_number_values.json +1 -0
  112. data/src/test/resources/org/embulk/output/kintone/task/skip/update_always_skip_prefer_nulls_long_number_add_values.json +1 -0
  113. data/src/test/resources/org/embulk/output/kintone/task/skip/update_always_skip_prefer_nulls_long_number_values.json +1 -0
  114. data/src/test/resources/org/embulk/output/kintone/task/skip/update_always_skip_prefer_nulls_update_records.jsonl +2 -0
  115. data/src/test/resources/org/embulk/output/kintone/task/skip/update_always_skip_update_records.jsonl +5 -0
  116. data/src/test/resources/org/embulk/output/kintone/task/skip/update_never_skip_update_records.jsonl +6 -0
  117. data/src/test/resources/org/embulk/output/kintone/task/skip/update_prefer_nulls_update_records.jsonl +3 -0
  118. data/src/test/resources/org/embulk/output/kintone/task/skip/update_update_records.jsonl +6 -0
  119. data/src/test/resources/org/embulk/output/kintone/task/skip/upsert_add_records.jsonl +1 -0
  120. data/src/test/resources/org/embulk/output/kintone/task/skip/upsert_always_skip_prefer_nulls_string_single_line_text_add_values.json +1 -0
  121. data/src/test/resources/org/embulk/output/kintone/task/skip/upsert_always_skip_prefer_nulls_string_single_line_text_values.json +1 -0
  122. data/src/test/resources/org/embulk/output/kintone/task/skip/upsert_always_skip_prefer_nulls_update_records.jsonl +2 -0
  123. data/src/test/resources/org/embulk/output/kintone/task/skip/upsert_always_skip_string_single_line_text_add_values.json +1 -0
  124. data/src/test/resources/org/embulk/output/kintone/task/skip/upsert_always_skip_string_single_line_text_values.json +1 -0
  125. data/src/test/resources/org/embulk/output/kintone/task/skip/upsert_always_skip_update_records.jsonl +2 -0
  126. data/src/test/resources/org/embulk/output/kintone/task/skip/upsert_never_skip_add_records.jsonl +4 -0
  127. data/src/test/resources/org/embulk/output/kintone/task/skip/upsert_never_skip_prefer_nulls_add_records.jsonl +4 -0
  128. data/src/test/resources/org/embulk/output/kintone/task/skip/upsert_never_skip_prefer_nulls_string_single_line_text_add_values.json +1 -0
  129. data/src/test/resources/org/embulk/output/kintone/task/skip/upsert_never_skip_prefer_nulls_string_single_line_text_values.json +1 -0
  130. data/src/test/resources/org/embulk/output/kintone/task/skip/upsert_never_skip_prefer_nulls_update_records.jsonl +2 -0
  131. data/src/test/resources/org/embulk/output/kintone/task/skip/upsert_never_skip_string_single_line_text_add_values.json +1 -0
  132. data/src/test/resources/org/embulk/output/kintone/task/skip/upsert_never_skip_string_single_line_text_values.json +1 -0
  133. data/src/test/resources/org/embulk/output/kintone/task/skip/upsert_never_skip_update_records.jsonl +2 -0
  134. data/src/test/resources/org/embulk/output/kintone/task/skip/upsert_prefer_nulls_add_records.jsonl +1 -0
  135. data/src/test/resources/org/embulk/output/kintone/task/skip/upsert_prefer_nulls_string_single_line_text_add_values.json +1 -0
  136. data/src/test/resources/org/embulk/output/kintone/task/skip/upsert_prefer_nulls_string_single_line_text_values.json +1 -0
  137. data/src/test/resources/org/embulk/output/kintone/task/skip/upsert_prefer_nulls_update_records.jsonl +2 -0
  138. data/src/test/resources/org/embulk/output/kintone/task/skip/upsert_string_single_line_text_add_values.json +1 -0
  139. data/src/test/resources/org/embulk/output/kintone/task/skip/upsert_string_single_line_text_values.json +1 -0
  140. data/src/test/resources/org/embulk/output/kintone/task/skip/upsert_update_records.jsonl +2 -0
  141. data/src/test/resources/org/embulk/output/kintone/task/skip_id/config.yml +1 -0
  142. data/src/test/resources/org/embulk/output/kintone/task/skip_id/input.csv +7 -0
  143. data/src/test/resources/org/embulk/output/kintone/task/skip_id/insert_add_records.jsonl +6 -0
  144. data/src/test/resources/org/embulk/output/kintone/task/skip_id/insert_always_skip_add_records.jsonl +6 -0
  145. data/src/test/resources/org/embulk/output/kintone/task/skip_id/insert_always_skip_prefer_nulls_add_records.jsonl +6 -0
  146. data/src/test/resources/org/embulk/output/kintone/task/skip_id/insert_never_skip_add_records.jsonl +6 -0
  147. data/src/test/resources/org/embulk/output/kintone/task/skip_id/insert_never_skip_prefer_nulls_add_records.jsonl +6 -0
  148. data/src/test/resources/org/embulk/output/kintone/task/skip_id/insert_prefer_nulls_add_records.jsonl +6 -0
  149. data/src/test/resources/org/embulk/output/kintone/task/skip_id/update_always_skip__id_add_values.json +1 -0
  150. data/src/test/resources/org/embulk/output/kintone/task/skip_id/update_always_skip__id_values.json +1 -0
  151. data/src/test/resources/org/embulk/output/kintone/task/skip_id/update_always_skip_prefer_nulls__id_add_values.json +1 -0
  152. data/src/test/resources/org/embulk/output/kintone/task/skip_id/update_always_skip_prefer_nulls__id_values.json +1 -0
  153. data/src/test/resources/org/embulk/output/kintone/task/skip_id/update_always_skip_prefer_nulls_update_records.jsonl +2 -0
  154. data/src/test/resources/org/embulk/output/kintone/task/skip_id/update_always_skip_update_records.jsonl +5 -0
  155. data/src/test/resources/org/embulk/output/kintone/task/skip_id/update_never_skip_update_records.jsonl +6 -0
  156. data/src/test/resources/org/embulk/output/kintone/task/skip_id/update_prefer_nulls_update_records.jsonl +3 -0
  157. data/src/test/resources/org/embulk/output/kintone/task/skip_id/update_update_records.jsonl +6 -0
  158. data/src/test/resources/org/embulk/output/kintone/task/skip_id/upsert__id_add_values.json +1 -0
  159. data/src/test/resources/org/embulk/output/kintone/task/skip_id/upsert__id_values.json +1 -0
  160. data/src/test/resources/org/embulk/output/kintone/task/skip_id/upsert_always_skip__id_add_values.json +1 -0
  161. data/src/test/resources/org/embulk/output/kintone/task/skip_id/upsert_always_skip__id_values.json +1 -0
  162. data/src/test/resources/org/embulk/output/kintone/task/skip_id/upsert_always_skip_prefer_nulls__id_add_values.json +1 -0
  163. data/src/test/resources/org/embulk/output/kintone/task/skip_id/upsert_always_skip_prefer_nulls__id_values.json +1 -0
  164. data/src/test/resources/org/embulk/output/kintone/task/skip_id/upsert_always_skip_prefer_nulls_update_records.jsonl +2 -0
  165. data/src/test/resources/org/embulk/output/kintone/task/skip_id/upsert_always_skip_update_records.jsonl +5 -0
  166. data/src/test/resources/org/embulk/output/kintone/task/skip_id/upsert_never_skip__id_add_values.json +1 -0
  167. data/src/test/resources/org/embulk/output/kintone/task/skip_id/upsert_never_skip__id_values.json +1 -0
  168. data/src/test/resources/org/embulk/output/kintone/task/skip_id/upsert_never_skip_add_records.jsonl +1 -0
  169. data/src/test/resources/org/embulk/output/kintone/task/skip_id/upsert_never_skip_prefer_nulls__id_add_values.json +1 -0
  170. data/src/test/resources/org/embulk/output/kintone/task/skip_id/upsert_never_skip_prefer_nulls__id_values.json +1 -0
  171. data/src/test/resources/org/embulk/output/kintone/task/skip_id/upsert_never_skip_prefer_nulls_add_records.jsonl +4 -0
  172. data/src/test/resources/org/embulk/output/kintone/task/skip_id/upsert_never_skip_prefer_nulls_update_records.jsonl +2 -0
  173. data/src/test/resources/org/embulk/output/kintone/task/skip_id/upsert_never_skip_update_records.jsonl +5 -0
  174. data/src/test/resources/org/embulk/output/kintone/task/skip_id/upsert_prefer_nulls__id_add_values.json +1 -0
  175. data/src/test/resources/org/embulk/output/kintone/task/skip_id/upsert_prefer_nulls__id_values.json +1 -0
  176. data/src/test/resources/org/embulk/output/kintone/task/skip_id/upsert_prefer_nulls_add_records.jsonl +3 -0
  177. data/src/test/resources/org/embulk/output/kintone/task/skip_id/upsert_prefer_nulls_update_records.jsonl +2 -0
  178. data/src/test/resources/org/embulk/output/kintone/task/skip_id/upsert_update_records.jsonl +5 -0
  179. metadata +163 -17
  180. data/classpath/embulk-output-kintone-1.0.0.jar +0 -0
  181. /data/src/test/resources/org/embulk/output/kintone/task/mode/{values.json → upsert_never_skip_double_single_line_text_values.json} +0 -0
  182. /data/src/test/resources/org/embulk/output/kintone/task/mode/{upsert_add_ignore_nulls_records.jsonl → upsert_never_skip_ignore_nulls_add_records.jsonl} +0 -0
  183. /data/src/test/resources/org/embulk/output/kintone/task/mode/{values_ignore_nulls.json → upsert_never_skip_ignore_nulls_double_single_line_text_values.json} +0 -0
  184. /data/src/test/resources/org/embulk/output/kintone/task/mode/{values_prefer_nulls.json → upsert_never_skip_prefer_nulls_double_single_line_text_values.json} +0 -0
@@ -0,0 +1,139 @@
1
+ package org.embulk.output.kintone;
2
+
3
+ import static org.hamcrest.MatcherAssert.assertThat;
4
+ import static org.hamcrest.Matchers.is;
5
+ import static org.junit.Assert.assertThrows;
6
+
7
+ import java.util.Collections;
8
+ import org.embulk.config.ConfigException;
9
+ import org.embulk.config.ConfigSource;
10
+ import org.embulk.output.kintone.util.Lazy;
11
+ import org.embulk.spi.Schema;
12
+ import org.embulk.spi.type.Type;
13
+ import org.embulk.spi.type.Types;
14
+ import org.junit.Before;
15
+ import org.junit.Test;
16
+
17
+ public class KintoneClientTest extends TestKintoneOutputPlugin {
18
+ private ConfigSource config;
19
+
20
+ @Before
21
+ public void before() {
22
+ config = loadConfigYaml("client/config.yml");
23
+ }
24
+
25
+ @Test
26
+ public void testInsert() {
27
+ merge(config("mode: insert"));
28
+ merge(config("update_key: null"));
29
+ runWithMockClient(Lazy::get);
30
+ merge(config("update_key: long_number"));
31
+ assertConfigException("When mode is insert, require no update_key.");
32
+ merge(config("update_key: string_single_line_text"));
33
+ assertConfigException("When mode is insert, require no update_key.");
34
+ merge(config("update_key: $id"));
35
+ assertConfigException("When mode is insert, require no update_key.", id(Types.LONG));
36
+ merge(config("update_key: null"));
37
+ runWithMockClient(Lazy::get, id(Types.STRING));
38
+ }
39
+
40
+ @Test
41
+ public void testUpdate() {
42
+ merge(config("mode: update"));
43
+ merge(config("update_key: null"));
44
+ assertConfigException("When mode is update, require update_key or id column.");
45
+ merge(config("update_key: non_existing_column"));
46
+ assertConfigException("The column 'non_existing_column' for update does not exist.");
47
+ merge(config("update_key: non_existing_field"));
48
+ assertConfigException("The field 'non_existing_field' for update does not exist.");
49
+ merge(config("update_key: invalid_type_field_multi_line_text"));
50
+ assertConfigException("The update_key must be 'SINGLE_LINE_TEXT' or 'NUMBER'.");
51
+ merge(config("update_key: long_number"));
52
+ runWithMockClient(Lazy::get);
53
+ merge(config("update_key: string_single_line_text"));
54
+ runWithMockClient(Lazy::get);
55
+ merge(config("update_key: $id"));
56
+ runWithMockClient(Lazy::get, id(Types.LONG));
57
+ merge(config("update_key: null"));
58
+ assertConfigException("The id column must be 'long'.", id(Types.STRING));
59
+ }
60
+
61
+ @Test
62
+ public void testUpsert() {
63
+ merge(config("mode: upsert"));
64
+ merge(config("update_key: null"));
65
+ assertConfigException("When mode is upsert, require update_key or id column.");
66
+ merge(config("update_key: non_existing_column"));
67
+ assertConfigException("The column 'non_existing_column' for update does not exist.");
68
+ merge(config("update_key: non_existing_field"));
69
+ assertConfigException("The field 'non_existing_field' for update does not exist.");
70
+ merge(config("update_key: invalid_type_field_multi_line_text"));
71
+ assertConfigException("The update_key must be 'SINGLE_LINE_TEXT' or 'NUMBER'.");
72
+ merge(config("update_key: long_number"));
73
+ runWithMockClient(Lazy::get);
74
+ merge(config("update_key: string_single_line_text"));
75
+ runWithMockClient(Lazy::get);
76
+ merge(config("update_key: $id"));
77
+ runWithMockClient(Lazy::get, id(Types.LONG));
78
+ merge(config("update_key: null"));
79
+ assertConfigException("The id column must be 'long'.", id(Types.STRING));
80
+ }
81
+
82
+ private void assertConfigException(String message) {
83
+ assertConfigException(message, builder());
84
+ }
85
+
86
+ private void assertConfigException(String message, Schema.Builder builder) {
87
+ runWithMockClient(
88
+ client ->
89
+ assertThat(assertThrows(ConfigException.class, client::get).getMessage(), is(message)),
90
+ builder);
91
+ }
92
+
93
+ private void runWithMockClient(Consumer<Lazy<KintoneClient>> consumer) {
94
+ runWithMockClient(consumer, builder());
95
+ }
96
+
97
+ private void runWithMockClient(Consumer<Lazy<KintoneClient>> consumer, Schema.Builder builder) {
98
+ MockClient mockClient =
99
+ new MockClient(
100
+ config.get(String.class, "domain"),
101
+ Collections.emptyList(),
102
+ Collections.emptyList(),
103
+ "");
104
+ try (Lazy<KintoneClient> client = KintoneClient.lazy(this::task, schema(builder))) {
105
+ mockClient.run(() -> consumer.accept(client));
106
+ } catch (Exception e) {
107
+ throw new RuntimeException(e);
108
+ }
109
+ }
110
+
111
+ private void merge(ConfigSource config) {
112
+ this.config.merge(config);
113
+ }
114
+
115
+ private PluginTask task() {
116
+ return config.loadConfig(PluginTask.class);
117
+ }
118
+
119
+ private static Schema schema(Schema.Builder builder) {
120
+ return builder
121
+ .add("non_existing_field", Types.LONG)
122
+ .add("invalid_type_field_multi_line_text", Types.STRING)
123
+ .add("long_number", Types.LONG)
124
+ .add("string_single_line_text", Types.STRING)
125
+ .build();
126
+ }
127
+
128
+ private static Schema.Builder id(Type type) {
129
+ return builder().add("$id", type);
130
+ }
131
+
132
+ private static Schema.Builder builder() {
133
+ return Schema.builder();
134
+ }
135
+
136
+ private interface Consumer<T> {
137
+ void accept(T t) throws Exception;
138
+ }
139
+ }
@@ -1,5 +1,7 @@
1
1
  package org.embulk.output.kintone;
2
2
 
3
+ import java.util.Collections;
4
+ import java.util.List;
3
5
  import org.embulk.config.TaskSource;
4
6
 
5
7
  public class KintoneColumnOptionBuilder {
@@ -50,6 +52,11 @@ public class KintoneColumnOptionBuilder {
50
52
  return valueSeparator;
51
53
  }
52
54
 
55
+ @Override
56
+ public List<KintoneSortColumn> getSortColumns() {
57
+ return Collections.emptyList();
58
+ }
59
+
53
60
  @Override
54
61
  public void validate() {}
55
62
 
@@ -0,0 +1,194 @@
1
+ package org.embulk.output.kintone;
2
+
3
+ import static org.embulk.output.kintone.KintoneColumnType.CHECK_BOX;
4
+ import static org.embulk.output.kintone.KintoneColumnType.DATE;
5
+ import static org.embulk.output.kintone.KintoneColumnType.DATETIME;
6
+ import static org.embulk.output.kintone.KintoneColumnType.DROP_DOWN;
7
+ import static org.embulk.output.kintone.KintoneColumnType.FILE;
8
+ import static org.embulk.output.kintone.KintoneColumnType.GROUP_SELECT;
9
+ import static org.embulk.output.kintone.KintoneColumnType.LINK;
10
+ import static org.embulk.output.kintone.KintoneColumnType.MULTI_LINE_TEXT;
11
+ import static org.embulk.output.kintone.KintoneColumnType.MULTI_SELECT;
12
+ import static org.embulk.output.kintone.KintoneColumnType.NUMBER;
13
+ import static org.embulk.output.kintone.KintoneColumnType.ORGANIZATION_SELECT;
14
+ import static org.embulk.output.kintone.KintoneColumnType.RADIO_BUTTON;
15
+ import static org.embulk.output.kintone.KintoneColumnType.RICH_TEXT;
16
+ import static org.embulk.output.kintone.KintoneColumnType.SINGLE_LINE_TEXT;
17
+ import static org.embulk.output.kintone.KintoneColumnType.SUBTABLE;
18
+ import static org.embulk.output.kintone.KintoneColumnType.TIME;
19
+ import static org.embulk.output.kintone.KintoneColumnType.USER_SELECT;
20
+ import static org.hamcrest.MatcherAssert.assertThat;
21
+ import static org.hamcrest.Matchers.is;
22
+ import static org.junit.Assert.assertThrows;
23
+
24
+ import com.kintone.client.model.record.CheckBoxFieldValue;
25
+ import com.kintone.client.model.record.DateFieldValue;
26
+ import com.kintone.client.model.record.DateTimeFieldValue;
27
+ import com.kintone.client.model.record.DropDownFieldValue;
28
+ import com.kintone.client.model.record.LinkFieldValue;
29
+ import com.kintone.client.model.record.MultiLineTextFieldValue;
30
+ import com.kintone.client.model.record.MultiSelectFieldValue;
31
+ import com.kintone.client.model.record.NumberFieldValue;
32
+ import com.kintone.client.model.record.RadioButtonFieldValue;
33
+ import com.kintone.client.model.record.RichTextFieldValue;
34
+ import com.kintone.client.model.record.SingleLineTextFieldValue;
35
+ import com.kintone.client.model.record.SubtableFieldValue;
36
+ import com.kintone.client.model.record.TableRow;
37
+ import com.kintone.client.model.record.TimeFieldValue;
38
+ import java.math.BigDecimal;
39
+ import java.time.Instant;
40
+ import java.time.LocalDate;
41
+ import java.time.LocalTime;
42
+ import java.time.ZonedDateTime;
43
+ import java.util.Arrays;
44
+ import java.util.List;
45
+ import java.util.stream.Collectors;
46
+ import org.embulk.output.kintone.deserializer.DeserializerTest;
47
+ import org.embulk.spi.time.Timestamp;
48
+ import org.junit.Test;
49
+ import org.msgpack.value.Value;
50
+ import org.msgpack.value.ValueFactory;
51
+
52
+ public class KintoneColumnTypeTest {
53
+ private static final Timestamp EPOCH = Timestamp.ofInstant(Instant.EPOCH);
54
+ private static final Value EMPTY = ValueFactory.newString("");
55
+
56
+ @Test
57
+ public void testSupportedTypes() {
58
+ // spotless:off
59
+ assertThat(((SingleLineTextFieldValue) SINGLE_LINE_TEXT.getFieldValue(false, null)).getValue(), is("false"));
60
+ assertThat(((SingleLineTextFieldValue) SINGLE_LINE_TEXT.getFieldValue(0L, null)).getValue(), is("0"));
61
+ assertThat(((SingleLineTextFieldValue) SINGLE_LINE_TEXT.getFieldValue(0.0d, null)).getValue(), is("0.0"));
62
+ assertThat(((SingleLineTextFieldValue) SINGLE_LINE_TEXT.getFieldValue("", null)).getValue(), is(""));
63
+ assertThat(((SingleLineTextFieldValue) SINGLE_LINE_TEXT.getFieldValue(EPOCH, null)).getValue(), is("1970-01-01T00:00:00Z"));
64
+ assertThat(((SingleLineTextFieldValue) SINGLE_LINE_TEXT.getFieldValue(EMPTY, null)).getValue(), is("\"\""));
65
+ assertThat(((MultiLineTextFieldValue) MULTI_LINE_TEXT.getFieldValue(false, null)).getValue(), is("false"));
66
+ assertThat(((MultiLineTextFieldValue) MULTI_LINE_TEXT.getFieldValue(0L, null)).getValue(), is("0"));
67
+ assertThat(((MultiLineTextFieldValue) MULTI_LINE_TEXT.getFieldValue(0.0d, null)).getValue(), is("0.0"));
68
+ assertThat(((MultiLineTextFieldValue) MULTI_LINE_TEXT.getFieldValue("", null)).getValue(), is(""));
69
+ assertThat(((MultiLineTextFieldValue) MULTI_LINE_TEXT.getFieldValue(EPOCH, null)).getValue(), is("1970-01-01T00:00:00Z"));
70
+ assertThat(((MultiLineTextFieldValue) MULTI_LINE_TEXT.getFieldValue(EMPTY, null)).getValue(), is("\"\""));
71
+ assertThat(((RichTextFieldValue) RICH_TEXT.getFieldValue(false, null)).getValue(), is("false"));
72
+ assertThat(((RichTextFieldValue) RICH_TEXT.getFieldValue(0L, null)).getValue(), is("0"));
73
+ assertThat(((RichTextFieldValue) RICH_TEXT.getFieldValue(0.0d, null)).getValue(), is("0.0"));
74
+ assertThat(((RichTextFieldValue) RICH_TEXT.getFieldValue("", null)).getValue(), is(""));
75
+ assertThat(((RichTextFieldValue) RICH_TEXT.getFieldValue(EPOCH, null)).getValue(), is("1970-01-01T00:00:00Z"));
76
+ assertThat(((RichTextFieldValue) RICH_TEXT.getFieldValue(EMPTY, null)).getValue(), is("\"\""));
77
+ assertThat(((NumberFieldValue) NUMBER.getFieldValue(false, null)).getValue(), is(number("0")));
78
+ assertThat(((NumberFieldValue) NUMBER.getFieldValue(0L, null)).getValue(), is(number("0")));
79
+ assertThat(((NumberFieldValue) NUMBER.getFieldValue(0.0d, null)).getValue(), is(number("0.0")));
80
+ assertThat(((NumberFieldValue) NUMBER.getFieldValue("", null)).getValue(), is(number("0")));
81
+ assertThat(((NumberFieldValue) NUMBER.getFieldValue(EPOCH, null)).getValue(), is(number("0")));
82
+ assertThat(((CheckBoxFieldValue) CHECK_BOX.getFieldValue("", null)).getValues(), is(list()));
83
+ assertThat(((RadioButtonFieldValue) RADIO_BUTTON.getFieldValue("", null)).getValue(), is(""));
84
+ assertThat(((MultiSelectFieldValue) MULTI_SELECT.getFieldValue("", null)).getValues(), is(list()));
85
+ assertThat(((DropDownFieldValue) DROP_DOWN.getFieldValue("", null)).getValue(), is(""));
86
+ assertThat(((DateFieldValue) DATE.getFieldValue(0L, null)).getValue(), is(date("1970-01-01")));
87
+ assertThat(((DateFieldValue) DATE.getFieldValue(0.0d, null)).getValue(), is(date("1970-01-01")));
88
+ assertThat(((DateFieldValue) DATE.getFieldValue("", null)).getValue(), is(date("1970-01-01")));
89
+ assertThat(((DateFieldValue) DATE.getFieldValue(EPOCH, null)).getValue(), is(date("1970-01-01")));
90
+ assertThat(((TimeFieldValue) TIME.getFieldValue(0L, null)).getValue(), is(time("00:00:00")));
91
+ assertThat(((TimeFieldValue) TIME.getFieldValue(0.0d, null)).getValue(), is(time("00:00:00")));
92
+ assertThat(((TimeFieldValue) TIME.getFieldValue("", null)).getValue(), is(time("00:00:00")));
93
+ assertThat(((TimeFieldValue) TIME.getFieldValue(EPOCH, null)).getValue(), is(time("00:00:00")));
94
+ assertThat(((DateTimeFieldValue) DATETIME.getFieldValue(0L, null)).getValue(), is(dateTime("1970-01-01T00:00:00Z")));
95
+ assertThat(((DateTimeFieldValue) DATETIME.getFieldValue(0.0d, null)).getValue(), is(dateTime("1970-01-01T00:00:00Z")));
96
+ assertThat(((DateTimeFieldValue) DATETIME.getFieldValue("", null)).getValue(), is(dateTime("1970-01-01T00:00:00Z")));
97
+ assertThat(((DateTimeFieldValue) DATETIME.getFieldValue(EPOCH, null)).getValue(), is(dateTime("1970-01-01T00:00:00Z")));
98
+ assertThat(((LinkFieldValue) LINK.getFieldValue("", null)).getValue(), is(""));
99
+ assertThat(((SubtableFieldValue) SUBTABLE.getFieldValue("", null)).getRows(), is(rows()));
100
+ assertThat(((SubtableFieldValue) SUBTABLE.getFieldValue(EMPTY, null)).getRows(), is(rows()));
101
+ // spotless:on
102
+ }
103
+
104
+ @Test
105
+ public void testUnsupportedTypes() {
106
+ // spotless:off
107
+ assertThrows(UnsupportedOperationException.class, () -> NUMBER.getFieldValue(EMPTY, null));
108
+ assertThrows(UnsupportedOperationException.class, () -> CHECK_BOX.getFieldValue(false, null));
109
+ assertThrows(UnsupportedOperationException.class, () -> CHECK_BOX.getFieldValue(0L, null));
110
+ assertThrows(UnsupportedOperationException.class, () -> CHECK_BOX.getFieldValue(0.0d, null));
111
+ assertThrows(UnsupportedOperationException.class, () -> CHECK_BOX.getFieldValue(EPOCH, null));
112
+ assertThrows(UnsupportedOperationException.class, () -> CHECK_BOX.getFieldValue(EMPTY, null));
113
+ assertThrows(UnsupportedOperationException.class, () -> RADIO_BUTTON.getFieldValue(false, null));
114
+ assertThrows(UnsupportedOperationException.class, () -> RADIO_BUTTON.getFieldValue(0L, null));
115
+ assertThrows(UnsupportedOperationException.class, () -> RADIO_BUTTON.getFieldValue(0.0d, null));
116
+ assertThrows(UnsupportedOperationException.class, () -> RADIO_BUTTON.getFieldValue(EPOCH, null));
117
+ assertThrows(UnsupportedOperationException.class, () -> RADIO_BUTTON.getFieldValue(EMPTY, null));
118
+ assertThrows(UnsupportedOperationException.class, () -> MULTI_SELECT.getFieldValue(false, null));
119
+ assertThrows(UnsupportedOperationException.class, () -> MULTI_SELECT.getFieldValue(0L, null));
120
+ assertThrows(UnsupportedOperationException.class, () -> MULTI_SELECT.getFieldValue(0.0d, null));
121
+ assertThrows(UnsupportedOperationException.class, () -> MULTI_SELECT.getFieldValue(EPOCH, null));
122
+ assertThrows(UnsupportedOperationException.class, () -> MULTI_SELECT.getFieldValue(EMPTY, null));
123
+ assertThrows(UnsupportedOperationException.class, () -> DROP_DOWN.getFieldValue(false, null));
124
+ assertThrows(UnsupportedOperationException.class, () -> DROP_DOWN.getFieldValue(0L, null));
125
+ assertThrows(UnsupportedOperationException.class, () -> DROP_DOWN.getFieldValue(0.0d, null));
126
+ assertThrows(UnsupportedOperationException.class, () -> DROP_DOWN.getFieldValue(EPOCH, null));
127
+ assertThrows(UnsupportedOperationException.class, () -> DROP_DOWN.getFieldValue(EMPTY, null));
128
+ assertThrows(UnsupportedOperationException.class, () -> USER_SELECT.getFieldValue(false, null));
129
+ assertThrows(UnsupportedOperationException.class, () -> USER_SELECT.getFieldValue(0L, null));
130
+ assertThrows(UnsupportedOperationException.class, () -> USER_SELECT.getFieldValue(0.0d, null));
131
+ assertThrows(UnsupportedOperationException.class, () -> USER_SELECT.getFieldValue("", null));
132
+ assertThrows(UnsupportedOperationException.class, () -> USER_SELECT.getFieldValue(EPOCH, null));
133
+ assertThrows(UnsupportedOperationException.class, () -> USER_SELECT.getFieldValue(EMPTY, null));
134
+ assertThrows(UnsupportedOperationException.class, () -> ORGANIZATION_SELECT.getFieldValue(false, null));
135
+ assertThrows(UnsupportedOperationException.class, () -> ORGANIZATION_SELECT.getFieldValue(0L, null));
136
+ assertThrows(UnsupportedOperationException.class, () -> ORGANIZATION_SELECT.getFieldValue(0.0d, null));
137
+ assertThrows(UnsupportedOperationException.class, () -> ORGANIZATION_SELECT.getFieldValue("", null));
138
+ assertThrows(UnsupportedOperationException.class, () -> ORGANIZATION_SELECT.getFieldValue(EPOCH, null));
139
+ assertThrows(UnsupportedOperationException.class, () -> ORGANIZATION_SELECT.getFieldValue(EMPTY, null));
140
+ assertThrows(UnsupportedOperationException.class, () -> GROUP_SELECT.getFieldValue(false, null));
141
+ assertThrows(UnsupportedOperationException.class, () -> GROUP_SELECT.getFieldValue(0L, null));
142
+ assertThrows(UnsupportedOperationException.class, () -> GROUP_SELECT.getFieldValue(0.0d, null));
143
+ assertThrows(UnsupportedOperationException.class, () -> GROUP_SELECT.getFieldValue("", null));
144
+ assertThrows(UnsupportedOperationException.class, () -> GROUP_SELECT.getFieldValue(EPOCH, null));
145
+ assertThrows(UnsupportedOperationException.class, () -> GROUP_SELECT.getFieldValue(EMPTY, null));
146
+ assertThrows(UnsupportedOperationException.class, () -> DATE.getFieldValue(false, null));
147
+ assertThrows(UnsupportedOperationException.class, () -> DATE.getFieldValue(EMPTY, null));
148
+ assertThrows(UnsupportedOperationException.class, () -> TIME.getFieldValue(false, null));
149
+ assertThrows(UnsupportedOperationException.class, () -> TIME.getFieldValue(EMPTY, null));
150
+ assertThrows(UnsupportedOperationException.class, () -> DATETIME.getFieldValue(false, null));
151
+ assertThrows(UnsupportedOperationException.class, () -> DATETIME.getFieldValue(EMPTY, null));
152
+ assertThrows(UnsupportedOperationException.class, () -> LINK.getFieldValue(false, null));
153
+ assertThrows(UnsupportedOperationException.class, () -> LINK.getFieldValue(0L, null));
154
+ assertThrows(UnsupportedOperationException.class, () -> LINK.getFieldValue(0.0d, null));
155
+ assertThrows(UnsupportedOperationException.class, () -> LINK.getFieldValue(EPOCH, null));
156
+ assertThrows(UnsupportedOperationException.class, () -> LINK.getFieldValue(EMPTY, null));
157
+ assertThrows(UnsupportedOperationException.class, () -> FILE.getFieldValue(false, null));
158
+ assertThrows(UnsupportedOperationException.class, () -> FILE.getFieldValue(0L, null));
159
+ assertThrows(UnsupportedOperationException.class, () -> FILE.getFieldValue(0.0d, null));
160
+ assertThrows(UnsupportedOperationException.class, () -> FILE.getFieldValue("", null));
161
+ assertThrows(UnsupportedOperationException.class, () -> FILE.getFieldValue(EPOCH, null));
162
+ assertThrows(UnsupportedOperationException.class, () -> FILE.getFieldValue(EMPTY, null));
163
+ assertThrows(UnsupportedOperationException.class, () -> SUBTABLE.getFieldValue(false, null));
164
+ assertThrows(UnsupportedOperationException.class, () -> SUBTABLE.getFieldValue(0L, null));
165
+ assertThrows(UnsupportedOperationException.class, () -> SUBTABLE.getFieldValue(0.0d, null));
166
+ assertThrows(UnsupportedOperationException.class, () -> SUBTABLE.getFieldValue(EPOCH, null));
167
+ // spotless:on
168
+ }
169
+
170
+ public static BigDecimal number(String value) {
171
+ return new BigDecimal(value);
172
+ }
173
+
174
+ @SafeVarargs
175
+ public static <T> List<T> list(T... a) {
176
+ return Arrays.asList(a);
177
+ }
178
+
179
+ public static List<TableRow> rows(Long... ids) {
180
+ return Arrays.stream(ids).map(DeserializerTest::tableRow).collect(Collectors.toList());
181
+ }
182
+
183
+ public static LocalDate date(CharSequence text) {
184
+ return LocalDate.parse(text);
185
+ }
186
+
187
+ public static LocalTime time(CharSequence text) {
188
+ return LocalTime.parse(text);
189
+ }
190
+
191
+ public static ZonedDateTime dateTime(CharSequence text) {
192
+ return ZonedDateTime.parse(text);
193
+ }
194
+ }