hanami-events-cloud_pubsub 0.1.0 → 0.1.5

Sign up to get free protection for your applications and to get access to all the features.
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