local_pac 0.5.0 → 0.6.1
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.
- data/.travis.yml +1 -1
- data/Gemfile.lock +1 -3
- data/app/controllers/git_hook_controller.rb +25 -4
- data/app/controllers/lookup_controller.rb +1 -0
- data/app/locales/en.yml +9 -1
- data/bin/local_pac +5 -129
- data/config.ru +2 -2
- data/features/{show_status.feature_ → show_status.feature} +2 -1
- data/features/step_definitions.rb +4 -0
- data/lib/local_pac.rb +9 -2
- data/lib/local_pac/actions/get_system_information.rb +2 -2
- data/lib/local_pac/actions/handle_error.rb +26 -0
- data/lib/local_pac/actions/initialize_application.rb +71 -0
- data/lib/local_pac/actions/reload_local_storage.rb +2 -0
- data/lib/local_pac/actions/show_application_status.rb +39 -0
- data/lib/local_pac/actions/show_pac_file.rb +29 -0
- data/lib/local_pac/actions/validate_pac_file.rb +34 -0
- data/lib/local_pac/cli/main.rb +122 -0
- data/lib/local_pac/cli/reload.rb +8 -4
- data/lib/local_pac/cli/show.rb +34 -0
- data/lib/local_pac/cli/validate.rb +22 -0
- data/lib/local_pac/config.rb +1 -1
- data/lib/local_pac/error_handler.rb +60 -0
- data/lib/local_pac/exceptions.rb +6 -0
- data/lib/local_pac/git_storage.rb +30 -10
- data/lib/local_pac/pac_file_validator.rb +17 -2
- data/lib/local_pac/version.rb +1 -1
- data/local_pac.gemspec +0 -2
- data/script/acceptance_test +4 -0
- data/script/bootstrap +5 -0
- data/script/ci +3 -0
- data/script/release +3 -0
- data/script/unit_test +3 -0
- data/spec/actions/handle_error_spec.rb +29 -0
- data/spec/{initializer_spec.rb → actions/initialize_application_spec.rb} +3 -3
- data/spec/{application_status_spec.rb → actions/show_application_status_spec.rb} +5 -5
- data/spec/actions/show_pac_file_spec.rb +36 -0
- data/spec/actions/validate_pac_file_spec.rb +62 -0
- data/spec/error_handler_spec.rb +70 -0
- data/spec/features/check_git_push_spec.rb +34 -6
- data/spec/git_repository_spec.rb +1 -0
- data/spec/git_storage_spec.rb +33 -0
- data/spec/pac_file_validator_spec.rb +19 -10
- metadata +30 -26
- data/lib/local_pac/application_status.rb +0 -37
- data/lib/local_pac/initializer.rb +0 -69
@@ -0,0 +1,29 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
module LocalPac
|
3
|
+
module Actions
|
4
|
+
class ShowPacFile
|
5
|
+
private
|
6
|
+
|
7
|
+
attr_reader :name, :repo, :options, :vcs_engine, :storage_path
|
8
|
+
|
9
|
+
public
|
10
|
+
|
11
|
+
def initialize(file, storage_path, options = {}, vcs_engine = GitStorage)
|
12
|
+
@name = ::File.basename(file, '.pac').to_sym
|
13
|
+
@storage_path = storage_path
|
14
|
+
@options = options
|
15
|
+
@vcs_engine = vcs_engine
|
16
|
+
end
|
17
|
+
|
18
|
+
def run
|
19
|
+
begin
|
20
|
+
@repo = vcs_engine.new(storage_path)
|
21
|
+
rescue Rugged::OSError
|
22
|
+
raise Exceptions::RepositoryDoesNotExist, "Sorry, but the repository at #{storage_path} does not exist" unless ::Dir.exists? storage_path
|
23
|
+
end
|
24
|
+
|
25
|
+
puts repo[name].content
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
module LocalPac
|
3
|
+
module Actions
|
4
|
+
class ValidatePacFile
|
5
|
+
|
6
|
+
private
|
7
|
+
|
8
|
+
attr_reader :path, :validator, :creator
|
9
|
+
|
10
|
+
public
|
11
|
+
|
12
|
+
def initialize(path, creator = File, validator = PacFileValidator.new)
|
13
|
+
@path = path
|
14
|
+
@validator = validator
|
15
|
+
@creator = creator
|
16
|
+
end
|
17
|
+
|
18
|
+
def run
|
19
|
+
file = creator.new(path, ::File.read(path))
|
20
|
+
|
21
|
+
if validator.valid?(file)
|
22
|
+
puts "File \"#{file.path}\" is a valid pac file."
|
23
|
+
else
|
24
|
+
puts "File \"#{file.path}\" is not a valid pac file:"
|
25
|
+
puts validator.errors(file)
|
26
|
+
end
|
27
|
+
rescue Errno::EISDIR => e
|
28
|
+
raise Exceptions::PacFileInvalid, e.message
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
|
@@ -0,0 +1,122 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
module LocalPac
|
3
|
+
module Cli
|
4
|
+
class Main < Thor
|
5
|
+
class_option :config_file, type: :string, desc: 'Config file'
|
6
|
+
class_option :log_level, default: 'info', type: :string, desc: 'Log level for ui logging'
|
7
|
+
class_option :debug_mode, type: :boolean, desc: 'Run application in debug mode'
|
8
|
+
|
9
|
+
no_commands {
|
10
|
+
include LocalPac::Cli::Helper
|
11
|
+
}
|
12
|
+
|
13
|
+
desc 'serve', 'Serve pacfiles'
|
14
|
+
option :access_log, type: :string, desc: 'File to write access log to'
|
15
|
+
option :listen, type: :string, desc: 'Listen for requests'
|
16
|
+
option :environment, type: :string, desc: 'Rack environment for application'
|
17
|
+
option :with, type: :string, default: 'puma', desc: 'Server used to serve proxy pac'
|
18
|
+
def serve
|
19
|
+
LocalPac.config = LocalPac::Config.new(options[:config_file]) if options[:config_file]
|
20
|
+
LocalPac.config.access_log = options[:access_log] if options[:access_log]
|
21
|
+
LocalPac.config.log_level = options[:log_level] if options[:log_level]
|
22
|
+
LocalPac.config.debug_mode = options[:debug_mode] if options[:debug_mode]
|
23
|
+
LocalPac.config.environment = options[:environment] if options[:environment]
|
24
|
+
LocalPac.config.listen = options[:listen] if options[:listen]
|
25
|
+
LocalPac.config.lock
|
26
|
+
|
27
|
+
LocalPac.ui_logger.level = LocalPac.config.log_level
|
28
|
+
LocalPac.enable_debug_mode if LocalPac.config.debug_mode
|
29
|
+
|
30
|
+
LocalPac.ui_logger.debug('Options: ' + options.to_s)
|
31
|
+
LocalPac.ui_logger.debug("Config:\n" + LocalPac.config.to_s)
|
32
|
+
|
33
|
+
command_klass = case options[:with].to_sym
|
34
|
+
when :puma
|
35
|
+
ServerCommands::Puma
|
36
|
+
when :rackup
|
37
|
+
ServerCommands::Rackup
|
38
|
+
else
|
39
|
+
ServerCommands::Rackup
|
40
|
+
end
|
41
|
+
|
42
|
+
command = command_klass.new(
|
43
|
+
listen: LocalPac.config.listen,
|
44
|
+
environment: LocalPac.config.environment,
|
45
|
+
)
|
46
|
+
|
47
|
+
ENV['DEBUG'] = LocalPac.config.debug_mode.to_s if LocalPac.config.debug_mode
|
48
|
+
ENV['ACCESS_LOG'] = LocalPac.config.access_log.to_s if LocalPac.config.access_log
|
49
|
+
ENV['LOG_LEVEL'] = LocalPac.config.log_level.to_s if LocalPac.config.log_level
|
50
|
+
|
51
|
+
Server.new(command).start
|
52
|
+
end
|
53
|
+
|
54
|
+
desc 'init', 'Create files/directories to use local_pac in dir or $PWD'
|
55
|
+
option :force, type: :boolean, default: false, desc: 'Overwrite existing files?'
|
56
|
+
option :pre_seed, type: :boolean, default: false, desc: 'Add some example files to git repository'
|
57
|
+
option :config_file, type: :string, desc: 'Path to config file'
|
58
|
+
|
59
|
+
option :local_storage, type: :string, desc: 'Path to local storage'
|
60
|
+
option :pid_file, type: :string, desc: 'Path to pid file'
|
61
|
+
option :access_log, type: :string, desc: 'Path to access log'
|
62
|
+
option :sass_cache, type: :string, desc: 'Path to sass cache'
|
63
|
+
option :reload_config_signal, type: :string, desc: 'Signal to reload config'
|
64
|
+
option :reload_storage_signal, type: :string, desc: 'Signal to reload local storage'
|
65
|
+
option :api_key, type: :string, desc: 'API key for communication between git hook and web application'
|
66
|
+
option :listen, type: :string, desc: 'Listen statement for rack server'
|
67
|
+
option :environment, type: :string, desc: 'Default environment for rack server'
|
68
|
+
|
69
|
+
option :create_pid_directory, type: :boolean, desc: 'Create pid directory', default: true
|
70
|
+
option :create_log_directory, type: :boolean, desc: 'Create log directory', default: true
|
71
|
+
option :create_sass_cache, type: :boolean, desc: 'Create sass cache directory', default: true
|
72
|
+
option :create_local_storage, type: :boolean, desc: 'Create local storage directory', default: true
|
73
|
+
option :create_pre_receive_hook, type: :boolean, desc: 'Create pre receive hook', default: true
|
74
|
+
option :create_config_file, type: :boolean, desc: 'Create config_directory', default: true
|
75
|
+
def init
|
76
|
+
LocalPac.config = LocalPac::Config.new(options[:config_file]) if options[:config_file]
|
77
|
+
|
78
|
+
LocalPac.config.log_level = options[:log_level] if options[:log_level]
|
79
|
+
LocalPac.config.debug_mode = options[:debug_mode] if options[:debug_mode]
|
80
|
+
LocalPac.config.local_storage = options[:local_storage] if options[:local_storage]
|
81
|
+
LocalPac.config.pid_file = options[:pid_file] if options[:pid_file]
|
82
|
+
LocalPac.config.access_log = options[:access_log] if options[:access_log]
|
83
|
+
LocalPac.config.sass_cache = options[:sass_cache] if options[:sass_cache]
|
84
|
+
LocalPac.config.reload_config_signal = options[:reload_config_signal] if options[:reload_config_signal]
|
85
|
+
LocalPac.config.reload_storage_signal = options[:reload_storage_signal] if options[:reload_storage_signal]
|
86
|
+
LocalPac.config.log_level = options[:log_level] if options[:log_level]
|
87
|
+
LocalPac.config.api_key = options[:api_key] if options[:api_key]
|
88
|
+
LocalPac.config.listen = options[:listen] if options[:listen]
|
89
|
+
LocalPac.config.environment = options[:environment] if options[:environment]
|
90
|
+
|
91
|
+
LocalPac.config.lock
|
92
|
+
|
93
|
+
LocalPac.ui_logger.level = LocalPac.config.log_level
|
94
|
+
LocalPac.enable_debug_mode if LocalPac.config.debug_mode
|
95
|
+
|
96
|
+
LocalPac.ui_logger.debug('Options: ' + options.to_s)
|
97
|
+
LocalPac.ui_logger.debug("Config:\n" + LocalPac.config.to_s)
|
98
|
+
|
99
|
+
Actions::InitializeApplication.new(
|
100
|
+
force: options[:force],
|
101
|
+
pre_seed: options[:pre_seed],
|
102
|
+
create_pid_directory: options[:create_pid_directory],
|
103
|
+
create_log_directory: options[:create_log_directory],
|
104
|
+
create_sass_cache: options[:create_sass_cache],
|
105
|
+
create_local_storage: options[:create_local_storage],
|
106
|
+
create_pre_receive_hook: options[:create_pre_receive_hook],
|
107
|
+
create_config_file: options[:create_config_file],
|
108
|
+
).run
|
109
|
+
end
|
110
|
+
|
111
|
+
desc 'reload', 'Reload configuration, local storage etc.'
|
112
|
+
option :pid_file, type: :string, desc: 'Pid file of daemon'
|
113
|
+
subcommand 'reload', LocalPac::Cli::Reload
|
114
|
+
|
115
|
+
desc 'show', 'Show information about status.'
|
116
|
+
subcommand 'show', LocalPac::Cli::Show
|
117
|
+
|
118
|
+
desc 'validate', 'Validate information about status.'
|
119
|
+
subcommand 'validate', LocalPac::Cli::Validate
|
120
|
+
end
|
121
|
+
end
|
122
|
+
end
|
data/lib/local_pac/cli/reload.rb
CHANGED
@@ -9,11 +9,13 @@ module LocalPac
|
|
9
9
|
desc 'configuration', 'Reload configuration'
|
10
10
|
def configuration
|
11
11
|
LocalPac.config = LocalPac::Config.new(options[:config_file]) if options[:config_file]
|
12
|
+
LocalPac.config.log_level = options[:log_level] if options[:log_level]
|
13
|
+
LocalPac.config.debug_mode = options[:debug_mode] if options[:debug_mode]
|
12
14
|
LocalPac.config.pid_file = options[:pid_file] if options[:pid_file]
|
13
15
|
LocalPac.config.lock
|
14
16
|
|
15
|
-
|
16
|
-
|
17
|
+
LocalPac.ui_logger.level = LocalPac.config.log_level
|
18
|
+
LocalPac.enable_debug_mode if LocalPac.config.debug_mode
|
17
19
|
|
18
20
|
LocalPac.ui_logger.info "Ask web application (PID: #{pid(LocalPac.config)}) to reload configuration"
|
19
21
|
Actions::SendSignal.new(LocalPac.config.reload_config_signal).run
|
@@ -22,11 +24,13 @@ module LocalPac
|
|
22
24
|
desc 'local_storage', 'Reload local_storage'
|
23
25
|
def local_storage
|
24
26
|
LocalPac.config = LocalPac::Config.new(options[:config_file]) if options[:config_file]
|
27
|
+
LocalPac.config.log_level = options[:log_level] if options[:log_level]
|
28
|
+
LocalPac.config.debug_mode = options[:debug_mode] if options[:debug_mode]
|
25
29
|
LocalPac.config.pid_file = options[:pid_file] if options[:pid_file]
|
26
30
|
LocalPac.config.lock
|
27
31
|
|
28
|
-
|
29
|
-
|
32
|
+
LocalPac.ui_logger.level = LocalPac.config.log_level
|
33
|
+
LocalPac.enable_debug_mode if LocalPac.config.debug_mode
|
30
34
|
|
31
35
|
LocalPac.ui_logger.info "Ask web application (PID: #{pid(LocalPac.config)}) to reload storage"
|
32
36
|
Actions::SendSignal.new(LocalPac.config.reload_storage_signal).run
|
@@ -0,0 +1,34 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
module LocalPac
|
3
|
+
module Cli
|
4
|
+
class Show < Thor
|
5
|
+
|
6
|
+
desc 'status', 'Show status of local_pac: configuration, known proxy pacs, server running etc.'
|
7
|
+
def status
|
8
|
+
LocalPac.config = LocalPac::Config.new(options[:config_file]) if options[:config_file]
|
9
|
+
LocalPac.config.log_level = options[:log_level] if options[:log_level]
|
10
|
+
LocalPac.config.debug_mode = options[:debug_mode] if options[:debug_mode]
|
11
|
+
LocalPac.config.lock
|
12
|
+
|
13
|
+
LocalPac.ui_logger.level = LocalPac.config.log_level
|
14
|
+
LocalPac.enable_debug_mode if LocalPac.config.debug_mode
|
15
|
+
|
16
|
+
Actions::ShowApplicationStatus.new.run
|
17
|
+
end
|
18
|
+
|
19
|
+
desc 'pac_fiel', 'Show pac file.'
|
20
|
+
def pac_file(file)
|
21
|
+
LocalPac.config = LocalPac::Config.new(options[:config_file]) if options[:config_file]
|
22
|
+
LocalPac.config.log_level = options[:log_level] if options[:log_level]
|
23
|
+
LocalPac.config.debug_mode = options[:debug_mode] if options[:debug_mode]
|
24
|
+
LocalPac.config.lock
|
25
|
+
|
26
|
+
LocalPac.ui_logger.level = LocalPac.config.log_level
|
27
|
+
LocalPac.enable_debug_mode if LocalPac.config.debug_mode
|
28
|
+
|
29
|
+
Actions::PrintTitle.new("Content of \"#{file}\"").run
|
30
|
+
Actions::ShowPacFile.new(file, LocalPac.config.local_storage).run
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
module LocalPac
|
3
|
+
module Cli
|
4
|
+
class Validate < Thor
|
5
|
+
|
6
|
+
desc 'configuration', 'Reload configuration'
|
7
|
+
def pac_file(path)
|
8
|
+
LocalPac.config = LocalPac::Config.new(options[:config_file]) if options[:config_file]
|
9
|
+
LocalPac.config.log_level = options[:log_level] if options[:log_level]
|
10
|
+
LocalPac.config.debug_mode = options[:debug_mode] if options[:debug_mode]
|
11
|
+
LocalPac.config.lock
|
12
|
+
|
13
|
+
LocalPac.ui_logger.level = LocalPac.config.log_level
|
14
|
+
LocalPac.enable_debug_mode if LocalPac.config.debug_mode
|
15
|
+
|
16
|
+
LocalPac.ui_logger.info "Validating pac file #{path}"
|
17
|
+
Actions::ValidatePacFile.new(path).run
|
18
|
+
end
|
19
|
+
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
data/lib/local_pac/config.rb
CHANGED
@@ -0,0 +1,60 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
module LocalPac
|
3
|
+
class ErrorHandler
|
4
|
+
|
5
|
+
@handlers = []
|
6
|
+
@mutex = Mutex.new
|
7
|
+
|
8
|
+
class << self
|
9
|
+
attr_reader :handlers, :mutex
|
10
|
+
end
|
11
|
+
|
12
|
+
private
|
13
|
+
|
14
|
+
attr_reader :message, :exit_code
|
15
|
+
|
16
|
+
public
|
17
|
+
|
18
|
+
attr_reader :exception
|
19
|
+
attr_accessor :original_message
|
20
|
+
|
21
|
+
def initialize(options = {})
|
22
|
+
@exception = options.fetch(:exception)
|
23
|
+
@message = options.fetch(:message)
|
24
|
+
@exit_code = options.fetch(:exit_code)
|
25
|
+
rescue KeyError => e
|
26
|
+
raise ArgumentError, e.message
|
27
|
+
end
|
28
|
+
|
29
|
+
class << self
|
30
|
+
def create(options = {}, &block)
|
31
|
+
handler = new(options, &block)
|
32
|
+
handlers << handler
|
33
|
+
|
34
|
+
handler
|
35
|
+
end
|
36
|
+
|
37
|
+
def find(exception)
|
38
|
+
handlers.find(proc { default_handler }) { |h| h.exception == exception }
|
39
|
+
end
|
40
|
+
|
41
|
+
private
|
42
|
+
|
43
|
+
def default_handler
|
44
|
+
mutex.synchronize do
|
45
|
+
@default_handler ||= new(
|
46
|
+
exception: StandardError,
|
47
|
+
message: 'Sorry, but I cannot fullfil your request. An unexpected error occured.',
|
48
|
+
exit_code: 99,
|
49
|
+
)
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
def run
|
55
|
+
LocalPac.ui_logger.fatal message
|
56
|
+
LocalPac.ui_logger.debug original_message if original_message
|
57
|
+
Kernel.exit exit_code
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
data/lib/local_pac/exceptions.rb
CHANGED
@@ -12,12 +12,18 @@ module LocalPac
|
|
12
12
|
# raised if listen statement is invalid
|
13
13
|
class ServerListenStatementInvalid < StandardError; end
|
14
14
|
|
15
|
+
# raised if reload of local storage failed
|
16
|
+
class ReloadOfLocalStorageFailed < StandardError; end
|
17
|
+
|
15
18
|
# raised if entered url is invalid
|
16
19
|
class URLToSearchForInvalid < StandardError; end
|
17
20
|
|
18
21
|
# raised if pac file is invalid
|
19
22
|
class PacFileInvalid < StandardError; end
|
20
23
|
|
24
|
+
# raised if api key is invalid
|
25
|
+
class ApiKeyInvalid < StandardError; end
|
26
|
+
|
21
27
|
# raised if request is invalid
|
22
28
|
class GivenUrlInvalid < StandardError; end
|
23
29
|
|
@@ -1,9 +1,10 @@
|
|
1
1
|
# encoding: utf-8
|
2
2
|
module LocalPac
|
3
3
|
class GitStorage
|
4
|
+
|
4
5
|
private
|
5
6
|
|
6
|
-
attr_reader :storage_path, :
|
7
|
+
attr_reader :storage_path, :repository, :file_creator, :null_file, :vcs_engine, :compressor_engine
|
7
8
|
|
8
9
|
public
|
9
10
|
|
@@ -11,16 +12,33 @@ module LocalPac
|
|
11
12
|
@storage_path = ::File.expand_path(storage_path)
|
12
13
|
@null_file = null_file
|
13
14
|
@vcs_engine = vcs_engine
|
15
|
+
@compressor_engine = compressor_engine
|
14
16
|
|
15
17
|
begin
|
16
18
|
@repository = vcs_engine.new(storage_path)
|
17
19
|
rescue Exceptions::RepositoryDoesNotExist
|
18
20
|
@repository = vcs_engine.create(storage_path)
|
19
21
|
end
|
22
|
+
end
|
23
|
+
|
24
|
+
def [](key)
|
25
|
+
data.fetch(key, null_file)
|
26
|
+
end
|
27
|
+
|
28
|
+
def each_pac_file(&block)
|
29
|
+
pac_files.each(&block)
|
30
|
+
end
|
31
|
+
|
32
|
+
def each_added_pac_file(old_commit_id, new_commit_id, &block)
|
33
|
+
added_pac_files(old_commit_id, new_commit_id).each(&block)
|
34
|
+
end
|
20
35
|
|
36
|
+
private
|
37
|
+
|
38
|
+
def data
|
21
39
|
mutex = Mutex.new
|
22
40
|
mutex.synchronize do
|
23
|
-
@data
|
41
|
+
@data ||= pac_files.reduce({}) do |memo, file|
|
24
42
|
compressor_engine.new.prepare(file)
|
25
43
|
memo[file.name.to_sym] = file
|
26
44
|
|
@@ -29,19 +47,21 @@ module LocalPac
|
|
29
47
|
end
|
30
48
|
end
|
31
49
|
|
32
|
-
def
|
33
|
-
|
50
|
+
def added_pac_files(old_commit_id, new_commit_id)
|
51
|
+
logging_for_repo_action do
|
52
|
+
repository.added_files(old_commit_id, new_commit_id).keep_if { |f| f.extension? '.pac' }
|
53
|
+
end
|
34
54
|
end
|
35
55
|
|
36
|
-
def
|
37
|
-
|
56
|
+
def pac_files
|
57
|
+
logging_for_repo_action do
|
58
|
+
repository.all_files.keep_if { |f| f.extension? '.pac' }
|
59
|
+
end
|
38
60
|
end
|
39
61
|
|
40
|
-
|
41
|
-
|
42
|
-
def pac_files
|
62
|
+
def logging_for_repo_action(&block)
|
43
63
|
LocalPac.ui_logger.debug "I'm using the following storage path: \"#{storage_path}\"."
|
44
|
-
files =
|
64
|
+
files = block.call
|
45
65
|
LocalPac.ui_logger.debug "Found the following files: #{files.collect { |f| "\"#{f.path}\"" }.join(", ")}."
|
46
66
|
|
47
67
|
files
|
@@ -1,13 +1,28 @@
|
|
1
1
|
# encoding: utf-8
|
2
2
|
module LocalPac
|
3
3
|
class PacFileValidator
|
4
|
+
|
4
5
|
def valid?(file)
|
5
|
-
|
6
|
-
pac.find('http://www.example.com')
|
6
|
+
validate(file)
|
7
7
|
|
8
8
|
true
|
9
9
|
rescue StandardError
|
10
10
|
false
|
11
11
|
end
|
12
|
+
|
13
|
+
def errors(file)
|
14
|
+
validate(file)
|
15
|
+
|
16
|
+
''
|
17
|
+
rescue StandardError => e
|
18
|
+
e.message
|
19
|
+
end
|
20
|
+
|
21
|
+
private
|
22
|
+
|
23
|
+
def validate(file)
|
24
|
+
pac = PAC.source(file.content)
|
25
|
+
pac.find('http://www.example.com')
|
26
|
+
end
|
12
27
|
end
|
13
28
|
end
|