postbin 0.1.0 → 0.1.6

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/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: