Class: Jets::Lambda::Definition

Inherits:
Object
  • Object
show all
Includes:
Util::Camelize
Defined in:
lib/jets/lambda/definition.rb

Constant Summary collapse

@@lang_exts =
{
  ruby: ".rb",
  python: ".py",
  node: ".js"
}

Instance Attribute Summary collapse

Instance Method Summary collapse

Methods included from Util::Camelize

#camelize

Constructor Details

#initialize(class_name, meth, options = {}) ⇒ Definition

Returns a new instance of Definition.



10
11
12
13
14
15
16
17
18
19
20
21
22
# File 'lib/jets/lambda/definition.rb', line 10

def initialize(class_name, meth, options = {})
  @class_name = class_name.to_s
  @meth = meth
  @options = options
  @type = options[:type] || get_type  # controller, event, or function
  @properties = camelize(options[:properties]) || {}
  @provisioned_concurrency = options[:provisioned_concurrency]
  @iam_policy = options[:iam_policy]
  @managed_iam_policy = options[:managed_iam_policy]
  @lang = options[:lang] || :ruby
  @associated_resources = options[:associated_resources] || {}
  @replacements = options[:replacements] || {} # added to baseline replacements
end

Instance Attribute Details

#associated_resourcesObject (readonly)

Returns the value of attribute associated_resources.



6
7
8
# File 'lib/jets/lambda/definition.rb', line 6

def associated_resources
  @associated_resources
end

#class_nameObject

Returns the value of attribute class_name.



5
6
7
# File 'lib/jets/lambda/definition.rb', line 5

def class_name
  @class_name
end

#iam_policyObject (readonly)

Returns the value of attribute iam_policy.



6
7
8
# File 'lib/jets/lambda/definition.rb', line 6

def iam_policy
  @iam_policy
end

#langObject (readonly)

Returns the value of attribute lang.



6
7
8
# File 'lib/jets/lambda/definition.rb', line 6

def lang
  @lang
end

#managed_iam_policyObject (readonly)

Returns the value of attribute managed_iam_policy.



6
7
8
# File 'lib/jets/lambda/definition.rb', line 6

def managed_iam_policy
  @managed_iam_policy
end

#methObject (readonly)

Returns the value of attribute meth.



6
7
8
# File 'lib/jets/lambda/definition.rb', line 6

def meth
  @meth
end

#propertiesObject (readonly)

Returns the value of attribute properties.



6
7
8
# File 'lib/jets/lambda/definition.rb', line 6

def properties
  @properties
end

#provisioned_concurrencyObject (readonly)

Returns the value of attribute provisioned_concurrency.



6
7
8
# File 'lib/jets/lambda/definition.rb', line 6

def provisioned_concurrency
  @provisioned_concurrency
end

#typeObject

Returns the value of attribute type.



5
6
7
# File 'lib/jets/lambda/definition.rb', line 5

def type
  @type
end

Instance Method Details

#base_replacementsObject



112
113
114
# File 'lib/jets/lambda/definition.rb', line 112

def base_replacements
  {namespace: namespace}
end

#build_function_iam?Boolean

Returns:

  • (Boolean)


42
43
44
# File 'lib/jets/lambda/definition.rb', line 42

def build_function_iam?
  !!(@iam_policy || @managed_iam_policy)
end

#full_handler(handler_function) ⇒ Object



89
90
91
# File 'lib/jets/lambda/definition.rb', line 89

def full_handler(handler_function)
  "#{handler_base}.#{handler_function}"
end

#get_typeObject

The get_type method works for controller and event classes.

Usually able to get the type from the class name. Examples:

PostsController => controller
CoolEvent => event

However, for function types, we are not able to get the type for multiple of reasons. First, function types are allowed to be named with or without _function. Examples:

path => class => type
app/functions/hello.rb => Hello => function
app/functions/hello_function.rb => HelloFunction => function

The second reason is that functions are not regular ruby classes. Instead they are anonymous classes created with Class.new. When classes are created with Class.new the method_added hook has “” (blank string) as the self class name. We add the class_type to the task later on as we are constructing the class as part of the Class.new logic.

For controller and event standard ruby classes though it can easily be determinated as part of initialization. So we get the type for convenience then.

For anonymous function classes, we just set to nil and will later fix in FunctionConstructor.

Returns: “controller”, “event” or nil



83
84
85
86
87
# File 'lib/jets/lambda/definition.rb', line 83

def get_type
  unless @class_name.empty? # when anonymous class is created with Class.new
    @class_name.underscore.split("_").last # controller, event or rule
  end
end

#handler_baseObject



97
98
99
100
101
# File 'lib/jets/lambda/definition.rb', line 97

def handler_base
  base = "handlers/#{@type.pluralize}/#{@class_name.underscore}"
  base += "/#{@lang}" if @lang != :ruby
  base += "/#{@meth}"
end

#handler_pathObject



93
94
95
# File 'lib/jets/lambda/definition.rb', line 93

def handler_path
  "#{handler_base}#{lang_ext}"
end

#lang_extObject



51
52
53
# File 'lib/jets/lambda/definition.rb', line 51

def lang_ext
  @@lang_exts[@lang]
end

#nameObject



24
25
26
# File 'lib/jets/lambda/definition.rb', line 24

def name
  @meth
end

#namespaceObject



116
117
118
119
120
121
122
# File 'lib/jets/lambda/definition.rb', line 116

def namespace
  if @meth
    @meth.to_s.camelize
  else
    @class_name.gsub("::", "").camelize
  end
end

#poly_src_pathObject



103
104
105
# File 'lib/jets/lambda/definition.rb', line 103

def poly_src_path
  handler_path.sub("handlers/", "app/")
end

#public_meth?Boolean

Returns:

  • (Boolean)


28
29
30
31
32
33
34
35
36
37
38
39
40
# File 'lib/jets/lambda/definition.rb', line 28

def public_meth?
  # For anonymous classes (app/functions/hello.rb) the class name will be blank.
  # These types of classes are treated specially and has only one handler method
  # that is registered. So we know it is public.
  return true if @class_name.nil? || @class_name == ""

  # Consider all polymorphic methods public for now
  return true if @lang != :ruby

  klass = @class_name.constantize
  public_methods = klass.public_instance_methods
  public_methods.include?(meth.to_sym)
end

#replacementsObject



107
108
109
110
# File 'lib/jets/lambda/definition.rb', line 107

def replacements
  # Merge in the custom replacements specific to each app class: ConfigRule, Job, etc.
  base_replacements.merge(@replacements)
end