ydl 0.2.06

Sign up to get free protection for your applications and to get access to all the features.
Files changed (60) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +23 -0
  3. data/.rspec +2 -0
  4. data/.travis.yml +5 -0
  5. data/Gemfile +4 -0
  6. data/Gemfile.lock +83 -0
  7. data/README.org +208 -0
  8. data/Rakefile +6 -0
  9. data/bin/console +11 -0
  10. data/bin/setup +8 -0
  11. data/examples/brief.tex +43 -0
  12. data/examples/cases.ydl +79 -0
  13. data/examples/header.rb +12 -0
  14. data/examples/lawyers.ydl +65 -0
  15. data/examples/mwe.tex +67 -0
  16. data/examples/persons.ydl +10 -0
  17. data/examples/simple.tex +23 -0
  18. data/examples/test_page.tex +76 -0
  19. data/lib/ydl/core_ext/array.rb +6 -0
  20. data/lib/ydl/core_ext/array_refine.rb +16 -0
  21. data/lib/ydl/core_ext/boolean.rb +13 -0
  22. data/lib/ydl/core_ext/date.rb +6 -0
  23. data/lib/ydl/core_ext/hash.rb +16 -0
  24. data/lib/ydl/core_ext/numeric.rb +6 -0
  25. data/lib/ydl/core_ext/string.rb +16 -0
  26. data/lib/ydl/core_ext.rb +7 -0
  27. data/lib/ydl/errors.rb +5 -0
  28. data/lib/ydl/node.rb +190 -0
  29. data/lib/ydl/top_queue.rb +40 -0
  30. data/lib/ydl/tree.rb +95 -0
  31. data/lib/ydl/version.rb +3 -0
  32. data/lib/ydl/ydl.rb +244 -0
  33. data/lib/ydl.rb +15 -0
  34. data/spec/array_spec.rb +14 -0
  35. data/spec/core_ext/array_spec.rb +23 -0
  36. data/spec/core_ext/boolean_spec.rb +10 -0
  37. data/spec/core_ext/date_spec.rb +9 -0
  38. data/spec/core_ext/hash_spec.rb +19 -0
  39. data/spec/core_ext/numeric_spec.rb +13 -0
  40. data/spec/core_ext/string_spec.rb +27 -0
  41. data/spec/example_files/err/person_err.ydl +6 -0
  42. data/spec/example_files/home/user/.ydl/config_template.yaml +40 -0
  43. data/spec/example_files/home/user/.ydl/courts/courts.ydl +28 -0
  44. data/spec/example_files/home/user/.ydl/lawyers.ydl +40 -0
  45. data/spec/example_files/home/user/.ydl/persons.ydl +9 -0
  46. data/spec/example_files/home/user/project/cases.ydl +59 -0
  47. data/spec/example_files/home/user/project/courts.ydl +7 -0
  48. data/spec/example_files/home/user/project/judges.ydl +27 -0
  49. data/spec/example_files/home/user/project/lawyers.ydl +52 -0
  50. data/spec/example_files/home/user/project/persons.ydl +5 -0
  51. data/spec/example_files/home/user/project/subproject/lawyers.ydl +85 -0
  52. data/spec/example_files/home/user/project/subproject/persons.ydl +55 -0
  53. data/spec/example_files/sys/ydl/constants.ydl +1 -0
  54. data/spec/example_files/sys/ydl/junk.ydl +1 -0
  55. data/spec/spec_helper.rb +55 -0
  56. data/spec/ydl_error_spec.rb +15 -0
  57. data/spec/ydl_spec.rb +184 -0
  58. data/yaml_v_psych.rb +15 -0
  59. data/ydl.gemspec +40 -0
  60. 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
@@ -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,10 @@
1
+ require 'spec_helper'
2
+
3
+ module Ydl
4
+ RSpec.describe 'Boolean extensions' do
5
+ it 'can detect if it is a cross-ref' do
6
+ expect(true.xref?).to be false
7
+ expect(false.xref?).to be false
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,9 @@
1
+ require 'spec_helper'
2
+
3
+ module Ydl
4
+ RSpec.describe 'Date extensions' do
5
+ it 'can detect if it is a cross-ref' do
6
+ expect(Date.today.xref?).to be false
7
+ end
8
+ end
9
+ 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,6 @@
1
+ person:
2
+ name: Daniel E. Doherty
3
+ hobbies:
4
+ - ruby programming
5
+ + hello
6
+ - bicycling
@@ -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,9 @@
1
+ revive:
2
+ sex: entity
3
+ name: Revive Investing LLC
4
+
5
+ mdg:
6
+ sex: male
7
+ first: Michael
8
+ middle: D.
9
+ last: Gibbons
@@ -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,7 @@
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'
@@ -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
@@ -0,0 +1,5 @@
1
+ mainstreet:
2
+ name: Mainstreet Credit Union
3
+
4
+ tdoherty:
5
+ name: Timothy M. Doherty