pg_objects 1.0.3 → 1.2.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 2794a5dc0139bf6ad60619166faf652f4e9f5bc0bd587400222892f1fec37e9b
4
- data.tar.gz: 5b53a16cfa89bfc94aa6eea3d56f381c8a4af4e167afbace126278b962b4eac7
3
+ metadata.gz: 7020b30da04ae39e82f938692675d38dd4b65c8d0e354be2fc5198c726e41608
4
+ data.tar.gz: d436471478f54272dc91ee41f0a0d72571f54fb1eb4d886c7b3d881b5aea6bd5
5
5
  SHA512:
6
- metadata.gz: d850aa08d47a0e0bff2392cbc4c17da3c8a4262b5ae9612eb7a2a98309180dd38f547e3562c11728e862059b342f43b3d060fa55ffc516a8deaefc3ca8d6a80b
7
- data.tar.gz: d6c065a60674901d207525c029b5113ba2ca47d9911df32663d5f6a8818065fec3106be61b7c86f648786aac050b5e14cc209eae7c50ae75aa870501854aacd7
6
+ metadata.gz: 70c31c6788728cf943e6973ee4aaa9fe34238613bf1d07f6fa7b7de020fcb96de0deccdb79d0c79c1cf20c399039171a16c8a2f7125d44934da5106af10f66e3
7
+ data.tar.gz: b4f122ce4aaead24702761ac44d8330f63e3daaac85448aef6dc8c14295ec3f6658731934db48c39eebbcef4e27d1bffde0edb137876820df38558fe5e10c3ce
@@ -0,0 +1,11 @@
1
+ # To get started with Dependabot version updates, you'll need to specify which
2
+ # package ecosystems to update and where the package manifests are located.
3
+ # Please see the documentation for all configuration options:
4
+ # https://docs.github.com/code-security/dependabot/dependabot-version-updates/configuration-options-for-the-dependabot.yml-file
5
+
6
+ version: 2
7
+ updates:
8
+ - package-ecosystem: "bundler"
9
+ directory: "/" # Location of package manifests
10
+ schedule:
11
+ interval: "weekly"
@@ -8,7 +8,7 @@ jobs:
8
8
  runs-on: ubuntu-latest
9
9
  strategy:
10
10
  matrix:
11
- ruby-version: ['2.7', '3.0', '3.1', '3.2']
11
+ ruby-version: ['3.1', '3.2', '3.3']
12
12
  steps:
13
13
  - name: Checkout
14
14
  uses: actions/checkout@v2
data/.rubocop.yml CHANGED
@@ -8,7 +8,7 @@ inherit_from: .rubocop_todo.yml
8
8
 
9
9
  AllCops:
10
10
  # EnabledByDefault: true
11
- TargetRubyVersion: 2.7
11
+ TargetRubyVersion: 3.1
12
12
  # Cop names are not d§splayed in offense messages by default. Change behavior
13
13
  # by overriding DisplayCopNames, or by giving the -D/--display-cop-names
14
14
  # option.
@@ -210,6 +210,9 @@ Style/BisectedAttrAccessor:
210
210
  Style/CaseLikeIf:
211
211
  Enabled: true
212
212
 
213
+ Style/ClassAndModuleChildren:
214
+ EnforcedStyle: compact
215
+
213
216
  Style/ExponentialNotation:
214
217
  Enabled: true
215
218
 
data/Gemfile CHANGED
@@ -5,9 +5,10 @@ gemspec
5
5
  group :development, :test do
6
6
  gem 'bundler', require: false
7
7
  gem 'bundler-audit', require: false
8
- gem 'byebug', require: false
8
+ gem 'pry-byebug'
9
9
  gem 'rake', require: false
10
10
  gem 'rspec', require: false
11
+ gem 'rspec-parameterized', require: false
11
12
  gem 'rubocop', require: false
12
13
  gem 'rubocop-rails', require: false
13
14
  gem 'rubocop-rake', require: false
data/Gemfile.lock CHANGED
@@ -1,150 +1,236 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- pg_objects (1.0.3)
5
- activerecord (>= 6.0.3.5, < 7)
6
- pg_query (~> 1)
7
- railties (>= 4, < 7)
4
+ pg_objects (1.2.0)
5
+ activerecord (>= 6.1.7.0, < 8)
6
+ pg_query (~> 5)
7
+ railties (>= 4, < 8)
8
8
  rake-hooks (~> 1)
9
9
 
10
10
  GEM
11
11
  remote: https://rubygems.org/
12
12
  specs:
13
- actionpack (6.1.7.3)
14
- actionview (= 6.1.7.3)
15
- activesupport (= 6.1.7.3)
16
- rack (~> 2.0, >= 2.0.9)
13
+ actionpack (7.1.3.2)
14
+ actionview (= 7.1.3.2)
15
+ activesupport (= 7.1.3.2)
16
+ nokogiri (>= 1.8.5)
17
+ racc
18
+ rack (>= 2.2.4)
19
+ rack-session (>= 1.0.1)
17
20
  rack-test (>= 0.6.3)
18
- rails-dom-testing (~> 2.0)
19
- rails-html-sanitizer (~> 1.0, >= 1.2.0)
20
- actionview (6.1.7.3)
21
- activesupport (= 6.1.7.3)
21
+ rails-dom-testing (~> 2.2)
22
+ rails-html-sanitizer (~> 1.6)
23
+ actionview (7.1.3.2)
24
+ activesupport (= 7.1.3.2)
22
25
  builder (~> 3.1)
23
- erubi (~> 1.4)
24
- rails-dom-testing (~> 2.0)
25
- rails-html-sanitizer (~> 1.1, >= 1.2.0)
26
- activemodel (6.1.7.3)
27
- activesupport (= 6.1.7.3)
28
- activerecord (6.1.7.3)
29
- activemodel (= 6.1.7.3)
30
- activesupport (= 6.1.7.3)
31
- activesupport (6.1.7.3)
26
+ erubi (~> 1.11)
27
+ rails-dom-testing (~> 2.2)
28
+ rails-html-sanitizer (~> 1.6)
29
+ activemodel (7.1.3.2)
30
+ activesupport (= 7.1.3.2)
31
+ activerecord (7.1.3.2)
32
+ activemodel (= 7.1.3.2)
33
+ activesupport (= 7.1.3.2)
34
+ timeout (>= 0.4.0)
35
+ activesupport (7.1.3.2)
36
+ base64
37
+ bigdecimal
32
38
  concurrent-ruby (~> 1.0, >= 1.0.2)
39
+ connection_pool (>= 2.2.5)
40
+ drb
33
41
  i18n (>= 1.6, < 2)
34
42
  minitest (>= 5.1)
43
+ mutex_m
35
44
  tzinfo (~> 2.0)
36
- zeitwerk (~> 2.3)
37
45
  ast (2.4.2)
46
+ base64 (0.2.0)
47
+ bigdecimal (3.1.6)
48
+ binding_of_caller (1.0.0)
49
+ debug_inspector (>= 0.0.1)
38
50
  builder (3.2.4)
39
51
  bundler-audit (0.9.1)
40
52
  bundler (>= 1.2.0, < 3)
41
53
  thor (~> 1.0)
42
54
  byebug (11.1.3)
43
- concurrent-ruby (1.2.2)
55
+ coderay (1.1.3)
56
+ concurrent-ruby (1.2.3)
57
+ connection_pool (2.4.1)
44
58
  crass (1.0.6)
45
- diff-lcs (1.5.0)
59
+ debug_inspector (1.2.0)
60
+ diff-lcs (1.5.1)
61
+ drb (2.2.0)
62
+ ruby2_keywords
46
63
  erubi (1.12.0)
64
+ google-protobuf (3.25.3)
65
+ google-protobuf (3.25.3-aarch64-linux)
66
+ google-protobuf (3.25.3-arm64-darwin)
67
+ google-protobuf (3.25.3-x86-linux)
68
+ google-protobuf (3.25.3-x86_64-darwin)
69
+ google-protobuf (3.25.3-x86_64-linux)
47
70
  i18n (1.14.1)
48
71
  concurrent-ruby (~> 1.0)
49
- json (2.6.3)
72
+ io-console (0.7.2)
73
+ irb (1.11.2)
74
+ rdoc
75
+ reline (>= 0.4.2)
76
+ json (2.7.1)
50
77
  language_server-protocol (3.17.0.3)
51
- loofah (2.21.3)
78
+ loofah (2.22.0)
52
79
  crass (~> 1.0.2)
53
80
  nokogiri (>= 1.12.0)
54
81
  method_source (1.0.0)
55
- mini_portile2 (2.8.2)
56
- minitest (5.18.1)
57
- nokogiri (1.15.2)
58
- mini_portile2 (~> 2.8.2)
82
+ minitest (5.22.2)
83
+ mutex_m (0.2.0)
84
+ nokogiri (1.16.2-aarch64-linux)
85
+ racc (~> 1.4)
86
+ nokogiri (1.16.2-arm-linux)
87
+ racc (~> 1.4)
88
+ nokogiri (1.16.2-arm64-darwin)
89
+ racc (~> 1.4)
90
+ nokogiri (1.16.2-x86-linux)
91
+ racc (~> 1.4)
92
+ nokogiri (1.16.2-x86_64-darwin)
59
93
  racc (~> 1.4)
60
- parallel (1.23.0)
61
- parser (3.2.2.3)
94
+ nokogiri (1.16.2-x86_64-linux)
95
+ racc (~> 1.4)
96
+ parallel (1.24.0)
97
+ parser (3.3.0.5)
62
98
  ast (~> 2.4.1)
63
99
  racc
64
- pg_query (1.3.0)
65
- racc (1.7.1)
66
- rack (2.2.7)
100
+ pg_query (5.1.0)
101
+ google-protobuf (>= 3.22.3)
102
+ proc_to_ast (0.1.0)
103
+ coderay
104
+ parser
105
+ unparser
106
+ pry (0.14.2)
107
+ coderay (~> 1.1)
108
+ method_source (~> 1.0)
109
+ pry-byebug (3.10.1)
110
+ byebug (~> 11.0)
111
+ pry (>= 0.13, < 0.15)
112
+ psych (5.1.2)
113
+ stringio
114
+ racc (1.7.3)
115
+ rack (3.0.9.1)
116
+ rack-session (2.0.0)
117
+ rack (>= 3.0.0)
67
118
  rack-test (2.1.0)
68
119
  rack (>= 1.3)
69
- rails-dom-testing (2.0.3)
70
- activesupport (>= 4.2.0)
120
+ rackup (2.1.0)
121
+ rack (>= 3)
122
+ webrick (~> 1.8)
123
+ rails-dom-testing (2.2.0)
124
+ activesupport (>= 5.0.0)
125
+ minitest
71
126
  nokogiri (>= 1.6)
72
127
  rails-html-sanitizer (1.6.0)
73
128
  loofah (~> 2.21)
74
129
  nokogiri (~> 1.14)
75
- railties (6.1.7.3)
76
- actionpack (= 6.1.7.3)
77
- activesupport (= 6.1.7.3)
78
- method_source
130
+ railties (7.1.3.2)
131
+ actionpack (= 7.1.3.2)
132
+ activesupport (= 7.1.3.2)
133
+ irb
134
+ rackup (>= 1.0.0)
79
135
  rake (>= 12.2)
80
- thor (~> 1.0)
136
+ thor (~> 1.0, >= 1.2.2)
137
+ zeitwerk (~> 2.6)
81
138
  rainbow (3.1.1)
82
- rake (13.0.6)
139
+ rake (13.1.0)
83
140
  rake-hooks (1.2.3)
84
141
  rake
85
- regexp_parser (2.8.1)
86
- rexml (3.2.5)
87
- rspec (3.12.0)
88
- rspec-core (~> 3.12.0)
89
- rspec-expectations (~> 3.12.0)
90
- rspec-mocks (~> 3.12.0)
91
- rspec-core (3.12.2)
92
- rspec-support (~> 3.12.0)
93
- rspec-expectations (3.12.3)
142
+ rdoc (6.6.2)
143
+ psych (>= 4.0.0)
144
+ regexp_parser (2.9.0)
145
+ reline (0.4.3)
146
+ io-console (~> 0.5)
147
+ rexml (3.2.6)
148
+ rspec (3.13.0)
149
+ rspec-core (~> 3.13.0)
150
+ rspec-expectations (~> 3.13.0)
151
+ rspec-mocks (~> 3.13.0)
152
+ rspec-core (3.13.0)
153
+ rspec-support (~> 3.13.0)
154
+ rspec-expectations (3.13.0)
94
155
  diff-lcs (>= 1.2.0, < 2.0)
95
- rspec-support (~> 3.12.0)
96
- rspec-mocks (3.12.5)
156
+ rspec-support (~> 3.13.0)
157
+ rspec-mocks (3.13.0)
97
158
  diff-lcs (>= 1.2.0, < 2.0)
98
- rspec-support (~> 3.12.0)
99
- rspec-support (3.12.0)
100
- rubocop (1.53.0)
159
+ rspec-support (~> 3.13.0)
160
+ rspec-parameterized (1.0.0)
161
+ rspec-parameterized-core (< 2)
162
+ rspec-parameterized-table_syntax (< 2)
163
+ rspec-parameterized-core (1.0.0)
164
+ parser
165
+ proc_to_ast
166
+ rspec (>= 2.13, < 4)
167
+ unparser
168
+ rspec-parameterized-table_syntax (1.0.1)
169
+ binding_of_caller
170
+ rspec-parameterized-core (< 2)
171
+ rspec-support (3.13.1)
172
+ rubocop (1.60.2)
101
173
  json (~> 2.3)
102
174
  language_server-protocol (>= 3.17.0)
103
175
  parallel (~> 1.10)
104
- parser (>= 3.2.2.3)
176
+ parser (>= 3.3.0.2)
105
177
  rainbow (>= 2.2.2, < 4.0)
106
178
  regexp_parser (>= 1.8, < 3.0)
107
179
  rexml (>= 3.2.5, < 4.0)
108
- rubocop-ast (>= 1.28.0, < 2.0)
180
+ rubocop-ast (>= 1.30.0, < 2.0)
109
181
  ruby-progressbar (~> 1.7)
110
182
  unicode-display_width (>= 2.4.0, < 3.0)
111
- rubocop-ast (1.29.0)
183
+ rubocop-ast (1.30.0)
112
184
  parser (>= 3.2.1.0)
113
- rubocop-capybara (2.18.0)
185
+ rubocop-capybara (2.20.0)
186
+ rubocop (~> 1.41)
187
+ rubocop-factory_bot (2.25.1)
114
188
  rubocop (~> 1.41)
115
- rubocop-factory_bot (2.23.1)
116
- rubocop (~> 1.33)
117
- rubocop-rails (2.20.2)
189
+ rubocop-rails (2.23.1)
118
190
  activesupport (>= 4.2.0)
119
191
  rack (>= 1.1)
120
192
  rubocop (>= 1.33.0, < 2.0)
193
+ rubocop-ast (>= 1.30.0, < 2.0)
121
194
  rubocop-rake (0.6.0)
122
195
  rubocop (~> 1.0)
123
- rubocop-rspec (2.22.0)
124
- rubocop (~> 1.33)
196
+ rubocop-rspec (2.26.1)
197
+ rubocop (~> 1.40)
125
198
  rubocop-capybara (~> 2.17)
126
199
  rubocop-factory_bot (~> 2.22)
127
200
  ruby-progressbar (1.13.0)
128
- thor (1.2.2)
201
+ ruby2_keywords (0.0.5)
202
+ stringio (3.1.0)
203
+ thor (1.3.1)
204
+ timeout (0.4.1)
129
205
  tzinfo (2.0.6)
130
206
  concurrent-ruby (~> 1.0)
131
- unicode-display_width (2.4.2)
132
- zeitwerk (2.6.8)
207
+ unicode-display_width (2.5.0)
208
+ unparser (0.6.13)
209
+ diff-lcs (~> 1.3)
210
+ parser (>= 3.3.0)
211
+ webrick (1.8.1)
212
+ zeitwerk (2.6.13)
133
213
 
134
214
  PLATFORMS
135
- ruby
215
+ aarch64-linux
216
+ arm-linux
217
+ arm64-darwin
218
+ x86-linux
219
+ x86_64-darwin
220
+ x86_64-linux
136
221
 
137
222
  DEPENDENCIES
138
223
  bundler
139
224
  bundler-audit
140
- byebug
141
225
  pg_objects!
226
+ pry-byebug
142
227
  rake
143
228
  rspec
229
+ rspec-parameterized
144
230
  rubocop
145
231
  rubocop-rails
146
232
  rubocop-rake
147
233
  rubocop-rspec
148
234
 
149
235
  BUNDLED WITH
150
- 2.4.12
236
+ 2.5.5
@@ -1,11 +1,9 @@
1
- module PgObjects
2
- ##
3
- # Creates default directories structure
4
- class InstallGenerator < ::Rails::Generators::Base
5
- def create_directories
6
- empty_directory 'db/objects'
7
- empty_directory 'db/objects/before'
8
- empty_directory 'db/objects/after'
9
- end
1
+ ##
2
+ # Creates default directories structure
3
+ class PgObjects::InstallGenerator < Rails::Generators::Base
4
+ def create_directories
5
+ empty_directory 'db/objects'
6
+ empty_directory 'db/objects/before'
7
+ empty_directory 'db/objects/after'
10
8
  end
11
9
  end
@@ -1,24 +1,31 @@
1
- module PgObjects
2
- ##
3
- # Represents DB object as it is described in file
4
- #
5
- # [name] name of file without extension
6
- # [full_name] full pathname of file
7
- # [object_name] name of function, trigger etc. if it was successfully parsed, otherwise - nil
8
- class DbObject
9
- attr_reader :sql_query, :name, :full_name, :object_name, :dependencies
10
- attr_accessor :status
1
+ ##
2
+ # Represents DB object as it is described in file
3
+ #
4
+ # [name] name of file without extension
5
+ # [full_name] full pathname of file
6
+ # [object_name] name of function, trigger etc. if it was successfully parsed, otherwise - nil
7
+ class PgObjects::DbObject
8
+ attr_reader :sql_query, :name, :full_name, :object_name, :dependencies
9
+ attr_accessor :status
11
10
 
12
- def initialize(file_path)
13
- @full_name = file_path
14
- @name = File.basename file_path, '.*'
15
- @sql_query = File.read file_path
11
+ def initialize(file_path)
12
+ @full_name = file_path
13
+ @name = File.basename(file_path, '.*')
16
14
 
17
- directives = Parser.fetch_directives @sql_query
18
- @dependencies = directives[:depends_on]
19
- @object_name = Parser.fetch_object_name @sql_query
15
+ @status = :new
16
+ end
17
+
18
+ def create
19
+ @sql_query = File.read(full_name)
20
+
21
+ parser = PgObjects::Parser.new(sql_query)
22
+
23
+ directives = parser.fetch_directives
24
+ @dependencies = directives[:depends_on]
25
+ @object_name = parser.fetch_object_name
26
+
27
+ @status = :pending
20
28
 
21
- @status = :pending
22
- end
29
+ self
23
30
  end
24
31
  end
@@ -1,17 +1,20 @@
1
- module PgObjects
2
- ##
3
- # Console output
4
- #
5
- # Pass +silent: true+ to constructor to suppress output
6
- class Logger
7
- attr_reader :silent
1
+ ##
2
+ # Console output
3
+ #
4
+ class PgObjects::Logger
5
+ attr_reader :silent
8
6
 
9
- def initialize(silent: false)
10
- @silent = silent
11
- end
7
+ def initialize
8
+ @silent = false
9
+ end
10
+
11
+ def write(str)
12
+ puts "== #{str} ".ljust(80, '=') unless silent
13
+ end
14
+
15
+ def mute(value)
16
+ @silent = value
12
17
 
13
- def write(str)
14
- puts "== #{str} ".ljust(80, '=') unless silent
15
- end
18
+ self
16
19
  end
17
20
  end
@@ -1,69 +1,67 @@
1
- module PgObjects
2
- ##
3
- # Manages process to create objects
4
- #
5
- # Usage:
6
- #
7
- # Manager.new.load_files(:before).create_objects
8
- #
9
- # or
10
- #
11
- # Manager.new.load_files(:after).create_objects
12
- class Manager
13
- attr_reader :objects, :config, :log
1
+ ##
2
+ # Manages process to create objects
3
+ #
4
+ # Usage:
5
+ #
6
+ # Manager.new(config, logger).load_files(:before).create_objects
7
+ #
8
+ # or
9
+ #
10
+ # Manager.new(config, logger).load_files(:after).create_objects
11
+ class PgObjects::Manager
12
+ attr_reader :objects, :config
14
13
 
15
- def initialize
16
- raise UnsupportedAdapterError if ActiveRecord::Base.connection.adapter_name != 'PostgreSQL'
14
+ def initialize(config, logger)
15
+ raise PgObjects::UnsupportedAdapterError if ActiveRecord::Base.connection.adapter_name != 'PostgreSQL'
17
16
 
18
- @objects = []
19
- @config = PgObjects.config
20
- @log = Logger.new(silent: config.silent)
21
- end
22
-
23
- ##
24
- # event: +:before+ or +:after+
25
- #
26
- # used to reference configuration settings +before_path+ and +after_path+
27
- def load_files(event)
28
- dir = config.send "#{event}_path"
29
- Dir[File.join(dir, '**', "*.{#{config.extensions.join(',')}}")].each do |path|
30
- @objects << PgObjects::DbObject.new(path)
31
- end
17
+ @objects = []
18
+ @config = config
19
+ @log = logger.mute(config.silent) # Logger.new(silent: config.silent)
20
+ end
32
21
 
33
- self
22
+ ##
23
+ # event: +:before+ or +:after+
24
+ #
25
+ # used to reference configuration settings +before_path+ and +after_path+
26
+ def load_files(event)
27
+ dir = config.send "#{event}_path"
28
+ Dir[File.join(dir, '**', "*.{#{config.extensions.join(',')}}")].each do |path|
29
+ @objects << PgObjects::DbObject.new(path).create
34
30
  end
35
31
 
36
- def create_objects
37
- @objects.each { |obj| create_object obj }
38
- end
32
+ self
33
+ end
39
34
 
40
- private
35
+ def create_objects
36
+ objects.each { create_object(_1) }
37
+ end
41
38
 
42
- def create_object(obj)
43
- return if obj.status == :done
44
- raise CyclicDependencyError, obj.name if obj.status == :processing
39
+ private
45
40
 
46
- obj.status = :processing
41
+ def create_object(obj)
42
+ return if obj.status == :done
43
+ raise PgObjects::CyclicDependencyError, obj.name if obj.status == :processing
47
44
 
48
- create_dependencies(obj.dependencies)
45
+ obj.status = :processing
49
46
 
50
- log.write("creating #{obj.name}")
51
- ActiveRecord::Base.connection.execute obj.sql_query
47
+ create_dependencies(obj.dependencies)
52
48
 
53
- obj.status = :done
54
- end
49
+ @log.write("creating #{obj.name}")
50
+ ActiveRecord::Base.connection.execute obj.sql_query
55
51
 
56
- def create_dependencies(dependencies)
57
- dependencies.each { |dep_name| create_object find_object(dep_name) }
58
- end
52
+ obj.status = :done
53
+ end
54
+
55
+ def create_dependencies(dependencies)
56
+ dependencies.each { |dep_name| create_object(find_object(dep_name)) }
57
+ end
59
58
 
60
- def find_object(dep_name)
61
- result = @objects.select { |obj| [obj.name, obj.full_name, obj.object_name].compact.include? dep_name }
59
+ def find_object(dep_name)
60
+ result = @objects.select { |obj| [obj.name, obj.full_name, obj.object_name].compact.include? dep_name }
62
61
 
63
- raise AmbiguousDependencyError, dep_name if result.size > 1
64
- raise DependencyNotExistError, dep_name if result.empty?
62
+ raise PgObjects::AmbiguousDependencyError, dep_name if result.size > 1
63
+ raise PgObjects::DependencyNotExistError, dep_name if result.empty?
65
64
 
66
- result[0]
67
- end
65
+ result[0]
68
66
  end
69
67
  end
@@ -1,47 +1,96 @@
1
1
  require 'pg_query'
2
2
 
3
- module PgObjects
4
- ##
5
- # Reads directives from SQL-comments
6
- #
7
- # --!depends_on [name_of_dependency]
8
- #
9
- # name_of_dependency: short or full name of object as well as object_name
10
- #
11
- class Parser
12
- # rubocop: disable Style/WordArray
13
- ROUTES = [
14
- ['DefineStmt', 'defnames', 0, 'String', 'str'],
15
- ['CreateFunctionStmt', 'funcname', 0, 'String', 'str'],
16
- ['CreateTrigStmt', 'trigname'],
17
- ['CreateEventTrigStmt', 'trigname'],
18
- ['CompositeTypeStmt', 'typevar', 'RangeVar', 'relname'],
19
- ['ViewStmt', 'view', 'RangeVar', 'relname'],
20
- ['CreateConversionStmt', 'conversion_name', 0, 'String', 'str'],
21
- ['CreateTableAsStmt', 'into', 'IntoClause', 'rel', 'RangeVar', 'relname'],
22
- ['CreateOpClassStmt', 'opclassname', 0, 'String', 'str']
23
- ].freeze
24
- # rubocop: enable Style/WordArray
25
-
26
- class << self
27
- def fetch_directives(text)
28
- {
29
- depends_on: fetch_dependencies(text)
30
- }
31
- end
32
-
33
- def fetch_object_name(text)
34
- parsed = PgQuery.parse(text).tree.dig(0, 'RawStmt', 'stmt')
35
- ROUTES.map { |route| parsed.dig(*route) }.compact[0]
36
- rescue PgQuery::ParseError, NoMethodError
37
- nil
38
- end
39
-
40
- private
41
-
42
- def fetch_dependencies(text)
43
- text.split("\n").grep(/^(--|#)!/).map { |ln| ln.split[1] if ln =~ /!depends_on/ }.compact
44
- end
45
- end
3
+ ##
4
+ # Reads directives from SQL-comments
5
+ #
6
+ # --!depends_on [name_of_dependency]
7
+ #
8
+ # name_of_dependency: short or full name of object as well as object_name
9
+ #
10
+ class PgObjects::Parser
11
+ PG_ENTITIES = %i[operator_class trigger define_statement conversion event_trigger type function table].freeze
12
+
13
+ def initialize(source)
14
+ @source = source
15
+ end
16
+
17
+ def fetch_directives
18
+ {
19
+ depends_on: fetch_dependencies
20
+ }
21
+ end
22
+
23
+ def fetch_object_name
24
+ parse_query
25
+ object_name
26
+ rescue PgQuery::ParseError, NoMethodError
27
+ nil
28
+ end
29
+
30
+ private
31
+
32
+ attr_reader :stmt, :parsed
33
+
34
+ def parse_query
35
+ @parsed = PgQuery.parse(@source)
36
+
37
+ @stmt = parsed.tree.stmts[0].stmt
38
+ end
39
+
40
+ def object_name
41
+ PG_ENTITIES.filter_map { |entity| send(:"check_#{entity}") }.first
42
+ end
43
+
44
+ def fetch_dependencies
45
+ @source.split("\n").grep(/^(--|#)!/).map { |ln| ln.split[1] if ln =~ /!depends_on/ }.compact
46
+ end
47
+
48
+ # also views
49
+ def table? = parsed.tables.size.positive?
50
+
51
+ def check_table
52
+ parsed.tables[0] if table?
53
+ end
54
+
55
+ def function? = parsed.functions.size.positive?
56
+
57
+ def check_function
58
+ parsed.functions[0] if function?
59
+ end
60
+
61
+ def operator_class? = stmt.respond_to?(:create_op_class_stmt) && stmt.create_op_class_stmt.present?
62
+
63
+ def check_operator_class
64
+ stmt.create_op_class_stmt.opclassname[0].string.sval if operator_class?
65
+ end
66
+
67
+ def trigger? = stmt.respond_to?(:create_trig_stmt) && stmt.create_trig_stmt.present?
68
+
69
+ def check_trigger
70
+ stmt.create_trig_stmt.trigname if trigger?
71
+ end
72
+
73
+ def define_statement? = stmt.respond_to?(:define_stmt) && stmt.define_stmt.present?
74
+
75
+ def check_define_statement
76
+ stmt.define_stmt.defnames[0].string.sval if define_statement?
77
+ end
78
+
79
+ def conversion? = stmt.respond_to?(:create_conversion_stmt) && stmt.create_conversion_stmt.present?
80
+
81
+ def check_conversion
82
+ stmt.create_conversion_stmt.conversion_name[0].string.sval if conversion?
83
+ end
84
+
85
+ def event_trigger? = stmt.respond_to?(:create_event_trig_stmt) && stmt.create_event_trig_stmt.present?
86
+
87
+ def check_event_trigger
88
+ stmt.create_event_trig_stmt.trigname if event_trigger?
89
+ end
90
+
91
+ def type? = stmt.respond_to?(:composite_type_stmt) && stmt.composite_type_stmt.present?
92
+
93
+ def check_type
94
+ stmt.composite_type_stmt.typevar.relname if type?
46
95
  end
47
96
  end
@@ -1,12 +1,10 @@
1
- module PgObjects
2
- ##
3
- # Brings rake tasks to rails app
4
- class Railtie < Rails::Railtie
5
- # initializer 'pg_objects.initialization' do |app|
6
- # end
1
+ ##
2
+ # Brings rake tasks to rails app
3
+ class PgObjects::Railtie < Rails::Railtie
4
+ # initializer 'pg_objects.initialization' do |app|
5
+ # end
7
6
 
8
- rake_tasks do
9
- load 'tasks/pg_objects_tasks.rake'
10
- end
7
+ rake_tasks do
8
+ load 'tasks/pg_objects_tasks.rake'
11
9
  end
12
10
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module PgObjects
4
- VERSION = '1.0.3'
4
+ VERSION = '1.2.0'
5
5
  end
data/pg_objects.gemspec CHANGED
@@ -11,7 +11,7 @@ Gem::Specification.new do |spec|
11
11
  spec.summary = %q(Simple manager for PostgreSQL objects like triggers and functions)
12
12
  spec.homepage = 'https://github.com/marinazzio/pg_objects'
13
13
 
14
- spec.required_ruby_version = '>= 2.7.0'
14
+ spec.required_ruby_version = '>= 3.1.0'
15
15
 
16
16
  spec.metadata = {
17
17
  'bug_tracker_uri' => 'https://github.com/marinazzio/pg_objects/issues',
@@ -43,8 +43,8 @@ Gem::Specification.new do |spec|
43
43
  spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
44
44
  spec.require_paths = ['lib']
45
45
 
46
- spec.add_dependency 'activerecord', '>= 6.0.3.5', '< 7'
47
- spec.add_dependency 'pg_query', '~> 1'
48
- spec.add_dependency 'railties', '>= 4', '< 7'
46
+ spec.add_dependency 'activerecord', '>= 6.1.7.0', '< 8'
47
+ spec.add_dependency 'pg_query', '~> 5'
48
+ spec.add_dependency 'railties', '>= 4', '< 8'
49
49
  spec.add_dependency 'rake-hooks', '~> 1'
50
50
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: pg_objects
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.3
4
+ version: 1.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Denis Kiselyov
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2023-06-23 00:00:00.000000000 Z
11
+ date: 2024-02-28 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activerecord
@@ -16,34 +16,34 @@ dependencies:
16
16
  requirements:
17
17
  - - ">="
18
18
  - !ruby/object:Gem::Version
19
- version: 6.0.3.5
19
+ version: 6.1.7.0
20
20
  - - "<"
21
21
  - !ruby/object:Gem::Version
22
- version: '7'
22
+ version: '8'
23
23
  type: :runtime
24
24
  prerelease: false
25
25
  version_requirements: !ruby/object:Gem::Requirement
26
26
  requirements:
27
27
  - - ">="
28
28
  - !ruby/object:Gem::Version
29
- version: 6.0.3.5
29
+ version: 6.1.7.0
30
30
  - - "<"
31
31
  - !ruby/object:Gem::Version
32
- version: '7'
32
+ version: '8'
33
33
  - !ruby/object:Gem::Dependency
34
34
  name: pg_query
35
35
  requirement: !ruby/object:Gem::Requirement
36
36
  requirements:
37
37
  - - "~>"
38
38
  - !ruby/object:Gem::Version
39
- version: '1'
39
+ version: '5'
40
40
  type: :runtime
41
41
  prerelease: false
42
42
  version_requirements: !ruby/object:Gem::Requirement
43
43
  requirements:
44
44
  - - "~>"
45
45
  - !ruby/object:Gem::Version
46
- version: '1'
46
+ version: '5'
47
47
  - !ruby/object:Gem::Dependency
48
48
  name: railties
49
49
  requirement: !ruby/object:Gem::Requirement
@@ -53,7 +53,7 @@ dependencies:
53
53
  version: '4'
54
54
  - - "<"
55
55
  - !ruby/object:Gem::Version
56
- version: '7'
56
+ version: '8'
57
57
  type: :runtime
58
58
  prerelease: false
59
59
  version_requirements: !ruby/object:Gem::Requirement
@@ -63,7 +63,7 @@ dependencies:
63
63
  version: '4'
64
64
  - - "<"
65
65
  - !ruby/object:Gem::Version
66
- version: '7'
66
+ version: '8'
67
67
  - !ruby/object:Gem::Dependency
68
68
  name: rake-hooks
69
69
  requirement: !ruby/object:Gem::Requirement
@@ -85,6 +85,7 @@ executables: []
85
85
  extensions: []
86
86
  extra_rdoc_files: []
87
87
  files:
88
+ - ".github/dependabot.yml"
88
89
  - ".github/workflows/bundle_audit.yml"
89
90
  - ".github/workflows/ci.yml"
90
91
  - ".gitignore"
@@ -132,14 +133,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
132
133
  requirements:
133
134
  - - ">="
134
135
  - !ruby/object:Gem::Version
135
- version: 2.7.0
136
+ version: 3.1.0
136
137
  required_rubygems_version: !ruby/object:Gem::Requirement
137
138
  requirements:
138
139
  - - ">="
139
140
  - !ruby/object:Gem::Version
140
141
  version: '0'
141
142
  requirements: []
142
- rubygems_version: 3.4.12
143
+ rubygems_version: 3.4.10
143
144
  signing_key:
144
145
  specification_version: 4
145
146
  summary: Simple manager for PostgreSQL objects like triggers and functions