ar_schema_functions 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.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 6cea6bd061b0022cd749cbaed3924dc53e6c10957ec03f0a58e59dd5ab352414
4
+ data.tar.gz: '09e0c07f709115d6b8e75f092ce0d281b3a488e970837d4a693a6671f5c042f3'
5
+ SHA512:
6
+ metadata.gz: 12ac604674a76566f4dde3286ab352df2626df7b1f27597d340c648049087cd87a2e255a30e6adff73656f8892a4fa5fc59f89d9f7ef77556e6234502d9822c8
7
+ data.tar.gz: c812aaceadfe1b99e1c7901735b72727ec446589be3a74d0f88533060c6eef5c08ab86e7361694940dbd00d806968a755a9a7faa51e338a42cbb76b1e9c501cf
data/Gemfile ADDED
@@ -0,0 +1,8 @@
1
+ # frozen_string_literal: true
2
+
3
+ source 'https://rubygems.org'
4
+
5
+ # Specify your gem's dependencies in ar_schema_functions.gemspec
6
+ gemspec
7
+
8
+ gem 'rubocop', '~> 1.7'
@@ -0,0 +1,24 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'lib/ar_schema_functions/version'
4
+
5
+ Gem::Specification.new do |spec|
6
+ spec.name = 'ar_schema_functions'
7
+ spec.version = ArSchemaFunctions::VERSION
8
+ spec.authors = ['Dave Allie']
9
+ spec.email = ['dave@visibuild.com.au']
10
+
11
+ spec.summary = 'Populate schema.rb with stored SQL functions'
12
+ spec.homepage = 'https://github.com/visibuild/ar_schema_functions'
13
+ spec.license = 'MIT'
14
+ spec.required_ruby_version = Gem::Requirement.new('>= 2.5.0')
15
+
16
+ spec.metadata['homepage_uri'] = spec.homepage
17
+ spec.metadata['source_code_uri'] = 'https://github.com/visibuild/ar_schema_functions'
18
+ spec.metadata['changelog_uri'] = 'https://github.com/visibuild/ar_schema_functions/blob/master/CHANGELOG.md'
19
+
20
+ spec.files = Dir['lib/**/*'] + %w[Gemfile ar_schema_functions.gemspec]
21
+ spec.require_paths = ['lib']
22
+
23
+ spec.add_dependency 'activerecord', '>= 4.0.0', '< 7.0.0'
24
+ end
@@ -0,0 +1,57 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ArSchemaFunctions
4
+ module Extensions
5
+ module SchemaDumper
6
+ def dump(stream)
7
+ header(stream)
8
+ extensions(stream)
9
+ functions(stream)
10
+ tables(stream)
11
+ trailer(stream)
12
+ stream
13
+ end
14
+
15
+ # Defined by SQL engine specific adapters (if supported)
16
+ def functions(stream); end
17
+ end
18
+
19
+ module PostgreSQLSchemaDumper
20
+ def functions(stream)
21
+ functions = @connection.functions
22
+
23
+ return unless functions.any?
24
+
25
+ functions.each do |function|
26
+ indented_function = function.lines.map { |line| " #{line}" }.join
27
+ stream.puts " connection.execute(<<~SQL)\n#{indented_function} SQL"
28
+ stream.puts
29
+ end
30
+ end
31
+ end
32
+
33
+ module AbstractAdapter
34
+ # Defined by SQL engine specific adapters (if supported)
35
+ def functions
36
+ []
37
+ end
38
+ end
39
+
40
+ module PostgreSQLAdapter
41
+ def functions
42
+ # From https://dataedo.com/kb/query/postgresql/list-user-defined-functions
43
+ exec_query(<<~SQL.squish, 'SCHEMA').cast_values
44
+ select case when l.lanname = 'internal' then p.prosrc
45
+ else pg_get_functiondef(p.oid)
46
+ end as definition
47
+ from pg_proc p
48
+ left join pg_namespace n on p.pronamespace = n.oid
49
+ left join pg_language l on p.prolang = l.oid
50
+ where n.nspname not in ('pg_catalog', 'information_schema')#{' '}
51
+ and l.lanname != 'c'
52
+ order by definition;
53
+ SQL
54
+ end
55
+ end
56
+ end
57
+ end
@@ -0,0 +1,20 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'extensions'
4
+
5
+ module ArSchemaFunctions
6
+ class Railtie < Rails::Railtie
7
+ initializer 'ar_schema_functions.active_record' do
8
+ ActiveSupport.on_load :active_record do
9
+ ActiveRecord::SchemaDumper.prepend(ArSchemaFunctions::Extensions::SchemaDumper)
10
+ ActiveRecord::ConnectionAdapters::AbstractAdapter.prepend(ArSchemaFunctions::Extensions::AbstractAdapter)
11
+
12
+ if defined?(ActiveRecord::ConnectionAdapters::PostgreSQLAdapter)
13
+ ActiveRecord::ConnectionAdapters::PostgreSQLAdapter.prepend(ArSchemaFunctions::Extensions::PostgreSQLAdapter)
14
+ ActiveRecord::ConnectionAdapters::PostgreSQL::SchemaDumper
15
+ .prepend(ArSchemaFunctions::Extensions::PostgreSQLSchemaDumper)
16
+ end
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ArSchemaFunctions
4
+ VERSION = '0.1.0'
5
+ end
@@ -0,0 +1,4 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'ar_schema_functions/version'
4
+ require_relative 'ar_schema_functions/railtie' if defined?(Rails::Railtie) && defined?(ActiveRecord)
metadata ADDED
@@ -0,0 +1,72 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: ar_schema_functions
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Dave Allie
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2021-09-30 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: activerecord
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: 4.0.0
20
+ - - "<"
21
+ - !ruby/object:Gem::Version
22
+ version: 7.0.0
23
+ type: :runtime
24
+ prerelease: false
25
+ version_requirements: !ruby/object:Gem::Requirement
26
+ requirements:
27
+ - - ">="
28
+ - !ruby/object:Gem::Version
29
+ version: 4.0.0
30
+ - - "<"
31
+ - !ruby/object:Gem::Version
32
+ version: 7.0.0
33
+ description:
34
+ email:
35
+ - dave@visibuild.com.au
36
+ executables: []
37
+ extensions: []
38
+ extra_rdoc_files: []
39
+ files:
40
+ - Gemfile
41
+ - ar_schema_functions.gemspec
42
+ - lib/ar_schema_functions.rb
43
+ - lib/ar_schema_functions/extensions.rb
44
+ - lib/ar_schema_functions/railtie.rb
45
+ - lib/ar_schema_functions/version.rb
46
+ homepage: https://github.com/visibuild/ar_schema_functions
47
+ licenses:
48
+ - MIT
49
+ metadata:
50
+ homepage_uri: https://github.com/visibuild/ar_schema_functions
51
+ source_code_uri: https://github.com/visibuild/ar_schema_functions
52
+ changelog_uri: https://github.com/visibuild/ar_schema_functions/blob/master/CHANGELOG.md
53
+ post_install_message:
54
+ rdoc_options: []
55
+ require_paths:
56
+ - lib
57
+ required_ruby_version: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: 2.5.0
62
+ required_rubygems_version: !ruby/object:Gem::Requirement
63
+ requirements:
64
+ - - ">="
65
+ - !ruby/object:Gem::Version
66
+ version: '0'
67
+ requirements: []
68
+ rubygems_version: 3.2.15
69
+ signing_key:
70
+ specification_version: 4
71
+ summary: Populate schema.rb with stored SQL functions
72
+ test_files: []