Class: JsonapiCompliable::DSL

Inherits:
Object
  • Object
show all
Defined in:
lib/jsonapi_compliable/dsl.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize ⇒ DSL

Returns a new instance of DSL.



11
12
13
# File 'lib/jsonapi_compliable/dsl.rb', line 11

def initialize
  clear!
end

Instance Attribute Details

#default_filters ⇒ Object

Returns the value of attribute default_filters.



3
4
5
# File 'lib/jsonapi_compliable/dsl.rb', line 3

def default_filters
  @default_filters
end

#extra_fields ⇒ Object

Returns the value of attribute extra_fields.



3
4
5
# File 'lib/jsonapi_compliable/dsl.rb', line 3

def extra_fields
  @extra_fields
end

#filters ⇒ Object

Returns the value of attribute filters.



3
4
5
# File 'lib/jsonapi_compliable/dsl.rb', line 3

def filters
  @filters
end

#pagination ⇒ Object

Returns the value of attribute pagination.



3
4
5
# File 'lib/jsonapi_compliable/dsl.rb', line 3

def pagination
  @pagination
end

#sideloads ⇒ Object

Returns the value of attribute sideloads.



3
4
5
# File 'lib/jsonapi_compliable/dsl.rb', line 3

def sideloads
  @sideloads
end

#sorting ⇒ Object

Returns the value of attribute sorting.



3
4
5
# File 'lib/jsonapi_compliable/dsl.rb', line 3

def sorting
  @sorting
end

#stats ⇒ Object

Returns the value of attribute stats.



3
4
5
# File 'lib/jsonapi_compliable/dsl.rb', line 3

def stats
  @stats
end

Instance Method Details

#allow_filter(name, *args, &blk) ⇒ Object



46
47
48
49
50
51
52
53
54
# File 'lib/jsonapi_compliable/dsl.rb', line 46

def allow_filter(name, *args, &blk)
  opts = args.extract_options!
  aliases = [name, opts[:aliases]].flatten.compact
  @filters[name.to_sym] = {
    aliases: aliases,
    if: opts[:if],
    filter: blk
  }
end

#allow_stat(symbol_or_hash, &blk) ⇒ Object



56
57
58
59
60
# File 'lib/jsonapi_compliable/dsl.rb', line 56

def allow_stat(symbol_or_hash, &blk)
  dsl = Stats::DSL.new(symbol_or_hash)
  dsl.instance_eval(&blk) if blk
  @stats[dsl.name] = dsl
end

#clear! ⇒ Object



27
28
29
30
31
32
33
34
35
# File 'lib/jsonapi_compliable/dsl.rb', line 27

def clear!
  @sideloads = {}
  @filters = {}
  @default_filters = {}
  @extra_fields = {}
  @stats = {}
  @sorting = nil
  @pagination = nil
end

#copy ⇒ Object



15
16
17
18
19
20
21
22
23
24
25
# File 'lib/jsonapi_compliable/dsl.rb', line 15

def copy
  instance = self.class.new
  instance.sideloads = sideloads.deep_dup
  instance.filters = filters.deep_dup
  instance.default_filters = default_filters.deep_dup
  instance.extra_fields = extra_fields.deep_dup
  instance.sorting = sorting.deep_dup
  instance.pagination = pagination.deep_dup
  instance.stats = stats.deep_dup
  instance
end

#default_filter(name, &blk) ⇒ Object



62
63
64
65
66
# File 'lib/jsonapi_compliable/dsl.rb', line 62

def default_filter(name, &blk)
  @default_filters[name.to_sym] = {
    filter: blk
  }
end

#extra_field(field, &blk) ⇒ Object



76
77
78
79
80
81
82
# File 'lib/jsonapi_compliable/dsl.rb', line 76

def extra_field(field, &blk)
  @extra_fields[field.keys.first] ||= []
  @extra_fields[field.keys.first] << {
    name: field.values.first,
    proc: blk
  }
end

#includes(whitelist: nil, &blk) ⇒ Object



37
38
39
40
41
42
43
44
# File 'lib/jsonapi_compliable/dsl.rb', line 37

def includes(whitelist: nil, &blk)
  whitelist = JSONAPI::IncludeDirective.new(whitelist) if whitelist

  @sideloads = {
    whitelist: whitelist,
    custom_scope: blk
  }
end

#paginate(&blk) ⇒ Object



72
73
74
# File 'lib/jsonapi_compliable/dsl.rb', line 72

def paginate(&blk)
  @pagination = blk
end

#sort(&blk) ⇒ Object



68
69
70
# File 'lib/jsonapi_compliable/dsl.rb', line 68

def sort(&blk)
  @sorting = blk
end

#stat(attribute, calculation) ⇒ Object



84
85
86
87
88
# File 'lib/jsonapi_compliable/dsl.rb', line 84

def stat(attribute, calculation)
  stats_dsl = @stats[attribute] || @stats[attribute.to_sym]
  raise Errors::StatNotFound.new(attribute, calculation) unless stats_dsl
  stats_dsl.calculation(calculation)
end