Class: Versionist::NewApiVersionGenerator

Inherits:
Rails::Generators::Base
  • Object
show all
Includes:
InflectorFixes, RspecHelper
Defined in:
lib/generators/versionist/new_api_version/new_api_version_generator.rb

Instance Method Summary collapse

Methods included from RspecHelper

#rspec_helper_filename

Methods included from InflectorFixes

#module_name_for_path, #module_name_for_route

Instance Method Details

#add_controller_baseObject



55
56
57
58
59
60
# File 'lib/generators/versionist/new_api_version/new_api_version_generator.rb', line 55

def add_controller_base
  in_root do
    empty_directory "app/controllers/#{module_name_for_path(module_name)}"
    template 'base_controller.rb', File.join("app", "controllers", "#{module_name_for_path(module_name)}", "base_controller.rb")
  end
end

#add_controller_base_testsObject

due to the inflector quirks we can’t use hook_for :test_framework



63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
# File 'lib/generators/versionist/new_api_version/new_api_version_generator.rb', line 63

def add_controller_base_tests
  in_root do
    case Versionist.configuration.configured_test_framework
    when :test_unit
      empty_directory "test/#{Versionist.test_path}/#{module_name_for_path(module_name)}"
      empty_directory "test/integration/#{module_name_for_path(module_name)}"

      if Versionist.older_than_rails_5?
        template 'base_controller_integration_test.rb', File.join("test", "integration", "#{module_name_for_path(module_name)}", "base_controller_test.rb")
        template 'base_controller_functional_test.rb', File.join("test", "#{Versionist.test_path}", "#{module_name_for_path(module_name)}", "base_controller_test.rb")
      else
        template 'base_controller_functional_test_rails_5.rb', File.join("test", "#{Versionist.test_path}", "#{module_name_for_path(module_name)}", "base_controller_test_rails_5.rb")
      end
    when :rspec
      @rspec_require_file = rspec_helper_filename
      empty_directory "spec/controllers/#{module_name_for_path(module_name)}"
      template 'base_controller_spec.rb', File.join("spec", "controllers", "#{module_name_for_path(module_name)}", "base_controller_spec.rb"), :assigns => { :rspec_require_file => @rspec_require_file }
      empty_directory "spec/requests/#{module_name_for_path(module_name)}"
      template 'base_controller_spec.rb', File.join("spec", "requests", "#{module_name_for_path(module_name)}", "base_controller_spec.rb"), :assigns => { :rspec_require_file => @rspec_require_file }
    else
      say "Unsupported test_framework: #{Versionist.configuration.configured_test_framework}"
    end
  end
end

#add_documentation_baseObject



135
136
137
138
139
140
141
# File 'lib/generators/versionist/new_api_version/new_api_version_generator.rb', line 135

def add_documentation_base
  in_root do
    empty_directory "public/docs/#{version}"
    template 'docs_index.rb', File.join("public", "docs", "#{version}", "index.html")
    template 'docs_style.rb', File.join("public", "docs", "#{version}", "style.css")
  end
end

#add_helpers_dirObject



116
117
118
119
120
# File 'lib/generators/versionist/new_api_version/new_api_version_generator.rb', line 116

def add_helpers_dir
  in_root do
    empty_directory "app/helpers/#{module_name_for_path(module_name)}"
  end
end

#add_helpers_test_dirObject



122
123
124
125
126
127
128
129
130
131
132
133
# File 'lib/generators/versionist/new_api_version/new_api_version_generator.rb', line 122

def add_helpers_test_dir
  in_root do
    case Versionist.configuration.configured_test_framework
    when :test_unit
      empty_directory "test/helpers/#{module_name_for_path(module_name)}"
    when :rspec
      empty_directory "spec/helpers/#{module_name_for_path(module_name)}"
    else
      say "Unsupported test_framework: #{Versionist.configuration.configured_test_framework}"
    end
  end
end

#add_presenter_testObject



95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
# File 'lib/generators/versionist/new_api_version/new_api_version_generator.rb', line 95

def add_presenter_test
  in_root do
    case Versionist.configuration.configured_test_framework
    when :test_unit
      empty_directory "test/presenters/#{module_name_for_path(module_name)}"

      if Versionist.older_than_rails_5?
        template 'base_presenter_test.rb', File.join("test", "presenters", "#{module_name_for_path(module_name)}", "base_presenter_test.rb")
      else
        template 'base_presenter_test_rails_5.rb', File.join("test", "presenters", "#{module_name_for_path(module_name)}", "base_presenter_test_rails_5.rb")
      end
    when :rspec
      @rspec_require_file = rspec_helper_filename
      empty_directory "spec/presenters/#{module_name_for_path(module_name)}"
      template 'base_presenter_spec.rb', File.join("spec", "presenters", "#{module_name_for_path(module_name)}", "base_presenter_spec.rb"), :assigns => { :rspec_require_file => @rspec_require_file }
    else
      say "Unsupported test_framework: #{Versionist.configuration.configured_test_framework}"
    end
  end
end

#add_presenters_baseObject



88
89
90
91
92
93
# File 'lib/generators/versionist/new_api_version/new_api_version_generator.rb', line 88

def add_presenters_base
  in_root do
    empty_directory "app/presenters/#{module_name_for_path(module_name)}"
    template 'base_presenter.rb', File.join("app", "presenters", "#{module_name_for_path(module_name)}", "base_presenter.rb")
  end
end

#add_routesObject



31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
# File 'lib/generators/versionist/new_api_version/new_api_version_generator.rb', line 31

def add_routes
  in_root do
    api_version_block = /api_version.*:module\s*(=>|:)\s*("|')#{module_name_for_route(module_name)}("|')/
    matching_version_blocks = File.readlines("config/routes.rb").grep(api_version_block)
    raise "API version already exists in config/routes.rb" if !matching_version_blocks.empty?
    route_string = "api_version(:module => \"#{module_name_for_route(module_name)}\""
    ['header', 'parameter', 'path'].each do |versioning_strategy|
      if options.has_key?(versioning_strategy)
        options[versioning_strategy].symbolize_keys!
        route_string << ", :#{versioning_strategy} => {#{options[versioning_strategy].to_s.gsub(/[\{\}]/, '').gsub('=>', ' => ')}}"
      end
    end
    if options.has_key?('defaults')
      options['defaults'].symbolize_keys!
      route_string << ", :defaults => {#{options['defaults'].to_s.gsub(/[\{\}]/, '').gsub('=>', ' => ')}}"
    end
    if options.has_key?('default')
      route_string << ", :default => true"
    end
    route_string << ") do\n  end"
    route route_string
  end
end

#verify_optionsObject



18
19
20
21
22
23
24
25
26
27
28
29
# File 'lib/generators/versionist/new_api_version/new_api_version_generator.rb', line 18

def verify_options
  raise "Must specify at least one versioning strategy option" if !['header', 'parameter', 'path'].any? {|strategy| options.has_key?(strategy)}
  if options.has_key?("header")
    raise "Must specify name and value for header versioning strategy" if !options["header"].has_key?("name") || !options["header"].has_key?("value")
  end
  if options.has_key?("parameter")
    raise "Must specify name and value for parameter versioning strategy" if !options["parameter"].has_key?("name") || !options["parameter"].has_key?("value")
  end
  if options.has_key?("path")
    raise "Must specify value for path versioning strategy" if !options["path"].has_key?("value")
  end
end