grape_has_scope 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 5781a062b32b540e375568c51c45fe38c92729df
4
+ data.tar.gz: 4e02b3a418cd8d02d5a7417071eef84bb94af337
5
+ SHA512:
6
+ metadata.gz: 4529bd0a950ce35b9e3087fa84f76674384c17d620bc708c7669478149a4a955381944f5bb347cfce821499ea77af6e661bf0cbff819434c6ea3e7361effc74d
7
+ data.tar.gz: f0b49285d0bbb10daae6eef30689519572bd124d2b1ceee6f014708d9b18417bf92ab0160e6f0eae16caf92469d66d597ceb21340e5d836fe8de4b21a93fac83
data/Gemfile ADDED
@@ -0,0 +1,17 @@
1
+ source "http://rubygems.org"
2
+
3
+ # Declare your gem's dependencies in dalli-delete-matched.gemspec.
4
+ # Bundler will treat runtime dependencies like base dependencies, and
5
+ # development dependencies will be added by default to the :development group.
6
+ gemspec
7
+
8
+ # jquery-rails is used by the dummy application
9
+ # gem "jquery-rails"
10
+
11
+ # Declare any dependencies that are still in development here instead of in
12
+ # your gemspec. These might include edge Rails or gems from your path or
13
+ # Git. Remember to move these dependencies to your gemspec before releasing
14
+ # your gem to rubygems.org.
15
+
16
+ # To use debugger
17
+ # gem 'debugger'
data/Gemfile.lock ADDED
@@ -0,0 +1,14 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ grape_has_scope (0.1.0)
5
+
6
+ GEM
7
+ remote: http://rubygems.org/
8
+ specs:
9
+
10
+ PLATFORMS
11
+ ruby
12
+
13
+ DEPENDENCIES
14
+ grape_has_scope!
data/README.rdoc ADDED
@@ -0,0 +1,3 @@
1
+ = has_scope implementation to use with Grape API
2
+
3
+ In a hurry, will write the instructions later :))
data/Rakefile ADDED
@@ -0,0 +1,2 @@
1
+ require 'bundler'
2
+ Bundler::GemHelper.install_tasks
@@ -0,0 +1,150 @@
1
+ module GrapeHasScope
2
+ TRUE_VALUES = ["true", true, "1", 1]
3
+
4
+ ALLOWED_TYPES = {
5
+ :array => [ Array ],
6
+ :hash => [ Hash ],
7
+ :boolean => [ Object ],
8
+ :default => [ String, Numeric ]
9
+ }
10
+
11
+ def self.included(base)
12
+ base.class_eval do
13
+ class_attribute :scopes_configuration
14
+ end
15
+ end
16
+
17
+ def has_scope(*scopes, &block)
18
+ options = scopes.extract_options!
19
+ options.symbolize_keys!
20
+ options.assert_valid_keys(:type, :only, :except, :if, :unless, :default, :as, :using, :allow_blank)
21
+
22
+ if options.key?(:using)
23
+ if options.key?(:type) && options[:type] != :hash
24
+ raise "You cannot use :using with another :type different than :hash"
25
+ else
26
+ options[:type] = :hash
27
+ end
28
+
29
+ options[:using] = Array(options[:using])
30
+ end
31
+
32
+ options[:only] = Array(options[:only])
33
+ options[:except] = Array(options[:except])
34
+
35
+ self.class.scopes_configuration = (self.class.scopes_configuration || {}).dup
36
+
37
+ scopes.each do |scope|
38
+ self.class.scopes_configuration[scope] ||= { :as => scope, :type => :default, :block => block }
39
+ self.class.scopes_configuration[scope] = self.class.scopes_configuration[scope].merge(options)
40
+ end
41
+ end
42
+
43
+ # Receives an object where scopes will be applied to.
44
+ #
45
+ # class GraduationsController < InheritedResources::Base
46
+ # has_scope :featured, :type => true, :only => :index
47
+ # has_scope :by_degree, :only => :index
48
+ #
49
+ # def index
50
+ # @graduations = apply_scopes(Graduation).all
51
+ # end
52
+ # end
53
+ #
54
+ def apply_scopes(target, hash=params)
55
+ return target unless scopes_configuration
56
+
57
+ self.class.scopes_configuration.each do |scope, options|
58
+ next unless apply_scope_to_action?(options)
59
+ key = options[:as]
60
+
61
+ if hash.key?(key)
62
+ value, call_scope = hash[key], true
63
+ elsif options.key?(:default)
64
+ value, call_scope = options[:default], true
65
+ value = value.call(self) if value.is_a?(Proc)
66
+ end
67
+
68
+ value = parse_value(options[:type], key, value)
69
+ value = normalize_blanks(value)
70
+
71
+ if call_scope && (value.present? || options[:allow_blank])
72
+ current_scopes[key] = value
73
+ target = call_scope_by_type(options[:type], scope, target, value, options)
74
+ end
75
+ end
76
+
77
+ target
78
+ end
79
+
80
+ # Set the real value for the current scope if type check.
81
+ def parse_value(type, key, value) #:nodoc:
82
+ if type == :boolean
83
+ TRUE_VALUES.include?(value)
84
+ elsif value && ALLOWED_TYPES[type].any?{ |klass| value.is_a?(klass) }
85
+ value
86
+ end
87
+ end
88
+
89
+ # Screens pseudo-blank params.
90
+ def normalize_blanks(value) #:nodoc:
91
+ return value if value.nil?
92
+ if value.is_a?(Array)
93
+ value.select { |v| v.present? }
94
+ elsif value.is_a?(Hash)
95
+ value.select { |k, v| normalize_blanks(v).present? }.with_indifferent_access
96
+ else
97
+ value
98
+ end
99
+ end
100
+
101
+ # Call the scope taking into account its type.
102
+ def call_scope_by_type(type, scope, target, value, options) #:nodoc:
103
+ block = options[:block]
104
+
105
+ if type == :boolean
106
+ block ? block.call(self, target) : target.send(scope)
107
+ elsif value && options.key?(:using)
108
+ value = value.values_at(*options[:using])
109
+ block ? block.call(self, target, value) : target.send(scope, *value)
110
+ else
111
+ block ? block.call(self, target, value) : target.send(scope, value)
112
+ end
113
+ end
114
+
115
+ # Given an options with :only and :except arrays, check if the scope
116
+ # can be performed in the current action.
117
+ def apply_scope_to_action?(options) #:nodoc:
118
+ return false unless applicable?(options[:if], true) && applicable?(options[:unless], false)
119
+
120
+ if options[:only].empty?
121
+ options[:except].empty? || !options[:except].include?(action_name.to_sym)
122
+ else
123
+ options[:only].include?(action_name.to_sym)
124
+ end
125
+ end
126
+
127
+ # Evaluates the scope options :if or :unless. Returns true if the proc
128
+ # method, or string evals to the expected value.
129
+ def applicable?(string_proc_or_symbol, expected) #:nodoc:
130
+ case string_proc_or_symbol
131
+ when String
132
+ eval(string_proc_or_symbol) == expected
133
+ when Proc
134
+ string_proc_or_symbol.call(self) == expected
135
+ when Symbol
136
+ send(string_proc_or_symbol) == expected
137
+ else
138
+ true
139
+ end
140
+ end
141
+
142
+ # Returns the scopes used in this action.
143
+ def current_scopes
144
+ @current_scopes ||= {}
145
+ end
146
+ end
147
+
148
+ class Grape::Endpoint
149
+ include GrapeHasScope
150
+ end
metadata ADDED
@@ -0,0 +1,53 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: grape_has_scope
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Kourza Ivan a.k.a. Phobos98
8
+ autorequire: builder
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2014-01-09 00:00:00.000000000 Z
12
+ dependencies: []
13
+ description: has_scope implementation to use with Grape API
14
+ email: phobos98@phobos98.net
15
+ executables: []
16
+ extensions: []
17
+ extra_rdoc_files:
18
+ - Gemfile
19
+ - Rakefile
20
+ - README.rdoc
21
+ - Gemfile.lock
22
+ files:
23
+ - lib/grape_has_scope.rb
24
+ - Gemfile
25
+ - Rakefile
26
+ - README.rdoc
27
+ - Gemfile.lock
28
+ homepage: https://github.com/Phobos98/grape_has_scope.git
29
+ licenses:
30
+ - MIT
31
+ metadata: {}
32
+ post_install_message:
33
+ rdoc_options: []
34
+ require_paths:
35
+ - lib
36
+ required_ruby_version: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - '>='
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ required_rubygems_version: !ruby/object:Gem::Requirement
42
+ requirements:
43
+ - - '>='
44
+ - !ruby/object:Gem::Version
45
+ version: 1.3.6
46
+ requirements: []
47
+ rubyforge_project: grape_has_scope
48
+ rubygems_version: 2.0.3
49
+ signing_key:
50
+ specification_version: 4
51
+ summary: has_scope implementation to use with Grape API
52
+ test_files: []
53
+ has_rdoc: true