stack-service-base 0.0.70 → 0.0.72
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 +4 -4
- data/lib/stack-service-base/db_ext/geo_ext.rb +93 -0
- data/lib/stack-service-base/version.rb +1 -1
- data/lib/stack-service-base.rb +56 -52
- metadata +2 -1
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 7cb27ff22395eb1cb21ee8e075cf5a499a3088d9f0c8639170907732e3063e64
|
|
4
|
+
data.tar.gz: 74e05bf0e69494182abe3e4d281f8b1ac1d43f1013a1c47ac38234cf14859443
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 76aeeeacc371e3c2a87e375490f4bc4bba67530eda346abb8461d8df142f0f26a4f30d89b31f7a97fdb479991902e06dc598f495666b08559ac6a7f6067190e3
|
|
7
|
+
data.tar.gz: 4c744f89da1b1740cb751e834e32e3172934bfb296d9b0f2eb9640e429b7d7c1c6932309d99bc6b82b4d039faffc338fec9fe4b0fc1b5a1a6cabb898e92428b6
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
require 'rgeo'
|
|
2
|
+
require 'rgeo/geo_json'
|
|
3
|
+
|
|
4
|
+
unless RGeo::Geos.capi_supported?
|
|
5
|
+
raise 'Install rgeo with CAIP support. apt install libgeos-dev, then gem install rgeo rgeo-geojson'
|
|
6
|
+
end
|
|
7
|
+
|
|
8
|
+
## Example usage:
|
|
9
|
+
# DB.create_table? :geoms do
|
|
10
|
+
# primary_key :id
|
|
11
|
+
# Geometry :geom
|
|
12
|
+
# end
|
|
13
|
+
#
|
|
14
|
+
# DB.execute "INSERT INTO geoms(geom) VALUES( ST_GeomFromText('POINT(-71.060316 48.432044)', 4326));"
|
|
15
|
+
#
|
|
16
|
+
# gs = DB[:geoms].all
|
|
17
|
+
#
|
|
18
|
+
# # Output as WKB format
|
|
19
|
+
# Sequel::Postgres::GeoDatabaseMethods::Geometry.to_json_format = :wkb
|
|
20
|
+
# p gs[0].to_json
|
|
21
|
+
#
|
|
22
|
+
# # Output as GeoJSON format
|
|
23
|
+
# Sequel::Postgres::GeoDatabaseMethods::Geometry.to_json_format = :geojson
|
|
24
|
+
# p gs[0].to_json
|
|
25
|
+
module Sequel
|
|
26
|
+
module Postgres
|
|
27
|
+
module GeoDatabaseMethods
|
|
28
|
+
class Geometry
|
|
29
|
+
# 4326 (WGS 84), 3857 (Web Mercator):
|
|
30
|
+
FACTORY = RGeo::Geos.factory(:native_interface => :capi)
|
|
31
|
+
PARSER = RGeo::WKRep::WKBParser.new(FACTORY, support_ewkb: true, default_srid: 4326)
|
|
32
|
+
|
|
33
|
+
class << self
|
|
34
|
+
attr_accessor :to_json_format # wkb, geojson
|
|
35
|
+
end
|
|
36
|
+
attr_accessor :wkb_string
|
|
37
|
+
def initialize(wkb_string)
|
|
38
|
+
@wkb_string = wkb_string
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
def to_json(*a)
|
|
42
|
+
@wkb_string.to_json
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
def as_json
|
|
46
|
+
@wkb_string.to_s
|
|
47
|
+
end
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
def self.extended(db)
|
|
51
|
+
db.instance_exec do
|
|
52
|
+
extend_datasets(GeoDatasetMethods)
|
|
53
|
+
|
|
54
|
+
geom_new = Geometry.method(:new)
|
|
55
|
+
add_conversion_proc 18046, geom_new
|
|
56
|
+
@schema_type_classes[:geometry] = Geometry
|
|
57
|
+
end
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
private
|
|
61
|
+
|
|
62
|
+
def schema_column_type(db_type)
|
|
63
|
+
db_type == 'geometry' ? Geometry : super
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
def typecast_value_geometry(value)
|
|
67
|
+
value
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
module GeoDatasetMethods
|
|
71
|
+
|
|
72
|
+
private
|
|
73
|
+
def literal_other_append(sql, value)
|
|
74
|
+
if value.is_a?(Geometry)
|
|
75
|
+
sql << "ST_SetSRID(ST_GeomFromWKB('\\x#{value.wkb_string}'),4326)"
|
|
76
|
+
else
|
|
77
|
+
super
|
|
78
|
+
end
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
end
|
|
82
|
+
end
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
Database.register_extension(:pg_geo, Postgres::GeoDatabaseMethods)
|
|
86
|
+
end
|
|
87
|
+
Geometry = Sequel::Postgres::GeoDatabaseMethods::Geometry
|
|
88
|
+
|
|
89
|
+
# DB.extension :pg_geo
|
|
90
|
+
Sequel::Database.after_initialize do |db|
|
|
91
|
+
pr = Sequel.synchronize { Sequel::Database::EXTENSIONS[:pg_geo] }
|
|
92
|
+
db.instance_eval { pr&.call(self) if !@loaded_extensions.include?(:pg_geo) && @loaded_extensions << :pg_geo }
|
|
93
|
+
end
|
data/lib/stack-service-base.rb
CHANGED
|
@@ -1,3 +1,8 @@
|
|
|
1
|
+
unless defined? RSpec
|
|
2
|
+
require 'dotenv'
|
|
3
|
+
Dotenv.load '.env.local' if File.exist? '.env.local'
|
|
4
|
+
end
|
|
5
|
+
|
|
1
6
|
require 'stack-service-base/version'
|
|
2
7
|
require 'stack-service-base/logging'
|
|
3
8
|
require 'stack-service-base/rack_helpers'
|
|
@@ -7,13 +12,50 @@ require 'stack-service-base/sinatra_ext'
|
|
|
7
12
|
require 'stack-service-base/debugger'
|
|
8
13
|
require 'stack-service-base/async_helpers'
|
|
9
14
|
|
|
10
|
-
unless defined? RSpec
|
|
11
|
-
require 'dotenv'
|
|
12
|
-
Dotenv.load '.env.local' if File.exist? '.env.local'
|
|
13
|
-
end
|
|
14
|
-
|
|
15
15
|
module StackServiceBase
|
|
16
16
|
class << self
|
|
17
|
+
def pre_init()
|
|
18
|
+
if defined? Sequel
|
|
19
|
+
require 'stack-service-base/database'
|
|
20
|
+
|
|
21
|
+
Sequel::Database.after_initialize { _1.loggers << LOGGER }
|
|
22
|
+
|
|
23
|
+
attempts= 10
|
|
24
|
+
sleep_interval= 1
|
|
25
|
+
|
|
26
|
+
mod = Module.new do
|
|
27
|
+
define_method(:connect) do |*args, **opts, &blk|
|
|
28
|
+
tries = attempts
|
|
29
|
+
begin
|
|
30
|
+
super(*args, **opts, &blk)
|
|
31
|
+
rescue Sequel::DatabaseConnectionError, Sequel::DatabaseError => e
|
|
32
|
+
if (tries -= 1) > 0
|
|
33
|
+
LOGGER.warn "DB connect failed (#{e.message}), retrying in #{sleep_interval}s… (#{tries} left)"
|
|
34
|
+
sleep sleep_interval
|
|
35
|
+
retry
|
|
36
|
+
end
|
|
37
|
+
raise
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
Sequel.singleton_class.prepend(mod)
|
|
43
|
+
|
|
44
|
+
require 'sequel/adapters/postgres'
|
|
45
|
+
PG::Connection.singleton_class.prepend(Module.new{
|
|
46
|
+
def connect_to_hosts(*args)
|
|
47
|
+
stack_name = ENV['STACK_NAME'] || 'undefined_stack'
|
|
48
|
+
service_name = ENV['STACK_SERVICE_NAME'] || 'undefined_service'
|
|
49
|
+
args[0][:fallback_application_name] ||= "#{stack_name}_#{service_name}"
|
|
50
|
+
super *args
|
|
51
|
+
end
|
|
52
|
+
})
|
|
53
|
+
|
|
54
|
+
require_relative 'stack-service-base/fiber_pool'
|
|
55
|
+
end
|
|
56
|
+
@pre_init = :done
|
|
57
|
+
end
|
|
58
|
+
|
|
17
59
|
def rack_setup app
|
|
18
60
|
# skip if called within Rspec task
|
|
19
61
|
# TODO: warn if called not within Rspec task but with a wrong app class
|
|
@@ -30,15 +72,6 @@ module StackServiceBase
|
|
|
30
72
|
|
|
31
73
|
RackHelpers.rack_setup app
|
|
32
74
|
|
|
33
|
-
# Sinatra?
|
|
34
|
-
# disable :show_exceptions unless ENV['DEBUG']
|
|
35
|
-
# error do
|
|
36
|
-
# status 500
|
|
37
|
-
# $stderr.puts "Exception: #{env['sinatra.error']}"
|
|
38
|
-
# $stderr.puts "Exception backtrace: #{env['sinatra.error'].backtrace[0..10].join("\n")}"
|
|
39
|
-
# { error: "Internal server error", message: env['sinatra.error'].message }.to_json
|
|
40
|
-
# end
|
|
41
|
-
|
|
42
75
|
if ENV.fetch('PROMETHEUS_METRICS_EXPORT', 'true') == 'true'
|
|
43
76
|
require 'stack-service-base/prometheus'
|
|
44
77
|
|
|
@@ -47,44 +80,15 @@ module StackServiceBase
|
|
|
47
80
|
use Prometheus::Middleware::Exporter
|
|
48
81
|
end
|
|
49
82
|
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
define_method(:connect) do |*args, **opts, &blk|
|
|
60
|
-
tries = attempts
|
|
61
|
-
begin
|
|
62
|
-
super(*args, **opts, &blk)
|
|
63
|
-
rescue Sequel::DatabaseConnectionError, Sequel::DatabaseError => e
|
|
64
|
-
if (tries -= 1) > 0
|
|
65
|
-
LOGGER.warn "DB connect failed (#{e.message}), retrying in #{sleep_interval}s… (#{tries} left)"
|
|
66
|
-
sleep sleep_interval
|
|
67
|
-
retry
|
|
68
|
-
end
|
|
69
|
-
raise
|
|
70
|
-
end
|
|
71
|
-
end
|
|
72
|
-
end
|
|
73
|
-
|
|
74
|
-
Sequel.singleton_class.prepend(mod)
|
|
75
|
-
|
|
76
|
-
require 'sequel/adapters/postgres'
|
|
77
|
-
PG::Connection.singleton_class.prepend(Module.new{
|
|
78
|
-
def connect_to_hosts(*args)
|
|
79
|
-
stack_name = ENV['STACK_NAME'] || 'undefined_stack'
|
|
80
|
-
service_name = ENV['STACK_SERVICE_NAME'] || 'undefined_service'
|
|
81
|
-
args[0][:fallback_application_name] ||= "#{stack_name}_#{service_name}"
|
|
82
|
-
super *args
|
|
83
|
-
end
|
|
84
|
-
})
|
|
85
|
-
|
|
86
|
-
require_relative 'stack-service-base/fiber_pool'
|
|
87
|
-
end
|
|
83
|
+
# Sinatra?
|
|
84
|
+
# disable :show_exceptions unless ENV['DEBUG']
|
|
85
|
+
# error do
|
|
86
|
+
# status 500
|
|
87
|
+
# $stderr.puts "Exception: #{env['sinatra.error']}"
|
|
88
|
+
# $stderr.puts "Exception backtrace: #{env['sinatra.error'].backtrace[0..10].join("\n")}"
|
|
89
|
+
# { error: "Internal server error", message: env['sinatra.error'].message }.to_json
|
|
90
|
+
# end
|
|
91
|
+
StackServiceBase.pre_init unless @pre_init == :done
|
|
88
92
|
end
|
|
89
93
|
end
|
|
90
94
|
end
|
metadata
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: stack-service-base
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.0.
|
|
4
|
+
version: 0.0.72
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Artyom B
|
|
@@ -412,6 +412,7 @@ files:
|
|
|
412
412
|
- lib/stack-service-base/command_init.rb
|
|
413
413
|
- lib/stack-service-base/command_line.rb
|
|
414
414
|
- lib/stack-service-base/database.rb
|
|
415
|
+
- lib/stack-service-base/db_ext/geo_ext.rb
|
|
415
416
|
- lib/stack-service-base/debugger.rb
|
|
416
417
|
- lib/stack-service-base/examples/mcp_config.ru
|
|
417
418
|
- lib/stack-service-base/fiber_pool.rb
|