slaw 1.0.0.alpha.3 → 1.0.0.alpha.4

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 31ca69bdfe68c0e688320a033b63bc319dd3494e
4
- data.tar.gz: 95abf4fbf34526c2497f87413bfb1a9bc0229e4c
3
+ metadata.gz: a2fbb349a6f18f3b78feda6a8242e3688db6f65b
4
+ data.tar.gz: 6dc113e8c0194a813b5a0837fc6bb5dabdfe7570
5
5
  SHA512:
6
- metadata.gz: ccab43b362cd4eb771a5eeed3700b24ef7cc957f6f13144e461e79907518206f630c256fe442259224ddf76c02985743bedf1be6686a118a3ff97f909d1a4e80
7
- data.tar.gz: 192cad74ecbc0c26335b2eda024ff7f206171f32fdfb4c6823212744f4aca463f21d97878e5f718ab2695ce9d37784bf1bdd4ec2cd494fd3a3daa0d32d2443e4
6
+ metadata.gz: a3941935634b014c79358c16784acfb32ac16f6fd083b4a9f31a029fb90d0f19eff4ca4eca29e71e54348a9458617c53a661b0537d2b4922157dba6fdd64f7ff
7
+ data.tar.gz: f76579ebb6a935e1c46a3ef4ba5eaafe3761673408fc35006c5036d677650aeaa534335095bff3ca139bb8e09a5df8bf384dc4071f432d5c5053a933391e76bf
data/README.md CHANGED
@@ -223,6 +223,7 @@ Akoma Ntoso `component` elements at the end of the XML document, with a name of
223
223
  * Improved support for other legal traditions / grammars.
224
224
  * Add Polish legal tradition grammar.
225
225
  * Slaw no longer does too much introspection of a parsed document, since that can be so tradition-dependent.
226
+ * Move reformatting out of Slaw since it's tradition-dependent.
226
227
  * Remove definition linking, Slaw no longer supports it.
227
228
 
228
229
  ### 0.17.2
data/bin/slaw CHANGED
@@ -20,7 +20,6 @@ class SlawCLI < Thor
20
20
  option :fragment, type: :string, desc: "Akoma Ntoso element name that the imported text represents. Support depends on the grammar."
21
21
  option :id_prefix, type: :string, desc: "Prefix to be used when generating ID elements when parsing a fragment."
22
22
  option :section_number_position, enum: ['before-title', 'after-title', 'guess'], desc: "Where do section titles come in relation to the section number? Default: before-title"
23
- option :reformat, type: :boolean, desc: "Reformat common formatting issues to make grammar matching better. Default: true for PDF files, false otherwise"
24
23
  option :crop, type: :string, desc: "Crop box for PDF files, as 'left,top,width,height'."
25
24
  option :grammar, type: :string, desc: "Grammar name (usually a two-letter country code). Default is za."
26
25
  def parse(name)
@@ -39,7 +38,6 @@ class SlawCLI < Thor
39
38
  case options[:input]
40
39
  when 'pdf'
41
40
  text = extractor.extract_from_pdf(name)
42
- options[:reformat] = true if options[:reformat].nil?
43
41
  when 'text'
44
42
  text = extractor.extract_from_text(name)
45
43
  else
@@ -48,8 +46,6 @@ class SlawCLI < Thor
48
46
 
49
47
  generator = Slaw::ActGenerator.new(options[:grammar] || 'za')
50
48
 
51
- text = generator.reformat(text) if options[:reformat]
52
-
53
49
  if options[:fragment]
54
50
  generator.document_class = Slaw::Fragment
55
51
 
@@ -14,23 +14,11 @@ module Slaw
14
14
  def cleanup(s)
15
15
  s = scrub(s)
16
16
  s = correct_newlines(s)
17
- s = fix_quotes(s)
18
17
  s = expand_tabs(s)
19
18
  s = chomp(s)
20
19
  s = enforce_newline(s)
21
20
  end
22
21
 
23
- # Run deeper introspections and reformat the text, such as
24
- # unwrapping/re-wrapping lines. These may not be safe to run
25
- # multiple times.
26
- def reformat(s)
27
- s = remove_boilerplate(s)
28
- s = unbreak_lines(s)
29
- s = break_lines(s)
30
- s = strip_toc(s)
31
- s = enforce_newline(s)
32
- end
33
-
34
22
  # ------------------------------------------------------------------------
35
23
 
36
24
  def remove_empty_lines(s)
@@ -51,36 +39,12 @@ module Slaw
51
39
  .gsub(/–/, '-')
52
40
  end
53
41
 
54
- # change weird quotes to normal ones
55
- def fix_quotes(s)
56
- s.gsub(/‘‘|’’|''/, '"')
57
- end
58
-
59
42
  # tabs to spaces
60
43
  def expand_tabs(s)
61
44
  s.gsub(/\t/, ' ')\
62
45
  .gsub("\u00A0", ' ') # non-breaking space
63
46
  end
64
47
 
65
- # Try to remove boilerplate lines found in many files, such as page numbers.
66
- def remove_boilerplate(s)
67
- # nuke any line to do with Sabinet and the government printer
68
- s.gsub(/^.*Sabinet.*Government Printer.*$/i, '')\
69
- .gsub(/^.*Provincial Gazette \d+.*$/i, '')\
70
- .gsub(/^.*Provinsiale Koerant \d+.*$/i, '')\
71
- .gsub(/^.*PROVINCIAL GAZETTE.*$/, '')\
72
- .gsub(/^.*PROVINSIALE KOERANT.*$/, '')\
73
- .gsub(/^\s*\d+\s*$/, '')\
74
- .gsub(/^.*This gazette is also available.*$/, '')\
75
- # get rid of date lines
76
- .gsub(/^\d{1,2}\s+\w+\s+\d{4}$/, '')\
77
- # get rid of page number lines
78
- .gsub(/^\s*page \d+( of \d+)?\s*\n/i, '')\
79
- .gsub(/^\s*\d*\s*No\. \d+$/, '')\
80
- # get rid of lines with lots of ____ or ---- chars, they're usually pagebreaks
81
- .gsub(/^.*[_-]{5}.*$/, '')
82
- end
83
-
84
48
  # Get rid of whitespace at the end of lines and at the start and end of the
85
49
  # entire string.
86
50
  def chomp(s)
@@ -95,106 +59,6 @@ module Slaw
95
59
  # ensure string ends with a newline
96
60
  s.end_with?("\n") ? s : (s + "\n")
97
61
  end
98
-
99
- # Make educated guesses about lines that should
100
- # have been broken but haven't, and break them.
101
- #
102
- # This is very dependent on a locale's legislation grammar, there are
103
- # lots of rules of thumb that make this work.
104
- def break_lines(s)
105
- # often we find a section title munged onto the same line as its first statement
106
- # eg:
107
- # foo bar. New section title 62. (1) For the purpose
108
- s = s.gsub(/\. ([^.]+) (\d+\. ?\(1\) )/, ".\n" + '\1' + "\n" + '\2')
109
-
110
- # New section title 62. (1) For the purpose
111
- s = s.gsub(/(\w) (\d+\. ?\(1\) )/, '\1' + "\n" + '\2')
112
-
113
- # (1) foo; (2) bar
114
- # (1) foo. (2) bar
115
- s = s.gsub(/(\w{3,}[;.]) (\([0-9a-z]+\))/, "\\1\n\\2")
116
-
117
- # (1) foo; and (2) bar
118
- # (1) foo; or (2) bar
119
- s = s.gsub(/; (and|or) \(/, "; \\1\n(")
120
-
121
- # The officer-in-Charge may – (a) remove all withered natural... \n(b)
122
- # We do this last, because by now we should have reconised that (b) should already
123
- # be on a new line.
124
- s = s.gsub(/ (\(a\) .+?\n\(b\))/, "\n\\1")
125
-
126
- # "foo" means ...; "bar" means
127
- s = s.gsub(/; (["”“][^"”“]+?["”“] means)/, ";\n\\1")
128
-
129
- # CHAPTER 4 PARKING METER PARKING GROUNDS Place of parking
130
- s = s.gsub(/([A-Z0-9 ]{5,}) ([A-Z][a-z ]{5,})/, "\\1\n\\2")
131
-
132
- s
133
- end
134
-
135
- # Find likely candidates for unnecessarily broken lines
136
- # and unbreaks them.
137
- def unbreak_lines(s)
138
- lines = s.split(/\n/)
139
- output = []
140
-
141
- # set of regex matcher pairs, one for the prev line, one for the current line
142
- matchers = [
143
- [/[a-z0-9]$/, /^\s*[a-z]/], # line ends with and starst with lowercase
144
- [/;$/, /^\s*(and|or)/], # ends with ; then and/or on new line
145
- ]
146
-
147
- prev = nil
148
- lines.each_with_index do |line, i|
149
- if i == 0
150
- output << line
151
- else
152
- prev = output[-1]
153
- unbreak = false
154
-
155
- for prev_re, curr_re in matchers
156
- if prev =~ prev_re and line =~ curr_re
157
- unbreak = true
158
- break
159
- end
160
- end
161
-
162
- if unbreak
163
- output[-1] = prev + ' ' + line
164
- else
165
- output << line
166
- end
167
- end
168
- end
169
-
170
- output.join("\n")
171
- end
172
-
173
- # Do our best to remove table of contents at the start,
174
- # it really confuses the grammer.
175
- def strip_toc(s)
176
- # first, try to find 'TABLE OF CONTENTS' anywhere within the first 4K of text,
177
- if toc_start = s[0..4096].match(/TABLE OF CONTENTS/i)
178
-
179
- # grab the first non-blank line after that, it's our end-of-TOC marker
180
- if eol = s.match(/^(.+?)$/, toc_start.end(0))
181
- marker = eol[0]
182
-
183
- # search for the first line that is a prefix of marker (or vv), and delete
184
- # everything in between
185
- posn = eol.end(0)
186
- while m = s.match(/^(.+?)$/, posn)
187
- if marker.start_with?(m[0]) or m[0].start_with?(marker)
188
- return s[0...toc_start.begin(0)] + s[m.begin(0)..-1]
189
- end
190
-
191
- posn = m.end(0)
192
- end
193
- end
194
- end
195
-
196
- s
197
- end
198
62
  end
199
63
  end
200
64
  end
data/lib/slaw/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Slaw
2
- VERSION = "1.0.0.alpha.3"
2
+ VERSION = "1.0.0.alpha.4"
3
3
  end
@@ -16,133 +16,4 @@ describe Slaw::Parse::Cleanser do
16
16
  subject.expand_tabs("foo \u00A0bar").should == "foo bar"
17
17
  end
18
18
  end
19
-
20
- describe '#unbreak_lines' do
21
- it 'should unbreak simple lines' do
22
- subject.unbreak_lines("""
23
- 8.2.3 an additional fee or tariff, which is
24
- to be determined by the City in its
25
- sole discretion, in respect of additional
26
- costs incurred or services.
27
- 8.3 In the event that a person qualifies for
28
- a permit, but has motivated in writing
29
- the inability to pay the fee contemplated.""").should == """
30
- 8.2.3 an additional fee or tariff, which is to be determined by the City in its sole discretion, in respect of additional costs incurred or services.
31
- 8.3 In the event that a person qualifies for a permit, but has motivated in writing the inability to pay the fee contemplated."""
32
- end
33
-
34
- it 'should not unbreak section headers' do
35
- subject.unbreak_lines("""
36
- 8.4.3 must be a South African citizen, failing which, must be in possession of
37
- a valid work permit which includes, but is not limited to, a refugee
38
- permit; and
39
- 8.4.4 must not employ and actively utilise the services of more than 20
40
- (twenty) persons.""").should == """
41
- 8.4.3 must be a South African citizen, failing which, must be in possession of a valid work permit which includes, but is not limited to, a refugee permit; and
42
- 8.4.4 must not employ and actively utilise the services of more than 20
43
- (twenty) persons."""
44
- end
45
- end
46
-
47
- describe '#break_lines' do
48
- it 'should break nested lists' do
49
- subject.break_lines('stored, if known; (b) the number of trolleys').should == "stored, if known;\n(b) the number of trolleys"
50
-
51
- subject.break_lines("(5) The officer-in-Charge may – (a) remove all withered natural flowers, faded or damaged artificial flowers and any receptacle placed on a grave; or\n(b) 30 days after publishing a general").should == "(5) The officer-in-Charge may –\n(a) remove all withered natural flowers, faded or damaged artificial flowers and any receptacle placed on a grave; or\n(b) 30 days after publishing a general"
52
-
53
- subject.break_lines("(2) No person may – (a) plant, cut or remove plants, shrubs or flowers on a grave without the permission of the officer-in-charge; (b) plant, cut or remove plants, shrubs or flowers on the berm section; or").should == "(2) No person may –\n(a) plant, cut or remove plants, shrubs or flowers on a grave without the permission of the officer-in-charge;\n(b) plant, cut or remove plants, shrubs or flowers on the berm section; or"
54
-
55
- subject.break_lines('(b) its successor in title; or (c) a structure or person exercising a delegated power or carrying out an instruction, where any power in these By-laws, has been delegated or sub-delegated or an instruction given as contemplated in, section 59 of the Local Government: Municipal Systems Act, 2000 (Act No. 32 of 2000); or (d) a service provider fulfilling a responsibility under these By-laws, assigned to it in terms of section 81(2) of the Local Government: Municipal Systems Act, 2000, or any other law, as the case may be;').should == "(b) its successor in title; or\n(c) a structure or person exercising a delegated power or carrying out an instruction, where any power in these By-laws, has been delegated or sub-delegated or an instruction given as contemplated in, section 59 of the Local Government: Municipal Systems Act, 2000 (Act No. 32 of 2000); or\n(d) a service provider fulfilling a responsibility under these By-laws, assigned to it in terms of section 81(2) of the Local Government: Municipal Systems Act, 2000, or any other law, as the case may be;"
56
- end
57
-
58
- it 'should break at likely subsections' do
59
- subject.break_lines('(c) place a metal cot on any grave. (3) A person may only erect, place or leave, an object or decoration on a grave during the first 30 days following the burial. (4) Natural or artificial flowers contained in receptacles may be placed on a grave at any time, but in a grave within a berm section or with a headstone, such flowers may only be placed in the socket provided. (5) The officer-in-Charge may – (a) remove all withered natural flowers, faded or damaged artificial flowers and any receptacle placed on a grave; or').should == "(c) place a metal cot on any grave.\n(3) A person may only erect, place or leave, an object or decoration on a grave during the first 30 days following the burial.\n(4) Natural or artificial flowers contained in receptacles may be placed on a grave at any time, but in a grave within a berm section or with a headstone, such flowers may only be placed in the socket provided.\n(5) The officer-in-Charge may – (a) remove all withered natural flowers, faded or damaged artificial flowers and any receptacle placed on a grave; or"
60
- end
61
-
62
- it 'should break lines at likely section titles' do
63
- subject.break_lines('foo bar. New section title 62. (1) For the purpose').should == "foo bar.\nNew section title\n62. (1) For the purpose"
64
- subject.break_lines('foo bar. New section title 62.(1) For the purpose').should == "foo bar.\nNew section title\n62.(1) For the purpose"
65
- subject.break_lines('New section title 62. (1) For the purpose').should == "New section title\n62. (1) For the purpose"
66
- subject.break_lines('New section title 62.(1) For the purpose').should == "New section title\n62.(1) For the purpose"
67
- end
68
-
69
- it 'should clean up wrapped definition lines after pdf' do
70
- subject.break_lines('“agricultural holding” means a portion of land not less than 0.8 hectares in extent used solely or mainly for the purpose of agriculture, horticulture or for breeding or keeping domesticated animals, poultry or bees; “approved” means as approved by the Council; “bund wall” means a containment wall surrounding an above ground storage tank, constructed of an impervious material and designed to contain 110% of the contents of the tank; “certificate of fitness” means a certificate contemplated in section 20; “certificate of registration” means a certificate contemplated in section 35;').should == "“agricultural holding” means a portion of land not less than 0.8 hectares in extent used solely or mainly for the purpose of agriculture, horticulture or for breeding or keeping domesticated animals, poultry or bees;\n“approved” means as approved by the Council;\n“bund wall” means a containment wall surrounding an above ground storage tank, constructed of an impervious material and designed to contain 110% of the contents of the tank;\n“certificate of fitness” means a certificate contemplated in section 20;\n“certificate of registration” means a certificate contemplated in section 35;"
71
- end
72
-
73
- it 'should break at CAPCASE TO Normal Case' do
74
- subject.break_lines('CHAPTER 3 PARKING METER PARKING GROUNDS Place of parking 7. No person may park or cause or permit to be parked any vehicle or allow a vehicle to be or remain in a parking meter parking ground otherwise than in a parking bay.').should == "CHAPTER 3 PARKING METER PARKING GROUNDS\nPlace of parking 7. No person may park or cause or permit to be parked any vehicle or allow a vehicle to be or remain in a parking meter parking ground otherwise than in a parking bay."
75
- end
76
- end
77
-
78
- describe '#strip_toc' do
79
- it 'should handle no toc' do
80
- s = "City of Johannesburg Metropolitan Municipality
81
- CULTURE AND RECREATION BY-LAWS ( )PUBLISHED IN PROVINCIAL GAZETTE EXTRAORDINARY NO 179 DATED 21 MAY 2004 UNDER NOTICE NUMBER 825
82
-
83
- CITY OF JOHANNESBURG METROPOLITAN MUNICIPALITY
84
- CULTURE AND RECREATION BY-LAWS
85
- The Municipal Manager of the City of Johannesburg Metropolitan Municipality hereby, in terms of Section 13(a) of the Local Government: Municipal Systems Act, 2000 (Act No. 32 of 2000), publishes the Culture and RecreationBy-laws for the City of Johannesburg Metropolitan Municipality, as approved by its Council, as set out hereunder.
86
- CITY OF JOHANNESBURG METROPOLITAN MUNICIPALITY
87
- CULTURE AND RECREATION BY-LAWS
88
- CHAPTER 1 LIBRARY AND INFORMATION SERVICES
89
- Definitions and interpretation
90
- 1. (1) In this Chapter, unless the context otherwise indicates-"
91
- subject.strip_toc(s).should == s
92
- end
93
-
94
- it 'should strip table of contents' do
95
- subject.strip_toc("City of Johannesburg Metropolitan Municipality
96
- CULTURE AND RECREATION BY-LAWS ( )PUBLISHED IN PROVINCIAL GAZETTE EXTRAORDINARY NO 179 DATED 21 MAY 2004 UNDER NOTICE NUMBER 825
97
-
98
- CITY OF JOHANNESBURG METROPOLITAN MUNICIPALITY
99
- CULTURE AND RECREATION BY-LAWS
100
- The Municipal Manager of the City of Johannesburg Metropolitan Municipality hereby, in terms of Section 13(a) of the Local Government: Municipal Systems Act, 2000 (Act No. 32 of 2000), publishes the Culture and RecreationBy-laws for the City of Johannesburg Metropolitan Municipality, as approved by its Council, as set out hereunder.
101
- CITY OF JOHANNESBURG METROPOLITAN MUNICIPALITY
102
- CULTURE AND RECREATION BY-LAWS
103
- TABLE OF CONTENTS
104
- CHAPTER 1
105
- LIBRARY AND INFORMATION SERVICES
106
- 1. Definitions and interpretation 2. Admission to library buildings 3. Membership 4. Loan of library material 5. Return of library material 6. Overdue library material 7. Reservation of library material 8. Lost and damaged library material 9. Handling of library material 10. Exposure of library material to notifiable and infectious diseases 11. Library material for special and reference purposes 12. Reproduction of library material and objects and use of facsimile facilities 13. Library hours 14. Hire and use of auditoria and lecture rooms or library space 15. Internet viewing stations 16. Hiring of multimedia library space 17. Performing arts library 18. Availability of By-laws and notices in a library 19. Conduct in the libraries
107
- CHAPTER 2
108
- ARTS AND CULTURE AND COMMUNITY CENTRE FACILITIES
109
-
110
- Part 1: Hire and use of community arts & culture facilities
111
- 20. Definitions and interpretation 21. Rights and status of artists 22. Co-operation between Council departments 23. Application for hiring of premises 24. Prescribed fees 25. Payment of fees 26. Period of hire 27. Adjustment of period of hire 28. Joint hire 29. Sub-letting 30. Condition of premises 31. Duties of the hirer 32. Advertisements and decorations 33. Admissions and sale of tickets 34. Overcrowding 35. Sale of refreshments 36. Services 37. Cancellation due to destruction of premises 38. Cancellation due to non-compliance 39. Termination of period of hire 40 Fire hazards and Insurance 41. Storage facilities 42. Equipment 43. Right of entry 44. Inspection 45. Regulations 46. Nuisance
112
- Part 2: Community centres
113
- 47. Group activities 48. Membership 49. Membership fees 50. Use of centres for religious or personal purposes 51. Dress code 52. Conduct of children 53. Application of certain sections of part 1 of Chapter 2 to centres 54. Application of certain sections of Part 2 of Chapter 3 to centres
114
-
115
- CHAPTER 3
116
- RECREATION AND SPORT
117
- Part 1: Camping and caravan parks
118
- 55. Definitions and interpretation 56. Lighting of fires prohibited 57. Permits 58. Extension of permits 59. Limitation on the period of occupancy of a camping site 60. Allocation and Use of sites 61. Proper use of roads and pathways 62. Reservation of sites 63. Right of refusal to issue or renew permits 64. Obligations of permit holders 65. Cancellation of permits 66. Access and loitering by members of the public prohibited 67. Site to be left in a clean condition 68. Washing of clothes and utensils and preparation of foodstuffs 69. Trading without permission 70. Damage to Vegetation or Property 71. Instructions of camping officer to be complied with 72 Registration and use of firearms 73. Protection of wildlife 74. Special requirements regarding caravan parks and caravans
119
- Part 2: Sport Facilities
120
- 75. Definitions and interpretation 76. Administration 77. Access conditions 78. Smoking 79. Alcoholic beverages 80. Duties of hirer 81. Dress code 82. Hiring of sport facilities 83. Reservation of sport facilities by the Council 84. Group activities 85. Public decency 86. Clothing and personal effects 87. Prescribed fees 88. Generally prohibited conduct 89. Animals 90. Infectious Diseases 91. Firearms and Traditional Weapons 92. Disturbance by sound systems 93. Sale of food and refreshments 94. Filming and photographs 95. Sport advisory forum
121
-
122
- CHAPTER 4 MISCELLANEOUS 96. Definitions and interpretation 97. Animals in facilities 98. Liability for acts and omissions 99. Offences and penalties 100.
123
- Repeal
124
- SCHEDULE 1 BY-LAWS REPEALED
125
- CHAPTER 1 LIBRARY AND INFORMATION SERVICES
126
- Definitions and interpretation
127
- 1. (1) In this Chapter, unless the context otherwise indicates-").should == "City of Johannesburg Metropolitan Municipality
128
- CULTURE AND RECREATION BY-LAWS ( )PUBLISHED IN PROVINCIAL GAZETTE EXTRAORDINARY NO 179 DATED 21 MAY 2004 UNDER NOTICE NUMBER 825
129
-
130
- CITY OF JOHANNESBURG METROPOLITAN MUNICIPALITY
131
- CULTURE AND RECREATION BY-LAWS
132
- The Municipal Manager of the City of Johannesburg Metropolitan Municipality hereby, in terms of Section 13(a) of the Local Government: Municipal Systems Act, 2000 (Act No. 32 of 2000), publishes the Culture and RecreationBy-laws for the City of Johannesburg Metropolitan Municipality, as approved by its Council, as set out hereunder.
133
- CITY OF JOHANNESBURG METROPOLITAN MUNICIPALITY
134
- CULTURE AND RECREATION BY-LAWS
135
- CHAPTER 1 LIBRARY AND INFORMATION SERVICES
136
- Definitions and interpretation
137
- 1. (1) In this Chapter, unless the context otherwise indicates-"
138
- end
139
- end
140
-
141
- describe '#remove_boilerplate' do
142
- it 'should handle no toc' do
143
- s = "(2)The provisions of section 12 (1) (a), (b), (d) and (g) and section 12(2), (3), (4) and (5), read with the necessary changes, apply to the taking into custody of cats.\nClaiming of impounded dogs and cats\n_____________________________________________________________________________________________ ___________ By-laws relating to Dogs and Cats for Promulgation\n14. (1) Any person may claim an impounded dog or cat if he or she –\n(a) satisfies the poundmaster that he or she is the owner or is otherwise entitled to the custody of the dog or cat concerned;"
144
-
145
- subject.remove_boilerplate(s).should == "(2)The provisions of section 12 (1) (a), (b), (d) and (g) and section 12(2), (3), (4) and (5), read with the necessary changes, apply to the taking into custody of cats.\nClaiming of impounded dogs and cats\n\n14. (1) Any person may claim an impounded dog or cat if he or she –\n(a) satisfies the poundmaster that he or she is the owner or is otherwise entitled to the custody of the dog or cat concerned;"
146
- end
147
- end
148
19
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: slaw
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0.alpha.3
4
+ version: 1.0.0.alpha.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Greg Kempe