stuffed 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
data/Gemfile ADDED
@@ -0,0 +1,2 @@
1
+ source 'https://rubygems.org'
2
+ gemspec
@@ -0,0 +1,10 @@
1
+ require 'bundler'
2
+ Bundler::GemHelper.install_tasks
3
+
4
+ desc "Build the project"
5
+ task :default => 'test'
6
+
7
+ desc "Run tests"
8
+ task :test do
9
+ sh "bundle exec rspec"
10
+ end
@@ -0,0 +1,5 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'stuffed/cli'
4
+
5
+ Stuffed::CLI.new.parse
@@ -0,0 +1,6 @@
1
+ $: << File.dirname(__FILE__)
2
+
3
+ module Stuffed
4
+ end
5
+
6
+ require 'stuffed/stuff'
@@ -0,0 +1,105 @@
1
+ require 'stuffed'
2
+
3
+ module Stuffed
4
+ class CLI
5
+
6
+ attr_accessor :out, :args, :hosts_path
7
+
8
+ def initialize(out = STDOUT, hosts_path = "/etc/hosts")
9
+ @out = out
10
+ @hosts_path = hosts_path
11
+ end
12
+
13
+ def parse(args = ARGV)
14
+ @args = args
15
+ command = @args[0]
16
+ case command
17
+ when "add"
18
+ add
19
+ when "remove"
20
+ remove
21
+ when "list"
22
+ list
23
+ when "on"
24
+ on
25
+ when "off"
26
+ off
27
+ else
28
+ out.puts <<-eos
29
+ USAGE: stuffed <task>
30
+
31
+ The stuffed tasks are:
32
+ add <site> Add a site to the block list
33
+ remove <site> Remove a site from the block list
34
+ list List all sites being blocked
35
+ on Toggle blocking on
36
+ off Toggle blocking off
37
+ eos
38
+ end
39
+ end
40
+
41
+ def add
42
+ if @args[1]
43
+
44
+ begin
45
+ backup_hosts_file
46
+ Stuffed::Stuff.new(@hosts_path).add(@args[1])
47
+ out.puts "Successfully added #{@args[1]}"
48
+ rescue Errno::EACCES
49
+ out.puts "Use 'sudo stuffed <task>'"
50
+ rescue Exception => e
51
+ out.puts e.message
52
+ end
53
+
54
+ else
55
+ out.puts "Which site do you want to add to the blocked list"
56
+ end
57
+ end
58
+
59
+ def remove
60
+ if @args[1]
61
+
62
+ begin
63
+ backup_hosts_file
64
+ Stuffed::Stuff.new(@hosts_path).remove(@args[1])
65
+ out.puts "Successfully removed #{@args[1]}."
66
+ rescue Errno::EACCES
67
+ out.puts "Use 'sudo stuffed <task>'"
68
+ rescue Exception => e
69
+ out.puts e.message
70
+ end
71
+
72
+ else
73
+ out.puts "Which site do you want to remove from the blocked list"
74
+ end
75
+ end
76
+
77
+ def list
78
+ out.puts Stuffed::Stuff.new(@hosts_path).list
79
+ end
80
+
81
+ def on
82
+ backup_hosts_file
83
+ Stuffed::Stuff.new(@hosts_path).on
84
+ out.puts "Sites are now being stuffed."
85
+ rescue Errno::EACCES
86
+ out.puts "Use 'sudo stuffed <task>'"
87
+ end
88
+
89
+ def off
90
+ backup_hosts_file
91
+ Stuffed::Stuff.new(@hosts_path).off
92
+ out.puts "Blocking has been temporarily turned off."
93
+ rescue Errno::EACCES
94
+ out.puts "Use 'sudo stuffed <task>'"
95
+ end
96
+
97
+ def backup_hosts_file
98
+ backup_path = @hosts_path + ".backup"
99
+ if !File.exists?(backup_path)
100
+ hosts_data = File.read(@hosts_path)
101
+ File.open(backup_path, "w") {|file| file.write hosts_data}
102
+ end
103
+ end
104
+ end
105
+ end
@@ -0,0 +1,230 @@
1
+ require 'tempfile'
2
+
3
+ module Stuffed
4
+ class Stuff
5
+
6
+ attr_accessor :hosts_path
7
+
8
+ def initialize(hosts_path = "/etc/hosts")
9
+ @hosts_path = hosts_path
10
+ @on_state = is_stuffed_on?
11
+ end
12
+
13
+ def add(site)
14
+
15
+ raise "#{site} is already being blocked." if already_blocked site
16
+
17
+ s1, s2 = site_variations site
18
+
19
+ add_block_section if !has_block_list?
20
+
21
+ insert_sites_into_block_list s1, s2
22
+
23
+ flush
24
+ end
25
+
26
+ def remove(site)
27
+
28
+ raise "#{site} is not currently being blocked." if !already_blocked(site) || !has_block_list?
29
+
30
+ s1, s2 = site_variations(site)
31
+
32
+ remove_sites_from_block_list s1, s2
33
+
34
+ remove_block_section if stuffed_section_empty?
35
+
36
+ flush
37
+ end
38
+
39
+ def list
40
+ if stuffed_section_empty?
41
+ "You aren't currently blocking any sites."
42
+ else
43
+ sites = get_block_list.split("\n")
44
+
45
+ address = @on_state ? "# 127.0.0.1 " : "127.0.0.1 "
46
+
47
+ sites.map! do |site|
48
+ site.sub address, ""
49
+ end
50
+
51
+ "Blocked sites:\n" + sites.join("\n") + "\n"
52
+ end
53
+ end
54
+
55
+ def on
56
+ if !stuffed_section_empty?
57
+ block_list = get_block_list
58
+ block_list.gsub! /# /, ""
59
+ rewrite_block_list block_list
60
+
61
+ flush
62
+ end
63
+ end
64
+
65
+ def off
66
+ if @on_state || !stuffed_section_empty?
67
+ block_list = get_block_list
68
+ sites = block_list.split "\n"
69
+ sites.map! do |site|
70
+ site.include?("#") ? site : "# " + site
71
+ end
72
+
73
+ rewrite_block_list(sites.join("\n") + "\n")
74
+
75
+ flush
76
+ end
77
+ end
78
+
79
+ def flush
80
+ if os_is_mac?
81
+ if os_is_lion_or_greater?
82
+ system( "killall -HUP mDNSResponder" )
83
+ else
84
+ system( "dscacheutil -flushcache" )
85
+ end
86
+ end
87
+ end
88
+
89
+ private
90
+
91
+ def already_blocked(site)
92
+ hosts_file_contains? site
93
+ end
94
+
95
+ def site_variations(site)
96
+ s1 = site
97
+ s2 = is_www(site) ? rm_www(site) : add_www(site)
98
+ [s1, s2]
99
+ end
100
+
101
+ def is_www(site)
102
+ site =~ /www./
103
+ end
104
+
105
+ def add_www(site)
106
+ "www." + site
107
+ end
108
+
109
+ def rm_www(site)
110
+ site.gsub "www.", ""
111
+ end
112
+
113
+ def has_block_list?
114
+ hosts_file_contains? "# Stuffed Section"
115
+ end
116
+
117
+ def hosts_file_contains?(string)
118
+ open(@hosts_path).grep(Regexp.new string).length > 0
119
+ end
120
+
121
+ def add_block_section
122
+ file = File.open(@hosts_path, "a")
123
+ file.puts ""
124
+ file.puts "# Stuffed Section"
125
+ file.puts "# End Stuffed Section"
126
+ file.close
127
+ end
128
+
129
+ def remove_block_section
130
+ top = get_top_text
131
+ top.sub! "# Stuffed Section\n", ""
132
+ bottom = get_bottom_text
133
+ bottom.sub! "# End Stuffed Section\n", ""
134
+
135
+ File.open(@hosts_path, "w") do |file|
136
+ file.write top
137
+ file.write bottom
138
+ end
139
+ end
140
+
141
+ def insert_sites_into_block_list(s1, s2)
142
+ address = @on_state ? "# 127.0.0.1 " : "127.0.0.1 "
143
+ add_to_block_list(address + s1 + "\n")
144
+ add_to_block_list(address + s2 + "\n")
145
+ end
146
+
147
+ def is_stuffed_on?
148
+ if has_block_list?
149
+ get_block_list.include? "#"
150
+ end
151
+ end
152
+
153
+ def remove_sites_from_block_list(s1, s2)
154
+ block_list = get_block_list
155
+ address = @on_state ? "# 127.0.0.1 " : "127.0.0.1 "
156
+ remove_from_block_list(address + s1 + "\n")
157
+ remove_from_block_list(address + s2 + "\n")
158
+ end
159
+
160
+ def add_to_block_list(string)
161
+ block_list = get_block_list
162
+ block_list += string
163
+ rewrite_block_list block_list
164
+ end
165
+
166
+ def remove_from_block_list(string)
167
+ block_list = get_block_list
168
+ block_list.sub! string, ""
169
+ rewrite_block_list block_list
170
+ end
171
+
172
+ def get_top_text
173
+ text = File.read(@hosts_path)
174
+ if toptext = text.match(/.*# Stuffed Section\n/m)
175
+ toptext[0]
176
+ else
177
+ ""
178
+ end
179
+ end
180
+
181
+ def get_bottom_text
182
+ text = File.read(@hosts_path)
183
+ if toptext = text.match(/# End Stuffed Section\n.*/m)
184
+ toptext[0]
185
+ else
186
+ ""
187
+ end
188
+ end
189
+
190
+ def get_block_list
191
+ text = File.read(@hosts_path)
192
+ text.gsub! /.*# Stuffed Section\n/m, ""
193
+ text.gsub! /# End Stuffed Section\n.*/m, ""
194
+ text
195
+ end
196
+
197
+ def rewrite_block_list(string)
198
+ top_text = get_top_text
199
+ bottom_text = get_bottom_text
200
+ File.open(@hosts_path, "w") do |file|
201
+ file.write top_text
202
+ file.write string
203
+ file.write bottom_text
204
+ end
205
+ end
206
+
207
+ def line_includes_sites?(line, *args)
208
+ args.each do |a|
209
+ return true if line.include? a
210
+ end
211
+ return false
212
+ end
213
+
214
+ def stuffed_section_empty?
215
+ block_list = get_block_list
216
+ block_list.strip!
217
+ block_list.empty?
218
+ end
219
+
220
+ def os_is_mac?
221
+ RUBY_PLATFORM.match(/darwin/) ? true : false
222
+ end
223
+
224
+ def os_is_lion_or_greater?
225
+ version = RUBY_PLATFORM.match(/darwin(.*)/)[1]
226
+ major_version = version.split(".")[0]
227
+ major_version.to_i >= 11
228
+ end
229
+ end
230
+ end
@@ -0,0 +1,160 @@
1
+ require 'stuffed/cli'
2
+ require 'spec_helper'
3
+
4
+ describe Stuffed::CLI do
5
+ include StuffedSpecHelpers
6
+
7
+ before(:each) do
8
+ @tempfile = Tempfile.new('hosts')
9
+ @tempfile.close
10
+ end
11
+
12
+ after(:each) do
13
+ @tempfile.unlink
14
+ end
15
+
16
+ it "displays usage info if no command is passed" do
17
+
18
+ stuffed("", @tempfile.path).should == <<-eos
19
+ USAGE: stuffed <task>
20
+
21
+ The stuffed tasks are:
22
+ add <site> Add a site to the block list
23
+ remove <site> Remove a site from the block list
24
+ list List all sites being blocked
25
+ on Toggle blocking on
26
+ off Toggle blocking off
27
+ eos
28
+ end
29
+
30
+ describe "#add" do
31
+
32
+ it "gives an error if no command is passed" do
33
+
34
+ stuffed("add", @tempfile.path).should == "Which site do you want to add to the blocked list\n"
35
+
36
+ end
37
+
38
+ it "tells you the site got added" do
39
+
40
+ stuffed("add alexmarchant.com", @tempfile.path).should == "Successfully added alexmarchant.com\n"
41
+
42
+ end
43
+
44
+ it "tells you if the site already added" do
45
+
46
+ stuffed("add alexmarchant.com", @tempfile.path)
47
+ stuffed("add alexmarchant.com", @tempfile.path).should == "alexmarchant.com is already being blocked.\n"
48
+
49
+ end
50
+
51
+ it "tells the user to use sudo if priveledges are insufficient to modify hosts" do
52
+
53
+ File.chmod 0007, @tempfile
54
+
55
+ stuffed("add alexmarchant.com", @tempfile.path).should == "Use 'sudo stuffed <task>'\n"
56
+
57
+ end
58
+ end
59
+
60
+ describe "#remove" do
61
+
62
+ it "gives an error if no command is passed" do
63
+
64
+ stuffed("remove", @tempfile.path).should == "Which site do you want to remove from the blocked list\n"
65
+
66
+ end
67
+
68
+ it "tells you the site got removed" do
69
+
70
+ stuffed("add alexmarchant.com", @tempfile.path)
71
+ stuffed("remove alexmarchant.com", @tempfile.path).should == "Successfully removed alexmarchant.com.\n"
72
+
73
+ end
74
+
75
+ it "tells you if the site is not available to remove" do
76
+
77
+ stuffed("remove alexmarchant.com", @tempfile.path).should == "alexmarchant.com is not currently being blocked.\n"
78
+
79
+ end
80
+
81
+ it "tells the user to use sudo if priveledges are insufficient to modify hosts" do
82
+
83
+ File.chmod 0007, @tempfile
84
+
85
+ stuffed("remove alexmarchant.com", @tempfile.path).should == "Use 'sudo stuffed <task>'\n"
86
+
87
+ end
88
+ end
89
+
90
+ describe "#list" do
91
+
92
+ it "lists all blocked sites" do
93
+
94
+ stuffed("add alexmarchant.com", @tempfile.path)
95
+ stuffed("list", @tempfile.path).should == "Blocked sites:\nalexmarchant.com\nwww.alexmarchant.com\n"
96
+
97
+ end
98
+
99
+ context "when the list is empty" do
100
+
101
+ it "says the list is empty" do
102
+
103
+ stuffed("list", @tempfile.path).should == "You aren't currently blocking any sites.\n"
104
+
105
+ end
106
+ end
107
+ end
108
+
109
+ describe "#on" do
110
+
111
+ it "gives feedback" do
112
+
113
+ stuffed("on", @tempfile.path).should == "Sites are now being stuffed.\n"
114
+
115
+ end
116
+
117
+ it "tells the user to use sudo if priveledges are insufficient to modify hosts" do
118
+
119
+ File.chmod 0007, @tempfile
120
+
121
+ stuffed("remove alexmarchant.com", @tempfile.path).should == "Use 'sudo stuffed <task>'\n"
122
+
123
+ end
124
+ end
125
+
126
+ describe "#off" do
127
+
128
+ it "gives a status message" do
129
+
130
+ stuffed("off", @tempfile.path).should == "Blocking has been temporarily turned off.\n"
131
+
132
+ end
133
+
134
+ it "tells the user to use sudo if priveledges are insufficient to modify hosts" do
135
+
136
+ File.chmod 0007, @tempfile
137
+
138
+ stuffed("remove alexmarchant.com", @tempfile.path).should == "Use 'sudo stuffed <task>'\n"
139
+
140
+ end
141
+ end
142
+
143
+ describe "#backup_hosts_file" do
144
+
145
+ it "backs up the hosts file if a backup doesn't exist" do
146
+
147
+
148
+ @tempfile.open
149
+ @tempfile.puts "Orignial hosts file"
150
+ @tempfile.puts "test data"
151
+ @tempfile.close
152
+ hosts_data = File.read(@tempfile)
153
+
154
+ backup_path = @tempfile.path + ".backup"
155
+ stuffed("add alexmarchant.com", @tempfile.path)
156
+ File.read(backup_path).should == hosts_data
157
+
158
+ end
159
+ end
160
+ end
@@ -0,0 +1,23 @@
1
+ $:.unshift File.join(File.dirname(__FILE__), 'lib', )
2
+
3
+ require 'rubygems'
4
+ require 'rspec'
5
+ require 'pry'
6
+
7
+ module StuffedSpecHelpers
8
+ def stuffed(args, hosts_path)
9
+ out = StringIO.new
10
+ Stuffed::CLI.new(out, hosts_path).parse(args.split(/\s+/))
11
+ out.rewind
12
+ out.read
13
+ rescue SystemExit
14
+ out.rewind
15
+ out.read
16
+ end
17
+ end
18
+
19
+ module Kernel
20
+ def system(cmd)
21
+ "call #{cmd}"
22
+ end
23
+ end
@@ -0,0 +1,231 @@
1
+ require 'stuffed/stuff'
2
+ require 'spec_helper'
3
+ require 'tempfile'
4
+
5
+ describe Stuffed::Stuff do
6
+
7
+ before(:each) do
8
+ @tempfile = Tempfile.new('hosts')
9
+ @tempfile.close
10
+ end
11
+
12
+ after(:each) do
13
+ @tempfile.unlink
14
+ end
15
+
16
+ describe "#add" do
17
+
18
+ it "adds the site to the hosts file" do
19
+
20
+ Stuffed::Stuff.new(@tempfile.path).add("alexmarchant.com")
21
+ @tempfile.open.grep(/alexmarchant.com/).length.should > 0
22
+
23
+ end
24
+
25
+ it "adds the corresponding www/no-www site to the hosts file" do
26
+
27
+ Stuffed::Stuff.new(@tempfile.path).add("alexmarchant.com")
28
+ @tempfile.open.grep(/www.alexmarchant.com/).length.should > 0
29
+
30
+ end
31
+
32
+ context "when this entry already exists" do
33
+
34
+ it "raises an exception" do
35
+
36
+ Stuffed::Stuff.new(@tempfile.path).add("alexmarchant.com")
37
+ lambda{Stuffed::Stuff.new(@tempfile.path).add("alexmarchant.com")}.should raise_error(RuntimeError, 'alexmarchant.com is already being blocked.')
38
+
39
+ end
40
+ end
41
+
42
+ context "when the stuffed section does not exist" do
43
+
44
+ it "creates a stuffed section" do
45
+
46
+ Stuffed::Stuff.new(@tempfile.path).add("alexmarchant.com")
47
+ @tempfile.open.grep(/# Stuffed Section/).length.should > 0
48
+
49
+ end
50
+ end
51
+
52
+ context "when stuffed is off" do
53
+
54
+ it "comments out sites before adding them" do
55
+
56
+ @tempfile.open
57
+ @tempfile.puts "# Stuffed Section"
58
+ @tempfile.puts "# 127.0.0.1 alexmarchant.com"
59
+ @tempfile.puts "# 127.0.0.1 www.alexmarchant.com"
60
+ @tempfile.puts "# End Stuffed Section"
61
+ @tempfile.close
62
+
63
+ Stuffed::Stuff.new(@tempfile.path).add("facebook.com")
64
+ @tempfile.open.grep(/facebook\.com/)[0].should == "# 127.0.0.1 facebook.com\n"
65
+
66
+ end
67
+ end
68
+ end
69
+
70
+
71
+ describe "#remove" do
72
+
73
+ it "removes the site from the hosts file" do
74
+
75
+ @tempfile.open
76
+ @tempfile.puts "# Stuffed Section"
77
+ @tempfile.puts "127.0.0.1 alexmarchant.com"
78
+ @tempfile.puts "127.0.0.1 www.alexmarchant.com"
79
+ @tempfile.puts "# End Stuffed Section"
80
+ @tempfile.close
81
+
82
+ Stuffed::Stuff.new(@tempfile.path).remove("alexmarchant.com")
83
+ open(@tempfile).grep(/alexmarchant.com/).length.should == 0
84
+
85
+ end
86
+
87
+ it "removes the corresponding www/no-www site to the hosts file" do
88
+
89
+ @tempfile.open
90
+ @tempfile.puts "# Stuffed Section"
91
+ @tempfile.puts "# 127.0.0.1 alexmarchant.com"
92
+ @tempfile.puts "# 127.0.0.1 www.alexmarchant.com"
93
+ @tempfile.puts "# End Stuffed Section"
94
+ @tempfile.close
95
+
96
+ Stuffed::Stuff.new(@tempfile.path).remove("alexmarchant.com")
97
+ open(@tempfile).grep(/www.alexmarchant.com/).length.should == 0
98
+
99
+ end
100
+
101
+ it "only removes the site from the stuffed section" do
102
+
103
+ @tempfile.open
104
+ @tempfile.puts "127.0.0.1 alexmarchant.com"
105
+ @tempfile.puts "127.0.0.1 www.alexmarchant.com"
106
+ @tempfile.close
107
+
108
+ lambda{Stuffed::Stuff.new(@tempfile.path).remove("alexmarchant.com")}.should raise_error(RuntimeError, 'alexmarchant.com is not currently being blocked.')
109
+
110
+ end
111
+
112
+ context "when this entry does not exist" do
113
+
114
+ it "raises an exception" do
115
+
116
+ lambda{Stuffed::Stuff.new(@tempfile.path).remove("alexmarchant.com")}.should raise_error(RuntimeError, 'alexmarchant.com is not currently being blocked.')
117
+
118
+ end
119
+ end
120
+
121
+ context "when the stuffed section exist and we removed the last entry" do
122
+
123
+ it "removes the stuffed section" do
124
+
125
+ @tempfile.open
126
+ @tempfile.puts "# Stuffed Section"
127
+ @tempfile.puts "127.0.0.1 alexmarchant.com"
128
+ @tempfile.puts "127.0.0.1 www.alexmarchant.com"
129
+ @tempfile.puts "# End Stuffed Section"
130
+ @tempfile.close
131
+
132
+ Stuffed::Stuff.new(@tempfile.path).remove("alexmarchant.com")
133
+ open(@tempfile).grep(/# Stuffed Section/).length.should == 0
134
+ open(@tempfile).grep(/# End Stuffed Section/).length.should == 0
135
+
136
+ end
137
+ end
138
+ end
139
+
140
+ describe "#list" do
141
+
142
+ it "lists all blocked sites" do
143
+
144
+ @tempfile.open
145
+ @tempfile.puts "# Stuffed Section"
146
+ @tempfile.puts "127.0.0.1 alexmarchant.com"
147
+ @tempfile.puts "127.0.0.1 www.alexmarchant.com"
148
+ @tempfile.puts "# End Stuffed Section"
149
+ @tempfile.close
150
+
151
+ list = Stuffed::Stuff.new(@tempfile.path).list
152
+ list.should == "Blocked sites:\nalexmarchant.com\nwww.alexmarchant.com\n"
153
+
154
+ @tempfile.unlink
155
+ end
156
+ end
157
+
158
+ describe "#on" do
159
+
160
+ it "uncomments blocked sites" do
161
+
162
+ @tempfile.open
163
+ @tempfile.puts "# Stuffed Section"
164
+ @tempfile.puts "# 127.0.0.1 alexmarchant.com"
165
+ @tempfile.puts "# 127.0.0.1 www.alexmarchant.com"
166
+ @tempfile.puts "# End Stuffed Section"
167
+ @tempfile.close
168
+
169
+ Stuffed::Stuff.new(@tempfile.path).on
170
+ open(@tempfile).read.should == "# Stuffed Section\n127.0.0.1 alexmarchant.com\n127.0.0.1 www.alexmarchant.com\n# End Stuffed Section\n"
171
+
172
+ end
173
+ end
174
+
175
+ describe "#off" do
176
+
177
+ it "comments out blocked sites" do
178
+
179
+ @tempfile.open
180
+ @tempfile.puts "# Stuffed Section"
181
+ @tempfile.puts "127.0.0.1 alexmarchant.com"
182
+ @tempfile.puts "127.0.0.1 www.alexmarchant.com"
183
+ @tempfile.puts "# End Stuffed Section"
184
+ @tempfile.close
185
+
186
+ Stuffed::Stuff.new(@tempfile.path).off
187
+ open(@tempfile).read.should == "# Stuffed Section\n# 127.0.0.1 alexmarchant.com\n# 127.0.0.1 www.alexmarchant.com\n# End Stuffed Section\n"
188
+
189
+ end
190
+
191
+ it "doesn't comment out lines a second time" do
192
+
193
+ @tempfile.open
194
+ @tempfile.puts "# Stuffed Section"
195
+ @tempfile.puts "# 127.0.0.1 alexmarchant.com"
196
+ @tempfile.puts "# 127.0.0.1 www.alexmarchant.com"
197
+ @tempfile.puts "# End Stuffed Section"
198
+ @tempfile.close
199
+
200
+ Stuffed::Stuff.new(@tempfile.path).off
201
+ open(@tempfile).read.should == "# Stuffed Section\n# 127.0.0.1 alexmarchant.com\n# 127.0.0.1 www.alexmarchant.com\n# End Stuffed Section\n"
202
+
203
+ end
204
+ end
205
+
206
+ describe "#flush" do
207
+
208
+ context "on mac" do
209
+
210
+ context "on Lion and greater" do
211
+
212
+ it "calls 'killall -HUP mDNSResponder'" do
213
+
214
+ RUBY_PLATFORM = "x86_64-darwin12.2.1"
215
+ Stuffed::Stuff.new(@tempfile.path).flush.should == "call killall -HUP mDNSResponder"
216
+
217
+ end
218
+ end
219
+
220
+ context "on Snow Leapard and lower" do
221
+
222
+ it "calls 'dscacheutil -flushcache'" do
223
+
224
+ RUBY_PLATFORM = "x86_64-darwin10.0.0"
225
+ Stuffed::Stuff.new(@tempfile.path).flush.should == "call dscacheutil -flushcache"
226
+
227
+ end
228
+ end
229
+ end
230
+ end
231
+ end
@@ -0,0 +1,17 @@
1
+ Gem::Specification.new do |s|
2
+ s.name = "stuffed"
3
+ s.version = "0.1.0"
4
+ s.date = "2013-05-07"
5
+ s.summary = "Stuffed blocks websites."
6
+ s.description = "A simple tool to temporarily block websites."
7
+ s.authors = ["Alex Marchant"]
8
+ s.email = "alexjmarchant@gmail.com"
9
+ s.files = ["bin", "bin/stuffed", "Gemfile", "lib", "lib/stuffed", "lib/stuffed/cli.rb", "lib/stuffed/stuff.rb", "lib/stuffed.rb", "Rakefile", "spec", "spec/cli_spec.rb", "spec/spec_helper.rb", "spec/stuff_spec.rb", "stuffed.gemspec"]
10
+ s.executables = ["stuffed"]
11
+ s.require_paths = ["lib"]
12
+ s.homepage = "http://www.github.com/alexmarchant/stuffed"
13
+
14
+ s.add_development_dependency "rake", "~> 0.9"
15
+ s.add_development_dependency "rspec", "~> 2.11"
16
+ s.add_development_dependency "pry", "~> 0.9"
17
+ end
metadata ADDED
@@ -0,0 +1,103 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: stuffed
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Alex Marchant
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2013-05-07 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: rake
16
+ requirement: !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ~>
20
+ - !ruby/object:Gem::Version
21
+ version: '0.9'
22
+ type: :development
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ~>
28
+ - !ruby/object:Gem::Version
29
+ version: '0.9'
30
+ - !ruby/object:Gem::Dependency
31
+ name: rspec
32
+ requirement: !ruby/object:Gem::Requirement
33
+ none: false
34
+ requirements:
35
+ - - ~>
36
+ - !ruby/object:Gem::Version
37
+ version: '2.11'
38
+ type: :development
39
+ prerelease: false
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ~>
44
+ - !ruby/object:Gem::Version
45
+ version: '2.11'
46
+ - !ruby/object:Gem::Dependency
47
+ name: pry
48
+ requirement: !ruby/object:Gem::Requirement
49
+ none: false
50
+ requirements:
51
+ - - ~>
52
+ - !ruby/object:Gem::Version
53
+ version: '0.9'
54
+ type: :development
55
+ prerelease: false
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ none: false
58
+ requirements:
59
+ - - ~>
60
+ - !ruby/object:Gem::Version
61
+ version: '0.9'
62
+ description: A simple tool to temporarily block websites.
63
+ email: alexjmarchant@gmail.com
64
+ executables:
65
+ - stuffed
66
+ extensions: []
67
+ extra_rdoc_files: []
68
+ files:
69
+ - bin/stuffed
70
+ - Gemfile
71
+ - lib/stuffed/cli.rb
72
+ - lib/stuffed/stuff.rb
73
+ - lib/stuffed.rb
74
+ - Rakefile
75
+ - spec/cli_spec.rb
76
+ - spec/spec_helper.rb
77
+ - spec/stuff_spec.rb
78
+ - stuffed.gemspec
79
+ homepage: http://www.github.com/alexmarchant/stuffed
80
+ licenses: []
81
+ post_install_message:
82
+ rdoc_options: []
83
+ require_paths:
84
+ - lib
85
+ required_ruby_version: !ruby/object:Gem::Requirement
86
+ none: false
87
+ requirements:
88
+ - - ! '>='
89
+ - !ruby/object:Gem::Version
90
+ version: '0'
91
+ required_rubygems_version: !ruby/object:Gem::Requirement
92
+ none: false
93
+ requirements:
94
+ - - ! '>='
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
97
+ requirements: []
98
+ rubyforge_project:
99
+ rubygems_version: 1.8.25
100
+ signing_key:
101
+ specification_version: 3
102
+ summary: Stuffed blocks websites.
103
+ test_files: []