pechkin 1.6.0 → 2.0.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: fdd7554b43eb0ac8fa2fdb0fc9d02d31b4acf859c1b66a9470c1fdbd524d0eef
4
- data.tar.gz: 224c8857ae9b72a48b91c8342040f9866d30a285a7f6e8595bf27e577f44bdd2
3
+ metadata.gz: 41f0579677371d43215ee3c53c0e9eb1b4e02206bdbf1b1bc1d4898cbd58c981
4
+ data.tar.gz: 127385b4694d80fdbbe733bc646ee3b5922db83119912afb6e50f6de84b29e9f
5
5
  SHA512:
6
- metadata.gz: 623290e1546eb766cb844203af31e8f3708016199f4b1771e55c468cb252d21ecd874452795dc8417ba06d3be3e096526b3ad6c96826c84fa8189cd522e61ecb
7
- data.tar.gz: 61f56c2dc2b400cced01460d977ee216d2c546be2935b3ce968f08c0266ad29d5915b14ea6601ca31f1497f984aba8eb9a1b4cfbbb27f5d358d44f49bd81157a
6
+ metadata.gz: 670ffbaf73bbfefbe54ca3f0a1d06d863c3548f41e35c2580e48644f0967009af8818f20fcc5d0256bd59509817a581e322a5140f870e47c62cf30572e3796aa
7
+ data.tar.gz: 5059e3fd4354f996692013a819e879a61ccf943737c2d7ed824beb8b5095ce940c5b3b700a10e53044694924e277614db3816bb9370a3098c00b8d867bb823fc
@@ -2,7 +2,7 @@ module Pechkin
2
2
  # Rack application to handle requests
3
3
  class App
4
4
  DEFAULT_CONTENT_TYPE = { 'Content-Type' => 'application/json' }.freeze
5
- DEFAULT_HEADERS = {}.merge(DEFAULT_CONTENT_TYPE).freeze
5
+ DEFAULT_HEADERS = {}.merge(DEFAULT_CONTENT_TYPE)
6
6
 
7
7
  attr_accessor :handler, :logger
8
8
 
@@ -12,6 +12,12 @@ module Pechkin
12
12
 
13
13
  def call(env)
14
14
  req = Rack::Request.new(env)
15
+
16
+ # Stub for favicon.ico
17
+ if req.path_info == '/favicon.ico'
18
+ return response(405, '') # Return empty response 405 Method Not Allowed
19
+ end
20
+
15
21
  result = RequestHandler.new(handler, req, logger).handle
16
22
  response(200, result)
17
23
  rescue AppError => e
@@ -23,7 +29,7 @@ module Pechkin
23
29
  private
24
30
 
25
31
  def response(code, body)
26
- [code.to_s, DEFAULT_HEADERS, [body.to_json]]
32
+ [code.to_s, DEFAULT_HEADERS.dup, [body.to_json]]
27
33
  end
28
34
 
29
35
  def proces_app_error(req, err)
@@ -2,7 +2,7 @@ module Pechkin
2
2
  # Http requests handler. We need fresh instance per each request. To keep
3
3
  # internal state isolated
4
4
  class RequestHandler
5
- REQ_PATH_PATTERN = %r{^/(.+)/([^/]+)/?$}.freeze
5
+ REQ_PATH_PATTERN = %r{^/(.+)/([^/]+)/?$}
6
6
 
7
7
  attr_reader :req, :handler,
8
8
  :channel_id, :message_id,
@@ -23,7 +23,8 @@ module Pechkin
23
23
  raise AppError.message_not_found unless message?
24
24
 
25
25
  data = parse_data(req.body.read)
26
- handler.handle(channel_id, message_id, data).each do |i|
26
+ # handler.handle() requires keyword arguments
27
+ handler.handle(channel_id, message_id, **data).each do |i|
27
28
  logger.info "Sent #{channel_id}/#{message_id}: #{i.to_json}"
28
29
  end
29
30
  end
data/lib/pechkin/cli.rb CHANGED
@@ -102,6 +102,15 @@ module Pechkin
102
102
  opt :pid_file, names: ['-p', '--pid-file [FILE]'],
103
103
  desc: 'Path to output PID file'
104
104
 
105
+ opt :server_workers, names: ['--min-threads [SERVER_WORKERS]'], default: 2, type: Integer,
106
+ desc: 'Server workers count. Default: 1'
107
+
108
+ opt :min_threads, names: ['--min-threads [MIN_THREADS]'], default: 5, type: Integer,
109
+ desc: 'Min threads count. Default: 5'
110
+
111
+ opt :max_threads, names: ['--max-threads [MAX_THREADS]'], default: 20, type: Integer,
112
+ desc: 'Max threads count. Default: 20'
113
+
105
114
  opt :log_dir, names: ['--log-dir [DIR]'],
106
115
  desc: 'Path to log directory. Output will be writen to' \
107
116
  'pechkin.log file. If not specified will write to ' \
@@ -1,3 +1,5 @@
1
+ require 'puma/configuration'
2
+
1
3
  module Pechkin
2
4
  module Command
3
5
  # Start pechkin HTTP server
@@ -7,10 +9,17 @@ module Pechkin
7
9
  end
8
10
 
9
11
  def execute
10
- Rack::Server.start(app: AppBuilder.new.build(handler, options),
11
- Host: options.bind_address,
12
- Port: options.port,
13
- pid: options.pid_file)
12
+ # Configure Puma server instead config.ru
13
+ puma_config = Puma::Configuration.new do |user_config|
14
+ user_config.bind "tcp://#{options.bind_address}:#{options.port}"
15
+ user_config.workers options.server_workers # Set number of workers
16
+ user_config.threads options.min_threads, options.max_threads # Set max and min threads
17
+ user_config.app AppBuilder.new.build(handler, options)
18
+ end
19
+
20
+ # Run Puma server with configuration
21
+ launcher = Puma::Launcher.new(puma_config)
22
+ launcher.run
14
23
  end
15
24
  end
16
25
  end
@@ -27,7 +27,7 @@ module Pechkin
27
27
 
28
28
  def read_data(data)
29
29
  d = if data.start_with?('@')
30
- file = data[1..-1]
30
+ file = data[1..]
31
31
  raise "File not found #{file}" unless File.exist?(file)
32
32
 
33
33
  IO.read(file)
@@ -18,7 +18,7 @@ module Pechkin
18
18
  raise ConfigurationError, "'#{views_dir}' is not a directory" unless File.directory?(views_dir)
19
19
 
20
20
  Dir["#{views_dir}/**/*.erb"].each do |f|
21
- relative_path = f["#{views_dir}/".length..-1]
21
+ relative_path = f["#{views_dir}/".length..]
22
22
  views[relative_path] = MessageTemplate.new(IO.read(f))
23
23
  end
24
24
  end
@@ -18,9 +18,8 @@ module Pechkin
18
18
  if MessageTemplate::ERB_INITIALIZE_KEYWORD_ARGUMENTS # Ruby 2.6+
19
19
  @erb_template = ERB.new(erb, trim_mode: '-')
20
20
  else
21
- safe_level = nil
22
21
  trim_mode = '-'
23
- @erb_template = ERB.new(erb, safe_level, trim_mode)
22
+ @erb_template = ERB.new(erb, trim_mode: trim_mode)
24
23
  end
25
24
  end
26
25
 
@@ -1,7 +1,7 @@
1
1
  module Pechkin
2
2
  # Keeps actual version
3
3
  module Version
4
- VERSION = [1, 6, 0].freeze
4
+ VERSION = [2, 0, 0].freeze
5
5
  class << self
6
6
  def version_string
7
7
  VERSION.join('.')
data/lib/pechkin.rb CHANGED
@@ -1,5 +1,6 @@
1
1
  require 'erb'
2
2
  require 'rack'
3
+ require 'puma'
3
4
  require 'logger'
4
5
  require 'prometheus/middleware/collector'
5
6
  require 'prometheus/middleware/exporter'
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: pechkin
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.6.0
4
+ version: 2.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ilya Arkhanhelsky
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-10-26 00:00:00.000000000 Z
11
+ date: 2023-11-28 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: htauth
@@ -16,56 +16,70 @@ dependencies:
16
16
  requirements:
17
17
  - - '='
18
18
  - !ruby/object:Gem::Version
19
- version: 2.1.1
19
+ version: 2.2.0
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - '='
25
25
  - !ruby/object:Gem::Version
26
- version: 2.1.1
26
+ version: 2.2.0
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: powerpack
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
31
  - - '='
32
32
  - !ruby/object:Gem::Version
33
- version: 0.1.2
33
+ version: 0.1.3
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
38
  - - '='
39
39
  - !ruby/object:Gem::Version
40
- version: 0.1.2
40
+ version: 0.1.3
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: prometheus-client
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
45
  - - '='
46
46
  - !ruby/object:Gem::Version
47
- version: 1.0.0
47
+ version: 4.2.2
48
48
  type: :runtime
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
52
  - - '='
53
53
  - !ruby/object:Gem::Version
54
- version: 1.0.0
54
+ version: 4.2.2
55
+ - !ruby/object:Gem::Dependency
56
+ name: puma
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - '='
60
+ - !ruby/object:Gem::Version
61
+ version: 6.4.0
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - '='
67
+ - !ruby/object:Gem::Version
68
+ version: 6.4.0
55
69
  - !ruby/object:Gem::Dependency
56
70
  name: rack
57
71
  requirement: !ruby/object:Gem::Requirement
58
72
  requirements:
59
73
  - - '='
60
74
  - !ruby/object:Gem::Version
61
- version: 2.2.3
75
+ version: 3.0.8
62
76
  type: :runtime
63
77
  prerelease: false
64
78
  version_requirements: !ruby/object:Gem::Requirement
65
79
  requirements:
66
80
  - - '='
67
81
  - !ruby/object:Gem::Version
68
- version: 2.2.3
82
+ version: 3.0.8
69
83
  description:
70
84
  email: ilya.arkhanhelsky at gmail.com
71
85
  executables:
@@ -118,16 +132,16 @@ require_paths:
118
132
  - lib
119
133
  required_ruby_version: !ruby/object:Gem::Requirement
120
134
  requirements:
121
- - - ">"
135
+ - - ">="
122
136
  - !ruby/object:Gem::Version
123
- version: '2.5'
137
+ version: '3.0'
124
138
  required_rubygems_version: !ruby/object:Gem::Requirement
125
139
  requirements:
126
140
  - - ">="
127
141
  - !ruby/object:Gem::Version
128
142
  version: '0'
129
143
  requirements: []
130
- rubygems_version: 3.2.22
144
+ rubygems_version: 3.4.10
131
145
  signing_key:
132
146
  specification_version: 4
133
147
  summary: Web service to proxy webhooks to Telegram Bot API