Module: ApiResource::Scopes::ClassMethods

Defined in:
lib/api_resource/scopes.rb

Instance Method Summary collapse

Instance Method Details

#add_scopes(params, base = self) ⇒ Object

Apply scopes from params based on our resource definition



76
77
78
79
80
81
# File 'lib/api_resource/scopes.rb', line 76

def add_scopes(params, base = self)
  # scopes are stored as strings but we want to allow
  params = params.with_indifferent_access
  base = self.add_static_scopes(params, base)
  return self.add_dynamic_scopes(params, base)
end

#scope(scope_name, scope_definition) ⇒ Object

Called by base.rb e.g. paged

e.g. => "req", "per_page" => "opt"

Parameters:

  • scope_name

    is the scope_name of the scope from the json

  • scope_definition

    is always a hash with the arguments for the scope



28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
# File 'lib/api_resource/scopes.rb', line 28

def scope(scope_name, scope_definition)

  unless scope_definition.is_a?(Hash)
    raise ArgumentError, "Expecting an attributes hash given #{scope_definition.inspect}"
  end

  self.related_objects[:scopes][scope_name.to_sym] = scope_definition

  self.class_eval do

    define_singleton_method(scope_name) do |*args|

      arg_names = scope_definition.keys
      arg_types = scope_definition.values

      finder_opts = {
        scope_name => {}
      }

      arg_names.each_with_index do |arg_name, i|

        # If we are dealing with a scope with multiple args
        if arg_types[i] == :rest
          finder_opts[scope_name][arg_name] =
            args.slice(i, args.count)
        # Else we are only dealing with a single argument
        else
          if arg_types[i] == :req || (i < args.count)
            finder_opts[scope_name][arg_name] = args[i]
          end
        end
      end

      # if we have nothing at this point we should just pass 'true'
      if finder_opts[scope_name] == {}
        finder_opts[scope_name] = true
      end

      ApiResource::Conditions::ScopeCondition.new(finder_opts, self)

    end
  end
end

#scope?(name) ⇒ Boolean

Returns:

  • (Boolean)


13
14
15
# File 'lib/api_resource/scopes.rb', line 13

def scope?(name)
  self.related_objects[:scopes].has_key?(name.to_sym)
end

#scope_attributes(name) ⇒ Object



17
18
19
20
# File 'lib/api_resource/scopes.rb', line 17

def scope_attributes(name)
  raise "No such scope #{name}" unless self.scope?(name)
  self.related_objects[:scopes][name.to_sym]
end

#scopesObject

TODO: calling these methods should force loading of the resource definition



8
9
10
11
# File 'lib/api_resource/scopes.rb', line 8

def scopes
  self.reload_resource_definition
  return self.related_objects[:scopes]
end