kapusta 0.1.1 → 0.1.2

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 25c55d7f1c7a4b1dcd3cca0e7a513a74591905e9dfc97e96f015b695d75905a2
4
- data.tar.gz: '0940fc49053103149667dd8bf515e159d87a10182bb3fbd5eb152ba63f487e06'
3
+ metadata.gz: 62ac0b0f6d3ce6116b82110191b5c36783ed1689e2567076dbe68fc66e6ab3f7
4
+ data.tar.gz: 6b705edf9d441c4f753e8420b0e8bc6a2327d91f6ab9041a603c3afe6546487b
5
5
  SHA512:
6
- metadata.gz: a3a8cb442fcb6d5157dcf3885e9d6a7323735418e488715e35baea0006b098e8822b8252013eea2636f96a35665db8173556507af293188f632108827f8119d5
7
- data.tar.gz: d0f19cbc23c569524cb64c0b70b14d4ea5ed149291acad18528611a7b12c2ff1b4d9c27ce1a239ec07e9c19bb36c5907f294fbca4b0b783bfc2991c880b93fc7
6
+ metadata.gz: 243b1e47fd6a5684f7b4d2a9bf46e27d6b96883fb3cf71bf4f90edb4d48f0e5afa006c2da0191f5fc3cb116e37b506243b0f7030b90a6c6096629173e98074de
7
+ data.tar.gz: 825b21b71cb0eacb24623beff28dc2fcb1b542cf50268d78ebcfba2b156bf634992975fb1f1a3a0e27f407c51e54c8eb96683d544f861de5f5cc51731fc819c3
data/README.md CHANGED
@@ -10,6 +10,14 @@ For more information about Kapusta, see the official Fennel documentation and tu
10
10
 
11
11
  ## Usage
12
12
 
13
+ ```
14
+ gem install kapusta
15
+ kapfmt --fix examples/fizzbuzz.kap
16
+ kapusta examples/fizzbuzz.kap
17
+ ```
18
+
19
+ or
20
+
13
21
  ```
14
22
  exe/kapusta examples/fizzbuzz.kap
15
23
  ```
@@ -37,7 +45,7 @@ Kapusta keeps most core Fennel forms. The main differences come from Ruby's runt
37
45
  Kapusta-specific additions:
38
46
 
39
47
  - `module` and `class` for Ruby host structure, including file-header forms
40
- - `ivar` / `cvar` / `gvar` escape hatches
48
+ - `ivar` (`@var`) / `cvar` (`@@var`) / `gvar` (`$var`) escape hatches
41
49
  - `try` / `catch` / `finally` plus `raise` for exceptions
42
50
  - `(ruby "...")` raw host escape hatch
43
51
  - a trailing symbol-keyed hash is emitted as Ruby keyword arguments
@@ -63,12 +63,29 @@ module Kapusta
63
63
  end
64
64
  end
65
65
  RUBY
66
- stringify: <<~RUBY.chomp,
66
+ stringify: <<~'RUBY'.chomp,
67
67
  def __kap_stringify(value)
68
+ render = nil
69
+ render = lambda do |item|
70
+ case item
71
+ when nil then 'nil'
72
+ when true then 'true'
73
+ when false then 'false'
74
+ when String, Symbol then item.inspect
75
+ when Array
76
+ "[#{item.map { |child| render.call(child) }.join(', ')}]"
77
+ when Hash
78
+ "{#{item.map { |key, child| "#{render.call(key)}=>#{render.call(child)}" }.join(', ')}}"
79
+ else
80
+ item.inspect
81
+ end
82
+ end
83
+
68
84
  case value
69
85
  when nil then 'nil'
70
86
  when true then 'true'
71
87
  when false then 'false'
88
+ when Array, Hash then render.call(value)
72
89
  else value.to_s
73
90
  end
74
91
  end
@@ -327,257 +344,19 @@ module Kapusta
327
344
  seen[name] = true
328
345
  end
329
346
 
330
- def call(callee, positional, kwargs = nil, block = nil)
331
- raise "not callable: #{callee.inspect}" unless callee.respond_to?(:call)
332
-
333
- if block
334
- kwargs ? callee.call(*positional, **kwargs, &block) : callee.call(*positional, &block)
335
- else
336
- kwargs ? callee.call(*positional, **kwargs) : callee.call(*positional)
337
- end
338
- end
339
-
340
- def send_call(receiver, method_name, positional, kwargs = nil, block = nil)
341
- if block
342
- if kwargs
343
- receiver.public_send(method_name, *positional, **kwargs,
344
- &block)
345
- else
346
- receiver.public_send(method_name, *positional, &block)
347
- end
348
- elsif kwargs
349
- receiver.public_send(method_name, *positional,
350
- **kwargs)
351
- else
352
- receiver.public_send(method_name, *positional)
353
- end
354
- end
355
-
356
- def invoke_self(receiver, method_name, positional, kwargs = nil, block = nil)
357
- if block
358
- if kwargs
359
- receiver.send(method_name, *positional, **kwargs,
360
- &block)
361
- else
362
- receiver.send(method_name, *positional, &block)
363
- end
364
- else
365
- kwargs ? receiver.send(method_name, *positional, **kwargs) : receiver.send(method_name, *positional)
366
- end
367
- end
368
-
369
- def stringify(value)
370
- case value
371
- when nil then 'nil'
372
- when true then 'true'
373
- when false then 'false'
374
- else value.to_s
375
- end
376
- end
377
-
378
- def print_values(*values)
379
- $stdout.puts(values.map { |value| stringify(value) }.join("\t"))
380
- nil
381
- end
382
-
383
- def concat(values)
384
- values.map { |value| stringify(value) }.join
385
- end
386
-
387
- def get_path(obj, keys)
388
- keys.reduce(obj) { |acc, key| acc[key] }
389
- end
390
-
391
- def qget_path(obj, keys)
392
- keys.each do |key|
393
- return nil if obj.nil?
394
-
395
- obj = obj[key]
396
- end
397
- obj
398
- end
399
-
400
- def set_path(obj, keys, value)
401
- target = obj
402
- keys[0...-1].each { |key| target = target[key] }
403
- target[keys.last] = value
404
- end
405
-
406
- def method_path_value(base, segments)
407
- segments.reduce(base) { |obj, segment| obj.public_send(Kapusta.kebab_to_snake(segment).to_sym) }
408
- end
409
-
410
- def set_method_path(base, segments, value)
411
- target = base
412
- segments[0...-1].each do |segment|
413
- target = target.public_send(Kapusta.kebab_to_snake(segment).to_sym)
414
- end
415
- setter = "#{Kapusta.kebab_to_snake(segments.last)}="
416
- target.public_send(setter.to_sym, value)
417
- end
418
-
419
- def current_class_scope(receiver)
420
- receiver.is_a?(Module) ? receiver : receiver.class
421
- end
422
-
423
- def get_ivar(receiver, name)
424
- receiver.instance_variable_get("@#{Kapusta.kebab_to_snake(name)}")
425
- end
426
-
427
- def set_ivar(receiver, name, value)
428
- receiver.instance_variable_set("@#{Kapusta.kebab_to_snake(name)}", value)
429
- end
430
-
431
- def get_cvar(receiver, name)
432
- current_class_scope(receiver).class_variable_get("@@#{Kapusta.kebab_to_snake(name)}")
433
- end
434
-
435
- def set_cvar(receiver, name, value)
436
- current_class_scope(receiver).class_variable_set("@@#{Kapusta.kebab_to_snake(name)}", value)
347
+ HELPER_SOURCES.each_value do |source|
348
+ module_eval(source, __FILE__, __LINE__)
437
349
  end
438
350
 
439
- def get_gvar(name)
440
- Kernel.eval("$#{Kapusta.kebab_to_snake(name)}", binding, __FILE__, __LINE__) # $stderr
441
- end
351
+ helper_methods = []
442
352
 
443
- def set_gvar(name, value)
444
- Kernel.eval("$#{Kapusta.kebab_to_snake(name)} = value", binding, __FILE__, __LINE__) # $stderr = value
353
+ HELPER_SOURCES.each_key do |name|
354
+ helper_method = :"__kap_#{name}"
355
+ define_singleton_method(name, instance_method(helper_method))
356
+ helper_methods << helper_method
445
357
  end
446
358
 
447
- def ensure_module(holder, path)
448
- segments = path.split('.')
449
- last = segments.pop
450
- scope = holder.is_a?(Module) ? holder : Object
451
- segments.each do |segment|
452
- scope =
453
- if scope.const_defined?(segment, false)
454
- scope.const_get(segment, false)
455
- else
456
- mod = Module.new
457
- scope.const_set(segment, mod)
458
- mod
459
- end
460
- end
461
- if scope.const_defined?(last, false)
462
- scope.const_get(last, false)
463
- else
464
- mod = Module.new
465
- scope.const_set(last, mod)
466
- mod
467
- end
468
- end
469
-
470
- def ensure_class(holder, path, super_class)
471
- segments = path.split('.')
472
- last = segments.pop
473
- scope = holder.is_a?(Module) ? holder : Object
474
- segments.each do |segment|
475
- scope =
476
- if scope.const_defined?(segment, false)
477
- scope.const_get(segment, false)
478
- else
479
- mod = Module.new
480
- scope.const_set(segment, mod)
481
- mod
482
- end
483
- end
484
- if scope.const_defined?(last, false)
485
- scope.const_get(last, false)
486
- else
487
- klass = Class.new(super_class)
488
- scope.const_set(last, klass)
489
- klass
490
- end
491
- end
492
-
493
- def destructure(pattern, value)
494
- bindings = {}
495
- destructure_into(pattern, value, bindings)
496
- bindings
497
- end
498
-
499
- def destructure_into(pattern, value, bindings)
500
- case pattern[0]
501
- when :sym
502
- name = pattern[1]
503
- bindings[name] = value unless name == '_'
504
- when :vec
505
- items = pattern[1]
506
- rest_idx = items.index { |item| item.is_a?(Array) && item[0] == :rest }
507
- if rest_idx
508
- before = items[0...rest_idx]
509
- rest_pattern = items[rest_idx][1]
510
- before.each_with_index do |item, i|
511
- destructure_into(item, value ? value[i] : nil, bindings)
512
- end
513
- rest_value = value ? (value[rest_idx..] || []) : []
514
- destructure_into(rest_pattern, rest_value, bindings)
515
- else
516
- items.each_with_index do |item, i|
517
- destructure_into(item, value ? value[i] : nil, bindings)
518
- end
519
- end
520
- when :hash
521
- pattern[1].each do |key, subpattern|
522
- destructure_into(subpattern, value ? value[key] : nil, bindings)
523
- end
524
- when :ignore
525
- nil
526
- else
527
- raise "unknown destructure pattern: #{pattern.inspect}"
528
- end
529
- end
530
-
531
- def match_pattern(pattern, value)
532
- bindings = {}
533
- [match_pattern_into(pattern, value, bindings), bindings]
534
- end
535
-
536
- def match_pattern_into(pattern, value, bindings)
537
- case pattern[0]
538
- when :sym
539
- name = pattern[1]
540
- bindings[name] = value unless name == '_'
541
- true
542
- when :vec
543
- return false unless value.is_a?(Array) || value.respond_to?(:to_ary)
544
-
545
- array = value.is_a?(Array) ? value : value.to_ary
546
- items = pattern[1]
547
- rest_idx = items.index { |item| item.is_a?(Array) && item[0] == :rest }
548
- if rest_idx
549
- before = items[0...rest_idx]
550
- rest_pattern = items[rest_idx][1]
551
- return false if array.length < before.length
552
-
553
- before.each_with_index do |item, i|
554
- return false unless match_pattern_into(item, array[i], bindings)
555
- end
556
- match_pattern_into(rest_pattern, array[rest_idx..], bindings)
557
- else
558
- return false unless array.length == items.length
559
-
560
- items.each_with_index do |item, i|
561
- return false unless match_pattern_into(item, array[i], bindings)
562
- end
563
- true
564
- end
565
- when :hash
566
- return false unless value.is_a?(Hash)
567
-
568
- pattern[1].each do |key, subpattern|
569
- return false unless value.key?(key)
570
- return false unless match_pattern_into(subpattern, value[key], bindings)
571
- end
572
- true
573
- when :lit
574
- value == pattern[1]
575
- when :nil
576
- value.nil?
577
- else
578
- raise "bad pattern: #{pattern.inspect}"
579
- end
580
- end
359
+ send(:private, *helper_methods)
581
360
  end
582
361
  end
583
362
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Kapusta
4
- VERSION = '0.1.1'
4
+ VERSION = '0.1.2'
5
5
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: kapusta
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.1
4
+ version: 0.1.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Evgenii Morozov