db2_query 0.3.1 → 0.3.2

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