ydl 0.2.06
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +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
|