rdoba 0.9.1 → 0.9.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (51) hide show
  1. checksums.yaml +7 -7
  2. data/.gitignore +4 -0
  3. data/.travis.yml +28 -0
  4. data/CHANGES.md +6 -0
  5. data/Gemfile +5 -0
  6. data/README.md +87 -108
  7. data/Rakefile +62 -54
  8. data/TODO +6 -0
  9. data/features/mixin.feature +85 -0
  10. data/features/step_definitions/mixin_steps.rb +305 -0
  11. data/features/support/env.rb +35 -145
  12. data/features/support/mixin_support.rb +17 -0
  13. data/html/.keep +0 -0
  14. data/lib/rdoba/_version_.rb +3 -1
  15. data/lib/rdoba/a.rb +44 -42
  16. data/lib/rdoba/bcd.rb +43 -26
  17. data/lib/rdoba/blank.rb +14 -0
  18. data/lib/rdoba/combinations.rb +17 -15
  19. data/lib/rdoba/common.rb +53 -68
  20. data/lib/rdoba/debug.rb +9 -3
  21. data/lib/rdoba/deploy.rb +55 -50
  22. data/lib/rdoba/dup.rb +31 -31
  23. data/lib/rdoba/fe.rb +6 -5
  24. data/lib/rdoba/gem.rb +33 -29
  25. data/lib/rdoba/hashorder.rb +24 -24
  26. data/lib/rdoba/io.rb +81 -74
  27. data/lib/rdoba/merge.rb +21 -0
  28. data/lib/rdoba/mixin/time.rb +17 -0
  29. data/lib/rdoba/mixin/try.rb +11 -0
  30. data/lib/rdoba/mixin/try_1_9_0.rb +9 -0
  31. data/lib/rdoba/mixin/wait_if.rb +27 -0
  32. data/lib/rdoba/mixin.rb +373 -52
  33. data/lib/rdoba/numeric.rb +19 -17
  34. data/lib/rdoba/os.rb +127 -0
  35. data/lib/rdoba/re.rb +4 -4
  36. data/lib/rdoba/require.rb +24 -19
  37. data/lib/rdoba/roman.rb +32 -22
  38. data/lib/rdoba/strings.rb +6 -144
  39. data/lib/rdoba/yaml.rb +20 -18
  40. data/lib/rdoba.rb +50 -47
  41. data/rdoba.gemspec +33 -26
  42. data/tddium.yml +11 -0
  43. metadata +184 -77
  44. data/features/bcd.feature +0 -29
  45. data/features/log.feature +0 -206
  46. data/features/step_definitions/bcd_steps.rb +0 -69
  47. data/features/step_definitions/log_steps.rb +0 -164
  48. data/lib/rdoba/log.rb +0 -248
  49. data/test/helper.rb +0 -18
  50. data/test/rdoba_test.rb.stub +0 -59
  51. data/test/test_rdoba.rb +0 -7
@@ -0,0 +1,305 @@
1
+ # frozen_string_literal: true
2
+
3
+ Допустим(/ꙇє примѣнена подпримѣсь \.([^\s]+) бисера рдоба/i) do |подпримѣсь|
4
+ require 'rdoba'
5
+ case подпримѣсь
6
+ when 'пуздро'
7
+ rdoba mixin: [:case]
8
+ when 'обратка'
9
+ rdoba mixin: [:reverse]
10
+ when 'ли_пущь'
11
+ rdoba mixin: [:empty]
12
+ when 'во_сл'
13
+ rdoba mixin: [:to_h]
14
+ when 'сравнена'
15
+ rdoba mixin: [:compare]
16
+ when 'режь_по'
17
+ rdoba mixin: [:split_by]
18
+ when 'жди_ьже'
19
+ rdoba mixin: [:wait_if]
20
+ when 'время'
21
+ rdoba mixin: [:time]
22
+ when 'пробь'
23
+ rdoba mixin: [:try]
24
+ else
25
+ raise
26
+ end
27
+ end
28
+
29
+ Допустим(/^у нас есть набор чисел$/) do
30
+ @набор = [1, 2, 3, 4, 5, 6, 7, 8]
31
+ end
32
+
33
+ Если(
34
+ /къ (кирилическу|латыньску) слову въ (верхнемъ|нижнемъ|смѣшанѣмъ) пуздрѣ ꙇє примѣненъ приꙇомъ :(ниспуздри|воспуздри)/
35
+ ) do |ꙇезикъ, пуздро, приꙇомъ|
36
+ стр =
37
+ if /кирилическу/.match?(ꙇезикъ)
38
+ if /верхнемъ/.match?(пуздро)
39
+ 'КИРИЛИЧЕСКЫ БУКЫ ЗРИЙ СІИ: Ѡ И Ꙍ'
40
+ elsif /нижнемъ/.match?(пуздро)
41
+ 'кирилическы букы зрий сіи: ѡ и ꙍ'
42
+ else
43
+ 'КиРиЛиЧеСкЫ бУкЫ зРиЙ сІи: Ѡ и Ꙍ'
44
+ end
45
+ elsif /верхнемъ/.match?(пуздро)
46
+ 'LATIN LETTERS SEE THE FOLLOWING: ÆǞ'
47
+ elsif /нижнемъ/.match?(пуздро)
48
+ 'latin letters see the following: æǟ'
49
+ else
50
+ 'LaTiN lEtTeRs SeE tHe FoLlOwInG: æǞ'
51
+ end
52
+
53
+ @плодъ = (приꙇомъ =~ /ниспуздри/) && стр.downcase || стр.upcase
54
+ end
55
+
56
+ Если(/^рассечём его на чётные и нечётные$/) do
57
+ @чётъ, @нечётъ = @набор.split_by { |x| x.even? }
58
+ end
59
+
60
+ Если(/^спробуем вызвать метод :qwer пущя$/) do
61
+ @плодъ = nil.try(:qwer)
62
+ end
63
+
64
+ То(/^(кирилическо|латыньско) слово имаꙇє буквы въ (нижнемъ|верхнемъ) пуздрѣ$/) do |ꙇезикъ, пуздро|
65
+ плодъ =
66
+ if /кирилическо/.match?(ꙇезикъ)
67
+ (пуздро =~ /верхнемъ/) && 'КИРИЛИЧЕСКЫ БУКЫ ЗРИЙ СІИ: Ѡ И Ꙍ' || 'кирилическы букы зрий сіи: ѡ и ꙍ'
68
+ else
69
+ (пуздро =~ /верхнемъ/) && 'LATIN LETTERS SEE THE FOLLOWING: ÆǞ' || 'latin letters see the following: æǟ'
70
+ end
71
+
72
+ if @плодъ != плодъ
73
+ raise "Плодна Страза со значенꙇемъ '#{@плодъ}' должна имѣти значенꙇе " \
74
+ "'#{плодъ}'"
75
+ end
76
+ end
77
+
78
+ То(/^Стразовъ приꙇомъ :обратка( сѫ кракомъ| сѫ доведомъ)? повратє обратну Стразу$/) do |доведъ|
79
+ требе =
80
+ case доведъ
81
+ when nil
82
+ 'акортс'
83
+ when /кракомъ/u
84
+ "\xB0\xD0\xBA\xD0\xBE\xD0\x80\xD1\x82\xD1\x81\xD1"
85
+ when /доведомъ/u
86
+ 'карост'
87
+ end
88
+
89
+ исходъ =
90
+ case доведъ
91
+ when nil
92
+ 'строка'.reverse
93
+ when /кракомъ/u
94
+ 'строка'.reverse :byte_by_byte
95
+ when /доведомъ/u
96
+ 'строка'.reverse 2
97
+ end
98
+
99
+ if исходъ != требе
100
+ raise "Ложнъ исходъ '#{исходъ}' ꙇє повратнъ отъ приꙇома :обратка#{доведъ}, требуꙇє '#{требе}'"
101
+ end
102
+ end
103
+
104
+ То(/^приꙇомъ :ли_пущь рода (пущь|лжа|нове вещи) повратє (вѣрнъ|лжъ)$/) do |вещь, поврать|
105
+ поврать = (поврать == 'вѣрнъ') && true || false
106
+ исходъ =
107
+ case вещь
108
+ when 'пущь'
109
+ nil.empty? == поврать
110
+ when 'лжа'
111
+ false.empty? == поврать
112
+ when 'нове вещи'
113
+ Object.new.empty? == поврать
114
+ end
115
+ unless исходъ
116
+ raise "Ложнъ исходъ ꙇє повратнъ отъ приꙇома :ли_пущь рода #{вещь}"
117
+ end
118
+ end
119
+
120
+ Если(
121
+ /^(ровнъ|двуглубнъ|триглубнъ) наборъ( сѫ одинакыми частьми)? ꙇє пречиненъ во словникъ( приꙇомомъ :во_сл сѫ клѵчемъ :кромѣ_двоꙇниковъ)?$/
122
+ ) do |видъ, одинакъ, клѵчь|
123
+ @вещь =
124
+ case видъ
125
+ when 'ровнъ'
126
+ ['aa', 0, 'bb', 1].to_h
127
+ when 'двуглубнъ'
128
+ if одинакъ
129
+ if клѵчь
130
+ [['aa', 0], ['aa', 0]].to_h(save_unique: true)
131
+ else
132
+ [['aa', 0], ['aa', 0]].to_h
133
+ end
134
+ else
135
+ [['aa', 0], ['bb', 1]].to_h
136
+ end
137
+ when 'триглубнъ'
138
+ [['aa', 0, 1], ['bb', [1, 0]]].to_h
139
+ end
140
+ end
141
+
142
+ То(/^тъꙇи имѣꙇє ровнъ словникъ сѫ (пущими |ровнѣми |двуглубнѣми )?значѣми$/) do |видъ|
143
+ @схъ =
144
+ if /пущими/u.match?(видъ)
145
+ { 'aa' => nil, 0 => nil, 'bb' => nil, 1 => nil }
146
+ elsif /ровнѣми/u.match?(видъ)
147
+ { 'aa' => 0, 'bb' => 1 }
148
+ else
149
+ { 'aa' => [0, 1], 'bb' => [1, 0] }
150
+ end
151
+
152
+ if @вещь != @схъ
153
+ raise "Наборъ '#{@вещь}' требуꙇє быти '#{@схъ}'"
154
+ end
155
+ end
156
+
157
+ То(/^тъꙇи имѣꙇє ровнъ словникъ сѫ (однимъ|двами) двуглубн(?:ѣмъ|ѣмы) знач(?:ѣмъ|ѣмы)$/) do |видъ|
158
+ @схъ =
159
+ if /двами/.match?(видъ)
160
+ { 'aa' => [0, 0] }
161
+ else
162
+ { 'aa' => [0] }
163
+ end
164
+
165
+ if @вещь != @схъ
166
+ raise "Наборъ '#{@вещь}' требуꙇє быти '#{@схъ}'"
167
+ end
168
+ end
169
+
170
+ Если(/^имѣмы двѣ Стразы$/) do
171
+ @стры = %w[а҆́гнецъ а҆гкѵ́ра]
172
+ end
173
+
174
+ То(
175
+ /^приꙇомъ :сравнена двухъ Стразъ( сѫ презоромъ надъстрочниковъ( ꙇакъ словникъ)?)? повратє (безъ )?одна$/
176
+ ) do |доведъ, подобье, знакъ|
177
+ поврать = (знакъ =~ /безъ/u) && -1 || 1
178
+
179
+ исходъ =
180
+ if доведъ
181
+ if подобье
182
+ @стры[0].compare_to(@стры[1], ignore_diacritics: true) == поврать
183
+ else
184
+ @стры[0].compare_to(@стры[1], :ignore_diacritics) == поврать
185
+ end
186
+ else
187
+ @стры[0].compare_to(@стры[1]) == поврать
188
+ end
189
+
190
+ unless исходъ
191
+ raise "Приꙇомъ :сравнена двухъ Стразъ#{доведъ}#{подобье} требуꙇє повратъти '#{поврать}'"
192
+ end
193
+ end
194
+
195
+ То(/^получим два набора чётных и нечётных чисел$/) do
196
+ expect(@чётъ).to be_eql([2, 4, 6, 8])
197
+ expect(@нечётъ).to be_eql([1, 3, 5, 7])
198
+ end
199
+
200
+ То(/^той вернёт пущь$/) do
201
+ expect(@плодъ).to be_nil
202
+ end
203
+
204
+ Если(/^спробуем подождать мало, чтобы условие не выполнилось$/) do
205
+ @плодъ = wait_if(1) { false }
206
+ end
207
+
208
+ Если(/^спробуем подождать мало, чтобы условие выполнилось$/) do
209
+ @плодъ = wait_if(1) { true }
210
+ end
211
+
212
+ Если(/^спробуем подождать долго, чтобы условие выполнилось$/) do
213
+ @плодъ =
214
+ begin
215
+ Timeout.timeout(2) do
216
+ wait_if(10) { true }
217
+ end
218
+ rescue Timeout::Error
219
+ nil
220
+ end
221
+ end
222
+
223
+ То(/^недождёмся$/) do
224
+ expect(@плодъ).to be_nil
225
+ end
226
+
227
+ То(/^той вернёт ложно$/) do
228
+ expect(@плодъ).to be_falsey
229
+ end
230
+
231
+ То(/^той вернёт исте$/) do
232
+ expect(@плодъ).to be_truthy
233
+ end
234
+
235
+ Если(/^спробуем вызвать метод :mtime кута временного$/) do
236
+ @кут = tmpfile
237
+ @время = File.mtime(@кут)
238
+ end
239
+
240
+ Если(/^спробуем вызвать метод :atime кута временного$/) do
241
+ @кут = tmpfile
242
+ @время = File.atime(@кут)
243
+ end
244
+
245
+ Если(/^спробуем вызвать метод :ctime кута временного$/) do
246
+ @кут = tmpfile
247
+ @время = File.ctime(@кут)
248
+ end
249
+
250
+ То(/^той вернёт верно время/) do
251
+ время = @время.strftime('%Y-%m-%d %H:%M:%S.%N %z')
252
+ expect(время).to be_eql(`stat -c %y #{@кут}`.strip)
253
+ end
254
+
255
+ Если(/^ꙇє примѣнена подпримѣсь невѣрна бисера рдоба$/) do
256
+ @проц = proc { rdoba mixin: [:false] }
257
+ end
258
+
259
+ То(/^исключение невѣрнѣ опции вызвано будетъ$/) do
260
+ expect { @проц.call }.to raise_error(Rdoba::Mixin::InvalidOption)
261
+ end
262
+
263
+ # #!/usr/bin/ruby -KU
264
+ #
265
+ # if $0 == __FILE__
266
+ # p s.to_res
267
+ # [1,2,3,4,5].each_comby do |c|
268
+ # p c
269
+ # end
270
+ #
271
+ # len = 4
272
+ # value = 100
273
+ # p sprintf("%.*X", len, value )
274
+ #
275
+ # s = ' 1221 eeee 4564 wwww ' + 258.to_p
276
+ # ppp = s.scanf(' %d %s %d %s %.2+c')
277
+ # p ppp
278
+ # p 258.to_p.to_i(String::BE)
279
+ #
280
+ # null = nil
281
+ # p null.class, null
282
+ # null <<= 'qweqweqweqwe'
283
+ # p null.class, null
284
+ # null << 'qweqweqweqwe'
285
+ # p null.class, null
286
+ # i = 12
287
+ # p sprintf("0x%X", i)
288
+ # p sprintf("%.3X", i)
289
+ #
290
+ # p '----------'
291
+ #
292
+ # str = <<STR
293
+ # <font size="4" face="Irmologion Ucs">и3зhде
294
+ # повелёніе t кeсарz ѓvгуста, написaти всю2
295
+ # вселeнную</font>
296
+ # STR
297
+ #
298
+
299
+ #
300
+ # str = '/font><font size="4">III</font><i> </i>греч.<font size="4"><i></i> </font><font size="4" face="Irmologion Ucs">Мёсzца ѓvгуста въ Gi-й дeнь. Слyжба с™и1телю и3 чудотв0рцу тЂхwну, є3пcкпу вор0нежскому.</font>13 августа, Тихона Воронежского, заголовок службы m_aug\13p.hip'
301
+ # re = /<font size="4" face="Irmologion Ucs">([ -"'-\?A-BD-HJ-\[\]`-hj-\}¤¦-§©«-®±µ-·»Ё-ЌЎ-яё-ќў-џҐ-ґ–-—‘-‚“-„†-•…‰‹-›€№™∙]+?)<\/font>/
302
+ #
303
+ # p(str.match re)
304
+ # end
305
+ #
@@ -1,161 +1,51 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'rdoba'
2
- require 'tempfile'
4
+ require 'tmpdir'
3
5
  require 'open3'
4
6
  require 'coveralls'
5
- Coveralls.wear!
7
+ require 'simplecov'
8
+ require 'rspec/expectations'
6
9
 
7
- RdobaSimSimpleHead=<<HEAD
8
- #!/usr/bin/env ruby
9
-
10
- require 'rdoba'
11
- HEAD
12
-
13
- RdobaSimInHead=<<HEAD
14
- #!/usr/bin/env ruby
10
+ # specific external test/development libraries
11
+ #
12
+ #
13
+ Coveralls.wear!
14
+ SimpleCov.start
15
+ ##############################################
15
16
 
16
- require 'rdoba'
17
- class Cls
18
- def initialize
19
- self > {:variable=>"value"}
20
- end
21
- end
17
+ RdobaSimSimpleHead = <<~HEAD
18
+ #!/usr/bin/env ruby
19
+
20
+ require 'rdoba'
22
21
  HEAD
23
22
 
24
- RdobaSimClsHead=<<HEAD
25
- #!/usr/bin/env ruby
26
-
27
- require 'rdoba'
28
- class Cls
23
+ RdobaSimClsHead = <<~HEAD
24
+ #!/usr/bin/env ruby
25
+
26
+ require 'rdoba'
27
+ class Cls
29
28
  HEAD
30
29
 
31
- def format str
30
+ def format(str)
32
31
  puts str
33
- " " * @deep + str + "\n" ; end
32
+ ' ' * @deep + str + "\n"
33
+ end
34
34
 
35
35
  def store
36
- file = @inithead + @init + @echo + ( "end\n" * @deep )
36
+ file = @inithead + @init + @echo + ("end\n" * @deep)
37
37
  puts file
38
- File.open( 'tmp.rb', 'w+' ) do |f|
39
- f.puts file ; end ; end
40
-
41
- def match_keywords keystr
42
- keys = ( keystr || '' ).split( /[,:\s]/ ).map do |k|
43
- [ :basic, :extended, :enter, :leave, :compat, :timestamp, :pid,
44
- :function_name, :function_line ].include?( k.to_sym ) && k.to_sym || nil
45
- end.compact ; end
46
-
47
- def rdoba_sim sub, cmd, *args
48
- echo = nil
49
- case sub
50
- when :log, :debug
51
- case cmd
52
- when :init
53
- opts = match_keywords args[ 1 ]
54
- opts = opts.size > 1 && opts || opts.size > 0 && opts[ 0 ] || nil
55
-
56
- if args[ 2 ] == 'class'
57
- @deep = 1
58
- @inithead = RdobaSimClsHead
59
- else
60
- @deep = 0
61
- @inithead = RdobaSimSimpleHead ; end
62
-
63
- param = case args[ 0 ]
64
- when 'io'
65
- { :io => "File.new( 'tmp.log', 'w+' )", :functions => :basic }
66
- when 'as'
67
- { :as => ":log", :functions => :basic }
68
- when 'in'
69
- @inithead = RdobaSimInHead
70
- { :in => "Cls", :functions => :basic }
71
- when 'prefix'
72
- # basic|extended|enter|leave|compat
73
- { args[ 0 ].to_sym => opts, :functions => :basic }
74
- when 'functions'
75
- { args[ 0 ].to_sym => opts }
76
- else
77
- { :functions => :basic }
78
- end
79
-
80
- param = "{" + ( param ).to_a.map do |v|
81
- "#{v[ 0 ].inspect} => #{v[ 1 ].is_a?( String ) &&
82
- v[ 1 ] || v[ 1 ].inspect}" end.join(',') + "}"
83
- @init = " " * @deep + "rdoba :#{sub} => #{param}\n"
84
- puts @init
85
- @echo = ''
86
-
87
- when :func
88
- call = case args[ 0 ]
89
- when 'keyword'
90
- 'log'
91
- when 'invalid keyword'
92
- 'errlog'
93
- when /^db/
94
- @echo << "self.dbgl = 0xff\n"
95
- args[ 0 ]
96
- else
97
- 'self'
98
- end
99
-
100
- sep = ( args[ 1 ] == :e ) && '.' || ' '
101
- param = []
102
- args[ 2..-1 ].each do |arg|
103
- case arg
104
- when NilClass
105
- when Symbol
106
- param << " #{arg}"
107
- else
108
- param << " #{arg.inspect}" ; end ; end
109
- str = "#{call}#{sep}#{args[ 1 ]}#{param.join(',')}"
110
- echo = format str
111
- @echo << echo
112
- while @deep > 0
113
- @deep -= 1
114
- @echo << ( format "end" ) ; end
115
-
116
- when :create
117
- @echo << ( format "Cls.new" )
118
-
119
- when :call
120
- @echo << ( format "Cls.singleton" )
121
-
122
- when :def
123
- if @inithead == RdobaSimClsHead
124
- @deep = 1
125
- else
126
- @deep = 0 ; end
127
- echo = case args[ 0 ]
128
- when :init
129
- format 'def initialize'
130
- when :single
131
- format 'def self.singleton'
132
- end
133
- @deep += 1
134
- @echo << echo
135
-
136
- when :exec
137
- if !@echo.empty?
138
- store
139
- puts '-' * 15
140
-
141
- File.chmod 0755, 'tmp.rb'
142
- Open3.popen3( "./tmp.rb" ) do |stdin, stdout, stderr, wait_thr|
143
- @out = stdout.read
144
- @err = stderr.read
145
- end
146
- @echo = ''
147
- end
148
- res = case args[ 0 ]
149
- when :file
150
- File.new( 'tmp.log', 'r' ).read
151
- when :stdout
152
- @out
153
- when :stderr
154
- @err;
155
- else return; end
156
- puts res
157
- res
158
- end
38
+ File.open(@tmpfile, 'w+') do |f|
39
+ f.puts file
159
40
  end
160
41
  end
161
42
 
43
+ def match_keywords(keystr)
44
+ keys =
45
+ (keystr || '').split(/[,:\s]/).map do |k|
46
+ %i[basic extended enter leave compat timestamp pid function_name function_line function].include?(k.to_sym) &&
47
+ k.to_sym || nil
48
+ end.compact
49
+ end
50
+
51
+ at_exit { $tmpdir && (FileUtils.remove_entry_secure $tmpdir) }
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+
3
+ module MixinSupport
4
+ def random_string(count)
5
+ Random.new.bytes((count + 1) / 2).split('').map do |b| b.ord.to_s(16)end.join[0...count]
6
+ end
7
+
8
+ def tmpfile
9
+ filename = File.join(Dir.mktmpdir, random_string(20))
10
+ File.open(filename, 'w') do |f|
11
+ f.print(random_string(20))
12
+ end
13
+ filename
14
+ end
15
+ end
16
+
17
+ World(MixinSupport)
data/html/.keep ADDED
File without changes
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Rdoba
2
- VERSION = "0.9.1"
4
+ VERSION = '0.9.4'
3
5
  end
data/lib/rdoba/a.rb CHANGED
@@ -1,42 +1,42 @@
1
1
  #!/usr/bin/ruby -KU
2
- #coding:utf-8
2
+ # frozen_string_literal: true
3
3
 
4
4
  require 'rdoba/debug'
5
5
 
6
6
  class Array
7
- def geta(index, options = {}) #TODO => [] + class Index
8
- dbp11 "[geta] <<< array = #{self.inspect}, index = #{index.inspect}, options = #{options.inspect}"
7
+ # TODO: => [] + class Index
8
+ def geta(index, options = {})
9
+ dbp11 "[geta] <<< array = #{inspect}, index = #{index.inspect}, options = #{options.inspect}"
9
10
  options[:сокр] ||= @сокр
10
11
 
11
- if index.class == Array
12
- return self if index == [] or index == ['']
12
+ if index.instance_of?(Array)
13
+ return self if [[], ['']].include?(index)
14
+
13
15
  index = index.clone
14
16
  value = self[index.shift]
15
- (value.class == Hash or value.class == Array) ? value.geta(index, options) : value
17
+ (value.instance_of?(Hash) or value.instance_of?(Array)) ? value.geta(index, options) : value
16
18
  else
17
19
  geta_value(index, options)
18
20
  end
19
21
  end
20
-
21
22
  end
22
23
 
23
-
24
24
  class Hash
25
-
26
- protected
25
+ protected
27
26
 
28
27
  def geta_value(cid, options = {})
29
- res = ((not cid) || cid.empty?) && self || self[cid] ||
28
+ res =
29
+ (!cid || cid.empty?) && self || self[cid] ||
30
30
  (options[:сокр] && (self[options[:сокр][cid]] || self[options[:сокр].reverse[cid]]))
31
31
 
32
- if not res and options[:try_regexp]
33
- self.keys.each do |key|
32
+ if !res and options[:try_regexp]
33
+ keys.each do |key|
34
34
  break res = self[key] if key.rmatch(cid)
35
- if options[:сокр]
36
- options[:сокр].each_pair do |val1, val2|
37
- break res = self[key] if key.rmatch(cid.gsub(/#{val1}/, val2)) or
38
- key.rmatch(cid.gsub(/#{val2}/, val1))
39
- end
35
+
36
+ next unless options[:сокр]
37
+
38
+ options[:сокр].each_pair do |val1, val2|
39
+ break res = self[key] if key.rmatch(cid.gsub(/#{val1}/, val2)) or key.rmatch(cid.gsub(/#{val2}/, val1))
40
40
  end
41
41
  end
42
42
  end
@@ -44,47 +44,51 @@ protected
44
44
  res
45
45
  end
46
46
 
47
- public
47
+ public
48
48
 
49
- def geta(index, options = {}) #TODO => [] + class Index
50
- dbp11 "[geta] <<< hash = #{self.inspect}, index = #{index.inspect}, options = #{options.inspect}"
49
+ # TODO: => [] + class Index
50
+ def geta(index, options = {})
51
+ dbp11 "[geta] <<< hash = #{inspect}, index = #{index.inspect}, options = #{options.inspect}"
51
52
  options[:сокр] ||= @сокр
52
53
 
53
- if index.class == Array
54
- return self if index == [] or index == ['']
54
+ if index.instance_of?(Array)
55
+ return self if [[], ['']].include?(index)
56
+
55
57
  index = index.clone
56
58
  value = geta_value(index.shift, options)
57
- (value.class == Hash or value.class == Array) ? value.geta(index, options) : value
59
+ (value.instance_of?(Hash) or value.instance_of?(Array)) ? value.geta(index, options) : value
58
60
  else
59
61
  geta_value(index, options)
60
62
  end
61
63
  end
62
64
 
63
- def seta(index, value, options = {}) #TODO => [] + class Index
65
+ # TODO: => [] + class Index
66
+ def seta(index, value, options = {})
64
67
  dbp11 "[seta] <<< index: #{index.inspect}, value: #{value.inspect}, options: #{options.inspect}"
65
68
  options[:сокр] ||= @сокр
66
69
 
67
- return self[index] = value if index.class != Array # TODO spec index
70
+ return self[index] = value if index.class != Array # TODO: spec index
68
71
 
69
72
  back = 0
70
- index = index.reverse.map do |x|
71
- if x.empty?
72
- back += 1
73
- nil
74
- elsif back > 0
75
- back -= 1
76
- nil
77
- else
78
- x
79
- end
80
- end.compact.reverse
73
+ index =
74
+ index.reverse.map do |x|
75
+ if x.empty?
76
+ back += 1
77
+ nil
78
+ elsif back > 0
79
+ back -= 1
80
+ nil
81
+ else
82
+ x
83
+ end
84
+ end.compact.reverse
81
85
  dbp12 "[seta]> result index: #{index.inspect}"
82
86
 
83
87
  obj = nil
84
88
  o = self
85
89
  dbp14 "[seta]>> self: #{o.inspect}"
86
90
  set_idx = index.pop
87
- par_class = set_idx =~ /^\d+$/ ? Array : Hash
91
+ par_class = /^\d+$/.match?(set_idx) ? Array : Hash
88
92
  par_idx = nil
89
93
  index.each do |idx|
90
94
  unless o
@@ -93,7 +97,7 @@ public
93
97
  obj[par_idx] = o
94
98
  end
95
99
  obj = o
96
- o = (obj.class == Hash) ? obj.geta_value(idx, options) : obj[idx]
100
+ o = obj.instance_of?(Hash) ? obj.geta_value(idx, options) : obj[idx]
97
101
  dbp14 "[seta]>> cur idx: #{idx.inspect}, parent obj: #{obj.inspect}, obj: #{o.inspect}"
98
102
  unless o
99
103
  if idx == index.last
@@ -105,10 +109,8 @@ public
105
109
  end
106
110
  end
107
111
 
108
- raise "Invalid path" unless o # TODO special exception
112
+ raise 'Invalid path' unless o # TODO: special exception
109
113
 
110
114
  o[set_idx] = value
111
115
  end
112
-
113
116
  end
114
-