site_hook 0.8.2 → 0.9.3

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.
Files changed (58) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +1 -1
  3. data/.rspec +0 -2
  4. data/.rubocop.yml +2 -0
  5. data/Gemfile +1 -5
  6. data/Rakefile +35 -3
  7. data/bin/site_hook +5 -1
  8. data/features/get_help.feature +3 -0
  9. data/features/step_definitions/get_help_step_definition.rb +1 -0
  10. data/features/step_definitions/my_steps.rb +3 -0
  11. data/features/support/env.rb +1 -0
  12. data/lib/site_hook.rb +2 -28
  13. data/lib/site_hook/cli.rb +22 -39
  14. data/lib/site_hook/commands/config_class.rb +22 -68
  15. data/lib/site_hook/commands/jekyll_class.rb +38 -0
  16. data/lib/site_hook/commands/server_class.rb +38 -34
  17. data/lib/site_hook/config.rb +390 -14
  18. data/lib/site_hook/config_sections.rb +60 -9
  19. data/lib/site_hook/deprecate.rb +34 -11
  20. data/lib/site_hook/env/env.rb +2 -0
  21. data/lib/site_hook/exceptions.rb +26 -2
  22. data/lib/site_hook/log.rb +20 -15
  23. data/lib/site_hook/logger.rb +94 -173
  24. data/lib/site_hook/loggers.rb +10 -0
  25. data/lib/site_hook/loggers/access.rb +20 -0
  26. data/lib/site_hook/loggers/app.rb +78 -0
  27. data/lib/site_hook/loggers/build.rb +77 -0
  28. data/lib/site_hook/loggers/fake.rb +52 -0
  29. data/lib/site_hook/loggers/git.rb +81 -0
  30. data/lib/site_hook/loggers/hook.rb +74 -0
  31. data/lib/site_hook/methods.rb +26 -0
  32. data/lib/site_hook/paths.rb +65 -2
  33. data/lib/site_hook/prelogger.rb +88 -0
  34. data/lib/site_hook/prompt.rb +14 -0
  35. data/lib/site_hook/prompts/prompt_project.rb +48 -0
  36. data/lib/site_hook/runner.rb +36 -0
  37. data/lib/site_hook/sender.rb +4 -9
  38. data/lib/site_hook/string_ext.rb +57 -0
  39. data/lib/site_hook/version.rb +2 -2
  40. data/lib/site_hook/webhook.rb +120 -129
  41. data/site_hook.gemspec +39 -22
  42. data/spec/spec_helper.rb +13 -0
  43. data/spec/string_ext_spec.rb +10 -0
  44. metadata +87 -85
  45. data/CODE_OF_CONDUCT.md +0 -74
  46. data/bin/console +0 -14
  47. data/lib/site_hook/assets/css/styles.css +0 -26
  48. data/lib/site_hook/commands/debug_class.rb +0 -29
  49. data/lib/site_hook/config_sections/cli.rb +0 -24
  50. data/lib/site_hook/config_sections/log_levels.rb +0 -15
  51. data/lib/site_hook/config_sections/projects.rb +0 -22
  52. data/lib/site_hook/const.rb +0 -10
  53. data/lib/site_hook/gem.rb +0 -26
  54. data/lib/site_hook/persist.rb +0 -14
  55. data/lib/site_hook/prompts/gen_config.rb +0 -48
  56. data/lib/site_hook/spinner.rb +0 -19
  57. data/lib/site_hook/views/layout.haml +0 -24
  58. data/lib/site_hook/views/webhooks.haml +0 -7
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 844ddfd7d31478570b837f2de7e706734af8e27dfa5d84b0d8a2d76e81a02507
4
- data.tar.gz: 565cb3b88ee38759021e97d971f930294372fcb2f0cfaf7cb299fde0083d12b3
3
+ metadata.gz: 841978508b6330f36437b9ac39b99ed2eb0c94492838bc748bb870688c4cb203
4
+ data.tar.gz: 387b84aaab26fda6cdb6459f181b0e2346ca89b36d474b18a8be0319d05cf16b
5
5
  SHA512:
6
- metadata.gz: 7c4aa23aaa6c362d0729dfe0ff516298576c595392cc45ba71f1008c121e5bea73209f2af9fd7c481bfad13174bab82782803f41cdb9984b0171fac3a72609e8
7
- data.tar.gz: ef40727c70ca067f8b7c3fd5eb16cbf7c1fe38f7eecc8051b247dc4b9e676c8bfb024f5e204249eae06c05b6dc984698374d574c0728f0748511df40ecd99e62
6
+ metadata.gz: f50358cdb39cec2d31904cf59d710814c776e810e71b6a30e8fdf880a0a92edc37a1c9f484d3ed207c97e6367f72ebaedb0e5bfa3b5f2cd77d679b0ef94b0c31
7
+ data.tar.gz: '04987f3d4c2f78d5f0cd42711bd1da021a87017e532c5225a6b8c170a3160a1f44ab233d0f8202e5261023e29f6ec7634a028cfba0f7d30ddda3e1f8c5dfcf2c'
data/.gitignore CHANGED
@@ -11,6 +11,6 @@
11
11
  /vendor
12
12
  # rspec failure tracking
13
13
  .rspec_status
14
- Gemfile.lock
14
+ /Gemfile.lock
15
15
  vendor/
16
16
  /.scannerwork
data/.rspec CHANGED
@@ -1,3 +1 @@
1
1
  --format documentation
2
- --color
3
- --require spec_helper
@@ -9,4 +9,6 @@ Metrics/ClassLength:
9
9
  Metrics/AbcSize:
10
10
  Enabled: false
11
11
  Metrics/LineLength:
12
+ Enabled: false
13
+ Lint/HandleExceptions:
12
14
  Enabled: false
data/Gemfile CHANGED
@@ -1,8 +1,4 @@
1
1
  source "https://rubygems.org"
2
-
3
- git_source(:github) {|repo_name| "https://github.com/#{repo_name}" }
4
- group :dev do
5
- gem 'pry', '~> 0.12.2'
6
- end
2
+ # git_source(:github) {|repo_name| "https://github.com/#{repo_name}" }
7
3
  # Specify your gem's dependencies in site_hook.gemspec
8
4
  gemspec
data/Rakefile CHANGED
@@ -1,6 +1,38 @@
1
1
  require "bundler/gem_tasks"
2
- require "rspec/core/rake_task"
2
+ require 'rake/testtask'
3
3
 
4
- RSpec::Core::RakeTask.new(:test)
4
+ begin
5
+ require 'cucumber/rake/task'
6
+ Cucumber::Rake::Task.new(:cucumber, 'cucumber features')
7
+ rescue LoadError
8
+ # Don't worry about empty rescue
9
+ end
5
10
 
6
- task :default => :test
11
+
12
+ begin
13
+ require 'rspec/core/rake_task'
14
+ RSpec::Core::RakeTask.new(:spec) do |t|
15
+ t.pattern = 'spec/**/*_spec.rb'
16
+ end
17
+ rescue LoadError
18
+ # Don't worry about empty rescue
19
+ end
20
+
21
+ require 'rake'
22
+ require 'bundler'
23
+ Bundler.setup
24
+ require 'grape-route-helpers'
25
+ require 'grape-route-helpers/tasks'
26
+ require 'grape-raketasks'
27
+ require 'grape-raketasks/tasks'
28
+
29
+ desc 'load the Rake environment.'
30
+ task :environment do
31
+ require File.expand_path('lib/site_hook/env/env.rb', File.dirname(__FILE__))
32
+ end
33
+
34
+ desc "Run tests and setup"
35
+ tasks = %i[spec cucumber]
36
+ task default: tasks
37
+ desc 'run tests'
38
+ task tests: %i[spec cucumber]
@@ -1,3 +1,7 @@
1
1
  #!/usr/bin/env ruby
2
+ require 'site_hook/runner'
2
3
  require 'site_hook'
3
- exit SiteHook::App.run(ARGV)
4
+ $threads = []
5
+
6
+ app = SiteHook::Runner.new(ARGV, STDIN, STDOUT, STDERR, Kernel)
7
+ app.execute!
@@ -0,0 +1,3 @@
1
+ Feature: Get help via the command line
2
+ Scenario: Get Help
3
+ When I run the following commands with `bundle exec bin\/site_hook`
@@ -0,0 +1,3 @@
1
+ Given(/^I run the following commands with `bundle exec bin\/site_hook`$/) do
2
+
3
+ end
@@ -0,0 +1 @@
1
+ require 'aruba/cucumber'
@@ -1,29 +1,3 @@
1
- # frozen_string_literal: true
2
-
3
- require 'site_hook/version'
4
- require 'site_hook/sender'
5
- require 'site_hook/gem'
6
- require 'site_hook/log'
7
- require 'site_hook/logger'
8
- require 'site_hook/spinner'
9
- require 'recursive-open-struct'
10
1
  require 'site_hook/cli'
11
- require 'sinatra'
12
- require 'haml'
13
- require 'json'
14
- require 'sinatra/json'
15
- require 'yaml'
16
-
17
- module SiteHook
18
- autoload :Logs, 'site_hook/log'
19
- autoload :Gem, 'site_hook/gem'
20
- autoload :Paths, 'site_hook/paths'
21
- # class CoffeeHandler (inherits from Sinatra::Base)
22
- class CoffeeHandler < Sinatra::Base
23
- set :views, Pathname(app_file).dirname.join('site_hook', 'static', 'coffee').to_s
24
- get '/js/*.js' do
25
- filename = params[:splat].first
26
- coffee filename.to_sym
27
- end
28
- end
29
- end
2
+ require 'highline'
3
+ HighLine::Menu.index_color = :rgb_84DE02
@@ -1,48 +1,31 @@
1
- require 'gli'
1
+ require 'thor'
2
2
  require 'highline'
3
3
  require 'paint'
4
4
  require 'pathname'
5
+ require 'site_hook/paths'
5
6
  require 'site_hook/exceptions'
6
7
  require 'site_hook/deprecate'
8
+ commands = SiteHook::Paths.lib_dir.join('site_hook/commands').children
9
+ commands.each do |filename|
10
+ next if filename == '.' or filename == '..'
11
+ f = filename.dirname
12
+ require "#{f + filename.basename('.*')}"
13
+ end
14
+
7
15
  module SiteHook
8
- class App
9
- extend GLI::App
10
- version SiteHook::VERSION
11
- # don't use config_file just use ~/.shrc/config's cli:...
12
- # projects are in .shrc/config
13
- commands_from 'site_hook/commands'
14
- desc 'Print info on the gem.'
15
- command 'gem-info' do |c|
16
- c.action do |global_options, options, arguments|
17
- @hl.say "Gem Name: #{SiteHook::Gem::Info.name}"
18
- @hl.say "Gem Constant: #{SiteHook::Gem::Info.constant_name}"
19
- @hl.say "Gem Author: #{SiteHook::Gem::Info.author}"
20
- @hl.say "Gem Version: v#{SiteHook::VERSION}"
21
- end
22
- end
23
- around do |global_options, command, options, args, code|
24
- @config_hash = YAML.load_file(SiteHook::Paths.config) || YAML.load_file(SiteHook::Paths.old_config)
25
- @hl = HighLine.new(STDIN, STDOUT, 80, 1, 2, 0)
26
- code.call
16
+ class CLI < Thor
17
+ desc '--version, -v', 'returns version and exits'
18
+ def __version
19
+ puts SiteHook::VERSION
27
20
  end
28
- pre do |global_options, command, options, args|
29
- if SiteHook::Paths.old_config.exist?
30
- continue = SiteHook::Deprecation.deprecate(
31
- "#{SiteHook::Paths.old_config.to_s} is deprecated in favor of #{SiteHook::Paths.config}",
32
- <<~INSTRUCT,
33
- Please run `#{exe_name} config upgrade-shrc` to rectify this.
34
- Once version 1.0.0 is released, #{SiteHook::Paths.config} will
35
- be the only config file option, and #{SiteHook::Paths.old_config} will not be allowed.
36
- any existance of ~/.jph after the 1.0.0 release will result in an Exception being raised.
37
- Once the exception is raised, site_hook will exit and return a 99 status code.
38
- INSTRUCT
39
- true
21
+ map ['-v', '--version'] => :__version
22
+
23
+ desc 'config [subcommand] [options]', 'configure site_hook'
24
+ subcommand('config', SiteHook::Commands::ConfigClass)
25
+ desc 'server [subcommand] [options]', 'run server actions'
26
+ subcommand('server', SiteHook::Commands::ServerClass)
27
+ desc 'jekyll [subcommand] [options]', 'run jekyll actions'
28
+ subcommand('jekyll', SiteHook::Commands::JekyllClass)
40
29
 
41
- )
42
- continue
43
- else
44
- # don't do anything
45
- end
46
- end
47
30
  end
48
- end
31
+ end
@@ -1,81 +1,35 @@
1
- require 'gli'
2
- require 'highline'
1
+ require 'thor'
3
2
  require 'random_password'
4
- require 'yaml'
5
- require 'site_hook/config'
3
+ require 'site_hook/config_sections'
6
4
  module SiteHook
5
+ module Commands
7
6
 
7
+ class ConfigClass < Thor
8
+ # def __version
9
+ # puts SiteHook::VERSION
10
+ # end
11
+ # map ['-v', '--version'] => __version
8
12
 
9
- # *ConfigClass*
10
- #
11
- # Holds all of the commands for the config subcommand
12
- class App
13
- extend GLI::App
13
+ desc 'gen [options]', 'generate a sample config'
14
14
 
15
- desc 'Configure site_hook options'
15
+ def gen
16
+ if SiteHook::Paths.default_config.exist?
17
+ puts SiteHook::ConfigSections.all_samples
18
+ end
16
19
 
17
- # rubocop:disable Metrics/AbcSize
18
- command 'config' do |c|
19
- c.command 'gen' do |gen|
20
- gen.desc "Generate a example config file if one doesn't exist"
21
- gen.action do |global_options, options, arguments|
20
+ end
22
21
 
23
- yaml = [
24
- '# fatal, error, warn, info, debug',
25
- 'log_levels:',
26
- ' hook: info',
27
- ' build: info',
28
- ' git: info',
29
- ' app: info',
22
+ desc 'mkpass [options]', 'create a hook password'
23
+ method_option(:length, type: :numeric, banner: 'LENGTH', aliases: ['-l'], default: 20)
30
24
 
31
- ]
32
- shrc = SiteHook::Paths.config
33
- if shrc.exist?
34
- puts "#{shrc} exists. Will not overwrite."
35
- else
36
- File.open(shrc, 'w') do |f|
37
- yaml.each do |line|
38
- f.puts line
39
- end
40
- end
41
- say "Created #{shrc}"
42
- say "You can now edit #{shrc} and add your projects."
43
- end
44
- end
25
+ def mkpass
26
+ puts RandomPassword.new(length: options[:length]).generate
45
27
  end
46
- desc 'generates a project block'
47
- c.command 'gen-project' do |gen_project|
48
- gen_project.action do |global_options, options, arguments|
49
- SiteHook::NotImplemented.declare(gen_project)
50
- # puts tpl
51
- end
52
- end
53
- c.command 'add-project' do |add_project|
54
- add_project.action do |global_options, options, arguments|
55
- # @config_hash = SiteHook::Config::Set.new(SiteHook::Paths.config)
56
- SiteHook::NotImplemented.declare(add_project)
57
- end
58
- end
59
-
60
- c.command 'mkpass' do |mkpass|
61
- mkpass.flag('symbol-amt', arg_name: 'AMT', type: Integer, default_value: 0)
62
- mkpass.flag('length', arg_name: 'LENGTH', type: Integer, default_value: 10)
63
- mkpass.action do |global_options, options, arguments|
64
28
 
65
- if (8..255).include?(options[:length])
66
- if (0..128).member?(options[:'symbol-amt'])
67
- puts RandomPassword.generate(length: options[:length], symbols: options['symbol-amt'])
68
- else
69
- help_now! "Symbols amount must be between '0' and '128'."
70
- end
71
- else
72
- help_now! "Length must be a positive 'Integer' between '8' and '255'"
73
- end
74
- end
29
+ desc 'inspect [options]', 'output the configuration'
30
+ def inspect
31
+ puts SiteHook::Config.new.inspect
75
32
  end
76
33
  end
77
34
  end
78
- end
79
-
80
-
81
- # rubocop:enable Metrics/AbcSize
35
+ end
@@ -0,0 +1,38 @@
1
+ require 'thor'
2
+ require 'random_password'
3
+ require 'site_hook/config_sections'
4
+ require 'site_hook/sender'
5
+ module SiteHook
6
+ module Commands
7
+
8
+ class JekyllClass < Thor
9
+ # def __version
10
+ # puts SiteHook::VERSION
11
+ # end
12
+ # map ['-v', '--version'] => __version
13
+
14
+ desc 'build [options]', 'build sites'
15
+
16
+ def build(project_name)
17
+ if SiteHook::Paths.default_config.exist?
18
+ begin
19
+ project = SiteHook::Config.projects.send(StrExt.mkvar(project_name))
20
+ jekyll_status = SiteHook::Senders::Jekyll.build(project['src'], project['dst'], SiteHook::Log::Build, options: {config: project['config']})
21
+ end
22
+ end
23
+ end
24
+
25
+ desc 'mkpass [options]', 'create a hook password'
26
+ method_option(:length, type: :numeric, banner: 'LENGTH', aliases: ['-l'], default: 20)
27
+
28
+ def mkpass
29
+ puts RandomPassword.new(length: options[:length]).generate
30
+ end
31
+
32
+ desc 'inspect [options]', 'output the configuration'
33
+ def inspect
34
+ puts SiteHook::Config.new.inspect
35
+ end
36
+ end
37
+ end
38
+ end
@@ -1,39 +1,43 @@
1
- ##########
2
- # -> File: /home/ken/RubymineProjects/site_hook/lib/site_hook/config_class.1.rb
3
- # -> Project: site_hook
4
- # -> Author: Ken Spencer <me@iotaspencer.me>
5
- # -> Last Modified: 1/10/2018 21:45:36
6
- # -> Copyright (c) 2018 Ken Spencer
7
- # -> License: MIT
8
- ##########
9
- require 'site_hook/persist'
10
- require 'site_hook/paths'
11
- require 'site_hook/const'
12
- require 'gli'
1
+ require 'thor'
2
+ require 'grape'
3
+ require 'grape-route-helpers'
4
+ require 'site_hook/webhook'
5
+ require 'rack'
6
+ require 'site_hook/config'
7
+ SiteHook::Config.new
13
8
  module SiteHook
14
- autoload :Webhook, 'site_hook/webhook'
15
- SHRC = YAML.load_file(SiteHook::Paths.config) || YAML.load_file(SiteHook::Paths.old_config)
16
- # *ServerClass*
17
- #
18
- # Holds all of the commands for the config subcommand
19
- class App
20
- extend GLI::App
21
-
22
- command 'server' do |c|
23
- c.desc 'Start the server'
24
- c.command 'listen' do |listen|
25
- listen.desc 'Start SiteHook'
26
- listen.flag :log_levels, type: :hash, arg_name: 'LEVELS', default: SiteHook::Logs.log_levels
27
- listen.flag :host, type: :string, arg_name: 'BINDHOST', default: SHRC.fetch('host', '127.0.0.1')
28
- listen.flag :port, type: :numeric, arg_name: 'BINDPORT', default: SHRC.fetch('port', 9090)
29
- listen.action do |global_options, options, arguments|
30
- SiteHook::Webhook.set_options(options[:host], options[:port])
31
- SiteHook.mklogdir unless SiteHook::Paths.logs.exist?
32
- SiteHook::Webhook.run!
9
+ module Commands
10
+ class ServerClass < Thor
11
+ # def __version
12
+ # puts SiteHook::VERSION
13
+ # end
14
+ # map ['-v', '--version'] => __version
15
+ method_option(:host, banner: 'HOST', aliases: ['-h'], type: :string, default: SiteHook::Config.webhook.host)
16
+ method_option(:port, banner: 'PORT', aliases: ['-p'], type: :numeric, default: SiteHook::Config.webhook.port)
17
+ desc 'listen [options]', ''
18
+ def listen
19
+ $threads << Thread.new do
20
+ Rack::Server.start(
21
+ app: SiteHook::Server,
22
+ Host: options[:host],
23
+ Port: options[:port],
24
+ debug: true
25
+ )
33
26
  end
27
+ $threads << Thread.new do
28
+ loop do
29
+ case $stdin.gets
30
+ when "reload\n"
31
+ ::SiteHook::Config.reload!
32
+ when "quit\n"
33
+ $threads.each do |thr|
34
+ thr == Thread.current ? exit(0) : thr.exit
35
+ end
36
+ end
37
+ end
38
+ end
39
+ $threads.each(&:join)
34
40
  end
35
41
  end
36
-
37
42
  end
38
- end
39
- # rubocop:enable Metrics/AbcSize
43
+ end
@@ -1,23 +1,399 @@
1
1
  require 'site_hook/paths'
2
- require 'recursive_open_struct'
3
-
2
+ require 'yaml'
3
+ require 'site_hook/string_ext'
4
+ require 'site_hook/prelogger'
4
5
  module SiteHook
5
6
  class Config
6
- class Get
7
- attr_reader :raw_config, :parsed_config, :config
8
- def initialize(cfg_path = Pathname.new(SiteHook::Paths.config || SiteHook::Paths.old_config))
9
- @filename = cfg_path
10
- @raw_config = YAML.load_file(cfg_path)
11
- @parsed_config = RecursiveOpenStruct.new(@raw_config, recurse_over_arrays: true, preserve_original_keys: true)
12
- @config = @parsed_config
7
+ # def self.validate(config)
8
+ # config.each do |section, hsh|
9
+ # case section.to_s
10
+ # when 'webhook'
11
+ # if hsh['port']
12
+ # port_validity = [
13
+ # hsh['port'].respond_to?(:to_i),
14
+ # hsh['port'].is_a?(Integer)
15
+ # ].drop_while(&:!)
16
+ # SiteHook::PreLogger.debug port_validity
17
+ # else
18
+ # raise InvalidConfigError 'webhook', index
19
+ # end
20
+ # if hsh['host']
21
+ # host_validity = [
22
+ # hsh['host'].respond_to?(:to_s)
23
+ #
24
+ # ]
25
+ # end
26
+ # [port_validity]
27
+ # when 'log_levels'
28
+ #
29
+ # when 'cli'
30
+ # when 'projects'
31
+ # when 'out'
32
+ # if hsh['out'].keys
33
+ # hsh['out'].keys.each do |key|
34
+ # case key
35
+ # when 'discord'
36
+ # when 'irc'
37
+ # else
38
+ # raise InvalidConfigError 'out', "#{key} is an invalid out service"
39
+ # end
40
+ # end
41
+ # end
42
+ # else
43
+ # raise UnknownFieldError section
44
+ # end
45
+ # end
46
+ # end
47
+
48
+ def inspect
49
+ meths = %i[webhook log_levels cli projects]
50
+ sections = {}
51
+ meths.each do |m|
52
+ sections[m] = self.class.send(m).inspect
53
+ end
54
+ secs = []
55
+ sections.each { |name, instance| secs << "#{name}=#{instance}" }
56
+ "#<SiteHook::Config #{secs.join(' ')}>"
57
+ end
58
+
59
+ def self.reload!
60
+ @@config = YAML.load_file(@@filename)
61
+ end
62
+
63
+ def self.filename
64
+ @@filename
65
+ end
66
+
67
+ def self.config
68
+ self.new
69
+ end
70
+
71
+ def initialize
72
+ @@config = {}
73
+ @@filename = SiteHook::Paths.default_config
74
+ begin
75
+ @@config = YAML.load_file(@@filename)
76
+ rescue Errno::ENOENT
77
+ raise NoConfigError path
78
+ rescue NoMethodError
79
+ @@filename.empty?
80
+ end
81
+ end
82
+
83
+ # @return [Webhook]
84
+ def self.webhook
85
+ Webhook.new(@@config['webhook'])
86
+ end
87
+
88
+ # @return [Projects]
89
+ def self.projects
90
+ Projects.new(@@config['projects'])
91
+ end
92
+
93
+ # @return [Cli]
94
+ def self.cli
95
+ Cli.new(@@config['cli'])
96
+ end
97
+
98
+ # @return [LogLevels]
99
+ def self.log_levels
100
+ LogLevels.new(@@config['log_levels'])
101
+ end
102
+ end
103
+ class Webhook
104
+ def initialize(config)
105
+ config.each do |option, value|
106
+ sec = StrExt.mkatvar(option)
107
+ self.instance_variable_set(:"#{sec}", value)
108
+ end
109
+ end
110
+
111
+ def host
112
+ @host
113
+ end
114
+
115
+ def port
116
+ @port
117
+ end
118
+
119
+ def inspect
120
+ "#<SiteHook::Webhook host=#{host} port=#{port}>"
121
+ end
122
+
123
+ end
124
+ class Projects
125
+ def initialize(config)
126
+ config.each do |project, options|
127
+ instance_variable_set(StrExt.mkatvar(StrExt.mkvar(project)), Project.new(project, options))
128
+ end
129
+ end
130
+
131
+ def inspect
132
+
133
+ output = []
134
+ instance_variables.each do |project|
135
+ output << "#{StrExt.rematvar(project)}=#{instance_variable_get(project).inspect}"
13
136
  end
137
+ "#<SiteHook::Projects #{output.join(' ')}"
138
+ end
14
139
 
140
+ def find_project(name)
141
+ public_vars = instance_variables.reject do |project_var|
142
+ instance_variable_get(project_var).private
143
+ end
144
+ project_obj = public_vars.select do |project|
145
+ project == StrExt.mkatvar(StrExt.mkvar(name))
146
+ end
147
+ project_obj = project_obj.join
148
+ begin
149
+ instance_variable_get(project_obj)
150
+ rescue NameError
151
+ nil
152
+ end
153
+
154
+ end
155
+
156
+ def get(project)
157
+ if instance_variables.empty?
158
+ return :no_projects
159
+ end
160
+ vars = instance_variables.select do |name|
161
+ name == StrExt.mkatvar(StrExt.mkvar(project))
162
+ end
163
+ if vars.empty?
164
+ return :not_found
165
+ end
166
+ obj = vars.join
167
+ begin
168
+ instance_variable_get(obj)
169
+ rescue NameError => e
170
+ return :not_found
171
+ end
172
+ end
173
+
174
+ #
175
+ # Collect project names that meet certain criteria
176
+ def collect_public
177
+ public_vars = instance_variables.reject do |project_var|
178
+ instance_variable_get(project_var).private
179
+ end
180
+ public_projects = []
181
+ public_vars.each do |var|
182
+ public_projects << instance_variable_get(var)
183
+ end
184
+ public_projects
185
+ end
186
+
187
+ def to_h
188
+ projects = {}
189
+ each do |project|
190
+ projects[project.name] = {}
191
+ %i[src dst repo host].each do |option|
192
+ projects[project.name][option] = project.instance_variable_get(StrExt.mkatvar(option))
193
+ end
194
+
195
+ end
196
+ projects
197
+ end
198
+
199
+ def each(&block)
200
+ len1 = instance_variables.length
201
+ x = 0
202
+ while x < len1
203
+ base = self
204
+ yield instance_variable_get(instance_variables[x])
205
+ x += 1
206
+ end
207
+ end
208
+
209
+ def self.length
210
+ instance_variables.length
211
+ end
212
+ end
213
+ class LogLevels
214
+ attr :app, :hook, :build, :git
215
+
216
+ def initialize(config)
217
+
218
+ LogLevels.defaults.each do |type, level|
219
+ if config.fetch(type.to_s, nil)
220
+ level(type.to_s, config.fetch(type.to_s))
221
+ else
222
+ level(type.to_s, level)
223
+ end
224
+ end
225
+ end
226
+
227
+ def to_h
228
+ output_hash = {}
229
+ wanted = %i[app hook build git]
230
+ wanted.each do |logger|
231
+ output_hash.store(logger, instance_variable_get(StrExt.mkatvar(logger)))
232
+ end
233
+ output_hash
234
+ end
235
+
236
+ def inspect
237
+ levels = []
238
+ instance_variables.each do |var|
239
+ levels << "#{StrExt.rematvar(var)}=#{self.instance_variable_get(var)}"
240
+ end
241
+ "#<SiteHook::LogLevels #{levels.join(' ')}>"
242
+ end
243
+
244
+ def fetch(key)
245
+ instance_variable_get(:"@#{key}")
246
+ end
247
+
248
+ def self.defaults
249
+ {
250
+ app: 'info',
251
+ hook: 'info',
252
+ build: 'info',
253
+ git: 'info',
254
+ }
255
+ end
256
+
257
+ def level(type, level)
258
+ instance_variable_set(:"@#{type}", level)
259
+ end
260
+ end
261
+ class Cli
262
+ SECTIONS = {
263
+ config: {
264
+ mkpass: [:length, :symbols]
265
+ },
266
+ server: {
267
+ # no host or port since those are set via Webhook
268
+ # webhook:
269
+ # host: 127.0.0.1
270
+ # port: 9090
271
+ #
272
+ # TODO: Find options to put here
273
+ },
274
+ }
275
+
276
+ def initialize(config)
277
+ # super
278
+ config.each do |sec, values|
279
+ instance_variable_set(StrExt.mkatvar(sec), values) unless values.empty?
280
+ end
281
+ end
282
+
283
+ def server
284
+ CliClasses::Server.new(@server)
285
+ end
286
+
287
+ def config
288
+ CliClasses::Config.new(@config)
289
+ end
290
+
291
+ def inspect
292
+ wanted = instance_variables
293
+ outputs = []
294
+ wanted.each do |meth|
295
+ outputs << "#{StrExt.rematvar(meth)}=#{instance_variable_get(meth)}"
296
+ end
297
+ "#<SiteHook::Cli #{outputs.join(' ')}>"
298
+ end
299
+ end
300
+
301
+ ##
302
+ # Internal Classes for each section
303
+ #
304
+ # Projects:
305
+ # Project
306
+ # Cli:
307
+ # Command
308
+ #
309
+ class Project
310
+ attr_reader :name, :src, :dst, :host, :repo, :hookpass, :private, :config
311
+
312
+ def initialize(name, config)
313
+ @name = name.to_s
314
+ config.each do |option, value|
315
+ instance_variable_set(StrExt.mkatvar(option), value)
316
+ if instance_variable_get(StrExt.mkatvar(:config))
317
+ # variable exists in configuration
318
+ else
319
+ instance_variable_set(StrExt.mkatvar(:config), '_config.yml')
320
+ end
321
+ if config.fetch('private', nil)
322
+ instance_variable_set(StrExt.mkatvar(option), value) unless instance_variables.include?(:@private)
323
+ else
324
+ instance_variable_set(StrExt.mkatvar('private'), false)
325
+ end
326
+ end
327
+ end
328
+
329
+ def inspect
330
+ outputs = []
331
+ instance_variables.each do |sym|
332
+ outputs << "#{StrExt.rematvar(sym)}=#{instance_variable_get(sym)}"
333
+ end
334
+ "#<SiteHook::Project #{outputs.join(' ')}>"
335
+ end
336
+ end
337
+ class CliClasses
338
+ class Config
339
+ def initialize(config)
340
+ @configured_commands = {}
341
+ config.each do |command, values|
342
+ @configured_commands.store(command, values)
343
+ end
344
+ end
345
+
346
+ def mkpass
347
+ Command.new(:mkpass, @configured_commands[:mkpass])
348
+ end
349
+
350
+ def inspect
351
+ outputs = []
352
+ @configured_commands.each do |m, body|
353
+ outputs << "#{m}=#{body}"
354
+ end
355
+ "#<SiteHook::Cli::Config #{outputs.join(' ')}>"
356
+ end
357
+ end
358
+ class Server
359
+ def initialize(config)
360
+ @configured_commands = {}
361
+ config.each do |command, values|
362
+ @configured_commands.store(command, values)
363
+ end
364
+ end
365
+
366
+ def listen
367
+ Command.new(:listen, @configured_commands[:listen])
368
+ end
369
+
370
+ def inspect
371
+ outputs = []
372
+ @configured_commands.each do |m, body|
373
+ outputs << "#{m}=#{body}"
374
+ end
375
+ "#<SiteHook::Cli::Server #{outputs.join(' ')}>"
376
+ end
377
+ end
378
+ class Command
379
+ attr_reader :name
380
+
381
+ def initialize(name, options)
382
+ @name = name
383
+ options.each do |option, value|
384
+ self.class.define_method(option.to_sym) do
385
+ return value
386
+
387
+ end
388
+ end
389
+ end
390
+
391
+ def inspect
392
+ # Bleh
393
+ end
15
394
  end
16
- class Set
17
- attr_reader :filename
18
- def initialize(cfg_path)
19
- @filename = cfg_path
20
- @config = YAML.load_file(@filename)
395
+ class CommandOption
396
+ def initialize(option, value)
21
397
  end
22
398
  end
23
399
  end