postbin 0.1.0 → 0.1.6

Sign up to get free protection for your applications and to get access to all the features.
data/HISTORY.md CHANGED
@@ -1,3 +1,9 @@
1
+ ## 0.1.6 (2012-01-04)
2
+
3
+ * Added support for Ruby 1.8.7
4
+ * Let rubygems deal with $LOAD_PATH
5
+ * Change JSON lib to `multi_json` gem.
6
+
1
7
  ## 0.1.0 (2011-11-22)
2
8
 
3
9
  * Initial gem release, v0.1.0
data/README.md CHANGED
@@ -8,8 +8,11 @@ Quick Start
8
8
 
9
9
  $ gem install postbin
10
10
  $ postbin
11
- == PostBin online http://127.0.0.1:6969/
12
- == CTRL+C to stop
11
+ == Starting PostBin on http://127.0.0.1:6969
12
+ == Sinatra/1.3.1 has taken the stage on 6969 for development with backup from Thin
13
+ >> Thin web server (v1.2.11 codename Bat-Shit Crazy)
14
+ >> Maximum connections set to 1024
15
+ >> Listening on 127.0.0.1:6969, CTRL+C to stop
13
16
 
14
17
  When running postbin from the command line, requests are stored in a temporary
15
18
  file database, they will be lost once the server terminates.
@@ -21,13 +24,24 @@ You can run a more permeant install by running PostBin as a Rack application:
21
24
 
22
25
  # example config.ru
23
26
  require 'postbin'
27
+
24
28
  # path of pstore file to use for storage.
25
29
  pstore = File.expand_path(File.join(File.dirname(__FILE__), 'postbin.pstore'))
30
+
26
31
  # start the server.
32
+ PostBin::Server.set :pstore_file, pstore
27
33
  run PostBin::Server.new(pstore)
28
34
 
29
35
  Command Line Options
30
36
  --------------------
31
37
 
32
- -a, --address HOST listen on HOST address (default: 127.0.0.1)
33
- -p, --port PORT use PORT number (default: 6969)
38
+ Usage: postbin [options]
39
+
40
+ PostBin options:
41
+ -v, --version show version number
42
+ -h, --help show this message
43
+
44
+ Rack options:
45
+ -s, --server SERVER server (webrick, mongrel, thin, etc.)
46
+ -a, --address HOST listen on HOST address (default: 127.0.0.1)
47
+ -p, --port PORT use PORT number (default: 6969)
data/Rakefile CHANGED
@@ -7,6 +7,7 @@ task :default => 'test:unit'
7
7
  namespace :test do
8
8
  # unit tests.
9
9
  Rake::TestTask.new(:unit) do |task|
10
+ task.libs << 'test'
10
11
  task.test_files = FileList['test/**/*_test.rb']
11
12
  task.verbose = true
12
13
  end
@@ -1,35 +1,13 @@
1
1
  #!/usr/bin/env ruby
2
2
 
3
- # --- use local code if possible, otherwise use gem --------------------------
4
- begin
5
- require 'postbin'
6
- rescue LoadError => err
7
- require 'rubygems'
8
- path = ::File.dirname(::File.expand_path(__FILE__))
9
- $LOAD_PATH.unshift path + '/../lib' if File.directory?(path) && !$LOAD_PATH.include?(path)
10
- require 'postbin'
11
- end
3
+ # DEVELOPMENT NOTE
4
+ # To run this executiable using the local code add ./lib/ to your ruby load path:
5
+ #
6
+ # ruby -Ilib bin/postbin
7
+ #
12
8
 
13
- # --- cli option parsing -----------------------------------------------------
14
- require 'optparse'
9
+ require 'rubygems' unless defined?(Gem)
10
+ require 'postbin'
15
11
 
16
- # default options.
17
- options = { :bind => '127.0.0.1', :port => 6969, :server => 'thin', :enviroment => :production }
18
-
19
- # available options.
20
- opts = OptionParser.new('', 24, ' ') do |opts|
21
- opts.banner = 'Usage: postbin [options]'
22
- opts.separator ''
23
- opts.separator 'PostBin options:'
24
- opts.on('-v', '--version', 'show version number') { puts 'PostBin ' + PostBin::Version; exit }
25
- opts.on('-h', '--help', 'show this message') { puts opts; exit; }
26
- opts.separator ''
27
- opts.separator 'Rack options:'
28
- opts.on('-s', '--server SERVER', 'server (webrick, mongrel, thin, etc.)') { |s| options[:server] = s }
29
- opts.on('-a', '--address HOST', 'listen on HOST address (default: 127.0.0.1)') { |host| options[:bind] = host }
30
- opts.on('-p', '--port PORT', 'use PORT number (default: 6969)') { |port| options[:port] = port }
31
- end.parse!
32
-
33
- # --- start sinatra server ---------------------------------------------------
34
- puts "== Starting PostBin on http://#{options[:bind]}:#{options[:port]}"
35
- PostBin::Server.run!(options)
12
+ # run command line instance of application
13
+ PostBin::Server.run_command_line!(ARGV)
@@ -1,8 +1,9 @@
1
+ require 'optparse'
1
2
  require 'pstore'
2
- require 'json'
3
+ require 'multi_json'
3
4
  require 'sinatra/base'
4
5
 
5
- require_relative 'postbin/post'
6
- require_relative 'postbin/server'
7
- require_relative 'postbin/storage'
8
- require_relative 'postbin/version'
6
+ require 'postbin/post'
7
+ require 'postbin/server'
8
+ require 'postbin/storage'
9
+ require 'postbin/version'
@@ -18,8 +18,8 @@ module PostBin
18
18
  body == other.body
19
19
  end
20
20
 
21
- def to_json(*a)
22
- { received_at: received_at, headers: headers, body: body }.to_json(*a)
21
+ def to_json(*options)
22
+ MultiJson.encode({ :received_at => received_at, :headers => headers, :body => body })
23
23
  end
24
24
 
25
25
  end
@@ -8,7 +8,7 @@ module PostBin
8
8
  set :static, true
9
9
 
10
10
  # by default we store in a temp file.
11
- set :pstore_file, Tempfile.new(['postbin', 'pstore'])
11
+ set :pstore_file, Tempfile.new(['postbin', 'pstore']).path
12
12
 
13
13
  # Redirect lost users.
14
14
  get '/?' do; redirect '/postbin/overview'; end
@@ -34,7 +34,7 @@ module PostBin
34
34
  storage = PostBin::Storage.new(settings.pstore_file)
35
35
 
36
36
  content_type :json
37
- storage.hits.to_json
37
+ MultiJson.encode(storage.hits)
38
38
  end
39
39
 
40
40
  # Display posts for the given URL as JSON.
@@ -43,7 +43,7 @@ module PostBin
43
43
  storage = PostBin::Storage.new(settings.pstore_file)
44
44
 
45
45
  content_type :json
46
- storage.posts(url).to_json
46
+ MultiJson.encode(storage.posts(url))
47
47
  end
48
48
 
49
49
  # Catch all for post requests.
@@ -54,14 +54,43 @@ module PostBin
54
54
  status 201
55
55
  end
56
56
 
57
+ # Runs a server on local machine, called by command line executable.
58
+ def self.run_command_line!(argv)
59
+ options = parse_args(argv)
60
+ $stderr.puts "== Starting PostBin on http://#{options[:bind]}:#{options[:port]}"
61
+ run!(options)
62
+ end
63
+
64
+ # Parse command line args.
65
+ def self.parse_args(argv)
66
+ # default options.
67
+ options = { :bind => '127.0.0.1', :port => 6969, :server => 'thin', :enviroment => :production }
68
+
69
+ # available options.
70
+ opts = OptionParser.new('', 24, ' ') do |opts|
71
+ opts.banner = 'Usage: postbin [options]'
72
+ opts.separator ''
73
+ opts.separator 'PostBin options:'
74
+ opts.on('-v', '--version', 'show version number') { $stderr.puts 'PostBin ' + PostBin::Version; exit }
75
+ opts.on('-h', '--help', 'show this message') { $stderr.puts opts; exit; }
76
+ opts.separator ''
77
+ opts.separator 'Rack options:'
78
+ opts.on('-s', '--server SERVER', 'server (webrick, mongrel, thin, etc.)') { |s| options[:server] = s }
79
+ opts.on('-a', '--address HOST', 'listen on HOST address (default: 127.0.0.1)') { |host| options[:bind] = host }
80
+ opts.on('-p', '--port PORT', 'use PORT number (default: 6969)') { |port| options[:port] = port }
81
+ end.parse!(argv)
82
+
83
+ options
84
+ end
85
+
57
86
  private
58
87
  # Returns an array of all client side HTTP request headers.
59
88
  def client_request_headers
60
89
  # POST /some/url HTTP/1.1
61
90
  # Accept: application/json
62
91
  # Content-Type: application/json
63
- headers = request.env.select { |k,v| k.start_with? 'HTTP_' }
64
- .collect { |pair| [ pair[0].sub(/^HTTP_/, ''), pair[1] ] }
92
+ headers = request.env.select { |k,v| k.start_with? 'HTTP_' } \
93
+ .collect { |pair| [ pair[0].sub(/^HTTP_/, ''), pair[1] ] } \
65
94
  .collect { |pair| pair.join(': ') }
66
95
 
67
96
  headers
@@ -6,6 +6,7 @@ module PostBin
6
6
  def initialize(pstore_file)
7
7
  # setup file database for storage.
8
8
  @db = PStore.new(pstore_file)
9
+ @db.ultra_safe = true if @db.respond_to?(:ultra_safe)
9
10
  end
10
11
 
11
12
  # Store a post in the database.
@@ -20,6 +21,7 @@ module PostBin
20
21
  # store post.
21
22
  @db[url] << post
22
23
  end
24
+ true
23
25
  end
24
26
 
25
27
  # Returns hash, key being url and value being number of posts received.
@@ -1,3 +1,3 @@
1
1
  module PostBin
2
- Version = '0.1.0'
2
+ Version = '0.1.6'
3
3
  end
@@ -17,10 +17,11 @@ spec = Gem::Specification.new do |s|
17
17
  s.default_executable = 'postbin'
18
18
 
19
19
  s.add_dependency('sinatra')
20
+ s.add_dependency('multi_json')
21
+ s.add_dependency('json')
20
22
  s.add_development_dependency('rake')
21
23
  s.add_development_dependency('yard')
22
24
  s.add_development_dependency('minitest')
23
- s.add_development_dependency('simplecov')
24
25
  s.add_development_dependency('rack-test')
25
26
  s.add_development_dependency('bundler')
26
27
 
@@ -1,4 +1,4 @@
1
- require_relative 'test_helper'
1
+ require 'test_helper'
2
2
 
3
3
  class TestPost < MiniTest::Unit::TestCase
4
4
 
@@ -1,10 +1,10 @@
1
- require_relative 'test_helper'
1
+ require 'test_helper'
2
2
 
3
3
  class TestServer < MiniTest::Unit::TestCase
4
4
  def app
5
5
  PostBin::Server.new
6
6
  # use a new pstore file for each request.
7
- PostBin::Server.set :pstore_file, Tempfile.new(['postbin', 'pstore'])
7
+ PostBin::Server.set :pstore_file, Tempfile.new(['postbin', 'pstore']).path
8
8
  end
9
9
 
10
10
  def test_roots_should_redirect_to_overview
@@ -54,7 +54,7 @@ class TestServer < MiniTest::Unit::TestCase
54
54
 
55
55
  # read it back.
56
56
  get '/postbin/posts/cats'
57
- post = JSON.parse(last_response.body)[0]
57
+ post = MultiJson.decode(last_response.body)[0]
58
58
  assert_equal 'they miaow', post['body']
59
59
  end
60
60
 
@@ -1,24 +1,29 @@
1
- require_relative 'test_helper'
1
+ require 'test_helper'
2
2
 
3
3
  class TestStorage < MiniTest::Unit::TestCase
4
4
 
5
+ def setup
6
+ test_storage_tempfile = Tempfile.new(['postbin', 'pstore'])
7
+ @storage_path = test_storage_tempfile.path
8
+ end
9
+
5
10
  def test_new_instance
6
- assert PostBin::Storage.new(Tempfile.new(['postbin', 'pstore']))
11
+ assert PostBin::Storage.new(@storage_path)
7
12
  end
8
13
 
9
14
  def test_all_urls_returns_empty_hash_by_default
10
- storage = PostBin::Storage.new(Tempfile.new(['postbin', 'pstore']))
15
+ storage = PostBin::Storage.new(@storage_path)
11
16
  assert_empty storage.urls, 'should return empty array by default'
12
17
  end
13
18
 
14
19
  def test_can_store_post
15
- storage = PostBin::Storage.new(Tempfile.new(['postbin', 'pstore']))
20
+ storage = PostBin::Storage.new(@storage_path)
16
21
  post = PostBin::Post.new('1', '2')
17
22
  assert storage.store('/test/url', post)
18
23
  end
19
24
 
20
25
  def test_can_get_all_urls
21
- storage = PostBin::Storage.new(Tempfile.new(['postbin', 'pstore']))
26
+ storage = PostBin::Storage.new(@storage_path)
22
27
  post = PostBin::Post.new('1', '2')
23
28
  storage.store('/foobar', post)
24
29
 
@@ -27,7 +32,7 @@ class TestStorage < MiniTest::Unit::TestCase
27
32
  end
28
33
 
29
34
  def test_keeps_count_of_posts_to_same_url
30
- storage = PostBin::Storage.new(Tempfile.new(['postbin', 'pstore']))
35
+ storage = PostBin::Storage.new(@storage_path)
31
36
  post = PostBin::Post.new('1', '2')
32
37
  storage.store('/foobar', post)
33
38
  storage.store('/foobar', post)
@@ -39,7 +44,7 @@ class TestStorage < MiniTest::Unit::TestCase
39
44
  end
40
45
 
41
46
  def test_can_retrieve_saved_post_data
42
- storage = PostBin::Storage.new(Tempfile.new(['postbin', 'pstore']))
47
+ storage = PostBin::Storage.new(@storage_path)
43
48
  post = PostBin::Post.new('4', '2')
44
49
  storage.store('/retrieve', post)
45
50
 
@@ -1,24 +1,33 @@
1
1
  #
2
2
  # Test helper init script.
3
3
  #
4
- require 'simplecov'
5
4
 
6
- # code coverage groups.
7
- SimpleCov.start do
8
- add_filter 'test/'
5
+ # --- load rubygems if needed ------------------------------------------------
6
+ require 'rubygems' unless defined?(Gem)
7
+
8
+ # --- load simplecov if the gem is installed ---------------------------------
9
+ begin
10
+ require 'simplecov'
11
+
12
+ # code coverage groups.
13
+ SimpleCov.start do
14
+ add_filter 'test/'
15
+ end
16
+ rescue LoadError
17
+ # dont run code coverage if gem isn't installed.
9
18
  end
10
19
 
11
- # load our dependencies using bundler.
20
+ # --- load our dependencies using bundler ------------------------------------
12
21
  require 'bundler/setup'
13
22
  Bundler.setup
14
23
  require 'minitest/autorun'
15
24
  require 'minitest/pride'
16
25
  require 'rack/test'
17
26
 
18
- # load postbin lib.
19
- require_relative './../lib/postbin'
27
+ # --- load postbin lib -------------------------------------------------------
28
+ require 'postbin'
20
29
 
21
- # extend main TestCase
30
+ # --- extend main TestCase ---------------------------------------------------
22
31
  class MiniTest::Unit::TestCase
23
32
  include Rack::Test::Methods
24
33
  end
@@ -1,4 +1,4 @@
1
- require_relative 'test_helper'
1
+ require 'test_helper'
2
2
 
3
3
  class TestVersion < MiniTest::Unit::TestCase
4
4
  def test_should_have_a_version
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: postbin
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.1.6
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,11 +9,11 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2011-11-22 00:00:00.000000000Z
12
+ date: 2012-01-04 00:00:00.000000000Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: sinatra
16
- requirement: &2165957000 !ruby/object:Gem::Requirement
16
+ requirement: &2166202940 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ! '>='
@@ -21,21 +21,32 @@ dependencies:
21
21
  version: '0'
22
22
  type: :runtime
23
23
  prerelease: false
24
- version_requirements: *2165957000
24
+ version_requirements: *2166202940
25
25
  - !ruby/object:Gem::Dependency
26
- name: rake
27
- requirement: &2165956540 !ruby/object:Gem::Requirement
26
+ name: multi_json
27
+ requirement: &2166202180 !ruby/object:Gem::Requirement
28
28
  none: false
29
29
  requirements:
30
30
  - - ! '>='
31
31
  - !ruby/object:Gem::Version
32
32
  version: '0'
33
- type: :development
33
+ type: :runtime
34
34
  prerelease: false
35
- version_requirements: *2165956540
35
+ version_requirements: *2166202180
36
36
  - !ruby/object:Gem::Dependency
37
- name: yard
38
- requirement: &2165956060 !ruby/object:Gem::Requirement
37
+ name: json
38
+ requirement: &2166201760 !ruby/object:Gem::Requirement
39
+ none: false
40
+ requirements:
41
+ - - ! '>='
42
+ - !ruby/object:Gem::Version
43
+ version: '0'
44
+ type: :runtime
45
+ prerelease: false
46
+ version_requirements: *2166201760
47
+ - !ruby/object:Gem::Dependency
48
+ name: rake
49
+ requirement: &2166201340 !ruby/object:Gem::Requirement
39
50
  none: false
40
51
  requirements:
41
52
  - - ! '>='
@@ -43,10 +54,10 @@ dependencies:
43
54
  version: '0'
44
55
  type: :development
45
56
  prerelease: false
46
- version_requirements: *2165956060
57
+ version_requirements: *2166201340
47
58
  - !ruby/object:Gem::Dependency
48
- name: minitest
49
- requirement: &2165955600 !ruby/object:Gem::Requirement
59
+ name: yard
60
+ requirement: &2166200900 !ruby/object:Gem::Requirement
50
61
  none: false
51
62
  requirements:
52
63
  - - ! '>='
@@ -54,10 +65,10 @@ dependencies:
54
65
  version: '0'
55
66
  type: :development
56
67
  prerelease: false
57
- version_requirements: *2165955600
68
+ version_requirements: *2166200900
58
69
  - !ruby/object:Gem::Dependency
59
- name: simplecov
60
- requirement: &2165955180 !ruby/object:Gem::Requirement
70
+ name: minitest
71
+ requirement: &2166200440 !ruby/object:Gem::Requirement
61
72
  none: false
62
73
  requirements:
63
74
  - - ! '>='
@@ -65,10 +76,10 @@ dependencies:
65
76
  version: '0'
66
77
  type: :development
67
78
  prerelease: false
68
- version_requirements: *2165955180
79
+ version_requirements: *2166200440
69
80
  - !ruby/object:Gem::Dependency
70
81
  name: rack-test
71
- requirement: &2165954740 !ruby/object:Gem::Requirement
82
+ requirement: &2166200000 !ruby/object:Gem::Requirement
72
83
  none: false
73
84
  requirements:
74
85
  - - ! '>='
@@ -76,10 +87,10 @@ dependencies:
76
87
  version: '0'
77
88
  type: :development
78
89
  prerelease: false
79
- version_requirements: *2165954740
90
+ version_requirements: *2166200000
80
91
  - !ruby/object:Gem::Dependency
81
92
  name: bundler
82
- requirement: &2165954320 !ruby/object:Gem::Requirement
93
+ requirement: &2166199580 !ruby/object:Gem::Requirement
83
94
  none: false
84
95
  requirements:
85
96
  - - ! '>='
@@ -87,7 +98,7 @@ dependencies:
87
98
  version: '0'
88
99
  type: :development
89
100
  prerelease: false
90
- version_requirements: *2165954320
101
+ version_requirements: *2166199580
91
102
  description: ! " A ruby command line/rack application for testing systems that send
92
103
  WebHooks\n using a HTTP POST request. Requests can be viewed via a simple web interface.\n"
93
104
  email: