shellcast 0.0.1 → 0.0.4

Sign up to get free protection for your applications and to get access to all the features.
data/Gemfile CHANGED
@@ -1,13 +1,14 @@
1
1
  source "http://rubygems.org"
2
2
 
3
3
  gem 'xdg'
4
- gem 'ohai'
4
+ gem 'colored'
5
+ #gem 'artii'
6
+ #gem 'ohai'
5
7
 
6
- # Add dependencies to develop your gem here.
7
- # Include everything needed to run rake, tests, features, etc.
8
8
  group :development do
9
- gem "rspec", "~> 2.1.0"
10
- gem "bundler", "~> 1.0.0"
11
- gem "jeweler", "~> 1.5.1"
12
- gem "rcov", ">= 0"
9
+ gem "rspec"
10
+ gem "mocha"
11
+ gem "bundler"
12
+ gem "jeweler"
13
+ gem "rcov"
13
14
  end
data/Gemfile.lock CHANGED
@@ -1,24 +1,15 @@
1
1
  GEM
2
2
  remote: http://rubygems.org/
3
3
  specs:
4
+ colored (1.2)
4
5
  diff-lcs (1.1.2)
5
- extlib (0.9.15)
6
6
  git (1.2.5)
7
7
  jeweler (1.5.1)
8
8
  bundler (~> 1.0.0)
9
9
  git (>= 1.2.5)
10
10
  rake
11
- json (1.4.6)
12
- mixlib-cli (1.2.0)
13
- mixlib-config (1.1.2)
14
- mixlib-log (1.2.0)
15
- ohai (0.5.8)
16
- extlib
17
- json (>= 1.4.4, <= 1.4.6)
18
- mixlib-cli
19
- mixlib-config
20
- mixlib-log
21
- systemu
11
+ mocha (0.9.9)
12
+ rake
22
13
  rake (0.8.7)
23
14
  rcov (0.9.9)
24
15
  rspec (2.1.0)
@@ -29,16 +20,16 @@ GEM
29
20
  rspec-expectations (2.1.0)
30
21
  diff-lcs (~> 1.1.2)
31
22
  rspec-mocks (2.1.0)
32
- systemu (1.2.0)
33
23
  xdg (1.0.0)
34
24
 
35
25
  PLATFORMS
36
26
  ruby
37
27
 
38
28
  DEPENDENCIES
39
- bundler (~> 1.0.0)
40
- jeweler (~> 1.5.1)
41
- ohai
29
+ bundler
30
+ colored
31
+ jeweler
32
+ mocha
42
33
  rcov
43
- rspec (~> 2.1.0)
34
+ rspec
44
35
  xdg
data/README.md ADDED
@@ -0,0 +1,22 @@
1
+ # ShellCast
2
+
3
+ Screencasting for [Shell Ninjas](http://shell.heroku.com/).
4
+
5
+ ## Usage
6
+
7
+ gem install shellcast
8
+ shellcast record
9
+ ...
10
+ exit
11
+ shellcash push ID
12
+ shellcast play ID
13
+
14
+ ## Dependencies
15
+
16
+ You need `script` and `scriptreplay` tools from BSD Utils.
17
+ Tey are already installed if You use Debian/Ubuntu/BSD variants.
18
+ Not sure about other OSes.
19
+
20
+ ## Copyright
21
+
22
+ Copyright (c) 2010 Antono Vasiljev. See LICENSE.txt for further details.
data/Rakefile CHANGED
@@ -13,9 +13,9 @@ require 'jeweler'
13
13
  Jeweler::Tasks.new do |gem|
14
14
  # gem is a Gem::Specification... see http://docs.rubygems.org/read/chapter/20 for more options
15
15
  gem.name = "shellcast"
16
- gem.homepage = "http://github.com/antono/shellcast"
16
+ gem.homepage = "http://shell.heroku.com/"
17
17
  gem.license = "GPL"
18
- gem.summary = %Q{Record and distribute shellcasts}
18
+ gem.summary = %Q{Screencasts for Shell Ninjas}
19
19
  gem.description = %Q{Screencast utility for unix shell junkies :)}
20
20
  gem.email = "antono.vasiljev@gmail.com"
21
21
  gem.authors = ["Antono Vasiljev"]
data/TODO ADDED
@@ -0,0 +1,3 @@
1
+ - Port Figlet from artii gem to ruby 1.9.2 and use
2
+ instead hardcoded headers and footers
3
+ - Think about console setup before shellcasting
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.0.1
1
+ 0.0.4
data/bin/shellcast CHANGED
@@ -5,7 +5,20 @@ $LOAD_PATH.unshift(File.expand_path('../../lib', __FILE__))
5
5
  require 'rubygems'
6
6
  require 'shellcast'
7
7
 
8
+ BASENAME = File.basename(__FILE__)
9
+
8
10
  case ARGV[0]
11
+ when '-h', '--help'
12
+ puts <<-HELP
13
+ #{BASENAME} option [arg]
14
+
15
+ Options:
16
+ setup API_KEY - setup
17
+ record - record new shellcast
18
+ push RECORD_ID - publish
19
+ list - print list of records
20
+ play RECORD_ID - play local record
21
+ HELP
9
22
  when 'record'
10
23
  ShellCast::Recorder.record!
11
24
  when 'list'
@@ -19,7 +32,23 @@ when 'play'
19
32
  puts "Select one..."
20
33
  exit
21
34
  end
35
+ when 'push'
36
+ if ARGV[1]
37
+ ShellCast::Publisher.new.publish(ARGV[1])
38
+ else
39
+ puts "What do you want to publish"
40
+ ShellCast::Player.list
41
+ puts "Select one..."
42
+ exit
43
+ end
44
+ when 'setup'
45
+ if ARGV[1]
46
+ ShellCast.api_key = ARGV[1]
47
+ else
48
+ puts "\n\tUsage: #{BASENAME} setup API_KEY\n\n"
49
+ exit
50
+ end
22
51
  else
23
- puts "Usage: #{__FILE__} command [shellcast_id]"
52
+ puts "Usage: #{BASENAME} command [shellcast_id]"
24
53
  puts "Commands: record, list, play, publish, get"
25
54
  end
@@ -1,13 +1,48 @@
1
+ # encoding: utf-8
1
2
  module ShellCast
2
3
  class Player
4
+
5
+ HEADER = <<-EOH
6
+
7
+ █ ███ ███
8
+ ▓███▒ █ █ █ ░███▒ █
9
+ █▓ ░█ █ █ █ ░█▒ ░█ █
10
+ █ █▒██▒ ███ █ █ █▒ ░███░ ▒███▒ █████
11
+ █▓░ █▓ ▒█ ▓▓ ▒█ █ █ █ █▒ ▒█ █▒ ░█ █
12
+ ▓██▓ █ █ █ █ █ █ █ █ █▒░ █
13
+ ▓█ █ █ █████ █ █ █ ▒████ ░███▒ █
14
+ █ █ █ █ █ █ █▒ █▒ █ ▒█ █
15
+ █░ ▓█ █ █ ▓▓ █ █░ █░ ░█▒ ░▓ █░ ▓█ █░ ▒█ █░
16
+ ▒████░ █ █ ███▒ ▒██ ▒██ ▒███▒ ▒██▒█ ▒███▒ ▒██
17
+
18
+
19
+ .----------------.
20
+ ' Playback started '
21
+ EOH
22
+
23
+ FOOTER = <<-EOF
24
+ █ █
25
+ ███████ █ ██████ █
26
+ █ █ █ █
27
+ █ █▒██▒ ███ █ █▒██▒ ██▓█
28
+ █ █▓ ▒█ ▓▓ ▒█ █ █▓ ▒█ █▓ ▓█
29
+ █ █ █ █ █ ██████ █ █ █ █
30
+ █ █ █ █████ █ █ █ █ █
31
+ █ █ █ █ █ █ █ █ █
32
+ █ █ █ ▓▓ █ █ █ █ █▓ ▓█
33
+ █ █ █ ███▒ ██████ █ █ ██▓█
34
+
35
+ EOF
36
+
37
+
3
38
  def self.play(id)
4
39
  new(id).play
5
40
  end
6
41
 
7
42
  def self.list
8
43
  Dir[File.join(ShellCast::DATA_DIR, "**", 'meta')].each do |path|
9
- metadata = YAML.load_file(path)
10
- puts "#{metadata["id"]}: #{metadata["title"]}"
44
+ metadata = JSON.parse(IO.read(path))
45
+ puts "#{metadata["created_at"]}: #{metadata["title"]}"
11
46
  end
12
47
  end
13
48
 
@@ -16,13 +51,11 @@ module ShellCast
16
51
  end
17
52
 
18
53
  def play
19
- puts ""
20
- puts "Playback started"
21
- puts "-" * 80
54
+ puts HEADER.black_on_white
55
+ puts
22
56
  system(scriptreplay_cmd)
23
57
  puts
24
- puts "-" * 80
25
- puts "Playback finished"
58
+ puts FOOTER.black_on_white
26
59
  end
27
60
 
28
61
  private
@@ -1,4 +1,43 @@
1
+ require 'oauth'
2
+ require 'net/http'
3
+ require 'uri'
4
+
1
5
  module ShellCast
2
6
  class Publisher
7
+
8
+ API_URL = 'http://shell.heroku.com'
9
+
10
+ def publish(id)
11
+ uri = URI.parse(API_URL + '/records')
12
+ params = { 'record' => prepare(id) }
13
+ params.merge!({'api_key' => ShellCast.api_key}) if api_key
14
+ res = Net::HTTP.post_form(uri, params)
15
+ res = JSON.parse(res.body)
16
+ if res['ok']
17
+ puts res['message']
18
+ puts API_URL + '/records/' + res['id']
19
+ else
20
+ puts res['message']
21
+ end
22
+ end
23
+
24
+ def api_key
25
+ unless ShellCast.api_key
26
+ print 'Paste your API KEY [or Enter to publish as Anonymous]: '
27
+ key = STDIN.gets.strip
28
+ ShellCast.api_key = key unless key.empty?
29
+ end
30
+ ShellCast.api_key
31
+ end
32
+
33
+ def prepare(id)
34
+ out = {}
35
+ ['meta', 'timing', 'typescript'].each do |file|
36
+ out[file] = File.read(File.join(ShellCast.shellcast_dir(id), file))
37
+ end
38
+ meta = JSON.parse(out.delete('meta'))
39
+ meta.each { |k,v| out[k] = v }
40
+ return out.to_json
41
+ end
3
42
  end
4
43
  end
@@ -1,6 +1,37 @@
1
+ # encoding: utf-8
1
2
  module ShellCast
2
3
  class Recorder
3
4
 
5
+ HEADER = <<-EOH
6
+ █ █
7
+ █████ █
8
+ █ ▓█ █
9
+ █ █ ███ ▓██▒ ███ █▒██▒ ██▓█ ███ █▒██▒ ██▓█
10
+ █ ▒█ ▓▓ ▒█ ▓█ ▓ █▓ ▓█ ██ █ █▓ ▓█ █ █▓ ▒█ █▓ ▓█
11
+ █████ █ █ █░ █ █ █ █ █ █ █ █ █ █
12
+ █ ░█▒ █████ █ █ █ █ █ █ █ █ █ █ █
13
+ █ ░█ █ █░ █ █ █ █ █ █ █ █ █ █
14
+ █ █ ▓▓ █ ▓█ ▓ █▓ ▓█ █ █▓ ▓█ █ █ █ █▓ ▓█ █ █
15
+ █ ▒ ███▒ ▓██▒ ███ █ ██▓█ █████ █ █ ██▒█ █ █
16
+
17
+ ▓ ▒█
18
+ ▒██░
19
+ EOH
20
+
21
+ FOOTER = <<-EOF
22
+ █ █ █ █
23
+ ██████ █ █ █
24
+ █ █ █ █
25
+ █ ███ █▒██▒ ███ ▒███▒ █▒██▒ ███ ██▓█ █
26
+ █ █ █▓ ▒█ █ █▒ ░█ █▓ ▒█ ▓▓ ▒█ █▓ ▓█ █
27
+ ██████ █ █ █ █ █▒░ █ █ █ █ █ █ █
28
+ █ █ █ █ █ ░███▒ █ █ █████ █ █ █
29
+ █ █ █ █ █ ▒█ █ █ █ █ █
30
+ █ █ █ █ █ █░ ▒█ █ █ ▓▓ █ █▓ ▓█ █
31
+ █ █████ █ █ █████ ▒███▒ █ █ ███▒ ██▓█ █
32
+
33
+ EOF
34
+
4
35
  def self.record!
5
36
  new.record!
6
37
  end
@@ -10,32 +41,34 @@ module ShellCast
10
41
  end
11
42
 
12
43
  def record!
13
- FileUtils.mkdir_p(shellcast_dir) unless File.exists?(shellcast_dir)
44
+ test_shellcast_data_dir
14
45
  request_metadata
46
+ puts HEADER.black_on_white
15
47
  puts "Your session started"
16
48
  puts "Type Ctrl+D or exit to finish recording"
17
- puts "-" * 80
18
49
  init_terminal
19
50
  system(script_cmd)
20
51
  restore_terminal
21
- puts "-" * 80
22
- puts "Session finihed!"
23
- puts "Shellcast ID:\t #{shellcast_id}"
24
- puts "Shellcast path:\t #{shellcast_dir}"
52
+ puts FOOTER.black_on_white
53
+ puts "hint $ shellcast play #{shellcast_id}".green
25
54
  end
26
55
 
27
56
  def request_metadata
28
- puts "Provide name for Your shellcast: "
57
+ print "Provide name for Your shellcast: "
29
58
  @meta["title"] = STDIN.gets.strip
30
- @meta["id"] = shellcast_id
59
+ @meta["created_at"] = shellcast_id
31
60
  puts shellcast_file('meta')
32
61
  File.open(shellcast_file('meta'), 'w+') do |meta|
33
- meta.puts @meta.to_yaml
62
+ meta.puts @meta.to_json
34
63
  end
35
64
  end
36
65
 
37
66
  private
38
67
 
68
+ def test_shellcast_data_dir
69
+ FileUtils.mkdir_p(shellcast_dir) unless File.exists?(shellcast_dir)
70
+ end
71
+
39
72
  def init_terminal
40
73
  stty_data = `stty -a`
41
74
  @user_columns = stty_data.match(/columns (\d+)/)[1]
@@ -61,7 +94,7 @@ module ShellCast
61
94
  end
62
95
 
63
96
  def script_cmd
64
- "script -c 'bash' #{shellcast_file('data')} -t 2> #{shellcast_file('timing')}"
97
+ "script -c 'bash' #{shellcast_file('typescript')} -t 2> #{shellcast_file('timing')}"
65
98
  end
66
99
  end
67
100
  end
data/lib/shellcast.rb CHANGED
@@ -1,17 +1,34 @@
1
1
  require 'rubygems'
2
2
  require 'fileutils'
3
+ require 'colored'
3
4
  require 'xdg'
4
5
  require 'yaml'
6
+ require 'json'
5
7
 
6
8
  module ShellCast
7
9
 
8
- APP_NAME = 'shellcast'
9
- DATA_DIR = File.join(XDG::Data.home, APP_NAME)
10
+ APP_NAME = 'shellcast'
11
+ DATA_DIR = File.join(XDG::Data.home, APP_NAME)
12
+ CONFIG_DIR = File.join(XDG::Config.home, APP_NAME)
13
+ API_KEY = File.join(CONFIG_DIR, 'api_key')
10
14
 
11
- def shellcast_dir(shellcast_id)
12
- File.join(ShellCast::DATA_DIR, shellcast_id)
15
+ class << self
16
+ def api_key
17
+ return false unless File.exist?(API_KEY)
18
+ @api_key ||= File.read(API_KEY).strip
19
+ end
20
+
21
+ def api_key=(key)
22
+ FileUtils.mkdir_p(CONFIG_DIR) unless File.exist?(CONFIG_DIR)
23
+ File.open(API_KEY, 'w+') do |f|
24
+ f.puts(key.strip)
25
+ end
26
+ end
27
+
28
+ def shellcast_dir(shellcast_id)
29
+ File.join(ShellCast::DATA_DIR, shellcast_id.to_s)
30
+ end
13
31
  end
14
- module_function :shellcast_dir
15
32
 
16
33
  autoload :Recorder, 'shellcast/recorder.rb'
17
34
  autoload :Player, 'shellcast/player.rb'
@@ -0,0 +1,8 @@
1
+ require 'spec_helper'
2
+
3
+ describe ShellCast::Publisher do
4
+ describe "#publish(id)" do
5
+ it "should publish shellcast with oauth" do
6
+ end
7
+ end
8
+ end
@@ -1,10 +1,41 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe ShellCast::Recorder do
4
+
5
+ before(:each) do
6
+ STDIN.stubs(:gets).returns('my shellcast')
7
+ end
8
+
4
9
  describe "#record!" do
10
+
11
+ before(:each) do
12
+ subject.stubs(:system).with(anything).returns(true)
13
+ end
14
+
15
+ it "should set tty to 80x24" do
16
+ subject.expects("system").with(regexp_matches(/stty columns 80 rows 24/))
17
+ subject.record!
18
+ end
19
+
20
+ it "should restore tty to user defined values" do
21
+ subject.expects(:restore_terminal)
22
+ subject.record!
23
+ end
24
+
5
25
  it "should start script session" do
6
- subject.should_receive("system").with(anything)
26
+ subject.expects("system").with(regexp_matches Regexp.compile("script -c 'bash'"))
7
27
  subject.record!
8
28
  end
9
29
  end
30
+
31
+ describe "#restore_terminal" do
32
+ it "should call tty with saved dimensions" do
33
+ subject.expects(:system).with(
34
+ all_of(regexp_matches(/stty/),
35
+ regexp_matches(/columns/),
36
+ regexp_matches(/rows/))
37
+ )
38
+ subject.send :restore_terminal
39
+ end
40
+ end
10
41
  end
@@ -8,4 +8,8 @@ describe ShellCast do
8
8
  it "should provide XDG and APP_NAME based ::DATA_DIR" do
9
9
  ShellCast::DATA_DIR.should == File.join(XDG::Data.home, ShellCast::APP_NAME)
10
10
  end
11
+
12
+ it "should provide XDG config path" do
13
+ ShellCast::CONFIG_DIR.should == File.join(XDG::Config.home, ShellCast::APP_NAME)
14
+ end
11
15
  end
data/spec/spec_helper.rb CHANGED
@@ -8,5 +8,5 @@ require 'shellcast'
8
8
  Dir["#{File.dirname(__FILE__)}/support/**/*.rb"].each {|f| require f}
9
9
 
10
10
  RSpec.configure do |config|
11
-
11
+ config.mock_with :mocha
12
12
  end
metadata CHANGED
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
5
5
  segments:
6
6
  - 0
7
7
  - 0
8
- - 1
9
- version: 0.0.1
8
+ - 4
9
+ version: 0.0.4
10
10
  platform: ruby
11
11
  authors:
12
12
  - Antono Vasiljev
@@ -14,12 +14,11 @@ autorequire:
14
14
  bindir: bin
15
15
  cert_chain: []
16
16
 
17
- date: 2010-12-06 00:00:00 +02:00
17
+ date: 2010-12-30 00:00:00 +02:00
18
18
  default_executable: shellcast
19
19
  dependencies:
20
20
  - !ruby/object:Gem::Dependency
21
21
  name: xdg
22
- prerelease: false
23
22
  requirement: &id001 !ruby/object:Gem::Requirement
24
23
  none: false
25
24
  requirements:
@@ -29,10 +28,10 @@ dependencies:
29
28
  - 0
30
29
  version: "0"
31
30
  type: :runtime
31
+ prerelease: false
32
32
  version_requirements: *id001
33
33
  - !ruby/object:Gem::Dependency
34
- name: ohai
35
- prerelease: false
34
+ name: colored
36
35
  requirement: &id002 !ruby/object:Gem::Requirement
37
36
  none: false
38
37
  requirements:
@@ -42,55 +41,49 @@ dependencies:
42
41
  - 0
43
42
  version: "0"
44
43
  type: :runtime
44
+ prerelease: false
45
45
  version_requirements: *id002
46
46
  - !ruby/object:Gem::Dependency
47
47
  name: rspec
48
- prerelease: false
49
48
  requirement: &id003 !ruby/object:Gem::Requirement
50
49
  none: false
51
50
  requirements:
52
- - - ~>
51
+ - - ">="
53
52
  - !ruby/object:Gem::Version
54
53
  segments:
55
- - 2
56
- - 1
57
54
  - 0
58
- version: 2.1.0
55
+ version: "0"
59
56
  type: :development
57
+ prerelease: false
60
58
  version_requirements: *id003
61
59
  - !ruby/object:Gem::Dependency
62
- name: bundler
63
- prerelease: false
60
+ name: mocha
64
61
  requirement: &id004 !ruby/object:Gem::Requirement
65
62
  none: false
66
63
  requirements:
67
- - - ~>
64
+ - - ">="
68
65
  - !ruby/object:Gem::Version
69
66
  segments:
70
- - 1
71
- - 0
72
67
  - 0
73
- version: 1.0.0
68
+ version: "0"
74
69
  type: :development
70
+ prerelease: false
75
71
  version_requirements: *id004
76
72
  - !ruby/object:Gem::Dependency
77
- name: jeweler
78
- prerelease: false
73
+ name: bundler
79
74
  requirement: &id005 !ruby/object:Gem::Requirement
80
75
  none: false
81
76
  requirements:
82
- - - ~>
77
+ - - ">="
83
78
  - !ruby/object:Gem::Version
84
79
  segments:
85
- - 1
86
- - 5
87
- - 1
88
- version: 1.5.1
80
+ - 0
81
+ version: "0"
89
82
  type: :development
83
+ prerelease: false
90
84
  version_requirements: *id005
91
85
  - !ruby/object:Gem::Dependency
92
- name: rcov
93
- prerelease: false
86
+ name: jeweler
94
87
  requirement: &id006 !ruby/object:Gem::Requirement
95
88
  none: false
96
89
  requirements:
@@ -100,7 +93,21 @@ dependencies:
100
93
  - 0
101
94
  version: "0"
102
95
  type: :development
96
+ prerelease: false
103
97
  version_requirements: *id006
98
+ - !ruby/object:Gem::Dependency
99
+ name: rcov
100
+ requirement: &id007 !ruby/object:Gem::Requirement
101
+ none: false
102
+ requirements:
103
+ - - ">="
104
+ - !ruby/object:Gem::Version
105
+ segments:
106
+ - 0
107
+ version: "0"
108
+ type: :development
109
+ prerelease: false
110
+ version_requirements: *id007
104
111
  description: Screencast utility for unix shell junkies :)
105
112
  email: antono.vasiljev@gmail.com
106
113
  executables:
@@ -109,15 +116,17 @@ extensions: []
109
116
 
110
117
  extra_rdoc_files:
111
118
  - LICENSE.txt
112
- - README.rdoc
119
+ - README.md
120
+ - TODO
113
121
  files:
114
122
  - .document
115
123
  - .rspec
116
124
  - Gemfile
117
125
  - Gemfile.lock
118
126
  - LICENSE.txt
119
- - README.rdoc
127
+ - README.md
120
128
  - Rakefile
129
+ - TODO
121
130
  - VERSION
122
131
  - bin/shellcast
123
132
  - lib/shellcast.rb
@@ -130,7 +139,7 @@ files:
130
139
  - spec/shellcast_spec.rb
131
140
  - spec/spec_helper.rb
132
141
  has_rdoc: true
133
- homepage: http://github.com/antono/shellcast
142
+ homepage: http://shell.heroku.com/
134
143
  licenses:
135
144
  - GPL
136
145
  post_install_message:
@@ -143,6 +152,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
143
152
  requirements:
144
153
  - - ">="
145
154
  - !ruby/object:Gem::Version
155
+ hash: -466564625
146
156
  segments:
147
157
  - 0
148
158
  version: "0"
@@ -160,7 +170,7 @@ rubyforge_project:
160
170
  rubygems_version: 1.3.7
161
171
  signing_key:
162
172
  specification_version: 3
163
- summary: Record and distribute shellcasts
173
+ summary: Screencasts for Shell Ninjas
164
174
  test_files:
165
175
  - spec/shellcast/player_spec.rb
166
176
  - spec/shellcast/publisher_spec.rb
data/README.rdoc DELETED
@@ -1,19 +0,0 @@
1
- = shellcast
2
-
3
- Description goes here.
4
-
5
- == Contributing to shellcast
6
-
7
- * Check out the latest master to make sure the feature hasn't been implemented or the bug hasn't been fixed yet
8
- * Check out the issue tracker to make sure someone already hasn't requested it and/or contributed it
9
- * Fork the project
10
- * Start a feature/bugfix branch
11
- * Commit and push until you are happy with your contribution
12
- * Make sure to add tests for it. This is important so I don't break it in a future version unintentionally.
13
- * Please try not to mess with the Rakefile, version, or history. If you want to have your own version, or is otherwise necessary, that is fine, but please isolate to its own commit so I can cherry-pick around it.
14
-
15
- == Copyright
16
-
17
- Copyright (c) 2010 Antono Vasiljev. See LICENSE.txt for
18
- further details.
19
-