hanami-events-cloud_pubsub 0.1.0 → 0.1.5

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: b74e245658e07e3de644521a132de72abda946f063da3d4753baaafd90d3c4a5
4
- data.tar.gz: 828da43db5d56a53f88111da0f10295d15f8f2c5acba0c0bf7b2b110e732b75e
3
+ metadata.gz: a2113da2784c067da73a9d9c37990f8c2406bd1e0ff6c25ab17576f786863ef9
4
+ data.tar.gz: b2bb4eb5f8e5b8ca1e8dcac4c150b210d2e108e075dbd6d7abb419afab452516
5
5
  SHA512:
6
- metadata.gz: 1278b410daba4892e127631c86058cb00397b5903547a9e03b96df7908382a10c8166ebf624edaa2990ff53c2a727996ea9df1347ca901f69eccf0d0aef0573c
7
- data.tar.gz: 4bf717414948e69b9f48eac0b9c9e60d2fab73c0ad90d1cf6fd9bbf74a1cdf5881cc72f16d722d032b040c9c8a50697cd81dce67408959c6b5b49a7171eec413
6
+ metadata.gz: c51521fa3b75dd6bbbc7e79c227d1ea53f3cd5623eb874b28972fc713b656baacd2fda7f34fce2b515ced410a5d4f1e1ae69df47bfae476557dcc0956548c5c5
7
+ data.tar.gz: 320daaad0c019fcb38e07c993e7bd8c71804d51ce0ee27767627b6a1c1cb97eef78cc4b99724e57ccb222d0cce9c1d7ab93838e03605a06e6d0b917d620d562d
data/.travis.yml CHANGED
@@ -4,18 +4,10 @@ cache: bundler
4
4
  services:
5
5
  - docker
6
6
  language: ruby
7
- env:
8
- - DOCKER_COMPOSE_VERSION=1.21.2
9
7
  rvm:
10
8
  - 2.4
11
9
  before_install:
12
10
  - gem install bundler -v 1.16.1
13
- - sudo rm /usr/local/bin/docker-compose
14
- - curl -L https://github.com/docker/compose/releases/download/${DOCKER_COMPOSE_VERSION}/docker-compose-`uname
15
- -s`-`uname -m` > docker-compose
16
- - chmod +x docker-compose
17
- - sudo mv docker-compose /usr/local/bin
18
- - docker-compose up -d
19
11
  after_failure:
20
12
  - cat log/test.log
21
13
  deploy:
data/Gemfile.lock CHANGED
@@ -9,7 +9,7 @@ GIT
9
9
  PATH
10
10
  remote: .
11
11
  specs:
12
- hanami-events-cloud_pubsub (0.1.0)
12
+ hanami-events-cloud_pubsub (0.1.5)
13
13
  google-cloud-pubsub (~> 0.30.2)
14
14
  hanami-cli
15
15
  hanami-events
@@ -73,6 +73,7 @@ GEM
73
73
  hanami-utils (1.2.0)
74
74
  concurrent-ruby (~> 1.0)
75
75
  transproc (~> 1.0)
76
+ jaro_winkler (1.4.0)
76
77
  jwt (2.1.0)
77
78
  little-plugger (1.1.4)
78
79
  logging (2.2.2)
@@ -107,7 +108,8 @@ GEM
107
108
  diff-lcs (>= 1.2.0, < 2.0)
108
109
  rspec-support (~> 3.7.0)
109
110
  rspec-support (3.7.1)
110
- rubocop (0.56.0)
111
+ rubocop (0.57.0)
112
+ jaro_winkler (~> 1.4.0)
111
113
  parallel (~> 1.10)
112
114
  parser (>= 2.5)
113
115
  powerpack (~> 0.1)
@@ -1,4 +1,3 @@
1
-
2
1
  # frozen_string_literal: true
3
2
 
4
3
  lib = File.expand_path('lib', __dir__)
@@ -24,9 +23,8 @@ Gem::Specification.new do |spec|
24
23
  spec.require_paths = ['lib']
25
24
 
26
25
  spec.add_dependency 'google-cloud-pubsub', '~> 0.30.2'
27
-
28
- spec.add_runtime_dependency 'hanami-cli'
29
- spec.add_runtime_dependency 'hanami-events'
26
+ spec.add_dependency 'hanami-cli'
27
+ spec.add_dependency 'hanami-events'
30
28
 
31
29
  spec.add_development_dependency 'bundler', '~> 1.16'
32
30
  spec.add_development_dependency 'rake', '~> 12.3'
@@ -24,21 +24,50 @@ module Hanami
24
24
  desc: 'Config file which is loaded before starting the runner'
25
25
 
26
26
  def call(opts)
27
- CloudPubsub.setup
27
+ setup_env(opts)
28
28
  parse_opts(opts)
29
- setup_signal_handlers
30
29
  build_runner
30
+ setup_signal_handlers
31
31
  load_config
32
32
  start_runner
33
33
  sleep_forever
34
- rescue Interrupt
35
- shutdown
36
34
  end
37
35
 
38
36
  private
39
37
 
38
+ def setup_env(opts)
39
+ ENV['PUBSUB_EMULATOR_HOST'] ||= 'localhost:8085' if opts[:emulator]
40
+ try_load_environment
41
+ resolve_components
42
+ CloudPubsub.setup
43
+ end
44
+
45
+ def try_load_environment
46
+ boot_file = Bundler.default_gemfile.parent.join('config', 'environment.rb')
47
+ load boot_file.to_s
48
+ rescue LoadError
49
+ logger.warn <<~MSG
50
+ Could not load config/environment.rb, assuming we are not in a Hanami project
51
+ MSG
52
+ end
53
+
54
+ def resolve_components
55
+ return unless defined?(Hanami::Components)
56
+ Hanami::Components.resolve('logger')
57
+ end
58
+
40
59
  def sleep_forever
60
+ thread = Thread.new do
61
+ loop do
62
+ event = @queue.pop
63
+ event.call
64
+ end
65
+ end
66
+
41
67
  sleep
68
+ rescue Interrupt
69
+ thread.kill
70
+ shutdown
42
71
  end
43
72
 
44
73
  def load_config
@@ -52,7 +81,7 @@ module Hanami
52
81
 
53
82
  def parse_opts(opts)
54
83
  @emulator = opts[:emulator]
55
- logger.info 'Running if emulator mode' if @emulator
84
+ logger.info 'Running in emulator mode' if @emulator
56
85
  @config = opts[:config]
57
86
  logger.debug "Using config file: #{@config}"
58
87
  end
@@ -60,7 +89,6 @@ module Hanami
60
89
  def build_runner
61
90
  pubsub_opts = {}
62
91
 
63
- ENV['PUBSUB_EMULATOR_HOST'] ||= 'localhost:8085' if @emulator
64
92
  pubsub_opts[:project_id] = 'emulator' if @emulator
65
93
 
66
94
  pubsub = Google::Cloud::Pubsub.new pubsub_opts
@@ -72,24 +100,26 @@ module Hanami
72
100
  end
73
101
 
74
102
  def logger
75
- if defined?(Hanami.logger)
76
- Hanami.logger
77
- else
78
- Logger.new(STDOUT).tap { |logger| logger.level = Logger::INFO }
79
- end
103
+ @logger ||= if defined?(Hanami.logger)
104
+ Hanami.logger
105
+ else
106
+ Logger.new(STDOUT)
107
+ end
80
108
  end
81
109
 
82
110
  def setup_signal_handlers
111
+ @queue = Queue.new
112
+
83
113
  Signal.trap('TSTP') do
84
- Thread.new { @runner.pause }
114
+ @queue << proc { @runner.pause }
85
115
  end
86
116
 
87
117
  Signal.trap('CONT') do
88
- Thread.new { @runner.start }
118
+ @queue << proc { @runner.start }
89
119
  end
90
120
 
91
121
  Signal.trap('TTIN') do
92
- Thread.new { @runner.print_debug_info }
122
+ @queue << proc { @runner.print_debug_info }
93
123
  end
94
124
  end
95
125
 
@@ -39,6 +39,10 @@ module Hanami
39
39
  @subscriber.start
40
40
  end
41
41
 
42
+ def started?
43
+ @subscriber&.started?
44
+ end
45
+
42
46
  def shutdown
43
47
  subscriber.stop.wait!
44
48
  self
@@ -95,7 +99,7 @@ module Hanami
95
99
  end
96
100
 
97
101
  def ensure_subscriber!
98
- raise NoSubscriberError, 'No subsriber has been registererd' unless @subscriber
102
+ raise NoSubscriberError, 'No subsriber has been registered' unless @subscriber
99
103
  end
100
104
  end
101
105
  end
@@ -1,5 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require 'hanami/events/cloud_pubsub/thread_inspector'
4
+
3
5
  module Hanami
4
6
  module Events
5
7
  module CloudPubsub
@@ -81,12 +83,23 @@ module Hanami
81
83
  # some reason.
82
84
  #
83
85
  # See: https://github.com/mperham/sidekiq/blob/e447dae961ebc894f12848d9f33446a07ffc67dc/bin/sidekiqload#L74
86
+ # rubocop:disable Metrics/AbcSize
84
87
  def print_debug_info(stream = STDOUT)
85
- stream.puts '=== Subscribers ==='
86
- adapter.listeners.each do |listener|
87
- stream.puts listener.format
88
- end
88
+ stream.puts <<~MSG
89
+ ╔══════ BACKTRACES
90
+ #{Thread.list.flat_map { |thr| ThreadInspector.new(thr).to_s }.join("\n")}
91
+ ╠══════ LISTENERS
92
+ #{adapter.listeners.map { |lis| '║ ' + lis.format }.join("\n")}
93
+
94
+ ╠══════ GENERAL
95
+ ║ ready?: #{ready?}
96
+ ║ healthy?: #{healthy?}
97
+ ║ threads: #{Thread.list.count}
98
+ ║ threads running: #{Thread.list.select { |thread| thread.status == 'run' }.count}
99
+ ╚══════
100
+ MSG
89
101
  end
102
+ # rubocop:enable Metrics/AbcSize
90
103
 
91
104
  def sleep_for_a_bit
92
105
  sleep @sleep_time
@@ -0,0 +1,58 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Hanami
4
+ module Events
5
+ module CloudPubsub
6
+ # Generate prettier backtraces for inspection
7
+ class ThreadInspector
8
+ attr_reader :backtrace, :thread
9
+
10
+ def initialize(thread)
11
+ @thread = thread
12
+ @backtrace = thread.backtrace
13
+ end
14
+
15
+ def to_s
16
+ "║ #{thread.inspect}\n" + pretty_backtrace
17
+ end
18
+
19
+ def inspect
20
+ thread.inspect
21
+ end
22
+
23
+ private
24
+
25
+ def pretty_backtrace
26
+ pretty_backtrace = backtrace.map do |call|
27
+ parts = call.match(/^(?<file>.+):(?<line>\d+):in `(?<code>.*)'$/)
28
+
29
+ if parts
30
+ file = parts[:file].sub(/^#{Regexp.escape(File.join(Dir.getwd, ''))}/, '')
31
+ pretty_line(file, parts)
32
+ else
33
+ colorize(call, 31)
34
+ end
35
+ end
36
+
37
+ join_backtrace(pretty_backtrace)
38
+ end
39
+
40
+ def colorize(text, color_code)
41
+ "\e[#{color_code}m#{text}\e[0m"
42
+ end
43
+
44
+ def pretty_line(file, parts)
45
+ "#{colorize(file, 36)} #{colorize('(', 37)}" \
46
+ "#{colorize(parts[:line], 32)}#{colorize('): ', 37)} " \
47
+ "#{colorize(parts[:code], 31)}"
48
+ end
49
+
50
+ def join_backtrace(pretty_backtrace)
51
+ pretty_backtrace.map! { |line| "║\t" + line }
52
+ pretty_backtrace << '║'
53
+ pretty_backtrace.join("\n")
54
+ end
55
+ end
56
+ end
57
+ end
58
+ end
@@ -3,7 +3,7 @@
3
3
  module Hanami
4
4
  module Events
5
5
  module CloudPubsub
6
- VERSION = '0.1.0'
6
+ VERSION = '0.1.5'
7
7
  end
8
8
  end
9
9
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: hanami-events-cloud_pubsub
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.1.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ian Ker-Seymer
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2018-06-05 00:00:00.000000000 Z
11
+ date: 2018-06-06 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: google-cloud-pubsub
@@ -127,6 +127,7 @@ files:
127
127
  - lib/hanami/events/cloud_pubsub/listener.rb
128
128
  - lib/hanami/events/cloud_pubsub/mixin.rb
129
129
  - lib/hanami/events/cloud_pubsub/runner.rb
130
+ - lib/hanami/events/cloud_pubsub/thread_inspector.rb
130
131
  - lib/hanami/events/cloud_pubsub/version.rb
131
132
  - log/.keep
132
133
  homepage: https://github.com/adHawk/hanami-events-cloud_pubsub