Module: ActiveJob::TestHelper
| Relationships & Source Files | |
| Namespace Children | |
|
Modules:
| |
| Extension / Inclusion / Inheritance Descendants | |
|
Included In:
| |
| Super Chains via Extension / Inclusion / Inheritance | |
|
Instance Chain:
|
|
| Defined in: | activejob/lib/active_job/test_helper.rb |
Overview
Provides helper methods for testing Active Job
Constant Summary
::ActiveSupport::Testing::Assertions
- Included
TestQueueAdapter
- Attributes & Methods
Instance Attribute Summary
- #enqueued_jobs rw
- #performed_jobs rw
- #using_test_adapter? ⇒ Boolean readonly private
Instance Method Summary
-
#assert_enqueued_jobs(number, only: nil, except: nil, queue: nil, &block)
Asserts that the number of enqueued jobs matches the given number.
-
#assert_enqueued_with(job: nil, args: nil, at: nil, queue: nil, priority: nil, &block)
Asserts that the job has been enqueued with the given arguments.
-
#assert_no_enqueued_jobs(only: nil, except: nil, queue: nil, &block)
Asserts that no jobs have been enqueued.
-
#assert_no_performed_jobs(only: nil, except: nil, queue: nil, &block)
Asserts that no jobs have been performed.
-
#assert_performed_jobs(number, only: nil, except: nil, queue: nil, &block)
Asserts that the number of performed jobs matches the given number.
-
#assert_performed_with(job: nil, args: nil, at: nil, queue: nil, priority: nil, &block)
Asserts that the job has been performed with the given arguments.
-
#perform_enqueued_jobs(only: nil, except: nil, queue: nil, at: nil, &block)
Performs all enqueued jobs.
-
#queue_adapter
Accesses the queue_adapter set by
Base
. -
#queue_adapter_for_test
Specifies the queue adapter to use with all Active Job test helpers.
- #clear_enqueued_jobs private
- #clear_performed_jobs private
- #deserialize_args_for_assertion(job) private
- #enqueued_jobs_with(only: nil, except: nil, queue: nil, at: nil, &block) private
- #filter_as_proc(filter) private
- #flush_enqueued_jobs(only: nil, except: nil, queue: nil, at: nil) private
- #instantiate_job(payload, skip_deserialize_arguments: false) private
- #jobs_with(jobs, only: nil, except: nil, queue: nil, at: nil) private
- #performed_jobs_with(only: nil, except: nil, queue: nil, &block) private
- #prepare_args_for_assertion(args) private
- #queue_adapter_changed_jobs private
- #validate_option(only: nil, except: nil) private
- #after_teardown Internal use only
- #before_setup Internal use only
::ActiveSupport::Testing::Assertions
- Included
| #assert_changes | Assertion that the result of evaluating an expression is changed before and after invoking the passed in block. |
| #assert_difference | Test numeric difference between the return value of an expression as a result of what is evaluated in the yielded block. |
| #assert_no_changes | Assertion that the result of evaluating an expression is not changed before and after invoking the passed in block. |
| #assert_no_difference | Assertion that the numeric result of evaluating an expression is not changed before and after invoking the passed in block. |
| #assert_not | Asserts that an expression is not truthy. |
| #assert_nothing_raised | Assertion that the block should not raise an exception. |
| #assert_raise | |
| #assert_raises | Asserts that a block raises one of |
| #_assert_nothing_raised_or_warn |
Class Attribute Details
._test_adapter (rw)
[ GitHub ]# File 'activejob/lib/active_job/test_helper.rb', line 19
class_attribute :_test_adapter, instance_accessor: false, instance_predicate: false
Instance Attribute Details
#enqueued_jobs (rw)
[ GitHub ]# File 'activejob/lib/active_job/test_helper.rb', line 9
delegate :enqueued_jobs, :enqueued_jobs=, :performed_jobs, :performed_jobs=, to: :queue_adapter
#performed_jobs (rw)
[ GitHub ]# File 'activejob/lib/active_job/test_helper.rb', line 9
delegate :enqueued_jobs, :enqueued_jobs=, :performed_jobs, :performed_jobs=, to: :queue_adapter
#using_test_adapter? ⇒ Boolean
(readonly, private)
[ GitHub ]
# File 'activejob/lib/active_job/test_helper.rb', line 644
def using_test_adapter? queue_adapter.is_a?(ActiveJob::QueueAdapters::TestAdapter) end
Instance Method Details
#after_teardown
# File 'activejob/lib/active_job/test_helper.rb', line 51
def after_teardown # :nodoc: super queue_adapter_changed_jobs.each { |klass| klass.disable_test_adapter } end
#assert_enqueued_jobs(number, only: nil, except: nil, queue: nil, &block)
Asserts that the number of enqueued jobs matches the given number.
def test_jobs
assert_enqueued_jobs 0
HelloJob.perform_later('david')
assert_enqueued_jobs 1
HelloJob.perform_later('abdelkader')
assert_enqueued_jobs 2
end
If a block is passed, asserts that the block will cause the specified number of jobs to be enqueued.
def test_jobs_again
assert_enqueued_jobs 1 do
HelloJob.perform_later('cristian')
end
assert_enqueued_jobs 2 do
HelloJob.perform_later('aaron')
HelloJob.perform_later('rafael')
end
end
Asserts the number of times a specific job was enqueued by passing :only
option.
def test_logging_job
assert_enqueued_jobs 1, only: LoggingJob do
LoggingJob.perform_later
HelloJob.perform_later('jeremy')
end
end
Asserts the number of times a job except specific class was enqueued by passing :except
option.
def test_logging_job
assert_enqueued_jobs 1, except: HelloJob do
LoggingJob.perform_later
HelloJob.perform_later('jeremy')
end
end
:only
and :except
options accept ::Class
, ::Array
of ::Class
, or Proc. When passed a Proc, a hash containing the job’s class and it’s argument are passed as argument.
Asserts the number of times a job is enqueued to a specific queue by passing :queue
option.
def test_logging_job
assert_enqueued_jobs 2, queue: 'default' do
LoggingJob.perform_later
HelloJob.perform_later('elfassy')
end
end
# File 'activejob/lib/active_job/test_helper.rb', line 123
def assert_enqueued_jobs(number, only: nil, except: nil, queue: nil, &block) if block_given? original_jobs = enqueued_jobs_with(only: only, except: except, queue: queue) _assert_nothing_raised_or_warn("assert_enqueued_jobs", &block) new_jobs = enqueued_jobs_with(only: only, except: except, queue: queue) actual_count = (new_jobs - original_jobs).count else actual_count = enqueued_jobs_with(only: only, except: except, queue: queue).count end assert_equal number, actual_count, "#{number} jobs expected, but #{actual_count} were enqueued" end
#assert_enqueued_with(job: nil, args: nil, at: nil, queue: nil, priority: nil, &block)
Asserts that the job has been enqueued with the given arguments.
def test_assert_enqueued_with
MyJob.perform_later(1,2,3)
assert_enqueued_with(job: MyJob, args: [1,2,3])
MyJob.set(wait_until: Date.tomorrow.noon, queue: "my_queue").perform_later
assert_enqueued_with(at: Date.tomorrow.noon, queue: "my_queue")
end
The given arguments may also be specified as matcher procs that return a boolean value indicating whether a job’s attribute meets certain criteria.
For example, a proc can be used to match a range of times:
def test_assert_enqueued_with
at_matcher = ->(job_at) { (Date.yesterday..Date.tomorrow).cover?(job_at) }
MyJob.set(wait_until: Date.today.noon).perform_later
assert_enqueued_with(job: MyJob, at: at_matcher)
end
A proc can also be used to match a subset of a job’s args:
def test_assert_enqueued_with
args_matcher = ->(job_args) { job_args[0].key?(:foo) }
MyJob.perform_later(foo: "bar", other_arg: "No need to check in the test")
assert_enqueued_with(job: MyJob, args: args_matcher)
end
If a block is passed, asserts that the block will cause the job to be enqueued with the given arguments.
def test_assert_enqueued_with
assert_enqueued_with(job: MyJob, args: [1,2,3]) do
MyJob.perform_later(1,2,3)
end
assert_enqueued_with(job: MyJob, at: Date.tomorrow.noon) do
MyJob.set(wait_until: Date.tomorrow.noon).perform_later
end
end
# File 'activejob/lib/active_job/test_helper.rb', line 392
def assert_enqueued_with(job: nil, args: nil, at: nil, queue: nil, priority: nil, &block) expected = { job: job, args: args, at: at, queue: queue, priority: priority }.compact expected_args = prepare_args_for_assertion(expected) potential_matches = [] if block_given? original_enqueued_jobs = enqueued_jobs.dup _assert_nothing_raised_or_warn("assert_enqueued_with", &block) jobs = enqueued_jobs - original_enqueued_jobs else jobs = enqueued_jobs end matching_job = jobs.find do |enqueued_job| deserialized_job = deserialize_args_for_assertion(enqueued_job) potential_matches << deserialized_job expected_args.all? do |key, value| if value.respond_to?(:call) value.call(deserialized_job[key]) else value == deserialized_job[key] end end end matching_class = potential_matches.select do |enqueued_job| enqueued_job["job_class"] == job.to_s end = +"No enqueued job found with #{expected}" if potential_matches.empty? << "\n\nNo jobs were enqueued" elsif matching_class.empty? << "\n\nNo jobs of class #{expected[:job]} were enqueued, job classes enqueued: " << potential_matches.map { |job| job["job_class"] }.join(", ") else << "\n\nPotential matches: #{matching_class.join("\n")}" end assert matching_job, instantiate_job(matching_job) end
#assert_no_enqueued_jobs(only: nil, except: nil, queue: nil, &block)
Asserts that no jobs have been enqueued.
def test_jobs
assert_no_enqueued_jobs
HelloJob.perform_later('jeremy')
assert_enqueued_jobs 1
end
If a block is passed, asserts that the block will not cause any job to be enqueued.
def test_jobs_again
assert_no_enqueued_jobs do
# No job should be enqueued from this block
end
end
Asserts that no jobs of a specific kind are enqueued by passing :only
option.
def test_no_logging
assert_no_enqueued_jobs only: LoggingJob do
HelloJob.perform_later('jeremy')
end
end
Asserts that no jobs except specific class are enqueued by passing :except
option.
def test_no_logging
assert_no_enqueued_jobs except: HelloJob do
HelloJob.perform_later('jeremy')
end
end
:only
and :except
options accept ::Class
, ::Array
of ::Class
, or Proc. When passed a Proc, a hash containing the job’s class and it’s argument are passed as argument.
Asserts that no jobs are enqueued to a specific queue by passing :queue
option
def test_no_logging
assert_no_enqueued_jobs queue: 'default' do
LoggingJob.set(queue: :some_queue).perform_later
end
end
Note: This assertion is simply a shortcut for:
assert_enqueued_jobs 0, &block
# File 'activejob/lib/active_job/test_helper.rb', line 185
def assert_no_enqueued_jobs(only: nil, except: nil, queue: nil, &block) assert_enqueued_jobs 0, only: only, except: except, queue: queue, &block end
#assert_no_performed_jobs(only: nil, except: nil, queue: nil, &block)
Asserts that no jobs have been performed.
def test_jobs
assert_no_performed_jobs
perform_enqueued_jobs do
HelloJob.perform_later('matthew')
assert_performed_jobs 1
end
end
If a block is passed, asserts that the block will not cause any job to be performed.
def test_jobs_again
assert_no_performed_jobs do
# No job should be performed from this block
end
end
The block form supports filtering. If the :only
option is specified, then only the listed job(s) will not be performed.
def test_no_logging
assert_no_performed_jobs only: LoggingJob do
HelloJob.perform_later('jeremy')
end
end
Also if the :except
option is specified, then the job(s) except specific class will not be performed.
def test_no_logging
assert_no_performed_jobs except: HelloJob do
HelloJob.perform_later('jeremy')
end
end
:only
and :except
options accept ::Class
, ::Array
of ::Class
, or Proc. When passed a Proc, an instance of the job will be passed as argument.
If the :queue
option is specified, then only the job(s) enqueued to a specific queue will not be performed.
def test_assert_no_performed_jobs_with_queue_option
assert_no_performed_jobs queue: :some_queue do
HelloJob.set(queue: :other_queue).perform_later("jeremy")
end
end
Note: This assertion is simply a shortcut for:
assert_performed_jobs 0, &block
# File 'activejob/lib/active_job/test_helper.rb', line 343
def assert_no_performed_jobs(only: nil, except: nil, queue: nil, &block) assert_performed_jobs 0, only: only, except: except, queue: queue, &block end
#assert_performed_jobs(number, only: nil, except: nil, queue: nil, &block)
Asserts that the number of performed jobs matches the given number. If no block is passed, #perform_enqueued_jobs must be called around or after the job call.
def test_jobs
assert_performed_jobs 0
perform_enqueued_jobs do
HelloJob.perform_later('xavier')
end
assert_performed_jobs 1
HelloJob.perform_later('yves')
perform_enqueued_jobs
assert_performed_jobs 2
end
If a block is passed, asserts that the block will cause the specified number of jobs to be performed.
def test_jobs_again
assert_performed_jobs 1 do
HelloJob.perform_later('robin')
end
assert_performed_jobs 2 do
HelloJob.perform_later('carlos')
HelloJob.perform_later('sean')
end
end
This method also supports filtering. If the :only
option is specified, then only the listed job(s) will be performed.
def test_hello_job
assert_performed_jobs 1, only: HelloJob do
HelloJob.perform_later('jeremy')
LoggingJob.perform_later
end
end
Also if the :except
option is specified, then the job(s) except specific class will be performed.
def test_hello_job
assert_performed_jobs 1, except: LoggingJob do
HelloJob.perform_later('jeremy')
LoggingJob.perform_later
end
end
An array may also be specified, to support testing multiple jobs.
def test_hello_and_logging_jobs
assert_nothing_raised do
assert_performed_jobs 2, only: [HelloJob, LoggingJob] do
HelloJob.perform_later('jeremy')
LoggingJob.perform_later('stewie')
RescueJob.perform_later('david')
end
end
end
A proc may also be specified. When passed a Proc, the job’s instance will be passed as argument.
def test_hello_and_logging_jobs
assert_nothing_raised do
assert_performed_jobs(1, only: ->(job) { job.is_a?(HelloJob) }) do
HelloJob.perform_later('jeremy')
LoggingJob.perform_later('stewie')
RescueJob.perform_later('david')
end
end
end
If the :queue
option is specified, then only the job(s) enqueued to a specific queue will be performed.
def test_assert_performed_jobs_with_queue_option
assert_performed_jobs 1, queue: :some_queue do
HelloJob.set(queue: :some_queue).perform_later("jeremy")
HelloJob.set(queue: :other_queue).perform_later("bogdan")
end
end
# File 'activejob/lib/active_job/test_helper.rb', line 275
def assert_performed_jobs(number, only: nil, except: nil, queue: nil, &block) if block_given? original_count = performed_jobs.size perform_enqueued_jobs(only: only, except: except, queue: queue, &block) new_count = performed_jobs.size performed_jobs_size = new_count - original_count else performed_jobs_size = performed_jobs_with(only: only, except: except, queue: queue).count end assert_equal number, performed_jobs_size, "#{number} jobs expected, but #{performed_jobs_size} were performed" end
#assert_performed_with(job: nil, args: nil, at: nil, queue: nil, priority: nil, &block)
Asserts that the job has been performed with the given arguments.
def test_assert_performed_with
MyJob.perform_later(1,2,3)
perform_enqueued_jobs
assert_performed_with(job: MyJob, args: [1,2,3])
MyJob.set(wait_until: Date.tomorrow.noon, queue: "my_queue").perform_later
perform_enqueued_jobs
assert_performed_with(at: Date.tomorrow.noon, queue: "my_queue")
end
The given arguments may also be specified as matcher procs that return a boolean value indicating whether a job’s attribute meets certain criteria.
For example, a proc can be used to match a range of times:
def test_assert_performed_with
at_matcher = ->(job_at) { (Date.yesterday..Date.tomorrow).cover?(job_at) }
MyJob.set(wait_until: Date.today.noon).perform_later
perform_enqueued_jobs
assert_performed_with(job: MyJob, at: at_matcher)
end
A proc can also be used to match a subset of a job’s args:
def test_assert_performed_with
args_matcher = ->(job_args) { job_args[0].key?(:foo) }
MyJob.perform_later(foo: "bar", other_arg: "No need to check in the test")
perform_enqueued_jobs
assert_performed_with(job: MyJob, args: args_matcher)
end
If a block is passed, that block performs all of the jobs that were enqueued throughout the duration of the block and asserts that the job has been performed with the given arguments in the block.
def test_assert_performed_with
assert_performed_with(job: MyJob, args: [1,2,3]) do
MyJob.perform_later(1,2,3)
end
assert_performed_with(job: MyJob, at: Date.tomorrow.noon) do
MyJob.set(wait_until: Date.tomorrow.noon).perform_later
end
end
# File 'activejob/lib/active_job/test_helper.rb', line 494
def assert_performed_with(job: nil, args: nil, at: nil, queue: nil, priority: nil, &block) expected = { job: job, args: args, at: at, queue: queue, priority: priority }.compact expected_args = prepare_args_for_assertion(expected) potential_matches = [] if block_given? original_performed_jobs_count = performed_jobs.count perform_enqueued_jobs(&block) jobs = performed_jobs.drop(original_performed_jobs_count) else jobs = performed_jobs end matching_job = jobs.find do |enqueued_job| deserialized_job = deserialize_args_for_assertion(enqueued_job) potential_matches << deserialized_job expected_args.all? do |key, value| if value.respond_to?(:call) value.call(deserialized_job[key]) else value == deserialized_job[key] end end end matching_class = potential_matches.select do |enqueued_job| enqueued_job["job_class"] == job.to_s end = +"No performed job found with #{expected}" if potential_matches.empty? << "\n\nNo jobs were performed" elsif matching_class.empty? << "\n\nNo jobs of class #{expected[:job]} were performed, job classes performed: " << potential_matches.map { |job| job["job_class"] }.join(", ") else << "\n\nPotential matches: #{matching_class.join("\n")}" end assert matching_job, instantiate_job(matching_job) end
#before_setup
# File 'activejob/lib/active_job/test_helper.rb', line 39
def before_setup # :nodoc: test_adapter = queue_adapter_for_test queue_adapter_changed_jobs.each do |klass| klass.enable_test_adapter(test_adapter) end clear_enqueued_jobs clear_performed_jobs super end
#clear_enqueued_jobs (private)
[ GitHub ]# File 'activejob/lib/active_job/test_helper.rb', line 648
def clear_enqueued_jobs enqueued_jobs.clear if using_test_adapter? end
#clear_performed_jobs (private)
[ GitHub ]# File 'activejob/lib/active_job/test_helper.rb', line 652
def clear_performed_jobs performed_jobs.clear if using_test_adapter? end
#deserialize_args_for_assertion(job) (private)
[ GitHub ]# File 'activejob/lib/active_job/test_helper.rb', line 717
def deserialize_args_for_assertion(job) job.dup.tap do |new_job| new_job[:at] = Time.at(new_job[:at]) if new_job[:at] new_job[:args] = ActiveJob::Arguments.deserialize(new_job[:args]) if new_job[:args] end end
#enqueued_jobs_with(only: nil, except: nil, queue: nil, at: nil, &block) (private)
[ GitHub ]# File 'activejob/lib/active_job/test_helper.rb', line 688
def enqueued_jobs_with(only: nil, except: nil, queue: nil, at: nil, &block) jobs_with(enqueued_jobs, only: only, except: except, queue: queue, at: at, &block) end
#filter_as_proc(filter) (private)
[ GitHub ]# File 'activejob/lib/active_job/test_helper.rb', line 682
def filter_as_proc(filter) return filter if filter.is_a?(Proc) ->(job) { Array(filter).include?(job.fetch(:job)) } end
#flush_enqueued_jobs(only: nil, except: nil, queue: nil, at: nil) (private)
[ GitHub ]# File 'activejob/lib/active_job/test_helper.rb', line 696
def flush_enqueued_jobs(only: nil, except: nil, queue: nil, at: nil) enqueued_jobs_with(only: only, except: except, queue: queue, at: at) do |payload| queue_adapter.enqueued_jobs.delete(payload) queue_adapter.performed_jobs << payload instantiate_job(payload, skip_deserialize_arguments: true).perform_now end.count end
#instantiate_job(payload, skip_deserialize_arguments: false) (private)
[ GitHub ]# File 'activejob/lib/active_job/test_helper.rb', line 724
def instantiate_job(payload, skip_deserialize_arguments: false) job = payload[:job].deserialize(payload) job.scheduled_at = payload[:at].to_f if payload.key?(:at) job.send(:deserialize_arguments_if_needed) unless skip_deserialize_arguments job end
#jobs_with(jobs, only: nil, except: nil, queue: nil, at: nil) (private)
[ GitHub ]# File 'activejob/lib/active_job/test_helper.rb', line 656
def jobs_with(jobs, only: nil, except: nil, queue: nil, at: nil) validate_option(only: only, except: except) jobs.dup.select do |job| job_class = job.fetch(:job) if only next false unless filter_as_proc(only).call(job) elsif except next false if filter_as_proc(except).call(job) end if queue next false unless queue.to_s == job.fetch(:queue, job_class.queue_name) end if at && job[:at] next false if job[:at] > at.to_f end yield job if block_given? true end end
#perform_enqueued_jobs(only: nil, except: nil, queue: nil, at: nil, &block)
Performs all enqueued jobs. If a block is given, performs all of the jobs that were enqueued throughout the duration of the block. If a block is not given, performs all of the enqueued jobs up to this point in the test.
def test_perform_enqueued_jobs
perform_enqueued_jobs do
MyJob.perform_later(1, 2, 3)
end
assert_performed_jobs 1
end
def test_perform_enqueued_jobs_without_block
MyJob.perform_later(1, 2, 3)
perform_enqueued_jobs
assert_performed_jobs 1
end
This method also supports filtering. If the :only
option is specified, then only the listed job(s) will be performed.
def test_perform_enqueued_jobs_with_only
perform_enqueued_jobs(only: MyJob) do
MyJob.perform_later(1, 2, 3) # will be performed
HelloJob.perform_later(1, 2, 3) # will not be performed
end
assert_performed_jobs 1
end
Also if the :except
option is specified, then the job(s) except specific class will be performed.
def test_perform_enqueued_jobs_with_except
perform_enqueued_jobs(except: HelloJob) do
MyJob.perform_later(1, 2, 3) # will be performed
HelloJob.perform_later(1, 2, 3) # will not be performed
end
assert_performed_jobs 1
end
:only
and :except
options accept ::Class
, ::Array
of ::Class
, or Proc. When passed a Proc, an instance of the job will be passed as argument.
If the :queue
option is specified, then only the job(s) enqueued to a specific queue will be performed.
def test_perform_enqueued_jobs_with_queue
perform_enqueued_jobs queue: :some_queue do
MyJob.set(queue: :some_queue).perform_later(1, 2, 3) # will be performed
HelloJob.set(queue: :other_queue).perform_later(1, 2, 3) # will not be performed
end
assert_performed_jobs 1
end
If the :at
option is specified, then only run jobs enqueued to run immediately or before the given time
If an adapter other than the test adapter is in use, this method just yields. See queue_adapter_for_test for more information.
# File 'activejob/lib/active_job/test_helper.rb', line 601
def perform_enqueued_jobs(only: nil, except: nil, queue: nil, at: nil, &block) return flush_enqueued_jobs(only: only, except: except, queue: queue, at: at) unless block_given? return _assert_nothing_raised_or_warn("perform_enqueued_jobs", &block) unless using_test_adapter? validate_option(only: only, except: except) old_perform_enqueued_jobs = queue_adapter.perform_enqueued_jobs old_perform_enqueued_at_jobs = queue_adapter.perform_enqueued_at_jobs old_filter = queue_adapter.filter old_reject = queue_adapter.reject old_queue = queue_adapter.queue old_at = queue_adapter.at begin queue_adapter.perform_enqueued_jobs = true queue_adapter.perform_enqueued_at_jobs = true queue_adapter.filter = only queue_adapter.reject = except queue_adapter.queue = queue queue_adapter.at = at _assert_nothing_raised_or_warn("perform_enqueued_jobs", &block) ensure queue_adapter.perform_enqueued_jobs = old_perform_enqueued_jobs queue_adapter.perform_enqueued_at_jobs = old_perform_enqueued_at_jobs queue_adapter.filter = old_filter queue_adapter.reject = old_reject queue_adapter.queue = old_queue queue_adapter.at = old_at end end
#performed_jobs_with(only: nil, except: nil, queue: nil, &block) (private)
[ GitHub ]# File 'activejob/lib/active_job/test_helper.rb', line 692
def performed_jobs_with(only: nil, except: nil, queue: nil, &block) jobs_with(performed_jobs, only: only, except: except, queue: queue, &block) end
#prepare_args_for_assertion(args) (private)
[ GitHub ]# File 'activejob/lib/active_job/test_helper.rb', line 704
def prepare_args_for_assertion(args) args.dup.tap do |arguments| if arguments[:queue].is_a?(Symbol) arguments[:queue] = arguments[:queue].to_s end if arguments[:at].acts_like?(:time) at_range = arguments[:at] - 1..arguments[:at] + 1 arguments[:at] = ->(at) { at_range.cover?(at) } end end end
#queue_adapter
Accesses the queue_adapter set by Base
.
def test_assert_job_has_custom_queue_adapter_set
assert_instance_of CustomQueueAdapter, HelloJob.queue_adapter
end
# File 'activejob/lib/active_job/test_helper.rb', line 639
def queue_adapter ActiveJob::Base.queue_adapter end
#queue_adapter_changed_jobs (private)
[ GitHub ]# File 'activejob/lib/active_job/test_helper.rb', line 731
def queue_adapter_changed_jobs (ActiveJob::Base.descendants << ActiveJob::Base).select do |klass| # only override explicitly set adapters, a quirk of `class_attribute` klass.singleton_class.public_instance_methods(false).include?(:_queue_adapter) end end
#queue_adapter_for_test
Specifies the queue adapter to use with all Active Job test helpers.
Returns an instance of the queue adapter and defaults to QueueAdapters::TestAdapter
.
Note: The adapter provided by this method must provide some additional methods from those expected of a standard QueueAdapter
in order to be used with the active job test helpers. Refer to QueueAdapters::TestAdapter
.
# File 'activejob/lib/active_job/test_helper.rb', line 66
def queue_adapter_for_test ActiveJob::QueueAdapters::TestAdapter.new end
#validate_option(only: nil, except: nil) (private)
# File 'activejob/lib/active_job/test_helper.rb', line 738
def validate_option(only: nil, except: nil) raise ArgumentError, "Cannot specify both `:only` and `:except` options." if only && except end


| I l@ve RuBoard |
This chapter describes the numeric components of the C++ standard library. In particular, it presents the class for complex numbers, the classes for value arrays, and the global numeric functions, which are inherited from the C library.
Two other numeric components in the C++ standard library are described in other parts of this book:
The STL contains some numeric algorithms that are described in Section 9.11.
For all fundamental numeric data types, the implementation-specific aspects of their representation are described by numeric_limits, as described in Section 4.3.
| I l@ve RuBoard |


To help you get the best out of ctis, we have curated a list of frequently asked questions, so you don't have to ask them.
What does ctis mean?
CTIS stands for CU (Covenant University) Traveller Information System
What is an Advanced Traveller Information System?
An ATIS is a system which helps users plan their trips around a region effectively. Popular examples are what you see at bus terminals and more recently, apps like Waze.
How is it of benefit to me?
An ATIS saves you the time and cost of not knowing how to plan your journeys. It helps increase your mobility and improves safety.
How can I use it?
Simply go to the map, to get useful information.
Do I need to pay for the service?
No, it's entirely free.


{% extends 'base.html' %} {% block title %}Pending Employees{% endblock %} {% block content %} {{ agency.name }} Pending Employees
There are no pending employees at this time.


| 26 Aug 1974 |
Aviator Charles Lindbergh dies of lymphatic infection and cancer, at his home in Hana, Maui HI. He is buried at Kipahulu in a eucalyptus coffin. And the Kipahulu natives don't want your haole ass there. |
| 27 Jul 1980 |
The Shah of Iran dies of lymphatic cancer in Cairo, Egypt. |
| 22 Sep 1987 |
Dan Rowan of Rowan and Martin's Laugh-In dies of lymphoma, Englewood FL. Say goodnight, Dick. |
| 20 May 1994 |
Jacqueline Kennedy Onassis, wife of John F. Kennedy and Aristotle Onassis, dies of non-Hodgkins lymphoma. |
| 27 Aug 1997 |
Former president of NBC, Brandon Tartikoff dies of Hodgkin's disease at UCLA Medical Center in Los Angeles, CA. Among Tartikoff's achievements at the network is Manimal. He is buried at Mt. Sinai Memorial Park also in Los Angeles. |
| 2 Oct 1998 |
Country-western signer Gene Autry dies of lymphoma at his home in North Hollywood CA. Estimated net worth, $350M. Buried at Forest Lawn, Hollywood Hills. |
| 7 Feb 1999 |
King Hussein of Jordan dies from non-Hodgkins lymphoma, at a hospital in Amman Jordan, after six months of unsuccessful treatment at the Mayo Clinic in the United States. |
| 15 Apr 2001 |
Ramones singer Joey Ramone dies of lymphoma at a New York City hospital. He is buried in Hillside Cemetery, Woodhurst NJ. |
| 15 Mar 2003 |
Former CEO of Adolph Coors Brewing Co., Joseph Coors dies of lymphatic cancer at his home in Rancho Mirage, CA. Was instrumental in the creation of the Heritage Foundation think tank. |


public interface FunctionDefOrBuilder
extends org.nd4j.shade.protobuf.MessageOrBuilder
| Modifier and Type | Method and Description |
|---|---|
boolean |
containsAttr(String key)
Attributes specific to this function definition.
|
boolean |
containsRet(String key)
A mapping from the output arg names from `signature` to the
outputs from `node_def` that should be returned by the function.
|
Map<String,AttrValue> |
getAttr()
Deprecated.
|
int |
getAttrCount()
Attributes specific to this function definition.
|
Map<String,AttrValue> |
getAttrMap()
Attributes specific to this function definition.
|
AttrValue |
getAttrOrDefault(String key,
AttrValue defaultValue)
Attributes specific to this function definition.
|
AttrValue |
getAttrOrThrow(String key)
Attributes specific to this function definition.
|
NodeDef |
getNodeDef(int index)
By convention, "op" in node_def is resolved by consulting with a
user-defined library first.
|
int |
getNodeDefCount()
By convention, "op" in node_def is resolved by consulting with a
user-defined library first.
|
List<NodeDef> |
getNodeDefList()
By convention, "op" in node_def is resolved by consulting with a
user-defined library first.
|
NodeDefOrBuilder |
getNodeDefOrBuilder(int index)
By convention, "op" in node_def is resolved by consulting with a
user-defined library first.
|
List<? extends NodeDefOrBuilder> |
getNodeDefOrBuilderList()
By convention, "op" in node_def is resolved by consulting with a
user-defined library first.
|
Map<String,String> |
getRet()
Deprecated.
|
int |
getRetCount()
A mapping from the output arg names from `signature` to the
outputs from `node_def` that should be returned by the function.
|
Map<String,String> |
getRetMap()
A mapping from the output arg names from `signature` to the
outputs from `node_def` that should be returned by the function.
|
String |
getRetOrDefault(String key,
String defaultValue)
A mapping from the output arg names from `signature` to the
outputs from `node_def` that should be returned by the function.
|
String |
getRetOrThrow(String key)
A mapping from the output arg names from `signature` to the
outputs from `node_def` that should be returned by the function.
|
OpDef |
getSignature()
The definition of the function's name, arguments, return values,
attrs etc.
|
OpDefOrBuilder |
getSignatureOrBuilder()
The definition of the function's name, arguments, return values,
attrs etc.
|
boolean |
hasSignature()
The definition of the function's name, arguments, return values,
attrs etc.
|
findInitializationErrors, getAllFields, getDefaultInstanceForType, getDescriptorForType, getField, getInitializationErrorString, getOneofFieldDescriptor, getRepeatedField, getRepeatedFieldCount, getUnknownFields, hasField, hasOneof
boolean hasSignature()
The definition of the function's name, arguments, return values, attrs etc.
.tensorflow.OpDef signature = 1;
OpDef getSignature()
The definition of the function's name, arguments, return values, attrs etc.
.tensorflow.OpDef signature = 1;
OpDefOrBuilder getSignatureOrBuilder()
The definition of the function's name, arguments, return values, attrs etc.
.tensorflow.OpDef signature = 1;
int getAttrCount()
Attributes specific to this function definition.
map<string, .tensorflow.AttrValue> attr = 5;
boolean containsAttr(String key)
Attributes specific to this function definition.
map<string, .tensorflow.AttrValue> attr = 5;
@Deprecated Map<String,AttrValue> getAttr()
getAttrMap()
instead.Map<String,AttrValue> getAttrMap()
Attributes specific to this function definition.
map<string, .tensorflow.AttrValue> attr = 5;
AttrValue getAttrOrDefault(String key, AttrValue defaultValue)
Attributes specific to this function definition.
map<string, .tensorflow.AttrValue> attr = 5;
AttrValue getAttrOrThrow(String key)
Attributes specific to this function definition.
map<string, .tensorflow.AttrValue> attr = 5;
List<NodeDef> getNodeDefList()
By convention, "op" in node_def is resolved by consulting with a user-defined library first. If not resolved, "func" is assumed to be a builtin op.
repeated .tensorflow.NodeDef node_def = 3;
NodeDef getNodeDef(int index)
By convention, "op" in node_def is resolved by consulting with a user-defined library first. If not resolved, "func" is assumed to be a builtin op.
repeated .tensorflow.NodeDef node_def = 3;
int getNodeDefCount()
By convention, "op" in node_def is resolved by consulting with a user-defined library first. If not resolved, "func" is assumed to be a builtin op.
repeated .tensorflow.NodeDef node_def = 3;
List<? extends NodeDefOrBuilder> getNodeDefOrBuilderList()
By convention, "op" in node_def is resolved by consulting with a user-defined library first. If not resolved, "func" is assumed to be a builtin op.
repeated .tensorflow.NodeDef node_def = 3;
NodeDefOrBuilder getNodeDefOrBuilder(int index)
By convention, "op" in node_def is resolved by consulting with a user-defined library first. If not resolved, "func" is assumed to be a builtin op.
repeated .tensorflow.NodeDef node_def = 3;
int getRetCount()
A mapping from the output arg names from `signature` to the outputs from `node_def` that should be returned by the function.
map<string, string> ret = 4;
boolean containsRet(String key)
A mapping from the output arg names from `signature` to the outputs from `node_def` that should be returned by the function.
map<string, string> ret = 4;
@Deprecated Map<String,String> getRet()
getRetMap()
instead.Map<String,String> getRetMap()
A mapping from the output arg names from `signature` to the outputs from `node_def` that should be returned by the function.
map<string, string> ret = 4;
String getRetOrDefault(String key, String defaultValue)
A mapping from the output arg names from `signature` to the outputs from `node_def` that should be returned by the function.
map<string, string> ret = 4;
Copyright © 2020. All rights reserved.


wart
`Prev `__
W
`Next `__
--------------
**wart**: n.
A small, `*crock* <../C/crock.html>`__\ y
`*feature* <../F/feature.html>`__ that sticks out of an otherwise
`*clean* <../C/clean.html>`__ design. Something conspicuous for
localized ugliness, especially a special-case exception to a general
rule. For example, in some versions of csh(1), single quotes literalize
every character inside them except ``!``. In ANSI C, the ``??`` syntax
used for obtaining ASCII characters in a foreign environment is a wart.
See also `*miswart* <../M/miswart.html>`__.
--------------
+------------------------------+----------------------------+------------------------------------+
| `Prev `__ | `Up <../W.html>`__ | `Next `__ |
+------------------------------+----------------------------+------------------------------------+
| warm boot | `Home <../index.html>`__ | washing machine |
+------------------------------+----------------------------+------------------------------------+


Blue Lagoon is surrounded by palm trees and this area, with its lovely beach, provides a very pleasant anchorage. The marina and hotel have been completely refurbished during 2014 and is due to be fully operational by the end of the year.
Approach - currently boats with a draft of 6.5ft or more cannot enter the marked channel at low tide. The marina management are looking at addressing this in the near future.
See latest comments from cruisers at bottom of page.
Position 13° 07'40" N, 61° 11'40"W (marina)
This is now a port of entry with Customs and Immigration on site at the marina.
Clearance office open form 13:00-18:00 daily.
Last updated March 2016.
This bay offers excellent shelter.
Moorings are sometimes available at the marina. There is also plenty of anchoring space here too and the marina dinghy dock is free of charge with security.
There is a bus stop just outside the marina entrance with buses into Kingstown ($2EC any journey). Here there is an excellent Saturday morning market.
Dinghy accessory thefts were reported here in April 2015 (fuel tank etc.) Be sure to secure all your valuables as you would anywhere in the world.
Last updated March 2016.


Namespace Puli\Manager\Api\Package
| InstallInfo | Contains information about a package installation. |
| Package | A configured package. |
| PackageCollection | A collection of Puli packages. |
| PackageFile | Stores the configuration of a package. |
| PackageState | Contains constants representing the state of a package. |
| RootPackage | The root package. |
| RootPackageFile | The package file of the root package. |
| PackageFileSerializer | Serializes and unserializes package files. |
| PackageManager | Manages the package repository of a Puli project. |
| RootPackageFileManager | Manages changes to the root package file. |
| NameConflictException | Thrown when two packages have the same name. |
| NoSuchPackageException | Thrown when a package was not found. |
| UnsupportedVersionException | Thrown when the version of a package file is not supported. |


WiFi Connect
SSID:
Password:
Connect
Available Networks
This control panel will be available for the following
??
seconds
Refresh
Status
Disconnect


Neuroscience is a rapidly developing field. I will post neuroscience-related news items here from time to time.
Sarel, A., Finkelstein, A., Las, L., & Ulanovsky, N. (2017). Vectorial representation of spatial goals in the hippocampus of bats. Science, 355(6321), 176–180. https://doi.org/10.1126/science.aak9589. #hippcampus #perception
Han, W., Tellez, L. A., Rangel, M. J., Motta, S. C., Zhang, X., Perez, I. O., … Araujo, I. E. de. (2017). Integrated Control of Predatory Hunting by the Central Nucleus of the Amygdala. Cell, 168(1), 311–324.e18. https://doi.org/10.1016/j.cell.2016.12.027.
Neuroscience Can’t Explain How an Atari Works. https://www.technologyreview.com/s/603362/neuroscience-cant-explain-how-an-atari-works/. #computation
The Health Effects of Cannabis and Cannabinoids: The Current State of Evidence and Recommendations for Research (2017). National Academy of Sciences Engineering and Medicine. https://www.nap.edu/catalog/24625/the-health-effects-of-cannabis-and-cannabinoids-the-current-state. #cannabinoids
Bacteria Send Electrical Pulses as Recruitment Ads. https://www.theatlantic.com/science/archive/2017/01/bacteria-electrical-pulse/512825/ #electricalcommunication
Keep Your Eye on the Balls to Become a Better Athlete. https://www.nytimes.com/2017/01/04/sports/neurotracker-athletic-performance.html. #vision
A Break in the Search for the Origin of Complex Life. https://www.theatlantic.com/science/archive/2017/01/our-origins-in-asgard/512645/. #evolution
Coming out of electroshock therapy. https://www.theatlantic.com/notes/2017/01/ect/512102/. #depression #bipolar #ect
Toddler temperament could be influenced by different types of gut bacteria. https://www.sciencedaily.com/releases/2015/05/150527091438.htm. #microbiome #development
What Happened Within This Player’s Skull. http://www.nytimes.com/interactive/2017/01/09/sports/football/what-happened-within-this-players-skull-football-concussions.html?_r=0. #concussion
Kim, A. J., Fenk, L. M., Lyu, C., & Maimon, G. (2017). Quantitative Predictions Orchestrate Visual Signaling in Drosophila. Cell, 0(0). https://doi.org/10.1016/j.cell.2016.12.005. #perception
Gomez, J., Barnett, M. A., Natu, V., Mezer, A., Palomero-Gallagher, N., Weiner, K. S., … Grill-Spector, K. (2017). Microstructural proliferation in human cortex is coupled with the development of face processing. Science, 355(6320), 68–71. https://doi.org/10.1126/science.aag0311. NPR story #adolescence #structuralMRI
Westlye, L. T., Kaufmann, T., Alnæs, D., Hullstein, I. R., & Bjørnebekk, A. (2017). Brain connectivity aberrations in anabolic-androgenic steroid users. NeuroImage: Clinical, 13, 62–69. https://doi.org/10.1016/j.nicl.2016.11.014. #connectivity
Meyniel, F., Goodwin, G. M., Deakin, J. W., Klinge, C., MacFadyen, C., Milligan, H., … Gaillard, R. (2016). A specific role for serotonin in overcoming effort cost. eLife, 5, e17282. https://doi.org/10.7554/eLife.17282. #reward
Seelye, K. Q. (2016, December 31). Kitty Dukakis, a Beneficiary of Electroshock Therapy, Emerges as Its Evangelist. The New York Times. Retrieved from http://www.nytimes.com/2016/12/31/us/kitty-dukakis-electroshock-therapy-evangelist.html. #depression #ect
This is a list of talks that students may wish to attend. Attendance is not required, however. Reports on the talks could serve as the basis of one or more blog posts or a paper.
Dr. Roberts-Galbraith uses planarians as a model organism to study brain regeneration. She received her Ph.D. from Vanderbilt where she trained as a cell biologist under Dr. Kathleen Gould and received an NSF graduate fellowship. She developed her planarian model system in the laboratory of Dr. Philip Newmark at the University of Illinois where she received a prestigious Jane Coffin Childs fellowship. Using transcriptomic and genomic approaches, she has identified dozens of genes involved various aspects of nervous system regeneration. She plans to follow up this work to characterize fundamental mechanisms through which neurons and glia are made and organized following injury.
“Epigenetics and the Long-term Effects of Nicotine on Learning and Hippocampus”
Dr. Lur uses optical and electrophysiological approaches to study signaling in cortical networks. His long-term goal is to determine how multiple sensory signals are integrated modulated by behavior in the cortex. He received his Ph.D. from the University of Liverpool where he studied calcium signaling in polarized secretory cells. He is currently a postdoctoral fellow in the laboratory of Dr. Michael Higley at Yale University where he has pioneered new methods to combine cellular electrophysiology with 2-Photon imaging to make important new insights into synaptic integration in individual cortical neurons.
“Can genes make men pugnacious?”
“Stress and health from organelle to organism: A mitochondrial perspective”"
“Prenatal origins of resilience and vulnerability”
“Sex, drugs, and transgenerational inheritance: Are the kids alright?:
“Inflammation and neurocognitive aging”
“How stress kills: The damage and some remedies”
Copyright © Rick O. Gilmore. All rights reserved.


Log Out
Current Members
Name
Phone
Email
Graduation Year
School
Chapter
Add New Member
New Member Registration
Name:
Phone:
Email:
Graduation Year:
School:
Chapter:
Cancel
Submit


 Sniff other cat's butt and hang jaw half open thereafter.   Chase after silly colored fish toys around the house stare out the window.
Hate dog and sometimes switches in french and say "miaou" just because well why not curl up and sleep on the freshly laundered towels poop in the plant pot so sweet beast, so chase red laser dot go into a room to decide you didn't want to be in there anyway. Sleep nap eat from dog's food, fall over dead (not really but gets sypathy), yet meow to be let in and jump around on couch, meow constantly until given food, curl up and sleep on the freshly laundered towels. Shove bum in owner's face like camera lens asdflkjaertvlkjasntvkjn (sits on keyboard) for hiss at vacuum cleaner sleep nap.
Eat from dog's food stare at ceiling light chase after silly colored fish toys around the house or purrr purr littel cat, little cat purr purr nap all day pee in human's bed until he cleans the litter box.

Favor packaging over toy cats go for world domination stare at ceiling, or go into a room to decide you didn't want to be in there anyway.  Rub face on owner stare at wall turn and meow stare at wall some more meow again continue staring . White cat sleeps on a black shirt why must they do that.
Have my breakfast spaghetti yarn give attitude, but lick plastic bags.  Lick plastic bags pelt around the house and up and down stairs chasing phantoms soft kitty warm kitty little ball of furr. Purr.


Hello. I'm Joey Buczek, a software engineer currently residing in Upstate New York. I also organize a local group called Syracuse JavaScript Meetup, where we discuss and work with the JavaScript programming language. Below are links to personal projects, presentations created for the group, and other various technology interests.
To get in touch, click on one of the following: Twitter | Email


Fitch's Style Proof Editor
| Proposition | |
| Identifier | |
| Rule Name | |
| Premises | |
| Conclusion | |
| Use single alphabet except v for variable. Separate premises by comma | |
Rules
Rule Summary
| Proposition | |
| Identifier | |
| Rule Name | |
| Premises | |
| Conclusion | |
| Use single alphabet except v for variable. Separate premises by comma | |
Rules
Rule Summary


Warning
This documentation is a work in progress! Stay tuned for the final version.
Solar Wind FDL 2021¶
This page contains all the software documentation written by the Heliophysics Solar Wind Team during the Frontier Development Lab’s 2021 summer program.
Note
For information on how to contribute to these documents, please consult the sphinx notebook.
~/fdl-2021-solar-wind-repository/doc/sphinx_docs.ipynb
Contents¶
Example Heading¶
Example numbered list
First item
sub itm
Second Item
sub item


The easiest way to accomplish visual balance is to align elements and structure designs with a clear grid. It guides us in the right direction when placing elements and determine dimensions, and it makes it easier for the user to process the interface.
Design for change
No design is ever finished or done. Don’t be afraid of throwing away work, features or designs, good design is always evolving and grows with the business. Design with change in mind will allow us to quickly adapt to new learnings and insights. Every feature or functionality that is introduced needs time to improve. Once something is launched, evaluating performance and iteration should be the focus.


CREATE OR REPLACE SCHEMA
Starting in Drill 1.16 you can define a schema for text files. Drill places a schema file in the root directory of your text table and so the schema feature only works for tables within a directory. If you have a single-file table, simply create a directory to hold that file and the schema file.
In Drill 1.17, the provided schema feature is disabled by default. Enable it by setting the store.table.use_schema_file
system/session option to true:
ALTER SESSION SET `store.table.use_schema_file` = true
Next you create the schema using the CREATE OR REPLACE SCHEMA
command as described in Syntax section.
Running this command generates a hidden .drill.schema
file in the table’s root directory. The .drill.schema
file stores the schema definition in JSON format. Alternatively, you can create the schema file manually. If created manually, the file content must comply with the structure recognized by the Drill.
The end of this topic provides examples that show how the feature is used. You may want to review this section before reading the reference material.
As described in Specifying the Schema as Table Function Parameter, you can also use a table function to apply a query to individual queries. Or, you can place the table function within a view, and query the table through the view.
Please post your experience and suggestions to the “user” mailing list.
Syntax
The CREATE OR REPLACE SCHEMA command supports the following syntax:
CREATE [OR REPLACE] SCHEMA
[LOAD 'file:///path/to/file']
[(column_name data_type [nullability] [format] [default] [properties {prop='val', ...})]]
[FOR TABLE `table_name` | PATH 'file:///schema_file_path/schema_file_name']
[PROPERTIES ('key1'='value1', 'key2'='value2', ...)]
Parameters
OR REPLACE
Existing schema is dropped and replaced with the new schema. Prevents malicious deletion of any file. Only supported when using FOR TABLE. Not supported when using PATH. Instead, you must manually delete any schema file created in a custom PATH location.
LOAD
Loads raw schema (list of column names with their attributes) from a file. You must indicate the path to the file after the LOAD keyword. Note that columns should be listed or provided when using the LOAD clause; at least one option is required for the successful schema creation.
column_name
Name of the column for which schema is created. Case-insensitive. The name must match the name in the data file or data source. You cannot rename columns using the schema mechanism.
data_type
Data type defined for the column. See Supported Data Types.
format
Sets the format for date and time data types when converting from string. See Format for Date, Time Conversion.
default
Used for non-nullable columns. The default value is returned by queries when the column is missing from a data file. The default value is a string enclosed in single quotes, like ‘10’. If you provide a format, the value must be valid for that format.
properties
Keyword to include optional properties. See Related Options below.
property
Name of the property applied to the column or table.
value
Value set for the indicated property.
table_name
Name of the table associated with the schema being created or replaced. Enclose the table name in backticks if there are spaces after the FOR TABLE keywords. If the table does not exist, the command fails and schema is not created. If you indicate the table name without schema, the table is assumed to be in the current workspace, and you must specify the PATH property. If you indicate FOR TABLE and PATH, or you do not indicate either, the CREATE SCHEMA command fails. In this case, the table schema is created in the table’s root directory with the default name .drill.table_schema
. Table cannot be a temporary table.
PATH
Path to the schema file. You must indicate the path to the file after the PATH keyword.
properties
List of properties as key-value pairs in parenthesis.
Related Options
In Drill 1.16, you must enable the following options for Drill to use the schema created during query execution:
exec.storage.enable_v3_text_reader
Enables the preview “version 3” of the text (CSV) file reader. The V3 text reader is the only reader in Drill 1.16 that supports file schemas.
In Drill 1.17, this option is enabled by default.
store.table.use_schema_file
Enables the use of the schema file mechanism.
You can enable these options, as shown:
set `exec.storage.enable_v3_text_reader` = true;
|------|---------------------------------------------|
| ok | summary |
|------|---------------------------------------------|
| true | exec.storage.enable_v3_text_reader updated. |
|------|---------------------------------------------|
set `store.table.use_schema_file` = true;
|------|--------------------------------------|
| ok | summary |
|------|--------------------------------------|
| true | store.table.use_schema_file updated. |
|------|--------------------------------------|
Related Properties
Drill normally uses “schema on read” to load data from your tables. The schema mechanism allows you to perform some data cleanup and transformations on your data. You can:
- Identify which columns to load, ignoring columns that are not needed by users.
- Handle schema evolution by providing names and default values for columns that may be missing from some of your older (or newer) data files.
- Convert text fields to numbers, dates, times or timestamps without having to add a CAST to every query (or define a view.)
When you create a schema, you can set the following column properties within the CREATE [OR REPLACE] SCHEMA command:
(drill.format, drill.default, drill.blank-as
)
You can also set the following table properties:
(drill.strict
)
The following sections describe the properties that aid in data clean up and transformation:
drill.strict
Table property that determines the set of columns returned for a wildcard (*) query. With drill.strict=false
(the default), a wildcard includes all columns in the table, whether or not they are listed in the schema. With drill.strict=true
, a wildcard includes only the columns defined in the schema, and in the order defined by the schema. See Schema Mode (Column Order).
drill.format
Same as the format parameter. (The format parameter is stored as a property in the schema file.) See the format parameter for the supported formats. Also, see Format for Date, Time Conversion.
drill.default
Same as the default parameter. (The default parameter is stored as a property in the schema file.) See Column Modes (Nullable and Non-Nullable Columns).
drill.blank-as
A property that sets how Drill handles blank column values. Accepts the following values:
- null: If the column is nullable, treat the blank as null. If non-nullable, leave the blank unchanged.
- 0: Replace blanks with the value “0” for numeric types.
- skip: Skip blank values. This sets the column to its default value: NULL for nullable columns, or the default value for non-nullable columns.
- If left empty, blanks have no special meaning. A blank is parsed as any other string, which typically produces an error for text columns converted to a numeric type.
See Handling Policy for Blank Column Values.
Setting Properties
Include properties after the “properties” keyword, as shown in the following example where the date format is set to 'yyyy-MM-dd'
through the drill.format
column property:
create or replace schema (start_date date properties {'drill.format' = 'yyyy-MM-dd'}) for table dfs.tmp.`text_table`;
Alternatively, you can use “default” and “format” as keywords when creating schema, as shown in the following examples:
Setting the default for the non-nullable column “id” to -1 using the keyword “default”:
create or replace schema (id int not null default '-1') for table dfs.tmp.`text_table`;
When you query the text_table, all blank values in the “id” column return a value of -1.
Storing Properties
The defined schema and configured properties are stored and reflected in the schema file, .drill.schema
, which you can see when you run DESCRIBE SCHEMA FOR TABLE.
describe schema for table dfs.tmp.`text_table`;
|----------------------------------------------------------------------------------|
| schema |
|----------------------------------------------------------------------------------|
| {
"table" : "dfs.tmp.`text_table`",
"schema" : {
"columns" : [
{
"name" : "id",
"type" : "INT",
"mode" : "REQUIRED",
"properties" : {
"drill.default" : "-1"
}
},
{
"name" : "start_date",
"type" : "DATE",
"mode" : "REQUIRED",
"properties" : {
"drill.format" : "yyyy-MM-dd",
"drill.default" : "2017-01-01"
}
}
],
"properties" : {
"drill.strict" : "true"
}
},
"version" : 1
} |
|----------------------------------------------------------------------------------|
Related Commands
DROP SCHEMA [IF EXISTS] FOR TABLE `table_name` See [Dropping Schema for a Table](/docs/create-or-replace-schema/#dropping-schema-for-a-table).
DESCRIBE SCHEMA FOR TABLE `table_name` See [Describing Schema for a Table](/docs/create-or-replace-schema/#describing-schema-for-a-table).
Supported Data Types
Text files store information in string format and only support simple data types. You can use the CREATE [OR REPLACE] SCHEMA command to convert string data types in text files to the following data types:
- INTEGER
- BIGINT
- DOUBLE
- FLOAT
- DECIMAL
- BOOLEAN
- VARCHAR
- TIMESTAMP
- DATE
- TIME
- INTERVAL [YEAR, MONTH, DAY, HOUR, MINUTE, SECOND]
Note: Complex data types (arrays and maps) are not supported.
Values are trimmed when converting to any type, except for varchar.
Usage Notes
General Information
- Schema provisioning works only with the file system (dfs-based) storage plugins. It works by placing a file
.drill.schema
in the root folder of tables defined as a directory. The directory can contain any number of files (even just one) in addition to the schema file. - Text files must have headers. The default extension for delimited text files with headers is
.csvh
. Note that the column names that appear in the headers match column definitions in the schema. - You do not have to enumerate all columns in a file when creating a schema. You can indicate the columns of interest only.
- Columns in the defined schema do not have to be in the same order as in the data file.
- Column names must match. The case can differ, for example “name” and “NAME” are acceptable.
Drill is unique in that it infers table schema at runtime. However, sometimes schema inference can fail when Drill
cannot infer the correct types. For example, Drill treats all fields in a text file as text. Drill may not be able
to determine the type of fields in JSON files if the fields are missing or set to null
in the first few records
in the file. Drill issues a DATA_READ_ERROR
when runtime schema inference fails.
When Drill cannot correctly infer the schema, you can instead use your knowledge of the file layout to tell Drill
the proper schema to use. Schema provisioning is the feature you use to specify the schema.
You can provide a schema for the file as a whole using the CREATE OR REPLACE SCHEMA
command or for
a single query using a table function.
Please see Specifying the Schema as Table Function Parameter for details.
Schema Mode (Column Order)
The schema mode determines the set of columns returned for wildcard (*) queries and the ordering of those columns. The mode is set through the drill.strict
property. You can set this property to true (strict) or false (not strict). If you do not indicate the mode, the default is false (not strict).
Not Strict (Default)
Columns defined in the schema are projected in the defined order. Columns not defined in the schema are appended to the defined columns, as shown:
create or replace schema (id int, start_date date format 'yyyy-MM-dd') for table dfs.tmp.`text_table` properties ('drill.strict' = 'false');
|------|-----------------------------------------|
| ok | summary |
|------|-----------------------------------------|
| true | Created schema for [dfs.tmp.text_table] |
|------|-----------------------------------------|
select * from dfs.tmp.`text_table`;
|------|------------|---------|
| id | start_date | name |
|------|------------|---------|
| 1 | 2019-02-01 | Fred |
| 2 | 2018-11-30 | Wilma |
| 3 | 2016-01-01 | Pebbles |
| 4 | null | Barney |
| null | null | Dino |
|------|------------|---------|
Note that the “name” column, which was not included in the schema was appended to the end of the table.
Strict
Setting the drill.strict
property to “true” changes the schema mode to strict, which means that the reader ignores any columns NOT included in the schema. The query only returns the columns defined in the schema, as shown:
create or replace schema (id int, start_date date format 'yyyy-MM-dd') for table dfs.tmp.`text_table` properties ('drill.strict' = 'true');
|------|-----------------------------------------|
| ok | summary |
|------|-----------------------------------------|
| true | Created schema for [dfs.tmp.text_table] |
|------|-----------------------------------------|
select * from dfs.tmp.`text_table`;
|------|------------|
| id | start_date |
|------|------------|
| 1 | 2019-02-01 |
| 2 | 2018-11-30 |
| 3 | 2016-01-01 |
| 4 | null |
| null | null |
|------|------------|
Note that the “name” column, which was not included in the schema was ignored and not returned in the result set.
Including Additional Columns in the Schema
The ability to include additional columns in the schema enables schema evolution, which is useful when some columns appear only in newer (or older) files.
When you create a schema, you can include columns that do not exist in the table and these columns will be projected. This feature ensures that queries return the correct results whether the files have a specific column or not. Note that schema mode does not affect the behavior of this feature.
For example, the “comment” column is not in the text_table, but added when creating the schema:
create or replace schema (id int, start_date date format 'yyyy-MM-dd', comment varchar) for table dfs.tmp.`text_table`;
|------|-----------------------------------------|
| ok | summary |
|------|-----------------------------------------|
| true | Created schema for [dfs.tmp.text_table] |
|------|-----------------------------------------|
You can see the “comment” column returned in the result set.
select * from dfs.tmp.`text_table`;
|------|------------|---------|---------|
| id | start_date | comment | name |
|------|------------|---------|---------|
| 1 | 2019-02-01 | null | Fred |
| 2 | 2018-11-30 | null | Wilma |
| 3 | 2016-01-01 | null | Pebbles |
| 4 | null | null | Barney |
| null | null | null | Dino |
|------|------------|---------|---------|
Column Modes (Nullable and Non-Nullable Columns)
If a column in the schema is nullable (allows null values), and the column has a null value, the column value is returned as null. If the column is required (not nullable), but contains a null value, Drill returns the default value provided. If no default value is provided, Drill sets the column value to the natural default.
For example, if you create a strict schema with two nullable columns (id and start_date), you can see that the missing values in both cases are null.
create or replace schema (id int, start_date date format 'yyyy-MM-dd') for table dfs.tmp.`text_table` properties ('drill.strict' = 'true');
|------|-----------------------------------------|
| ok | summary |
|------|-----------------------------------------|
| true | Created schema for [dfs.tmp.text_table] |
|------|-----------------------------------------|
select * from dfs.tmp.`text_table`;
|------|------------|
| id | start_date |
|------|------------|
| 1 | 2019-02-01 |
| 2 | 2018-11-30 |
| 3 | 2016-01-01 |
| 4 | null |
| null | null |
|------|------------|
Updating the strict schema to have two required columns (id and start_date), you can see that the natural default was applied; 0 for id and 1970-01-01 for start_date.
create or replace schema (id
int not null, start_date date not null format 'yyyy-MM-dd') for table
dfs.tmp.`text_table` properties ('drill.strict' = 'true');
|------|-----------------------------------------|
| ok | summary |
|------|-----------------------------------------|
| true | Created schema for [dfs.tmp.text_table] |
|------|-----------------------------------------|
select * from dfs.tmp.`text_table`;
|----|------------|
| id | start_date |
|----|------------|
| 1 | 2019-02-01 |
| 2 | 2018-11-30 |
| 3 | 2016-01-01 |
| 4 | 1970-01-01 |
| 0 | 1970-01-01 |
|----|------------|
Adding a default for each of these columns (-1 for id and 2017-01-01 for start_date), you can see that the columns return the defined default value instead of the natural default.
create or replace schema (id
int not null default '-1', start_date date not null format 'yyyy-MM-dd' default
'2017-01-01') for table dfs.tmp.`text_table` properties ('drill.strict' =
'true');
|------|-----------------------------------------|
| ok | summary |
|------|-----------------------------------------|
| true | Created schema for [dfs.tmp.text_table] |
|------|-----------------------------------------|
select * from dfs.tmp.`text_table`;
|----|------------|
| id | start_date |
|----|------------|
| 1 | 2019-02-01 |
| 2 | 2018-11-30 |
| 3 | 2016-01-01 |
| 4 | 2017-01-01 |
| -1 | 2017-01-01 |
|----|------------|
Handling Policy for Blank Column Values
It is common for CSV files to have blank column values. The default output for blank column values are empty strings (‘’), as shown:
select * from dfs.tmp.`text_blank`;
|----|--------|------------|
| id | amount | start_date |
|----|--------|------------|
| 1 | 20 | 2019-01-01 |
| 2 | | |
| 3 | 30 | |
|----|--------|------------|
When a schema is defined for columns, the default blank handling policy is skip
which treats blank values as null, as shown:
create or replace schema (id
int, amount double, start_date date format 'yyyy-MM-dd') for table
dfs.tmp.`text_blank`;
|------|-----------------------------------------|
| ok | summary |
|------|-----------------------------------------|
| true | Created schema for [dfs.tmp.text_blank] |
|------|-----------------------------------------|
select * from dfs.tmp.`text_blank`;
|----|--------|------------|
| id | amount | start_date |
|----|--------|------------|
| 1 | 20.0 | 2019-01-01 |
| 2 | null | null |
| 3 | 30.0 | null |
|----|--------|------------|
If a column is absent in the schema, the blank handling policy is default. Note that the blank handling policy is not applicable to varchar columns since they do not go through the type conversion logic.
You can configure how Drill handles blank column values through the drill.blank-as
property when you create schema.
In the following example, you can see the blank handling policy for the defined schema with the drill.blank-as
property set to 0
on the “amount” column:
create or replace schema (id int, amount double properties {'drill.blank-as' = '0'}, start_date date format 'yyyy-MM-dd') for table dfs.tmp.`text_blank`;
|------|-----------------------------------------|
| ok | summary |
|------|-----------------------------------------|
| true | Created schema for [dfs.tmp.text_blank] |
|------|-----------------------------------------|
select * from dfs.tmp.`text_blank`;
|----|--------|------------|
| id | amount | start_date |
|----|--------|------------|
| 1 | 20.0 | 2019-01-01 |
| 2 | 0.0 | null |
| 3 | 30.0 | null |
|----|--------|------------|
Format for Date, Time Conversion
When you convert string values to date and time data types, include the format for proper conversion.
You can include the format using the keyword “format,” as shown:
create or replace schema (start_date date format 'yyyy-MM-dd') for table dfs.tmp.`text_table`;
Alternatively, you can include the format in the column properties, as shown:
create or replace schema (start_date date properties {'drill.format' = 'yyyy-MM-dd'}) for table dfs.tmp.`text_table`;
Note that date, time type conversion uses the Joda time library, thus the format pattern must comply with the Joda time supported format pattern. If the format is not indicated, ISO datetime formats are used:
| Type | Accepted Format | ||
|---|---|---|---|
| Timestamp | yyyy-MM-dd’T’HH:mm:ssZZ | ||
| Date | date-element = std-date-element | ord-date-element | week-date-element |
| std-date-element = yyyy [’-‘ MM [’-‘ dd]] | |||
| ord-date-element = yyyy [’-‘ DDD] | |||
| week-date-element = xxxx ‘-W’ ww [’-‘ e] | |||
| Time | time = [‘T’] time-element | ||
| time-element = HH [minute-element] | [fraction] | ||
| minute-element = ‘:’ mm [second-element] | [fraction] | ||
| second-element = ‘:’ ss [fraction] | |||
| fraction = (‘.’ | ’,’) digit+ |
Limitations
Schema provisioning works with selected readers. If you develop a format plugin, you must use the
Enhanced Vector Framework
(rather than the “classic” techniques) to enable schema support.
To use schema provisioning, you must first enable it with the store.table.use_schema_file
option.
Examples
Examples throughout this topic use the files and directories described in the following section, Directory and File Setup.
Directory and File Setup
[root@doc23 text_table]# pwd
/tmp/text_table
[root@doc23 text_table]# ls
1.csvh 2.csvh
[root@doc23 text_table]# cat 1.csvh
id,name,start_date
1,Fred,2019-02-01
2,Wilma,2018-11-30
3,Pebbles,2016-01-01
4,Barney
[root@doc23 text_table]# cat 2.csvh
name
Dino
[root@doc23 tmp]# cd text_blank/
[root@doc23 text_blank]# ls
blank.csvh
[root@doc23 text_blank]# cat blank.csvh
id,amount,start_date
1,20,2019-01-01
2,,
3,30,
Query the directory text_table.
select * from dfs.tmp.`text_table`;
|----|---------|------------|
| id | name | start_date |
|----|---------|------------|
| 1 | Fred | 2019-02-01 |
| 2 | Wilma | 2018-11-30 |
| 3 | Pebbles | 2016-01-01 |
| 4 | Barney | |
| | Dino | |
|----|---------|------------|
Notice that the query plan contains a scan and project:
| 00-00 Screen
00-01 Project(**=[$0])
00-02 Scan(table=[[dfs, tmp, text_table]], groupscan=[EasyGroupScan [selectionRoot=file:/tmp/text_table, numFiles=2, columns=[`**`], files=[file:/tmp/text_table/1.csvh, file:/tmp/text_table/2.csvh], schema=null]])
Using the sqltypeof and modeof functions, you can see that each column is defined as a non-nullable string (varchar), and missing columns are defined as empty strings:
select sqltypeof(id), modeof(id) from dfs.tmp.`text_table` limit 1;
|-------------------|----------|
| EXPR$0 | EXPR$1 |
|-------------------|----------|
| CHARACTER VARYING | NOT NULL |
|-------------------|----------|
Creating a Schema
Create a defined schema for the text_table directory. When you define schema, you do not have to enumerate all columns. The columns in the defined schema are not required to be in the same order as the data file. Note that the name of the columns must match, but can differ in case.
Define schema for the id column:
create schema (id int) for table dfs.tmp.`text_table`;
|------|-----------------------------------------|
| ok | summary |
|------|-----------------------------------------|
| true | Created schema for [dfs.tmp.text_table] |
|------|-----------------------------------------|
After you define a schema, you can see the schema file (stored in JSON format) in the root table directory:
[root@doc23 text_table]# ls -a
. .. 1.csvh 2.csvh .drill.schema ..drill.schema.crc
[root@doc23 text_table]# cat .drill.schema
{
"table" : "dfs.tmp.`text_table`",
"schema" : {
"columns" : [
{
"name" : "id",
"type" : "INT",
"mode" : "OPTIONAL"
}
]
},
"version" : 1
Query the text_table directory to see how the schema is applied:
select * from dfs.tmp.`text_table`;
|------|---------|------------|
| id | name | start_date |
|------|---------|------------|
| 1 | Fred | 2019-02-01 |
| 2 | Wilma | 2018-11-30 |
| 3 | Pebbles | 2016-01-01 |
| 4 | Barney | |
| null | Dino | |
|------|---------|------------|
After defining the schema on the id column, you can see that the id
column type and mode is defined as a nullable integer, while other columns types were inferred as non-nullable VarChar:
select sqltypeof(id), modeof(id) from dfs.tmp.`text_table` limit 1;
|---------|----------|
| EXPR$0 | EXPR$1 |
|---------|----------|
| INTEGER | NULLABLE |
|---------|----------|
Running EXPLAIN PLAN, you can see that type conversion was done while reading data from source; no additional plan stages were added:
explain plan for select * from dfs.tmp.`text_table`;
| 00-00 Screen
00-01 Project(**=[$0])
00-02 Scan(table=[[dfs, tmp, text_table]], groupscan=[EasyGroupScan [selectionRoot=file:/tmp/text_table, numFiles=2, columns=[`**`], files=[file:/tmp/text_table/1.csvh, file:/tmp/text_table/2.csvh], schema=[TupleSchema [PrimitiveColumnMetadata [`id` (INT(0, 0):OPTIONAL)]]]]])
Describing Schema for a Table
You can verify the provided schema using the DESCRIBE SCHEMA FOR TABLE
command. This command can format the schema in two formats. The JSON
format is the same as the contents of the .drill.schema
file stored in your table directory.
describe schema for table dfs.tmp.`text_table` as JSON;
|----------------------------------------------------------------------------------|
| schema |
|----------------------------------------------------------------------------------|
| {
"table" : "dfs.tmp.`text_table`",
"schema" : {
"columns" : [
{
"name" : "id",
"type" : "INT",
"mode" : "OPTIONAL"
}
]
},
"version" : 1
} |
|----------------------------------------------------------------------------------|
You can also use the STATEMENT
format to recover the SQL statement to recreate the schema. You can easily copy, reuse or edit this statement to change the schema or reuse the statement for other files.
describe schema for table dfs.tmp.`text_table` as statement;
|--------------------------------------------------------------------------|
| schema |
|--------------------------------------------------------------------------|
| CREATE OR REPLACE SCHEMA
(
`id` INT
)
FOR TABLE dfs.tmp.`text_table`
|
|--------------------------------------------------------------------------|
Altering Schema for a Table
Use the ALTER SCHEMA
command to update your table schema. The command can add or replace columns.
Or, it can update properties for the table or individual columns. Syntax:
ALTER SCHEMA
(FOR TABLE dfs.tmp.nation | PATH '/tmp/schema.json')
ADD [OR REPLACE]
[COLUMNS (col1 int, col2 varchar)]
[PROPERTIES ('prop1'='val1', 'prop2'='val2')]
ALTER SCHEMA
modifies an existing schema file; it will fail if the schema file does not exist.
(Use CREATE SCHEMA
to create a new schema file.)
To prevent accidental changes, the ALTER SCHEMA ... ADD
command will fail if the requested column or property
already exists. Use the OR REPLACE
clause to modify an existing column or property.
You can remove columns or property with the ALTER SCHEMA ... REMOVE
command:
ALTER SCHEMA
(FOR TABLE dfs.tmp.nation | PATH '/tmp/schema.json')
REMOVE
[COLUMNS (col1 int, col2 varchar)]
[PROPERTIES ('prop1'='val1', 'prop2'='val2')]
The command fails if the schema file does not exist. The command silently ignores a request to remove a column or property which does not exist.
Dropping Schema for a Table
You can easily drop the schema for a table using the DROP SCHEMA [IF EXISTS] FOR TABLE `table_name`
command, as shown:
use dfs.tmp;
|------|-------------------------------------|
| ok | summary |
|------|-------------------------------------|
| true | Default schema changed to [dfs.tmp] |
|------|-------------------------------------|
drop schema for table `text_table`;
|------|---------------------------------------|
| ok | summary |
|------|---------------------------------------|
| true | Dropped schema for table [text_table] |
|------|---------------------------------------|
Troubleshooting
Schema defined as incorrect data type produces DATA_READ_ERROR
Assume that you defined schema on the “name” column as integer, as shown:
create or replace schema (name int) for table dfs.tmp.`text_table`;
|------|-----------------------------------------|
| ok | summary |
|------|-----------------------------------------|
| true | Created schema for [dfs.tmp.text_table] |
|------|-----------------------------------------|
Because the column does not contain integers, a query issued against the directory returns the DATA_READ_ERROR. The error message includes the line and value causing the issue:
select * from dfs.tmp.`text_table`;
Error: DATA_READ ERROR: Illegal conversion: Column `name` of type INT, Illegal value `Fred`
Line 1
Record 0
Fragment 0:0
[Error Id: db6afe96-1014-4a98-a034-10e36daa1aa7 on doc23.lab:31010] (state=,code=0)
Incorrect syntax
Required syntax properties are missing or incorrectly specified. Check CREATE SCHEMA syntax to ensure that all required properties where specified.
Missing backticks
Unable to parse CREATE SCHEMA command due to unknown properties and keywords. If the specified table name or column name contains spaces, enclose the name in backticks.
Incorrect data type
Parsing has failed on unknown/unsupported data type. Check which data types are supported by Drill. Check syntax for complex data types.
Missing table name
Table name indicated after FOR TABLE
keywords are not present. Check if the table exists in the specified schema or in the current schema (if the schema was not specified). If you do not want to bind schema to the specific table, use the PATH property.
Existing schema file
A schema file already exists for the table. Use the DROP SCHEMA command to remove stale or mistakenly created schema file. Alternatively, you can use the CREATE OR REPLACE SCHEMA command.
Lack of permissions
Unable to create schema file in the directory. Verify that you have write permission on the table’s root directory or the directory specified. If not, indicate the directory on which you write permissions in the command syntax.


Thursday Night Dinner
At our events, we love to feed folks and look for chances to enjoy the flavor of the city too (just wait till you see our snacks). This year, we’re bringing back small group dinners around the city for our Thursday evening meal. These dinners are inspired by AdaCamp and we’re excited to share them with you!
So what’s this all about? We will make reservations at restaurants around town, with a mix of cuisine types and locations. We’ll open up the sign up sheet next week. The reservations will be for 10 people, so you’ll be able to get to know a smaller group of folks a little bit better.
What time does dinner start?
All reservations will start at 7:30pm and should finish around 9-10pm. Please aim to be 15 minutes early; most restaurants will not seat the party until everyone has arrived, and may cancel the reservation if not everyone has arrived by 15 – 30 minutes past the reservation time.
Who is paying for dinner?
Why thank you for asking! We are inviting attendees to host an individual dinner and cover the cost for everyone at that table (or ask if your company can). Sound of interest? Email us. It’s a low-key way for a company to support a great community event. It’s also a great way to build some skills asking for funds, which may come in handy for your own future projects.
We will keep track of host signups and ensure that every dinner is covered by either a host or OpenNews. We will cover your meals and any non-alcoholic drinks, but if you would like to purchase alcohol you will be able to purchase it from the restaurant directly.
How can I be part of a dinner?
We will post a sign-up spreadsheet. All you’ll need to do is find a dinner with an unfilled attendee slot, and enter your name. You’ll be all set.
Can I go to a restaurant not on the list?
Your time is your own, but these reservations will be the only ones that OpenNews are covering. If you’d like to organize other dinners or events for the rest of SRCCON:POWER, you can share ideas on this etherpad.
Can I bring a friend or partner to dinner?
If there’s space, feel free to sign up a +1 (kiddos are included, we’d love to have them join, just make sure they get an RSVP slot). If you have more than a +1, please email us and we’ll see if we can add another restaurant option to accommodate more folks!
I want to go to a dinner, but there’s already 10 people signed up! Can I still go to it? Please choose another dinner. Groups of above 10 people get unwieldy and make it hard to get to know everyone.
I want specific people to come to a dinner with me, but there’s not enough slots left for us all! Please choose a dinner with more slots or let us know and we’ll see if we can add another spot.
When I arrive at the restaurant, what reservation do I ask for?
Reservations are mostly under the name “Erik Westra” Check the field in the dinner document to confirm yours.
How do I get to the restaurant?
The address of each restaurant is in the spreadsheet, along with suggested ways to get there. Check the SRCCON:POWER website for information on public transit, cabs, etc.
Thanks again to AdaCamp for this resource, which was adapted under a Creative Commons Attribution-ShareAlike 4.0 International License.


'We wish him well': Chelsea react to José Mourinho's Tottenham move – video
by SNTV
The Chelsea captain, César Azpilicueta, and former goalkeeper Petr Cech have welcomed their former manager José Mourinho back to English football following his appointment as manager of Tottenham.
Cech, who returned to Chelsea as technical and performance adviser, said: 'It's great for the premier league to have the personality of José Mourinho'.
Mourinho was announced as the new Tottenham Hotspur manger on Wednesday, just hours after the announcement that Mauricio Pochettino had left the club


However, the page can't be found. The link you used might be old or it moved.


Utility
| Description
| Author
| Location
|
| AcTrack2Symprod
| Aircraft Tracks to Symprod
| Nancy Rehak
| cvs/apps/dsserver/src/AcTrack2Symprod
|
| simpleAcTrack2Symprod
| Aircraft Positions to Symprod
| N. Oien
| cvs/apps/dsserver/src/simpleAcTrack2Symprod
|
| Acars2Symprod
| ACARS data to Symprod
| Mike Dixon
| cvs/apps/dsserver/src/Acars2Symprod
|
| Bdry2Symprod
| Gust Fronts, Boundries to Symprod
| Niles Oien
| cvs/apps/dsserver/src/Bdry2Symprod
|
| Chunk2Symprod
| Chunk to Symprod
| Niles Oien
| cvs/apps/dsserver/src/Chunk2Symprod
|
| Contour2Symprod
| BasinGenPt2Symprod ??
| Nancy Rehak
| cvs/apps/dsserver/src/Contour2Symprod
|
| AcTrack2Symprod
| Aircraft EDR (turbulence) to Symprod
| S. Dettling
| cvs/apps/dsserver/src/Edr2Symprod
|
| FltPath2Symprod
| Aircraft Flight Path to Symprod
| Nancy Rehak
| cvs/apps/dsserver/src/FltPath2Symprod
|
| GenPt2Symprod
| Generic Points to Symprod
| Nancy Rehak, Niles Oien
| cvs/apps/dsserver/src/GenPt2Symprod
|
| GenPtField2Symprod
| GenPtField? to Symprod
| Nancy Rehak, Dixon
| cvs/apps/dsserver/src/GenPtField2Symprod
|
| HydroStation2Symprod
| Hydro Station to Symprod
| Nancy Rehak
| cvs/apps/dsserver/src/HydroStation2Symprod
|
| Ltg2Symprod
| Lightning to Symprod
| Nancy Rehak
| cvs/apps/dsserver/src/Ltg2Symprod
|
| Mad2Symprod
| Microburst to Symprod
| Niles Oien
| cvs/apps/dsserver/src/Mad2Symprod
|
| Metar2Symprod
| Metar to Symprod
| Mike Dixon
| cvs/apps/dsserver/src/Metar2Symprod
|
| Pirep2Symprod
| Pilot Reports to Symprod
| Niles Oien
| cvs/apps/dsserver/src/Pirep2Symprod
|
| PosnRpt2Symprod
| Position Reports to Symprod
| Nancy Rehak
| cvs/apps/dsserver/src/PosnRpt2Symprod
|
| Rhi2Symprod
| Radar RHI Scan info to Symprod
| Mike Dixon.
| cvs/apps/dsserver/src/Rhi2Symprod
|
| Sigmet2Symprod
| SIGnificant AIR MET to Symprod
| Niles Oien.
| cvs/apps/dsserver/src/SigAirMet2Symprod
|
| Sigmet2Symprod
| SIGMET to Symprod
| Nancy Rehak
| cvs/apps/dsserver/src/Sigmet2Symprod
|
| Sndg2Symprod
| Soundings to Symprod
| S. Dettling.
| cvs/apps/dsserver/src/Sndg2Symprod
|
| TrecGauge2Symprod
| TREC Reflectivity Traces to Symprod
| Mike Dixon
| cvs/apps/dsserver/src/TrecGauge2Symprod
|
| Tstorms2Symprod
| TITAN Thunderstorms to Symprod
| Rehak, Dixon, Oien
| cvs/apps/dsserver/src/Tstorms2Symprod
|
| Vergrid2Symprod
| Verify Grid to Symprod
| Niles Oien
| cvs/apps/dsserver/src/Vergrid2Symprod
|
| WWA2Symprod
| NWS Watchwes, Warnings and Alerts to Symprod
| Frank Hage
| cvs/apps/dsserver/src/WWA2Symprod
|
| WxHazards2Symprod
| WxHazards to Symprod
| Nancy Rehak
| cvs/apps/dsserver/src/WxHazards2Symprod
|


|
|
int | index |
| |
|
char | on |
| |
|
int | cal_vdw |
| |
|
char | name [5] |
| |
|
int | serial |
| |
|
char | resName [4] |
| |
|
char | confName [6] |
| |
|
char | chainID |
| |
|
int | resSeq |
| |
|
char | iCode |
| |
|
char | altLoc |
| |
|
char | confID [4] |
| |
|
int | iConf |
| |
|
VECTOR | xyz |
| |
|
VECTOR | r_orig |
| |
|
float | crg |
| |
|
float | rad |
| |
|
float | rad_backup |
| |
|
float | vdw_rad |
| |
|
float | vdw_eps |
| |
|
float | sas |
| |
|
char | history [12] |
| |
|
struct ATOM_STRUCT * | connect12 [MAX_CONNECTED] |
| |
|
int | connect12_res [MAX_CONNECTED] |
| |
|
int | i_atom_prot |
| |
|
int | i_atom_conf |
| |
|
int | i_conf_res |
| |
|
int | i_res_prot |
| |
|
int | i_elem |
| |
The documentation for this struct was generated from the following file:


Beautiful Server
Login
Register
The following errors occured:
{{ error.msg }}
The following errors occured:
{{ error.msg }}


Bash is context-sensitive - a script could mean different things depending on what is defined in the environment. Thus, to present Bash code clearly, you will need to use inline markup, such as the last example on this page.
#!/bin/bash # Counting to 11 in 10 different ways. n=1; echo -n "$n " let "n = $n + 1" # let "n = n + 1" also works. echo -n "$n " : $((n = $n + 1)) # ":" necessary because otherwise Bash attempts #+ to interpret "$((n = $n + 1))" as a command. echo -n "$n " (( n = n + 1 )) # A simpler alternative to the method above. # Thanks, David Lombard, for pointing this out. echo -n "$n " n=$(($n + 1)) echo -n "$n " : $[ n = $n + 1 ] # ":" necessary because otherwise Bash attempts #+ to interpret "$[ n = $n + 1 ]" as a command. # Works even if "n" was initialized as a string. echo -n "$n " n=$[ $n + 1 ] # Works even if "n" was initialized as a string. #* Avoid this type of construct, since it is obsolete and nonportable. # Thanks, Stephane Chazelas. echo -n "$n " # Now for C-style increment operators. # Thanks, Frank Wang, for pointing this out. let "n++" # let "++n" also works. echo -n "$n " (( n++ )) # (( ++n ) also works. echo -n "$n " : $(( n++ )) # : $(( ++n )) also works. echo -n "$n " : $[ n++ ] # : $[ ++n ]] also works echo -n "$n " echo exit 0
#!/bin/bash svc_cluster_ip=<IP_ADDRESS> svc_priv_dsa=~/.ssh/id_dsa if [ ! -f $svc_priv_dsa ] ; then echo " ${0##*/} is missing the SSH DSA private key" echo " needed to access the SAN Volume controller." echo " Please specify the correct path!" fi if [ -z $1 ] ; then echo echo " ${0##*/} [ WWPN ]" echo echo " WWPN - WWPN, or part of WWPN that is being searched." echo " Should be entered in continous format (ie. no dash (-) or colon (:))!" echo exit 1; fi WWPN=$1 list_wwpn_by_host() { local _host=$1 if [ ! -z $_host ] ; then ssh -i $svc_priv_dsa admin@$svc_cluster_ip svcinfo lshost \ -delim : $_host | grep ^WWPN | sed "s,WWPN:,," fi } #set -x HOST_LIST="$( ssh -i $svc_priv_dsa admin@$svc_cluster_ip svcinfo lshost -delim : -nohdr | cut -d: -f2 )" for HOST in $HOST_LIST; do echo -n "$HOST: " echo `list_wwpn_by_host $HOST` done | grep $WWPN #set +x
This next example uses inline HTML to markup and highlight rd-resolve-test bob
.
samuel@ayako:~$ which git
/usr/bin/git
samuel@ayako:~$ ls -lah
getconf getent getopt getopts gettext gettext.sh gettextize
samuel@ayako:~# sudo rd-resolve-test bob
/home/samuel
Here is the HTML of the above <pre>
:


Hello! We are students of the UNCC Coding Bootcamp, and this is our project titled "It's Raining
Playlists". We created this website for individuals who want to discover new music! Just enter in some criteria for your playlist, and we will do the rest!
Find us on social!


Blogs
Week 1
Technical Blog: Comparing Websites
Cultural Blog: Chef's Kitchen
Week 2
Technical Blog: CSS Concepts
Cultural Blog: Best Practices For Using Classes vs. IDs
Week 3
Technical Blog: JavaScript in Web Development
Cultural Blog: Thinking and Learning Styles
Week 4
Technical Blog: Enumerables
Cultural Blog: Customer Data Protection
Week 5
Technical Blog: Ruby Classes
Cultural Blog: Thoughts on Pairing
Week 6
Technical Blog: Object-Oriented vs Functional Programming
Cultural Blog: Stereotype Threat
Week 7
Technical Blog: SQL Injection
Cultural Blog: Affirmation and Stereotype Threat
Week 8
Technical Blog: The Basics of Active Record
Cultural Blog: "The Compass of Shame"
Ruby Cheatsheet: Ruby Hashes, Arrays, Strings and Integers


If there’s any issue you are facing in setting up this theme I’m there for you. Just create an issue in this repository (http://github.com/hemangsk/Arvind Mehra), (https://help.github.com/articles/creating-an-issue/) and I’ll get back to you asap.
INSTALLATION
Dependencies
Arvind Mehra uses Jekyll and it’s built-in SCSS compiler for the associated CSS, so the first thing you’ll need is Jekyll itself:
$ gem install jekyll
In case you don’t have the bundler
gem installed already, you can install it as follows:
$ gem install bundler
For pagination, Arvind Mehra uses the jekyll-paginate gem :
$ gem install jekyll-paginate
USAGE
Once you have the required gems, you can go ahead and clone the Arvind Mehra repository or download a zip of the master branch.
Run :
$ jekyll serve
Jekyll should now be generating your content!
ADDING POSTS
The theme by default ships with starter posts located in _posts/
. Delete these posts and add your content to the _posts
folder to see them being served up by Jekyll. This would be a good guide to getting started on writing posts using Jekyll. We’ve added a concise guide below:
- Create a .markdown file inside
_posts
folder. - Name the file according to the format YY-MM-DD-[short name for your post].
2016-03-30-i-love-design.markdown
- Write the Front Matter and content in the file.
FORMAT
---
layout: post | default | page
title: String POST TITLE
date: Time Stamp
categories: String | Array of Strings CATEGORY / CATEGORIES
---
---
layout: post
title: "The One with the Blackout"
date: 2016-03-30 19:45:31 +0530
categories: ["life", friends]
---
CREATE PAGES
- Create a .md file in the root directory.
- Name the file with the desired page link name.
about.md
design.md
- Write the Front Matter and content in the file.
FORMAT
---
layout: page
title: String TITLE OF THE WEBPAGE
permalink: / String / PERMALINK FOR THE WEBPAGE
tagline: String OPTIONAL GRAVITY FEATURE : TAGLINE FOR THE PAGE
---
---
layout: page
title: "Science"
permalink: /science/
tagline: "Humanity is overrated."
---
Introducing
ARCHIVE PAGES
You can display a list of all the posts corresponding to a particular category on a standalone page using the ARCHIVE
layout.
- Create a .md file in the root directory.
- Name the file. Preferred name will be the name of the category.
*
life.md
- Write the Front Matter and content in the file.
FORMAT
---
layout: archive ARCHIVE PAGE LAYOUT
title: String TITLE OF THE WEBPAGE
permalink: / String / PERMALINK FOR THE WEBPAGE
tagline: String TAGLINE FOR THE PAGE
category: String NAME OF THE CATEGORY OF WHICH THE PAGE WILL SHOW POSTS
---
---
layout: archive
title: "Design"
permalink: "Design"
tagline: "It's all about perception"
category: "design"
---
DIRECTORY STRUCTURE
├── css # => Output of the combined SASS files
│ └── style.scss
├── _includes # => Contains partials that can be used with your layouts
│ ├── footer.html
│ ├── header.html
│ ├── head.html
│ ├── icon-github.html
│ ├── icon-github.svg
│ ├── icon-twitter.html
│ └── icon-twitter.svg
├── _layouts # => Layout related HTML files
│ ├── archive.html
│ ├── default.html
│ ├── page.html
│ └── post.html
├── _posts # => posts, dynamic content. Follow the format: YEAR-MONTH-DAY-title.MARKUP
│ ├── 2016-03-30-design-stories.markdown
│ ├── 2016-03-30-science0.markdown
│ ├── 2016-03-30-science.markdown
│ └── 2016-03-30-welcome-to-jekyll.markdown
└── _sass # => SASS partials for styling
| ├── _base.scss
| ├── _layout.scss
| └── _syntax-highlighting.scss
├── about.md
├── _config.yml # => Configuration options or flags for your site go here
├── design.md
├── download.md
├── feed.xml
├── index.html
├── LICENSE.txt # => Licensing information
├── README.md
└── science.md