poxy_client 0.0.1.pre.2 → 0.0.1

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.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 5a2d95e8f4d82de16c409ca25d31189de6936ea5
4
+ data.tar.gz: ec9b55d164d4ddbe83b9f76c9bb07c621b40c440
5
+ SHA512:
6
+ metadata.gz: d00729245b8e84baaf42f6c2e49dc36dbfa1fa1de3ba56a3e143c5c95286cb1aa6d0bf78679cffef6aedd2ba78be0e0e1f7dd9788eabf3e87fc8f8335590125d
7
+ data.tar.gz: d4eabdcdd002f778ce863ee8ce98855a57dc1075f04180f4059921f6f80bab145b7e68ad5913e3ec177932b01cee66537aa413f7085ddc60ca2aa53d2d3a9af0
data/Gemfile CHANGED
@@ -1,4 +1,3 @@
1
1
  source 'https://rubygems.org'
2
2
 
3
- # Specify your gem's dependencies in poxy_client.gemspec
4
3
  gemspec
@@ -0,0 +1,167 @@
1
+ <!DOCTYPE html><html><head><meta charset="utf-8"><style>html { font-size: 100%; overflow-y: scroll; -webkit-text-size-adjust: 100%; -ms-text-size-adjust: 100%; }
2
+
3
+ body{
4
+ color:#444;
5
+ font-family:Georgia, Palatino, 'Palatino Linotype', Times, 'Times New Roman',
6
+ "Hiragino Sans GB", "STXihei", "微软雅黑", serif;
7
+ font-size:12px;
8
+ line-height:1.5em;
9
+ background:#fefefe;
10
+ width: 45em;
11
+ margin: 10px auto;
12
+ padding: 1em;
13
+ outline: 1300px solid #FAFAFA;
14
+ }
15
+
16
+ a{ color: #0645ad; text-decoration:none;}
17
+ a:visited{ color: #0b0080; }
18
+ a:hover{ color: #06e; }
19
+ a:active{ color:#faa700; }
20
+ a:focus{ outline: thin dotted; }
21
+ a:hover, a:active{ outline: 0; }
22
+
23
+ span.backtick {
24
+ border:1px solid #EAEAEA;
25
+ border-radius:3px;
26
+ background:#F8F8F8;
27
+ padding:0 3px 0 3px;
28
+ }
29
+
30
+ ::-moz-selection{background:rgba(255,255,0,0.3);color:#000}
31
+ ::selection{background:rgba(255,255,0,0.3);color:#000}
32
+
33
+ a::-moz-selection{background:rgba(255,255,0,0.3);color:#0645ad}
34
+ a::selection{background:rgba(255,255,0,0.3);color:#0645ad}
35
+
36
+ p{
37
+ margin:1em 0;
38
+ }
39
+
40
+ img{
41
+ max-width:100%;
42
+ }
43
+
44
+ h1,h2,h3,h4,h5,h6{
45
+ font-weight:normal;
46
+ color:#111;
47
+ line-height:1em;
48
+ }
49
+ h4,h5,h6{ font-weight: bold; }
50
+ h1{ font-size:2.5em; }
51
+ h2{ font-size:2em; border-bottom:1px solid silver; padding-bottom: 5px; }
52
+ h3{ font-size:1.5em; }
53
+ h4{ font-size:1.2em; }
54
+ h5{ font-size:1em; }
55
+ h6{ font-size:0.9em; }
56
+
57
+ blockquote{
58
+ color:#666666;
59
+ margin:0;
60
+ padding-left: 3em;
61
+ border-left: 0.5em #EEE solid;
62
+ }
63
+ hr { display: block; height: 2px; border: 0; border-top: 1px solid #aaa;border-bottom: 1px solid #eee; margin: 1em 0; padding: 0; }
64
+
65
+
66
+ pre , code, kbd, samp {
67
+ color: #000;
68
+ font-family: monospace;
69
+ font-size: 0.88em;
70
+ border-radius:3px;
71
+ background-color: #F8F8F8;
72
+ border: 1px solid #CCC;
73
+ }
74
+ pre { white-space: pre; white-space: pre-wrap; word-wrap: break-word; padding: 5px 12px;}
75
+ pre code { border: 0px !important; padding: 0;}
76
+ code { padding: 0 3px 0 3px; }
77
+
78
+ b, strong { font-weight: bold; }
79
+
80
+ dfn { font-style: italic; }
81
+
82
+ ins { background: #ff9; color: #000; text-decoration: none; }
83
+
84
+ mark { background: #ff0; color: #000; font-style: italic; font-weight: bold; }
85
+
86
+ sub, sup { font-size: 75%; line-height: 0; position: relative; vertical-align: baseline; }
87
+ sup { top: -0.5em; }
88
+ sub { bottom: -0.25em; }
89
+
90
+ ul, ol { margin: 1em 0; padding: 0 0 0 2em; }
91
+ li p:last-child { margin:0 }
92
+ dd { margin: 0 0 0 2em; }
93
+
94
+ img { border: 0; -ms-interpolation-mode: bicubic; vertical-align: middle; }
95
+
96
+ table { border-collapse: collapse; border-spacing: 0; }
97
+ td { vertical-align: top; }
98
+
99
+ @media only screen and (min-width: 480px) {
100
+ body{font-size:14px;}
101
+ }
102
+
103
+ @media only screen and (min-width: 768px) {
104
+ body{font-size:16px;}
105
+ }
106
+
107
+ @media print {
108
+ * { background: transparent !important; color: black !important; filter:none !important; -ms-filter: none !important; }
109
+ body{font-size:12pt; max-width:100%; outline:none;}
110
+ a, a:visited { text-decoration: underline; }
111
+ hr { height: 1px; border:0; border-bottom:1px solid black; }
112
+ a[href]:after { content: " (" attr(href) ")"; }
113
+ abbr[title]:after { content: " (" attr(title) ")"; }
114
+ .ir a:after, a[href^="javascript:"]:after, a[href^="#"]:after { content: ""; }
115
+ pre, blockquote { border: 1px solid #999; padding-right: 1em; page-break-inside: avoid; }
116
+ tr, img { page-break-inside: avoid; }
117
+ img { max-width: 100% !important; }
118
+ @page :left { margin: 15mm 20mm 15mm 10mm; }
119
+ @page :right { margin: 15mm 10mm 15mm 20mm; }
120
+ p, h2, h3 { orphans: 3; widows: 3; }
121
+ h2, h3 { page-break-after: avoid; }
122
+ }
123
+ </style><title>README</title></head><body><h1 id="poxy_client">poxy_client</h1>
124
+ <p>Poxy (http://poxy.ws) is a web application that captures web requests to let you do fun stuff with them.</p>
125
+ <p>Fun things like proxying, forwarding, emailing and some sort of processing (soon!).</p>
126
+ <p>In order to use it first you'll need to <a href="http://poxy.porta.sh/users/sign_up">create an account</a> into the site.</p>
127
+ <h2 id="installation">Installation</h2>
128
+ <h3 id="bundler">Bundler</h3>
129
+ <p>Add this line to your application's Gemfile:</p>
130
+ <pre><code>gem 'poxy_client'
131
+ </code></pre>
132
+ <p>And then execute:</p>
133
+ <pre><code>$ bundle
134
+ </code></pre>
135
+ <h3 id="manual">Manual</h3>
136
+ <pre><code>$ gem install poxy_client
137
+ </code></pre>
138
+ <h2 id="usage">Usage</h2>
139
+ <p>There are a few different ways to use the client.</p>
140
+ <p>The distribution includes an executable file that you can use. It requires a .config file.</p>
141
+ <p>Or, you can implement your own client suited to your particular needs. Take a look at the executable file, or check the code documentation.</p>
142
+ <h2 id="api-blueprint">API Blueprint</h2>
143
+ <p>Courtesy of the great service <a href="http://apiary.io/">Apiary.io</a>, here it is:
144
+ (http://docs.poxy.apiary.io/)</p>
145
+ <h3 id="executable">Executable</h3>
146
+ <p>In the /lib folder of the distribution, there's a file named {file:bin/poxyd.rb poxyd.rb} which you can run from the commandline.</p>
147
+ <p>It requires a mandatory config file (included in the distribution you'll find a sample one, here {file:poxy.conf ./poxy.conf}).</p>
148
+ <p>You can use that as a start (it points to a test endpoint in the poxy api).</p>
149
+ <p>Optionally, you can pass a -d parameter, and the executable will run as a daemon.</p>
150
+ <p>Sample run:</p>
151
+ <pre><code>$ ruby poxyd.rb -c poxy.conf -d
152
+ </code></pre>
153
+ <p>Being poxy.conf a config file with your own API and Bucket keys.</p>
154
+ <h3 id="custom-implementation">Custom implementation</h3>
155
+ <p>The code for {PoxyClient poxy_client} it's pretty straightforward.</p>
156
+ <p>The {PoxyClient.perform perform} method encapsulates the 3 important operations the client does.</p>
157
+ <h4 id="retrieve">Retrieve</h4>
158
+ <h4 id="parse">Parse</h4>
159
+ <h4 id="repeat">Repeat</h4>
160
+ <h2 id="contributing">Contributing</h2>
161
+ <ol>
162
+ <li>Fork it</li>
163
+ <li>Create your feature branch (<code>git checkout -b my-new-feature</code>)</li>
164
+ <li>Commit your changes (<code>git commit -am 'Added some feature'</code>)</li>
165
+ <li>Push to the branch (<code>git push origin my-new-feature</code>)</li>
166
+ <li>Create new Pull Request</li>
167
+ </ol></body></html>
data/README.md CHANGED
@@ -1,10 +1,10 @@
1
1
  # poxy_client
2
2
 
3
- Poxy (http://poxy.porta.sh) is a web application that captures web requests and let's you do fun stuff with them.
3
+ [Poxy](http://poxy.ws) is a web application that captures HTTP requests to let you do fun stuff with them.
4
4
 
5
- Fun things like forwarding, emailing and some sort of processing (soon!).
5
+ Fun things like proxying, forwarding, emailing and some sort of processing (soon!).
6
6
 
7
- In order to use it, first you'll need to [register](http://poxy.porta.sh/users/sign_up) into the site.
7
+ In order to use it first you'll need to [create an account](http://poxy.ws/register) into the site.
8
8
 
9
9
 
10
10
  ## Installation
@@ -23,20 +23,26 @@ And then execute:
23
23
 
24
24
  $ gem install poxy_client
25
25
 
26
+ ## API Blueprint and Documentation
27
+
28
+ Courtesy of the great service [Apiary.io](http://apiary.io/), here it is:
29
+ [http://docs.poxy.apiary.io/](http://docs.poxy.apiary.io/)
30
+
26
31
  ## Usage
27
32
 
28
33
  There are a few different ways to use the client.
29
34
 
30
- The distribution includes a executable file that you can use just providing a .config file.
35
+ The distribution includes an executable file that you can use. It requires a .config file.
31
36
 
32
37
  Or, you can implement your own client suited to your particular needs. Take a look at the executable file, or check the code documentation.
33
38
 
34
39
 
40
+
35
41
  ### Executable
36
42
 
37
- In the /lib folder of the distribution, there's a file named {file:bin/poxyd.rb poxyd.rb} which you can run from the commandline.
43
+ In the /lib folder of the distribution, there's a file named [poxyd.rb](bin/poxyd.rb) which you can run from the commandline.
38
44
 
39
- It requires a mandatory config file (included in the distribution you'll find a sample one, here {file:poxy.conf ./poxy.conf}).
45
+ It requires a mandatory config file (included in the distribution you'll find a sample one, here [poxy.conf](./poxy.conf).
40
46
 
41
47
  You can use that as a start (it points to a test endpoint in the poxy api).
42
48
 
@@ -46,13 +52,13 @@ Sample run:
46
52
 
47
53
  $ ruby poxyd.rb -c poxy.conf -d
48
54
 
49
- Being poxy.conf a config file with your own API and Bucket keys.
55
+ Being poxy.conf a config file with your own API key.
50
56
 
51
57
  ### Custom implementation
52
58
 
53
- Though the code for {PoxyClient poxy_client} it's pretty straightforward, in case you want to take a look.
59
+ The code for PoxyClient it's pretty straightforward.
54
60
 
55
- The {PoxyClient.perform perform} method encapsulates the 3 important operations the client performs.
61
+ The [PoxyClient#perform](lib/poxy_client.rb#L43) method encapsulates the 3 operations the client performs in order to retrieve, process and repeat a request.
56
62
 
57
63
  #### Retrieve
58
64
 
@@ -68,22 +74,3 @@ The {PoxyClient.perform perform} method encapsulates the 3 important operations
68
74
  3. Commit your changes (`git commit -am 'Added some feature'`)
69
75
  4. Push to the branch (`git push origin my-new-feature`)
70
76
  5. Create new Pull Request
71
-
72
-
73
-
74
-
75
-
76
-
77
-
78
-
79
-
80
-
81
-
82
-
83
-
84
-
85
-
86
-
87
-
88
-
89
-
data/Rakefile CHANGED
@@ -9,3 +9,10 @@ end
9
9
  desc "Run tests"
10
10
  task :default => :test
11
11
 
12
+ task :console do
13
+ require 'irb'
14
+ require 'irb/completion'
15
+ require 'poxy_client' # You know what to do.
16
+ ARGV.clear
17
+ IRB.start
18
+ end
@@ -25,11 +25,19 @@ args = Clap.run ARGV,
25
25
  },
26
26
  "-d" => lambda {
27
27
  opts[:daemonize] = true
28
+ },
29
+ "-v" => lambda {
30
+ opts[:version] = true
28
31
  }
29
32
 
30
33
  $stdout.sync = true
31
34
 
32
35
 
36
+ if opts[:version]
37
+ puts "PoxyClient daemon, version: #{PoxyClient::VERSION}"
38
+ @continue = false
39
+ end
40
+
33
41
  if opts[:daemonize]
34
42
  pid_path = File.expand_path("poxy.pid", File.dirname(__FILE__))
35
43
  Process.daemon(true)
@@ -47,20 +55,21 @@ if opts[:config_file]
47
55
 
48
56
  PoxyClient.configure do |c|
49
57
  c.origin = config["origin"]
50
- c.api_key = config["api"]
51
- c.bucket_key = config["bucket"]
58
+ c.api_key = config["api_key"]
52
59
  c.destination = config["destination"]
53
60
  end
54
61
 
62
+ else
63
+ @continue = false
55
64
  end
56
65
 
57
66
 
58
67
 
59
68
  #run code here
60
69
  while @continue do
61
- #requests = PoxyClient.retriever.get(:all)
62
- #parsed = PoxyClient.processor.parse(requests)
63
- #result = PoxyClient.repeater.set(parsed)
64
- PoxyClient.perform
70
+ # requests = PoxyClient.retriever.get(:starred => true)
71
+ # parsed = PoxyClient.processor.parse(requests)
72
+ # result = PoxyClient.repeater.set(parsed)
73
+ PoxyClient.perform(:starred => true)
65
74
  sleep config["interval"].to_i
66
75
  end
@@ -37,17 +37,17 @@ module PoxyClient
37
37
 
38
38
  # Encapsulates the three important operations. Retrieve, Process and Repeat
39
39
  #
40
- # @param [Symbol] howmany which requests to retrieve from the API.
41
- # Options are :new, :all, :first, :last, :starred, :unstarred, :archived
40
+ # @param [Hash] which kind of requests we should get from the API
41
+ # Options are :
42
42
  # @return [Array] With the responses received in the destination server.
43
- def perform(howmany = :new)
43
+ def perform(options = {}) #TODO: FIX DOCS
44
44
  # Retrieve all the available requests from the site API
45
- requests = PoxyClient.retriever.get(howmany)
45
+ requests = PoxyClient.retriever.get( options )
46
46
  # Parse those requests to JSON.
47
- parsed = PoxyClient.processor.parse(requests)
47
+ parsed = PoxyClient.processor.parse( requests )
48
48
  # Repeat the retrieved and parsed requests to (usually) localhost.
49
49
  # Check the sample poxy.conf file.
50
- result = PoxyClient.repeater.set(parsed)
50
+ result = PoxyClient.repeater.set( parsed )
51
51
  end
52
52
 
53
53
  end
@@ -1,21 +1,17 @@
1
1
  module PoxyClient
2
2
  class Configuration
3
- OPTIONS = [:api_key, :bucket_key, :origin, :destination, :method, :mode, :retriever_version].freeze
3
+ OPTIONS = [:api_key, :origin, :destination, :mode, :retriever_version].freeze
4
4
 
5
5
  attr_accessor :api_key
6
- attr_accessor :bucket_key
7
6
  attr_accessor :origin
8
7
  attr_accessor :destination
9
- attr_accessor :method
10
-
11
8
  attr_accessor :mode
12
9
  attr_accessor :retriever_version
13
10
 
14
11
  def initialize
15
- @origin = 'http://poxy.porta.sh'
16
- @destination = 'http://localhost:9292'
12
+ @origin = 'http://poxy.ws'
13
+ @destination = 'http://home.herokuapp.com/'
17
14
  @mode = 'development'
18
- @method = 'post'
19
15
  @retriever_version = VERSION
20
16
  end
21
17
 
@@ -5,23 +5,32 @@ module PoxyClient
5
5
 
6
6
  end
7
7
 
8
+ # Parse the JSON encoded string from the retriever and generates an Object
9
+ #
10
+ # @param [String] content The JSON encoded string from the retriever.
11
+ # @return [Array] The list of items retrieved
8
12
  def parse(content)
9
- @response = ""
13
+ @response = []
10
14
  if ( content.respond_to?(:body) )
11
15
  @response = JSON.parse(content.body)
12
16
  else
13
17
  @response = JSON.parse(content)
14
18
  end
15
- @response.each_with_index do |head, i|
16
- @response[i]['headers']['X-FORWARDED-FOR'] = @response[i]['headers']['HOST']
17
- end
18
- @response
19
+ @complete_items = @response["items"]
20
+ @raw_items = @response["items"].map{|i| i['raw']}
19
21
  end
20
22
 
21
23
  def response
22
24
  @response
23
25
  end
24
26
 
27
+ def complete_items
28
+ @complete_items
29
+ end
30
+
31
+ def raw_items
32
+ @raw_items
33
+ end
25
34
 
26
35
  end
27
36
  end
@@ -10,13 +10,17 @@ module PoxyClient
10
10
  end
11
11
  end
12
12
 
13
+ # Generates and send requests retrieved from the API
14
+ #
15
+ # @param [Array] json_array with parsed requests
16
+ # @return [Array] responses from server to each request
13
17
  def set(json_array)
14
18
  @result = []
15
19
  @connector = PoxyClient::Connector.new()
16
20
  json_array.each do |params|
17
21
  @connector.connect do |request|
18
22
  request.method = params["method"]
19
- request.url = @destination
23
+ request.url = @destination + '?' + params["query_string"].to_s
20
24
  request.headers = params["headers"]
21
25
  request.body = params["params"]
22
26
  end
@@ -24,6 +28,5 @@ module PoxyClient
24
28
  end
25
29
  @result
26
30
  end
27
-
28
31
  end
29
32
  end
@@ -8,28 +8,57 @@ module PoxyClient
8
8
  attr_reader :mode
9
9
  attr_reader :retriever_version
10
10
 
11
- REQUESTS_URI = '/api/v1/requests/'.freeze
11
+ REQUESTS_URI = '/api/requests?'.freeze
12
12
 
13
13
  def initialize(options = {})
14
14
  [ :api_key,
15
- :bucket_key,
16
15
  :origin,
17
16
  :mode,
18
17
  :retriever_version
19
18
  ].each do |option|
20
19
  instance_variable_set("@#{option}", options[option])
21
20
  end
22
-
23
21
  end
24
22
 
25
23
 
26
- def get(how_many = :new)
24
+ #Retrieves requests from API.
25
+ # @param [Symbol] how_many which requests to retrieve from the API.
26
+ # Options are :new, :all, :first, :last, :starred, :unstarred, :archived
27
+ # @return [String] A JSON encoded array of requests.
28
+ def get(options = {})
27
29
  #TODO: move to a factory
30
+ copy = {}
31
+
32
+ if options.has_key? :starred
33
+ copy[:starred] = options[:starred].to_s
34
+ end
35
+
36
+ if options.has_key? :archived
37
+ copy[:archived] = options[:archived].to_s
38
+ end
39
+
40
+ if options.has_key? :bucket_ids
41
+ copy[:bucket_ids] = options[:bucket_ids]
42
+ end
43
+ if options.has_key? :search
44
+ copy[:search] = options[:search].downcase
45
+ end
46
+
47
+ if options.has_key? :page
48
+ copy[:page] = options[:page]
49
+ end
50
+
51
+ if options.has_key? :per_page
52
+ copy[:per_page] = options[:per_page]
53
+ end
54
+
55
+ query = Rack::Utils.build_nested_query(copy)
56
+
28
57
  @connector = PoxyClient::Connector.new
29
58
  @connector.connect do |request|
30
- request.method = :post
31
- request.url = build_url(how_many)
32
- request.body = {:bucket_key => @bucket_key, :api_key => @api_key}
59
+ request.method = :get
60
+ request.url = build_url(query)
61
+ request.auth.basic(@api_key, "")
33
62
  end
34
63
  @connector.response
35
64
  end
@@ -38,18 +67,9 @@ module PoxyClient
38
67
  protected
39
68
 
40
69
  def build_url(how_many)
41
- @origin + REQUESTS_URI + how_many.to_s
70
+ @origin + REQUESTS_URI + how_many
42
71
  end
43
72
 
44
73
 
45
74
  end
46
75
  end
47
-
48
- __END__
49
- require 'json'
50
-
51
- requests = JSON.parse(response.body)
52
- requests.each do |r|
53
- rp = JSON.parse(r)
54
- puts rp['body']
55
- end
@@ -1,3 +1,3 @@
1
1
  module PoxyClient
2
- VERSION = "0.0.1.pre.2"
2
+ VERSION = "0.0.1"
3
3
  end
data/poxy.conf CHANGED
@@ -1,5 +1,4 @@
1
- api=test
2
- bucket=test
3
- origin=http://poxy.porta.sh
4
- destination=http://localhost:9292
5
- interval=10
1
+ api_key=3acb90c157c9f
2
+ origin=http://poxy.ws
3
+ destination=http://localhost:9292/
4
+ interval=10
@@ -4,14 +4,16 @@ require File.expand_path('../lib/poxy_client/version', __FILE__)
4
4
  Gem::Specification.new do |gem|
5
5
  gem.authors = ["Julian Porta"]
6
6
  gem.email = ["julian@porta.sh"]
7
- gem.description = %q{Client for Poxy (the awesome app)}
7
+ gem.description = %q{Client for Poxy (the http inbox)}
8
8
  gem.summary = %q{Poxy is a website that captures requests and lets you do fun stuff with them}
9
- gem.homepage = "http://porta.github.com/poxy_client"
10
- gem.post_install_message = %q{Thanks for installing poxy_client. Make sure to create an account at http://poxy.porta.sh}
9
+ gem.homepage = "https://github.com/Porta/poxy_client"
10
+ gem.post_install_message = %q{Thanks for installing poxy_client. Make sure to create an account at http://poxy.ws}
11
11
 
12
12
  gem.add_runtime_dependency "httpi", [">= 1.0.0"]
13
13
  gem.add_runtime_dependency "clap", [">= 0.0.2"]
14
14
  gem.add_development_dependency "test-unit"
15
+ gem.add_development_dependency "rake"
16
+ gem.add_development_dependency "curb"
15
17
 
16
18
  gem.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
17
19
  gem.files = `git ls-files`.split("\n")
@@ -1,7 +1,181 @@
1
- require 'test/unit'
2
- require 'poxy_client'
3
- require 'json'
1
+ # require "cutest"
2
+ # require "redis"
4
3
 
5
- class PoxyBinTest < Test::Unit::TestCase
4
+ # at_exit {
5
+ # Process.waitall
6
+ # }
6
7
 
7
- end
8
+ # def wait_for_pid(pid)
9
+ # running = true
10
+
11
+ # while running
12
+ # begin
13
+ # Process.kill(0, pid)
14
+ # rescue Errno::ESRCH
15
+ # running = false
16
+ # end
17
+ # end
18
+ # end
19
+
20
+ # def root(path)
21
+ # File.expand_path("../#{path}", File.dirname(__FILE__))
22
+ # end
23
+
24
+ # redis = Redis.connect
25
+
26
+ # test "daemon, implicit start" do
27
+ # r, w = IO.pipe
28
+ # pid = nil
29
+
30
+ # begin
31
+ # redis.flushdb
32
+
33
+ # pid = spawn("#{root("bin/ost")} echo", out: w, chdir: "test")
34
+
35
+ # redis.rpush("ost:echo", 1)
36
+
37
+ # assert_equal "1\n", r.gets
38
+ # ensure
39
+ # Process.kill(:INT, pid) if pid
40
+ # end
41
+ # end
42
+
43
+ # test "daemon, explicit start" do
44
+ # r, w = IO.pipe
45
+ # pid = nil
46
+
47
+ # begin
48
+ # redis.flushdb
49
+
50
+ # pid = spawn("#{root("bin/ost")} start echo", out: w, chdir: "test")
51
+
52
+ # redis.rpush("ost:echo", 2)
53
+
54
+ # assert_equal "2\n", r.gets
55
+ # ensure
56
+ # Process.kill(:INT, pid) if pid
57
+ # end
58
+ # end
59
+
60
+ # test "daemonizes" do
61
+ # r, w = IO.pipe
62
+ # pid, detached_pid = nil
63
+
64
+ # redis.flushdb
65
+
66
+ # begin
67
+ # pid = spawn("#{root("bin/ost")} -d echo", out: w, chdir: "test")
68
+
69
+ # sleep 1
70
+
71
+ # state = `ps -p #{pid} -o state`.lines.to_a.last[/(\w+)/, 1]
72
+
73
+ # assert_equal "Z", state
74
+
75
+ # pid_path = "./test/workers/echo.pid"
76
+
77
+ # assert File.exist?(pid_path)
78
+
79
+ # detached_pid = File.read(pid_path).to_i
80
+
81
+ # ppid = `ps -p #{detached_pid} -o ppid`.lines.to_a.last[/(\d+)/, 1]
82
+
83
+ # assert_equal "1", ppid
84
+ # ensure
85
+ # Process.kill(:INT, pid) if pid
86
+ # Process.kill(:INT, detached_pid) if detached_pid
87
+ # end
88
+
89
+ # wait_for_pid(detached_pid)
90
+
91
+ # assert !File.exist?(pid_path)
92
+ # end
93
+
94
+ # test "gracefully handles TERM signals" do
95
+ # r, w = IO.pipe
96
+ # pid, detached_pid = nil
97
+
98
+ # redis.flushdb
99
+
100
+ # pid_path = "./test/workers/slow.pid"
101
+
102
+ # begin
103
+ # redis.rpush("ost:slow", 5)
104
+
105
+ # pid = spawn("#{root("bin/ost")} -d slow", out: w, chdir: "test")
106
+
107
+ # until File.exist?(pid_path)
108
+ # sleep 0.5
109
+ # end
110
+
111
+ # detached_pid = File.read(pid_path).to_i
112
+
113
+ # Process.kill(:TERM, detached_pid)
114
+ # ensure
115
+ # Process.kill(:INT, pid)
116
+ # end
117
+
118
+ # wait_for_pid(detached_pid)
119
+
120
+ # assert_equal "5", redis.get("slow")
121
+ # end
122
+
123
+ # test "stops worker from command line action" do
124
+ # r, w = IO.pipe
125
+ # pid, detached_pid = nil
126
+
127
+ # redis.flushdb
128
+
129
+ # pid_path = "./test/workers/killme.pid"
130
+
131
+ # pid = spawn("#{root("bin/ost")} start -d killme", out: w, err: w, chdir: "test")
132
+
133
+ # sleep 1
134
+
135
+ # until File.exist?(pid_path)
136
+ # sleep 0.5
137
+ # end
138
+
139
+ # detached_pid = File.read(pid_path).to_i
140
+
141
+ # spawn("#{root("bin/ost")} kill killme", chdir: "test")
142
+
143
+ # wait_for_pid(detached_pid)
144
+
145
+ # assert_equal "YES", redis.get("killme")
146
+ # end
147
+
148
+ # test "use a different dir for pids" do
149
+ # r, w = IO.pipe
150
+ # pid, detached_pid = nil
151
+
152
+ # redis.flushdb
153
+
154
+ # begin
155
+ # pid = spawn("#{root("bin/ost")} -d echo -p tmp", out: w, chdir: "test")
156
+
157
+ # sleep 1
158
+
159
+ # state = `ps -p #{pid} -o state`.lines.to_a.last[/(\w+)/, 1]
160
+
161
+ # assert_equal "Z", state
162
+
163
+ # pid_path = "./test/tmp/echo.pid"
164
+
165
+ # assert File.exist?(pid_path)
166
+
167
+ # detached_pid = File.read(pid_path).to_i
168
+
169
+ # ppid = `ps -p #{detached_pid} -o ppid`.lines.to_a.last[/(\d+)/, 1]
170
+
171
+ # assert_equal "1", ppid
172
+ # ensure
173
+ # Process.kill(:INT, pid) if pid
174
+ # Process.kill(:INT, detached_pid) if detached_pid
175
+ # end
176
+
177
+ # wait_for_pid(detached_pid)
178
+
179
+ # assert !File.exist?(pid_path)
180
+
181
+ # end
@@ -5,7 +5,7 @@ require 'json'
5
5
  class PoxyClientTest < Test::Unit::TestCase
6
6
 
7
7
  def test_version
8
- assert_equal PoxyClient::VERSION, '0.0.1.pre.2'
8
+ assert_equal PoxyClient::VERSION, '0.0.1'
9
9
  end
10
10
 
11
11
  def test_config_version
@@ -15,16 +15,45 @@ class PoxyClientTest < Test::Unit::TestCase
15
15
 
16
16
  def test_config_block
17
17
  PoxyClient.configure do |config|
18
- config.api_key = "test"
19
- config.bucket_key = "test"
18
+ config.api_key = "3acb90c157c9f"
19
+ config.destination = "http://home.herokuapp.com/"
20
20
  end
21
21
 
22
22
  @client = PoxyClient
23
23
  #params passed for config
24
- assert_equal @client.configuration.api_key, "test"
25
- assert_equal @client.configuration.bucket_key, "test"
24
+ assert_equal @client.configuration.api_key, "3acb90c157c9f"
26
25
  #params by default
27
- assert_equal @client.configuration.destination, "http://localhost:9292"
26
+ assert_equal @client.configuration.destination, "http://home.herokuapp.com/"
27
+ end
28
+
29
+ def test_integration
30
+ PoxyClient.configure do |config|
31
+ config.origin = "https://poxy.apiary.io"
32
+ config.api_key = "3acb90c157c9f"
33
+ config.destination = "http://home.herokuapp.com/"
34
+ end
35
+
36
+ @client = PoxyClient
37
+ @retriever = PoxyClient.retriever
38
+ @repeater = PoxyClient.repeater
39
+ requests = @retriever.get
40
+ processed = PoxyClient.processor.parse(requests)
41
+ processed.each do |request|
42
+ responses = @repeater.set([request])
43
+ assert_not_nil responses.first.body.match('FooBar')
44
+ assert_equal responses.first.code, 200
45
+ end
46
+ end
47
+
48
+ def test_client_perform
49
+ PoxyClient.configure do |config|
50
+ config.origin = "https://poxy.apiary.io"
51
+ config.api_key = "3acb90c157c9f"
52
+ config.destination = "http://home.herokuapp.com/"
53
+ end
54
+
55
+ result = PoxyClient.perform(:starred => true)
56
+ assert_not_nil result
28
57
  end
29
58
 
30
59
 
@@ -4,16 +4,158 @@ require 'json'
4
4
 
5
5
  class PoxyProcessorTest < Test::Unit::TestCase
6
6
  def setup
7
- @raw_request = "[{\"method\":\"POST\",\"headers\":{\"HOST\":\"localhost:9393\",\"CONNECTION\":\"keep-alive\",\"ORIGIN\":\"localhost:9393\",\"USER_AGENT\":\"Don Gato y su Pandilla\",\"ACCEPT\":\"*/*\",\"ACCEPT_ENCODING\":\"gzip,deflate,sdch\",\"ACCEPT_LANGUAGE\":\"en-US,en;q=0.8\",\"ACCEPT_CHARSET\":\"ISO-8859-1,utf-8;q=0.7,*;q=0.3\",\"COOKIE\":\"rumba\",\"VERSION\":\"HTTP/1.1\"},\"query_string\":\"urlparam=1&url_param=2\",\"params\":{\"postparam\":\"uno\",\"post_param\":\"dos\"},\"body\":\"\"}]"
8
- @parsed_request = PoxyClient.processor.parse(@raw_request)
9
- end
10
-
11
-
7
+ @raw_response = '{
8
+ "code": "200",
9
+ "message": "Access to Requests Granted",
10
+ "page": 1,
11
+ "per_page": 50,
12
+ "item_count": 3,
13
+ "item_class": "request",
14
+ "items": [
15
+ {
16
+ "id": 1,
17
+ "bucket_id": 1,
18
+ "starred": false,
19
+ "archived": false,
20
+ "processed": {
21
+ "method": "GET",
22
+ "origin": null,
23
+ "path": "/",
24
+ "params": {
25
+ },
26
+ "uploads": [ ]
27
+ },
28
+ "raw": {
29
+ "method": "GET",
30
+ "path": "/",
31
+ "headers": {
32
+ "HOST": "my-bucket-name.poxy.ws",
33
+ "CONNECTION": "keep-alive",
34
+ "CACHE_CONTROL": "no-cache",
35
+ "USER_AGENT": "FooBar",
36
+ "ACCEPT": "*/*",
37
+ "ACCEPT_ENCODING": "gzip,deflate,sdch",
38
+ "ACCEPT_LANGUAGE": "en-US,en;q=0.8,es;q=0.6"
39
+ },
40
+ "query_string": "",
41
+ "params": {},
42
+ "body": "",
43
+ "origin": null
44
+ }
45
+ },
46
+ {
47
+ "id": 2,
48
+ "bucket_id": 1,
49
+ "starred": true,
50
+ "archived": false,
51
+ "processed": {
52
+ "method": "POST",
53
+ "origin": null,
54
+ "path": "/",
55
+ "params": {
56
+ "uno": "dos",
57
+ "dos": "tres"
58
+ },
59
+ "uploads": [ ]
60
+ },
61
+ "raw": {
62
+ "method": "POST",
63
+ "path": "/",
64
+ "headers": {
65
+ "ACCEPT_LANGUAGE": "en-US,en;q=0.8,es;q=0.6",
66
+ "CONNECTION": "keep-alive",
67
+ "ACCEPT_ENCODING": "gzip,deflate,sdch",
68
+ "ACCEPT": "*/*",
69
+ "CACHE_CONTROL": "no-cache",
70
+ "ORIGIN": "",
71
+ "USER_AGENT": "FooBar",
72
+ "HOST": "my-bucket-name.poxy.ws"
73
+ },
74
+ "query_string": "",
75
+ "params": {
76
+ "uno": "dos",
77
+ "dos": "tres"
78
+ },
79
+ "body": "------WebKitFormBoundaryJchAQzyXrTzJl9eq\r\nContent-Disposition: form-data; name=\"uno\"\r\n\r\ndos\r\n------WebKitFormBoundaryJchAQzyXrTzJl9eq\r\nContent-Disposition: form-data; name=\"dos\"\r\n\r\ntres\r\n------WebKitFormBoundaryJchAQzyXrTzJl9eq--\r\n",
80
+ "origin": ""
81
+ }
82
+ } ,
83
+ {
84
+ "id": 3,
85
+ "bucket_id": 2,
86
+ "starred": false,
87
+ "archived": true,
88
+ "processed": {
89
+ "method": "GET",
90
+ "origin": null,
91
+ "path": "/",
92
+ "params": {
93
+ },
94
+ "uploads": [ ]
95
+ },
96
+ "raw": {
97
+ "method": "GET",
98
+ "path": "/",
99
+ "headers": {
100
+ "HOST": "another-one.poxy.ws",
101
+ "CONNECTION": "keep-alive",
102
+ "CACHE_CONTROL": "no-cache",
103
+ "USER_AGENT": "FooBar",
104
+ "ACCEPT": "*/*",
105
+ "ACCEPT_ENCODING": "gzip,deflate,sdch",
106
+ "ACCEPT_LANGUAGE": "en-US,en;q=0.8,es;q=0.6"
107
+ },
108
+ "query_string": "",
109
+ "params": {},
110
+ "body": "",
111
+ "origin": null
112
+ }
113
+ }
114
+ ]
115
+ }'
116
+ @raw_request = '{
117
+ "id": 1,
118
+ "bucket_id": 1,
119
+ "starred": false,
120
+ "archived": false,
121
+ "processed": {
122
+ "method": "GET",
123
+ "origin": null,
124
+ "path": "/",
125
+ "params": {
126
+ },
127
+ "uploads": [ ]
128
+ },
129
+ "raw": {
130
+ "method": "GET",
131
+ "path": "/",
132
+ "headers": {
133
+ "HOST": "my-bucket-name.poxy.ws",
134
+ "CONNECTION": "keep-alive",
135
+ "CACHE_CONTROL": "no-cache",
136
+ "USER_AGENT": "FooBar",
137
+ "ACCEPT": "*/*",
138
+ "ACCEPT_ENCODING": "gzip,deflate,sdch",
139
+ "ACCEPT_LANGUAGE": "en-US,en;q=0.8,es;q=0.6"
140
+ },
141
+ "query_string": "",
142
+ "params": {},
143
+ "body": "",
144
+ "origin": null
145
+ }
146
+ }'
12
147
 
13
- def test_parser
14
- assert_equal JSON.parse(@raw_request)[0]['HOST'], @parsed_request[0]['X-FORWARDED-FOR']
148
+ @parsed_response = PoxyClient.processor.parse(@raw_response)
149
+ @complete_response = PoxyClient.processor.complete_items
150
+ @parsed_request = JSON.parse(@raw_request)
15
151
  end
16
152
 
153
+ def test_request_process
154
+ assert_equal @parsed_request["raw"], @parsed_response[0]
155
+ end
17
156
 
157
+ def test_complete_request_process
158
+ assert_equal @parsed_request, @complete_response[0]
159
+ end
18
160
 
19
161
  end
@@ -6,24 +6,27 @@ class PoxyRepeaterTest < Test::Unit::TestCase
6
6
  def setup
7
7
 
8
8
  PoxyClient.configure do |config|
9
- config.destination = "http://poxy.porta.sh/collector/test"
9
+ config.destination = "http://home.herokuapp.com/"
10
10
  end
11
11
  @repeater = PoxyClient.repeater
12
12
 
13
13
  #make sure the HOST header is set to the destination host, or the request willl be rejected
14
- @raw_request = "[{\"method\":\"POST\",\"headers\":{\"HOST\":\"localhost:9393\",\"CONNECTION\":\"keep-alive\",\"ORIGIN\":\"localhost:9393\",\"USER_AGENT\":\"Don Gato y su Pandilla\",\"ACCEPT\":\"*/*\",\"ACCEPT_ENCODING\":\"gzip,deflate,sdch\",\"ACCEPT_LANGUAGE\":\"en-US,en;q=0.8\",\"ACCEPT_CHARSET\":\"ISO-8859-1,utf-8;q=0.7,*;q=0.3\",\"COOKIE\":\"rumba\",\"VERSION\":\"HTTP/1.1\"},\"query_string\":\"urlparam=1&url_param=2\",\"params\":{\"postparam\":\"uno\",\"post_param\":\"dos\"},\"body\":\"\"}]"
14
+ @raw_request = "[{\"method\":\"POST\",\"headers\":{\"HOST\":\"localhost:9292\",\"CONNECTION\":\"keep-alive\",\"ORIGIN\":\"localhost:9292\",\"USER_AGENT\":\"Don Gato y su Pandilla\",\"ACCEPT\":\"*/*\",\"ACCEPT_ENCODING\":\"gzip,deflate,sdch\",\"ACCEPT_LANGUAGE\":\"en-US,en;q=0.8\",\"ACCEPT_CHARSET\":\"ISO-8859-1,utf-8;q=0.7,*;q=0.3\",\"COOKIE\":\"rumba\",\"VERSION\":\"HTTP/1.1\"},\"query_string\":\"urlparam=1&url_param=2\",\"params\":{\"postparam\":\"uno\",\"post_param\":\"dos\"},\"body\":\"\"}]"
15
15
  @json_request = JSON.parse(@raw_request)
16
16
  end
17
17
 
18
18
 
19
19
  def test_repeater_config
20
- #assert_equal @repeater.destination, "http://localhost:9393/debug"
20
+ assert_equal @repeater.destination, "http://home.herokuapp.com/"
21
21
  end
22
22
 
23
23
  def test_repeater_set
24
- response = @repeater.set(@json_request)
25
- assert_equal response[0].class, HTTPI::Response
26
- assert_equal response[0].code, 200 #poxy will respond with a 200, since it's a "receive" bucket
24
+ responses = @repeater.set(@json_request)
25
+
26
+ #assert_equal response[0].class, HTTPI::Response
27
+ assert_equal responses.first.code, 200 #poxy will respond with a 200, since it's a "receive" bucket
28
+ assert responses.first.body.include?('Don Gato y su Pandilla'), "Don Gato not present"
29
+
27
30
  end
28
31
 
29
- end
32
+ end
@@ -6,24 +6,36 @@ class PoxyRetrieverTest < Test::Unit::TestCase
6
6
 
7
7
  def setup
8
8
  PoxyClient.configure do |config|
9
- config.origin = "http://poxy.porta.sh"
10
- config.api_key = "test"
11
- config.bucket_key = "test"
9
+ config.origin = "https://poxy.apiary.io"
10
+ config.api_key = "3acb90c157c9f968d4e7d8929fd5264cc2c9693fa67a83911412ef9b6bfa95f6"
12
11
  end
13
12
  @retriever = PoxyClient.retriever
14
13
  end
15
14
 
16
15
  def test_retriever_config
17
- assert_equal @retriever.origin, "http://poxy.porta.sh"
16
+ assert_equal @retriever.origin, "https://poxy.apiary.io"
18
17
  assert_equal @retriever.mode, "development"
19
18
  end
20
19
 
21
20
  def test_retriever_get
22
- response = @retriever.get(:all)
23
- assert_equal response.class, HTTPI::Response
21
+ response = @retriever.get
22
+ assert_equal response.code, 200
23
+ parsed = JSON.parse(response.body)
24
+ expected = {"code" => "200"}
25
+ assert_equal parsed["code"], expected["code"]
26
+ end
27
+
28
+
29
+ def test_a_few_requests
30
+ response = @retriever.get(:search => "bucket_id: 1", :page => 1, :per_page => 50)
31
+ parsed = JSON.parse(response.body)
32
+ expected = { "item_count" => 3, "item_class" => "request", "page" => 1, "per_page" => 50 }
33
+ assert_equal parsed["item_count"], expected["item_count"]
34
+ assert_equal parsed["item_class"], expected["item_class"]
35
+ assert_equal parsed["page"], expected["page"]
36
+ assert_equal parsed["per_page"], expected["per_page"]
24
37
  end
25
38
 
26
-
27
39
 
28
40
 
29
41
  end
metadata CHANGED
@@ -1,50 +1,86 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: poxy_client
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1.pre.2
5
- prerelease: 6
4
+ version: 0.0.1
6
5
  platform: ruby
7
6
  authors:
8
7
  - Julian Porta
9
8
  autorequire:
10
9
  bindir: bin
11
10
  cert_chain: []
12
- date: 2012-07-12 00:00:00.000000000 Z
11
+ date: 2014-02-17 00:00:00.000000000 Z
13
12
  dependencies:
14
13
  - !ruby/object:Gem::Dependency
15
14
  name: httpi
16
- requirement: &23073740 !ruby/object:Gem::Requirement
17
- none: false
15
+ requirement: !ruby/object:Gem::Requirement
18
16
  requirements:
19
- - - ! '>='
17
+ - - '>='
20
18
  - !ruby/object:Gem::Version
21
19
  version: 1.0.0
22
20
  type: :runtime
23
21
  prerelease: false
24
- version_requirements: *23073740
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - '>='
25
+ - !ruby/object:Gem::Version
26
+ version: 1.0.0
25
27
  - !ruby/object:Gem::Dependency
26
28
  name: clap
27
- requirement: &23073220 !ruby/object:Gem::Requirement
28
- none: false
29
+ requirement: !ruby/object:Gem::Requirement
29
30
  requirements:
30
- - - ! '>='
31
+ - - '>='
31
32
  - !ruby/object:Gem::Version
32
33
  version: 0.0.2
33
34
  type: :runtime
34
35
  prerelease: false
35
- version_requirements: *23073220
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - '>='
39
+ - !ruby/object:Gem::Version
40
+ version: 0.0.2
36
41
  - !ruby/object:Gem::Dependency
37
42
  name: test-unit
38
- requirement: &23072840 !ruby/object:Gem::Requirement
39
- none: false
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - '>='
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - '>='
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: rake
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - '>='
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - '>='
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: curb
71
+ requirement: !ruby/object:Gem::Requirement
40
72
  requirements:
41
- - - ! '>='
73
+ - - '>='
42
74
  - !ruby/object:Gem::Version
43
75
  version: '0'
44
76
  type: :development
45
77
  prerelease: false
46
- version_requirements: *23072840
47
- description: Client for Poxy (the awesome app)
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - '>='
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ description: Client for Poxy (the http inbox)
48
84
  email:
49
85
  - julian@porta.sh
50
86
  executables:
@@ -58,6 +94,7 @@ files:
58
94
  - Gemfile
59
95
  - Guardfile
60
96
  - LICENSE.md
97
+ - README.html
61
98
  - README.md
62
99
  - Rakefile
63
100
  - bin/poxyd.rb
@@ -76,30 +113,28 @@ files:
76
113
  - test/test_poxy_processor.rb
77
114
  - test/test_poxy_repeater.rb
78
115
  - test/test_poxy_retriever.rb
79
- homepage: http://porta.github.com/poxy_client
116
+ homepage: https://github.com/Porta/poxy_client
80
117
  licenses: []
118
+ metadata: {}
81
119
  post_install_message: Thanks for installing poxy_client. Make sure to create an account
82
- at http://poxy.porta.sh
120
+ at http://poxy.ws
83
121
  rdoc_options: []
84
122
  require_paths:
85
123
  - lib
86
124
  required_ruby_version: !ruby/object:Gem::Requirement
87
- none: false
88
125
  requirements:
89
- - - ! '>='
126
+ - - '>='
90
127
  - !ruby/object:Gem::Version
91
128
  version: '0'
92
129
  required_rubygems_version: !ruby/object:Gem::Requirement
93
- none: false
94
130
  requirements:
95
- - - ! '>'
131
+ - - '>='
96
132
  - !ruby/object:Gem::Version
97
- version: 1.3.1
133
+ version: '0'
98
134
  requirements: []
99
135
  rubyforge_project:
100
- rubygems_version: 1.8.11
136
+ rubygems_version: 2.1.11
101
137
  signing_key:
102
- specification_version: 3
138
+ specification_version: 4
103
139
  summary: Poxy is a website that captures requests and lets you do fun stuff with them
104
140
  test_files: []
105
- has_rdoc: