archfiend 0.1.0 → 0.1.1

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: 0b0813d059eaad65a6ea778d47c65addabcd400d7a6f726d20f1cbfc1eeb5826
4
- data.tar.gz: 52e45fb839fc32c961a1d9249e190a5ddf952969e1058740bcb28641da7ab651
3
+ metadata.gz: c3da75a32a3781eb07875c29e6fab8396d46816f3edd3f70be40b1ddc82a1a2a
4
+ data.tar.gz: 71991d1c7c54a07cafe05a8f3f84c45967720fb82e79ac54b64be1063ec5d6af
5
5
  SHA512:
6
- metadata.gz: d1a3ff0a951cd8dbca492ee486a131945bdbb014f66621c81bc46aa39629c0ef2e04a90a8fc7e94aac254e57da44a1a626394e19bc5577fdf2271401b95f2545
7
- data.tar.gz: 0d68e0690ed1810f25cb88e7db233597bb048db296ba5c49277bb30c92a47a959828d6fb8f9f91dd0d6e3b755423487a7e329239f7eb7a8a0d39e34e31c4d11b
6
+ metadata.gz: 2c7f72dad45fdbd1a44c4293dc81620fb21641facf6188f4c244a9af634c7ff1133fdd186576146212ef6e6864045e5268607f92b86d0fdfe64818baac8da630
7
+ data.tar.gz: ba6877dce648fb856e9b2a060c78b8ad3a2c8fcd64c181d14e9eebc3bf77e31e5fed41b4499547a5ec68d0a2714478bfe9a2a549f560e98eefd811b6b31ab83f
data/.rubocop.yml CHANGED
@@ -321,3 +321,10 @@ Style/Send:
321
321
 
322
322
  Style/UnneededPercentQ:
323
323
  Enabled: true
324
+
325
+ Style/RegexpLiteral:
326
+ Enabled: false
327
+
328
+ RSpec/FilePath:
329
+ Enabled: false
330
+
data/CHANGES.md CHANGED
@@ -3,7 +3,18 @@
3
3
  All notable changes to this project will be documented in this file, in reverse chronological order.
4
4
 
5
5
  ## [master]
6
- [master]: https://github.com/toptal/archfiend/compare/ca8f30e...HEAD
6
+ [master]: https://github.com/toptal/archfiend/compare/0.1.1...HEAD
7
+
8
+ ## 0.1.1 (2019-01-14)
9
+ [0.1.1]: https://github.com/toptal/archfiend/compare/0.1.0...0.1.1
10
+
11
+ * daemons gem removed in favor of Process.daemon
12
+ * add formatter setting for all loggers
13
+ * fix the usage of Forwardable
14
+ * split requires for runtime and cli phases
15
+
16
+ ## 0.1.0 (2018-10-10)
17
+ [0.1.0]: https://github.com/toptal/archfiend/compare/13d855f...0.1.0
7
18
 
8
19
  ### Changes:
9
20
 
data/Gemfile.lock CHANGED
@@ -1,11 +1,9 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- archfiend (0.1.0)
5
- activesupport
6
- oj
7
- pry
8
- thor
4
+ archfiend (0.1.1)
5
+ oj (~> 3.6)
6
+ thor (~> 0.20)
9
7
 
10
8
  GEM
11
9
  remote: https://rubygems.org/
@@ -63,7 +61,7 @@ GEM
63
61
  jaro_winkler (1.5.1)
64
62
  method_source (0.9.0)
65
63
  minitest (5.11.3)
66
- oj (3.6.7)
64
+ oj (3.7.6)
67
65
  parallel (1.12.1)
68
66
  parser (2.5.1.2)
69
67
  ast (~> 2.4.0)
@@ -87,7 +85,7 @@ GEM
87
85
  diff-lcs (>= 1.2.0, < 2.0)
88
86
  rspec-support (~> 3.8.0)
89
87
  rspec-support (3.8.0)
90
- rubocop (0.58.2)
88
+ rubocop (0.59.2)
91
89
  jaro_winkler (~> 1.5.1)
92
90
  parallel (~> 1.10)
93
91
  parser (>= 2.5, != 2.5.1.1)
@@ -95,10 +93,10 @@ GEM
95
93
  rainbow (>= 2.2.2, < 4.0)
96
94
  ruby-progressbar (~> 1.7)
97
95
  unicode-display_width (~> 1.0, >= 1.0.1)
98
- rubocop-rspec (1.29.1)
96
+ rubocop-rspec (1.30.0)
99
97
  rubocop (>= 0.58.0)
100
98
  ruby-progressbar (1.10.0)
101
- thor (0.20.0)
99
+ thor (0.20.3)
102
100
  thread_safe (0.3.6)
103
101
  tzinfo (1.2.5)
104
102
  thread_safe (~> 0.1)
@@ -108,15 +106,16 @@ PLATFORMS
108
106
  ruby
109
107
 
110
108
  DEPENDENCIES
111
- activerecord
109
+ activerecord (~> 5)
112
110
  archfiend!
113
111
  bundler (~> 1.15)
114
- config
112
+ config (~> 1.7)
115
113
  pg (~> 0.21)
114
+ pry (~> 0.11)
116
115
  rake (~> 10.0)
117
116
  rspec (~> 3.0)
118
- rubocop
119
- rubocop-rspec
117
+ rubocop (~> 0.59)
118
+ rubocop-rspec (~> 1.30)
120
119
 
121
120
  BUNDLED WITH
122
- 1.16.4
121
+ 1.17.1
data/README.md CHANGED
@@ -4,6 +4,7 @@ Archfiend (/ˈɑrtʃˈfind/) - a basic daemon generator. It features boilerplate
4
4
  handles daemonizing, configuration, logging and more. It provides a way to structure backend applications in an organized manner.
5
5
 
6
6
  [![Build Status](https://travis-ci.com/toptal/archfiend.svg?branch=master)](https://travis-ci.com/toptal/archfiend)
7
+ [![Gem Version](https://badge.fury.io/rb/archfiend.svg)](https://badge.fury.io/rb/archfiend)
7
8
 
8
9
  ## Contents
9
10
  * [Getting started](#getting-started)
data/ROADMAP.md CHANGED
@@ -5,7 +5,6 @@ The general goal of this project is to have a low-dependency, solid, pluggable R
5
5
  Ideas include
6
6
  * exhaustive documentation for running (`bin/start`, `bin/console`) and development of generated daemons
7
7
  * method to opt-out from any integrated gem
8
- * removal of `daemons` dependency
9
8
  * removal of `config` dependency
10
9
  * removal of `clockwork` dependency
11
10
  * stand-alone generator option, to generate daemons with no external run time dependencies (with Archfiend base classes baked in)
data/archfiend.gemspec CHANGED
@@ -20,16 +20,15 @@ Gem::Specification.new do |spec|
20
20
  spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
21
21
  spec.require_paths = ['lib']
22
22
 
23
- spec.add_dependency 'activesupport' # CLI
24
- spec.add_development_dependency 'activerecord'
23
+ spec.add_development_dependency 'activerecord', '~> 5' # For specs
25
24
  spec.add_development_dependency 'bundler', '~> 1.15'
26
- spec.add_development_dependency 'config'
27
- spec.add_dependency 'oj'
25
+ spec.add_development_dependency 'config', '~> 1.7'
26
+ spec.add_dependency 'oj', '~> 3.6'
28
27
  spec.add_development_dependency 'pg', '~> 0.21'
29
- spec.add_dependency 'pry'
28
+ spec.add_development_dependency 'pry', '~> 0.11'
30
29
  spec.add_development_dependency 'rake', '~> 10.0'
31
30
  spec.add_development_dependency 'rspec', '~> 3.0'
32
- spec.add_development_dependency 'rubocop'
33
- spec.add_development_dependency 'rubocop-rspec'
34
- spec.add_dependency 'thor' # CLI
31
+ spec.add_development_dependency 'rubocop', '~> 0.59'
32
+ spec.add_development_dependency 'rubocop-rspec', '~> 1.30'
33
+ spec.add_dependency 'thor', '~> 0.20' # CLI
35
34
  end
data/exe/archfiend CHANGED
@@ -1,4 +1,3 @@
1
1
  #!/usr/bin/env ruby
2
- require 'archfiend'
3
-
2
+ require 'archfiend/cli'
4
3
  Archfiend::CLI.start(ARGV)
data/lib/archfiend.rb CHANGED
@@ -1,18 +1,15 @@
1
+ require 'forwardable'
2
+
1
3
  require 'archfiend/version'
2
4
  require 'archfiend/application'
3
5
  require 'archfiend/logging'
4
6
  require 'archfiend/logging/base_formatter'
5
7
  require 'archfiend/logging/default_formatter'
6
- require 'archfiend/logging/json_formatter'
7
8
  require 'archfiend/logging/multi_logger'
8
9
  require 'archfiend/shared_loop/runnable'
9
10
  require 'archfiend/thread_loop'
10
11
  require 'archfiend/subprocess_loop'
11
- require 'archfiend/generators/daemon'
12
- require 'archfiend/generators/options'
13
- require 'archfiend/generators/extensions'
14
- require 'archfiend/generators/utils'
15
- require 'archfiend/cli'
12
+ require 'archfiend/daemon'
16
13
 
17
14
  module Archfiend
18
15
  end
@@ -1,15 +1,14 @@
1
1
  module Archfiend
2
2
  class Application
3
- extend Forwardable
3
+ extend ::Forwardable
4
4
 
5
5
  def_delegators :utils, :logger, :env, :name
6
6
 
7
7
  # The main application entry point, it starts up all the subthreads, all the subprocesses,
8
8
  # registers the exit handler and then it blocks the execution.
9
9
  def run
10
- logger.info 'Starting up'
11
-
12
10
  setup
11
+ logger.info 'Starting up'
13
12
 
14
13
  ThreadLoop.start_all(self)
15
14
  SubprocessLoop.start_all(self)
@@ -80,6 +79,7 @@ module Archfiend
80
79
  def setup_logger
81
80
  logger_level = Settings.logger&.level
82
81
  fail "Please set logger.level setting (#{POSSIBLE_LOGGER_LEVELS.inspect})" unless POSSIBLE_LOGGER_LEVELS.include?(logger_level)
82
+
83
83
  utils.logger.level = logger_level
84
84
  utils.logger.progname = name
85
85
  end
data/lib/archfiend/cli.rb CHANGED
@@ -1,4 +1,13 @@
1
1
  require 'thor'
2
+ require 'pathname'
3
+ require 'forwardable'
4
+ require 'archfiend/version'
5
+ require 'archfiend/generators/daemon'
6
+ require 'archfiend/generators/options'
7
+ require 'archfiend/generators/extensions'
8
+ require 'archfiend/generators/utils'
9
+ require 'archfiend/core_ext/string/camelize'
10
+ require 'archfiend/core_ext/string/underscore'
2
11
 
3
12
  module Archfiend
4
13
  class CLI < Thor
@@ -0,0 +1,17 @@
1
+ module Archfiend
2
+ module String
3
+ module Camelize
4
+ # rubocop:disable Style/PerlBackrefs
5
+ # @return [String] String in the camelized format, first letter capital
6
+ def camelize
7
+ string = sub(/^[a-z\d]*/, &:capitalize)
8
+ string.gsub!(/(?:_|(\/))([a-z\d]*)/i) { "#{$1}#{$2.capitalize}" }
9
+ string.gsub!('/'.freeze, '::'.freeze)
10
+ string
11
+ end
12
+ # rubocop:enable Style/PerlBackrefs
13
+ end
14
+ end
15
+ end
16
+
17
+ String.include(Archfiend::String::Camelize) unless ''.respond_to?(:camelize)
@@ -0,0 +1,19 @@
1
+ module Archfiend
2
+ module String
3
+ module Underscore
4
+ # @return [String] String in the lowercase underscore format
5
+ def underscore
6
+ return self unless /[A-Z-]|::/.match?(self)
7
+
8
+ word = gsub('::'.freeze, '/'.freeze)
9
+ word.gsub!(/([A-Z\d]+)([A-Z][a-z])/, '\1_\2'.freeze)
10
+ word.gsub!(/([a-z\d])([A-Z])/, '\1_\2'.freeze)
11
+ word.tr!('-'.freeze, '_'.freeze)
12
+ word.downcase!
13
+ word
14
+ end
15
+ end
16
+ end
17
+ end
18
+
19
+ String.include(Archfiend::String::Underscore) unless ''.respond_to?(:underscore)
@@ -0,0 +1,91 @@
1
+ module Archfiend
2
+ class Daemon
3
+ DEV_NULL = '/dev/null'.freeze
4
+
5
+ class << self
6
+ def daemonize(pid_file:, log_file:, app_name:, app_env:)
7
+ Process.daemon(nil, true) # Don't close descriptors
8
+ handle_pid_file(pid_file)
9
+ close_io
10
+ redirect_std_io(log_file)
11
+ set_process_title(app_name, app_env)
12
+ srand
13
+ end
14
+
15
+ def set_process_title(app_name, app_env)
16
+ Process.setproctitle "#{app_name} (#{app_env})"
17
+ end
18
+
19
+ def handle_pid_file(pid_file)
20
+ if File.exist?(pid_file)
21
+ msg = "Pid file #{pid_file} already exists, the daemon is already running or " \
22
+ "didn't shut down properly. \nRemove the pid file and try again."
23
+ Process.abort(msg)
24
+ end
25
+
26
+ daemon_pid = Process.pid
27
+ begin
28
+ File.open(pid_file, 'w') { |f| f.puts daemon_pid }
29
+ rescue
30
+ msg = "Pid file creation failed, no permissions to write to #{pid_file}."
31
+ Process.abort(msg)
32
+ end
33
+ at_exit do
34
+ next unless Process.pid == daemon_pid
35
+
36
+ begin
37
+ File.unlink(pid_file)
38
+ rescue
39
+ nil
40
+ end
41
+ end
42
+ end
43
+
44
+ def redirect_std_io(log_file)
45
+ redirect_stdin
46
+ redirect_stdout(log_file)
47
+ redirect_stderr
48
+ end
49
+
50
+ def close_io
51
+ ObjectSpace.each_object(IO) do |io|
52
+ next if [$stdin, $stdout, $stderr].include?(io)
53
+
54
+ begin
55
+ io.close
56
+ rescue
57
+ nil
58
+ end
59
+ end
60
+ 3.upto(8192) do |i|
61
+ begin
62
+ IO.for_fd(i).close
63
+ rescue
64
+ nil
65
+ end
66
+ end
67
+ end
68
+
69
+ private
70
+
71
+ def redirect_stdin
72
+ $stdin.reopen DEV_NULL
73
+ rescue Exception # rubocop:disable Lint/RescueException
74
+ Process.abort('Failed to redirect stdin to dev null')
75
+ end
76
+
77
+ def redirect_stdout(logfile_name)
78
+ $stdout.reopen logfile_name, 'a'
79
+ File.chmod(0o644, logfile_name)
80
+ $stdout.sync = true
81
+ end
82
+
83
+ def redirect_stderr
84
+ $stderr.reopen $stdout
85
+ $stderr.sync = true
86
+ rescue ::Exception # rubocop:disable Lint/RescueException
87
+ Process.abort('Failed to redirect stderr to stdout')
88
+ end
89
+ end
90
+ end
91
+ end
@@ -1,4 +1,3 @@
1
- require 'active_support/inflector'
2
1
  require 'thor'
3
2
 
4
3
  module Archfiend
@@ -129,7 +128,13 @@ module Archfiend
129
128
  end
130
129
 
131
130
  def bundle_install
132
- Bundler.with_clean_env do
131
+ if defined? Bundler
132
+ Bundler.with_clean_env do
133
+ inside daemon_name do
134
+ run 'bundle install'
135
+ end
136
+ end
137
+ else
133
138
  inside daemon_name do
134
139
  run 'bundle install'
135
140
  end
@@ -102,6 +102,9 @@ Lint/UriEscapeUnescape:
102
102
  Lint/Void:
103
103
  Enabled: false
104
104
 
105
+ Metrics/AbcSize:
106
+ Max: 20
107
+
105
108
  Metrics/BlockLength:
106
109
  Enabled: false
107
110
 
@@ -9,7 +9,6 @@ gem 'activerecord-migrations'
9
9
  gem 'archfiend', github: 'toptal/archfiend'
10
10
  gem 'clockwork', require: false
11
11
  gem 'config'
12
- gem 'daemons'
13
12
  gem 'pg', '~> 0.21'
14
13
  gem 'rbtrace', require: false
15
14
 
@@ -1,18 +1,19 @@
1
1
  require File.expand_path('application', __dir__)
2
2
 
3
+ base_dir = File.join(File.expand_path(__dir__), '..')
3
4
  daemon_opts = {
4
- app_name: '<%= daemon_name %>',
5
- log_dir: File.join(File.expand_path(__dir__), 'log'),
6
- logfilename: "#{<%= camelized_daemon_name %>.app.env}.log"
5
+ app_name: '<%= camelized_daemon_name %>',
6
+ app_env: <%= camelized_daemon_name %>.app.env,
7
+ log_file: File.join(base_dir, 'log', "#{<%= camelized_daemon_name %>.app.env}.log"),
8
+ pid_file: File.join(base_dir, '<%= daemon_name %>.pid')
7
9
  }
8
10
 
9
- # Daemons.daemonize closes all file descriptors and prepares the app for the fork.
11
+ # Close all file descriptors and prepare the app for the fork.
10
12
  # Make sure new code doesn't rely on connections / logs etc opened before this call
11
- Daemons.daemonize(daemon_opts)
13
+ Archfiend::Daemon.daemonize(**daemon_opts)
12
14
 
13
15
  # Sets up Settings and many more
14
16
  <%= camelized_daemon_name %>.app.setup
15
- Process.setproctitle "#{Settings.app_name} (#{<%= camelized_daemon_name %>.app.env})"
16
17
 
17
18
  # Runs the actual application
18
19
  <%= camelized_daemon_name %>.app.run
@@ -3,6 +3,9 @@ app_name: <%= camelized_daemon_name %>
3
3
  logger:
4
4
  # :debug, :info, :error, :fatal, :unknown
5
5
  level: :info
6
+ formatter:
7
+ file: 'JSONFormatter'
8
+ stdout: 'DefaultFormatter'
6
9
 
7
10
  debug:
8
11
  rbtrace: false
@@ -1,5 +1,2 @@
1
- logger:
2
- level: :info
3
-
4
1
  debug:
5
2
  rbtrace: true
@@ -60,6 +60,7 @@ module Archfiend
60
60
  def generator_extensions
61
61
  @generator_extensions ||= @extensions.map do |extension_module|
62
62
  next unless extension_module.const_defined?(generator_extensions_class_name)
63
+
63
64
  extension_klass = extension_module.const_get(generator_extensions_class_name)
64
65
  next if extension_klass.respond_to?(:target_generator_name) && extension_klass.target_generator_name != @generator_name
65
66
 
@@ -4,7 +4,7 @@ require 'optparse'
4
4
  module Archfiend
5
5
  module Generators
6
6
  class Options
7
- extend Forwardable
7
+ extend ::Forwardable
8
8
  SETTINGS_FILE = '.archfiend'.freeze
9
9
 
10
10
  def_delegators :@options, :extensions
@@ -1,9 +1,13 @@
1
1
  require 'logger'
2
- require 'oj'
3
2
 
4
3
  module Archfiend
5
4
  class Logging
6
5
  class << self
6
+ DEFAULT_FORMATTERS = {
7
+ file: 'JSONFormatter',
8
+ stdout: 'DefaultFormatter'
9
+ }.freeze
10
+
7
11
  # @param environment [String|Symbol] Current running environment, ex. :development
8
12
  # @param log_directory [String,Pathname] Directory in which the logfile is supposed to live
9
13
  # @param quiet [Boolean] Whether the STDOUT development output should be suppressed
@@ -21,7 +25,7 @@ module Archfiend
21
25
  def file_logger(environment, log_directory)
22
26
  log_name = File.join(log_directory, "#{environment}.log")
23
27
  file_logger = Logger.new(log_name, 'daily')
24
- file_logger.formatter = JSONFormatter.new
28
+ file_logger.formatter = formatter_from_settings(:file)
25
29
  file_logger
26
30
  end
27
31
 
@@ -30,9 +34,30 @@ module Archfiend
30
34
  stdout_io.sync = true
31
35
  stdout_logger = Logger.new(stdout_io)
32
36
 
33
- stdout_logger.formatter = DefaultFormatter.new
37
+ stdout_logger.formatter = formatter_from_settings(:stdout)
34
38
  stdout_logger
35
39
  end
40
+
41
+ # @param type [Symbol] :file or :stdout
42
+ # @return [Logging::BaseFormatter] a formatter instance
43
+ def formatter_from_settings(type)
44
+ formatter_name = Settings.logger.dig(:formatter, type) || DEFAULT_FORMATTERS.fetch(type)
45
+
46
+ instantiate_formatter(formatter_name)
47
+ end
48
+
49
+ def instantiate_formatter(name)
50
+ return Archfiend::Logging.const_get(name).new if Archfiend::Logging.const_defined?(name)
51
+
52
+ possible_formatter_source = File.join('logging', name.underscore)
53
+ require_relative(possible_formatter_source)
54
+
55
+ Archfiend::Logging.const_get(name).new
56
+ rescue StandardError, LoadError => e
57
+ puts "Unable to load log formatter #{name.inspect}."
58
+ puts "\nException: #{e.message}"
59
+ exit 1
60
+ end
36
61
  end
37
62
  end
38
63
  end
@@ -1,3 +1,5 @@
1
+ require 'oj'
2
+
1
3
  module Archfiend
2
4
  class Logging
3
5
  # A JSON log formatter class, returns each entry as a JSON line
@@ -1,6 +1,6 @@
1
1
  module Archfiend
2
2
  class SubprocessLoop
3
- extend Forwardable
3
+ extend ::Forwardable
4
4
  include SharedLoop::Runnable
5
5
 
6
6
  EXCEPTION_DELAY = 1 # Seconds to sleep for after rescuing recoverable exception
@@ -33,6 +33,7 @@ module Archfiend
33
33
 
34
34
  def kill_all
35
35
  return if !@subprocess_pids || @subprocess_pids.empty?
36
+
36
37
  @subprocess_pids.each do |spid|
37
38
  begin
38
39
  Process.kill('TERM', spid)
@@ -1,6 +1,6 @@
1
1
  module Archfiend
2
2
  class ThreadLoop
3
- extend Forwardable
3
+ extend ::Forwardable
4
4
  include SharedLoop::Runnable
5
5
 
6
6
  EXCEPTION_DELAY = 1 # Seconds to sleep for after rescuing recoverable exception
@@ -1,3 +1,3 @@
1
1
  module Archfiend
2
- VERSION = '0.1.0'.freeze
2
+ VERSION = '0.1.1'.freeze
3
3
  end
@@ -0,0 +1,44 @@
1
+ require 'json'
2
+
3
+ module Checks
4
+ class Footprint
5
+ def check(name, require_string, max_rss, max_ms)
6
+ puts "Checking footprint of #{name}"
7
+
8
+ summary_entry = footprint_json(require_string).find { |entry| entry['name'] == require_string }
9
+ unless summary_entry
10
+ puts "Failed finding the summary entry of #{require_string} in #{footprint_json.inspect}"
11
+ exit 1
12
+ end
13
+
14
+ check_rss(name, summary_entry, max_rss)
15
+ check_time(name, summary_entry, max_ms)
16
+ end
17
+
18
+ private
19
+
20
+ def check_rss(name, entry, max)
21
+ puts "Archfiend #{name} RSS #{entry['rss']['mean']}"
22
+ return if entry['rss']['mean'] < max
23
+
24
+ puts "Exceeds maximal allowed #{max}"
25
+ exit 1
26
+ end
27
+
28
+ def check_time(name, entry, max)
29
+ puts "Archfiend #{name} require time #{entry['time']['mean']}ms"
30
+ return if entry['time']['mean'] < max
31
+
32
+ puts "Exceeds maximal allowed #{max}"
33
+ exit 1
34
+ end
35
+
36
+ def run_checker(require_string)
37
+ `RUBYLIB=./lib analyze_requires -r -f json -n 100 archfiend #{require_string}`
38
+ end
39
+
40
+ def footprint_json(require_string)
41
+ JSON.parse(run_checker(require_string))
42
+ end
43
+ end
44
+ end
@@ -11,3 +11,4 @@ def system!(*args)
11
11
  end
12
12
 
13
13
  system('bundle check --gemfile=Gemfile') || system!('bundle install --jobs=3 --retry=3 --gemfile=Gemfile')
14
+ system!('gem install gem_footprint_analyzer')
@@ -6,6 +6,12 @@
6
6
  require 'pathname'
7
7
  require 'fileutils'
8
8
 
9
+ require_relative 'checks/footprint'
10
+
11
+ MAX_RSS = 10_000
12
+ MAX_TIME = 100
13
+ MAX_CLI_TIME = 350
14
+
9
15
  archfiend_root = Pathname.new File.expand_path(File.join('..', '..'), __dir__)
10
16
 
11
17
  def system!(*args)
@@ -15,12 +21,21 @@ end
15
21
  system!('BUNDLE_GEMFILE=Gemfile bundle exec rubocop')
16
22
  system!('BUNDLE_GEMFILE=Gemfile bundle exec rspec')
17
23
 
18
- system!('mkdir testing')
24
+ footprint_checker = Checks::Footprint.new
25
+ footprint_checker.check('RunTime', './lib/archfiend', MAX_RSS, MAX_TIME)
26
+ footprint_checker.check('CLI', './lib/archfiend/cli', MAX_RSS, MAX_CLI_TIME)
19
27
 
28
+ system!('mkdir testing')
20
29
  FileUtils.chdir(archfiend_root.join('testing')) do
21
30
  system!('bundle exec archfiend new foo_bar')
22
31
  end
23
32
 
33
+ FileUtils.chdir(archfiend_root.join('testing', 'foo_bar')) do
34
+ system!(%(sed -i s/.*''archfiend''.*// Gemfile)) # Remove the existing archfiend entry
35
+ File.open('Gemfile', 'a') { |f| f.puts "gem 'archfiend', path: '../..'" } # Use the local gem
36
+ system!('bundle install')
37
+ end
38
+
24
39
  database_yml = '
25
40
  test:
26
41
  adapter: postgresql
metadata CHANGED
@@ -1,43 +1,29 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: archfiend
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.1.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Maciek Dubiński
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2018-10-10 00:00:00.000000000 Z
11
+ date: 2019-01-14 00:00:00.000000000 Z
12
12
  dependencies:
13
- - !ruby/object:Gem::Dependency
14
- name: activesupport
15
- requirement: !ruby/object:Gem::Requirement
16
- requirements:
17
- - - ">="
18
- - !ruby/object:Gem::Version
19
- version: '0'
20
- type: :runtime
21
- prerelease: false
22
- version_requirements: !ruby/object:Gem::Requirement
23
- requirements:
24
- - - ">="
25
- - !ruby/object:Gem::Version
26
- version: '0'
27
13
  - !ruby/object:Gem::Dependency
28
14
  name: activerecord
29
15
  requirement: !ruby/object:Gem::Requirement
30
16
  requirements:
31
- - - ">="
17
+ - - "~>"
32
18
  - !ruby/object:Gem::Version
33
- version: '0'
19
+ version: '5'
34
20
  type: :development
35
21
  prerelease: false
36
22
  version_requirements: !ruby/object:Gem::Requirement
37
23
  requirements:
38
- - - ">="
24
+ - - "~>"
39
25
  - !ruby/object:Gem::Version
40
- version: '0'
26
+ version: '5'
41
27
  - !ruby/object:Gem::Dependency
42
28
  name: bundler
43
29
  requirement: !ruby/object:Gem::Requirement
@@ -56,30 +42,30 @@ dependencies:
56
42
  name: config
57
43
  requirement: !ruby/object:Gem::Requirement
58
44
  requirements:
59
- - - ">="
45
+ - - "~>"
60
46
  - !ruby/object:Gem::Version
61
- version: '0'
47
+ version: '1.7'
62
48
  type: :development
63
49
  prerelease: false
64
50
  version_requirements: !ruby/object:Gem::Requirement
65
51
  requirements:
66
- - - ">="
52
+ - - "~>"
67
53
  - !ruby/object:Gem::Version
68
- version: '0'
54
+ version: '1.7'
69
55
  - !ruby/object:Gem::Dependency
70
56
  name: oj
71
57
  requirement: !ruby/object:Gem::Requirement
72
58
  requirements:
73
- - - ">="
59
+ - - "~>"
74
60
  - !ruby/object:Gem::Version
75
- version: '0'
61
+ version: '3.6'
76
62
  type: :runtime
77
63
  prerelease: false
78
64
  version_requirements: !ruby/object:Gem::Requirement
79
65
  requirements:
80
- - - ">="
66
+ - - "~>"
81
67
  - !ruby/object:Gem::Version
82
- version: '0'
68
+ version: '3.6'
83
69
  - !ruby/object:Gem::Dependency
84
70
  name: pg
85
71
  requirement: !ruby/object:Gem::Requirement
@@ -98,16 +84,16 @@ dependencies:
98
84
  name: pry
99
85
  requirement: !ruby/object:Gem::Requirement
100
86
  requirements:
101
- - - ">="
87
+ - - "~>"
102
88
  - !ruby/object:Gem::Version
103
- version: '0'
104
- type: :runtime
89
+ version: '0.11'
90
+ type: :development
105
91
  prerelease: false
106
92
  version_requirements: !ruby/object:Gem::Requirement
107
93
  requirements:
108
- - - ">="
94
+ - - "~>"
109
95
  - !ruby/object:Gem::Version
110
- version: '0'
96
+ version: '0.11'
111
97
  - !ruby/object:Gem::Dependency
112
98
  name: rake
113
99
  requirement: !ruby/object:Gem::Requirement
@@ -140,44 +126,44 @@ dependencies:
140
126
  name: rubocop
141
127
  requirement: !ruby/object:Gem::Requirement
142
128
  requirements:
143
- - - ">="
129
+ - - "~>"
144
130
  - !ruby/object:Gem::Version
145
- version: '0'
131
+ version: '0.59'
146
132
  type: :development
147
133
  prerelease: false
148
134
  version_requirements: !ruby/object:Gem::Requirement
149
135
  requirements:
150
- - - ">="
136
+ - - "~>"
151
137
  - !ruby/object:Gem::Version
152
- version: '0'
138
+ version: '0.59'
153
139
  - !ruby/object:Gem::Dependency
154
140
  name: rubocop-rspec
155
141
  requirement: !ruby/object:Gem::Requirement
156
142
  requirements:
157
- - - ">="
143
+ - - "~>"
158
144
  - !ruby/object:Gem::Version
159
- version: '0'
145
+ version: '1.30'
160
146
  type: :development
161
147
  prerelease: false
162
148
  version_requirements: !ruby/object:Gem::Requirement
163
149
  requirements:
164
- - - ">="
150
+ - - "~>"
165
151
  - !ruby/object:Gem::Version
166
- version: '0'
152
+ version: '1.30'
167
153
  - !ruby/object:Gem::Dependency
168
154
  name: thor
169
155
  requirement: !ruby/object:Gem::Requirement
170
156
  requirements:
171
- - - ">="
157
+ - - "~>"
172
158
  - !ruby/object:Gem::Version
173
- version: '0'
159
+ version: '0.20'
174
160
  type: :runtime
175
161
  prerelease: false
176
162
  version_requirements: !ruby/object:Gem::Requirement
177
163
  requirements:
178
- - - ">="
164
+ - - "~>"
179
165
  - !ruby/object:Gem::Version
180
- version: '0'
166
+ version: '0.20'
181
167
  description: A tool to simplify creation and development of Ruby daemons.
182
168
  email:
183
169
  - maciek@dubinski.net
@@ -206,6 +192,9 @@ files:
206
192
  - lib/archfiend.rb
207
193
  - lib/archfiend/application.rb
208
194
  - lib/archfiend/cli.rb
195
+ - lib/archfiend/core_ext/string/camelize.rb
196
+ - lib/archfiend/core_ext/string/underscore.rb
197
+ - lib/archfiend/daemon.rb
209
198
  - lib/archfiend/generators/daemon.rb
210
199
  - lib/archfiend/generators/daemon/templates/.rspec
211
200
  - lib/archfiend/generators/daemon/templates/.rubocop.yml
@@ -251,6 +240,7 @@ files:
251
240
  - lib/archfiend/subprocess_loop.rb
252
241
  - lib/archfiend/thread_loop.rb
253
242
  - lib/archfiend/version.rb
243
+ - scripts/travis/checks/footprint.rb
254
244
  - scripts/travis/install
255
245
  - scripts/travis/script
256
246
  homepage: https://github.com/toptal/archfiend