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.
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