ydl 0.2.06
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +23 -0
- data/.rspec +2 -0
- data/.travis.yml +5 -0
- data/Gemfile +4 -0
- data/Gemfile.lock +83 -0
- data/README.org +208 -0
- data/Rakefile +6 -0
- data/bin/console +11 -0
- data/bin/setup +8 -0
- data/examples/brief.tex +43 -0
- data/examples/cases.ydl +79 -0
- data/examples/header.rb +12 -0
- data/examples/lawyers.ydl +65 -0
- data/examples/mwe.tex +67 -0
- data/examples/persons.ydl +10 -0
- data/examples/simple.tex +23 -0
- data/examples/test_page.tex +76 -0
- data/lib/ydl/core_ext/array.rb +6 -0
- data/lib/ydl/core_ext/array_refine.rb +16 -0
- data/lib/ydl/core_ext/boolean.rb +13 -0
- data/lib/ydl/core_ext/date.rb +6 -0
- data/lib/ydl/core_ext/hash.rb +16 -0
- data/lib/ydl/core_ext/numeric.rb +6 -0
- data/lib/ydl/core_ext/string.rb +16 -0
- data/lib/ydl/core_ext.rb +7 -0
- data/lib/ydl/errors.rb +5 -0
- data/lib/ydl/node.rb +190 -0
- data/lib/ydl/top_queue.rb +40 -0
- data/lib/ydl/tree.rb +95 -0
- data/lib/ydl/version.rb +3 -0
- data/lib/ydl/ydl.rb +244 -0
- data/lib/ydl.rb +15 -0
- data/spec/array_spec.rb +14 -0
- data/spec/core_ext/array_spec.rb +23 -0
- data/spec/core_ext/boolean_spec.rb +10 -0
- data/spec/core_ext/date_spec.rb +9 -0
- data/spec/core_ext/hash_spec.rb +19 -0
- data/spec/core_ext/numeric_spec.rb +13 -0
- data/spec/core_ext/string_spec.rb +27 -0
- data/spec/example_files/err/person_err.ydl +6 -0
- data/spec/example_files/home/user/.ydl/config_template.yaml +40 -0
- data/spec/example_files/home/user/.ydl/courts/courts.ydl +28 -0
- data/spec/example_files/home/user/.ydl/lawyers.ydl +40 -0
- data/spec/example_files/home/user/.ydl/persons.ydl +9 -0
- data/spec/example_files/home/user/project/cases.ydl +59 -0
- data/spec/example_files/home/user/project/courts.ydl +7 -0
- data/spec/example_files/home/user/project/judges.ydl +27 -0
- data/spec/example_files/home/user/project/lawyers.ydl +52 -0
- data/spec/example_files/home/user/project/persons.ydl +5 -0
- data/spec/example_files/home/user/project/subproject/lawyers.ydl +85 -0
- data/spec/example_files/home/user/project/subproject/persons.ydl +55 -0
- data/spec/example_files/sys/ydl/constants.ydl +1 -0
- data/spec/example_files/sys/ydl/junk.ydl +1 -0
- data/spec/spec_helper.rb +55 -0
- data/spec/ydl_error_spec.rb +15 -0
- data/spec/ydl_spec.rb +184 -0
- data/yaml_v_psych.rb +15 -0
- data/ydl.gemspec +40 -0
- metadata +230 -0
data/lib/ydl/ydl.rb
ADDED
@@ -0,0 +1,244 @@
|
|
1
|
+
require 'ydl'
|
2
|
+
require 'fat_core/string'
|
3
|
+
require 'active_support/core_ext/hash/deep_merge'
|
4
|
+
require 'active_support/core_ext/hash/keys'
|
5
|
+
# For singularize, camelize
|
6
|
+
require 'active_support/core_ext/string'
|
7
|
+
|
8
|
+
# Name-space module for the ydl gem.
|
9
|
+
module Ydl
|
10
|
+
using ArrayRefinements
|
11
|
+
|
12
|
+
SYSTEM_DIR = '/usr/local/share/ydl'.freeze
|
13
|
+
CONFIG_FILE = File.join(ENV['HOME'], '.ydl/config.yaml')
|
14
|
+
|
15
|
+
@@config_printed = false
|
16
|
+
|
17
|
+
class << self
|
18
|
+
# Configuration hash for Ydl, read from ~/.ydl/config.yaml on require.
|
19
|
+
attr_accessor :config
|
20
|
+
|
21
|
+
# Holder of all the data read from the .ydl files as a Hash
|
22
|
+
attr_accessor :data
|
23
|
+
end
|
24
|
+
self.config = { class_map: {}, class_init: {} }
|
25
|
+
self.data = {}
|
26
|
+
|
27
|
+
# Load all .ydl files, subject to the given options. After loading, the data
|
28
|
+
# in the .ydl files will be available in Ydl.data and accessible with Ydl[].
|
29
|
+
#
|
30
|
+
# The following options affect which files are loaded:
|
31
|
+
#
|
32
|
+
# - ignore: String :: ignore all .ydl files whose base name matches the given
|
33
|
+
# string.
|
34
|
+
# - ignore: /regexp/ :: ignore all .ydl files whose base name matches the
|
35
|
+
# given regexp.
|
36
|
+
# - ignore: [String|/regexp/] :: ignore all .ydl files whose base name matches
|
37
|
+
# any of the given strings or regexp's in the given Array.
|
38
|
+
#
|
39
|
+
# @param [Hash] options selectively ignore files; use alternative config
|
40
|
+
# @return [Hash] data read from .ydl files as a Hash
|
41
|
+
def self.load(base = '*', ignore: nil, verbose: true)
|
42
|
+
Ydl.read_config
|
43
|
+
# Load each file in order to self.data. Note that there may be many files
|
44
|
+
# with the same basename and, hence, will be merged into the same
|
45
|
+
# top-level hash key with the later files overriding the earlier ones.
|
46
|
+
# Thus, it is important that ydl_files returns the file names starting
|
47
|
+
# with those having the lowest priority and ending with those having the
|
48
|
+
# highest.
|
49
|
+
yaml = {}
|
50
|
+
file_names = ydl_files(glob: base, ignore: ignore)
|
51
|
+
warn "ydl: files found:" if verbose
|
52
|
+
file_names.each do |fn|
|
53
|
+
file_hash = Ydl.load_file(fn)
|
54
|
+
yaml = yaml.deep_merge(file_hash)
|
55
|
+
end
|
56
|
+
|
57
|
+
# At this point, all of the files are incorporated into a single hash with
|
58
|
+
# the top-level keys corresponding to the basenames of the files read in,
|
59
|
+
# but all of the leaf nodes are simple ruby objects, not yet instantiated
|
60
|
+
# into application-level objects. That is what the Ydl::Tree class is
|
61
|
+
# designed to accomplish, including resolving any cross-reference strings
|
62
|
+
# of the form 'ydl:/path/to/other/part/of/ydl/tree'. It does this by
|
63
|
+
# constructing a Ydl::Tree from the yaml hash.
|
64
|
+
tree = Tree.new(yaml)
|
65
|
+
|
66
|
+
# After the leaf nodes of the tree have been instantiated by the Tree
|
67
|
+
# object, we need to convert the Tree back into a hash, but only down to
|
68
|
+
# the level above the reified ruby objects. By this time, all the ruby
|
69
|
+
# objects will have been instantiated and all cross-references resolved.
|
70
|
+
self.data = data.merge(tree.to_hash)
|
71
|
+
|
72
|
+
# Just return the base name's branch if base is set
|
73
|
+
base = base.to_sym
|
74
|
+
if data.key?(base)
|
75
|
+
data[base]
|
76
|
+
else
|
77
|
+
data
|
78
|
+
end
|
79
|
+
rescue UserError, CircularReference, BadXRef => e
|
80
|
+
warn e
|
81
|
+
exit 1
|
82
|
+
end
|
83
|
+
|
84
|
+
# Return a Hash of a Hash with a single top-level key of the basename of the
|
85
|
+
# given file and a value equal to the result of reading in the given YAML
|
86
|
+
# file. The single top-level hash key will determine the class into which
|
87
|
+
# each of the elements of the inner Hash will be instantiated. For example,
|
88
|
+
# reading the file "persons.ydl" might result in a Hash of
|
89
|
+
#
|
90
|
+
# result[:person] = {jsmith: {first: 'John', middle: 'A.', last: 'Smith',
|
91
|
+
# address: {street1: '123 Main', city: 'Middleton', state: 'KS', zip:
|
92
|
+
# '66213'}, sex: 'male'}, fordmotor: {name: 'Ford Motor Company, Inc.'},
|
93
|
+
# sex: 'entity', ...}
|
94
|
+
#
|
95
|
+
# Thus, each of jsmith and fordmotor will eventually get instantiated into a
|
96
|
+
# Person object using the hash to initialize it. Some of the keys in that
|
97
|
+
# hash, e.g., :address, might themselves represent classes to be initialized
|
98
|
+
# with their sub-hashes, and so forth recursively.
|
99
|
+
|
100
|
+
def self.load_file(name, verbose: true)
|
101
|
+
key = File.basename(name, '.ydl').to_sym
|
102
|
+
warn "ydl: loading file #{name}..." if verbose
|
103
|
+
result = {}
|
104
|
+
begin
|
105
|
+
result[key] = Psych.safe_load_file(name, permitted_classes: [Date, DateTime])
|
106
|
+
rescue Psych::SyntaxError => e
|
107
|
+
usr_msg = "#{File.expand_path(name)}: #{e.problem} #{e.context} at line #{e.line} column #{e.column}"
|
108
|
+
raise UserError, usr_msg
|
109
|
+
end
|
110
|
+
result[key].deep_symbolize_keys! if result[key].is_a?(Hash)
|
111
|
+
result
|
112
|
+
end
|
113
|
+
|
114
|
+
# Return the component at key from Ydl.data.
|
115
|
+
def self.[](key)
|
116
|
+
msg = "no key '#{key}' in Ydl data"
|
117
|
+
raise UserError, msg unless data.key?(key)
|
118
|
+
|
119
|
+
Ydl.data[key]
|
120
|
+
end
|
121
|
+
|
122
|
+
# Return a list of all the .ydl files in order from lowest to highest
|
123
|
+
# priority, ignoring those whose basenames match the ignore parameter, which
|
124
|
+
# can be a String, a Regexp, or an Array of either (all of which are matched
|
125
|
+
# against the basename without the .ydl extension).
|
126
|
+
def self.ydl_files(glob: '*', ignore: nil, verbose: true)
|
127
|
+
read_config
|
128
|
+
warn "ydl: gathering ydl files #{glob}.ydl..." if verbose
|
129
|
+
warn "ydl: ignoring files #{ignore}.ydl..." if verbose && ignore
|
130
|
+
sys_ydl_dir = Ydl.config[:system_ydl_dir] || '/etc/ydl'
|
131
|
+
file_names = []
|
132
|
+
unless sys_ydl_dir.blank?
|
133
|
+
file_names += Dir.glob("#{sys_ydl_dir}/**/#{glob}.ydl")
|
134
|
+
end
|
135
|
+
file_names += Dir.glob(File.join(ENV['HOME'], ".ydl/**/#{glob}.ydl"))
|
136
|
+
|
137
|
+
# Find directories from pwd to home (or root), then reverse
|
138
|
+
dir_list = []
|
139
|
+
dir = Dir.pwd
|
140
|
+
while dir != File.expand_path('~/..') && dir != '/'
|
141
|
+
dir_list << dir
|
142
|
+
dir = Pathname.new(dir).parent.to_s
|
143
|
+
end
|
144
|
+
dir_list = dir_list.reverse
|
145
|
+
|
146
|
+
# Gather the .ydl files in those directories
|
147
|
+
dir_list.each do |d|
|
148
|
+
file_names += Dir.glob("#{d}/#{glob}.ydl")
|
149
|
+
end
|
150
|
+
|
151
|
+
# Filter out any files whose base name matches options[:ignore]
|
152
|
+
file_names = filter_ignores(file_names, ignore) unless ignore.blank?
|
153
|
+
file_names.each { |f| warn " ->reading #{f}" } if verbose
|
154
|
+
file_names
|
155
|
+
end
|
156
|
+
|
157
|
+
# From the list of file name paths, names, delete those whose basename
|
158
|
+
# (without the .ydl extension) match the pattern or patterns in ~ignores~,
|
159
|
+
# which can be a String, a Regexp, or an Array of either. Return the list
|
160
|
+
# thus filtered.
|
161
|
+
def self.filter_ignores(names, ignores)
|
162
|
+
ignores = [ignores] unless ignores.is_a?(Array)
|
163
|
+
return names if ignores.empty?
|
164
|
+
|
165
|
+
names.reject { |n| ignores.any? { |ig| File.basename(n).match(ig) } }
|
166
|
+
end
|
167
|
+
|
168
|
+
mattr_accessor :class_for_cache
|
169
|
+
self.class_for_cache = {}
|
170
|
+
|
171
|
+
def self.class_for(key)
|
172
|
+
return nil if key.blank?
|
173
|
+
return class_for_cache[key] if class_for_cache[key]
|
174
|
+
return class_map(key) if class_map(key)
|
175
|
+
|
176
|
+
klasses = candidate_classes(key, Ydl.config[:class_modules])
|
177
|
+
return nil if klasses.empty?
|
178
|
+
|
179
|
+
class_for_cache[key] = klasses.first
|
180
|
+
klasses.first
|
181
|
+
end
|
182
|
+
|
183
|
+
def self.class_map(key)
|
184
|
+
return nil if key.blank?
|
185
|
+
return nil if key.is_a?(Numeric)
|
186
|
+
|
187
|
+
key = key.to_sym
|
188
|
+
return nil unless Ydl.config[:class_map].key?(key)
|
189
|
+
|
190
|
+
klass_name = Ydl.config[:class_map][key]
|
191
|
+
klass_name.constantize
|
192
|
+
rescue NameError
|
193
|
+
raise "no declared class named '#{klass_name}'"
|
194
|
+
end
|
195
|
+
|
196
|
+
def self.class_init(klass_name)
|
197
|
+
klass_name = klass_name.to_sym
|
198
|
+
klass_config = Ydl.config[:class_init]
|
199
|
+
return :new unless klass_config.key?(klass_name)
|
200
|
+
|
201
|
+
klass_config[klass_name].to_sym
|
202
|
+
end
|
203
|
+
|
204
|
+
mattr_accessor :all_classes
|
205
|
+
|
206
|
+
def self.candidate_classes(key, modules = nil)
|
207
|
+
# Add all known classes to module attribute as a cache on first call; except
|
208
|
+
# Errno
|
209
|
+
all_classes ||=
|
210
|
+
ObjectSpace.each_object(Class)
|
211
|
+
.map(&:to_s)
|
212
|
+
.select { |klass| klass =~ %r{^[A-Z]} }
|
213
|
+
.reject { |klass| klass =~ %r{^Errno::} }
|
214
|
+
|
215
|
+
suffix = key.to_s.singularize.camelize
|
216
|
+
modules = modules.split(',').map(&:clean) if modules.is_a?(String)
|
217
|
+
all_classes.select { |cls|
|
218
|
+
if modules
|
219
|
+
# If modules given, restrict to those classes within the modules, where
|
220
|
+
# a blank string is the main module.
|
221
|
+
modules.any? do |mod|
|
222
|
+
cls =~ (mod.blank? ? /\A#{suffix}\z/ : /\A#{mod}::#{suffix}\z/)
|
223
|
+
end
|
224
|
+
else
|
225
|
+
# Otherwise, all classes ending with suffix.
|
226
|
+
cls == suffix || cls =~ /::#{suffix}\z/
|
227
|
+
end
|
228
|
+
}.sort.map(&:constantize)
|
229
|
+
end
|
230
|
+
|
231
|
+
# Set the Ydl.config hash to the configuration given in the YAML string, cfg,
|
232
|
+
# or read the config from the file ~/.ydl/config.yaml if cfg is nil
|
233
|
+
def self.read_config
|
234
|
+
cfg_file = ENV['YDL_CONFIG_FILE'] || CONFIG_FILE
|
235
|
+
cfg_file = File.expand_path(cfg_file)
|
236
|
+
Ydl.config ||= {}
|
237
|
+
Ydl.config = YAML.load_file(cfg_file) if File.exist?(cfg_file)
|
238
|
+
Ydl.config.deep_symbolize_keys!
|
239
|
+
Ydl.config[:class_map] ||= {}
|
240
|
+
Ydl.config[:class_init] ||= {}
|
241
|
+
Ydl.config[:system_ydl_dir] ||= SYSTEM_DIR
|
242
|
+
Ydl.config
|
243
|
+
end
|
244
|
+
end
|
data/lib/ydl.rb
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
require 'active_support'
|
2
|
+
require 'psych'
|
3
|
+
require 'yaml'
|
4
|
+
require 'fat_core'
|
5
|
+
|
6
|
+
# Name space for the ydl app.
|
7
|
+
module Ydl
|
8
|
+
require 'ydl/version'
|
9
|
+
require 'ydl/errors'
|
10
|
+
require 'ydl/core_ext'
|
11
|
+
require 'ydl/top_queue'
|
12
|
+
require 'ydl/node'
|
13
|
+
require 'ydl/tree'
|
14
|
+
require 'ydl/ydl'
|
15
|
+
end
|
data/spec/array_spec.rb
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
module Ydl
|
4
|
+
using ArrayRefinements
|
5
|
+
RSpec.describe ArrayRefinements do
|
6
|
+
it 'can detect if other array is its prefix' do
|
7
|
+
arr_a = [:a, :b, :c, :d]
|
8
|
+
arr_b = [:a, :b, :c]
|
9
|
+
expect(arr_a.prefixed_by(arr_b)).to be true
|
10
|
+
expect(arr_a.prefixed_by(arr_a)).to be true
|
11
|
+
expect(arr_b.prefixed_by(arr_a)).to be false
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
module Ydl
|
4
|
+
using ArrayRefinements
|
5
|
+
RSpec.describe ArrayRefinements do
|
6
|
+
it 'can detect if other array is its prefix' do
|
7
|
+
arr_a = [:a, :b, :c, :d]
|
8
|
+
arr_b = [:a, :b, :c]
|
9
|
+
expect(arr_a.prefixed_by(arr_b)).to be true
|
10
|
+
expect(arr_a.prefixed_by(arr_a)).to be true
|
11
|
+
expect(arr_b.prefixed_by(arr_a)).to be false
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
RSpec.describe Array do
|
16
|
+
it 'can detect if it contains any cross-refs' do
|
17
|
+
arr_a = ['ydl is not a ref', 3.14159, Date.today, 'ydl:/this/is/a/ref']
|
18
|
+
arr_b = ['ydl is not a ref', 3.14159, Date.today, true, :symbol]
|
19
|
+
expect(arr_a.xref?).to be true
|
20
|
+
expect(arr_b.xref?).to be false
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
module Ydl
|
4
|
+
RSpec.describe Hash do
|
5
|
+
it 'can be topologically sorted if values are arrays' do
|
6
|
+
hash_a = {:a => [:d], :b => [:d, :c], :c => [],
|
7
|
+
:d => [:g, :h], :g => [], :h => []}
|
8
|
+
expect(hash_a.tsort).to eq([:g, :h, :d, :a, :c, :b])
|
9
|
+
end
|
10
|
+
|
11
|
+
it 'can tell its not a cross-ref' do
|
12
|
+
hash_a = {:a => [:d], :b => [:d, :c], :c => [],
|
13
|
+
:d => [:g, :h], :g => [], :h => []}
|
14
|
+
expect(hash_a.xref?).to be false
|
15
|
+
hash_b = {:a => true, :b => 'ydl:hello/world'}
|
16
|
+
expect(hash_b.xref?).to be true
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
module Ydl
|
4
|
+
RSpec.describe 'Numeric extensions' do
|
5
|
+
it 'can detect if it is a cross-ref' do
|
6
|
+
require 'bigdecimal'
|
7
|
+
expect(25.xref?).to be false
|
8
|
+
expect(3.14159.xref?).to be false
|
9
|
+
expect(BigDecimal('18.578').xref?).to be false
|
10
|
+
expect(Rational(2, 3).xref?).to be false
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
module Ydl
|
4
|
+
RSpec.describe 'String extensions' do
|
5
|
+
it 'can detect if it is a cross-ref' do
|
6
|
+
expect('hello, world'.xref?).to be false
|
7
|
+
expect(' ydl:this/is/a/cross-reference '.xref?).to be true
|
8
|
+
expect(' ydl:/this/is/a/cross-reference '.xref?).to be true
|
9
|
+
end
|
10
|
+
|
11
|
+
it 'can determine whether it is singular' do
|
12
|
+
expect('person'.singular?).to be true
|
13
|
+
expect('people'.singular?).to be false
|
14
|
+
expect('dogs'.singular?).to be false
|
15
|
+
expect('dog'.singular?).to be true
|
16
|
+
expect('sheep'.singular?).to be true
|
17
|
+
end
|
18
|
+
|
19
|
+
it 'can determine whether it is plural' do
|
20
|
+
expect('person'.plural?).to be false
|
21
|
+
expect('people'.plural?).to be true
|
22
|
+
expect('dogs'.plural?).to be true
|
23
|
+
expect('dog'.plural?).to be false
|
24
|
+
expect('sheep'.plural?).to be false
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
# You can set the system-wide ydl directory here; otherwise it defaults to
|
2
|
+
# /usr/local/share/ydl.
|
3
|
+
|
4
|
+
# system_ydl_dir: /usr/local/share/ydl
|
5
|
+
|
6
|
+
# For automatic instantiation, search for classes prefixed by the given modules
|
7
|
+
# in the order given. For example, if the key 'breed' is to be instantiated, you
|
8
|
+
# can restrict the search for classes named 'Breed' only in modules, 'Dog' and
|
9
|
+
# 'Cat' with this:
|
10
|
+
#
|
11
|
+
# class_modules
|
12
|
+
# - Dog
|
13
|
+
# - Cat
|
14
|
+
#
|
15
|
+
# then, only Dog::Breed and Cat::Breed will be searched for an existing breed
|
16
|
+
# class. Otherwise, any class ending in Breed could be used, and they will be
|
17
|
+
# searched in alphabetical order, and the first found will be used. A blank
|
18
|
+
# value means to consider classes in the main, global module level. You can
|
19
|
+
# always disambiguate the class selected with the class_map option below.
|
20
|
+
|
21
|
+
class_modules:
|
22
|
+
-
|
23
|
+
- LawDoc
|
24
|
+
- Company::Employee
|
25
|
+
|
26
|
+
# By default, each key will be camelized and singularized to find the matching
|
27
|
+
# class. So, the key 'dogs' will look for a class named 'Dog', and 'dog_faces'
|
28
|
+
# will look for a class 'DogFace'. You can override this heuristic here by
|
29
|
+
# saying exactly which class a given key should map to.
|
30
|
+
|
31
|
+
class_map:
|
32
|
+
address: LawDoc::Address
|
33
|
+
persons: LawDoc::Person
|
34
|
+
fax: LawDoc::Phone
|
35
|
+
|
36
|
+
# Specify constructors for classes whose .new method will not take a Hash as an
|
37
|
+
# argument to initialize the class.
|
38
|
+
|
39
|
+
class_init:
|
40
|
+
LawDoc::Person: from_hash
|
@@ -0,0 +1,28 @@
|
|
1
|
+
sdny:
|
2
|
+
name: United States District Court for the Southern District of New York
|
3
|
+
address:
|
4
|
+
street: '40 Centre Street'
|
5
|
+
city: 'New York'
|
6
|
+
state: 'NY'
|
7
|
+
zip: '10007--1581'
|
8
|
+
division: 'Centre Street'
|
9
|
+
state: 'NY'
|
10
|
+
|
11
|
+
dco:
|
12
|
+
name: 'United States District Court for the District of Colorado'
|
13
|
+
address:
|
14
|
+
street: '901 19th Street, Room A105'
|
15
|
+
city: 'Denver'
|
16
|
+
state: 'CO'
|
17
|
+
zip: '80294-3589'
|
18
|
+
state: 'CO'
|
19
|
+
|
20
|
+
jocolimited:
|
21
|
+
name: 'District Court for Johnson County, Kansas'
|
22
|
+
address:
|
23
|
+
street: '100 N. Kansas Ave'
|
24
|
+
city: 'Olathe'
|
25
|
+
state: 'KS'
|
26
|
+
zip: '66061'
|
27
|
+
division: '61, Room 222'
|
28
|
+
state: 'KS'
|
@@ -0,0 +1,40 @@
|
|
1
|
+
# This is a comment
|
2
|
+
ded:
|
3
|
+
sex: male
|
4
|
+
last: Doherty
|
5
|
+
first: Daniel
|
6
|
+
middle: E.
|
7
|
+
address:
|
8
|
+
street: 7300 W. 110th Street, Suite 930
|
9
|
+
city: Overland Park
|
10
|
+
state: KS
|
11
|
+
zip: 66210
|
12
|
+
phone: 913-338-7182
|
13
|
+
fax: 913-338-7182
|
14
|
+
email: ded-law@ddoherty.net
|
15
|
+
bar_numbers:
|
16
|
+
KS: "12761"
|
17
|
+
MO: "33482"
|
18
|
+
NY: "DD-2145"
|
19
|
+
esig: /s/ Daniel E. Doherty
|
20
|
+
sig: "\\DEDSig"
|
21
|
+
|
22
|
+
cjh:
|
23
|
+
sex: male
|
24
|
+
last: Hyland
|
25
|
+
first: Charles
|
26
|
+
middle: J.
|
27
|
+
address:
|
28
|
+
street: 7300 W. 110th Street, Suite 930
|
29
|
+
city: Overland Park
|
30
|
+
state: KS
|
31
|
+
zip: "66210"
|
32
|
+
phone: 913-338-7182
|
33
|
+
fax: 913-338-7182
|
34
|
+
email: charlie@hylandlawkc.com
|
35
|
+
bar_numbers:
|
36
|
+
KS: "12761"
|
37
|
+
MO: "33482"
|
38
|
+
NY: "DD-2145"
|
39
|
+
esig: /s/ Charles J. Hyland
|
40
|
+
sig: "\\CJHSig"
|
@@ -0,0 +1,59 @@
|
|
1
|
+
erickson:
|
2
|
+
number: 14-CV-09061
|
3
|
+
complaint_date: 2014-11-17
|
4
|
+
court: ydl:/courts/sdny
|
5
|
+
judge: ydl:/judges/kbf
|
6
|
+
parties:
|
7
|
+
-
|
8
|
+
person: ydl:/persons/mdg
|
9
|
+
role: Plaintiff
|
10
|
+
lawyers:
|
11
|
+
- ydl:/lawyers/ded
|
12
|
+
- ydl:/lawyers/cjh
|
13
|
+
-
|
14
|
+
person: ydl:/persons/revive
|
15
|
+
role: Plaintiff
|
16
|
+
lawyers: ydl:/cases/erickson/parties/0/lawyers
|
17
|
+
-
|
18
|
+
person: ydl:/persons/morgan
|
19
|
+
role: Defendant
|
20
|
+
lawyers:
|
21
|
+
- ydl:/lawyers/rjones
|
22
|
+
- ydl:/lawyers/mcrisp
|
23
|
+
- ydl:/lawyers/tfarrell
|
24
|
+
-
|
25
|
+
person: ydl:/persons/zmpef1
|
26
|
+
role: Defendant
|
27
|
+
lawyers:
|
28
|
+
- ydl:/lawyers/rjones
|
29
|
+
- ydl:/lawyers/mcrisp
|
30
|
+
- ydl:/lawyers/tfarrell
|
31
|
+
-
|
32
|
+
person: ydl:/persons/zmpef2
|
33
|
+
role: Defendant
|
34
|
+
lawyers:
|
35
|
+
- ydl:/lawyers/rjones
|
36
|
+
- ydl:/lawyers/mcrisp
|
37
|
+
- ydl:/lawyers/tfarrell
|
38
|
+
-
|
39
|
+
person: ydl:/persons/erickson
|
40
|
+
role: Nominal Defendant
|
41
|
+
lawyers:
|
42
|
+
- ydl:/lawyers/dclarke
|
43
|
+
- ydl:/lawyers/jclarke
|
44
|
+
|
45
|
+
mainstreet:
|
46
|
+
court: ydl:/courts/jocolimited
|
47
|
+
number: 21LA04135
|
48
|
+
judge: ydl:/judges/vokins
|
49
|
+
parties:
|
50
|
+
-
|
51
|
+
person: ydl:/persons/tdoherty
|
52
|
+
role: Defendant
|
53
|
+
lawyers:
|
54
|
+
- ydl:/lawyers/ded
|
55
|
+
-
|
56
|
+
person: ydl:/persons/mainstreet
|
57
|
+
role: Plaintiff
|
58
|
+
lawyers:
|
59
|
+
- ydl:/lawyers/pittenger
|
@@ -0,0 +1,27 @@
|
|
1
|
+
kbf:
|
2
|
+
sex: female
|
3
|
+
hon: Hon.
|
4
|
+
first: Katherine
|
5
|
+
middle: B.
|
6
|
+
last: Forrest
|
7
|
+
initials: KBF
|
8
|
+
title: District Court Judge
|
9
|
+
address:
|
10
|
+
street:
|
11
|
+
- United States Courthouse
|
12
|
+
- 500 Pearle Street, Room 1320
|
13
|
+
city: New York
|
14
|
+
state: NY
|
15
|
+
zip: '10007-1320'
|
16
|
+
|
17
|
+
vokins:
|
18
|
+
name: Daniel W. Vokins
|
19
|
+
title: District Court Judge
|
20
|
+
initials: DWV
|
21
|
+
address:
|
22
|
+
street: '100 N. Kansas Ave'
|
23
|
+
city: 'Olathe'
|
24
|
+
state: 'KS'
|
25
|
+
zip: '66061'
|
26
|
+
phone: 913-715-3356
|
27
|
+
email: DCC-Chapter61@jocogov.org
|
@@ -0,0 +1,52 @@
|
|
1
|
+
# This is a comment
|
2
|
+
ded:
|
3
|
+
sex: male
|
4
|
+
last: Doherty
|
5
|
+
first: Daniel
|
6
|
+
middle: E.
|
7
|
+
address:
|
8
|
+
street: 7300 W. 110th Street, Suite 930
|
9
|
+
city: Overland Park
|
10
|
+
state: KS
|
11
|
+
zip: 66210
|
12
|
+
phone: 913-338-7182
|
13
|
+
fax: 913-338-7182
|
14
|
+
email: ded-law@ddoherty.net
|
15
|
+
bar_numbers:
|
16
|
+
KS: "12761"
|
17
|
+
MO: "33482"
|
18
|
+
NY: "DD-2145"
|
19
|
+
esig: /s/ Daniel E. Doherty
|
20
|
+
sig: "\\DEDSig"
|
21
|
+
|
22
|
+
cjh:
|
23
|
+
sex: male
|
24
|
+
last: Hyland
|
25
|
+
first: Charles
|
26
|
+
middle: J.
|
27
|
+
address:
|
28
|
+
street: 7300 W. 110th Street, Suite 930
|
29
|
+
city: Overland Park
|
30
|
+
state: KS
|
31
|
+
zip: "66210"
|
32
|
+
phone: 913-338-7182
|
33
|
+
fax: 913-338-7182
|
34
|
+
email: charlie@hylandlawkc.com
|
35
|
+
bar_numbers:
|
36
|
+
KS: "12761"
|
37
|
+
MO: "33482"
|
38
|
+
NY: "DD-2145"
|
39
|
+
esig: /s/ Charles J. Hyland
|
40
|
+
sig: "\\CJHSig"
|
41
|
+
|
42
|
+
pittenger:
|
43
|
+
name: Brandon T. Pittenger
|
44
|
+
address:
|
45
|
+
street:
|
46
|
+
- 6900 College Blvd., Suite 325
|
47
|
+
city: Overland Park
|
48
|
+
state: KS
|
49
|
+
zip: 66211
|
50
|
+
phone: (913) 323-4595
|
51
|
+
fax: (913) 661-1747
|
52
|
+
email: pittengerlawgroup@pittengerlawgroup.com
|