db2_query 0.3.1 → 0.3.2

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 (44) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +399 -147
  3. data/lib/db2_query.rb +36 -9
  4. data/lib/db2_query/base.rb +13 -0
  5. data/lib/db2_query/config.rb +14 -14
  6. data/lib/db2_query/core.rb +59 -118
  7. data/lib/db2_query/db_client.rb +56 -0
  8. data/lib/db2_query/db_connection.rb +67 -0
  9. data/lib/db2_query/db_statements.rb +87 -0
  10. data/lib/db2_query/definitions.rb +79 -0
  11. data/lib/db2_query/error.rb +71 -6
  12. data/lib/db2_query/field_type.rb +31 -0
  13. data/lib/db2_query/helper.rb +49 -0
  14. data/lib/db2_query/logger.rb +14 -4
  15. data/lib/db2_query/query.rb +117 -0
  16. data/lib/db2_query/quoting.rb +102 -0
  17. data/lib/db2_query/railtie.rb +5 -2
  18. data/lib/db2_query/result.rb +45 -33
  19. data/lib/db2_query/sql_statement.rb +34 -0
  20. data/lib/db2_query/tasks.rb +29 -0
  21. data/lib/db2_query/tasks/database.rake +2 -33
  22. data/lib/db2_query/tasks/init.rake +1 -1
  23. data/lib/db2_query/tasks/initializer.rake +2 -33
  24. data/lib/db2_query/tasks/templates/database.rb.tt +19 -0
  25. data/lib/db2_query/tasks/templates/initializer.rb.tt +8 -0
  26. data/lib/db2_query/type/binary.rb +19 -0
  27. data/lib/db2_query/type/boolean.rb +41 -0
  28. data/lib/db2_query/type/date.rb +34 -0
  29. data/lib/db2_query/type/decimal.rb +15 -0
  30. data/lib/db2_query/type/integer.rb +15 -0
  31. data/lib/db2_query/type/string.rb +30 -0
  32. data/lib/db2_query/type/text.rb +11 -0
  33. data/lib/db2_query/type/time.rb +30 -0
  34. data/lib/db2_query/type/timestamp.rb +30 -0
  35. data/lib/db2_query/type/value.rb +29 -0
  36. data/lib/db2_query/version.rb +1 -1
  37. data/lib/rails/generators/query/USAGE +15 -0
  38. data/lib/rails/generators/query/query_generator.rb +70 -0
  39. data/lib/rails/generators/query/templates/query.rb.tt +26 -0
  40. data/lib/rails/generators/query/templates/query_definitions.rb.tt +12 -0
  41. data/lib/rails/generators/query/templates/unit_test.rb.tt +9 -0
  42. metadata +49 -10
  43. data/lib/db2_query/connection.rb +0 -125
  44. data/lib/db2_query/formatter.rb +0 -27
@@ -0,0 +1,41 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Db2Query
4
+ module Type
5
+ class Boolean < Value
6
+ TRUE_VALUES = [
7
+ true, 1, "1", "t", "T",
8
+ "true", "TRUE", "on", "ON",
9
+ :"1", :t, :T, :true, :TRUE, :on, :ON
10
+ ].freeze
11
+
12
+ DEFAULT = { true: true, false: false }
13
+
14
+ def initialize(options = DEFAULT)
15
+ super(options)
16
+ end
17
+
18
+ def name
19
+ :boolean
20
+ end
21
+
22
+ def serialize(value)
23
+ case value
24
+ when *TRUE_VALUES
25
+ 1
26
+ else
27
+ 0
28
+ end
29
+ end
30
+
31
+ def deserialize(value)
32
+ case value
33
+ when 1
34
+ options[:true]
35
+ else
36
+ options[:false]
37
+ end
38
+ end
39
+ end
40
+ end
41
+ end
@@ -0,0 +1,34 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Db2Query
4
+ module Type
5
+ class Date < Value
6
+ def type
7
+ :string
8
+ end
9
+
10
+ YMD_DATE = /\A(\d{4})-(\d\d)-(\d\d)\z/
11
+ DMY_DATE = /\A(\d\d)-(\d\d)-(\d{4})\z/
12
+
13
+ def serialize(value)
14
+ if value.is_a?(::String)
15
+ value = value.tr("/", "-")
16
+ case value
17
+ when YMD_DATE, DMY_DATE
18
+ quote(::Date.parse(value))
19
+ else
20
+ nil
21
+ end
22
+ elsif value.is_a?(::Date)
23
+ quote(value.strftime("%F"))
24
+ else
25
+ nil
26
+ end
27
+ end
28
+
29
+ def deserialize(value)
30
+ ::Date.parse(value.to_s)
31
+ end
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,15 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Db2Query
4
+ module Type
5
+ class Decimal < Value
6
+ def type
7
+ :decimal
8
+ end
9
+
10
+ def deserialize(value)
11
+ value.to_f
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,15 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Db2Query
4
+ module Type
5
+ class Integer < Value
6
+ def type
7
+ :integer
8
+ end
9
+
10
+ def deserialize(value)
11
+ value.to_i
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,30 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Db2Query
4
+ module Type
5
+ class String < Value
6
+ DEFAULT = { trim: false }
7
+
8
+ def initialize(options = DEFAULT)
9
+ super(options)
10
+ end
11
+
12
+ def type
13
+ :string
14
+ end
15
+
16
+ def deserialize(value)
17
+ value.strip! if options[:trim]
18
+ case value
19
+ when ::String then
20
+ if value == "null"
21
+ nil
22
+ else
23
+ ::String.new(value)
24
+ end
25
+ else value.to_s
26
+ end
27
+ end
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,11 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Db2Query
4
+ module Type
5
+ class Text < String
6
+ def type
7
+ :text
8
+ end
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,30 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Db2Query
4
+ module Type
5
+ class Time < Value
6
+ def type
7
+ :time
8
+ end
9
+
10
+ def serialize(value)
11
+ if value.is_a?(::String)
12
+ case value
13
+ when /\A(\d\d)[:,.](\d\d)[:,.](\d\d)\z/
14
+ quote(value)
15
+ else
16
+ nil
17
+ end
18
+ elsif value.is_a?(::Time)
19
+ quote(value.strftime("%T"))
20
+ else
21
+ nil
22
+ end
23
+ end
24
+
25
+ def deserialize(value)
26
+ value.strftime("%H:%M:%S")
27
+ end
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,30 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Db2Query
4
+ module Type
5
+ class Timestamp < Value
6
+ def type
7
+ :time
8
+ end
9
+
10
+ def serialize(value)
11
+ if value.is_a?(::String)
12
+ case value
13
+ when /\A(\d{4})-(\d\d)-(\d\d)-(\d\d).(\d\d).(\d\d).(\d{1,6})\z/
14
+ quote(value)
15
+ else
16
+ nil
17
+ end
18
+ elsif value.is_a?(::DateTime) || value.is_a?(::Time)
19
+ quote(value.strftime("%F-%H.%M.%S.%6N"))
20
+ else
21
+ nil
22
+ end
23
+ end
24
+
25
+ def deserialize(value)
26
+ value
27
+ end
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,29 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Db2Query
4
+ module Type
5
+ class Value
6
+ attr_reader :options
7
+
8
+ def initialize(options = {})
9
+ @options = options
10
+ end
11
+
12
+ def type_name
13
+ :value
14
+ end
15
+
16
+ def serialize(value)
17
+ value
18
+ end
19
+
20
+ def deserialize(value)
21
+ value
22
+ end
23
+
24
+ def quote(value)
25
+ "'#{value}'"
26
+ end
27
+ end
28
+ end
29
+ end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Db2Query
4
- VERSION = "0.3.1"
4
+ VERSION = "0.3.2"
5
5
  end
@@ -0,0 +1,15 @@
1
+ Description:
2
+ Stubs out a new query. Pass the query name, either
3
+ CamelCased or under_scored, and an optional list of its methods as arguments.
4
+
5
+ To create a query within a module, just use namespace pattern as the other rails generators do.
6
+
7
+ To create query class methods, you can use 3 options:
8
+ 1. Plain SQL methods --defines
9
+ 2. Query Methods with SQL string, --queries
10
+ 3. Query Methods with lambda, --lambdas
11
+
12
+ Example:
13
+ $ rails g query NameSpace::Name --queries query_1 --defines query_2 --lambdas query_3
14
+ create app/queries/name_space/name_query.rb
15
+ create test/queries/name_space/name_query_test.rb
@@ -0,0 +1,70 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "rails/generators"
4
+ require "fileutils"
5
+
6
+ module Rails
7
+ module Generators
8
+ class QueryGenerator < Rails::Generators::NamedBase
9
+ source_root File.expand_path("../templates", __FILE__)
10
+
11
+ class_option :skip_unit_test, type: :boolean, default: false, desc: "Skip unit test file creation"
12
+ class_option :defines, type: :array, default: [], desc: "Plain query method options"
13
+ class_option :queries, type: :array, default: [], desc: "Query method SQL options"
14
+ class_option :lambdas, type: :array, default: [], desc: "Query method with callable args"
15
+
16
+ def create_query_file
17
+ template "query.rb", File.join("app/queries", class_path, "#{file_name}_query.rb")
18
+ end
19
+
20
+ def create_query_definitions_file
21
+ template "query_definitions.rb", File.join("app/queries/definitions", class_path, "#{file_name}_query_definitions.rb")
22
+ end
23
+
24
+ def create_query_test_file
25
+ unless options[:skip_unit_test]
26
+ template "unit_test.rb", File.join("test/queries", class_path, "#{file_name}_query_test.rb")
27
+ end
28
+ end
29
+
30
+ private
31
+ def assign_names!(name)
32
+ super(name)
33
+ @method_options = options.slice("defines", "queries", "lambdas")
34
+ @query_methods = @method_options.map { |key, val| val }.flatten
35
+ end
36
+
37
+ def query_class_name
38
+ "#{file_name.camelize}Query"
39
+ end
40
+
41
+ def namespaced_query?
42
+ !class_path.empty?
43
+ end
44
+
45
+ def namespaced_names
46
+ class_path
47
+ end
48
+
49
+ def namespaced_content(content)
50
+ namespaced_names.reverse_each do |namespace_name|
51
+ content = "module #{namespace_name.camelize}\n#{indent(content)}\nend"
52
+ end
53
+ content
54
+ end
55
+
56
+ def module_namespacing(&block)
57
+ content = capture(&block)
58
+ content = namespaced_content(content) if namespaced_query?
59
+ concat(content)
60
+ end
61
+
62
+ def module_definitions_namespacing(&block)
63
+ content = capture(&block)
64
+ content = namespaced_content(content) if namespaced_query?
65
+ definitions_namespace_content = "module Definitions\n#{indent(content)}\nend"
66
+ concat(definitions_namespace_content)
67
+ end
68
+ end
69
+ end
70
+ end
@@ -0,0 +1,26 @@
1
+ # frozen_string_literal: true
2
+
3
+ <% module_namespacing do -%>
4
+ class <%= query_class_name %> < <%= "Db2Query::Base" -%>
5
+ <% if @query_methods.empty? %>
6
+ <%= indent("query :to_do, <<-SQL\n") %>
7
+ <%= indent("SQL\n") %>
8
+ <%= indent("def to_do_sql\n") %>
9
+ <%= indent("end") %>
10
+ <% end -%>
11
+ <% @method_options.each do |key, val| -%>
12
+ <% val.each_with_index do |option, index| -%>
13
+ <% case key when 'defines' -%>
14
+ <%= indent("def #{option}_sql\n") %>
15
+ <%= indent("end") %>
16
+ <% when 'queries' %>
17
+ <%= indent("query :#{option}, <<-SQL\n") %>
18
+ <%= indent("SQL") %>
19
+ <% when 'lambdas' %>
20
+ <%= indent("query :#{option}, -> args {\n") %>
21
+ <%= indent("}") %>
22
+ <% end -%>
23
+ <% end -%>
24
+ <% end -%>
25
+ <%= 'end' -%>
26
+ <% end %>
@@ -0,0 +1,12 @@
1
+ # frozen_string_literal: true
2
+
3
+ <% module_definitions_namespacing do -%>
4
+ class <%= query_class_name %>Definitions < <%= "Db2Query::Definitions" %>
5
+ <%= indent("def describe") -%>
6
+ <% @query_methods.each do |method| %>
7
+ <%= indent("query_definition :#{method} do |c|\n") %>
8
+ <%= indent("end") %>
9
+ <% end -%>
10
+ <%= indent("end") %>
11
+ <%= 'end' -%>
12
+ <% end %>
@@ -0,0 +1,9 @@
1
+ require "test_helper"
2
+
3
+ <% module_namespacing do -%>
4
+ class <%= query_class_name %>Test < ActiveSupport::TestCase
5
+ # test "the truth" do
6
+ # assert true
7
+ # end
8
+ <%= 'end' -%>
9
+ <% end %>
metadata CHANGED
@@ -1,15 +1,29 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: db2_query
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.1
4
+ version: 0.3.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - yohanes_l
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-07-06 00:00:00.000000000 Z
11
+ date: 2021-08-01 00:00:00.000000000 Z
12
12
  dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: tty-progressbar
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
13
27
  - !ruby/object:Gem::Dependency
14
28
  name: rubocop
15
29
  requirement: !ruby/object:Gem::Requirement
@@ -98,16 +112,16 @@ dependencies:
98
112
  name: connection_pool
99
113
  requirement: !ruby/object:Gem::Requirement
100
114
  requirements:
101
- - - ">="
115
+ - - '='
102
116
  - !ruby/object:Gem::Version
103
- version: '0'
117
+ version: 2.2.5
104
118
  type: :runtime
105
119
  prerelease: false
106
120
  version_requirements: !ruby/object:Gem::Requirement
107
121
  requirements:
108
- - - ">="
122
+ - - '='
109
123
  - !ruby/object:Gem::Version
110
- version: '0'
124
+ version: 2.2.5
111
125
  - !ruby/object:Gem::Dependency
112
126
  name: ruby-odbc
113
127
  requirement: !ruby/object:Gem::Requirement
@@ -136,22 +150,47 @@ files:
136
150
  - lib/db2_query.rb
137
151
  - lib/db2_query/base.rb
138
152
  - lib/db2_query/config.rb
139
- - lib/db2_query/connection.rb
140
153
  - lib/db2_query/core.rb
154
+ - lib/db2_query/db_client.rb
155
+ - lib/db2_query/db_connection.rb
156
+ - lib/db2_query/db_statements.rb
157
+ - lib/db2_query/definitions.rb
141
158
  - lib/db2_query/error.rb
142
- - lib/db2_query/formatter.rb
159
+ - lib/db2_query/field_type.rb
160
+ - lib/db2_query/helper.rb
143
161
  - lib/db2_query/logger.rb
162
+ - lib/db2_query/query.rb
163
+ - lib/db2_query/quoting.rb
144
164
  - lib/db2_query/railtie.rb
145
165
  - lib/db2_query/result.rb
166
+ - lib/db2_query/sql_statement.rb
167
+ - lib/db2_query/tasks.rb
146
168
  - lib/db2_query/tasks/database.rake
147
169
  - lib/db2_query/tasks/init.rake
148
170
  - lib/db2_query/tasks/initializer.rake
171
+ - lib/db2_query/tasks/templates/database.rb.tt
172
+ - lib/db2_query/tasks/templates/initializer.rb.tt
173
+ - lib/db2_query/type/binary.rb
174
+ - lib/db2_query/type/boolean.rb
175
+ - lib/db2_query/type/date.rb
176
+ - lib/db2_query/type/decimal.rb
177
+ - lib/db2_query/type/integer.rb
178
+ - lib/db2_query/type/string.rb
179
+ - lib/db2_query/type/text.rb
180
+ - lib/db2_query/type/time.rb
181
+ - lib/db2_query/type/timestamp.rb
182
+ - lib/db2_query/type/value.rb
149
183
  - lib/db2_query/version.rb
150
- homepage: https://github.com/yohaneslumentut
184
+ - lib/rails/generators/query/USAGE
185
+ - lib/rails/generators/query/query_generator.rb
186
+ - lib/rails/generators/query/templates/query.rb.tt
187
+ - lib/rails/generators/query/templates/query_definitions.rb.tt
188
+ - lib/rails/generators/query/templates/unit_test.rb.tt
189
+ homepage: https://github.com/yohaneslumentut/db2_query
151
190
  licenses:
152
191
  - MIT
153
192
  metadata:
154
- homepage_uri: https://github.com/yohaneslumentut
193
+ homepage_uri: https://github.com/yohaneslumentut/db2_query
155
194
  source_code_uri: https://github.com/yohaneslumentut/db2_query
156
195
  changelog_uri: https://github.com/yohaneslumentut/db2_query
157
196
  post_install_message: