whipped-cream 0.0.1 → 0.1.0

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.
data/.cane CHANGED
@@ -1,3 +1,2 @@
1
1
  --abc-max 10
2
2
  --color
3
- --gte coverage/.last_run.json,95
data/.gitignore CHANGED
@@ -2,6 +2,7 @@
2
2
  *.rbc
3
3
  .bundle
4
4
  .config
5
+ .vagrant
5
6
  .yardoc
6
7
  Gemfile.lock
7
8
  InstalledFiles
@@ -0,0 +1,10 @@
1
+ # Changelog
2
+
3
+ ## 0.1.0
4
+
5
+ * Support deploying to a Pi with RVM installed (@shobhitic)
6
+ * Vagrant support for testing deployment system
7
+
8
+ ## 0.0.1
9
+
10
+ * Initial release
data/Guardfile CHANGED
@@ -1,4 +1,4 @@
1
- guard :rspec, all_on_start: true, all_after_pass: true, env: { skip_coverage: true } do
1
+ guard :rspec, all_on_start: true, all_after_pass: true do
2
2
  watch(%r{^spec/.+_spec\.rb$})
3
3
  watch(%r{^lib/(.+)\.rb$}) { |m| "spec/lib/#{m[1]}_spec.rb" }
4
4
  watch('spec/spec_helper.rb') { "spec" }
data/README.md CHANGED
@@ -1,34 +1,162 @@
1
- # ![Whipped Cream logo](header.png)
1
+ # Whipped Cream
2
2
 
3
3
  > HTTP topping for [Raspberry Pi](http://www.raspberrypi.org)
4
4
  > [![Gem Version](https://badge.fury.io/rb/whipped-cream.png)](http://badge.fury.io/rb/whipped-cream)
5
5
  > [![Build Status](https://travis-ci.org/justincampbell/whipped-cream.png?branch=master)](https://travis-ci.org/justincampbell/whipped-cream)
6
6
  > [![Code Climate](https://codeclimate.com/github/justincampbell/whipped-cream.png)](https://codeclimate.com/github/justincampbell/whipped-cream)
7
7
 
8
- ## Install
8
+ ![Whipped Cream logo](header.png)
9
+
10
+ Whipped Cream is a tool which does a couple of things:
11
+
12
+ * Parses a simple plugin DSL to create web servers for Raspberry Pi I/O (input
13
+ and output).
14
+ * Creates and tests plugins on your computer.
15
+ * Deploys plugins to your Rapsberry Pis.
16
+
17
+ It has a CLI (command line interface) command which parses a plugin:
18
+
19
+ ```rb
20
+ name "Garage"
21
+
22
+ button "Open/Close", pin: 18
23
+ ```
24
+
25
+ ...and can start a web server:
26
+
27
+ ```
28
+ $ whipped-cream start garage.rb
29
+ ```
30
+
31
+ ![Whipped Cream screenshot](http://f.cl.ly/items/390q221S2g3f041l0d2T/iOS%20Simulator%20Screen%20shot%20Oct%2011,%202013%207.54.56%20AM.png)
32
+
33
+ ...which can be deployed to your Pi:
34
+
35
+ ```bash
36
+ $ whipped-cream deploy garage.rb 192.168.1.123
37
+ ...
38
+ ```
39
+
40
+ ## Getting Started
41
+
42
+ ### Get a Pi
43
+
44
+ You'll need:
45
+
46
+ * Raspberry Pi
47
+ * Power adapter
48
+ * 4GB+ SD Card
49
+
50
+ You might also want:
51
+
52
+ * Solderless breadboard & jumper cables, for prototyping
53
+ * GPIO breakout cable ([Adafruit](http://www.adafruit.com/products/914)), for easily extending the GPIO pins to your breadboard
54
+ * Mini USB wifi adapter, for placing the Pi anywhere in your house when you're done
55
+ * A case for your Raspberry Pi
56
+
57
+ ### Install Ruby on your computer
58
+
59
+ Whipped Cream runs on Ruby 1.9.3 and above.
60
+
61
+ #### Mac
62
+
63
+ We recommend [ruby-install](https://github.com/postmodern/ruby-install) for
64
+ installing Ruby versions, and [chruby](https://github.com/postmodern/chruby)
65
+ for switching between them. [RVM](http://rvm.io) will also work fine.
66
+
67
+ You can also install Ruby 2.0 with [Homebrew](http://brew.sh).
68
+
69
+ #### Windows
70
+
71
+ [RubyInstaller for Windows](http://rubyinstaller.org)
72
+
73
+ #### Linux
74
+
75
+ Most package managers have recent Ruby versions available. Try `sudo apt-get
76
+ install ruby1.9.3` or `sudo yum install ruby1.9.3`. You can also use
77
+ [ruby-install](https://github.com/postmodern/ruby-install) and
78
+ [chruby](https://github.com/postmodern/chruby).
79
+
80
+ ### Install the whipped-cream CLI to your computer
81
+
82
+ That's right, we're still on your computer, not your Raspberry Pi.
9
83
 
10
84
  `gem install whipped-cream`
11
85
 
12
- ## Demo
86
+ ### Check to make sure everything works
87
+
88
+ ```bash
89
+ $ whipped-cream demo
90
+ [2013-10-11 07:59:19] INFO WEBrick 1.3.1
91
+ [2013-10-11 07:59:19] INFO ruby 1.9.3 (2013-06-27) [x86_64-darwin12.4.0]
92
+ [2013-10-11 07:59:19] INFO WEBrick::HTTPServer#start: pid=5351 port=8080
93
+ ```
94
+
95
+ You should now be able to point your browser to
96
+ [http://127.0.0.1:8080](http://127.0.0.1:8080) and see the demo running.
97
+
98
+ ## Creating Plugins
99
+
100
+ Whipped Cream creates a web page which maps HTML controls to GPIO pins.
101
+
102
+ ### Pins
103
+
104
+ You'll want to use the pin numbering from the BCM chip (not the actual pin
105
+ number, and not the WiringPi numbers).
106
+
107
+ ![GPIO pins](http://f.cl.ly/items/1u1u3q1m3e1L333E130N/gpio-pinout-rev2.jpg)
108
+
109
+ from [HobbyTronics](http://www.hobbytronics.co.uk/raspberry-pi-gpio-pinout)
13
110
 
14
- `whipped-cream demo`
111
+ ### Controls
15
112
 
16
- ## DSL
113
+ #### Name
17
114
 
18
- ```garage.rb
115
+ Gets shown at the top of the page.
116
+
117
+ ```rb
19
118
  name "Garage"
119
+ ```
120
+
121
+ #### Switches
122
+
123
+ Toggle a pin on or off.
124
+
125
+ ```rb
126
+ switch "Light", pin: 24
127
+ ```
128
+
129
+ #### Buttons
20
130
 
131
+ Momentarily turn a pin on for 0.25 seconds.
132
+
133
+ ```rb
21
134
  button "Open/Close", pin: 18
135
+ ```
22
136
 
23
- switch "Light", pin: 23
137
+ #### Sensors
24
138
 
25
- sensor "Door", pin: 24, low: "Closed", high: "Open"
139
+ Display something on the web page based on a pin's value.
140
+
141
+ ```rb
142
+ sensor "Door", high: "Closed", low: "Open", pin: 23
26
143
  ```
27
144
 
28
- ## Run a plugin
145
+ Sensors can also be created with a block to show non-pin data.
146
+
147
+ ```rb
148
+ sensor "Pi Uptime" do
149
+ system 'uptime'
150
+ end
151
+ ```
152
+
153
+ ## Testing
154
+
155
+ * Run the tests with `rake`
156
+ * Deploy to a Vagrant box with `rake vagrant:deploy`
29
157
 
30
- `whipped-cream start garage.rb`
158
+ ## Thanks
31
159
 
32
- ## Deploy to a Pi
160
+ Web UI designed by [Ashton Harris](http://ashtonharris.me).
33
161
 
34
- `whipped-cream deploy garage.rb 192.168.1.123`
162
+ Logo designed by [Jeff Bloch](http://www.redbubble.com/people/jabbtees).
data/Rakefile CHANGED
@@ -2,9 +2,22 @@ require "bundler/gem_tasks"
2
2
  require 'cane/rake_task'
3
3
  require 'rspec/core/rake_task'
4
4
 
5
+ ENV['coverage'] = 'true'
6
+
5
7
  task default: :ci
6
8
 
9
+ desc "Run all test suites"
7
10
  task ci: [:spec, :cane]
8
11
 
9
- Cane::RakeTask.new
10
12
  RSpec::Core::RakeTask.new
13
+
14
+ Cane::RakeTask.new do |cane|
15
+ cane.add_threshold 'coverage/.last_run.json', :>=, 90
16
+ end
17
+
18
+ desc "Test deploying the demo plugin to a Vagrant box"
19
+ task :vagrant do
20
+ system 'vagrant destroy -f'
21
+ system 'vagrant up'
22
+ system 'bin/whipped-cream deploy demo.rb 127.0.0.1:2222'
23
+ end
@@ -0,0 +1,16 @@
1
+ Vagrant.configure('2') do |config|
2
+ config.vm.box = 'debian-wheezy'
3
+ config.vm.box_url = 'https://dl.dropboxusercontent.com/u/86066173/debian-wheezy.box'
4
+
5
+ [80].each do |port|
6
+ config.vm.network "forwarded_port", guest: port, host: port
7
+ end
8
+
9
+ config.vm.provision :shell, inline: <<-SCRIPT
10
+ set -x
11
+ adduser --disabled-login pi
12
+ echo -ne "raspberry\nraspberry\n" | passwd pi
13
+ grep -e "^pi " /etc/sudoers ||
14
+ echo "pi ALL=NOPASSWD:ALL" >> /etc/sudoers
15
+ SCRIPT
16
+ end
data/WELCOME CHANGED
@@ -1,5 +1,5 @@
1
1
 
2
- Thanks for installing whipped-cream! Please don't hesitate to report bugs
2
+ Thanks for installing Whipped Cream! Please don't hesitate to report bugs
3
3
  and feature requests at:
4
4
 
5
5
  https://github.com/justincampbell/whipped-cream/issues
@@ -8,3 +8,4 @@ require 'whipped-cream/sensor'
8
8
  require 'whipped-cream/server'
9
9
  require 'whipped-cream/switch'
10
10
  require 'whipped-cream/version'
11
+ require 'whipped-cream/web'
@@ -9,7 +9,7 @@ module WhippedCream
9
9
  desc "usage", "Display usage banner", hide: true
10
10
  def usage
11
11
  puts [
12
- "whipped-cream #{WhippedCream::VERSION}",
12
+ "Whipped Cream #{WhippedCream::VERSION}",
13
13
  "https://github.com/justincampbell/whipped-cream"
14
14
  ].join("\n")
15
15
 
@@ -37,12 +37,14 @@ module WhippedCream
37
37
  method_option :daemonize,
38
38
  type: :boolean,
39
39
  desc: "Run the server in the background"
40
+ method_option :port,
41
+ desc: "Choose a different port to run the server on"
40
42
  def start(plugin_name)
41
43
  plugin_path = resolve_plugin(plugin_name)
42
44
 
43
45
  plugin = Plugin.from_file(plugin_path)
44
- server = Server.new(plugin)
45
- server.start(options)
46
+ server = Server.new(plugin, options)
47
+ server.start
46
48
  end
47
49
 
48
50
  no_tasks do
@@ -26,17 +26,34 @@ module WhippedCream
26
26
  @ssh ||= Net::SSH.start(*connection_arguments)
27
27
  end
28
28
 
29
- private
30
-
31
29
  def connection_arguments
32
- [pi_address, 'pi', { password: 'raspberry' }]
30
+ options = { password: 'raspberry' }
31
+
32
+ ip_address, port = pi_address.split(':')
33
+ options.merge!(port: port) if port
34
+
35
+ [ip_address, 'pi', options]
33
36
  end
34
37
 
38
+ private
39
+
35
40
  def bootstrap
36
41
  ssh_exec <<-SCRIPT
37
- which ruby ||
38
- (time sudo apt-get update &&
39
- time sudo apt-get install ruby1.9.3 -y)
42
+ if [[ -s "$HOME/.rvm/scripts/rvm" ]] ; then
43
+ source "$HOME/.rvm/scripts/rvm"
44
+ alias sudo=rvmsudo
45
+ which ruby ||
46
+ rvm install 1.9.3
47
+ elif [[ -s "/usr/local/rvm/scripts/rvm" ]] ; then
48
+ source "/usr/local/rvm/scripts/rvm"
49
+ alias sudo=rvmsudo
50
+ which ruby ||
51
+ rvm install 1.9.3
52
+ else
53
+ dpkg --status ruby1.9.3 > /dev/null ||
54
+ (time sudo apt-get update &&
55
+ time sudo apt-get install ruby1.9.3 -y)
56
+ fi
40
57
 
41
58
  which whipped-cream ||
42
59
  time sudo gem install whipped-cream --no-ri --no-rdoc --pre
@@ -55,6 +72,13 @@ module WhippedCream
55
72
 
56
73
  def run_plugin
57
74
  ssh_exec <<-SCRIPT
75
+ if [[ -s "$HOME/.rvm/scripts/rvm" ]] ; then
76
+ source "$HOME/.rvm/scripts/rvm"
77
+ alias sudo=rvmsudo
78
+ elif [[ -s "/usr/local/rvm/scripts/rvm" ]] ; then
79
+ source "/usr/local/rvm/scripts/rvm"
80
+ alias sudo=rvmsudo
81
+ fi
58
82
  cd ~/whipped-cream
59
83
  sudo whipped-cream start #{plugin_filename} --daemonize
60
84
  SCRIPT
@@ -44,11 +44,7 @@ module WhippedCream
44
44
  create_pin button, direction: :out
45
45
 
46
46
  define_singleton_method button.id do
47
- pin = pins[button.id]
48
-
49
- pin.on
50
- sleep 0.25
51
- pin.off
47
+ tap_pin(pins[button.id])
52
48
  end
53
49
  end
54
50
  end
@@ -84,9 +80,7 @@ module WhippedCream
84
80
  create_pin switch, direction: :out
85
81
 
86
82
  define_singleton_method switch.id do
87
- pin = pins[switch.id]
88
-
89
- pin.read == 1 ? pin.off : pin.on
83
+ toggle_pin(pins[switch.id])
90
84
  end
91
85
  end
92
86
  end
@@ -98,5 +92,22 @@ module WhippedCream
98
92
 
99
93
  pins[control.id] = PiPiper::Pin.new(options)
100
94
  end
95
+
96
+ def tap_pin(pin)
97
+ pin.on
98
+
99
+ Thread.new {
100
+ sleep 0.25
101
+ pin.off
102
+ }
103
+ end
104
+
105
+ def toggle_pin(pin)
106
+ if pin.read.nonzero?
107
+ pin.off
108
+ else
109
+ pin.on
110
+ end
111
+ end
101
112
  end
102
113
  end
@@ -1,29 +1,26 @@
1
- require 'sinatra'
1
+ require 'rack'
2
2
 
3
3
  module WhippedCream
4
4
  # A server handles building a plugin/runner and starting a web server
5
5
  class Server
6
- attr_reader :plugin
6
+ attr_reader :plugin, :options
7
7
 
8
- def initialize(plugin)
8
+ def initialize(plugin, options = {})
9
9
  @plugin = plugin
10
+ @options = options
10
11
  end
11
12
 
12
- def start(options = {})
13
+ def start
13
14
  ensure_routes_built
14
15
  ensure_runner_started
15
16
 
16
- start_web(options)
17
+ start_web
17
18
  end
18
19
 
19
20
  def runner
20
21
  @runner ||= Runner.create_instance(plugin)
21
22
  end
22
23
 
23
- def port
24
- 8080
25
- end
26
-
27
24
  def web
28
25
  @web ||= Web
29
26
  end
@@ -38,10 +35,16 @@ module WhippedCream
38
35
  @routes_built ||= build_routes || true
39
36
  end
40
37
 
41
- def start_web(options = {})
42
- options = options.merge({ app: web, port: port })
38
+ def rack_options
39
+ {
40
+ app: web,
41
+ Port: options.fetch(:port, 8080),
42
+ daemonize: !!options[:daemonize]
43
+ }
44
+ end
43
45
 
44
- Rack::Server.start options
46
+ def start_web
47
+ Rack::Server.start rack_options
45
48
  end
46
49
 
47
50
  def build_routes
@@ -52,7 +55,7 @@ module WhippedCream
52
55
  def build_button_routes
53
56
  plugin.buttons.each do |button|
54
57
  web.get "/#{button.id}" do
55
- runner.send(button.id)
58
+ runner.send button.id
56
59
  redirect to('/')
57
60
  end
58
61
  end
@@ -61,32 +64,10 @@ module WhippedCream
61
64
  def build_switch_routes
62
65
  plugin.switches.each do |switch|
63
66
  web.get "/#{switch.id}" do
64
- runner.send(switch.id)
67
+ runner.send switch.id
65
68
  redirect to('/')
66
69
  end
67
70
  end
68
71
  end
69
-
70
- # A Sinatra application skeleton that is used to build up the web server
71
- # for this plugin.
72
- class Web < Sinatra::Application
73
- get '/' do
74
- erb :index
75
- end
76
-
77
- private
78
-
79
- def controls
80
- runner.plugin.controls
81
- end
82
-
83
- def runner
84
- Runner.instance
85
- end
86
-
87
- def title
88
- runner.name
89
- end
90
- end
91
72
  end
92
73
  end
@@ -1,3 +1,3 @@
1
1
  module WhippedCream
2
- VERSION = "0.0.1"
2
+ VERSION = "0.1.0"
3
3
  end
@@ -0,0 +1,25 @@
1
+ require 'sinatra'
2
+
3
+ module WhippedCream
4
+ # A Sinatra application skeleton that is used to build up the web server
5
+ # for this plugin.
6
+ class Web < Sinatra::Application
7
+ get '/' do
8
+ erb :index
9
+ end
10
+
11
+ private
12
+
13
+ def controls
14
+ runner.plugin.controls
15
+ end
16
+
17
+ def runner
18
+ Runner.instance
19
+ end
20
+
21
+ def title
22
+ runner.name
23
+ end
24
+ end
25
+ end
@@ -57,13 +57,30 @@ describe WhippedCream::CLI do
57
57
 
58
58
  context "with --daemonize" do
59
59
  it "starts a server in the background" do
60
- expect(WhippedCream::Server).to receive(:new) { server_double }
61
- expect(server_double).to receive(:start).with(daemonize: true)
60
+ expect(WhippedCream::Server).to(
61
+ receive(:new).with { |plugin, options|
62
+ expect(plugin).to be_a(WhippedCream::Plugin)
63
+ expect(options).to eq({ daemonize: true })
64
+ }.and_return(server_double)
65
+ )
66
+ expect(server_double).to receive(:start)
62
67
 
63
68
  cli.options = { daemonize: true }
64
69
  cli.start(plugin_filename)
65
70
  end
66
71
  end
72
+
73
+ context "with --port" do
74
+ it "starts a server on a specific port" do
75
+ expect(WhippedCream::Server).to(
76
+ receive(:new).with(anything, port: 1234).and_return(server_double)
77
+ )
78
+ expect(server_double).to receive(:start)
79
+
80
+ cli.options = { port: 1234 }
81
+ cli.start(plugin_filename)
82
+ end
83
+ end
67
84
  end
68
85
 
69
86
  describe "#usage" do
@@ -19,6 +19,14 @@ describe WhippedCream::Deployer do
19
19
  its(:plugin_filename) { should eq(plugin_filename) }
20
20
  its(:pi_address) { should eq(pi_address) }
21
21
 
22
+ context "with a port" do
23
+ let(:pi_address) { "192.168.0.123:2222" }
24
+
25
+ it "adds a port to the connection arguments" do
26
+ expect(deployer.connection_arguments.last[:port]).to eq("2222")
27
+ end
28
+ end
29
+
22
30
  describe "#scp" do
23
31
  it "tries to connect with pi:raspberry" do
24
32
  expect(Net::SCP).to receive(:start).with(
@@ -33,7 +33,7 @@ describe WhippedCream::Runner do
33
33
  expect(runner).to receive(:sleep).with(0.25)
34
34
  expect(pin).to receive(:off)
35
35
 
36
- runner.open_close
36
+ runner.open_close.join
37
37
  end
38
38
  end
39
39
 
@@ -1,7 +1,7 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe WhippedCream::Server do
4
- subject(:server) { described_class.new(plugin) }
4
+ subject(:server) { described_class.new(plugin, options) }
5
5
 
6
6
  let(:plugin) {
7
7
  WhippedCream::Plugin.build do
@@ -9,6 +9,8 @@ describe WhippedCream::Server do
9
9
  end
10
10
  }
11
11
 
12
+ let(:options) { Hash.new }
13
+
12
14
  before do
13
15
  Rack::Server.stub :start
14
16
  end
@@ -23,30 +25,72 @@ describe WhippedCream::Server do
23
25
  expect(server.runner).to eq(server.runner)
24
26
  end
25
27
 
26
- it "builds up a Sinatra application from a plugin" do
27
- server.start
28
+ context "with a button" do
29
+ let(:plugin) {
30
+ WhippedCream::Plugin.build do
31
+ button "Open/Close", pin: 1
32
+ end
33
+ }
34
+
35
+ before { server.start }
36
+
37
+ it "creates a button route" do
38
+ expect(server.web.routes['GET'].find { |route|
39
+ route.first.match('/open_close')
40
+ }).to be_true
41
+ end
42
+ end
43
+
44
+ context "with a switch" do
45
+ let(:plugin) {
46
+ WhippedCream::Plugin.build do
47
+ switch "Light", pin: 1
48
+ end
49
+ }
50
+
51
+ before { server.start }
28
52
 
29
- expect(
30
- server.web.routes['GET'].find { |route| route.first.match('/open_close') }
31
- ).to be_true
53
+ it "creates a switch route" do
54
+ expect(server.web.routes['GET'].find { |route|
55
+ route.first.match('/light')
56
+ }).to be_true
57
+ end
32
58
  end
33
59
 
34
60
  describe "#start" do
35
61
  it "starts a Rack server" do
36
62
  expect(Rack::Server).to receive(:start).with(
37
- app: WhippedCream::Server::Web, port: 8080
63
+ app: WhippedCream::Web, Port: 8080, daemonize: false
38
64
  )
39
65
 
40
66
  server.start
41
67
  end
42
68
 
43
69
  context "with daemonize: true" do
44
- it "starts the Sinatra application" do
70
+ let(:options) {
71
+ { daemonize: true }
72
+ }
73
+
74
+ it "starts the Rack server daemonized" do
75
+ expect(Rack::Server).to receive(:start).with(
76
+ app: WhippedCream::Web, Port: 8080, daemonize: true
77
+ )
78
+
79
+ server.start
80
+ end
81
+ end
82
+
83
+ context "with port: 1234" do
84
+ let(:options) {
85
+ { port: 1234 }
86
+ }
87
+
88
+ it "starts the Rack server on a specific port" do
45
89
  expect(Rack::Server).to receive(:start).with(
46
- app: WhippedCream::Server::Web, port: 8080, daemonize: true
90
+ app: WhippedCream::Web, Port: 1234, daemonize: false
47
91
  )
48
92
 
49
- server.start(daemonize: true)
93
+ server.start
50
94
  end
51
95
  end
52
96
  end
@@ -4,9 +4,12 @@ $LOAD_PATH.unshift File.expand_path('../../lib', __FILE__)
4
4
 
5
5
  puts RUBY_DESCRIPTION
6
6
 
7
- unless ENV['skip_coverage']
7
+ if ENV['coverage']
8
8
  require 'simplecov'
9
- SimpleCov.start
9
+
10
+ SimpleCov.start do
11
+ add_filter '/spec/'
12
+ end
10
13
  end
11
14
 
12
15
  require 'whipped-cream'
metadata CHANGED
@@ -1,18 +1,20 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: whipped-cream
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.1.0
5
+ prerelease:
5
6
  platform: ruby
6
7
  authors:
7
8
  - Justin Campbell
8
9
  autorequire:
9
10
  bindir: bin
10
11
  cert_chain: []
11
- date: 2013-10-08 00:00:00.000000000 Z
12
+ date: 2013-12-11 00:00:00.000000000 Z
12
13
  dependencies:
13
14
  - !ruby/object:Gem::Dependency
14
15
  name: net-scp
15
16
  requirement: !ruby/object:Gem::Requirement
17
+ none: false
16
18
  requirements:
17
19
  - - ! '>='
18
20
  - !ruby/object:Gem::Version
@@ -20,6 +22,7 @@ dependencies:
20
22
  type: :runtime
21
23
  prerelease: false
22
24
  version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
23
26
  requirements:
24
27
  - - ! '>='
25
28
  - !ruby/object:Gem::Version
@@ -27,6 +30,7 @@ dependencies:
27
30
  - !ruby/object:Gem::Dependency
28
31
  name: net-ssh
29
32
  requirement: !ruby/object:Gem::Requirement
33
+ none: false
30
34
  requirements:
31
35
  - - ! '>='
32
36
  - !ruby/object:Gem::Version
@@ -34,6 +38,7 @@ dependencies:
34
38
  type: :runtime
35
39
  prerelease: false
36
40
  version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
37
42
  requirements:
38
43
  - - ! '>='
39
44
  - !ruby/object:Gem::Version
@@ -41,6 +46,7 @@ dependencies:
41
46
  - !ruby/object:Gem::Dependency
42
47
  name: pi_piper
43
48
  requirement: !ruby/object:Gem::Requirement
49
+ none: false
44
50
  requirements:
45
51
  - - ! '>='
46
52
  - !ruby/object:Gem::Version
@@ -48,6 +54,7 @@ dependencies:
48
54
  type: :runtime
49
55
  prerelease: false
50
56
  version_requirements: !ruby/object:Gem::Requirement
57
+ none: false
51
58
  requirements:
52
59
  - - ! '>='
53
60
  - !ruby/object:Gem::Version
@@ -55,6 +62,7 @@ dependencies:
55
62
  - !ruby/object:Gem::Dependency
56
63
  name: sinatra
57
64
  requirement: !ruby/object:Gem::Requirement
65
+ none: false
58
66
  requirements:
59
67
  - - ! '>='
60
68
  - !ruby/object:Gem::Version
@@ -62,6 +70,7 @@ dependencies:
62
70
  type: :runtime
63
71
  prerelease: false
64
72
  version_requirements: !ruby/object:Gem::Requirement
73
+ none: false
65
74
  requirements:
66
75
  - - ! '>='
67
76
  - !ruby/object:Gem::Version
@@ -69,6 +78,7 @@ dependencies:
69
78
  - !ruby/object:Gem::Dependency
70
79
  name: thor
71
80
  requirement: !ruby/object:Gem::Requirement
81
+ none: false
72
82
  requirements:
73
83
  - - ! '>='
74
84
  - !ruby/object:Gem::Version
@@ -76,6 +86,7 @@ dependencies:
76
86
  type: :runtime
77
87
  prerelease: false
78
88
  version_requirements: !ruby/object:Gem::Requirement
89
+ none: false
79
90
  requirements:
80
91
  - - ! '>='
81
92
  - !ruby/object:Gem::Version
@@ -83,6 +94,7 @@ dependencies:
83
94
  - !ruby/object:Gem::Dependency
84
95
  name: bundler
85
96
  requirement: !ruby/object:Gem::Requirement
97
+ none: false
86
98
  requirements:
87
99
  - - ~>
88
100
  - !ruby/object:Gem::Version
@@ -90,6 +102,7 @@ dependencies:
90
102
  type: :development
91
103
  prerelease: false
92
104
  version_requirements: !ruby/object:Gem::Requirement
105
+ none: false
93
106
  requirements:
94
107
  - - ~>
95
108
  - !ruby/object:Gem::Version
@@ -97,6 +110,7 @@ dependencies:
97
110
  - !ruby/object:Gem::Dependency
98
111
  name: cane
99
112
  requirement: !ruby/object:Gem::Requirement
113
+ none: false
100
114
  requirements:
101
115
  - - ! '>='
102
116
  - !ruby/object:Gem::Version
@@ -104,6 +118,7 @@ dependencies:
104
118
  type: :development
105
119
  prerelease: false
106
120
  version_requirements: !ruby/object:Gem::Requirement
121
+ none: false
107
122
  requirements:
108
123
  - - ! '>='
109
124
  - !ruby/object:Gem::Version
@@ -111,6 +126,7 @@ dependencies:
111
126
  - !ruby/object:Gem::Dependency
112
127
  name: rake
113
128
  requirement: !ruby/object:Gem::Requirement
129
+ none: false
114
130
  requirements:
115
131
  - - ! '>='
116
132
  - !ruby/object:Gem::Version
@@ -118,6 +134,7 @@ dependencies:
118
134
  type: :development
119
135
  prerelease: false
120
136
  version_requirements: !ruby/object:Gem::Requirement
137
+ none: false
121
138
  requirements:
122
139
  - - ! '>='
123
140
  - !ruby/object:Gem::Version
@@ -125,6 +142,7 @@ dependencies:
125
142
  - !ruby/object:Gem::Dependency
126
143
  name: rspec
127
144
  requirement: !ruby/object:Gem::Requirement
145
+ none: false
128
146
  requirements:
129
147
  - - ! '>='
130
148
  - !ruby/object:Gem::Version
@@ -132,6 +150,7 @@ dependencies:
132
150
  type: :development
133
151
  prerelease: false
134
152
  version_requirements: !ruby/object:Gem::Requirement
153
+ none: false
135
154
  requirements:
136
155
  - - ! '>='
137
156
  - !ruby/object:Gem::Version
@@ -139,6 +158,7 @@ dependencies:
139
158
  - !ruby/object:Gem::Dependency
140
159
  name: simplecov
141
160
  requirement: !ruby/object:Gem::Requirement
161
+ none: false
142
162
  requirements:
143
163
  - - ! '>='
144
164
  - !ruby/object:Gem::Version
@@ -146,6 +166,7 @@ dependencies:
146
166
  type: :development
147
167
  prerelease: false
148
168
  version_requirements: !ruby/object:Gem::Requirement
169
+ none: false
149
170
  requirements:
150
171
  - - ! '>='
151
172
  - !ruby/object:Gem::Version
@@ -163,11 +184,13 @@ files:
163
184
  - .rspec
164
185
  - .ruby-version
165
186
  - .travis.yml
187
+ - CHANGELOG.md
166
188
  - Gemfile
167
189
  - Guardfile
168
190
  - LICENSE.txt
169
191
  - README.md
170
192
  - Rakefile
193
+ - Vagrantfile
171
194
  - WELCOME
172
195
  - bin/whipped-cream
173
196
  - demo.rb
@@ -196,6 +219,7 @@ files:
196
219
  - lib/whipped-cream/views/layout.erb
197
220
  - lib/whipped-cream/views/sensor.erb
198
221
  - lib/whipped-cream/views/switch.erb
222
+ - lib/whipped-cream/web.rb
199
223
  - logo.png
200
224
  - spec/lib/whipped-cream/builder_spec.rb
201
225
  - spec/lib/whipped-cream/button_spec.rb
@@ -212,8 +236,7 @@ files:
212
236
  homepage: https://github.com/justincampbell/whipped-cream
213
237
  licenses:
214
238
  - MIT
215
- metadata: {}
216
- post_install_message: ! "\n Thanks for installing whipped-cream! Please don't hesitate
239
+ post_install_message: ! "\n Thanks for installing Whipped Cream! Please don't hesitate
217
240
  to report bugs\n and feature requests at:\n\n https://github.com/justincampbell/whipped-cream/issues\n\n
218
241
  \ To run a demo, just do:\n\n whipped-cream demo\n\n Or use the help command
219
242
  to see more options:\n\n whipped-cream help\n\n"
@@ -221,20 +244,22 @@ rdoc_options: []
221
244
  require_paths:
222
245
  - lib
223
246
  required_ruby_version: !ruby/object:Gem::Requirement
247
+ none: false
224
248
  requirements:
225
249
  - - ! '>='
226
250
  - !ruby/object:Gem::Version
227
251
  version: 1.9.3
228
252
  required_rubygems_version: !ruby/object:Gem::Requirement
253
+ none: false
229
254
  requirements:
230
255
  - - ! '>='
231
256
  - !ruby/object:Gem::Version
232
257
  version: '0'
233
258
  requirements: []
234
259
  rubyforge_project:
235
- rubygems_version: 2.1.5
260
+ rubygems_version: 1.8.23
236
261
  signing_key:
237
- specification_version: 4
262
+ specification_version: 3
238
263
  summary: HTTP topping for Raspberry Pi
239
264
  test_files:
240
265
  - spec/lib/whipped-cream/builder_spec.rb
checksums.yaml DELETED
@@ -1,15 +0,0 @@
1
- ---
2
- !binary "U0hBMQ==":
3
- metadata.gz: !binary |-
4
- MDE1Y2YxNDMyODczMjA0MjBlZjBlNDExYjQ1ZmY2NzM2N2Y4YTExMg==
5
- data.tar.gz: !binary |-
6
- OTNlYjhkMGM4ODI2ZjRkYmIzNWQ2MDhhZmEyZDliNTJmZGM3YTYwZg==
7
- SHA512:
8
- metadata.gz: !binary |-
9
- NDdkOTYyYTNmYTA1NDQxODA5N2VmOTEwMTQwOTVmNWNiZjU4YThmNWIwNWQ3
10
- NGIzZGEzNjZlNmRmYjI0NDlkNDkwYzNiODYyNzIwNTQwNGI5ZjljY2ZhNmU1
11
- MmU5NDY3YWM5MDMxMTdkNzQ4ZWRkN2U3OGY0NDJmZmFmOGMyYTI=
12
- data.tar.gz: !binary |-
13
- YmU2ZGY0Mzk2YTdkM2U3OTBiOTRmNGI3NjBkNzFiMGNjNTZmZGMyZGQ3ZmFj
14
- Y2FjZmNkNmFhNWUzZGViZmQyYzBmNWIwNzM5NGNiOTBjNGYwOThiMWNlYmJi
15
- OTE1OWFiZjk0ZTJmOTgzZmViYTg5MDg2MmYzY2U2NTc5OTk3NzY=