whales_actions 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: f40a35b239daaf2d634d19edfbff41fee27df177
4
+ data.tar.gz: 9e35893900877aa08d5b08d12e5aefd7b968b32c
5
+ SHA512:
6
+ metadata.gz: 19e1aecd87c8aa840049b08e241780ef8516e9d4b9a8b4c10d930a8e466cae01cbfc974253d48c9acaf9bcafc39595ea2af9a453c65e3f9e92fc032307464fee
7
+ data.tar.gz: dfaba83c6676aadb6931e0e09c550e00c5fca33182b9acf91c3f86cc4f0c91cd8c1a18548de42146d8d26cbf90d4b996f2b10b4481cae8bf732bcdba2fb7e4c1
data/.rspec ADDED
@@ -0,0 +1,2 @@
1
+ --color
2
+ --format documentation
data/Gemfile ADDED
@@ -0,0 +1,6 @@
1
+ source 'https://rubygems.org'
2
+
3
+ gemspec
4
+
5
+ gem "webrick"
6
+ gem "activesupport"
data/Gemfile.lock ADDED
@@ -0,0 +1,89 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ whales_actions (0.1.0)
5
+
6
+ GEM
7
+ remote: https://rubygems.org/
8
+ specs:
9
+ activesupport (4.2.4)
10
+ i18n (~> 0.7)
11
+ json (~> 1.7, >= 1.7.7)
12
+ minitest (~> 5.1)
13
+ thread_safe (~> 0.3, >= 0.3.4)
14
+ tzinfo (~> 1.1)
15
+ coderay (1.1.0)
16
+ diff-lcs (1.2.5)
17
+ ffi (1.9.10)
18
+ formatador (0.2.5)
19
+ guard (2.13.0)
20
+ formatador (>= 0.2.4)
21
+ listen (>= 2.7, <= 4.0)
22
+ lumberjack (~> 1.0)
23
+ nenv (~> 0.1)
24
+ notiffany (~> 0.0)
25
+ pry (>= 0.9.12)
26
+ shellany (~> 0.0)
27
+ thor (>= 0.18.1)
28
+ guard-compat (1.2.1)
29
+ guard-rspec (4.6.4)
30
+ guard (~> 2.1)
31
+ guard-compat (~> 1.1)
32
+ rspec (>= 2.99.0, < 4.0)
33
+ i18n (0.7.0)
34
+ json (1.8.3)
35
+ listen (3.0.5)
36
+ rb-fsevent (>= 0.9.3)
37
+ rb-inotify (>= 0.9)
38
+ lumberjack (1.0.9)
39
+ method_source (0.8.2)
40
+ minitest (5.8.3)
41
+ nenv (0.2.0)
42
+ notiffany (0.0.8)
43
+ nenv (~> 0.1)
44
+ shellany (~> 0.0)
45
+ pry (0.10.3)
46
+ coderay (~> 1.1.0)
47
+ method_source (~> 0.8.1)
48
+ slop (~> 3.4)
49
+ rake (10.4.2)
50
+ rb-fsevent (0.9.6)
51
+ rb-inotify (0.9.5)
52
+ ffi (>= 0.5.0)
53
+ rspec (3.4.0)
54
+ rspec-core (~> 3.4.0)
55
+ rspec-expectations (~> 3.4.0)
56
+ rspec-mocks (~> 3.4.0)
57
+ rspec-core (3.4.1)
58
+ rspec-support (~> 3.4.0)
59
+ rspec-expectations (3.4.0)
60
+ diff-lcs (>= 1.2.0, < 2.0)
61
+ rspec-support (~> 3.4.0)
62
+ rspec-mocks (3.4.0)
63
+ diff-lcs (>= 1.2.0, < 2.0)
64
+ rspec-support (~> 3.4.0)
65
+ rspec-support (3.4.1)
66
+ shellany (0.0.1)
67
+ slop (3.6.0)
68
+ thor (0.19.1)
69
+ thread_safe (0.3.5)
70
+ tzinfo (1.2.2)
71
+ thread_safe (~> 0.1)
72
+ webrick (1.3.1)
73
+
74
+ PLATFORMS
75
+ ruby
76
+
77
+ DEPENDENCIES
78
+ activesupport
79
+ bundler (~> 1.10)
80
+ guard
81
+ guard-rspec
82
+ pry
83
+ rake (~> 10.0)
84
+ rspec
85
+ webrick
86
+ whales_actions!
87
+
88
+ BUNDLED WITH
89
+ 1.10.6
data/Guardfile ADDED
@@ -0,0 +1,11 @@
1
+ guard :rspec, cmd: "bundle exec rspec" do
2
+ # watch /lib/ files
3
+ watch(%r{^lib/(.+).rb$}) do |m|
4
+ "spec/#{m[1]}_spec.rb"
5
+ end
6
+
7
+ # watch /spec/ files
8
+ watch(%r{^spec/(.+).rb$}) do |m|
9
+ "spec/#{m[1]}.rb"
10
+ end
11
+ end
data/LICENSE.txt ADDED
@@ -0,0 +1,21 @@
1
+ The MIT License (MIT)
2
+
3
+ Copyright (c) 2015 William Horton
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in
13
+ all copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21
+ THE SOFTWARE.
data/README.md ADDED
File without changes
data/Rakefile ADDED
@@ -0,0 +1,10 @@
1
+ require "bundler/gem_tasks"
2
+ require "rspec/core/rake_task"
3
+
4
+ # Default directory to look in is `/specs`
5
+ # Run with `rake spec`
6
+ RSpec::Core::RakeTask.new(:spec) do |task|
7
+ task.rspec_opts = ['--color', '--format', 'nested']
8
+ end
9
+
10
+ task :default => :spec
@@ -0,0 +1,3 @@
1
+ <h1>ALL THE CATS</h1>
2
+ <pre><%= @cats.to_s %></pre>
3
+ <a href="/cats/new">New cat!</a>
@@ -0,0 +1,11 @@
1
+ <form action="/cats" method="POST">
2
+ <label>Name
3
+ <input type="text" name="cat[name]" value="<%= @cat.name %>">
4
+ </label>
5
+
6
+ <label>Owner
7
+ <input type="text" name="cat[owner]" value="<%= @cat.owner %>">
8
+ </label>
9
+
10
+ <input type="submit">
11
+ </form>
@@ -0,0 +1 @@
1
+ <%= session["count"] %>
@@ -0,0 +1 @@
1
+ <%= flash[:errors] %>
@@ -0,0 +1 @@
1
+ <%= (1..10).to_a.join(", ") %>
@@ -0,0 +1,3 @@
1
+ module WhalesActions
2
+ VERSION = "0.1.0"
3
+ end
@@ -0,0 +1 @@
1
+ require_relative "./whales_controller/base.rb"
@@ -0,0 +1,81 @@
1
+ require 'active_support/inflector'
2
+ require 'active_support'
3
+ require 'active_support/core_ext'
4
+ require 'erb'
5
+ require_relative '../whales_dispatch/flash'
6
+ require_relative '../whales_dispatch/params'
7
+ require_relative '../whales_dispatch/route'
8
+ require_relative '../whales_dispatch/router'
9
+ require_relative '../whales_dispatch/session'
10
+
11
+ module WhalesController
12
+ class Base
13
+ attr_reader :params
14
+ attr_accessor :res, :req
15
+
16
+ def initialize(request, response, route_params = {})
17
+ @req = request
18
+ @res = response
19
+ @params = WhalesDispatch::Params.new(req, route_params)
20
+
21
+ unless req.request_method == "GET"
22
+ verify_authenticity_token
23
+ end
24
+ end
25
+
26
+ def already_built_response?
27
+ @already_built_response
28
+ end
29
+
30
+ def flash
31
+ @flash ||= WhalesDispatch::Flash.new(req)
32
+ end
33
+
34
+ def form_authenticity_token
35
+ session["authenticity_token"] = SecureRandom.urlsafe_base64
36
+ end
37
+
38
+ def invoke_action(action_name)
39
+ send(action_name)
40
+ render(name) unless already_built_response?
41
+ end
42
+
43
+ def render_content(content, content_type)
44
+ raise if already_built_response?
45
+ self.res.content_type = content_type
46
+ self.res.body = content
47
+ @already_built_response = true
48
+ session.store_session(res)
49
+ flash.store_flash(res)
50
+ end
51
+
52
+ def redirect_to(url)
53
+ raise if already_built_response?
54
+ self.res["Location"] = url
55
+ self.res.status = 302
56
+ @already_built_response = true
57
+ session.store_session(res)
58
+ flash.store_flash(res)
59
+ end
60
+
61
+ def render(template_name, file_location = nil)
62
+ file_location ||= __FILE__
63
+ path = File.expand_path("../../views/#{self.class.to_s[0..-11].underscore}/#{template_name}.html.erb", file_location)
64
+ template = ERB.new(File.read(path))
65
+ render_content(template.result(binding), "text/html")
66
+ end
67
+
68
+ def session
69
+ @session ||= WhalesDispatch::Session.new(req)
70
+ end
71
+
72
+ private
73
+
74
+ def verify_authenticity_token
75
+ unless params[:authenticity_token] == session["authenticity_token"]
76
+ raise "Missing authenticity token"
77
+ end
78
+ end
79
+
80
+ end
81
+ end
@@ -0,0 +1,59 @@
1
+ class DefaultActions
2
+ attr_reader :actions
3
+ def initialize(resource)
4
+ @resource = resource.to_s
5
+ @resource_id = @resource.singularize + "_id"
6
+ @actions = all
7
+ end
8
+
9
+ def parse_action_restrictions(restrictions_hash)
10
+ raise(ArgumentError) if restrictions_hash.size > 1
11
+ send(:only, restrictions_hash[:only]) if restrictions_hash[:only]
12
+ send(:except, restrictions_hash[:except]) if restrictions_hash[:except]
13
+ end
14
+
15
+ def index
16
+ { index: { suffix: "$", method: :get } }
17
+ end
18
+
19
+ def show
20
+ { show: { suffix: "/(?<#{@resource_id}>\\d+)$", method: :post } }
21
+ end
22
+
23
+ def new
24
+ { new: { suffix: "/new$", method: :get } }
25
+ end
26
+
27
+ def create
28
+ { create: { suffix: "$", method: :post } }
29
+ end
30
+
31
+ def edit
32
+ { edit: { suffix: "/(?<#{@resource_id}>\\d+)/edit$", method: :get } }
33
+ end
34
+
35
+ def update
36
+ { update: { suffix: "/(?<#{@resource_id}>\\d+)$", method: :put } }
37
+ end
38
+
39
+ def destroy
40
+ { destroy: { suffix: "/(?<#{@resource_id}>\\d+)$", method: :delete } }
41
+ end
42
+
43
+ private
44
+
45
+ def all
46
+ DefaultActions.instance_methods(false).drop(2).reduce({}) do |accum, method|
47
+ accum.merge(send(method))
48
+ end
49
+ end
50
+
51
+ def only(action_names)
52
+ @actions.keep_if { |key, _| action_names.include?(key) }
53
+ end
54
+
55
+ def except(action_names)
56
+ @actions.keep_if { |key, _| !action_names.include?(key) }
57
+ end
58
+
59
+ end
@@ -0,0 +1,35 @@
1
+ require 'json'
2
+ require 'webrick'
3
+
4
+ module WhalesDispatch
5
+ class Flash
6
+
7
+ def initialize(request)
8
+ request.cookies.each do |cookie|
9
+ @value_for_now = JSON.parse(cookie.value) if cookie.name == '_rails_lite_flash'
10
+ end
11
+ @value_for_now ||= {}
12
+ @value_for_next = {}
13
+ end
14
+
15
+ def now
16
+ @value_for_now
17
+ end
18
+
19
+ def [](key)
20
+ combined = @value_for_next.merge(@value_for_now)
21
+ combined[key.to_s] || combined[key.to_sym]
22
+ end
23
+
24
+ def []=(key, value)
25
+ @value_for_next[key] = value
26
+ end
27
+
28
+ def store_flash(response)
29
+ cookie = WEBrick::Cookie.new('_rails_lite_flash', @value_for_next.to_json)
30
+ cookie.path = '/'
31
+ response.cookies << cookie
32
+ end
33
+
34
+ end
35
+ end
@@ -0,0 +1,58 @@
1
+ require 'uri'
2
+
3
+ module WhalesDispatch
4
+ class Params
5
+
6
+ def initialize(req, route_params = {})
7
+ parsed_query_string = parse_www_encoded_form(req.query_string)
8
+ parsed_req_body = parse_www_encoded_form(req.body)
9
+ @params = parsed_query_string.merge(parsed_req_body).merge(route_params)
10
+ end
11
+
12
+ def [](key)
13
+ @params[key.to_s] || @params[key.to_sym]
14
+ end
15
+
16
+ def to_s
17
+ @params.to_s
18
+ end
19
+
20
+ def require(key)
21
+ @params = self[key]
22
+ self
23
+ end
24
+
25
+ def permit(*attrs)
26
+ @params.select do |k, _|
27
+ attrs.include?(k.to_s) || attrs.include?(k.to_sym)
28
+ end
29
+ end
30
+
31
+ class AttributeNotFoundError < ArgumentError; end;
32
+
33
+ private
34
+
35
+ def parse_www_encoded_form(www_encoded_form)
36
+ www_encoded_form ||= ""
37
+ params = {}
38
+ URI.decode_www_form(www_encoded_form).each do |nested_key, val|
39
+ keys = parse_key(nested_key)
40
+ prev_context = params
41
+ keys.each do |key|
42
+ if key == keys.last
43
+ prev_context[key] = val
44
+ else
45
+ prev_context[key] ||= {}
46
+ prev_context = prev_context[key]
47
+ end
48
+ end
49
+ end
50
+
51
+ params
52
+ end
53
+
54
+ def parse_key(key)
55
+ key.split(/\]\[|\[|\]/)
56
+ end
57
+ end
58
+ end
@@ -0,0 +1,25 @@
1
+ class Resource
2
+ attr_reader :pattern
3
+
4
+ def initialize(noun, suffix, parent)
5
+ @noun = noun.to_s
6
+ @pattern = build_route_pattern(suffix, parent)
7
+ end
8
+
9
+ def build_route_pattern(suffix, parent)
10
+ base = build_base(parent)
11
+ Regexp.new(base + @noun + suffix)
12
+ end
13
+
14
+ def build_base(parent)
15
+ if parent.empty?
16
+ "^/"
17
+ else
18
+ "^/#{parent}/(?<#{parent.singularize}_id>\\d+)/"
19
+ end
20
+ end
21
+
22
+ def classify
23
+ klass = Object.const_get(@noun.capitalize + "Controller")
24
+ end
25
+ end
@@ -0,0 +1,30 @@
1
+ require_relative './params.rb'
2
+
3
+ module WhalesDispatch
4
+ class Route
5
+ attr_reader :pattern, :http_method, :controller_class, :action_name
6
+
7
+ def initialize(pattern, http_method, controller_class, action_name)
8
+ @pattern, @http_method = pattern, http_method
9
+ @controller_class, @action_name = controller_class, action_name
10
+ end
11
+
12
+ def matches?(req)
13
+ params = Params.new(req)
14
+ if req.request_method == "POST" && params["_method"]
15
+ method = params["_method"]
16
+ else
17
+ method = req.request_method
18
+ end
19
+
20
+ pattern =~ req.path && http_method == method.downcase.to_sym
21
+ end
22
+
23
+ def run(req, res)
24
+ matches = pattern.match(req.path)
25
+ route_params = Hash[matches.names.zip(matches.captures.map(&:to_i))]
26
+ controller = controller_class.new(req, res, route_params)
27
+ controller.invoke_action(action_name)
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,63 @@
1
+ module WhalesDispatch
2
+ class Router
3
+
4
+ attr_reader :routes
5
+
6
+ def initialize
7
+ @routes = []
8
+ @last_parent_route = ""
9
+ end
10
+
11
+ def add_route(pattern, method, controller_class, action_name)
12
+ @routes << Route.new(pattern, method, controller_class, action_name)
13
+ end
14
+
15
+ def draw(&proc)
16
+ instance_eval(&proc)
17
+ end
18
+
19
+ def resources(controller_noun, scope, **action_restrictions)
20
+ @last_parent_route = "" if scope == :parent
21
+ controller_actions = DefaultActions.new(controller_noun)
22
+ controller_actions.parse_action_restrictions(action_restrictions)
23
+ build_resources(controller_noun, controller_actions)
24
+
25
+ if block_given?
26
+ @last_parent_route = controller_noun.to_s
27
+ yield
28
+ end
29
+ end
30
+
31
+ def build_resources(controller_noun, controller_actions)
32
+ controller_actions.actions.each do |action_name, action_hash|
33
+
34
+ resource = Resource.new(
35
+ controller_noun, action_hash[:suffix], @last_parent_route
36
+ )
37
+
38
+ send action_hash[:method], resource.pattern, resource.classify, action_name
39
+ end
40
+ end
41
+
42
+ [:get, :post, :put, :delete].each do |http_method|
43
+ define_method(http_method) do |pattern, controller_class, action_name|
44
+ add_route(pattern, http_method, controller_class, action_name)
45
+ end
46
+ end
47
+
48
+ def match(req)
49
+ routes.select { |route| route.matches?(req) }.first
50
+ end
51
+
52
+ def run(req, res)
53
+ route = match(req)
54
+ if route
55
+ route.run(req, res)
56
+ else
57
+ res.status = 404
58
+ res.body = "Could not find matching route."
59
+ end
60
+ end
61
+
62
+ end
63
+ end
@@ -0,0 +1,29 @@
1
+ require 'json'
2
+ require 'webrick'
3
+
4
+ module WhalesDispatch
5
+ class Session
6
+
7
+ def initialize(request)
8
+ request.cookies.each do |cookie|
9
+ @value = JSON.parse(cookie.value) if cookie.name == '_rails_lite_app'
10
+ end
11
+ @value ||= {}
12
+ end
13
+
14
+ def [](key)
15
+ @value[key.to_s] || @value[key.to_sym]
16
+ end
17
+
18
+ def []=(key, value)
19
+ @value[key.to_s] = value
20
+ end
21
+
22
+ def store_session(response)
23
+ cookie = WEBrick::Cookie.new('_rails_lite_app', @value.to_json)
24
+ cookie.path = '/'
25
+ response.cookies << cookie
26
+ end
27
+
28
+ end
29
+ end
@@ -0,0 +1,25 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'whales_actions/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "whales_actions"
8
+ spec.version = WhalesActions::VERSION
9
+ spec.authors = ["William Horton"]
10
+ spec.email = ["wdt.horton@gmail.com"]
11
+ spec.summary = %q{The VC in the Whales MVC framework}
12
+ spec.homepage = "https://github.com/wdhorton/whales/tree/master/whales_actions"
13
+ spec.license = "MIT"
14
+
15
+ spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
16
+ spec.require_paths = ["lib"]
17
+
18
+ spec.add_development_dependency "bundler", "~> 1.10"
19
+ spec.add_development_dependency "rake", "~> 10.0"
20
+
21
+ spec.add_development_dependency "rspec"
22
+ spec.add_development_dependency "guard"
23
+ spec.add_development_dependency "guard-rspec"
24
+ spec.add_development_dependency "pry"
25
+ end
metadata ADDED
@@ -0,0 +1,152 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: whales_actions
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - William Horton
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2015-12-09 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: bundler
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '1.10'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '1.10'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rake
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '10.0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '10.0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rspec
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: guard
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: guard-rspec
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: pry
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
97
+ description:
98
+ email:
99
+ - wdt.horton@gmail.com
100
+ executables: []
101
+ extensions: []
102
+ extra_rdoc_files: []
103
+ files:
104
+ - ".rspec"
105
+ - Gemfile
106
+ - Gemfile.lock
107
+ - Guardfile
108
+ - LICENSE.txt
109
+ - README.md
110
+ - Rakefile
111
+ - lib/views/cats/index.html.erb
112
+ - lib/views/cats/new.html.erb
113
+ - lib/views/my_controller/counting_show.html.erb
114
+ - lib/views/my_controller/flash_show.html.erb
115
+ - lib/views/my_controller/show.html.erb
116
+ - lib/whales_actions.rb
117
+ - lib/whales_actions/version.rb
118
+ - lib/whales_controller/base.rb
119
+ - lib/whales_dispatch/default_actions.rb
120
+ - lib/whales_dispatch/flash.rb
121
+ - lib/whales_dispatch/params.rb
122
+ - lib/whales_dispatch/resource.rb
123
+ - lib/whales_dispatch/route.rb
124
+ - lib/whales_dispatch/router.rb
125
+ - lib/whales_dispatch/session.rb
126
+ - whales_actions.gemspec
127
+ homepage: https://github.com/wdhorton/whales/tree/master/whales_actions
128
+ licenses:
129
+ - MIT
130
+ metadata: {}
131
+ post_install_message:
132
+ rdoc_options: []
133
+ require_paths:
134
+ - lib
135
+ required_ruby_version: !ruby/object:Gem::Requirement
136
+ requirements:
137
+ - - ">="
138
+ - !ruby/object:Gem::Version
139
+ version: '0'
140
+ required_rubygems_version: !ruby/object:Gem::Requirement
141
+ requirements:
142
+ - - ">="
143
+ - !ruby/object:Gem::Version
144
+ version: '0'
145
+ requirements: []
146
+ rubyforge_project:
147
+ rubygems_version: 2.5.0
148
+ signing_key:
149
+ specification_version: 4
150
+ summary: The VC in the Whales MVC framework
151
+ test_files: []
152
+ has_rdoc: