herdst_worker 0.1.5 → 0.1.8
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 +4 -4
- data/bin/herdst_worker_console +24 -0
- data/lib/herdst_worker/adapters/facade.rb +20 -20
- data/lib/herdst_worker/application/facade.rb +98 -89
- data/lib/herdst_worker/autoload/facade.rb +67 -67
- data/lib/herdst_worker/configuration/metadata.rb +5 -1
- data/lib/herdst_worker/configuration/paths.rb +41 -41
- data/lib/herdst_worker/log/facade.rb +87 -87
- data/lib/herdst_worker/queue/facade.rb +164 -162
- data/lib/herdst_worker/queue/processor.rb +225 -223
- data/lib/herdst_worker/queue/runner.rb +137 -137
- data/lib/herdst_worker/signals/facade.rb +35 -35
- data/lib/herdst_worker/version.rb +1 -1
- metadata +8 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 0a1ae23a9aa07daa5d91b6d45638c6db57b506c9652f1faed6255dc0545d6dfe
|
4
|
+
data.tar.gz: fc312df7ea263f0a72d1ef3bac0ee03bef0326f8f7b093105c5c0174a53204b6
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c7312f0e0debcd8fe80d8cac228b032689ea826c4c43ffb9457c663a1fcc52e49063cf8d27006da5309a7ad0d71163745069e0761d6f482e97998acea85fe23d
|
7
|
+
data.tar.gz: 48590ab2c15f342e70ded837c24997986cf8d2a0d965808325c1c38a7a2f59cd9ab2d4cdf358545f1dd42e7207070192157abe2d6bf6229056c164ff5d52d459
|
@@ -0,0 +1,24 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
args = ARGV
|
4
|
+
.flat_map { |s| s.scan(/--?([^=\s]+)(?:=(\S+))?/) }
|
5
|
+
.select { |i| i[1] != "" }
|
6
|
+
|
7
|
+
arg_pair = Hash[ args ]
|
8
|
+
application_name = arg_pair["name"]
|
9
|
+
application_file = arg_pair["application"] || "application.rb"
|
10
|
+
application_path = "#{Dir.pwd}/#{application_file}"
|
11
|
+
application_env = arg_pair["env"] || "development"
|
12
|
+
|
13
|
+
raise "Please specify a name for the application E.g. --name=[name]" unless application_name
|
14
|
+
|
15
|
+
require "irb"
|
16
|
+
require "irb/completion"
|
17
|
+
require_relative "../lib/herdst_worker"
|
18
|
+
|
19
|
+
application_instance = HerdstWorker::Application.new(application_env, application_name, false)
|
20
|
+
|
21
|
+
require_relative application_path
|
22
|
+
|
23
|
+
ARGV.clear
|
24
|
+
IRB.start
|
@@ -1,20 +1,20 @@
|
|
1
|
-
require "sentry-raven"
|
2
|
-
|
3
|
-
require_relative "database"
|
4
|
-
require_relative "sentry"
|
5
|
-
|
6
|
-
|
7
|
-
module HerdstWorker
|
8
|
-
module Adapters
|
9
|
-
class Facade
|
10
|
-
|
11
|
-
|
12
|
-
def self.bootstrap(app)
|
13
|
-
HerdstWorker::Adapters::Database.setup(app)
|
14
|
-
HerdstWorker::Adapters::Sentry.setup(app)
|
15
|
-
end
|
16
|
-
|
17
|
-
|
18
|
-
end
|
19
|
-
end
|
20
|
-
end
|
1
|
+
require "sentry-raven"
|
2
|
+
|
3
|
+
require_relative "database"
|
4
|
+
require_relative "sentry"
|
5
|
+
|
6
|
+
|
7
|
+
module HerdstWorker
|
8
|
+
module Adapters
|
9
|
+
class Facade
|
10
|
+
|
11
|
+
|
12
|
+
def self.bootstrap(app)
|
13
|
+
HerdstWorker::Adapters::Database.setup(app)
|
14
|
+
HerdstWorker::Adapters::Sentry.setup(app)
|
15
|
+
end
|
16
|
+
|
17
|
+
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -1,89 +1,98 @@
|
|
1
|
-
require_relative '../configuration/facade'
|
2
|
-
require_relative '../log/facade'
|
3
|
-
require_relative '../autoload/facade'
|
4
|
-
require_relative '../signals/facade'
|
5
|
-
require_relative '../queue/facade'
|
6
|
-
require_relative '../adapters/facade'
|
7
|
-
|
8
|
-
|
9
|
-
module HerdstWorker
|
10
|
-
class Application
|
11
|
-
|
12
|
-
|
13
|
-
attr_accessor :name
|
14
|
-
attr_accessor :logger, :config, :autoload
|
15
|
-
attr_accessor :poller_enabled, :queues, :poller_url, :queue
|
16
|
-
|
17
|
-
|
18
|
-
def initialize(env, name, poller_enabled)
|
19
|
-
self.name = name
|
20
|
-
self.poller_enabled = poller_enabled
|
21
|
-
self.queues = ActiveSupport::HashWithIndifferentAccess.new
|
22
|
-
|
23
|
-
HerdstWorker.set_application(self)
|
24
|
-
|
25
|
-
self.logger = HerdstWorker::Log::Facade.new(get_logger_level(env))
|
26
|
-
self.config = HerdstWorker::Configuration::Facade.new(env, name)
|
27
|
-
self.autoload = HerdstWorker::Autoload::Facade.new(self)
|
28
|
-
self.set_inflections
|
29
|
-
|
30
|
-
HerdstWorker::Adapters::Facade.bootstrap(self)
|
31
|
-
end
|
32
|
-
|
33
|
-
|
34
|
-
def configure(&block)
|
35
|
-
yield self
|
36
|
-
|
37
|
-
self.autoload.reload
|
38
|
-
end
|
39
|
-
|
40
|
-
|
41
|
-
def
|
42
|
-
self.queues[name]
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
1
|
+
require_relative '../configuration/facade'
|
2
|
+
require_relative '../log/facade'
|
3
|
+
require_relative '../autoload/facade'
|
4
|
+
require_relative '../signals/facade'
|
5
|
+
require_relative '../queue/facade'
|
6
|
+
require_relative '../adapters/facade'
|
7
|
+
|
8
|
+
|
9
|
+
module HerdstWorker
|
10
|
+
class Application
|
11
|
+
|
12
|
+
|
13
|
+
attr_accessor :name
|
14
|
+
attr_accessor :logger, :config, :autoload
|
15
|
+
attr_accessor :poller_enabled, :queues, :poller_url, :queue
|
16
|
+
|
17
|
+
|
18
|
+
def initialize(env, name, poller_enabled)
|
19
|
+
self.name = name
|
20
|
+
self.poller_enabled = poller_enabled
|
21
|
+
self.queues = ActiveSupport::HashWithIndifferentAccess.new
|
22
|
+
|
23
|
+
HerdstWorker.set_application(self)
|
24
|
+
|
25
|
+
self.logger = HerdstWorker::Log::Facade.new(get_logger_level(env))
|
26
|
+
self.config = HerdstWorker::Configuration::Facade.new(env, name)
|
27
|
+
self.autoload = HerdstWorker::Autoload::Facade.new(self)
|
28
|
+
self.set_inflections
|
29
|
+
|
30
|
+
HerdstWorker::Adapters::Facade.bootstrap(self)
|
31
|
+
end
|
32
|
+
|
33
|
+
|
34
|
+
def configure(&block)
|
35
|
+
yield self
|
36
|
+
|
37
|
+
self.autoload.reload
|
38
|
+
end
|
39
|
+
|
40
|
+
|
41
|
+
def get_queue(name)
|
42
|
+
if self.queues[name]
|
43
|
+
HerdstWorker::Queue::Facade.new(self, false, self.queues[name], 20)
|
44
|
+
else
|
45
|
+
nil
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
|
50
|
+
def add_queue(name, url, poller = false)
|
51
|
+
self.queues[name] = url
|
52
|
+
self.poller_url = url if poller
|
53
|
+
end
|
54
|
+
|
55
|
+
|
56
|
+
def run
|
57
|
+
if self.queue == nil
|
58
|
+
self.logger.info "Starting Application (#{$$})"
|
59
|
+
|
60
|
+
HerdstWorker::Signals::Facade.listen(self.config.paths.temp)
|
61
|
+
|
62
|
+
self.queue = HerdstWorker::Queue::Facade.new(self, self.poller_enabled, self.poller_url, 20)
|
63
|
+
self.queue.start
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
|
68
|
+
def config_for(name)
|
69
|
+
self.config.config_for(name)
|
70
|
+
end
|
71
|
+
|
72
|
+
|
73
|
+
private
|
74
|
+
def set_inflections
|
75
|
+
ActiveSupport::Inflector.inflections do |inflect|
|
76
|
+
inflect.irregular "meta", "meta"
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
def get_logger_level(env)
|
81
|
+
return "WARN" if env == "production"
|
82
|
+
return "FATAL" if env == "test"
|
83
|
+
return "DEBUG"
|
84
|
+
end
|
85
|
+
|
86
|
+
|
87
|
+
end
|
88
|
+
|
89
|
+
|
90
|
+
def self.set_application(application)
|
91
|
+
@@application = application
|
92
|
+
end
|
93
|
+
|
94
|
+
|
95
|
+
def self.application
|
96
|
+
@@application
|
97
|
+
end
|
98
|
+
end
|
@@ -1,67 +1,67 @@
|
|
1
|
-
module HerdstWorker
|
2
|
-
module Autoload
|
3
|
-
class Facade
|
4
|
-
|
5
|
-
|
6
|
-
attr_accessor :root_path, :loaded, :files, :paths
|
7
|
-
|
8
|
-
|
9
|
-
def initialize(app)
|
10
|
-
self.root_path = app.config.paths.root
|
11
|
-
|
12
|
-
self.loaded = []
|
13
|
-
self.files = []
|
14
|
-
self.paths = [ "lib" ]
|
15
|
-
|
16
|
-
self.reload
|
17
|
-
end
|
18
|
-
|
19
|
-
|
20
|
-
def <<(path)
|
21
|
-
full_path = self.root_path + "/" + path
|
22
|
-
|
23
|
-
if File.directory?(full_path)
|
24
|
-
self.paths << path
|
25
|
-
else
|
26
|
-
self.files << path
|
27
|
-
end
|
28
|
-
end
|
29
|
-
|
30
|
-
|
31
|
-
def reload
|
32
|
-
self.files.each do |file|
|
33
|
-
self.load_file(self.root_path + "/" + file)
|
34
|
-
end
|
35
|
-
|
36
|
-
self.paths.each do |folder|
|
37
|
-
concern_files = Dir.glob("#{root_path}/#{folder}/concerns/*.rb").sort
|
38
|
-
folder_files = Dir.glob("#{root_path}/#{folder}/*.rb").sort
|
39
|
-
|
40
|
-
concern_sub_files = Dir.glob("#{self.root_path}/#{folder}/**/concerns/*.rb").sort
|
41
|
-
folder_sub_files = Dir.glob("#{self.root_path}/#{folder}/**/*.rb").sort
|
42
|
-
|
43
|
-
files = (concern_files + folder_files + concern_sub_files + folder_sub_files).uniq
|
44
|
-
|
45
|
-
files.each do |file|
|
46
|
-
self.load_file(file)
|
47
|
-
end
|
48
|
-
end
|
49
|
-
end
|
50
|
-
|
51
|
-
|
52
|
-
def has_loaded?(file)
|
53
|
-
self.loaded.include?(file)
|
54
|
-
end
|
55
|
-
|
56
|
-
|
57
|
-
def load_file(file)
|
58
|
-
unless has_loaded?(file)
|
59
|
-
load file
|
60
|
-
self.loaded << file
|
61
|
-
end
|
62
|
-
end
|
63
|
-
|
64
|
-
|
65
|
-
end
|
66
|
-
end
|
67
|
-
end
|
1
|
+
module HerdstWorker
|
2
|
+
module Autoload
|
3
|
+
class Facade
|
4
|
+
|
5
|
+
|
6
|
+
attr_accessor :root_path, :loaded, :files, :paths
|
7
|
+
|
8
|
+
|
9
|
+
def initialize(app)
|
10
|
+
self.root_path = app.config.paths.root
|
11
|
+
|
12
|
+
self.loaded = []
|
13
|
+
self.files = []
|
14
|
+
self.paths = [ "lib" ]
|
15
|
+
|
16
|
+
self.reload
|
17
|
+
end
|
18
|
+
|
19
|
+
|
20
|
+
def <<(path)
|
21
|
+
full_path = self.root_path + "/" + path
|
22
|
+
|
23
|
+
if File.directory?(full_path)
|
24
|
+
self.paths << path
|
25
|
+
else
|
26
|
+
self.files << path
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
|
31
|
+
def reload
|
32
|
+
self.files.each do |file|
|
33
|
+
self.load_file(self.root_path + "/" + file)
|
34
|
+
end
|
35
|
+
|
36
|
+
self.paths.each do |folder|
|
37
|
+
concern_files = Dir.glob("#{root_path}/#{folder}/concerns/*.rb").sort
|
38
|
+
folder_files = Dir.glob("#{root_path}/#{folder}/*.rb").sort
|
39
|
+
|
40
|
+
concern_sub_files = Dir.glob("#{self.root_path}/#{folder}/**/concerns/*.rb").sort
|
41
|
+
folder_sub_files = Dir.glob("#{self.root_path}/#{folder}/**/*.rb").sort
|
42
|
+
|
43
|
+
files = (concern_files + folder_files + concern_sub_files + folder_sub_files).uniq
|
44
|
+
|
45
|
+
files.each do |file|
|
46
|
+
self.load_file(file)
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
|
52
|
+
def has_loaded?(file)
|
53
|
+
self.loaded.include?(file)
|
54
|
+
end
|
55
|
+
|
56
|
+
|
57
|
+
def load_file(file)
|
58
|
+
unless has_loaded?(file)
|
59
|
+
load file
|
60
|
+
self.loaded << file
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
@@ -1,41 +1,41 @@
|
|
1
|
-
module HerdstWorker
|
2
|
-
module Configuration
|
3
|
-
class Paths
|
4
|
-
|
5
|
-
|
6
|
-
attr_accessor :root_path, :paths
|
7
|
-
|
8
|
-
|
9
|
-
def initialize
|
10
|
-
self.root_path = ENV["ROOT_PATH"] || Dir.pwd
|
11
|
-
|
12
|
-
self.paths = ActiveSupport::HashWithIndifferentAccess.new
|
13
|
-
self.paths[:root] = self.root_path
|
14
|
-
self.paths[:app] = "#{self.root_path}/app"
|
15
|
-
self.paths[:config] = "#{self.root_path}/config"
|
16
|
-
self.paths[:temp] = "#{self.root_path}/tmp"
|
17
|
-
end
|
18
|
-
|
19
|
-
|
20
|
-
def []=(name, value)
|
21
|
-
self.paths[name] = "#{self.root_path}/#{value}"
|
22
|
-
end
|
23
|
-
|
24
|
-
|
25
|
-
def [](name)
|
26
|
-
self.paths[name]
|
27
|
-
end
|
28
|
-
|
29
|
-
|
30
|
-
def method_missing(name)
|
31
|
-
if self.paths.include?(name)
|
32
|
-
self.paths[name]
|
33
|
-
else
|
34
|
-
raise NoMethodError
|
35
|
-
end
|
36
|
-
end
|
37
|
-
|
38
|
-
|
39
|
-
end
|
40
|
-
end
|
41
|
-
end
|
1
|
+
module HerdstWorker
|
2
|
+
module Configuration
|
3
|
+
class Paths
|
4
|
+
|
5
|
+
|
6
|
+
attr_accessor :root_path, :paths
|
7
|
+
|
8
|
+
|
9
|
+
def initialize
|
10
|
+
self.root_path = ENV["ROOT_PATH"] || Dir.pwd
|
11
|
+
|
12
|
+
self.paths = ActiveSupport::HashWithIndifferentAccess.new
|
13
|
+
self.paths[:root] = self.root_path
|
14
|
+
self.paths[:app] = "#{self.root_path}/app"
|
15
|
+
self.paths[:config] = "#{self.root_path}/config"
|
16
|
+
self.paths[:temp] = "#{self.root_path}/tmp"
|
17
|
+
end
|
18
|
+
|
19
|
+
|
20
|
+
def []=(name, value)
|
21
|
+
self.paths[name] = "#{self.root_path}/#{value}"
|
22
|
+
end
|
23
|
+
|
24
|
+
|
25
|
+
def [](name)
|
26
|
+
self.paths[name]
|
27
|
+
end
|
28
|
+
|
29
|
+
|
30
|
+
def method_missing(name)
|
31
|
+
if self.paths.include?(name)
|
32
|
+
self.paths[name]
|
33
|
+
else
|
34
|
+
raise NoMethodError
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
@@ -1,87 +1,87 @@
|
|
1
|
-
require 'logger'
|
2
|
-
|
3
|
-
|
4
|
-
module HerdstWorker
|
5
|
-
module Log
|
6
|
-
|
7
|
-
|
8
|
-
DEFAULT_PROGNAME = "application"
|
9
|
-
|
10
|
-
|
11
|
-
class Facade
|
12
|
-
|
13
|
-
|
14
|
-
attr_accessor :logger, :progname, :single_line, :level
|
15
|
-
|
16
|
-
|
17
|
-
def initialize(level = "DEBUG", progname = DEFAULT_PROGNAME, single_line = false)
|
18
|
-
self.progname = progname
|
19
|
-
self.single_line = single_line
|
20
|
-
|
21
|
-
self.logger = Logger.new(STDOUT)
|
22
|
-
self.logger.progname = self.get_progname(progname)
|
23
|
-
self.set_log_level(level)
|
24
|
-
end
|
25
|
-
|
26
|
-
|
27
|
-
def set_log_level(level)
|
28
|
-
self.level = level
|
29
|
-
self.logger.level = Logger.const_get(level)
|
30
|
-
end
|
31
|
-
|
32
|
-
|
33
|
-
def debug(*attributes)
|
34
|
-
write_message :debug, attributes
|
35
|
-
end
|
36
|
-
|
37
|
-
|
38
|
-
def info(*attributes)
|
39
|
-
write_message :info, attributes
|
40
|
-
end
|
41
|
-
|
42
|
-
|
43
|
-
def warn(*attributes)
|
44
|
-
write_message :warn, attributes
|
45
|
-
end
|
46
|
-
|
47
|
-
|
48
|
-
def error(*attributes)
|
49
|
-
write_message :error, attributes
|
50
|
-
end
|
51
|
-
|
52
|
-
|
53
|
-
def fatal(*attributes)
|
54
|
-
write_message :fatal, attributes
|
55
|
-
end
|
56
|
-
|
57
|
-
|
58
|
-
def method_missing(name)
|
59
|
-
full_name = self.progname === DEFAULT_PROGNAME ?
|
60
|
-
name :
|
61
|
-
"#{self.progname}.#{name}"
|
62
|
-
|
63
|
-
Facade.new(self.level, full_name, self.single_line)
|
64
|
-
end
|
65
|
-
|
66
|
-
|
67
|
-
def write_message(type, message)
|
68
|
-
if self.single_line
|
69
|
-
full_message = message.map { |i| i.to_s }.join(" ")
|
70
|
-
else
|
71
|
-
full_message = message.map { |i| i.to_s }.join("\n")
|
72
|
-
end
|
73
|
-
|
74
|
-
self.logger.send(type, full_message)
|
75
|
-
end
|
76
|
-
|
77
|
-
|
78
|
-
protected
|
79
|
-
def get_progname(name)
|
80
|
-
"[#{name.upcase}]"
|
81
|
-
end
|
82
|
-
|
83
|
-
|
84
|
-
end
|
85
|
-
|
86
|
-
end
|
87
|
-
end
|
1
|
+
require 'logger'
|
2
|
+
|
3
|
+
|
4
|
+
module HerdstWorker
|
5
|
+
module Log
|
6
|
+
|
7
|
+
|
8
|
+
DEFAULT_PROGNAME = "application"
|
9
|
+
|
10
|
+
|
11
|
+
class Facade
|
12
|
+
|
13
|
+
|
14
|
+
attr_accessor :logger, :progname, :single_line, :level
|
15
|
+
|
16
|
+
|
17
|
+
def initialize(level = "DEBUG", progname = DEFAULT_PROGNAME, single_line = false)
|
18
|
+
self.progname = progname
|
19
|
+
self.single_line = single_line
|
20
|
+
|
21
|
+
self.logger = Logger.new(STDOUT)
|
22
|
+
self.logger.progname = self.get_progname(progname)
|
23
|
+
self.set_log_level(level)
|
24
|
+
end
|
25
|
+
|
26
|
+
|
27
|
+
def set_log_level(level)
|
28
|
+
self.level = level
|
29
|
+
self.logger.level = Logger.const_get(level)
|
30
|
+
end
|
31
|
+
|
32
|
+
|
33
|
+
def debug(*attributes)
|
34
|
+
write_message :debug, attributes
|
35
|
+
end
|
36
|
+
|
37
|
+
|
38
|
+
def info(*attributes)
|
39
|
+
write_message :info, attributes
|
40
|
+
end
|
41
|
+
|
42
|
+
|
43
|
+
def warn(*attributes)
|
44
|
+
write_message :warn, attributes
|
45
|
+
end
|
46
|
+
|
47
|
+
|
48
|
+
def error(*attributes)
|
49
|
+
write_message :error, attributes
|
50
|
+
end
|
51
|
+
|
52
|
+
|
53
|
+
def fatal(*attributes)
|
54
|
+
write_message :fatal, attributes
|
55
|
+
end
|
56
|
+
|
57
|
+
|
58
|
+
def method_missing(name)
|
59
|
+
full_name = self.progname === DEFAULT_PROGNAME ?
|
60
|
+
name :
|
61
|
+
"#{self.progname}.#{name}"
|
62
|
+
|
63
|
+
Facade.new(self.level, full_name, self.single_line)
|
64
|
+
end
|
65
|
+
|
66
|
+
|
67
|
+
def write_message(type, message)
|
68
|
+
if self.single_line
|
69
|
+
full_message = message.map { |i| i.to_s }.join(" ")
|
70
|
+
else
|
71
|
+
full_message = message.map { |i| i.to_s }.join("\n")
|
72
|
+
end
|
73
|
+
|
74
|
+
self.logger.send(type, full_message)
|
75
|
+
end
|
76
|
+
|
77
|
+
|
78
|
+
protected
|
79
|
+
def get_progname(name)
|
80
|
+
"[#{name.upcase}]"
|
81
|
+
end
|
82
|
+
|
83
|
+
|
84
|
+
end
|
85
|
+
|
86
|
+
end
|
87
|
+
end
|