path-to 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.
data/Manifest.txt CHANGED
@@ -6,13 +6,16 @@ README.rdoc
6
6
  Rakefile
7
7
  lib/path-to.rb
8
8
  lib/path-to/application.rb
9
+ lib/path-to/described_routes.rb
9
10
  lib/path-to/http_client.rb
10
11
  lib/path-to/path.rb
11
12
  lib/path-to/with_params.rb
12
13
  script/console
13
14
  script/destroy
14
15
  script/generate
16
+ test/path-to/fixtures/described_routes_test.json
15
17
  test/path-to/test_application.rb
18
+ test/path-to/test_described_routes.rb
16
19
  test/path-to/test_path.rb
17
20
  test/path-to/test_with_params.rb
18
21
  test/test_helper.rb
@@ -0,0 +1,107 @@
1
+ require "path-to"
2
+ require "described_routes"
3
+
4
+ module PathTo
5
+ module DescribedRoutes
6
+ class TemplatedPath < WithParams
7
+ attr_reader :resource_template
8
+
9
+ def initialize(parent, service, params, resource_template)
10
+ super(parent, service, params)
11
+ @resource_template = resource_template
12
+
13
+ missing_params = resource_template.params - params.keys
14
+ unless missing_params.empty?
15
+ raise ArgumentError.new(
16
+ "Missing params #{missing_params.join(', ')} " +
17
+ "(template #{resource_template.name.inspect}," +
18
+ " path_template #{resource_template.path_template.inspect}," +
19
+ " params #{params.inspect})")
20
+ end
21
+ end
22
+
23
+ def uri_template
24
+ @uri_template ||= application.base + resource_template.path_template
25
+ end
26
+
27
+ def uri
28
+ @uri ||= begin
29
+ string_keyed_params = params.keys.inject({}){|hash, key| hash[key.to_s] = params[key]; hash}
30
+ Addressable::URI.expand_template(uri_template, string_keyed_params).to_s
31
+ end
32
+ end
33
+
34
+ #
35
+ # Finds (once) the application in the parent hierarchy.
36
+ #
37
+ def application
38
+ @application ||= parent.application if parent
39
+ end
40
+ end
41
+
42
+ class Application < WithParams
43
+ # An Array of DescribedRoutes::Resource objects
44
+ attr_reader :resources
45
+
46
+ # A Class (or at least something with a #new method) from which child objects will be created
47
+ attr_reader :default_type
48
+
49
+ # An HTTParty or similar
50
+ attr_reader :http_client
51
+
52
+ attr_reader :base
53
+
54
+ def initialize(resources, base, params = {}, default_type = TemplatedPath, http_client = HTTPClient)
55
+ @base, @resources, @default_type, @http_client = base, resources, default_type, http_client
56
+ super(nil, nil, params)
57
+ end
58
+
59
+ #
60
+ # Tries to respond to a missing method. We can do so if
61
+ #
62
+ # 1. we have a resource template matching the method name
63
+ # 2. #child_class_for returns a class or other factory object capable of creating a new child instance
64
+ #
65
+ # Otherwise we invoke super in the hope of avoiding any hard-to-debug behaviour!
66
+ #
67
+ def method_missing(method, *args)
68
+ resource_template = resource_templates_by_name[method.to_s]
69
+ if resource_template && (child_class = child_class_for(self, method, params, resource_template))
70
+ params = args.inject(Hash.new){|h, arg| h.merge(arg)}
71
+ child(child_class, method, params, resource_template)
72
+ else
73
+ super
74
+ end
75
+ end
76
+
77
+ #
78
+ # Determines whether this application &/or its child objects should respond to the given method, and if so returns a class from
79
+ # which a new child instance (typically Path or a subclass thereof) will be created. This implementation (easily overridden)
80
+ # returns #default_type if there is a URI template defined for the method.
81
+ #
82
+ # Parameters:
83
+ #
84
+ # [instance] This application or (presumably) one of its child objects
85
+ # [method] The method invoked on the instance that has (presumably) been intercepted by instance#method_missing
86
+ # [params] The instance's params
87
+ #
88
+ def child_class_for(instance, method, params, template)
89
+ default_type
90
+ end
91
+
92
+ #
93
+ # Returns a hash of all ResourceTemplates (the tree flattened) keyed by name
94
+ #
95
+ def resource_templates_by_name
96
+ @resource_templates_by_name ||= ::DescribedRoutes.all_by_name(resources)
97
+ end
98
+
99
+ #
100
+ # Returns self. See TemplatedPath#application.
101
+ #
102
+ def application
103
+ self
104
+ end
105
+ end
106
+ end
107
+ end
data/lib/path-to.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  module PathTo
2
- VERSION = "0.0.4"
2
+ VERSION = "0.0.5"
3
3
  end
4
4
 
5
5
  $:.push File.dirname(__FILE__)
@@ -0,0 +1 @@
1
+ [{"name":"root","path_template":"\/"},{"name":"admin_products","resource_templates":[{"name":"admin_product","resource_templates":[{"name":"edit_admin_product","options":["GET"],"path_template":"\/admin\/products\/{product_id}\/edit{-prefix|.|format}","rel":"edit","optional_params":["format"],"params":["product_id"]}],"options":["GET","PUT","DELETE"],"path_template":"\/admin\/products\/{product_id}{-prefix|.|format}","optional_params":["format"],"params":["product_id"]},{"name":"new_admin_product","options":["GET"],"path_template":"\/admin\/products\/new{-prefix|.|format}","optional_params":["format"]}],"options":["GET","POST"],"path_template":"\/admin\/products{-prefix|.|format}","optional_params":["format"]},{"name":"pages","resource_templates":[{"name":"page","resource_templates":[{"name":"edit_page","options":["GET"],"path_template":"\/pages\/{page_id}\/edit{-prefix|.|format}","rel":"edit","optional_params":["format"],"params":["page_id"]},{"name":"summary_page","options":["GET"],"path_template":"\/pages\/{page_id}\/summary{-prefix|.|format}","rel":"summary","optional_params":["format"],"params":["page_id"]},{"name":"toggle_visibility_page","options":["POST"],"path_template":"\/pages\/{page_id}\/toggle_visibility{-prefix|.|format}","rel":"toggle_visibility","optional_params":["format"],"params":["page_id"]}],"options":["GET","PUT","DELETE"],"path_template":"\/pages\/{page_id}{-prefix|.|format}","optional_params":["format"],"params":["page_id"]},{"name":"new_page","options":["GET"],"path_template":"\/pages\/new{-prefix|.|format}","optional_params":["format"]}],"options":["GET","POST"],"path_template":"\/pages{-prefix|.|format}","optional_params":["format"]},{"name":"users","resource_templates":[{"name":"user","resource_templates":[{"name":"user_articles","resource_templates":[{"name":"user_article","resource_templates":[{"name":"edit_user_article","options":["GET"],"path_template":"\/users\/{user_id}\/articles\/{article_id}\/edit{-prefix|.|format}","rel":"edit","optional_params":["format"],"params":["user_id","article_id"]}],"options":["GET","PUT","DELETE"],"path_template":"\/users\/{user_id}\/articles\/{article_id}{-prefix|.|format}","optional_params":["format"],"params":["user_id","article_id"]},{"name":"new_user_article","options":["GET"],"path_template":"\/users\/{user_id}\/articles\/new{-prefix|.|format}","optional_params":["format"],"params":["user_id"]},{"name":"recent_user_articles","options":["GET"],"path_template":"\/users\/{user_id}\/articles\/recent{-prefix|.|format}","rel":"recent","optional_params":["format"],"params":["user_id"]}],"options":["GET","POST"],"path_template":"\/users\/{user_id}\/articles{-prefix|.|format}","rel":"articles","optional_params":["format"],"params":["user_id"]},{"name":"edit_user","options":["GET"],"path_template":"\/users\/{user_id}\/edit{-prefix|.|format}","rel":"edit","optional_params":["format"],"params":["user_id"]},{"name":"user_profile","resource_templates":[{"name":"edit_user_profile","options":["GET"],"path_template":"\/users\/{user_id}\/profile\/edit{-prefix|.|format}","rel":"edit","optional_params":["format"],"params":["user_id"]},{"name":"new_user_profile","options":["GET"],"path_template":"\/users\/{user_id}\/profile\/new{-prefix|.|format}","rel":"new","optional_params":["format"],"params":["user_id"]}],"options":["GET","PUT","DELETE","POST"],"path_template":"\/users\/{user_id}\/profile{-prefix|.|format}","rel":"profile","optional_params":["format"],"params":["user_id"]}],"options":["GET","PUT","DELETE"],"path_template":"\/users\/{user_id}{-prefix|.|format}","optional_params":["format"],"params":["user_id"]},{"name":"new_user","options":["GET"],"path_template":"\/users\/new{-prefix|.|format}","optional_params":["format"]}],"options":["GET","POST"],"path_template":"\/users{-prefix|.|format}","optional_params":["format"]}]
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: path-to
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.4
4
+ version: 0.0.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Mike Burrows (asplake)
@@ -73,13 +73,16 @@ files:
73
73
  - Rakefile
74
74
  - lib/path-to.rb
75
75
  - lib/path-to/application.rb
76
+ - lib/path-to/described_routes.rb
76
77
  - lib/path-to/http_client.rb
77
78
  - lib/path-to/path.rb
78
79
  - lib/path-to/with_params.rb
79
80
  - script/console
80
81
  - script/destroy
81
82
  - script/generate
83
+ - test/path-to/fixtures/described_routes_test.json
82
84
  - test/path-to/test_application.rb
85
+ - test/path-to/test_described_routes.rb
83
86
  - test/path-to/test_path.rb
84
87
  - test/path-to/test_with_params.rb
85
88
  - test/test_helper.rb