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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 8820950439a892f0528c436bcab27d328baa12dadd14b49ddebf19e9748cfef4
4
- data.tar.gz: d13b77dd8b23103f493a0f0e68d75d24102ede20d607d53c7a81119e009d7b4d
3
+ metadata.gz: 7cb27ff22395eb1cb21ee8e075cf5a499a3088d9f0c8639170907732e3063e64
4
+ data.tar.gz: 74e05bf0e69494182abe3e4d281f8b1ac1d43f1013a1c47ac38234cf14859443
5
5
  SHA512:
6
- metadata.gz: 8da8bd8be46746c598c2d4c0703e0d88a4abed5770955a5f57251921c8ba02d61da6f04512ac3e42659fa37355b08909af14caefefd6776dfeaed6e10fdb5199
7
- data.tar.gz: 809be37ee84dd4512aa793208992bd92a5510a0bc217972c167a10fca545d73bcbff36a61077f41a2e2a2087202b90910f3d7cf3072fb7f60e9450813c55fca7
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
@@ -1,3 +1,3 @@
1
1
  module StackServiceBase
2
- VERSION = '0.0.70'
2
+ VERSION = '0.0.72'
3
3
  end
@@ -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
- if defined? Sequel
51
- require 'stack-service-base/database'
52
-
53
- Sequel::Database.after_initialize { _1.loggers << LOGGER }
54
-
55
- attempts= 10
56
- sleep_interval= 1
57
-
58
- mod = Module.new do
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.70
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