bopeep 0.1.6 → 0.1.7

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/bopeep.rb +224 -153
  3. metadata +2 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 0c6ba8791b9e8e28d2650fcbed8846c95b86d210758362119e6ebaf67ae79644
4
- data.tar.gz: 74d7390521096432e82a3e5aca5eb8ce70ed090f46136aa64bc2adaa758e739c
3
+ metadata.gz: 225fd316f342c4a23f15c428d44816f55ce5760e20d2aceef2e84ac27784c218
4
+ data.tar.gz: 43e00f49265f4bcac5dc99f1917ecf8d85151a42aea4da86177befebe13a03a0
5
5
  SHA512:
6
- metadata.gz: 57bb72361cf6ebbee6602ba7988cd2760b519b16c5feccf05d1ff6074bdc069fb036320182871664bc9a3720085d4a0a4955ed65133866edb7e731db0a384df4
7
- data.tar.gz: 3ceb06f5ffdc5c10643a21eee61623081736165c211b2bf16dbf53e2fee0df90d14879b6434bada1b5c0b46129d2310ca39489bac5f17195d1b68bfbfea5d7ed
6
+ metadata.gz: 8e540b83379b5661c897286b30170bda85b72fa6cad22f5cdd7fe0e0bbb7a6924cb33404a24193aeff4bfb7b7e14e749d9f16499bdb1167c1d10ed1f5cfac494
7
+ data.tar.gz: 13883aa073f0cb2739c0e7c203833cb53c232724d30110578a92bf2d9a0dde71bf936d3c5239a83e2f84da8872b8eb21eb1b52ec544ffa87c2009750157ca19d
data/lib/bopeep.rb CHANGED
@@ -424,7 +424,7 @@ module BoPeep
424
424
  class HostStatus
425
425
  attr_accessor :row_number
426
426
 
427
- def initialize(host, console)
427
+ def initialize(host, console = BoPeep.console)
428
428
  @host = host
429
429
  @console = console
430
430
 
@@ -475,6 +475,19 @@ module BoPeep
475
475
 
476
476
  content
477
477
  end
478
+
479
+ class DevNull
480
+ def started!
481
+ end
482
+
483
+ def failed!(*)
484
+ end
485
+
486
+ def success!
487
+ end
488
+ end
489
+
490
+ DEV_NULL = DevNull.new
478
491
  end
479
492
 
480
493
  class SelectGraphicRendition
@@ -579,8 +592,8 @@ module BoPeep
579
592
  "localhost"
580
593
  end
581
594
 
582
- def run
583
- outcome = CommandOutcome.new
595
+ def run(callbacks: nil, log: false)
596
+ outcome = CommandOutcome.new(callbacks: callbacks, log: log)
584
597
 
585
598
  begin
586
599
  outcome.command_started!
@@ -597,8 +610,15 @@ module BoPeep
597
610
  class CommandOutcome
598
611
  attr_accessor :error
599
612
 
600
- def initialize
601
- @console_status = Console::HostStatus.new(LOCALHOST, BoPeep.console)
613
+ def initialize(callbacks: nil, log:)
614
+ @callbacks = Host::Callbacks.from(callbacks)
615
+
616
+ if log
617
+ @console_status = Console::HostStatus.new(LOCALHOST)
618
+ else
619
+ @console_status = Console::HostStatus::DEV_NULL
620
+ end
621
+
602
622
  @started_at = nil
603
623
  @finished_at = nil
604
624
  end
@@ -624,8 +644,10 @@ module BoPeep
624
644
 
625
645
  if successful?
626
646
  @console_status.success!
647
+ @callbacks.on_success(self)
627
648
  else
628
649
  @console_status.failed!(failure_summary)
650
+ @callbacks.on_failure(self)
629
651
  end
630
652
  end
631
653
 
@@ -774,8 +796,8 @@ module BoPeep
774
796
  inspect.hash
775
797
  end
776
798
 
777
- def run_command(command, &setup)
778
- outcome = CommandOutcome.new(self, command, &setup)
799
+ def run_command(command, callbacks: nil, log: false, &setup)
800
+ outcome = CommandOutcome.new(self, command, callbacks: callbacks, log: log, &setup)
779
801
 
780
802
  connection.open_channel do |channel|
781
803
  channel.exec(command) do |_, success|
@@ -817,12 +839,12 @@ module BoPeep
817
839
  outcome
818
840
  end
819
841
 
820
- def run_script(script, &setup)
842
+ def run_script(script, callbacks: nil, log: false, &setup)
821
843
  create_directory script.install_directory
822
844
 
823
845
  create_file_from script.content, path: script.install_path, mode: 0755
824
846
 
825
- run_command(script.remote_path, &setup)
847
+ run_command(script.remote_path, callbacks: callbacks, log: log, &setup)
826
848
  end
827
849
 
828
850
  def create_directory(directory)
@@ -906,6 +928,83 @@ module BoPeep
906
928
  @id = Digest::SHA1.hexdigest(@uri.to_s)
907
929
  end
908
930
 
931
+ class Callbacks
932
+ def on_stdout(data)
933
+ end
934
+
935
+ def on_stderr(data)
936
+ end
937
+
938
+ def on_success(command_outcome)
939
+ end
940
+
941
+ def on_failure(command_outcome)
942
+ end
943
+
944
+ class Proxy
945
+ extend Forwardable
946
+
947
+ def_delegators :@callbacks, :on_stdout, :on_stderr, :on_success, :on_failure
948
+
949
+ def initialize(callbacks)
950
+ @callbacks = callbacks
951
+ end
952
+
953
+ def method_missing(name, *args, &block)
954
+ if @callbacks.respond_to?(name)
955
+ @callbacks.send(name, *args, &block)
956
+ else
957
+ super
958
+ end
959
+ end
960
+
961
+ protected
962
+
963
+ def respond_to_missing?(name, include_private = false)
964
+ @callbacks.respond_to_missing?(name, include_private) || super
965
+ end
966
+ end
967
+
968
+ class Definition
969
+ attr_reader :callbacks
970
+
971
+ def initialize(callbacks = nil, &setup)
972
+ if callbacks
973
+ @callbacks = Proxy.new(callbacks)
974
+ else
975
+ @callbacks = Callbacks.new
976
+ end
977
+
978
+ case setup&.arity
979
+ when 1
980
+ setup.call(self)
981
+ when 0
982
+ instance_eval(&setup)
983
+ end
984
+ end
985
+
986
+ def on_stdout(&block)
987
+ @callbacks.singleton_class.define_method(:on_stdout, &block)
988
+ end
989
+
990
+ def on_stderr(&block)
991
+ @callbacks.singleton_class.define_method(:on_stderr, &block)
992
+ end
993
+
994
+ def on_success(&block)
995
+ @callbacks.singleton_class.define_method(:on_success, &block)
996
+ end
997
+
998
+ def on_failure(&block)
999
+ @callbacks.singleton_class.define_method(:on_failure, &block)
1000
+ end
1001
+ end
1002
+
1003
+ def self.from(callbacks = nil, &setup)
1004
+ Definition.new(callbacks, &setup).callbacks
1005
+ end
1006
+ end
1007
+
909
1008
  class CommandOutcome
910
1009
  attr_reader :command
911
1010
  attr_reader :connection_error_code
@@ -920,46 +1019,37 @@ module BoPeep
920
1019
  attr_reader :stderr
921
1020
  attr_reader :stdout
922
1021
 
923
- def initialize(host, command, &setup)
1022
+ def initialize(host, command, callbacks: nil, log: false, &setup)
924
1023
  @host = host
925
1024
  @command = command
926
1025
 
927
- @console_status = Console::HostStatus.new(host, BoPeep.console)
1026
+ if log
1027
+ @console_status = Console::HostStatus.new(host)
1028
+ else
1029
+ @console_status = Console::HostStatus::DEV_NULL
1030
+ end
928
1031
 
929
1032
  @stdout = ""
930
- @stdout_callback = proc {}
931
-
932
1033
  @stderr = ""
933
- @stderr_callback = proc {}
934
1034
 
935
1035
  @started_at = nil
936
1036
  @finished_at = nil
937
1037
 
938
- if setup
939
- instance_eval(&setup)
940
- end
1038
+ @callbacks = Callbacks.from(callbacks, &setup)
941
1039
  end
942
1040
 
943
1041
  def value
944
1042
  self
945
1043
  end
946
1044
 
947
- def on_stdout(&block)
948
- @stdout_callback = block
949
- end
950
-
951
1045
  def collect_stdout(data)
952
1046
  @stdout << data
953
- @stdout_callback.call(data)
954
- end
955
-
956
- def on_stderr(&block)
957
- @stderr_callback = block
1047
+ @callbacks.on_stdout(data)
958
1048
  end
959
1049
 
960
1050
  def collect_stderr(data)
961
1051
  @stderr << data
962
- @stderr_callback.call(data)
1052
+ @callbacks.on_stderr(data)
963
1053
  end
964
1054
 
965
1055
  def successful?
@@ -986,6 +1076,7 @@ module BoPeep
986
1076
 
987
1077
  if failed?
988
1078
  @failure_reason = :nonzero_exit_status
1079
+ @callbacks.on_failure(self)
989
1080
  end
990
1081
  end
991
1082
 
@@ -1000,6 +1091,8 @@ module BoPeep
1000
1091
  @exit_signal.freeze
1001
1092
 
1002
1093
  @failure_reason = :exit_signal
1094
+
1095
+ @callbacks.on_failure(self)
1003
1096
  end
1004
1097
 
1005
1098
  value
@@ -1034,6 +1127,7 @@ module BoPeep
1034
1127
 
1035
1128
  if successful?
1036
1129
  @console_status.success!
1130
+ @callbacks.on_success(self)
1037
1131
  else
1038
1132
  @console_status.failed!(failure_summary)
1039
1133
  end
@@ -1049,6 +1143,8 @@ module BoPeep
1049
1143
  unless started?
1050
1144
  @console_status.failed!(failure_summary)
1051
1145
  end
1146
+
1147
+ @callbacks.on_failure(self)
1052
1148
  end
1053
1149
 
1054
1150
  def failure_summary
@@ -1192,15 +1288,15 @@ module BoPeep
1192
1288
  end
1193
1289
  end
1194
1290
 
1195
- def run_script(script, order: :parallel, &setup)
1291
+ def run_script(script, order: :parallel, callbacks: nil, log: false, &setup)
1196
1292
  run(order: order) do |host, result|
1197
- result.update host.run_script(script, &setup)
1293
+ result.update host.run_script(script, callbacks: callbacks, log: log, &setup)
1198
1294
  end
1199
1295
  end
1200
1296
 
1201
- def run_command(command, order: :parallel, &setup)
1297
+ def run_command(command, order: :parallel, callbacks: nil, log: false, &setup)
1202
1298
  run(order: order) do |host, result|
1203
- result.update host.run_command(command, &setup)
1299
+ result.update host.run_command(command, callbacks: callbacks, log: log, &setup)
1204
1300
  end
1205
1301
  end
1206
1302
 
@@ -1297,6 +1393,7 @@ module BoPeep
1297
1393
  class Config
1298
1394
  attr_accessor :default_user
1299
1395
  attr_reader :hosts
1396
+ attr_accessor :on_failure_command
1300
1397
  attr_reader :variables_sets
1301
1398
 
1302
1399
  def initialize
@@ -1318,7 +1415,7 @@ module BoPeep
1318
1415
  end
1319
1416
  end
1320
1417
 
1321
- def variables(name, &block)
1418
+ def variables(name)
1322
1419
  variables_name = name.to_s
1323
1420
  ivar_name = "@#{variables_name}"
1324
1421
 
@@ -1331,7 +1428,7 @@ module BoPeep
1331
1428
  variables_object = instance_variable_set(ivar_name, VariableSet.new(variables_name, self))
1332
1429
  end
1333
1430
 
1334
- block.call(variables_object)
1431
+ yield variables_object
1335
1432
  end
1336
1433
 
1337
1434
  class VariableSet
@@ -1352,15 +1449,25 @@ module BoPeep
1352
1449
  @properties.include?(property_name.to_s)
1353
1450
  end
1354
1451
 
1355
- def define!(property_name)
1356
- @properties << property_name.to_s
1452
+ def define!(property_name, value = nil, &block)
1453
+ property_name = property_name.to_s
1454
+
1455
+ if self.defined?(property_name)
1456
+ raise ArgumentError, "`#{@_name}.#{property_name}' is already defined"
1457
+ elsif Property::REGEXP.match?(property_name)
1458
+ @properties << property_name
1459
+
1460
+ extend Property.new(property_name, block || value)
1461
+ else
1462
+ raise ArgumentError, "`#{property_name}' is not a valid property name"
1463
+ end
1357
1464
  end
1358
1465
 
1359
1466
  def copy(other)
1360
1467
  other.properties.each do |property_name|
1361
1468
  value = other.instance_variable_get("@#{property_name}")
1362
1469
 
1363
- extend Property.new(property_name, value)
1470
+ define!(property_name, value)
1364
1471
  end
1365
1472
  end
1366
1473
 
@@ -1378,7 +1485,7 @@ module BoPeep
1378
1485
  writer_name = name.to_s
1379
1486
  reader_name = writer_name.chomp("=")
1380
1487
 
1381
- if reader_name !~ Property::REGEXP
1488
+ if ! Property::REGEXP.match?(reader_name)
1382
1489
  super
1383
1490
  elsif reader_name == writer_name && block.nil?
1384
1491
  $stderr.puts "`#{@_name}.#{reader_name}' was accessed before it was defined"
@@ -1386,7 +1493,7 @@ module BoPeep
1386
1493
  elsif writer_name.end_with?("=") or not block.nil?
1387
1494
  value = block || args
1388
1495
 
1389
- extend Property.new(reader_name, *value)
1496
+ define!(reader_name, *value)
1390
1497
  end
1391
1498
  end
1392
1499
 
@@ -1401,8 +1508,6 @@ module BoPeep
1401
1508
  end
1402
1509
 
1403
1510
  def extended(variables_set)
1404
- variables_set.define! @name
1405
-
1406
1511
  variables_set.singleton_class.class_eval <<-PROPERTY_METHODS
1407
1512
  attr_writer :#{@name}
1408
1513
 
@@ -1433,9 +1538,9 @@ module BoPeep
1433
1538
  attr_reader :parser
1434
1539
  attr_reader :playlist
1435
1540
 
1436
- def initialize(argv, playlist)
1541
+ def initialize(argv)
1437
1542
  @argv = argv
1438
- @playlist = playlist
1543
+ @playlist = Playlist.new(self)
1439
1544
  @parser = OptionParser.new
1440
1545
 
1441
1546
  @parser.on("-t", "--target HOSTS", Array, "hosts to use") do |hosts_data|
@@ -1462,24 +1567,37 @@ module BoPeep
1462
1567
  hosts.add(host)
1463
1568
  end
1464
1569
 
1570
+ self.on_failure_command = config.on_failure_command
1571
+
1465
1572
  config.variables_sets.each do |variables_name|
1466
1573
  variables(variables_name) do |variables_object|
1467
1574
  variables_object.copy config.instance_variable_get("@#{variables_name}")
1468
1575
  end
1469
1576
  end
1470
1577
  end
1578
+
1579
+ def on_failure_command
1580
+ case @on_failure_command
1581
+ when String
1582
+ Object.const_get(@on_failure_command)
1583
+ else
1584
+ @on_failure_command
1585
+ end
1586
+ end
1471
1587
  end
1472
1588
 
1473
1589
  class Playlist
1474
1590
  attr_reader :insert_at
1475
1591
 
1476
- def initialize
1592
+ def initialize(context)
1593
+ @context = context
1477
1594
  @start = @insert_at = Start.new
1478
1595
  end
1479
1596
 
1480
1597
  def play
1481
1598
  playing = @insert_at = @start
1482
1599
  command = nil
1600
+ on_failure_command_used = false
1483
1601
 
1484
1602
  while playing.next
1485
1603
  playing = @insert_at = playing.next
@@ -1487,15 +1605,23 @@ module BoPeep
1487
1605
  if command != playing.command
1488
1606
  command = playing.command
1489
1607
 
1490
- BoPeep.console.puts Console::SGR(command.command_name.console).with(text_color: :blue, effect: :bold)
1608
+ playing.log_command
1491
1609
  end
1492
1610
 
1493
- BoPeep.console.puts Console::SGR(" -> #{playing.banner}").with(text_color: :magenta)
1611
+ playing.log_step
1494
1612
 
1495
1613
  result = playing.run
1496
1614
 
1497
1615
  if result.failed?
1498
- command.on_failure(result)
1616
+ if @context.on_failure_command && on_failure_command_used == false
1617
+ playing.next = nil
1618
+ @context.on_failure_command.(@context)
1619
+ # Prevents infinite loops if `on_failure_command` fails
1620
+ on_failure_command_used = true
1621
+ else
1622
+ # This is redefined in `test/test_helper.rb` to avoid exiting the test process
1623
+ exit 1
1624
+ end
1499
1625
  end
1500
1626
  end
1501
1627
  end
@@ -1523,12 +1649,11 @@ module BoPeep
1523
1649
  def initialize(argv)
1524
1650
  @argv = argv.dup
1525
1651
  @path = nil
1526
- @playlist = Playlist.new
1527
1652
 
1528
1653
  find_bopeep_directory!
1529
1654
  load_config!
1530
1655
 
1531
- @context = Context.new(@argv, @playlist)
1656
+ @context = Context.new(@argv)
1532
1657
  @context.copy(BoPeep.config)
1533
1658
 
1534
1659
  load_scripts!
@@ -1550,7 +1675,7 @@ module BoPeep
1550
1675
  Console.hostname_width = @context.hosts.map { |host| host.address.length }.max
1551
1676
 
1552
1677
  BoPeep.console.redirecting_stdout_and_stderr do
1553
- @playlist.play
1678
+ @context.playlist.play
1554
1679
  end
1555
1680
  end
1556
1681
 
@@ -1922,16 +2047,20 @@ module BoPeep
1922
2047
  end
1923
2048
  end
1924
2049
 
1925
- def on_failure(execution_result)
1926
- exit 1
2050
+ def on_stdout(data)
1927
2051
  end
1928
2052
 
1929
- def SGR(text)
1930
- Console::SGR(text)
2053
+ def on_stderr(data)
1931
2054
  end
1932
2055
 
1933
- def and_then(order: :parallel, &block)
1934
- @playlist.queue Step.callback(self, @playlist.insert_at, order, block)
2056
+ def on_success(command_outcome)
2057
+ end
2058
+
2059
+ def on_failure(command_outcome)
2060
+ end
2061
+
2062
+ def SGR(text)
2063
+ Console::SGR(text)
1935
2064
  end
1936
2065
 
1937
2066
  private
@@ -1939,19 +2068,19 @@ module BoPeep
1939
2068
  def configure_parser!
1940
2069
  end
1941
2070
 
1942
- def run_script(script_name = nil, on: hosts, order: :parallel, &setup)
2071
+ def run_script(script_name = nil, on: hosts, **options, &setup)
1943
2072
  script_name ||= command_name.script
1944
2073
  script = Script.new(script_name, context)
1945
2074
 
1946
- queue Step.new(self, script, on, order, &setup)
2075
+ queue Step.new(self, script, on, **options, &setup)
1947
2076
  end
1948
2077
 
1949
- def run_command(command, on: hosts, order: :parallel, &setup)
1950
- queue Step.new(self, command, on, order, &setup)
2078
+ def run_command(command, on: hosts, **options, &setup)
2079
+ queue Step.new(self, command, on, **options, &setup)
1951
2080
  end
1952
2081
 
1953
- def on_localhost(banner, &block)
1954
- queue Step.local(self, banner, block)
2082
+ def on_localhost(banner, **options, &block)
2083
+ queue Step.local(self, banner, block, **options)
1955
2084
  end
1956
2085
  alias locally on_localhost
1957
2086
 
@@ -1977,16 +2106,8 @@ module BoPeep
1977
2106
  end
1978
2107
 
1979
2108
  class Step
1980
- def self.local(command, banner, block)
1981
- new(command, BlockProxy.new(banner, block), LOCALHOST, :serial)
1982
- end
1983
-
1984
- def self.callback(command, last_step, order, block)
1985
- new \
1986
- command,
1987
- Callback.new(last_step, block),
1988
- last_step.hosts,
1989
- order
2109
+ def self.local(command, banner, block, **options)
2110
+ new(command, BlockProxy.new(banner, block), LOCALHOST, **options)
1990
2111
  end
1991
2112
 
1992
2113
  attr_reader :command
@@ -1995,120 +2116,70 @@ module BoPeep
1995
2116
  attr_accessor :previous
1996
2117
  attr_reader :result
1997
2118
 
1998
- def initialize(command, run_object, hosts, order, &setup)
2119
+ def initialize(command, run_object, hosts, order: nil, log: nil, &setup)
1999
2120
  @command = command
2000
2121
  @run_object = run_object
2001
2122
  @hosts = hosts
2002
- @order = order
2003
- @setup = setup
2123
+ @order = order || :parallel
2124
+ @log = log.nil? ? true : log
2125
+ @callbacks_definition = Host::Callbacks::Definition.new(command, &setup)
2004
2126
  end
2005
2127
 
2006
- def banner
2007
- @run_object
2008
- end
2009
-
2010
- def and_then(order: :parallel, &block)
2011
- @command.and_then order: order, &block
2128
+ def log?
2129
+ @log
2012
2130
  end
2013
2131
 
2014
2132
  def run
2015
2133
  @result = case @run_object
2016
2134
  when String
2017
- @hosts.run_command(@run_object, order: @order, &@setup)
2135
+ @hosts.run_command(@run_object, order: @order, callbacks: @callbacks_definition.callbacks, log: @log)
2018
2136
  when Script
2019
- @hosts.run_script(@run_object, order: @order, &@setup)
2020
- when Callback
2021
- @run_object.run(@order)
2137
+ @hosts.run_script(@run_object, order: @order, callbacks: @callbacks_definition.callbacks, log: @log)
2022
2138
  when BlockProxy
2023
2139
  # NOTE: A `Proc` means `@hosts` is `LOCALHOST`
2024
2140
  Executor::Result.new.tap do |result|
2025
- result.update LOCALHOST.run(&@run_object)
2141
+ result.update LOCALHOST.run(callbacks: @callbacks_definition.callbacks, log: @log, &@run_object)
2026
2142
  end
2027
2143
  end
2028
2144
  end
2029
2145
 
2030
- class BlockProxy < Struct.new(:banner, :block)
2031
- def to_s
2032
- banner
2146
+ def log_command
2147
+ if log?
2148
+ BoPeep.console.puts Console::SGR(command.command_name.console).with(text_color: :blue, effect: :bold)
2033
2149
  end
2150
+ end
2034
2151
 
2035
- def to_proc
2036
- block
2152
+ def log_step
2153
+ if log?
2154
+ BoPeep.console.puts Console::SGR(" -> #{@run_object}").with(text_color: :magenta)
2037
2155
  end
2038
2156
  end
2039
2157
 
2040
- class Callback
2041
- def initialize(last_step, run_object)
2042
- @last_step = last_step
2043
- @run_object = run_object
2044
- end
2158
+ def on_stdout(&block)
2159
+ @callbacks_definition.on_stdout(&block)
2160
+ end
2045
2161
 
2046
- def run(order)
2047
- Executor.for(order).new(@last_step.result).run do |last_outcome, result|
2048
- callback_outcome = Outcome.new(last_outcome)
2162
+ def on_stderr(&block)
2163
+ @callbacks_definition.on_stderr(&block)
2164
+ end
2049
2165
 
2050
- begin
2051
- # Use `||=` in case `#value` is set in the callback
2052
- callback_outcome.value ||= @run_object.(last_outcome.host, last_outcome.value, callback_outcome)
2053
- rescue => error
2054
- callback_outcome.error = error
2055
- end
2166
+ def on_success(&block)
2167
+ @callbacks_definition.on_success(&block)
2168
+ end
2056
2169
 
2057
- result.update callback_outcome
2058
- end
2059
- end
2170
+ def on_failure(&block)
2171
+ @callbacks_definition.on_failure(&block)
2172
+ end
2060
2173
 
2174
+ class BlockProxy < Struct.new(:banner, :block)
2061
2175
  def to_s
2062
- "(callback)"
2176
+ banner
2063
2177
  end
2064
2178
 
2065
- class Outcome
2066
- attr_reader :error
2067
- attr_reader :host
2068
- attr_reader :last_outcome
2069
- attr_accessor :value
2070
-
2071
- def initialize(outcome)
2072
- @last_outcome = outcome
2073
- @host = @last_outcome.host
2074
- @successful = true
2075
- end
2076
-
2077
- def resolve(value)
2078
- @value = value
2079
- end
2080
-
2081
- def fail!(message)
2082
- @successful = false
2083
-
2084
- raise CallbackFailedError.new(message)
2085
- end
2086
-
2087
- def error=(error)
2088
- @successful = false
2089
- @error = error
2090
- end
2091
-
2092
- def successful?
2093
- @successful
2094
- end
2095
-
2096
- def failed?
2097
- !successful?
2098
- end
2099
-
2100
- def failure_reason
2101
- error
2102
- end
2103
-
2104
- def failure_summary
2105
- error && error.full_message
2106
- end
2179
+ def to_proc
2180
+ block
2107
2181
  end
2108
2182
  end
2109
-
2110
- class CallbackFailedError < StandardError
2111
- end
2112
2183
  end
2113
2184
  end
2114
2185
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: bopeep
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.6
4
+ version: 0.1.7
5
5
  platform: ruby
6
6
  authors:
7
7
  - Eduardo Gutierrez
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2024-07-20 00:00:00.000000000 Z
11
+ date: 2024-08-01 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bcrypt_pbkdf