ways-and-means 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,5 @@
1
+ # encoding: utf-8
2
+
3
+ $:.unshift File.expand_path('../lib', __FILE__)
4
+
5
+ require 'ways-and-means/sinatra/ways-and-means'
@@ -0,0 +1,117 @@
1
+ # encoding: utf-8
2
+
3
+ require 'sinatra/base'
4
+
5
+ module Sinatra
6
+
7
+ module WaysAndMeans
8
+
9
+ # reserved configuration keys
10
+ # i allow people to be less funky than i am
11
+ # with key names, hence 'routes'
12
+ WAYS_KEYS = %w|ways routes|.freeze
13
+
14
+ # HTTP verbs list
15
+ VERBS = %w|get post patch put delete head options|.freeze
16
+
17
+ def ways_and_means!(ways_and_means=nil)
18
+ # Pfff'... Should probably be more tyrannical here...
19
+ # if you registered, you should know what you're doing, right ?
20
+ return unless @config = ways_and_means || config
21
+
22
+ # the verb
23
+ # the endpoint to string prefixed by '/'
24
+ # the callback
25
+ #
26
+ # get '/plop' do
27
+ # callback
28
+ # end
29
+ ways do |endpoint, dispatch|
30
+ # if ever you wanna do something
31
+ # with dispatch info' set right
32
+ yield endpoint, dispatch if block_given?
33
+
34
+ send dispatch[:verb], "/#{endpoint}" do
35
+ send dispatch[:to]
36
+ end
37
+ end
38
+
39
+ # settings
40
+ means
41
+ end
42
+
43
+ private
44
+
45
+ def ways
46
+ ways_config.each do |endpoint, dispatch|
47
+ # home: { get: { to: 'home', other_params: "plop" }, patch: { to: 'patch_home', other_params: "plip" } }
48
+ # get '/home' do
49
+ # home
50
+ # end
51
+ #
52
+ # patch '/home' do
53
+ # patch_home
54
+ # end
55
+ if dispatch.is_a?(Hash) && dispatch.keys.any? { |k| VERBS.include? k.to_s }
56
+ dispatch.each do |k, v|
57
+ yield endpoint, v.merge(verb: k)
58
+ end
59
+
60
+ # index: { to: 'show_index', other_params: "plop" }
61
+ # get '/index' do ## no verb specified, defaulted to 'get'
62
+ # show_index
63
+ # end
64
+ elsif dispatch.is_a?(Hash)
65
+ yield endpoint, { verb: 'get' }.merge!(dispatch)
66
+
67
+ # show: nil
68
+ # get '/show' do ## no verb specified, defaulted to 'get'
69
+ # show
70
+ # end
71
+ #
72
+ # 'show/:person_id': "show_person"
73
+ # get '/show/:person_id' do ## no verb specified, defaulted to 'get'
74
+ # show_person
75
+ # end
76
+ else
77
+ yield endpoint, { verb: 'get', to: (dispatch || endpoint) }
78
+ end
79
+ end
80
+ end
81
+
82
+ def ways_config
83
+ # hash.slice, i miss you...
84
+ # at least this is safe and very explicit
85
+ config['ways'] || config[:ways] || config['routes'] || config[:routes] || {}
86
+
87
+ # while this is not
88
+ # WAYS_KEYS.inject({}) { |w, k| w.merge!(config[k] || config[k.to_sym] || {}) }
89
+
90
+ # and this is ruby-coated Perl
91
+ # WAYS_KEYS.map { |k| [k, k.to_sym] }.flatten.map { |k| config[k] }.compact.first
92
+ end
93
+
94
+ def means
95
+ # set key / values in App.settings
96
+ means_config do |mean, it|
97
+ set mean, it
98
+ end
99
+ end
100
+
101
+ def means_config
102
+ # key / values except reserved space for routes
103
+ config.reject { |k, v| WAYS_KEYS.include? k.to_s }.each do |k, v|
104
+ yield k.to_sym, v
105
+ end
106
+ end
107
+
108
+ # Well... What can i say now ...? Oh, i know : too many parentheses !
109
+ def config
110
+ @config ||= YAML.load(open(File.join('config', 'ways-and-means.yml'))) rescue nil
111
+ end
112
+
113
+ end
114
+
115
+ register WaysAndMeans
116
+
117
+ end
@@ -0,0 +1,3 @@
1
+ module WaysAndMeans
2
+ VERSION = "0.0.1"
3
+ end
metadata ADDED
@@ -0,0 +1,97 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: ways-and-means
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - lacravate
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2012-12-18 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: sinatra
16
+ requirement: !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: '0'
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ! '>='
28
+ - !ruby/object:Gem::Version
29
+ version: '0'
30
+ - !ruby/object:Gem::Dependency
31
+ name: rspec
32
+ requirement: !ruby/object:Gem::Requirement
33
+ none: false
34
+ requirements:
35
+ - - ! '>='
36
+ - !ruby/object:Gem::Version
37
+ version: '0'
38
+ type: :development
39
+ prerelease: false
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ! '>='
44
+ - !ruby/object:Gem::Version
45
+ version: '0'
46
+ - !ruby/object:Gem::Dependency
47
+ name: rack-test
48
+ requirement: !ruby/object:Gem::Requirement
49
+ none: false
50
+ requirements:
51
+ - - ! '>='
52
+ - !ruby/object:Gem::Version
53
+ version: '0'
54
+ type: :development
55
+ prerelease: false
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ none: false
58
+ requirements:
59
+ - - ! '>='
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ description: Sinatra routes and Sinatra settings through configuration data, hash
63
+ or yaml file
64
+ email:
65
+ - lacravate@lacravate.fr
66
+ executables: []
67
+ extensions: []
68
+ extra_rdoc_files: []
69
+ files:
70
+ - lib/ways-and-means.rb
71
+ - lib/ways-and-means/sinatra/ways-and-means.rb
72
+ - lib/ways-and-means/version.rb
73
+ homepage: https://github.com/lacravate/ways-and-means
74
+ licenses: []
75
+ post_install_message:
76
+ rdoc_options: []
77
+ require_paths:
78
+ - lib
79
+ required_ruby_version: !ruby/object:Gem::Requirement
80
+ none: false
81
+ requirements:
82
+ - - ! '>='
83
+ - !ruby/object:Gem::Version
84
+ version: '0'
85
+ required_rubygems_version: !ruby/object:Gem::Requirement
86
+ none: false
87
+ requirements:
88
+ - - ! '>='
89
+ - !ruby/object:Gem::Version
90
+ version: '0'
91
+ requirements: []
92
+ rubyforge_project: ! '[none]'
93
+ rubygems_version: 1.8.24
94
+ signing_key:
95
+ specification_version: 3
96
+ summary: Sinatra routes and Sinatra settings from configuration data
97
+ test_files: []