endpointer 0.0.4 → 0.0.5
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.
- checksums.yaml +4 -4
- data/.travis.yml +1 -0
- data/README.md +22 -4
- data/bin/endpointer +3 -6
- data/endpointer.gemspec +1 -0
- data/examples/endpointer.json +19 -0
- data/lib/endpointer.rb +21 -10
- data/lib/endpointer/app_creator.rb +7 -3
- data/lib/endpointer/argument_parser.rb +30 -47
- data/lib/endpointer/configuration.rb +18 -0
- data/lib/endpointer/resource_parser.rb +23 -0
- data/lib/endpointer/version.rb +1 -1
- metadata +6 -4
- data/lib/endpointer/options.rb +0 -11
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a628ec40e0ebf2d37e81363bc14414499a71e2ca
|
4
|
+
data.tar.gz: 44ccbdca0c8c66cdbfc029c1a54ad7bbd05069e4
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a1faa71cf5ea0e0dcf5bd8684bb7af2ae940adee40c3a073579c3e3fcbd74915fb896b711d54a6c834b8a84b74c7ab77ff037e7acc3171e7bb8e13950307edad
|
7
|
+
data.tar.gz: 881bed74421da18ace219797cfafb0e359a88e010c3d4d7cbbcecb48180c2f30007f96baf34cdb058ba2a2338f6d6851bf08245224218ac1d19e06876351551a
|
data/.travis.yml
CHANGED
data/README.md
CHANGED
@@ -6,7 +6,7 @@ Endpointer is a small gem that tries to act as a caching proxy between your dev
|
|
6
6
|
|
7
7
|
## Requirements
|
8
8
|
|
9
|
-
* Ruby 2.2+ (Tests running against MRI 2.4.0, 2.3.3, and JRuby 9.1.6.0)
|
9
|
+
* Ruby 2.2+ (Tests running against MRI 2.4.0, 2.3.3, 2.2.6, and JRuby 9.1.6.0)
|
10
10
|
|
11
11
|
## Installation
|
12
12
|
|
@@ -45,7 +45,19 @@ In order to use Endpointer you need to create a JSON configuration file with the
|
|
45
45
|
|
46
46
|
You can then invoke endpointer by executing
|
47
47
|
|
48
|
-
$ endpointer
|
48
|
+
$ endpointer
|
49
|
+
|
50
|
+
(Note: Endpointer by default looks for a file called `endpointer.json` in the current directory)
|
51
|
+
|
52
|
+
A full list of endpointer commands can be seen by invoking `endpointer --help`
|
53
|
+
```
|
54
|
+
❯ endpointer --help
|
55
|
+
Usage: endpointer [options]
|
56
|
+
-d, --cache-dir CACHE_DIR Modifies the default cache directory [Default: TMP_DIR/endpointer_cache]
|
57
|
+
-i, --invalidate Invalidates the cache at startup
|
58
|
+
-c, --config CONFIG Override the default resource config file path. [Default: ./endpointer.json]
|
59
|
+
|
60
|
+
```
|
49
61
|
|
50
62
|
Or, include it in a config.ru
|
51
63
|
|
@@ -54,7 +66,13 @@ Or, include it in a config.ru
|
|
54
66
|
#config.ru
|
55
67
|
require 'endpointer'
|
56
68
|
|
57
|
-
|
69
|
+
Endpointer.configure do |config|
|
70
|
+
config.invalidate = false # Default
|
71
|
+
config.resource_config = File.read('./endpointer.json') # Default
|
72
|
+
config.cache_dir = File.join(Dir.tmpdir, 'endpointer_cache') # Default
|
73
|
+
end
|
74
|
+
|
75
|
+
run Endpointer.app
|
58
76
|
```
|
59
77
|
|
60
78
|
Endpointer will attempt to return a cached resource, if one is found to match the request. Otherwise, a call to the real service will be performed and the response, if successful, persisted.
|
@@ -71,7 +89,7 @@ If the request is to be executed against the real service the headers defined in
|
|
71
89
|
|
72
90
|
By default endpointer will use your operating system's temp directory to store its cache files `(TMP_DIR/endpointer_cache)`. In order to configure the cache path you need to pass the `--cache-dir=<path>` argument.
|
73
91
|
|
74
|
-
$ endpointer
|
92
|
+
$ endpointer -cache-dir=/path/to/cache
|
75
93
|
|
76
94
|
You can provide the `--invalidate` flag to the command line to invalidate the cache. This empties the endpointer_cache directory.
|
77
95
|
|
data/bin/endpointer
CHANGED
@@ -2,10 +2,7 @@
|
|
2
2
|
|
3
3
|
require "bundler/setup"
|
4
4
|
require "endpointer"
|
5
|
+
require "endpointer/argument_parser"
|
5
6
|
|
6
|
-
|
7
|
-
|
8
|
-
rescue Endpointer::Errors::InvalidArgumentsError
|
9
|
-
STDERR.puts "Usage: endpointer [--invalidate] [--cache-dir=/path/to/cache] <path_to_json_config>.json"
|
10
|
-
exit 1
|
11
|
-
end
|
7
|
+
config = Endpointer::ArgumentParser.new.parse(ARGV)
|
8
|
+
Endpointer.run config
|
data/endpointer.gemspec
CHANGED
@@ -13,6 +13,7 @@ Gem::Specification.new do |spec|
|
|
13
13
|
spec.description = %q{Allows you to define endpoints to serve via a small caching proxy}
|
14
14
|
spec.homepage = "https://github.com/zenonas/endpointer"
|
15
15
|
spec.license = "MIT"
|
16
|
+
spec.required_ruby_version = '>= 2.2.0'
|
16
17
|
|
17
18
|
spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
|
18
19
|
spec.executables = ["endpointer"]
|
@@ -0,0 +1,19 @@
|
|
1
|
+
[
|
2
|
+
{
|
3
|
+
"id": "httpbinpost",
|
4
|
+
"method": "post",
|
5
|
+
"url": "http://httpbin.org/post",
|
6
|
+
"headers": {
|
7
|
+
"Authorization": "Bearer test",
|
8
|
+
"Content-Type": "application/json"
|
9
|
+
}
|
10
|
+
},
|
11
|
+
{
|
12
|
+
"id": "httpbinget",
|
13
|
+
"method": "get",
|
14
|
+
"url": "https://httpbin.org/get",
|
15
|
+
"headers": {
|
16
|
+
"Authorization": "Bearer test"
|
17
|
+
}
|
18
|
+
}
|
19
|
+
]
|
data/lib/endpointer.rb
CHANGED
@@ -1,19 +1,30 @@
|
|
1
1
|
require "endpointer/version"
|
2
|
-
require "endpointer/
|
2
|
+
require "endpointer/resource_parser"
|
3
3
|
require "endpointer/app_creator"
|
4
4
|
require "endpointer/errors/invalid_arguments_error"
|
5
|
+
require 'endpointer/configuration'
|
5
6
|
|
6
7
|
module Endpointer
|
8
|
+
class << self
|
9
|
+
def run(config)
|
10
|
+
@configuration = config
|
11
|
+
app.run!
|
12
|
+
end
|
7
13
|
|
8
|
-
|
9
|
-
|
10
|
-
|
14
|
+
def app
|
15
|
+
Cacher.new(configuration.cache_dir).invalidate if configuration.invalidate
|
16
|
+
AppCreator.new.create(configuration)
|
17
|
+
end
|
18
|
+
|
19
|
+
def configure
|
20
|
+
yield(configuration) if block_given?
|
21
|
+
self
|
22
|
+
end
|
23
|
+
|
24
|
+
private
|
11
25
|
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
options = argument_parser.parse_options
|
16
|
-
Cacher.new(options.cache_dir).invalidate if options.invalidate
|
17
|
-
AppCreator.new.create(argument_parser.parse_resources, options)
|
26
|
+
def configuration
|
27
|
+
@configuration ||= Configuration.new
|
28
|
+
end
|
18
29
|
end
|
19
30
|
end
|
@@ -5,10 +5,10 @@ require 'uri'
|
|
5
5
|
module Endpointer
|
6
6
|
class AppCreator
|
7
7
|
|
8
|
-
def create(
|
9
|
-
resources.each do |resource|
|
8
|
+
def create(config)
|
9
|
+
resources(config).each do |resource|
|
10
10
|
app.send(resource.method, path(resource.url)) do
|
11
|
-
executor_response = Endpointer::ResourceExecutor.new.perform(request, resource,
|
11
|
+
executor_response = Endpointer::ResourceExecutor.new.perform(request, resource, config)
|
12
12
|
headers executor_response.headers
|
13
13
|
executor_response.body
|
14
14
|
end
|
@@ -25,5 +25,9 @@ module Endpointer
|
|
25
25
|
def path(url)
|
26
26
|
URI.parse(url).path
|
27
27
|
end
|
28
|
+
|
29
|
+
def resources(config)
|
30
|
+
Endpointer::ResourceParser.new.parse(config.resource_config)
|
31
|
+
end
|
28
32
|
end
|
29
33
|
end
|
@@ -1,64 +1,47 @@
|
|
1
1
|
require 'endpointer/resource'
|
2
|
-
require 'endpointer/
|
2
|
+
require 'endpointer/configuration'
|
3
3
|
require 'json'
|
4
4
|
|
5
5
|
module Endpointer
|
6
6
|
class ArgumentParser
|
7
7
|
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
def initialize(arguments)
|
14
|
-
@arguments = arguments
|
15
|
-
end
|
16
|
-
|
17
|
-
def parse_resources
|
18
|
-
parse_config(config_file).map do |resource|
|
19
|
-
Resource.new(resource["id"], resource["method"].to_sym, resource["url"], resource["headers"])
|
8
|
+
def parse(arguments)
|
9
|
+
begin
|
10
|
+
opt_parser.parse(arguments)
|
11
|
+
rescue OptionParser::InvalidOption => e
|
12
|
+
abort "Error: #{e}"
|
20
13
|
end
|
21
|
-
end
|
22
14
|
|
23
|
-
|
24
|
-
options = @arguments.select { |argument| option_argument?(argument)}
|
25
|
-
build_options_from(options)
|
26
|
-
end
|
27
|
-
|
28
|
-
def valid?
|
29
|
-
return false unless config_file
|
30
|
-
valid_arguments = VALID_OPTIONS + [config_file]
|
31
|
-
return false if @arguments.any? { |arg|
|
32
|
-
valid_arguments.none? { |valid_opt| arg.include?(valid_opt) }
|
33
|
-
}
|
34
|
-
true
|
15
|
+
configuration
|
35
16
|
end
|
36
17
|
|
37
18
|
private
|
38
19
|
|
39
|
-
def
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
20
|
+
def opt_parser
|
21
|
+
OptionParser.new do |parser|
|
22
|
+
parser.banner = "Usage: endpointer [options]"
|
23
|
+
|
24
|
+
parser.on("-d CACHE_DIR", "--cache-dir CACHE_DIR", "Modifies the default cache directory [Default: TMP_DIR/endpointer_cache]") do |cache_dir|
|
25
|
+
configuration.cache_dir = cache_dir if cache_dir
|
26
|
+
end
|
27
|
+
|
28
|
+
parser.on("-i", "--invalidate", "Invalidates the cache at startup") do
|
29
|
+
configuration.invalidate = true
|
30
|
+
end
|
31
|
+
|
32
|
+
parser.on("-c CONFIG", "--config CONFIG", "Override the default resource config file path. [Default: ./endpointer.json]") do |config|
|
33
|
+
begin
|
34
|
+
resource_config = File.read(config)
|
35
|
+
configuration.resource_config = resource_config
|
36
|
+
rescue Errno::ENOENT
|
37
|
+
abort "Error: Config file supplied does not exist"
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
57
41
|
end
|
58
42
|
|
59
|
-
def
|
60
|
-
|
43
|
+
def configuration
|
44
|
+
@configuration ||= Endpointer::Configuration.new
|
61
45
|
end
|
62
|
-
|
63
46
|
end
|
64
47
|
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
module Endpointer
|
2
|
+
class Configuration
|
3
|
+
|
4
|
+
attr_accessor :invalidate, :cache_dir, :resource_config
|
5
|
+
|
6
|
+
DEFAULT_CONFIG_PATH = './endpointer.json'
|
7
|
+
|
8
|
+
def initialize(invalidate = nil, cache_dir = nil)
|
9
|
+
@invalidate = invalidate || false
|
10
|
+
@cache_dir = cache_dir || File.join(Dir.tmpdir, "endpointer_cache")
|
11
|
+
begin
|
12
|
+
@resource_config = File.read(DEFAULT_CONFIG_PATH)
|
13
|
+
rescue Errno::ENOENT
|
14
|
+
@resource_config = nil
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
require 'json'
|
2
|
+
require 'endpointer/resource'
|
3
|
+
|
4
|
+
module Endpointer
|
5
|
+
class ResourceParser
|
6
|
+
def parse(resource_config)
|
7
|
+
parse_config(resource_config).map do |resource|
|
8
|
+
Resource.new(resource["id"], resource["method"].to_sym, resource["url"], resource["headers"])
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
private
|
13
|
+
|
14
|
+
def parse_config(config)
|
15
|
+
abort("Error: No config file present") if config.nil?
|
16
|
+
begin
|
17
|
+
JSON.parse(config)
|
18
|
+
rescue JSON::ParserError
|
19
|
+
abort("Error: The resource config is invalid")
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
data/lib/endpointer/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: endpointer
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.5
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Zen Kyprianou
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-01-
|
11
|
+
date: 2017-01-14 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -170,17 +170,18 @@ files:
|
|
170
170
|
- bin/console
|
171
171
|
- bin/endpointer
|
172
172
|
- endpointer.gemspec
|
173
|
+
- examples/endpointer.json
|
173
174
|
- lib/endpointer.rb
|
174
175
|
- lib/endpointer/app.rb
|
175
176
|
- lib/endpointer/app_creator.rb
|
176
177
|
- lib/endpointer/argument_parser.rb
|
177
178
|
- lib/endpointer/cache_container.rb
|
178
179
|
- lib/endpointer/cacher.rb
|
180
|
+
- lib/endpointer/configuration.rb
|
179
181
|
- lib/endpointer/errors/cached_item_not_found_error.rb
|
180
182
|
- lib/endpointer/errors/invalid_arguments_error.rb
|
181
183
|
- lib/endpointer/errors/invalid_cache_dir_error.rb
|
182
184
|
- lib/endpointer/errors/performer_not_found_error.rb
|
183
|
-
- lib/endpointer/options.rb
|
184
185
|
- lib/endpointer/performer_factory.rb
|
185
186
|
- lib/endpointer/performers.rb
|
186
187
|
- lib/endpointer/performers/get.rb
|
@@ -188,6 +189,7 @@ files:
|
|
188
189
|
- lib/endpointer/performers/post.rb
|
189
190
|
- lib/endpointer/resource.rb
|
190
191
|
- lib/endpointer/resource_executor.rb
|
192
|
+
- lib/endpointer/resource_parser.rb
|
191
193
|
- lib/endpointer/response.rb
|
192
194
|
- lib/endpointer/response_presenter.rb
|
193
195
|
- lib/endpointer/version.rb
|
@@ -203,7 +205,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
203
205
|
requirements:
|
204
206
|
- - ">="
|
205
207
|
- !ruby/object:Gem::Version
|
206
|
-
version:
|
208
|
+
version: 2.2.0
|
207
209
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
208
210
|
requirements:
|
209
211
|
- - ">="
|
data/lib/endpointer/options.rb
DELETED