rubyment 0.6.25563758 → 0.6.25581116

Sign up to get free protection for your applications and to get access to all the features.
Files changed (3) hide show
  1. checksums.yaml +4 -4
  2. data/lib/rubyment.rb +814 -86
  3. metadata +1 -1
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 8c0b41f34259313675d084aba8a00e75010aea2a
4
- data.tar.gz: 340d7190aa3a71335714befea5e750069a5829b4
3
+ metadata.gz: f0a1dc731e8fd7860ae00dcf476648dd311322f2
4
+ data.tar.gz: 75ec3ac1a176cbef2d3717f4c0aa8ec45ef05c20
5
5
  SHA512:
6
- metadata.gz: 28001b932b9653604fd210e35c1111b8b241e0df2731015540a116569531c0a4d6cfcb1056dda3fc49954b3b4be066e5e1ba1d930c828c5bdfc5163455b846b2
7
- data.tar.gz: 8cc349d22b51b29080a1a451ea77650b2c99cc3fb48be97ef2e4a52b1eb14d2fc13cade07a6ff5405df15fdaac6f24db41a0f9f2db5e685e540b3caf784dc61c
6
+ metadata.gz: 798fc0253107f5b698b529776dfbd12133506b25afe02be2cd1a66ee2aad01fadf495002868f1374569d6fa281cd5c8740c0a175bd07a0c31848a28d036ccee9
7
+ data.tar.gz: 82bc3dccb487171a155c3af0cd0d78a379815f69338d3618ff2ce84c7e5873e5d871a250c91e5d181033327a380956b70d0b1c40ea7e7a23941ea65dadba3660
data/lib/rubyment.rb CHANGED
@@ -112,11 +112,11 @@ module RubymentExperimentModule
112
112
  =begin
113
113
 
114
114
  # documentation_begin
115
- # short_desc = "tests the function #call_or_itself"
115
+ # short_desc => "calls the method #call of an object, or return the object itself",
116
116
  @memory[:documentation].push = {
117
117
  :function => :call_or_itself,
118
118
  :short_desc => short_desc,
119
- :description => "calls the method #call of an object, or return the object itself",
119
+ :description => "",
120
120
  :params => [
121
121
  {
122
122
  :name => :args,
@@ -333,7 +333,6 @@ module RubymentExperimentModule
333
333
  debug = debug.nne
334
334
  debug && (stderr.puts "{#{__method__} starting")
335
335
  debug && (stderr.puts "caller=#{caller_label.inspect}")
336
- debug && (stderr.puts backtrace)
337
336
  debug && (stderr.puts "args=#{args.inspect}")
338
337
  test_cases = test_cases.nne [
339
338
  # [ :id, :expectation, :actual_params ],
@@ -351,6 +350,7 @@ module RubymentExperimentModule
351
350
  result = send actual_params_method_name, *actual_params_method_args
352
351
  expectation[test_case_id] = test_expectation
353
352
  actual[test_case_id] = result
353
+ debug && (stderr.puts "[test_expectation.hash, result.hash]=#{[test_expectation.hash, result.hash].inspect}")
354
354
  }
355
355
  judgement = actual.keys.map {|test_case|
356
356
  [expectation[test_case], actual[test_case] , test_case]
@@ -364,48 +364,372 @@ module RubymentExperimentModule
364
364
 
365
365
 
366
366
  =begin
367
+ write the second argument of the array args into the filepath in the first argument
367
368
  =end
368
- def experiment__send_array_base args=[]
369
- sender,
370
- object_to_send,
371
- destination,
369
+ def file__json args=[]
370
+ require 'json'
371
+ file_path,
372
+ enum,
373
+ reserved = args
374
+ File.write file_path, JSON.pretty_generate({ :root.to_s => enum })
375
+ end
376
+
377
+
378
+ =begin
379
+ inverse of #file__json
380
+ =end
381
+ def load__file_json args=[]
382
+ require 'json'
383
+ file_path,
384
+ reserved = args
385
+ file_contents = File.read file_path
386
+ puts "file_contents size=#{file_contents.size}"
387
+ loaded = JSON.parse file_contents
388
+ puts "loaded size=#{loaded.size}"
389
+ puts "loaded=#{loaded.inspect}"
390
+ loaded[:root.to_s]
391
+ end
392
+
393
+
394
+ =begin
395
+ c = :c
396
+ experiment__input_select [[:a, :b, :c], c ]
397
+ =end
398
+ def experiment__input_select args=[]
399
+ alternatives,
400
+ default,
401
+ reserved = args
402
+ stderr = @memory[:stderr]
403
+ caption = alternatives.each_with_index.map {|a, i| "#{i} - #{a.inspect}"}.join("\n")
404
+ stderr.puts "[alternatives: #{caption}][default: #{default.inspect}]"
405
+ alternative = input_single_line
406
+ selection = alternative.nne && alternatives[alternative.to_i] || default
407
+ end
408
+
409
+
410
+ # these shell_ functions can take only flatten arrays (intended for ARGV):
411
+ def shell_string_split args=[]
412
+ string,
413
+ splitter,
414
+ reserved = args
415
+ string.split Regexp.new splitter
416
+ end
417
+
418
+
419
+ def shell_array_first a
420
+ a.first
421
+ end
422
+
423
+
424
+ def shell_array_deepen a
425
+ [ a ]
426
+ end
427
+
428
+
429
+ def get_self args=[]
430
+ self
431
+ end
432
+
433
+
434
+ =begin
435
+ enum = (s.scan /http_[^(]*/).uniq.map
436
+ # => #<Enumerator: ...>
437
+ # send_enumerator [ enum, :gsub, ["http_", ""] ]
438
+ # => ["delete", "get", "head", "post", "put"]
439
+
440
+
441
+ =end
442
+ def send_enumerator args=[]
443
+ enum,
444
+ method,
445
+ args_to_method,
446
+ block_to_method,
447
+ replace_at_index,
448
+ reserved = args
449
+
450
+ args_to_method = args_to_method.nne []
451
+
452
+ calling_tuples = enum.map {|e|
453
+ method_name = (!method.respond_to? :call) && method || nil
454
+ method_to_call = (!method_name) && method || (
455
+ (!replace_at_index) && e.method(:send)
456
+ ) || method(:send)
457
+ c_t = args_to_method.dup
458
+ replace_at_index && (c_t[replace_at_index] = e)
459
+ method_name && (c_t.unshift method_name)
460
+ c_t.unshift method_to_call
461
+ c_t
462
+ }
463
+
464
+ calling_tuples.map {|c_t|
465
+ method_to_call, *args_to_call = c_t
466
+ method_to_call.call *args_to_call, &block_to_method
467
+ }
468
+ end
469
+
470
+
471
+ =begin
472
+ given a duck type table, return the entries having
473
+ methods that o responds to in their first entry.
474
+
475
+ by default, uses a table useful to determine
476
+ method_name for the call:
477
+ o.map.method_name {|a, b| }
478
+ if o is an Array, it should be each_with_entries:
479
+ experiment__duck_type__hash_array [ [] ]
480
+ => [[:product, :each_with_key, :itself]]
481
+
482
+ if o is a Hash, it should be (another) map.
483
+ experiment__duck_type__hash_array [ {} ]
484
+ => [[:keys, :map, :reversed]]
485
+
486
+ note that "reversed" means that the order must
487
+ be |b,a| instead
488
+
489
+ =end
490
+ def experiment__duck_type__hash_array args=[]
491
+ o,
492
+ duck_type_table,
493
+ reserved = args
494
+ duck_type_table = duck_type_table.nne [
495
+ [ :product, :each_with_index, :itself, :to_a ],
496
+ [ :keys, :map, :reverse, :to_h ],
497
+ ]
498
+ rv = duck_type_table.select { |e|
499
+ responding_method, *r = e
500
+ o.respond_to? responding_method
501
+ }
502
+ rv
503
+ end
504
+
505
+
506
+ =begin
507
+ for each leaf of a (which normally is an Array or Hash),
508
+ calls block_to_send_to_leaf giving the leaf as arg,
509
+ (or return the leaf in the case block_to_send_to_leaf is nil).
510
+ modifies tuples and deep_keys so it contains the results, the
511
+ deep_keys and the tuples at each step.
512
+
513
+ direct_cycle_placeholder => object to place when a directed cycled
514
+ (ie, the object is already present in its stack) is found. defaults
515
+ to :direct_cycle_placeholder. undirect cycle: same thing, but searches
516
+ in the visited_nodes.
517
+
518
+ Don't use nil, 0, "" as cycleplace holders, use a value v which
519
+ returns itself if called v.nne; it means that the default
520
+ should be used
521
+
522
+ BFS: only problem: this uniq should work on object ID
523
+ x[1][:tuples].transpose[2].transpose.flatten.uniq
524
+ => [{:a=>{:b=>:c}, :d=>{:e=>nil}}, {:b=>:c}, {:e=>nil}]
525
+
526
+
527
+ =end
528
+ def experiment__recursive_array__visitor args=[]
529
+ graph_object,
530
+ block_to_send_to_leaf,
531
+ deep_keys,
532
+ duck_type_detector,
372
533
  debug,
373
- shallow,
374
- args_to_bled,
375
- send_to_self,
534
+ duck_type_table,
535
+ tuples,
536
+ stack,
537
+ visited_nodes,
538
+ direct_cycle_placeholder,
539
+ undirect_cycle_placeholder,
540
+ undirected_graph,
376
541
  reserved = args
542
+ recursion_args = args.dup
377
543
 
378
544
  stderr = @memory[:stderr]
379
545
  debug = debug.nne
380
- debug = 1
381
546
  debug && (stderr.puts "{#{__method__} starting")
382
- debug && (stderr.puts "args=#{args.inspect}")
383
- debug && (stderr.puts "debug=#{args[3].inspect}")
547
+ debug && (stderr.puts "caller=#{caller_label}")
548
+ debug && (stderr.puts "args.each_with_index=#{args.each_with_index.entries.inspect}")
549
+ undirect_cycle_placeholder = undirect_cycle_placeholder.nne ":undirect_cycle_placeholder"
550
+ direct_cycle_placeholder = direct_cycle_placeholder.nne ":direct_cycle_placeholder"
551
+ # structures one per node: nne
552
+ deep_keys = deep_keys.nne []
553
+ stack = stack.nne []
554
+ # structures shared by all nodes: just ensure exists
555
+ tuples ||= []
556
+ visited_nodes ||= []
557
+
558
+ # old_debug = debug
559
+ # debug = (graph_object.keys.index :b) rescue old_debug
560
+ debug && (stderr.puts "=#{}")
561
+ debug && (stderr.puts "graph_object.object_id=#{graph_object.object_id}")
562
+ object_id_method_name = :object_id_method_name
563
+
564
+
565
+ # cycles detection section
566
+ undirected_cycle = undirected_graph && (
567
+ visited_nodes.map(&:object_id).index graph_object.object_id
568
+ )
569
+ debug && undirected_graph && (stderr.puts "visited_nodes_with_oid=#{visited_nodes.map{|y| [y, y.object_id] }}")
570
+ debug && (stderr.puts "undirected_cycle=#{undirected_cycle.inspect}")
384
571
 
385
- method_to_send,
386
- *args_to_send = sender
387
- debug && (stderr.puts "general case{: #{object_to_send.inspect}.#{method_to_send.inspect}(#{args_to_send.inspect}) }")
572
+ directed_cycle = stack.map(&:object_id).index graph_object.object_id
573
+ debug && (stderr.puts "stack_with_oid=#{stack.map{|y| [y, y.object_id] }}")
574
+ debug && (stderr.puts "directed_cycle=#{directed_cycle.inspect}")
388
575
 
389
- send_block = bled(args_to_bled) {
390
- object_to_send.send method_to_send, *args_to_send
391
- }.first
576
+ cycle_placeholder = (
577
+ directed_cycle && direct_cycle_placeholder ||
578
+ undirected_cycle && undirect_cycle_placeholder
579
+ )
580
+ cycle_placeholder && (a = cycle_placeholder)
581
+ cycle_placeholder.negate_me && (a = graph_object)
392
582
 
393
- default_block = bled(args_to_bled) {
394
- args_to_send
395
- }.first
583
+ # debug = old_debug
584
+ visited_nodes.push a
585
+ stack.push a
396
586
 
397
- rv = experiment__whether [
398
- method_to_send,
399
- send_block,
400
- default_block,
401
- ]
587
+ # detecting the type of object. depending if Hash or Array,
588
+ # methods to call are different.
589
+ duck_type_detector = duck_type_detector.nne :map
590
+ duck_type_def = experiment__duck_type__hash_array(
591
+ [
592
+ a,
593
+ duck_type_table
594
+ ])
595
+ iterating_method = duck_type_def.transpose[1].to_a.first
596
+ final_method = duck_type_def.transpose[2].to_a.first
597
+ revert_method = duck_type_def.transpose[3].to_a.first
598
+ leaf = nil
599
+ result = (a.respond_to? duck_type_detector) && a.send(iterating_method).map {|a, b|
600
+ e, i = *([a, b].send(final_method))
601
+ debug && (stderr.puts "e, i=#{[e, i]}")
602
+ recursion_args[0] = e
603
+ deep_keys.push i
604
+ recursion_args[2] = deep_keys.dup
605
+ recursion_args[6] = tuples
606
+ recursion_args[7] = stack.dup
607
+ recursion_args[8] = visited_nodes
608
+ recursion_args[9] = directed_cycle
609
+ recursion_args[10] = undirected_cycle
610
+ debug && (stderr.puts "recursion_args.each_with_index=#{recursion_args.each_with_index.entries.inspect}")
611
+ child_result = send __method__, recursion_args
612
+ deep_keys.pop
613
+ [i, child_result]
614
+ } || (
615
+ block_to_send_to_leaf && (leaf = block_to_send_to_leaf. call a)
616
+ !block_to_send_to_leaf && (leaf = a)
617
+ tuples.push [
618
+ deep_keys,
619
+ leaf,
620
+ stack,
621
+ [:cycle_to_stack_index, directed_cycle],
622
+ [:cycle_to_visited_nodes_index, undirected_cycle],
623
+ ]
624
+ leaf
625
+ )
402
626
 
627
+ # rebuilding the graph object after visits
628
+ rebuilt_object = (nil.send revert_method) rescue result
629
+ (result.respond_to? duck_type_detector) && (
630
+ result.map {|i, e|
631
+ rebuilt_object[i] = e[:result]
632
+ # rebuilt_object[i] = (e[:result] rescue e)
633
+ }
634
+ )
635
+ rv = {
636
+ :visited_nodes => visited_nodes,
637
+ :tuples => tuples,
638
+ :result => rebuilt_object,
639
+ }
640
+ # stack.pop
403
641
  debug && (stderr.puts "will return #{rv.inspect}")
404
642
  debug && (stderr.puts "#{__method__} returning}")
405
643
  rv
406
644
  end
407
645
 
408
646
 
647
+ def test__experiment__recursive_array__visitor args=[]
648
+ method_to_test = :experiment__recursive_array__visitor
649
+ direct_cycle_h = {
650
+ :a => {
651
+ :b => [ :c ],
652
+ },
653
+ :d => {
654
+ :e => nil,
655
+ },
656
+ }
657
+ direct_cycle_h[:a][:f] = direct_cycle_h[:a]
658
+ undirect_cycle_h = {
659
+ :a => {
660
+ :b => [ :c ],
661
+ },
662
+ :d => {
663
+ :e => nil,
664
+ },
665
+ }
666
+ undirect_cycle_h[:d][:g] = undirect_cycle_h[:a]
667
+ [
668
+ (send method_to_test, [
669
+ [ 1, [ 2, 3, [ 4 ] ] ],
670
+ lambda {|x| "a{#{x}}a" },
671
+ :deep_keys.to_nil,
672
+ :duck_type_d.to_nil,
673
+ :debug_please.negate_me,
674
+ ]),
675
+
676
+ (send method_to_test, [
677
+ {
678
+ :a => {
679
+ :b => :c,
680
+ },
681
+ :d => {
682
+ :e => nil,
683
+ },
684
+ },
685
+ lambda {|x| "h{#{x}}h" },
686
+ :deep_keys.to_nil,
687
+ :duck_type_d.to_nil,
688
+ :debug_please.negate_me,
689
+ ]),
690
+
691
+ (send method_to_test, [
692
+ direct_cycle_h,
693
+ lambda {|x| "dch{#{x}}dch" },
694
+ :deep_keys.to_nil,
695
+ :duck_type_d.to_nil,
696
+ :debug_please.negate_me,
697
+ ]),
698
+
699
+ (send method_to_test, [
700
+ undirect_cycle_h,
701
+ lambda {|x| "uch{#{x}}uch" },
702
+ :deep_keys.to_nil,
703
+ :duck_type_d.to_nil,
704
+ :debug_please.negate_me,
705
+ :duck_type_table.to_nil,
706
+ :tuples.to_nil,
707
+ :stack.to_nil,
708
+ :visited_nodes.to_nil,
709
+ :direct_cycle_placeholder.to_nil,
710
+ :undirect_cycle_placeholder.to_nil,
711
+ :undirect_graph,
712
+ ]),
713
+
714
+ (send method_to_test, [
715
+ undirect_cycle_h,
716
+ lambda {|x| "not_uch{#{x}}not_uch" },
717
+ :deep_keys.to_nil,
718
+ :duck_type_d.to_nil,
719
+ :debug_please.negate_me,
720
+ :duck_type_table.to_nil,
721
+ :tuples.to_nil,
722
+ :stack.to_nil,
723
+ :visited_nodes.to_nil,
724
+ :direct_cycle_placeholder.to_nil,
725
+ :undirect_cycle_placeholder.to_nil,
726
+ :undirect_graph.negate_me,
727
+ ]),
728
+
729
+ ]
730
+ end
731
+
732
+
409
733
  end
410
734
 
411
735
 
@@ -418,9 +742,139 @@ end
418
742
  module RubymentMaintainedModule
419
743
 
420
744
 
745
+ =begin
746
+ # documentation_begin
747
+ # short_desc = "extracts information about a block and return them structurally in an array."
748
+ @memory[:documentation].push = {
749
+ :function => :block_info_base,
750
+ :short_desc => short_desc,
751
+ :description => "",
752
+ :params => [
753
+ {
754
+ :name => :args,
755
+ :description => "list of parameters",
756
+ :duck_type => Array,
757
+ :default_behavior => [],
758
+ :params => [
759
+ {
760
+ :name => :block,
761
+ :duck_type => Exception,
762
+ :default_behavior => nil,
763
+ :description => "block to extract info from",
764
+ },
765
+ {
766
+ :name => :max_str_index,
767
+ :duck_type => FixNum,
768
+ :default_behavior => -1,
769
+ :description => "limit the full string output to this last index",
770
+ },
771
+ {
772
+ :name => :reserved,
773
+ :duck_type => Object,
774
+ :default_behavior => nil,
775
+ :description => "reserved for future use",
776
+ },
777
+ ],
778
+ },
779
+ ],
780
+ :return_value => [
781
+ {
782
+ :name => :short,
783
+ :duck_type => String,
784
+ :default_behavior => "",
785
+ :description => "a brief about the block; normally a block inspection",
786
+ },
787
+ {
788
+ :name => :full,
789
+ :duck_type => String,
790
+ :default_behavior => "",
791
+ :description => "all the information about the block",
792
+ },
793
+ {
794
+ :name => :inspection,
795
+ :duck_type => String,
796
+ :default_behavior => "",
797
+ :description => "the block inspection",
798
+ },
799
+ {
800
+ :name => :source_location,
801
+ :duck_type => Object,
802
+ :duck_type => [:_a, Array, :strings],
803
+ :description => the block location",
804
+ },
805
+ {
806
+ :name => :source,
807
+ :duck_type => String,
808
+ :default_behavior => "",
809
+ :description => "the block source code",
810
+ },
811
+ {
812
+ :name => :class_,
813
+ :duck_type => String,
814
+ :default_behavior => "",
815
+ :description => "the block class",
816
+ },
817
+ {
818
+ :name => :comment,
819
+ :duck_type => String,
820
+ :default_behavior => "",
821
+ :description => "the block comment",
822
+ },
823
+ {
824
+ :name => :reserved,
825
+ :duck_type => Object,
826
+ :default_behavior => nil,
827
+ :description => "reserved for future use",
828
+ },
829
+ ],
830
+ }
831
+ # documentation_end
832
+ =end
833
+ def block_info_base args=[]
834
+ block,
835
+ max_str_index,
836
+ reserved = args
837
+ inspection = block.inspect
838
+ class_ = block.class
839
+ comment = block.comment rescue [nil, "doesn't respond to :comment"]
840
+ source = block.source rescue [nil, "doesn't respond to :source"]
841
+ source_location = block.source_location rescue [nil, "doesn't respond to :source_location"]
842
+ parameters = block.parameters.inspect rescue [nil, "doesn't respond to :parameters"]
843
+ short = inspection
844
+ full = (
845
+ [
846
+ "inspection{",
847
+ inspection,
848
+ "}",
849
+ "class{",
850
+ class_,
851
+ "}",
852
+ "source_location{",
853
+ source_location,
854
+ "}",
855
+ "source{",
856
+ source,
857
+ "}",
858
+ "comment{",
859
+ comment,
860
+ "}",
861
+ "parameters{",
862
+ parameters,
863
+ "}",
864
+ ]
865
+ ).join "\n"
866
+
867
+ full = string_truncate [
868
+ full,
869
+ max_str_index,
870
+ ]
871
+ [short, full, inspection, source_location, source, class_, comment]
872
+ end
873
+
874
+
421
875
  =begin
422
876
  # documentation_begin
423
- # short_desc = "tests the function #exception_info_base"
877
+ # short_desc = "extracts information about an exception and return them structurally in an array."
424
878
  @memory[:documentation].push = {
425
879
  :function => :exception_info_base,
426
880
  :short_desc => short_desc,
@@ -539,7 +993,7 @@ module RubymentMaintainedModule
539
993
 
540
994
  =begin
541
995
  # documentation_begin
542
- # short_desc = "tests the function #bled"
996
+ # short_desc = "generates a block which may return exceptions instead of raising them."
543
997
  @memory[:documentation].push = {
544
998
  :function => :bled,
545
999
  :short_desc => short_desc,
@@ -567,7 +1021,7 @@ module RubymentMaintainedModule
567
1021
  :name => :output_backtrace,
568
1022
  :duck_type => Object,
569
1023
  :default_behavior => :nil,
570
- :description => "output when an exception happens",
1024
+ :description => "debug the block execution (misleading name)",
571
1025
  },
572
1026
  {
573
1027
  :name => :backtrace_max_str_len,
@@ -631,7 +1085,7 @@ module RubymentMaintainedModule
631
1085
  stderr = @memory[:stderr]
632
1086
  default_on_exception,
633
1087
  dont_rescue,
634
- output_backtrace,
1088
+ output_backtrace, # better call "debug_block"
635
1089
  backtrace_max_str_len,
636
1090
  debug,
637
1091
  reserved = args
@@ -642,16 +1096,25 @@ module RubymentMaintainedModule
642
1096
  rv = Proc.new { |*block_args|
643
1097
  (debug || output_backtrace) && (stderr.puts "{#{__method__} block starting")
644
1098
  (debug || output_backtrace) && (stderr.puts "block_args=#{block_args.inspect}")
1099
+ (debug || output_backtrace) && (stderr.puts "block_args.size=#{block_args.size}")
645
1100
  brv = begin
646
- [ (block.call *block_args), nil, nil]
1101
+ local_rv = [ (block.call *block_args), nil, nil]
1102
+ (debug || output_backtrace) && (stderr.puts "#{__method__} block: survived exception and returned #{local_rv.inspect}")
1103
+ local_rv
647
1104
  rescue => e
648
1105
  e_info = exception_info_base [
649
1106
  e,
650
1107
  backtrace_max_str_len
651
1108
  ]
1109
+ b_info = block_info_base [
1110
+ block,
1111
+ backtrace_max_str_len
1112
+ ]
652
1113
  (debug || output_backtrace) && (stderr.puts "#{__method__} block: #{block.inspect}\nfull exception info:\n#{e_info[1]}")
653
- (debug || output_backtrace) && (stderr.puts "#{__method__} block: dont_rescue=#{dont_rescue}; true means will rethrow")
1114
+ (debug || output_backtrace) && (stderr.puts "#{__method__} block: info #{b_info[1]} ")
1115
+ (debug || output_backtrace) && (dont_rescue) && (stderr.puts "#{__method__} block: dont_rescue=#{dont_rescue.inspect}; will rethrow")
654
1116
  dont_rescue && (raise e)
1117
+ (debug || output_backtrace) && (stderr.puts "#{__method__} block: dont_rescue=#{dont_rescue.inspect}; not rethrowing rethrow")
655
1118
  [ default_on_exception, e_info, e ]
656
1119
  end
657
1120
  (debug || output_backtrace) && (stderr.puts "block #{block.inspect} will return #{brv.inspect}")
@@ -667,7 +1130,7 @@ module RubymentMaintainedModule
667
1130
 
668
1131
  =begin
669
1132
  # documentation_begin
670
- # short_desc = "tests the function #string_truncate"
1133
+ # short_desc = "truncates a string"
671
1134
  @memory[:documentation].push = {
672
1135
  :function => :string_truncate,
673
1136
  :short_desc => short_desc,
@@ -1236,7 +1699,7 @@ module RubymentTestModule
1236
1699
  # test_case:
1237
1700
  [
1238
1701
  # id:
1239
- [ "test #{method_to_test} base :array_first_remainder" ],
1702
+ "test #{method_to_test} base :array_first_remainder",
1240
1703
  # expectation:
1241
1704
  [ [ :arg_to_send_1, [:arg_to_send_2, :arg_to_send_3]], nil, nil],
1242
1705
  # method_name + args:
@@ -1245,15 +1708,154 @@ module RubymentTestModule
1245
1708
  method_to_test,
1246
1709
  # args to method_to_test:
1247
1710
  [
1248
- :array_first_remainder,
1249
- [ :arg_to_send_1, :arg_to_send_2, :arg_to_send_3 ],
1711
+ # array_first_remainder is a method of...
1712
+ self,
1713
+ # method to call
1714
+ :array_first_remainder,
1715
+ # args to array_first_remainder
1716
+ [ :arg_to_send_1, :arg_to_send_2, :arg_to_send_3 ],
1717
+ # block to array_first_remainder
1718
+ nil,
1719
+ # args_to_bled:
1720
+ [nil, :dont_rescue.negate_me, :debug_block.negate_me],
1721
+ # nil method takes Array (and not splat)
1722
+ :is_array_method,
1723
+ # destination:
1724
+ nil,
1725
+ # debug:
1726
+ 0,
1727
+ ],
1728
+ ],
1729
+ ],
1730
+ # test_case:
1731
+ [
1732
+ # id:
1733
+ "test #{method_to_test} base nil method ",
1734
+ # expectation:
1735
+ [[ :arg_to_send_1, :arg_to_send_2, :arg_to_send_3 ], nil, nil],
1736
+ # method_name + args:
1737
+ [
1738
+ # method_name:
1739
+ method_to_test,
1740
+ # args to method_to_test:
1741
+ [
1742
+ # object responding to method to call:
1743
+ self,
1744
+ # method to call: nil method (no method):
1745
+ :method_to_call.to_nil,
1746
+ # args to nil method:
1747
+ [ :arg_to_send_1, :arg_to_send_2, :arg_to_send_3 ],
1748
+ # block to nil method:
1749
+ nil,
1750
+ # args_to_bled:
1751
+ [nil, :no_rescue.negate_me, :debug_block.to_nil],
1752
+ # nil method takes splat (and not Array)
1753
+ :is_array_method.to_nil,
1754
+ # destination:
1755
+ nil,
1756
+ # debug:
1757
+ 0,
1758
+ ],
1759
+ ],
1760
+ ],
1761
+ # test_case:
1762
+ [
1763
+ # id:
1764
+ "test #{method_to_test} nil.inspect ",
1765
+ # expectation:
1766
+ ["nil", nil, nil],
1767
+ # method_name + args:
1768
+ [
1769
+ # method_name:
1770
+ method_to_test,
1771
+ # args to method_to_test:
1772
+ [
1773
+ # object responding to method to call:
1774
+ nil,
1775
+ # method to call on nil
1776
+ :inspect,
1777
+ # args to inspect:
1778
+ nil,
1779
+ # block to inspect:
1780
+ nil,
1781
+ # args_to_bled:
1782
+ [nil, :no_rescue.negate_me, :debug_block.to_nil ],
1783
+ # inspect takes splat (and not Array)
1784
+ :is_array_method.to_nil,
1785
+ # destination:
1786
+ nil,
1787
+ # debug:
1788
+ 0,
1250
1789
  ],
1251
- # array_first_remainder is a function of...
1252
- self,
1253
- # debug:
1254
- 0,
1255
1790
  ],
1256
1791
  ],
1792
+ # test_case:
1793
+ [
1794
+ # id:
1795
+ "test #{method_to_test} array.map(&:to_s) ",
1796
+ # expectation:
1797
+ [["1", "2", "3"], nil, nil],
1798
+ # method_name + args:
1799
+ [
1800
+ # method_name:
1801
+ method_to_test,
1802
+ # args to method_to_test:
1803
+ [
1804
+ # object responding to method to call:
1805
+ [1, 2, 3],
1806
+ # method to call on [1, 2, 3]:
1807
+ :map,
1808
+ # args to :map
1809
+ [],
1810
+ # block to map:
1811
+ lambda {|x| x.to_s },
1812
+ # args_to_bled:
1813
+ [nil, :no_rescue.negate_me, :debug_block.to_nil ],
1814
+ # map takes splat (and not Array)
1815
+ :is_array_method.to_nil,
1816
+ # destination:
1817
+ nil,
1818
+ # debug:
1819
+ 0,
1820
+ ],
1821
+ ],
1822
+ ],
1823
+ # test_case:
1824
+ [
1825
+ # id:
1826
+ "test #{method_to_test} array_unflatten_base",
1827
+ # expectation:
1828
+ [[ :a, [ :b ], :c], nil, nil],
1829
+ # method_name + args:
1830
+ [
1831
+ # method_name:
1832
+ method_to_test,
1833
+ # args to method_to_test:
1834
+ [
1835
+ # object responding to method call:
1836
+ self,
1837
+ # method to call on self
1838
+ :array_unflatten_base, [
1839
+ [:a, "[", :b, "]", :c],
1840
+ :shallow,
1841
+ :debug.negate_me,
1842
+ :reserved_tokens.to_nil,
1843
+ :inverse.negate_me,
1844
+ ],
1845
+ # block to array_unflatten_base
1846
+ nil,
1847
+ # args_to_bled:
1848
+ [nil, :dont_rescue.negate_me, :debug_block.to_nil],
1849
+ # array_unflatten_base takes array (and not splat)
1850
+ :is_array_method,
1851
+ # destination:
1852
+ nil,
1853
+ # debug:
1854
+ 0,
1855
+ ],
1856
+ ],
1857
+ ],
1858
+ # test_case end
1257
1859
 
1258
1860
  ]
1259
1861
  end
@@ -1283,26 +1885,23 @@ module RubymentTestModule
1283
1885
  =end
1284
1886
  stderr = @memory[:stderr]
1285
1887
  debug = debug.nne
1286
- debug = 1
1287
1888
  debug && (stderr.puts "{#{__method__} starting")
1288
1889
  debug && (stderr.puts "caller=#{caller_label}")
1289
- debug && (stderr.puts backtrace)
1290
1890
  debug && (stderr.puts "args=#{args.inspect}")
1291
1891
  test_cases = (test_cases__experiment__send_array_base args)
1292
1892
  debug && (stderr.puts "test_cases.size=#{test_cases.size}")
1293
1893
  experiment__tester_block = bled [
1294
1894
  nil,
1295
1895
  :no_rescue.negate_me,
1296
- :output,
1896
+ :output.negate_me,
1297
1897
  ] {
1298
1898
  experiment__tester [
1299
- (test_cases), 1
1899
+ (test_cases), 0
1300
1900
  ]
1301
1901
  }
1302
1902
  debug && (stderr.puts "experiment__tester_block=#{experiment__tester_block.inspect}")
1303
1903
  rv = experiment__tester_block.first.call
1304
1904
  debug && (stderr.puts "will return #{rv.inspect}")
1305
- # if raises exception before it will be unbalanced :
1306
1905
  debug && (stderr.puts "#{__method__} returning}")
1307
1906
  rv
1308
1907
  end
@@ -1526,7 +2125,7 @@ module RubymentModule
1526
2125
  # +headers+:: [Hash] +"Authorization"+ key will be added to it if +auth_user+ is given. Defaults to +{}+
1527
2126
  # +method+:: [HTTP method] one of +:get+, +:method+, +:post+ or +:delete+. defaults to +:get+
1528
2127
  # +timeout+:: [Fixnum, nil] defaults to +nil+
1529
- # +debug+:: [Object] if calling the object +nne+ method returns a +false+ value, won't print debug information
2128
+ # +request_method+:: [Method name] if given, won't call open-uri's or 'rest-client' , and will use this method instead. It has to have the same signature as #rest_request_or_open_uri_open. By default is +false+ to respect open-closed principle, but it is advised to be set to http_request_response__curl (which depends on 'curb') -- since, for some kind of responses, as redirects, a full featured http client is needed.
1530
2129
  #
1531
2130
  # @return [String, Object] read data (or +return_on_rescue+)
1532
2131
  def file_read args=ARGV
@@ -1543,17 +2142,19 @@ module RubymentModule
1543
2142
  method,
1544
2143
  timeout,
1545
2144
  debug,
2145
+ request_method,
1546
2146
  reserved = args
1547
2147
  debug = debug.nne 1
1548
2148
  debug && (stderr.puts "{#{__method__} starting")
1549
2149
  debug && (stderr.puts "args=#{args.inspect}")
2150
+ request_method = request_method.nne :rest_request_or_open_uri_open
1550
2151
  uri = uri.nne ""
1551
2152
  file_is_directory = File.directory?(uri)
1552
2153
  must_return_on_rescue = false
1553
2154
  return_on_directory_given ||= true
1554
2155
  contents = !(file_is_directory) && (
1555
2156
  begin
1556
- url_response = (send :rest_request_or_open_uri_open, [
2157
+ url_response = (send request_method, [
1557
2158
  uri,
1558
2159
  payload,
1559
2160
  verify_ssl,
@@ -1563,15 +2164,19 @@ module RubymentModule
1563
2164
  password,
1564
2165
  timeout,
1565
2166
  skip_open_uri,
2167
+ :debug_request_method.to_nil,
2168
+ :no_rescue_i_catch_exceptions,
1566
2169
  ]).first
1567
2170
  debug && (stderr.puts "url_response=#{url_response.inspect}")
1568
2171
  url_response
1569
2172
  rescue => e1
1570
2173
  begin
1571
- debug && (stderr.puts "exception e1=#{e1.inspect}")
2174
+ e_info = exception_info_base [e1]
2175
+ debug && (stderr.puts "exception e1=#{e_info[1]} ")
1572
2176
  File.read uri
1573
2177
  rescue => e2
1574
- debug && (stderr.puts "exception e2=#{e2.inspect}")
2178
+ e_info = exception_info_base [e2]
2179
+ debug && (stderr.puts "exception e2=#{e_info[2]}")
1575
2180
  debug && (stderr.puts "return_on_rescue=#{return_on_rescue.inspect}")
1576
2181
  must_return_on_rescue = true
1577
2182
  return_on_rescue
@@ -5046,11 +5651,13 @@ n8mFEtUKobsK
5046
5651
  admit_non_ssl = admit_non_ssl.nne true
5047
5652
  http_file_read_attempt = (
5048
5653
  debug && (stderr.puts "file_read \"https://#{domain}:#{http_server_port}/#{path}\"")
5049
- file_read ["https://#{domain}:#{http_server_port}/#{path}", nil, nil, :return_on_rescue, nil, :skip_open_uri]
5654
+ file_read ["https://#{domain}:#{http_server_port}/#{path}", nil, nil, nil, nil, :skip_open_uri, nil, nil, nil, nil, nil, nil, :http_request_response__curl]
5050
5655
  )
5051
5656
  debug && (stderr.puts "#{admit_non_ssl.inspect} && file_read \"http://#{domain}:#{http_server_port}/#{path}\"")
5052
5657
  response = http_file_read_attempt ||
5053
- admit_non_ssl && (file_read ["http://#{domain}:#{http_server_port}/#{path}"])
5658
+ admit_non_ssl && (
5659
+ file_read ["http://#{domain}:#{http_server_port}/#{path}", nil, nil, nil, nil, :skip_open_uri, nil, nil, nil, nil, nil, nil, :http_request_response__curl]
5660
+ )
5054
5661
  rv = [response, http_file_read_attempt]
5055
5662
  debug && (stderr.puts "#{__method__} will return [response, http_file_read_attempt]=#{rv.inspect}")
5056
5663
  debug && (stderr.puts "#{__method__} returning}")
@@ -5196,6 +5803,10 @@ n8mFEtUKobsK
5196
5803
  # experimental stuff coming. usage example:
5197
5804
  # ./rubyment.rb invoke_double p test__shell_send_array__main "tinga" "" sub in EN
5198
5805
  # ["tENga"]
5806
+ # will be deprecated by send_array_base
5807
+ # ./rubyment.rb invoke_double p experiment__send_array_base 300 "bytes"
5808
+ # [[51, 48, 48], nil, nil]
5809
+ # only works with strings by now
5199
5810
  def test__shell_send_array__main args=[]
5200
5811
  p args
5201
5812
  object_to_send,
@@ -5857,7 +6468,8 @@ n8mFEtUKobsK
5857
6468
 
5858
6469
 
5859
6470
  =begin
5860
- # short_desc = "tests the function #string_repetion"
6471
+ # begin_documentation
6472
+ # short_desc = "tests the function #string_repetition"
5861
6473
 
5862
6474
  @memory[:documentation].push = {
5863
6475
  :function => :test__string_repetition,
@@ -5880,6 +6492,7 @@ n8mFEtUKobsK
5880
6492
  },
5881
6493
  ],
5882
6494
  }
6495
+ # end_documentation
5883
6496
 
5884
6497
 
5885
6498
  =end
@@ -5985,53 +6598,168 @@ n8mFEtUKobsK
5985
6598
  end
5986
6599
 
5987
6600
 
6601
+ module RubymentDevelopmentModule
6602
+
6603
+
5988
6604
  =begin
5989
- includes RubymentModule
5990
- =end
5991
- class Rubyment
5992
- include RubymentModule
5993
- end
5994
- =begin
5995
- c = :c
5996
- experiment__input_select [[:a, :b, :c], c ]
6605
+ trying to get the interface compatible with
6606
+ # rest_request_or_open_uri_open
6607
+ # ideally, i would need an equivalent for
6608
+ # rest_response__request_base
6609
+
5997
6610
  =end
5998
- class Rubyment
5999
- def experiment__input_select args=[]
6000
- alternatives,
6001
- default,
6002
- reserved = args
6611
+ def http_request_response__curl args=[]
6003
6612
  stderr = @memory[:stderr]
6004
- caption = alternatives.each_with_index.map {|a, i| "#{i} - #{a.inspect}"}.join("\n")
6005
- stderr.puts "[alternatives: #{caption}][default: #{default.inspect}]"
6006
- alternative = input_single_line
6007
- selection = alternative.nne && alternatives[alternative.to_i] || default
6613
+ url,
6614
+ payload,
6615
+ verify_ssl,
6616
+ unimplemented__headers,
6617
+ method,
6618
+ auth_user,
6619
+ password,
6620
+ unimplemented__timeout,
6621
+ unused__skip_open_uri,
6622
+ debug,
6623
+ no_rescuing,
6624
+ reserved = args
6625
+
6626
+ debug = debug.nne
6627
+ debug && (stderr.puts "{#{__method__} starting")
6628
+ debug && (stderr.puts "caller=#{caller_label}")
6629
+ debug && (stderr.puts "args.each_with_index=#{args.each_with_index.entries.inspect}")
6630
+ no_rescuing = no_rescuing.nne
6631
+ method = method.nne "get"
6632
+ verify_ssl = verify_ssl.nne
6633
+ curl_method = "http_#{method.downcase}"
6634
+ curl_post_data = payload.nne
6635
+ curl_args = [url, curl_post_data].compact
6636
+ block = bled [
6637
+ :no_answer.to_nil,
6638
+ no_rescuing,
6639
+ no_rescuing,
6640
+ ] {
6641
+ require 'curb'
6642
+ c = Curl::Easy.send curl_method, *curl_args
6643
+ c.http_auth_types = :basic
6644
+ c.username = auth_user
6645
+ c.password = password
6646
+ # follow_location?
6647
+ c.ssl_verify_host = verify_ssl
6648
+ c.ssl_verify_peer = verify_ssl
6649
+ c.perform
6650
+ [ c.body_str, nil, c.http_connect_code]
6651
+ }
6652
+ rv = block.first.call
6653
+ # rv = block_rv.first
6654
+
6655
+ debug && (stderr.puts "#{__method__} will return #{rv.inspect}")
6656
+ debug && (stderr.puts "#{__method__} returning}")
6657
+ rv
6658
+ end
6659
+
6660
+
6661
+ def runtime_tmp_dir # for initialize
6008
6662
  end
6009
- end
6010
6663
 
6011
6664
 
6012
6665
  =begin
6666
+ returns args
6013
6667
  =end
6014
- class Rubyment
6015
- def file__json args=[]
6016
- require 'json'
6017
- file_path,
6018
- enum,
6668
+ def experiment__resolve args=[]
6669
+ reference_or_value,
6670
+ resolver,
6671
+ debug,
6672
+ dont_resolve,
6019
6673
  reserved = args
6020
- File.write file_path, JSON.pretty_generate({ :root.to_s => enum })
6674
+ rv
6021
6675
  end
6022
- def load__file_json args=[]
6023
- require 'json'
6024
- file_path,
6676
+
6677
+
6678
+
6679
+ =begin
6680
+ # note: some functions may misbehave if they have different
6681
+ # behaviours depending if they get a block or not
6682
+ # to be tested.
6683
+ =end
6684
+ def experiment__send_array_base args=[]
6685
+ object_to_send,
6686
+ method_to_send,
6687
+ args_to_send,
6688
+ block_to_send,
6689
+ args_to_bled,
6690
+ is_array_method,
6691
+ reference,
6692
+ derref_args,
6693
+ debug,
6694
+ shallow,
6695
+ send_to_self,
6025
6696
  reserved = args
6026
- file_contents = File.read file_path
6027
- puts "file_contents size=#{file_contents.size}"
6028
- loaded = JSON.parse file_contents
6029
- puts "loaded size=#{loaded.size}"
6030
- puts "loaded=#{loaded.inspect}"
6031
- loaded[:root.to_s]
6697
+
6698
+ stderr = @memory[:stderr]
6699
+ debug = debug.nne
6700
+ debug && (stderr.puts "{#{__method__} starting")
6701
+ debug && (stderr.puts "args.each_with_index=#{args.each_with_index.entries.inspect}")
6702
+
6703
+ reference = reference.nne
6704
+ args_to_send = args_to_send.nne []
6705
+ is_array_method = is_array_method.nne
6706
+ args_to_send = is_array_method && [args_to_send] || args_to_send
6707
+ block_to_send = block_to_send.nne
6708
+
6709
+ args_to_bled = args_to_bled.nne []
6710
+ default_on_exception,
6711
+ dont_rescue,
6712
+ output_backtrace,
6713
+ unsed = args_to_bled
6714
+
6715
+ default_on_exception = default_on_exception.nne
6716
+ dont_rescue = dont_rescue.nne
6717
+ output_backtrace = output_backtrace.nne
6718
+
6719
+ debug && (stderr.puts "general case{: #{object_to_send.inspect}.#{method_to_send.inspect}(#{args_to_send.inspect})&#{block_to_send} }")
6720
+
6721
+ send_block = bled(args_to_bled) {
6722
+ (debug || output_backtrace) && (stderr.puts "{#{__method__} block starting")
6723
+ (debug || output_backtrace) && (stderr.puts "#{__method__} block: args.each_with_index=#{args.each_with_index.entries.inspect}")
6724
+
6725
+ brv = object_to_send.send method_to_send, *args_to_send, &block_to_send
6726
+
6727
+ (debug || output_backtrace) && (stderr.puts "#{__method__} block will return #{brv.inspect}")
6728
+ (debug || output_backtrace) && (stderr.puts "#{__method__} block returning}")
6729
+ brv
6730
+ }.first
6731
+
6732
+ default_block = bled(args_to_bled) {
6733
+ (debug || output_backtrace) && (stderr.puts "#{__method__} block: nil method makes return #{args_to_send.inspect}")
6734
+ args_to_send
6735
+ }.first
6736
+
6737
+ block_return, e_info, exception = experiment__whether [
6738
+ method_to_send,
6739
+ send_block,
6740
+ default_block,
6741
+ ]
6742
+
6743
+ rv = [block_return, e_info, exception]
6744
+
6745
+ debug && (stderr.puts "will return #{rv.inspect}")
6746
+ debug && (stderr.puts "#{__method__} returning}")
6747
+ rv
6032
6748
  end
6749
+
6750
+
6033
6751
  end
6034
6752
 
6035
6753
 
6754
+ =begin
6755
+ the purpose of this class is just to be able
6756
+ to have all the functions of RubymentModule
6757
+ available in a single object.
6758
+ =end
6759
+ class Rubyment
6760
+ include RubymentDevelopmentModule # must NOT be in master TODO
6761
+ include RubymentModule
6762
+ end
6763
+
6036
6764
  (__FILE__ == $0) && Rubyment.new({:invoke => ARGV})
6037
6765
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rubyment
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.6.25563758
4
+ version: 0.6.25581116
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ribamar Santarosa