cuba-tools 0.0.2 → 0.0.3

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: e6086b272172c453acebdc0248bffa788e581a7b
4
- data.tar.gz: 6710dda1e36ea1c6dca8167ea232b97a055d3a13
3
+ metadata.gz: 3bdced9844636ce9756c972e1f896b803385065d
4
+ data.tar.gz: f05797ab1125e08880e094778755aba92adcba0c
5
5
  SHA512:
6
- metadata.gz: 255ec5eb229ccb8683a7a80addcf50a7e7668b4863feeef219483d49c0d34951326a89f90e1b8b4a4858af948c7603abc7cfcec9882152de719baba9542d1379
7
- data.tar.gz: 920d17c304443ce6fd5d86d7ee9a941c6f8745fe7c0a0ff7843075696d4e30a8e9d54d5cc37ccfcc8e576c4643b2438440b834053188d9247c20ee93d458cddb
6
+ metadata.gz: 61784850e3b6ae80d5f523a168845266f3c9d4d7c84a637a8d2a819303f3931e6e74c6f8df7243be20a4408f8a5a088a4c7f6a68975f744fb3ab89f3e037320c
7
+ data.tar.gz: 4920a0e969a0a36e689ca97a6007c70d31865f66ed5e940a8b04c7e51db36ea76cea3aaa996adf328c7c31f7e0847eb7220d7a86cf167dc3e8d7fd788a2f11f8
data/cuba-tools.gemspec CHANGED
@@ -4,7 +4,7 @@ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
4
 
5
5
  Gem::Specification.new do |spec|
6
6
  spec.name = "cuba-tools"
7
- spec.version = "0.0.2"
7
+ spec.version = "0.0.3"
8
8
  spec.authors = ["cj"]
9
9
  spec.email = ["cjlazell@gmail.com"]
10
10
  spec.description = %q{Contains a group of tools to extend cuba}
@@ -20,7 +20,12 @@ Gem::Specification.new do |spec|
20
20
  spec.add_dependency "cuba", "~> 3.1.1"
21
21
  spec.add_dependency "shield", "~> 2.1.0"
22
22
  spec.add_dependency "signature-acd", "~> 0.1.9"
23
+ spec.add_dependency "mab", "~> 0.0.3"
23
24
 
24
25
  spec.add_development_dependency "bundler", "~> 1.3"
25
26
  spec.add_development_dependency "rake"
27
+ spec.add_development_dependency "cutest-cj"
28
+ spec.add_development_dependency "awesome_print"
29
+ spec.add_development_dependency "tilt"
30
+ spec.add_development_dependency "slim"
26
31
  end
@@ -63,7 +63,7 @@ module Cuba::Tools
63
63
  if !defined? Devise
64
64
  require 'shield'
65
65
  app.plugin Shield::Helpers
66
- app.use Shield::Middleware, "/login"
66
+ # app.use Shield::Middleware, "/login"
67
67
  else
68
68
  require 'warden'
69
69
  require 'devise'
@@ -0,0 +1,59 @@
1
+ require 'ostruct'
2
+
3
+ class String
4
+ def underscore
5
+ self.gsub(/::/, '/').
6
+ gsub(/([A-Z]+)([A-Z][a-z])/,'\1_\2').
7
+ gsub(/([a-z\d])([A-Z])/,'\1_\2').
8
+ tr(" ", "_").
9
+ tr("-", "_").
10
+ downcase
11
+ end
12
+ end
13
+
14
+ class Object
15
+ def blank?
16
+ respond_to?(:empty?) ? empty? : !self
17
+ end
18
+
19
+ def present?
20
+ !blank?
21
+ end
22
+ end
23
+
24
+ class DeepOpenStruct < OpenStruct
25
+ def initialize(hash=nil)
26
+
27
+ @table = {}
28
+ @hash_table = {}
29
+
30
+ if hash
31
+ hash.each do |k,v|
32
+
33
+ if v.is_a?(Array)
34
+ other = Array.new()
35
+ v.each { | entry |
36
+ other.push(self.class.new(entry))
37
+ }
38
+ v = other
39
+ end
40
+
41
+ @table[k.to_sym] = (v.is_a?(Hash) ? self.class.new(v) : v)
42
+ @hash_table[k.to_sym] = v
43
+ new_ostruct_member(k)
44
+
45
+ end
46
+ end
47
+ end
48
+
49
+ def to_h
50
+ @hash_table
51
+ end
52
+ end
53
+
54
+ class Hash
55
+ def to_deep_ostruct
56
+ DeepOpenStruct.new self
57
+ end
58
+ end
59
+
@@ -0,0 +1,5 @@
1
+ require 'mab'
2
+
3
+ def mab(&blk)
4
+ Mab::Builder.new({}, self, &blk).to_s
5
+ end
@@ -0,0 +1,163 @@
1
+ module Cuba::Tools
2
+ module Widget
3
+ class Base
4
+ JS_ESCAPE = { '\\' => '\\\\', '</' => '<\/', "\r\n" => '\n', "\n" => '\n', "\r" => '\n', '"' => '\\"', "'" => "\\'" }
5
+ PARTIAL_REGEX = Regexp.new '([a-zA-Z_]+)$'
6
+ VIEW_TYPES = %w(slim erb haml)
7
+
8
+ attr_accessor :app, :res, :req, :name, :events, :widget_state
9
+
10
+ def initialize app, res, req, name, events
11
+ @app = app
12
+ @res = res
13
+ @req = req
14
+ @name = name.to_s
15
+ @events = events
16
+ @widget_state = false
17
+
18
+ events.add_observer self, :trigger
19
+ end
20
+
21
+ def set_state state
22
+ @widget_state = state
23
+ end
24
+
25
+ def reset_state
26
+ @widget_state = false
27
+ end
28
+
29
+ def render_state options = {}
30
+ if method(widget_state).parameters.length > 0
31
+ send(widget_state, options.to_deep_ostruct)
32
+ else
33
+ send(widget_state)
34
+ end
35
+ end
36
+
37
+ def trigger widget_name, widget_event, data = {}
38
+ if class_events = self.class.events
39
+ class_events.each do |class_event, opts|
40
+ if class_event.to_s == widget_event.to_s && (
41
+ widget_name == name or
42
+ opts[:for].to_s == widget_name
43
+ )
44
+ if not opts[:with]
45
+ e = widget_event
46
+ else
47
+ e = opts[:with]
48
+ end
49
+
50
+ if method(e) and method(e).parameters.length > 0
51
+ send(e, data)
52
+ else
53
+ send(e)
54
+ end
55
+ end
56
+ end
57
+ end
58
+ end
59
+
60
+ def render *args
61
+ if args.first.kind_of? Hash
62
+ locals = args.first
63
+ # if it's a partial we add an underscore infront of it
64
+ state = view = locals[:state] ||
65
+ "#{locals[:partial]}".gsub(PARTIAL_REGEX, '_\1')
66
+ else
67
+ state = view = args.first
68
+ locals = args.length > 1 ? args.last : {}
69
+ end
70
+
71
+ # set the state and view if it's blank
72
+ if view.blank?
73
+ state = view = caller[0][/`.*'/][1..-2]
74
+ # override state if widget_state set
75
+ elsif !locals[:state] && widget_state
76
+ state = widget_state
77
+ end
78
+
79
+ req.env[:widget_name] = name
80
+ req.env[:widget_state] = state
81
+
82
+ view_folder = self.class.to_s.gsub(
83
+ /\w+::Widgets::/, ''
84
+ ).split('::').map(&:underscore).join('/')
85
+
86
+ # check for the extension
87
+ file = false
88
+ VIEW_TYPES.each do |type|
89
+ file = "#{view_path}/#{view_folder}/#{view}.#{type}"
90
+ if File.file? file
91
+ break
92
+ else
93
+ file = false
94
+ end
95
+ end
96
+
97
+ app.render file, locals
98
+ end
99
+
100
+ def partial template, locals = {}
101
+ locals[:partial] = template
102
+ render locals
103
+ end
104
+
105
+ def current_user
106
+ app.current_user
107
+ end
108
+
109
+ def view_path
110
+ Widget.config.view_path
111
+ end
112
+
113
+ def replace state, opts = {}
114
+ set_state state
115
+
116
+ if !state.is_a? String
117
+ opts[:state] = state
118
+ content = render_state, opts
119
+ selector = '#' + id_for(state)
120
+ else
121
+ if !opts.key?(:content) and !opts.key?(:with)
122
+ content = render_state opts
123
+ else
124
+ content = opts[:content] || opts[:with]
125
+ end
126
+ selector = state
127
+ end
128
+
129
+ reset_state
130
+
131
+ res.write '$("' + selector + '").replaceWith("' + escape(content) + '");'
132
+ # scroll to the top of the page just as if we went to the url directly
133
+ # if opts[:scroll_to_top]
134
+ # res.write 'window.scrollTo(0, 0);'
135
+ # end
136
+ end
137
+
138
+ def id_for state
139
+ "#{req.env[:widget_name]}_#{state}"
140
+ end
141
+
142
+ def escape js
143
+ js.to_s.gsub(/(\\|<\/|\r\n|\\3342\\2200\\2250|[\n\r"'])/) {|match| JS_ESCAPE[match] }
144
+ end
145
+
146
+ class << self
147
+ attr_accessor :events, :available_helper_methods
148
+
149
+ def respond_to event, opts = {}
150
+ @events ||= []
151
+ @events << [event.to_s, opts]
152
+ end
153
+
154
+ def responds_to *events
155
+ @events ||= []
156
+ events.each do |event|
157
+ @events << [event, {}]
158
+ end
159
+ end
160
+ end
161
+ end
162
+ end
163
+ end
@@ -0,0 +1,19 @@
1
+ require "observer"
2
+
3
+ module Cuba::Tools
4
+ module Widget
5
+ class Events < Struct.new(:res, :req)
6
+ include Observable
7
+
8
+ def trigger widget_name, widget_event, user_data = {}
9
+ data = user_data.to_deep_ostruct
10
+
11
+ # THIS IS WHAT WILL MAKE SURE EVENTS ARE TRIGGERED
12
+ changed
13
+ ##################################################
14
+
15
+ notify_observers widget_name, widget_event, data
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,76 @@
1
+ module Cuba::Tools
2
+ module Widget
3
+ module Helpers
4
+ def self.setup app
5
+ require 'cuba/tools/mab'
6
+ # load up all the widgets if we have a path
7
+ if path = Widget.config.view_path
8
+ Dir["#{path}/**/*.rb"].each { |rb| require rb }
9
+ end
10
+ end
11
+
12
+ def method_missing(meth, *args, &block)
13
+ widget = req.env[:loaded_widgets][req.env[:widget_name].to_sym]
14
+
15
+ if widget and widget.respond_to? meth
16
+ widget.send meth, *args, &block
17
+ else
18
+ super
19
+ end
20
+ end
21
+
22
+ def widget_div opts = {}, &block
23
+ defaults = {
24
+ id: "#{req.env[:widget_name]}_#{req.env[:widget_state]}"
25
+ }.merge opts
26
+
27
+ name = req.env[:widget_name].to_sym
28
+ widget = req.env[:loaded_widgets][name]
29
+
30
+ html = block.call widget
31
+
32
+ mab do
33
+ div(defaults) do
34
+ text! html
35
+ end
36
+ end
37
+ end
38
+
39
+ def render_widget *args
40
+ Widget.load_all(self, req, res)
41
+
42
+ if args.first.kind_of? Hash
43
+ opts = args.first
44
+ name = req.env[:widget_name]
45
+ else
46
+ name = args.first
47
+ opts = args.length > 1 ? args.last : {}
48
+ end
49
+
50
+ # set the current state (the method that will get called on render_widget)
51
+ state = opts[:state] || 'display'
52
+
53
+ widget = req.env[:loaded_widgets][name]
54
+
55
+ if widget.method(state).parameters.length > 0
56
+ widget.send state, opts.to_deep_ostruct
57
+ else
58
+ widget.send state
59
+ end
60
+ end
61
+
62
+ def url_for_event event, options = {}
63
+ widget_name = options.delete(:widget_name) || req.env[:widget_name]
64
+ "http#{req.env['SERVER_PORT'] == '443' ? 's' : ''}://#{req.env['HTTP_HOST']}#{Widget.config.url_path}?widget_event=#{event}&widget_name=#{widget_name}" + (options.any?? '&' + URI.encode_www_form(options) : '')
65
+ end
66
+
67
+ def render_widgets
68
+ res.headers["Content-Type"] = "text/javascript; charset=utf-8"
69
+ widget_name, widget_event, events = Widget.load_all self, req, res
70
+ events.trigger widget_name, widget_event, req.params
71
+ # res.write "$('head > meta[name=csrf-token]').attr('content', '#{csrf_token}');"
72
+ res.write '$(document).trigger("page:change");'
73
+ end
74
+ end
75
+ end
76
+ end
@@ -0,0 +1,14 @@
1
+ module Cuba::Tools
2
+ module Widget
3
+ class Middleware
4
+ def initialize(app)
5
+ @app = app
6
+ end
7
+
8
+ def call(env)
9
+ responder = Responder.new(@app, env)
10
+ responder.respond
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,52 @@
1
+ module Cuba::Tools
2
+ module Widget
3
+ class Responder
4
+ def initialize(app, env)
5
+ @app = app
6
+ @env = env
7
+ end
8
+
9
+ def respond
10
+ if widget_path
11
+ widget_name, widget_event, events = Widget.load_all @app, req, res
12
+
13
+ events.trigger widget_name, widget_event, req.params
14
+ # res.write "$('head > meta[name=csrf-token]').attr('content', '#{csrf_token}');"
15
+ res.write '$(document).trigger("page:change");'
16
+ end
17
+
18
+ res.finish
19
+ end
20
+
21
+ private
22
+
23
+ def req
24
+ @req ||= Rack::Request.new(@env)
25
+ end
26
+
27
+ def res
28
+ @res ||= begin
29
+ if not widget_path
30
+ status, headers, body = @app.call(req.env)
31
+ else
32
+ status, headers, body = [
33
+ 200,
34
+ {"Content-Type" => "text/javascript; charset=utf-8"},
35
+ [""]
36
+ ]
37
+ end
38
+
39
+ Rack::Response.new(body, status, headers)
40
+ end
41
+ end
42
+
43
+ def widget_path
44
+ path[Regexp.new("^#{Widget.config.url_path}($|\\?.*)")]
45
+ end
46
+
47
+ def path
48
+ @env['PATH_INFO']
49
+ end
50
+ end
51
+ end
52
+ end
@@ -0,0 +1,49 @@
1
+ module Cuba::Tools
2
+ module Widget
3
+ autoload :Responder, "cuba/tools/widget/responder"
4
+ autoload :Middleware, "cuba/tools/widget/middleware"
5
+ autoload :Helpers, "cuba/tools/widget/helpers"
6
+ autoload :Base, "cuba/tools/widget/base"
7
+ autoload :Events, "cuba/tools/widget/events"
8
+
9
+ extend self
10
+
11
+ attr_accessor :config, :reset_config, :load_all
12
+
13
+ def setup
14
+ yield config
15
+ end
16
+
17
+ def config
18
+ @config || reset_config!
19
+ end
20
+
21
+ # Resets the configuration to the default (empty hash)
22
+ def reset_config!
23
+ @config = OpenStruct.new({
24
+ url_path: '/widgets',
25
+ widgets: {}
26
+ })
27
+ end
28
+
29
+ def load_all app, req, res
30
+ events = Events.new res, req
31
+
32
+ if widget_event = req.params["widget_event"]
33
+ widget_name = req.params["widget_name"]
34
+ end
35
+
36
+ unless req.env[:loaded_widgets]
37
+ req.env[:loaded_widgets] ||= {}
38
+
39
+ Widget.config.widgets.each do |name, widget|
40
+ req.env[:loaded_widgets][name] = Object.const_get(widget).new(
41
+ app, res, req, name, events
42
+ )
43
+ end
44
+ end
45
+
46
+ [widget_name, widget_event, events]
47
+ end
48
+ end
49
+ end
data/lib/cuba/tools.rb CHANGED
@@ -1,3 +1,7 @@
1
+ require 'cuba/tools/inflectors'
2
+
1
3
  module Cuba::Tools
2
- autoload :Auth, "cuba/tools/auth"
4
+ autoload :Auth, "cuba/tools/auth"
5
+ autoload :Api, "cuba/tools/api"
6
+ autoload :Widget, "cuba/tools/widget"
3
7
  end
@@ -0,0 +1,4 @@
1
+ require 'cuba'
2
+ require 'cuba/tools'
3
+ require 'pry'
4
+ require 'awesome_print'
@@ -0,0 +1,7 @@
1
+ class OtherWidget < Cuba::Tools::Widget::Base
2
+ respond_to :test, for: :some_widget, with: :some_test
3
+
4
+ def some_test
5
+ res.write 'cow'
6
+ end
7
+ end
@@ -0,0 +1 @@
1
+ | some partial
@@ -0,0 +1,6 @@
1
+ = widget_div do |w|
2
+ = test_helper
3
+ #test display
4
+ = w.partial :some_partial
5
+ = w.render_state
6
+ = user_widget_method
@@ -0,0 +1,2 @@
1
+ = widget_div do
2
+ | some state
@@ -0,0 +1,21 @@
1
+ class SomeWidget < Cuba::Tools::Widget::Base
2
+ respond_to :test
3
+
4
+ def display
5
+ set_state :some_state
6
+
7
+ render
8
+ end
9
+
10
+ def some_state
11
+ render
12
+ end
13
+
14
+ def test
15
+ res.write 'moo'
16
+ end
17
+
18
+ def user_widget_method
19
+ 'user_widget_method'
20
+ end
21
+ end
@@ -0,0 +1,102 @@
1
+ require_relative '../cutest_helper'
2
+ require "slim"
3
+ require "cuba/render"
4
+ require 'cgi'
5
+
6
+ setup do
7
+ Cuba.reset!
8
+ Cuba::Tools::Widget.reset_config!
9
+ Cuba::Tools::Widget.setup do |c|
10
+ c.widgets = {
11
+ some_widget: 'SomeWidget',
12
+ other_widget: 'OtherWidget'
13
+ }
14
+ c.view_path = Dir.pwd + '/test/dummy/app/widgets'
15
+ end
16
+ Cuba.use Cuba::Tools::Widget::Middleware
17
+ Cuba.plugin Cuba::Tools::Widget::Helpers
18
+ Cuba.plugin Cuba::Render
19
+ Cuba.define do
20
+ def test_helper
21
+ 'test_helper'
22
+ end
23
+
24
+ on "test" do
25
+ res.write render_widget :some_widget
26
+ end
27
+
28
+ on root do
29
+ res.write 'default'
30
+ end
31
+ end
32
+ end
33
+
34
+ scope "tools/widget" do
35
+ test "config" do
36
+ assert Cuba::Tools::Widget.config.url_path == '/widgets'
37
+ Cuba::Tools::Widget.setup do |config|
38
+ config.url_path = '/new'
39
+ end
40
+ assert Cuba::Tools::Widget.config.url_path == '/new'
41
+ end
42
+ end
43
+
44
+ scope "cuba/tools/widget/middleware" do
45
+ test 'default' do
46
+ status, headers, resp = Cuba.call({
47
+ 'PATH_INFO' => '/widgets',
48
+ 'rack.input' => {}
49
+ })
50
+ body = resp.send('body').join
51
+
52
+ assert status == 200
53
+ assert headers['Content-Type'] == "text/javascript; charset=utf-8"
54
+ assert body[/\$\(document\)/] != nil
55
+ assert body[/default/] == nil
56
+
57
+ _, _, resp = Cuba.call({
58
+ 'PATH_INFO' => '/',
59
+ 'rack.input' => {}
60
+ })
61
+ body = resp.send('body').join
62
+
63
+ assert body[/\$\(document\)/] == nil
64
+ assert body[/default/] != nil
65
+ end
66
+
67
+ test 'widget events' do
68
+ _, _, resp = Cuba.call({
69
+ 'PATH_INFO' => '/widgets',
70
+ 'REQUEST_METHOD' => 'GET',
71
+ 'rack.input' => {},
72
+ 'QUERY_STRING' => 'widget_name=some_widget&widget_event=test'
73
+ })
74
+ body = CGI.unescapeHTML resp.send('body').join
75
+
76
+ assert body[/moo/] != nil
77
+ assert body[/cow/] != nil
78
+ end
79
+
80
+ test '#render_widget' do
81
+ _, _, resp = Cuba.call({
82
+ 'PATH_INFO' => '/test',
83
+ 'SCRIPT_NAME' => '/test',
84
+ 'REQUEST_METHOD' => 'GET',
85
+ 'rack.input' => {}
86
+ })
87
+ # TODO: figure out why the html isn't decoded properly
88
+ # body = CGI.unescapeHTML resp.send('body').join
89
+ body = resp.send('body').join
90
+
91
+ assert body['test_helper'] != nil
92
+ assert body['display'] != nil
93
+ assert body['some_widget_display'] != nil
94
+ assert body['some partial'] != nil
95
+ assert body['some state'] != nil
96
+ assert body['user_widget_method'] != nil
97
+ # TODO: figure out why the html isn't decoded properly
98
+ # and this is failing
99
+ # assert body['id="some_widget_some_state"'] != nil
100
+ assert body['some_widget_some_state'] != nil
101
+ end
102
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: cuba-tools
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.2
4
+ version: 0.0.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - cj
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-05-20 00:00:00.000000000 Z
11
+ date: 2014-05-23 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: cuba
@@ -52,6 +52,20 @@ dependencies:
52
52
  - - "~>"
53
53
  - !ruby/object:Gem::Version
54
54
  version: 0.1.9
55
+ - !ruby/object:Gem::Dependency
56
+ name: mab
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: 0.0.3
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: 0.0.3
55
69
  - !ruby/object:Gem::Dependency
56
70
  name: bundler
57
71
  requirement: !ruby/object:Gem::Requirement
@@ -80,6 +94,62 @@ dependencies:
80
94
  - - ">="
81
95
  - !ruby/object:Gem::Version
82
96
  version: '0'
97
+ - !ruby/object:Gem::Dependency
98
+ name: cutest-cj
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - ">="
102
+ - !ruby/object:Gem::Version
103
+ version: '0'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - ">="
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
111
+ - !ruby/object:Gem::Dependency
112
+ name: awesome_print
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - ">="
116
+ - !ruby/object:Gem::Version
117
+ version: '0'
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - ">="
123
+ - !ruby/object:Gem::Version
124
+ version: '0'
125
+ - !ruby/object:Gem::Dependency
126
+ name: tilt
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - ">="
130
+ - !ruby/object:Gem::Version
131
+ version: '0'
132
+ type: :development
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - ">="
137
+ - !ruby/object:Gem::Version
138
+ version: '0'
139
+ - !ruby/object:Gem::Dependency
140
+ name: slim
141
+ requirement: !ruby/object:Gem::Requirement
142
+ requirements:
143
+ - - ">="
144
+ - !ruby/object:Gem::Version
145
+ version: '0'
146
+ type: :development
147
+ prerelease: false
148
+ version_requirements: !ruby/object:Gem::Requirement
149
+ requirements:
150
+ - - ">="
151
+ - !ruby/object:Gem::Version
152
+ version: '0'
83
153
  description: Contains a group of tools to extend cuba
84
154
  email:
85
155
  - cjlazell@gmail.com
@@ -96,6 +166,21 @@ files:
96
166
  - lib/cuba/tools.rb
97
167
  - lib/cuba/tools/api.rb
98
168
  - lib/cuba/tools/auth.rb
169
+ - lib/cuba/tools/inflectors.rb
170
+ - lib/cuba/tools/mab.rb
171
+ - lib/cuba/tools/widget.rb
172
+ - lib/cuba/tools/widget/base.rb
173
+ - lib/cuba/tools/widget/events.rb
174
+ - lib/cuba/tools/widget/helpers.rb
175
+ - lib/cuba/tools/widget/middleware.rb
176
+ - lib/cuba/tools/widget/responder.rb
177
+ - test/cutest_helper.rb
178
+ - test/dummy/app/widgets/other_widget.rb
179
+ - test/dummy/app/widgets/some_widget.rb
180
+ - test/dummy/app/widgets/some_widget/_some_partial.slim
181
+ - test/dummy/app/widgets/some_widget/display.slim
182
+ - test/dummy/app/widgets/some_widget/some_state.slim
183
+ - test/tools/widget_test.rb
99
184
  homepage: ''
100
185
  licenses:
101
186
  - MIT
@@ -120,4 +205,11 @@ rubygems_version: 2.2.2
120
205
  signing_key:
121
206
  specification_version: 4
122
207
  summary: Tools to extend cuba
123
- test_files: []
208
+ test_files:
209
+ - test/cutest_helper.rb
210
+ - test/dummy/app/widgets/other_widget.rb
211
+ - test/dummy/app/widgets/some_widget.rb
212
+ - test/dummy/app/widgets/some_widget/_some_partial.slim
213
+ - test/dummy/app/widgets/some_widget/display.slim
214
+ - test/dummy/app/widgets/some_widget/some_state.slim
215
+ - test/tools/widget_test.rb