Class: Typingpool::Config
- Inherits:
-
Object
- Object
- Typingpool::Config
- Defined in:
- lib/typingpool/config.rb,
lib/typingpool/config/root.rb
Overview
Hierarchical config object. Can be read from a YAML file and is often modified at runtime, for example in response to script flags.
==Fields All listed defaults are populated when you run tp-install. ===Required [transcripts] Unexpanded path to working directory for transcripts. This is where tp-make creates new transcript projects, and where other scripts like tp-assign, tp-review and tp-finish look for them. Default: On systems with a ~/Desktop (like OS X), ~/Desktop/Transcripts. Elsewhere, ~/transcripts. ====amazon [key] An Amazon Web Services "Access Key ID." Default: none. [secret] An Amazon Web Services "Secret Access Key." Default: none. [bucket] The name of the "bucket" on Amazon S3 where your uploads will be stored. Not required if you specify SFTP config instead (see below). Default: Generated for you when you run tp-install.
===Optional [cache] Unexpanded path to the cache file (pstore). Default: ~/.typingpool.cache [templates] Unexpanded path to directory for user-created templates. Will be searched before looking in the template dir within the app. Default: 'templates' or 'Templates' (OS X) dir inside the transcripts dir. ====amazon [url] Base URL to use when linking to files uploaded to S3. You may want to use this if you do custom domain mapping on S3. Default is https://$bucket.s3.amazonaws.com. ====sftp If you provide SFTP config, the specified SFTP server will be used to host remote mp3 and html files rather than Amazon S3. At minimum, you must provide a user, host, and URL. SFTP will work fine with public-key authentication (passwordless login). In fact, I've not bothered to add password support yet. [user] SFTP username [host] SFTP server [path] Files will be uploaded into this path. Optional. [url] Base URL to use when linking to files uploaded using the preceding config. ====assign Defaults for tp-assign. [reward] Pay per transcription chunk in U.S. dollars. Default: 0.75. [deadline] Length of time a worker has to complete a transcription job after accepting it (HIT 'AssignmentDurationInSeconds' in the Mechanical Turk API). For details on the format, see docs for Utility.timespec_to_seconds. Default: 3h. [approval] Length of time before a submitted transcription job is automatically approved (HIT 'AutoApprovalDelayInSeconds' in the Mechanical Turk API). For details on the format, see docs for Utility.timespec_to_seconds. Default: 1d. [lifetime] Length of time before a transcription job is no longer available to be accepted (HIT 'LifetimeInSeconds' in the Mechanical Turk API). For details on the format, see docs for Utility.timespec_to_seconds. Default: 2d. [qualify] An array of qualifications with which to filter workers who may accept a transcript job. The first part of the qualification should be the string form of a key in RTurk::Qualifications::TYPES (see https://github.com/mdp/rturk/blob/master/lib/rturk/builders/qualification_builder.rb ). The second part should be one of the following comparators: > >= < <= == != exists. The optional third part is a value. Default: ['approval_rate >= 95']. [keywords] An array of keywords with which to tag each transcription job. Default: ['transcription', 'audio', 'mp3'].
==API Values are read via same-named methods and set via same-named equals methods, like so: transcript_path = config.transcripts config.transcripts = new_path
Nested sections are created simply by declaring a nested class (which should typically inherit from Config, even if nested several levels lower).
Fields can be assigned special behaviors:
class Config class Root < Config local_path_reader :transcripts class SFTP < Config never_ends_in_slash_reader :url end end end
conf = Typingpool::Config.file conf.transcripts = '~/Documents/Transcripts' puts conf.transcripts #'/Volumes/Redsector/Users/chad/Documents/Transcripts' conf.sftp.url = 'http://luvrecording.s3.amazonaws.com/' puts conf.sftp.url #'http://luvrecording.s3.amazonaws.com'
Direct Known Subclasses
Root, Root::Amazon, Root::Assign, Root::Assign::Qualification, Root::SFTP
Defined Under Namespace
Classes: Root
Constant Summary collapse
- @@default_file =
"~/.typingpool"
Class Method Summary collapse
-
.default_file ⇒ Object
Will always return ~/.typingpool unless you subclass.
- .define_accessor(*syms, &block) ⇒ Object
- .define_reader(*syms, &block) ⇒ Object
- .define_writer(*syms, &block) ⇒ Object
-
.file(path = File.expand_path(default_file)) ⇒ Object
Constructor.
-
.from_bundled_template ⇒ Object
Returns a new Config instance, empty except for the values included in lib/templates/config.yml.
- .inherited(subklass) ⇒ Object
-
.local_path_reader(*syms) ⇒ Object
Define a field in a Config subclass as a local path.
-
.never_ends_in_slash_reader(*syms) ⇒ Object
Define a field in a Config subclass as never ending in '/'.
- .subklass?(param) ⇒ Boolean
-
.time_accessor(*syms) ⇒ Object
Define a field in a Config subclass as a time-length specification.
Instance Method Summary collapse
-
#[](key) ⇒ Object
Read the raw data for a field.
-
#[]=(key, value) ⇒ Object
Set the raw data for a field.
-
#initialize(params) ⇒ Config
constructor
A new instance of Config.
- #method_missing(meth, *args) ⇒ Object
-
#to_hash ⇒ Object
All fields as raw key-value pairs.
Constructor Details
#initialize(params) ⇒ Config
Returns a new instance of Config.
107 108 109 |
# File 'lib/typingpool/config.rb', line 107 def initialize(params) @param = params end |
Dynamic Method Handling
This class handles dynamic methods through the method_missing method
#method_missing(meth, *args) ⇒ Object
216 217 218 219 220 221 222 223 224 225 226 227 228 |
# File 'lib/typingpool/config.rb', line 216 def method_missing(meth, *args) equals_param = equals_method?(meth) if equals_param args.count == 1 or raise Error::Argument, "Wrong number of args (#{args.count} for 1)" return @param[equals_param] = args[0] end args.empty? or raise Error::Argument, "Too many args #{meth} #{args.join('|')}" value = @param[meth.to_s] if self.class.subklass?(meth.to_s) && value return self.class.subklass?(meth.to_s).new(value) end value end |
Class Method Details
.default_file ⇒ Object
Will always return ~/.typingpool unless you subclass. Will be handed to File.expand_path before use.
123 124 125 |
# File 'lib/typingpool/config.rb', line 123 def default_file @@default_file end |
.define_accessor(*syms, &block) ⇒ Object
180 181 182 183 184 185 186 187 188 |
# File 'lib/typingpool/config.rb', line 180 def define_accessor(*syms, &block) #explicit block passing to avoid sefault in 1.9.3-p362 define_reader(*syms) do |value| block.call(value) if value end define_writer(*syms) do |value| block.call(value) end end |
.define_reader(*syms, &block) ⇒ Object
161 162 163 164 165 166 167 168 169 |
# File 'lib/typingpool/config.rb', line 161 def define_reader(*syms, &block) #explicit block passing to avoid sefault in 1.9.3-p362 syms.each do |sym| define_method(sym) do value = @param[sym.to_s] block.call(value) end end end |
.define_writer(*syms, &block) ⇒ Object
171 172 173 174 175 176 177 178 |
# File 'lib/typingpool/config.rb', line 171 def define_writer(*syms, &block) #explicit block passing to avoid sefault in 1.9.3-p362 syms.each do |sym| define_method("#{sym.to_s}=".to_sym) do |value| @param[sym.to_s] = block.call(value) end end end |
.file(path = File.expand_path(default_file)) ⇒ Object
Constructor.
Params
[path] Fully expanded path to YAML file.
Returns
Config instance.
117 118 119 |
# File 'lib/typingpool/config.rb', line 117 def file(path=File.(default_file)) Root.new(YAML.load(IO.read((path)))) end |
.from_bundled_template ⇒ Object
Returns a new Config instance, empty except for the values included in lib/templates/config.yml
129 130 131 |
# File 'lib/typingpool/config.rb', line 129 def from_bundled_template file(File.join(Utility.lib_dir, 'templates', 'config.yml')) end |
.inherited(subklass) ⇒ Object
190 191 192 193 |
# File 'lib/typingpool/config.rb', line 190 def inherited(subklass) @@subklasses ||= {} @@subklasses[subklass.name.downcase] = subklass end |
.local_path_reader(*syms) ⇒ Object
Define a field in a Config subclass as a local path. Reads on that field will be filtered through File.expand_path.
137 138 139 140 141 |
# File 'lib/typingpool/config.rb', line 137 def local_path_reader(*syms) define_reader(*syms) do |value| File.(value) if value end end |
.never_ends_in_slash_reader(*syms) ⇒ Object
Define a field in a Config subclass as never ending in '/'. Useful for URLs and SFTP path specs. When a field is set to a value ending in '/', the last character is stripped.
146 147 148 149 150 |
# File 'lib/typingpool/config.rb', line 146 def never_ends_in_slash_reader(*syms) define_reader(*syms) do |value| value.sub(/\/$/, '') if value end end |
.subklass?(param) ⇒ Boolean
195 196 197 |
# File 'lib/typingpool/config.rb', line 195 def subklass?(param) @@subklasses["#{self.name.downcase}::#{param.downcase}"] end |
.time_accessor(*syms) ⇒ Object
Define a field in a Config subclass as a time-length specification. For format details, see docs for Utility.timespec_to_seconds.
155 156 157 158 159 |
# File 'lib/typingpool/config.rb', line 155 def time_accessor(*syms) define_accessor(*syms) do |value| Utility.timespec_to_seconds(value) or raise Error::Argument::Format, "Can't convert '#{value}' to time" end end |
Instance Method Details
#[](key) ⇒ Object
Read the raw data for a field
207 208 209 |
# File 'lib/typingpool/config.rb', line 207 def [](key) @param[key] end |
#[]=(key, value) ⇒ Object
Set the raw data for a field
212 213 214 |
# File 'lib/typingpool/config.rb', line 212 def []=(key, value) @param[key] = value end |
#to_hash ⇒ Object
All fields as raw key-value pairs. For nested subclasses, the value is another hash.
202 203 204 |
# File 'lib/typingpool/config.rb', line 202 def to_hash @param end |