blufin 0.1.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 (113) hide show
  1. checksums.yaml +7 -0
  2. data/bin/bf +5 -0
  3. data/bin/blufin +5 -0
  4. data/lib/blufin.rb +245 -0
  5. data/lib/core/code_scanners/common/scanner_common.rb +83 -0
  6. data/lib/core/code_scanners/common/scanner_java.rb +106 -0
  7. data/lib/core/code_scanners/scanner_java_embedded_objects.rb +386 -0
  8. data/lib/core/code_scanners/scanner_java_enums.rb +125 -0
  9. data/lib/core/code_scanners/scanner_java_source.rb +29 -0
  10. data/lib/core/code_scanners/scanner_java_tests.rb +157 -0
  11. data/lib/core/error_handling/schema_error.rb +9 -0
  12. data/lib/core/error_handling/sql_error.rb +21 -0
  13. data/lib/core/error_handling/sql_error_handler.rb +149 -0
  14. data/lib/core/error_handling/yml_error.rb +21 -0
  15. data/lib/core/error_handling/yml_error_handler.rb +437 -0
  16. data/lib/core/mysql.rb +347 -0
  17. data/lib/core/opt.rb +21 -0
  18. data/lib/core/site/site.rb +26 -0
  19. data/lib/core/site/site_auth.rb +88 -0
  20. data/lib/core/site/site_embedded.rb +27 -0
  21. data/lib/core/site/site_ports.rb +9 -0
  22. data/lib/core/site/site_resolver.rb +276 -0
  23. data/lib/core/site/site_services.rb +162 -0
  24. data/lib/core/site/site_ui.rb +16 -0
  25. data/lib/core/yml/config/yml_config_validator.rb +219 -0
  26. data/lib/core/yml/maven/yml_maven_validator.rb +1132 -0
  27. data/lib/core/yml/resource/yml_resource_validator.rb +154 -0
  28. data/lib/core/yml/schema/yml_schema_flags.rb +9 -0
  29. data/lib/core/yml/schema/yml_schema_validator.rb +1850 -0
  30. data/lib/core/yml/yml_cache_handler.rb +115 -0
  31. data/lib/core/yml/yml_common.rb +487 -0
  32. data/lib/core/yml/yml_meta_writer_base.rb +300 -0
  33. data/lib/core/yml/yml_outputter.rb +307 -0
  34. data/lib/core/yml/yml_validator_base.rb +630 -0
  35. data/lib/core/yml_writers/yml_configuration_writer.rb +40 -0
  36. data/lib/core/yml_writers/yml_java_api_resource_writer.rb +348 -0
  37. data/lib/core/yml_writers/yml_java_cron_type_writer.rb +113 -0
  38. data/lib/core/yml_writers/yml_java_css_dependency_writer.rb +59 -0
  39. data/lib/core/yml_writers/yml_java_dao_writer.rb +364 -0
  40. data/lib/core/yml_writers/yml_java_dto_writer.rb +251 -0
  41. data/lib/core/yml_writers/yml_java_embedded_object_writer.rb +968 -0
  42. data/lib/core/yml_writers/yml_java_enum_writer.rb +161 -0
  43. data/lib/core/yml_writers/yml_java_js_dependency_writer.rb +59 -0
  44. data/lib/core/yml_writers/yml_java_message_type_writer.rb +106 -0
  45. data/lib/core/yml_writers/yml_java_meta_writer.rb +173 -0
  46. data/lib/core/yml_writers/yml_java_model_writer.rb +510 -0
  47. data/lib/core/yml_writers/yml_java_pom_writer.rb +1050 -0
  48. data/lib/core/yml_writers/yml_java_resource_data_writer.rb +251 -0
  49. data/lib/core/yml_writers/yml_java_sdk_writer.rb +732 -0
  50. data/lib/core/yml_writers/yml_java_validator_writer.rb +280 -0
  51. data/lib/core/yml_writers/yml_java_worker_writer.rb +81 -0
  52. data/lib/core/yml_writers/yml_sql_structure_writer.rb +307 -0
  53. data/lib/core/yml_writers/yml_sql_template_writer.rb +243 -0
  54. data/lib/core/yml_writers/yml_vue_service_writer.rb +170 -0
  55. data/lib/core/yml_writers/yml_writer_base.rb +114 -0
  56. data/lib/routes/api_list.rb +35 -0
  57. data/lib/routes/api_meta.rb +59 -0
  58. data/lib/routes/build.rb +46 -0
  59. data/lib/routes/create/create_api.rb +35 -0
  60. data/lib/routes/create/create_ui.rb +84 -0
  61. data/lib/routes/export.rb +56 -0
  62. data/lib/routes/generate/generate_api.rb +225 -0
  63. data/lib/routes/generate/generate_img_favicon.rb +56 -0
  64. data/lib/routes/generate/generate_img_landing.rb +94 -0
  65. data/lib/routes/generate/generate_lambda.rb +43 -0
  66. data/lib/routes/lint.rb +35 -0
  67. data/lib/routes/mysql_reset.rb +43 -0
  68. data/lib/routes/release_blufin.rb +351 -0
  69. data/lib/routes/run.rb +35 -0
  70. data/lib/version.rb +1 -0
  71. data/opt/README.MD +2 -0
  72. data/opt/config/schema.yml +73 -0
  73. data/opt/config/template.yml +25 -0
  74. data/opt/sql/data/config/data-client.sql +7 -0
  75. data/opt/sql/data/config/data-db-configuration-property.sql +47 -0
  76. data/opt/sql/data/config/data-db-configuration.sql +9 -0
  77. data/opt/sql/data/config/data-db.sql +175 -0
  78. data/opt/sql/data/config/data-profile-api.sql +47 -0
  79. data/opt/sql/data/config/data-profile-cron.sql +0 -0
  80. data/opt/sql/data/config/data-profile-worker.sql +0 -0
  81. data/opt/sql/data/config/data-profile.sql +87 -0
  82. data/opt/sql/data/config/data-project.sql +95 -0
  83. data/opt/sql/structure/blufin-master-structure-fks.sql +65 -0
  84. data/opt/sql/structure/blufin-master-structure.sql +97 -0
  85. data/opt/sql/structure/blufin-mock-structure-fks.sql +38 -0
  86. data/opt/sql/structure/blufin-mock-structure.sql +98 -0
  87. data/opt/sql/templates/config/template-client.sql +7 -0
  88. data/opt/sql/templates/config/template-db-configuration-property.sql +11 -0
  89. data/opt/sql/templates/config/template-db-configuration.sql +9 -0
  90. data/opt/sql/templates/config/template-db.sql +21 -0
  91. data/opt/sql/templates/config/template-profile-api.sql +11 -0
  92. data/opt/sql/templates/config/template-profile-cron.sql +7 -0
  93. data/opt/sql/templates/config/template-profile-worker.sql +7 -0
  94. data/opt/sql/templates/config/template-profile.sql +21 -0
  95. data/opt/sql/templates/config/template-project.sql +23 -0
  96. data/opt/yml/api/schema/config/client.yml +14 -0
  97. data/opt/yml/api/schema/config/db.yml +45 -0
  98. data/opt/yml/api/schema/config/db_configuration.yml +22 -0
  99. data/opt/yml/api/schema/config/db_configuration_property.yml +22 -0
  100. data/opt/yml/api/schema/config/profile.yml +53 -0
  101. data/opt/yml/api/schema/config/profile_api.yml +22 -0
  102. data/opt/yml/api/schema/config/profile_cron.yml +14 -0
  103. data/opt/yml/api/schema/config/profile_worker.yml +14 -0
  104. data/opt/yml/api/schema/config/project.yml +48 -0
  105. data/opt/yml/api/schema/mock/mock.yml +99 -0
  106. data/opt/yml/api/schema/mock/mock_nested_if_enum.yml +16 -0
  107. data/opt/yml/api/schema/mock/mock_nested_if_enum_system.yml +16 -0
  108. data/opt/yml/api/schema/mock/mock_nested_linked.yml +43 -0
  109. data/opt/yml/api/schema/mock/mock_nested_multiple.yml +61 -0
  110. data/opt/yml/api/schema/mock/mock_nested_single.yml +67 -0
  111. data/opt/yml/api/schema/mock/mock_nested_single_super_deep.yml +32 -0
  112. data/opt/yml/api/schema/mock/mock_nested_single_super_super_deep.yml +17 -0
  113. metadata +240 -0
@@ -0,0 +1,300 @@
1
+ module Blufin
2
+
3
+ class YmlMetaWriterBase < Blufin::YmlWriterBase
4
+
5
+ TYPE = 'TYPE'
6
+ MAX_LENGTH = 'MAX_LENGTH'
7
+ FLAG = 'FLAG'
8
+ FLAG_AUTO_INCREMENT = 'FLAG_AUTO_INCREMENT'
9
+ FLAG_INDEX = 'FLAG_INDEX'
10
+ FLAG_NULLABLE = 'FLAG_NULLABLE'
11
+ FLAG_PRIMARY_KEY = 'FLAG_PRIMARY_KEY'
12
+ FLAG_UNIQUE = 'FLAG_UNIQUE'
13
+ FKEY = 'FKEY'
14
+ LINK = 'LINK'
15
+ DESCRIPTION = 'DESCRIPTION'
16
+ REQUIRED = 'REQUIRED'
17
+ REQUIRED_IF = 'REQUIRED_IF'
18
+ ENCRYPTED = 'ENCRYPTED'
19
+ TRANSIENT = 'TRANSIENT'
20
+ CHILD_OF = 'CHILD_OF'
21
+ CURRENCY_CODE = 'CURRENCY_CODE'
22
+ DECIMAL_DISTRIBUTION = 'DECIMAL_DISTRIBUTION'
23
+ ENUM_NAME = 'ENUM_NAME'
24
+ ENUM_VALUES = 'ENUM_VALUES'
25
+
26
+ def handle_description(value)
27
+ @description = " put(#{DESCRIPTION}, \"#{value.gsub('"', '\"')}\");" if value != '' && !value.nil?
28
+ end
29
+
30
+ def handle_type(value, schema, table, column_name, column_data)
31
+
32
+ converted_type = value
33
+ max_length = nil
34
+
35
+ if value == Blufin::YmlSchemaValidator::TYPE_BOOLEAN
36
+ elsif Blufin::YmlSchemaValidator::DATETIME_TYPES.include?(value)
37
+ if value == Blufin::YmlSchemaValidator::TYPE_DATETIME_INSERT || value == Blufin::YmlSchemaValidator::TYPE_DATETIME_UPDATE
38
+ converted_type = 'DATETIME_INSERT' if value == Blufin::YmlSchemaValidator::TYPE_DATETIME_INSERT
39
+ converted_type = 'DATETIME_UPDATE' if value == Blufin::YmlSchemaValidator::TYPE_DATETIME_UPDATE
40
+ @transient = " put(#{TRANSIENT}, true);"
41
+ end
42
+ elsif value =~ Blufin::YmlSchemaValidator::REGEX_DECIMAL
43
+ decimal_m, decimal_d = Blufin::YmlCommon::decimal_extract_values(value)
44
+ converted_type = 'DECIMAL' # DECIMAL(2,2) => "0.25" => length: 4 characters.
45
+ max_length = decimal_m + 1 + (decimal_m == decimal_d ? 1 : 0) # DECIMAL(4,2) => "42.25" => length: 5 characters.
46
+ @import_statements << 'import org.blufin.base.helper.Pair;'
47
+ @decimal_distribution = " put(#{DECIMAL_DISTRIBUTION}, Pair.of(#{decimal_m.to_i}, #{decimal_d.to_i}));"
48
+ elsif Blufin::YmlSchemaValidator::INT_TYPES.include?(value)
49
+ converted_type = 'INT_AUTO' if value == Blufin::YmlSchemaValidator::TYPE_INT_AUTO
50
+ elsif value == Blufin::YmlSchemaValidator::TYPE_INT_TINY
51
+ converted_type = 'INT_TINY'
52
+ elsif value == Blufin::YmlSchemaValidator::TYPE_INT_SMALL
53
+ converted_type = 'INT_SMALL'
54
+ elsif value == Blufin::YmlSchemaValidator::TYPE_INT_BIG
55
+ converted_type = 'INT_BIG'
56
+ elsif Blufin::YmlSchemaValidator::TEXT_TYPES.include?(value)
57
+ # Do nothing.
58
+ elsif value =~ Blufin::YmlSchemaValidator::REGEX_VARCHAR
59
+ converted_type = 'VARCHAR'
60
+ max_length = Blufin::Strings::extract_using_regex(value, /\(\d+\)\z/, %w{( )})
61
+ elsif value =~ Blufin::YmlSchemaValidator::REGEX_ENUM
62
+ enum_values = Blufin::YmlCommon::enum_value_extractor(value, @site)
63
+ converted_type = 'ENUM'
64
+ max_length = enum_values.max_by(&:length).length
65
+ @import_statements << 'import java.util.Arrays;'
66
+ @enum_name = " put(#{ENUM_NAME}, \"#{Blufin::Strings::snake_case_to_camel_case(table)}#{Blufin::Strings::snake_case_to_camel_case(column_name)}\");"
67
+ @enum_values = " put(#{ENUM_VALUES}, Arrays.asList(\"#{enum_values.join('", "')}\"));"
68
+ elsif value =~ Blufin::YmlSchemaValidator::REGEX_ENUM_CUSTOM
69
+ custom_enum_name = Blufin::YmlCommon::enum_name_extractor(value)
70
+ enum_values = @yml_enum_scanner.get_enum_custom_values_for(custom_enum_name)
71
+ converted_type = 'ENUM_CUSTOM'
72
+ max_length = enum_values.max_by(&:length).length
73
+ @import_statements << "import #{get_package(@site, schema, 'enums', Blufin::SiteServices::SDK)}.#{custom_enum_name};"
74
+ @enum_name = " put(#{ENUM_NAME}, \"#{custom_enum_name}\");"
75
+ @enum_values = " put(#{ENUM_VALUES}, getEnumValues(#{custom_enum_name}.values()));"
76
+ elsif value =~ Blufin::YmlSchemaValidator::REGEX_ENUM_SYSTEM
77
+ system_enum_name = Blufin::YmlCommon::enum_name_extractor(value)
78
+ enum_values = @yml_enum_scanner.get_enum_system_values_for(system_enum_name)
79
+ converted_type = 'ENUM_SYSTEM'
80
+ max_length = enum_values.max_by(&:length).length
81
+ @import_statements << "import #{Blufin::SiteServices::PACKAGE_SYSTEM_ENUMS}.#{system_enum_name};"
82
+ @enum_name = " put(#{ENUM_NAME}, \"#{system_enum_name}\");"
83
+ @enum_values = " put(#{ENUM_VALUES}, getEnumValues(#{system_enum_name}.values()));"
84
+ elsif value == Blufin::YmlSchemaValidator::TYPE_ENUM_SYSTEM
85
+ # This only applies to Embedded Objects.
86
+ enum_values = @yml_enum_scanner.get_enum_system_values_for(column_data[:type_java])
87
+ converted_type = 'ENUM_SYSTEM'
88
+ max_length = enum_values.max_by(&:length).length
89
+ @import_statements << "import #{Blufin::SiteServices::PACKAGE_SYSTEM_ENUMS}.#{column_data[:type_java]};"
90
+ @enum_name = " put(#{ENUM_NAME}, \"#{column_data[:type_java]}\");"
91
+ @enum_values = " put(#{ENUM_VALUES}, getEnumValues(#{column_data[:type_java]}.values()));"
92
+ elsif [
93
+ Blufin::ScannerJavaEmbeddedObjects::OBJECT,
94
+ Blufin::ScannerJavaEmbeddedObjects::OBJECT_LIST,
95
+ Blufin::ScannerJavaEmbeddedObjects::OBJECT_LINK,
96
+ ].include?(value)
97
+ # Do Nothing. Fix for @Embedded Meta-Writer.
98
+ else
99
+ raise RuntimeError, "Unrecognized type in #{__FILE__}: #{value}"
100
+ end
101
+ @type = " put(#{TYPE}, DataType.#{converted_type});"
102
+ @max_length = " put(#{MAX_LENGTH}, #{max_length.to_i});" unless max_length.nil?
103
+ end
104
+
105
+ def handle_type_where_implied(table, column_name)
106
+ if column_name =~ /\A(#{Blufin::YmlSchemaValidator::VALID_SCHEMAS_REGEX})\.[a-z_]+\z/
107
+ @type = " put(#{TYPE}, DataType.OBJECT);"
108
+ elsif column_name =~ /\A(#{Blufin::YmlSchemaValidator::VALID_SCHEMAS_REGEX})\.[a-z_]+\[\]\z/
109
+ @type = " put(#{TYPE}, DataType.OBJECT_LIST);"
110
+ elsif column_name =~ /\A[a-z_.]+\[#{Blufin::YmlSchemaValidator::LINK}\]/
111
+ @type = " put(#{TYPE}, DataType.OBJECT_LINK);"
112
+ @link = " put(#{LINK}, \"#{Blufin::YmlCommon::get_link_table_name(table, column_name)}\");"
113
+ end
114
+ end
115
+
116
+ def handle_flag(value)
117
+ if value != '' && !value.nil?
118
+ flags_array = []
119
+ flags_data = Blufin::YmlCommon::extract_flags(value)[0]
120
+ flags_array << FLAG_AUTO_INCREMENT unless flags_data.auto_increment.nil?
121
+ flags_array << FLAG_INDEX unless flags_data.index.nil?
122
+ flags_array << FLAG_NULLABLE unless flags_data.nullable.nil?
123
+ flags_array << FLAG_PRIMARY_KEY unless flags_data.primary_key.nil?
124
+ flags_array << FLAG_UNIQUE unless flags_data.unique.nil?
125
+ if flags_array.any?
126
+ @import_statements << 'import java.util.Arrays;'
127
+ @flag = " put(#{FLAG}, Arrays.asList("
128
+ flags_array.each do |flag|
129
+ @flag += "#{flag}, "
130
+ end
131
+ @flag = @flag[0...-2]
132
+ @flag += '));'
133
+ end
134
+ end
135
+ end
136
+
137
+ def handle_fkey(value)
138
+ @fkey = " put(#{FKEY}, \"#{value.to_s.gsub('"', '\"')}\");"
139
+ end
140
+
141
+ def handle_required(schema, table, value, table_data)
142
+ @required = " put(#{REQUIRED}, true);"
143
+ end
144
+
145
+ def handle_required_if(schema, table, value, table_data)
146
+ value_split = value.split('=')
147
+ enum_value = table_data[value_split[0]][Blufin::YmlSchemaValidator::TYPE]
148
+ if enum_value =~ /#{Blufin::YmlSchemaValidator::REGEX_ENUM}/
149
+ enum_class_name = "#{Blufin::Strings::snake_case_to_camel_case(table)}#{Blufin::Strings.snake_case_to_camel_case(value_split[0].dup)}"
150
+ enum_package = get_package(@site, schema, 'enums', Blufin::SiteServices::SDK)
151
+ elsif enum_value =~ /#{Blufin::YmlSchemaValidator::REGEX_ENUM_CUSTOM}/
152
+ enum_class_name = Blufin::Strings.snake_case_to_camel_case(value_split[0].dup)
153
+ enum_package = get_package(@site, schema, 'enums', Blufin::SiteServices::SDK)
154
+ elsif enum_value =~ /#{Blufin::YmlSchemaValidator::REGEX_ENUM_SYSTEM}/
155
+ enum_class_name = Blufin::YmlCommon::enum_name_extractor(enum_value)
156
+ enum_package = Blufin::SiteServices::PACKAGE_SYSTEM_ENUMS
157
+ else
158
+ raise RuntimeError, "'#{enum_value}' doesn't match regex for ENUM, ENUM_CUSTOM or ENUM_SYSTEM."
159
+ end
160
+
161
+ @required_if = " put(#{REQUIRED_IF}, Pair.of(FIELD_#{value_split[0].upcase}, #{enum_class_name}.#{value_split[1].upcase}));"
162
+ @import_statements << 'import org.blufin.base.helper.Pair;'
163
+ @import_statements << "import #{enum_package}.#{enum_class_name};"
164
+ end
165
+
166
+ def handle_encrypted(value)
167
+ raise RuntimeError, "Encrypted value is something other than 'true' \xe2\x86\x92 #{value}" unless value == 'true' || value == true
168
+ @encrypted = " put(#{ENCRYPTED}, true);"
169
+ end
170
+
171
+ def handle_transient(value)
172
+ @transient = " put(#{TRANSIENT}, \"#{value[0]}.#{value[1]}\");"
173
+ end
174
+
175
+ def handle_child_of(value)
176
+ @child_of = " put(#{CHILD_OF}, \"#{value}\");"
177
+ end
178
+
179
+ def handle_child_type(value)
180
+ raise RuntimeError, "@child_type is being set twice! Was originally: #{@child_type} , now being set to: #{value}" unless @child_type.nil?
181
+ @child_type = value
182
+ end
183
+
184
+ # This build the "hierarchy" Array in the MetaData constructors.
185
+ # schema_tables_array is an Array like [app.data_center, app.db, common.cron]...
186
+ # @return Array (of Data)
187
+ def extract_hierarchy(schema, table, dependents_array, schema_tables_array)
188
+ hierarchy = ["\"#{table}\""]
189
+ hierarchy_nested_only = []
190
+ unless dependents_array.nil?
191
+ dependents_array.each do |dependent|
192
+ ds_array = []
193
+ ds_current = ''
194
+ ds_buffer = ''
195
+ ds = dependent.split('_')
196
+ ds_counter = 0
197
+ ds_levels = []
198
+ ds.each do |n|
199
+ ds_current += "_#{n}"
200
+ ds_current = ds_current.gsub(/^_/, '')
201
+ ds_buffer += "_#{n}"
202
+ ds_buffer = ds_buffer.gsub(/^_/, '')
203
+ if schema_tables_array.include?("#{schema}.#{ds_current}")
204
+ if ds_current =~ /^#{table}/
205
+ ds_counter = ds_counter + 1
206
+ ds_array << ds_buffer
207
+ ds_levels << [ds_counter, ds_array.join('_')]
208
+ ds_buffer = ''
209
+ end
210
+ end
211
+ end
212
+ hierarchy << "\"#{ds_array.join('/')}\""
213
+ hierarchy_nested_only << ds_array.join('_')
214
+ end
215
+ end
216
+ hierarchy.uniq!
217
+ hierarchy.sort!
218
+ [hierarchy, hierarchy_nested_only]
219
+ end
220
+
221
+ def generate_content(content, embedded, consts, fields, hierarchy, hierarchy_nested_only, schema, table, class_name, import_statements, child_type)
222
+
223
+ parent = @schema_resources["#{schema}.#{table}"][:parent]
224
+ parent = (parent.nil? || parent.strip == '') ? 'null' : "\"#{parent}\""
225
+
226
+ if import_statements.any?
227
+ import_statements.uniq!
228
+ content = content.push(*import_statements)
229
+ content << ''
230
+ end
231
+
232
+ content << 'import java.util.HashMap;'
233
+ content << 'import java.text.MessageFormat;'
234
+ content << 'import lombok.Getter;'
235
+ content << 'import org.blufin.base.enums.SchemaType;'
236
+ content << ''
237
+ content << "public final class #{class_name} extends Abstract#{Blufin::YmlJavaMetaWriter::META_DATA} {"
238
+ content << ''
239
+ content << ' @Getter'
240
+ content << " private static final #{class_name} instance = new #{class_name}();"
241
+ content << ''
242
+
243
+ if consts.any?
244
+ consts.each do |const|
245
+ content << const
246
+ end
247
+ content << ''
248
+ end
249
+
250
+ content << " private #{class_name}() {"
251
+ content << ''
252
+
253
+ # Hacky-fix for test classes. DO NOT remove this or Java won't compile.
254
+ constructor_schema = (schema == Blufin::YmlSchemaValidator::MOCK) ? 'null' : "SchemaType.#{schema.upcase}"
255
+ content << " super(#{constructor_schema}, \"#{table}\", #{parent}, Arrays.asList(#{hierarchy.join(', ')}), #{child_type.nil? ? 'null' : child_type});"
256
+ content << ''
257
+
258
+ if fields.any?
259
+ fields.each_with_index do |field, idx|
260
+ if idx == fields.length - 1
261
+ content << field[0...-1]
262
+ else
263
+ content << field
264
+ end
265
+ end
266
+ end
267
+
268
+ content << ' }'
269
+
270
+ if hierarchy_nested_only.any?
271
+ content << ''
272
+ content << ' @Override'
273
+ content << ' public AbstractMetaData getNestedMetaData(String nestedTable) {'
274
+ content << ''
275
+ content << ' switch (nestedTable) {'
276
+ content << ''
277
+ hierarchy_nested_only.each do |n|
278
+ content << " case \"#{n}\":"
279
+ content << " return #{embedded}#{Blufin::Strings::snake_case_to_camel_case(n)}MetaData.getInstance();"
280
+ content << ''
281
+ end
282
+ content << ' default:'
283
+ content << " throw new RuntimeException(MessageFormat.format(\"#{embedded}#{class_name} doesn''t have nested metadata for table: {0}\", nestedTable));"
284
+ content << ' }'
285
+ content << ' }'
286
+
287
+ else
288
+ content << ''
289
+ content << ' @Override'
290
+ content << ' public AbstractMetaData getNestedMetaData(String nestedTable) {'
291
+ content << ''
292
+ content << " throw new RuntimeException(\"Nested metadata not available for #{embedded}#{class_name}. This method should never be called manually.\");"
293
+ content << ' }'
294
+ end
295
+ content << '}'
296
+ content
297
+ end
298
+ end
299
+
300
+ end
@@ -0,0 +1,307 @@
1
+ module Blufin
2
+
3
+ class YmlOutputter
4
+
5
+ include Columnist
6
+
7
+ AUTO = 'AUTO'
8
+ CUSTOM = 'CUSTOM'
9
+ SYSTEM = 'SYSTEM'
10
+
11
+ def initialize(site)
12
+
13
+ @site = Blufin::SiteResolver::validate_site(site)
14
+
15
+ @auto_increment = []
16
+ @auto_increment_indexed = []
17
+
18
+ @resources = []
19
+
20
+ @schema_fks_links = {}
21
+
22
+ @yml_enum_scanner = Blufin::ScannerJavaEnums.new(@site)
23
+
24
+ end
25
+
26
+ # Renders the AUTO_INCREMENT table.
27
+ # @return void
28
+ def show_auto_increment
29
+
30
+ cnt = 0
31
+ max = [@auto_increment.length, @auto_increment_indexed.length].max.to_i
32
+
33
+ Blufin::Terminal::custom('SUMMARY', 23, Blufin::YmlSchemaValidator::FLAG_AUTO_INCREMENT, "Below you can see which tables have what #{Blufin::Terminal::format_highlight(Blufin::YmlSchemaValidator::FLAG_AUTO_INCREMENT)} values applied")
34
+
35
+ table(:border => false) do
36
+
37
+ row do
38
+ column('', :width => 4)
39
+ column('AUTO_INCREMENT', :width => 60, :color => 34)
40
+ column('AUTO_INCREMENT(?)', :width => 60, :color => 34)
41
+ end
42
+
43
+ while cnt + 1 < max
44
+ row do
45
+ column('')
46
+ column(@auto_increment[cnt], :color => 240)
47
+ column(@auto_increment_indexed[cnt], :color => 240)
48
+ end
49
+ cnt = cnt + 1
50
+ end
51
+
52
+ end
53
+
54
+ puts "\x1B[0m"
55
+ end
56
+
57
+ # Renders a summary of all enums that are available (including their possible values).
58
+ # @return void
59
+ def show_enums
60
+
61
+ terminal_width = Blufin::Terminal::get_terminal_width
62
+
63
+ Blufin::Terminal::error('Cannot display data because terminal window is too narrow.', ["Current width is: #{Blufin::Terminal::format_highlight(terminal_width)}", "Minimum width is: #{Blufin::Terminal::format_highlight('90')}"], true) if terminal_width < 90 && all
64
+ Blufin::Terminal::custom('SUMMARY', 58, 'ENUMS', "Below is a list of all available #{Blufin::Terminal::format_highlight('ENUMS')} for \x1B[38;5;106m#{Blufin::SiteResolver::get_site_title(@site)}\x1B[0m.")
65
+
66
+ terminal_width = Blufin::Terminal::get_terminal_width
67
+
68
+ all_enums = []
69
+
70
+ auto_enums = @yml_enum_scanner.get_auto_enums
71
+ custom_enums = @yml_enum_scanner.get_custom_enums
72
+ system_enums = @yml_enum_scanner.get_system_enums
73
+
74
+ auto_enums.keys.each { |enum| all_enums << enum }
75
+ custom_enums.keys.each { |enum| all_enums << enum }
76
+ system_enums.keys.each { |enum| all_enums << enum }
77
+
78
+ max_enum_width = all_enums.max_by(&:length).length
79
+ value_column_max_width = terminal_width - 30 - max_enum_width
80
+
81
+ enum_column_width = ((max_enum_width + 5) < 10) ? 10 : (max_enum_width + 5)
82
+
83
+ table(:border => false) do
84
+
85
+ row do
86
+ column('', :width => 17, :align => 'right')
87
+ column('', :width => 1, :color => 255)
88
+ column('', :width => enum_column_width, :color => 240, :align => 'left')
89
+ column('', :width => value_column_max_width)
90
+ end
91
+
92
+ show_enums_common_table(custom_enums, value_column_max_width, AUTO)
93
+ show_enums_common_table(auto_enums, value_column_max_width, CUSTOM)
94
+ show_enums_common_table(system_enums, value_column_max_width, SYSTEM)
95
+
96
+ end
97
+
98
+
99
+ end
100
+
101
+ # Renders a summary of all resource end-points exposed by the API.
102
+ # @return void
103
+ def show_resources(as_json = false)
104
+
105
+ if @resources.any?
106
+
107
+ if as_json
108
+
109
+ puts @resources.inspect
110
+
111
+ else
112
+
113
+ width_schema = []
114
+ width_group = []
115
+ width_resource = []
116
+ width_type = []
117
+
118
+ # Get column widths (to make as narrow as possible).
119
+ @resources.each do |data|
120
+ data.each do |key, resource|
121
+ width_schema << resource[:schema].length
122
+ width_group << resource[:resource].split('/')[0].length
123
+ width_resource << resource[:resource].length
124
+ width_type << resource[:type].length
125
+ end
126
+ end
127
+
128
+ Blufin::Terminal::custom('SUMMARY', 161, 'RESOURCES', "Below is a summary of the final #{Blufin::Terminal::format_highlight('RESOURCE STRUCTURE')}")
129
+
130
+ table(:border => false) do
131
+
132
+ current_group = nil
133
+
134
+ @resources.each do |data|
135
+
136
+ data.each do |key, resource|
137
+
138
+ group = resource[:resource].split('/')[0]
139
+ extra = ''
140
+ extra_color = 240
141
+
142
+ case resource[:type]
143
+ when Blufin::YmlSchemaValidator::RESOURCE_TYPE_PARENT
144
+ type_text = "\xe2\x80\x94"
145
+ type_color = 240
146
+ when Blufin::YmlSchemaValidator::RESOURCE_TYPE_OBJECT
147
+ type_text = Blufin::YmlSchemaValidator::RESOURCE_TYPE_OBJECT
148
+ type_color = 147
149
+ when Blufin::YmlSchemaValidator::RESOURCE_TYPE_OBJECT_LIST
150
+ type_text = Blufin::YmlSchemaValidator::RESOURCE_TYPE_OBJECT_LIST
151
+ type_color = 197
152
+ when Blufin::YmlSchemaValidator::RESOURCE_TYPE_OBJECT_LINK
153
+ type_text = Blufin::YmlSchemaValidator::RESOURCE_TYPE_OBJECT_LINK
154
+ type_color = 118
155
+ else
156
+ raise RuntimeError, "Type not found in \xe2\x86\x92 show_resources()."
157
+ end
158
+
159
+ # If this is a LINKED table, show list of tables where it's referenced from.
160
+ if resource[:type] == Blufin::YmlSchemaValidator::RESOURCE_TYPE_OBJECT_LINK
161
+ unless @schema_fks_links[key].nil?
162
+ extra = []
163
+ @schema_fks_links[key].each do |table|
164
+ extra << table.split('.')[1]
165
+ end
166
+ extra = "\xe2\x86\x92 #{extra.join(', ')}"
167
+ extra_color = 220
168
+ end
169
+ end
170
+
171
+ row do
172
+ column((group != current_group) ? "#{resource[:schema]} \xe2\x86\x92" : '', :color => 250, :width => (width_schema.max.to_i) + 4, :align => 'right')
173
+ column((group != current_group) ? group : '', :color => 154, :width => (width_group.max.to_i) + 2)
174
+ column(resource[:resource], :color => 240, :width => (width_resource.max.to_i) + 2)
175
+ column("#{type_text}", :color => type_color, :width => width_type.max.to_i, :align => 'right')
176
+ column(extra, :color => extra_color, :width => 100)
177
+ end
178
+
179
+ current_group = group
180
+ current_schema = resource[:schema]
181
+
182
+ end
183
+
184
+ end
185
+
186
+ row do
187
+ column('')
188
+ column('')
189
+ column('')
190
+ column('')
191
+ column('')
192
+ end
193
+
194
+ end
195
+
196
+ end
197
+
198
+ end
199
+
200
+ end
201
+
202
+ def add_auto_increment_table(schema, table)
203
+ @auto_increment << "#{schema}.#{table}"
204
+ end
205
+
206
+ def add_auto_increment_indexed_table(schema, table, amount)
207
+ @auto_increment_indexed << "(#{amount}) \xe2\x86\x92 #{schema}.#{table}"
208
+ end
209
+
210
+ def add_resource(key, data)
211
+ @resources << {key => data}
212
+ end
213
+
214
+ def set_schema_fks_links(hash)
215
+ @schema_fks_links = hash
216
+ end
217
+
218
+ private
219
+
220
+ def show_enums_common_table(enum_hash, value_column_width, type)
221
+
222
+ case type
223
+ when AUTO
224
+ text_type = 'ENUM_AUTO'
225
+ color_one = 97
226
+ color_two = 183
227
+ when CUSTOM
228
+ text_type = 'ENUM_CUSTOM'
229
+ color_one = 34
230
+ color_two = 118
231
+ when SYSTEM
232
+ text_type = 'ENUM_SYSTEM'
233
+ color_one = 31
234
+ color_two = 153
235
+ else
236
+ raise RuntimeError, "Unrecognized enum type: #{type}"
237
+ end
238
+
239
+
240
+ enum_hash.each do |enum, values|
241
+
242
+ vals = values.dup
243
+ vals_all = []
244
+ row_output = []
245
+ vals_per_row = vals.length.to_f
246
+
247
+ vals.each { |val| vals_all << val }
248
+
249
+ next unless vals_all.any?
250
+
251
+ # The length of the longest ENUM value (plus 2) -- rounded up to nearest 5.
252
+ vals_max = vals_all.max_by(&:length).length + 2
253
+ vals_max = vals_max + (5 - (vals_max % 5)) if (vals_max % 5) > 0
254
+
255
+ # The maximum number of values we can have in a row before we run out of Terminal.
256
+ cols_max = (value_column_width / vals_max).to_f
257
+
258
+ while vals_per_row > cols_max do
259
+ vals_per_row = vals_per_row / 2
260
+ end
261
+
262
+ number_of_rows = (vals.length / vals_per_row).to_i
263
+
264
+ raise RuntimeError, '(number_of_rows * vals_per_row) should not be less than vals.length' if (number_of_rows * vals_per_row) < vals.length
265
+
266
+ number_of_rows.times do
267
+ output = ''
268
+ vals_per_row.ceil.times do
269
+ output << vals.shift.to_s.ljust(vals_max, ' ')
270
+ end
271
+ row_output << output if output.strip.length > 0
272
+ end
273
+
274
+ row do
275
+ column(text_type, :color => color_one)
276
+ column('→')
277
+ column("#{enum} ", :color => color_two)
278
+ column(row_output[0], :color => 244)
279
+ end
280
+
281
+ row_output.shift
282
+
283
+ if row_output.length > 1
284
+ row_output.each do |val|
285
+ row do
286
+ column('')
287
+ column('')
288
+ column('')
289
+ column(val, :color => 244)
290
+ end
291
+ end
292
+ end
293
+
294
+ row do
295
+ column('')
296
+ column('')
297
+ column('')
298
+ column('')
299
+ end
300
+
301
+ end
302
+
303
+ end
304
+
305
+ end
306
+
307
+ end