pry-timetravel 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: de1866b7ed3e671da6c46593c64cf8a6d67f79b1
4
+ data.tar.gz: 3250ab254a725690e9918c419eb99e9bea65a213
5
+ SHA512:
6
+ metadata.gz: 72cd2382bb52e80f742995b9055c0e4680a0468413b431c26f097e3ffb3c022d45d43930f54c6eea2712ba8b8bca1e4c70ed2933f30eb8ac2c1b4f32b5c1484b
7
+ data.tar.gz: ddeda18934b6405411a1971a1cfd4a0b5dc68d49cb234bc2f0ca5044ac623668312e06c909c4f63737a3b3801c26b34dba3c45f2ccf90fca5d025ec65516d611
data/.gitignore ADDED
@@ -0,0 +1,6 @@
1
+ *.gem
2
+ Gemfile.lock
3
+ .rbx
4
+ .yardoc
5
+ doc
6
+ tags
data/.travis.yml ADDED
@@ -0,0 +1,7 @@
1
+ language: ruby
2
+ cache: bundler
3
+ rvm:
4
+ - 1.9.3
5
+ - 2.0.0
6
+ - 2.1.0
7
+ - rbx
data/Gemfile ADDED
@@ -0,0 +1,2 @@
1
+ source 'https://rubygems.org'
2
+ gemspec
data/LICENSE.MIT ADDED
@@ -0,0 +1,19 @@
1
+ Copyright (c) 2012 Conrad Irwin <conrad.irwin@gmail.com>
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining a copy
4
+ of this software and associated documentation files (the "Software"), to deal
5
+ in the Software without restriction, including without limitation the rights
6
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
7
+ copies of the Software, and to permit persons to whom the Software is
8
+ furnished to do so, subject to the following conditions:
9
+
10
+ The above copyright notice and this permission notice shall be included in
11
+ all copies or substantial portions of the Software.
12
+
13
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
18
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
19
+ THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,21 @@
1
+ # pry-timetravel
2
+
3
+ DOES NOT WORK. DO NOT USE.
4
+
5
+ Time travel! For your REPL!
6
+
7
+ > x = 5
8
+ 5
9
+ > checkpoint
10
+ > x = 10
11
+ 10
12
+ > timetravel
13
+ > x
14
+ 5
15
+
16
+ This is an attempt to package the proof of concept. API WILL CHANGE!
17
+
18
+ ## Meta
19
+
20
+ Released under the MIT license, see LICENSE.MIT for details. Contributions and bug-reports
21
+ are welcome.
data/Rakefile ADDED
@@ -0,0 +1,14 @@
1
+ require 'rspec/core/rake_task'
2
+
3
+ task :default => :test
4
+ task :spec => :test
5
+
6
+ RSpec::Core::RakeTask.new(:test)
7
+
8
+ task :build do
9
+ sh 'gem build *.gemspec'
10
+ end
11
+
12
+ task :install => :build do
13
+ sh 'gem install *.gem'
14
+ end
@@ -0,0 +1,87 @@
1
+ require 'rubygems'
2
+ require 'pry'
3
+
4
+ require File.expand_path('../pry-timetravel/commands', __FILE__)
5
+
6
+ class PryTimetravel
7
+ class << self
8
+
9
+ def dlog(msg)
10
+ # File.open("meta.log", 'a') do |file|
11
+ # file.puts(msg)
12
+ # end
13
+ end
14
+
15
+ def checkpoint
16
+ parent_pid = $$
17
+ child_pid = fork
18
+ if child_pid
19
+ dlog("PARENT #{parent_pid}: I have a child pid #{child_pid}")
20
+
21
+ # Method 1: Child suspends themselves, parent adds them to list
22
+ # @previous_pid ||= []
23
+ # @previous_pid.push child_pid
24
+
25
+ # Method 2: Parent does a global-blocking waitall
26
+ # when the child exits, we can continue
27
+ # Problem: What if the child exits in a bad way? Check out '$?'
28
+ Process.waitpid(child_pid)
29
+ dlog("ME #{$$}: Previous exit: #{$?.inspect}")
30
+ if $?.exitstatus != 42
31
+ # Since this wasn't a timetravel return, we must unravel this world
32
+ Kernel.exit! $?.exitstatus
33
+ end
34
+
35
+ # The parent universe freezes
36
+ # dlog("PARENT #{$$}: I am suspending. My child is #{parent_pid}")
37
+ # dlog("PARENT #{$$}: suspending")
38
+ # Process.setpgrp
39
+ # Process.setsid
40
+ # dlog("PARENT #{$$}: resumed!")
41
+ else
42
+ child_pid = $$
43
+ dlog("CHILD: #{child_pid}: I have a parent pid #{parent_pid}")
44
+
45
+ # Method 1: Child suspends themselves, parent adds them to list
46
+ # The child is eventually resumed
47
+ # Process.kill 'SIGSTOP', child_pid
48
+ # dlog("CHILD #{child_pid}: resumed!")
49
+
50
+ # Method 2: Parent does a global-blocking waitall
51
+ # Child doesn't need to keep track of parent at all?
52
+ # Child will just exit! when it is done
53
+ @previous_pid ||= []
54
+ @previous_pid.push parent_pid
55
+
56
+ end
57
+ end
58
+
59
+ def go_back
60
+ dlog("ME #{$$}: Thinking about time travel...");
61
+ dlog("ME #{$$}: previous_pid = #{ @previous_pid }");
62
+ if @previous_pid && ! @previous_pid.empty?
63
+ previous_pid = @previous_pid.pop
64
+ dlog("ME #{$$}: I found a previous pid #{previous_pid}! TIME TRAVEL TIME")
65
+
66
+ # Method 1: Awaken the child and let them take over
67
+ # Main parent can't exit or shell will get upset, so wait for all children
68
+ # Once all children are done, kill ourself
69
+ # Process.kill 'SIGCONT', previous_pid
70
+ # dlog("ME #{$$}: I resumed pid #{previous_pid}... now time to wait")
71
+ # # Process.waitpid(previous_pid)
72
+ # Process.waitall
73
+ # dlog("ME #{$$}: If you meet your previous self, kill yourself.")
74
+ # # Process.kill 'SIGKILL', $$
75
+ # Kernel.exit!
76
+
77
+ # Method 2: Kill ourself and let the parent take over
78
+ # The parent was just doing a waitpid, so it is ready
79
+ # Process.kill 'SIGKILL', $$
80
+ Process.exit! 42
81
+
82
+ end
83
+ dlog("ME #{$$}: I was unable to time travel. Maybe it is a myth.");
84
+ end
85
+ end
86
+ end
87
+
@@ -0,0 +1,49 @@
1
+
2
+ Pry::Commands.create_command "checkpoint", "Set a marker in the timeline" do
3
+ match 'checkpoint'
4
+ group 'Timetravel'
5
+ # description 'Snapshot the world so we can timetravel back here later'
6
+ banner <<-'BANNER'
7
+ Usage: checkpoint
8
+ checkpoint --list
9
+ checkpoint --delete [INDEX]
10
+
11
+ This will add a checkpoint which you can return to later.
12
+ BANNER
13
+
14
+ # def options(opt)
15
+ # opt.on :d, :delete,
16
+ # "Delete the checkpoint with the given index. If no index is given delete them all",
17
+ # :optional_argument => true, :as => Integer
18
+ # opt.on :l, :list,
19
+ # "Show all checkpoints"
20
+ # end
21
+ def process
22
+ PryTimetravel.checkpoint
23
+ end
24
+ end
25
+
26
+ Pry::Commands.create_command "timetravel", "Set a marker in the timeline" do
27
+ match 'timetravel'
28
+ group 'Timetravel'
29
+ # description 'Snapshot the world so we can timetravel back here later'
30
+ banner <<-'BANNER'
31
+ Usage: checkpoint
32
+ checkpoint --list
33
+ checkpoint --delete [INDEX]
34
+
35
+ This will add a checkpoint which you can return to later.
36
+ BANNER
37
+
38
+ # def options(opt)
39
+ # opt.on :d, :delete,
40
+ # "Delete the checkpoint with the given index. If no index is given delete them all",
41
+ # :optional_argument => true, :as => Integer
42
+ # opt.on :l, :list,
43
+ # "Show all checkpoints"
44
+ # end
45
+ def process
46
+ PryTimetravel.go_back
47
+ end
48
+ end
49
+
@@ -0,0 +1,2 @@
1
+ #Bundler shenanigans
2
+ require 'pry-timetravel'
@@ -0,0 +1,19 @@
1
+ Gem::Specification.new do |s|
2
+ s.name = 'pry-timetravel'
3
+ s.version = '0.0.1'
4
+ s.summary = 'Timetravel'
5
+ s.description = 'Allows you to timetravel!'
6
+ s.homepage = 'https://github.com/awwaiid/pry-timetravel'
7
+ s.email = ['awwaiid@thelackthereof.org']
8
+ s.authors = ['Brock Wilcox']
9
+ s.files = `git ls-files`.split("\n")
10
+ s.require_paths = ['lib']
11
+
12
+ s.add_dependency 'pry'
13
+
14
+ s.add_development_dependency 'rake'
15
+ # s.add_development_dependency 'rspec'
16
+ # s.add_development_dependency 'yard'
17
+ # s.add_development_dependency 'redcarpet'
18
+ # s.add_development_dependency 'capybara'
19
+ end
@@ -0,0 +1,11 @@
1
+ require './spec/spec_helper'
2
+
3
+ describe "pry-timetravel commands" do
4
+ describe "checkpoint" do
5
+ it "forks a child"
6
+ end
7
+ describe "timetravel" do
8
+ it "reinvokes the saved checkpoint and kills itself"
9
+ end
10
+ end
11
+
@@ -0,0 +1,6 @@
1
+ require 'rspec'
2
+ require 'rspec/autorun'
3
+
4
+ require 'pry/test/helper'
5
+
6
+ require './lib/pry-timetravel'
metadata ADDED
@@ -0,0 +1,84 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: pry-timetravel
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Brock Wilcox
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2014-08-07 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: pry
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rake
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ description: Allows you to timetravel!
42
+ email:
43
+ - awwaiid@thelackthereof.org
44
+ executables: []
45
+ extensions: []
46
+ extra_rdoc_files: []
47
+ files:
48
+ - ".gitignore"
49
+ - ".travis.yml"
50
+ - Gemfile
51
+ - LICENSE.MIT
52
+ - README.md
53
+ - Rakefile
54
+ - lib/pry-timetravel.rb
55
+ - lib/pry-timetravel/commands.rb
56
+ - lib/pry/timetravel.rb
57
+ - pry-timetravel.gemspec
58
+ - spec/commands_spec.rb
59
+ - spec/spec_helper.rb
60
+ homepage: https://github.com/awwaiid/pry-timetravel
61
+ licenses: []
62
+ metadata: {}
63
+ post_install_message:
64
+ rdoc_options: []
65
+ require_paths:
66
+ - lib
67
+ required_ruby_version: !ruby/object:Gem::Requirement
68
+ requirements:
69
+ - - ">="
70
+ - !ruby/object:Gem::Version
71
+ version: '0'
72
+ required_rubygems_version: !ruby/object:Gem::Requirement
73
+ requirements:
74
+ - - ">="
75
+ - !ruby/object:Gem::Version
76
+ version: '0'
77
+ requirements: []
78
+ rubyforge_project:
79
+ rubygems_version: 2.2.2
80
+ signing_key:
81
+ specification_version: 4
82
+ summary: Timetravel
83
+ test_files: []
84
+ has_rdoc: