upmin 0.0.34
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/Rakefile +34 -0
- data/app/assets/images/upmin/logo_large.png +0 -0
- data/app/assets/images/upmin/logo_small.png +0 -0
- data/app/assets/javascripts/upmin/application.js +38 -0
- data/app/assets/javascripts/upmin/jquery-clockpicker.js +729 -0
- data/app/assets/javascripts/upmin/models.js +23 -0
- data/app/assets/javascripts/upmin/pikaday.js +997 -0
- data/app/assets/stylesheets/upmin/application.css +16 -0
- data/app/assets/stylesheets/upmin/base.css.scss +24 -0
- data/app/assets/stylesheets/upmin/button_mixins.scss +37 -0
- data/app/assets/stylesheets/upmin/colors.scss +20 -0
- data/app/assets/stylesheets/upmin/instances.css.scss +91 -0
- data/app/assets/stylesheets/upmin/jquery-clockpicker.css +370 -0
- data/app/assets/stylesheets/upmin/models.css.scss +207 -0
- data/app/assets/stylesheets/upmin/pikaday.css +196 -0
- data/app/controllers/upmin/application_controller.rb +4 -0
- data/app/controllers/upmin/models_controller.rb +94 -0
- data/app/helpers/upmin/application_helper.rb +17 -0
- data/app/helpers/upmin/instances_helper.rb +13 -0
- data/app/helpers/upmin/models_helper.rb +4 -0
- data/app/views/layouts/upmin/_navbar.html.haml +15 -0
- data/app/views/layouts/upmin/application.html.haml +24 -0
- data/app/views/upmin/models/_search_result.html.haml +25 -0
- data/app/views/upmin/models/dashboard.html.haml +9 -0
- data/app/views/upmin/models/search.html.haml +20 -0
- data/app/views/upmin/models/show.html.haml +21 -0
- data/app/views/upmin/search_boxes/_unknown.html.haml +31 -0
- data/app/views/upmin/search_fields/_string.html.haml +3 -0
- data/app/views/upmin/types/_datetime.html.haml +95 -0
- data/app/views/upmin/types/_integer.html.haml +6 -0
- data/app/views/upmin/types/_string.html.haml +7 -0
- data/app/views/upmin/types/_unknown.html.haml +2 -0
- data/app/views/upmin/types/_unknown_collection.html.haml +18 -0
- data/app/views/upmin/types/_unknown_model.html.haml +57 -0
- data/app/views/upmin/types/_unknown_model_badge.html.haml +3 -0
- data/app/views/upmin/types/_unknown_model_nested.html.haml +24 -0
- data/app/views/upmin/types/_unknown_model_search_result.html.haml +31 -0
- data/config/routes.rb +19 -0
- data/lib/tasks/accordive_rails_tasks.rake +4 -0
- data/lib/tasks/upmin_tasks.rake +4 -0
- data/lib/upmin.rb +44 -0
- data/lib/upmin/engine.rb +7 -0
- data/lib/upmin/graph/collection_node.rb +72 -0
- data/lib/upmin/graph/data_node.rb +69 -0
- data/lib/upmin/graph/model_node.rb +151 -0
- data/lib/upmin/graph/node.rb +98 -0
- data/lib/upmin/model.rb +131 -0
- data/lib/upmin/railtie.rb +19 -0
- data/lib/upmin/railties/active_record.rb +156 -0
- data/lib/upmin/railties/render.rb +56 -0
- data/lib/upmin/railties/render_helpers.rb +57 -0
- data/lib/upmin/version.rb +3 -0
- data/test/controllers/upmin/model_controller_test.rb +11 -0
- data/test/dummy/README.rdoc +28 -0
- data/test/dummy/Rakefile +6 -0
- data/test/dummy/app/assets/javascripts/application.js +13 -0
- data/test/dummy/app/assets/stylesheets/application.css +15 -0
- data/test/dummy/app/controllers/application_controller.rb +5 -0
- data/test/dummy/app/helpers/application_helper.rb +2 -0
- data/test/dummy/app/views/layouts/application.html.erb +14 -0
- data/test/dummy/bin/bundle +3 -0
- data/test/dummy/bin/rails +4 -0
- data/test/dummy/bin/rake +4 -0
- data/test/dummy/config.ru +4 -0
- data/test/dummy/config/application.rb +23 -0
- data/test/dummy/config/boot.rb +5 -0
- data/test/dummy/config/database.yml +25 -0
- data/test/dummy/config/environment.rb +5 -0
- data/test/dummy/config/environments/development.rb +37 -0
- data/test/dummy/config/environments/production.rb +83 -0
- data/test/dummy/config/environments/test.rb +39 -0
- data/test/dummy/config/initializers/backtrace_silencers.rb +7 -0
- data/test/dummy/config/initializers/cookies_serializer.rb +3 -0
- data/test/dummy/config/initializers/filter_parameter_logging.rb +4 -0
- data/test/dummy/config/initializers/inflections.rb +16 -0
- data/test/dummy/config/initializers/mime_types.rb +4 -0
- data/test/dummy/config/initializers/session_store.rb +3 -0
- data/test/dummy/config/initializers/wrap_parameters.rb +14 -0
- data/test/dummy/config/locales/en.yml +23 -0
- data/test/dummy/config/routes.rb +4 -0
- data/test/dummy/config/secrets.yml +22 -0
- data/test/dummy/public/404.html +67 -0
- data/test/dummy/public/422.html +67 -0
- data/test/dummy/public/500.html +66 -0
- data/test/dummy/public/favicon.ico +0 -0
- data/test/helpers/upmin/model_helper_test.rb +6 -0
- data/test/integration/navigation_test.rb +10 -0
- data/test/test_helper.rb +15 -0
- data/test/upmin_test.rb +7 -0
- metadata +253 -0
data/config/routes.rb
ADDED
@@ -0,0 +1,19 @@
|
|
1
|
+
Upmin::Engine.routes.draw do
|
2
|
+
root to: "models#dashboard"
|
3
|
+
|
4
|
+
scope :models do
|
5
|
+
# TODO(jon): Put dashboards elsewhere prob.. whatever for now.
|
6
|
+
get "/", as: :upmin_dashboard, controller: :models, action: :dashboard
|
7
|
+
|
8
|
+
scope "/:model_name" do
|
9
|
+
match "/", as: :upmin_search, controller: :models, action: :search, via: [:get, :post]
|
10
|
+
|
11
|
+
scope "/:id" do
|
12
|
+
get "/", as: :upmin_model, controller: :models, action: :show
|
13
|
+
put "/", controller: :models, action: :update
|
14
|
+
|
15
|
+
post "/:method", as: :upmin_action, controller: :models, action: :action
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
data/lib/upmin.rb
ADDED
@@ -0,0 +1,44 @@
|
|
1
|
+
require "upmin/engine"
|
2
|
+
|
3
|
+
require "upmin/model"
|
4
|
+
|
5
|
+
# For displaying views and finding children
|
6
|
+
require "upmin/graph/collection_node"
|
7
|
+
require "upmin/graph/data_node"
|
8
|
+
require "upmin/graph/model_node"
|
9
|
+
|
10
|
+
# Monkey patch code into rails
|
11
|
+
require "upmin/railties/active_record"
|
12
|
+
# require "upmin/active_record_relation"
|
13
|
+
require "upmin/railties/render"
|
14
|
+
require "upmin/railties/render_helpers"
|
15
|
+
require "upmin/railtie"
|
16
|
+
|
17
|
+
# gems and stuff we use
|
18
|
+
require "ransack"
|
19
|
+
require "typhoeus"
|
20
|
+
require "haml"
|
21
|
+
require "sass-rails"
|
22
|
+
|
23
|
+
module Upmin
|
24
|
+
|
25
|
+
def Upmin.api_key=(api_key)
|
26
|
+
@@api_key = api_key
|
27
|
+
# Upmin.notify_upmin
|
28
|
+
end
|
29
|
+
|
30
|
+
def Upmin.api_key
|
31
|
+
if (defined? @@api_key)
|
32
|
+
return @@api_key
|
33
|
+
else
|
34
|
+
raise "Upmin API key is not set."
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
# def Upmin.notify_upmin
|
39
|
+
# # TODO(jon): Add if prod check here (and maybe other spots?)
|
40
|
+
# resp = Typhoeus.get(init_url, followlocation: true, params: { api_key: Upmin.api_key })
|
41
|
+
# puts JSON.parse(resp.body)
|
42
|
+
# end
|
43
|
+
|
44
|
+
end
|
data/lib/upmin/engine.rb
ADDED
@@ -0,0 +1,72 @@
|
|
1
|
+
module Upmin::Graph
|
2
|
+
class CollectionNode
|
3
|
+
def initialize(collection, options = {})
|
4
|
+
@collection = collection
|
5
|
+
@options = options
|
6
|
+
end
|
7
|
+
|
8
|
+
def collection
|
9
|
+
return @collection
|
10
|
+
end
|
11
|
+
alias_method :object, :collection
|
12
|
+
|
13
|
+
def options
|
14
|
+
return @options
|
15
|
+
end
|
16
|
+
|
17
|
+
def depth
|
18
|
+
return options[:depth] ||= 0
|
19
|
+
end
|
20
|
+
|
21
|
+
def editable?
|
22
|
+
return options[:editable] if options[:editable]
|
23
|
+
return options[:editable] = false
|
24
|
+
end
|
25
|
+
|
26
|
+
def type
|
27
|
+
return options[:type] ||= determine_type
|
28
|
+
end
|
29
|
+
|
30
|
+
def method_name
|
31
|
+
return options[:method_name] || nil
|
32
|
+
end
|
33
|
+
|
34
|
+
def nodes
|
35
|
+
return @nodes ||= create_nodes
|
36
|
+
end
|
37
|
+
|
38
|
+
private
|
39
|
+
def determine_type
|
40
|
+
# TODO(jon): Maybe optimize multi-type collections? Prob don't need this much work to figure them out.
|
41
|
+
if collection.any?
|
42
|
+
klasses = collection.map{|c| c.class.to_s.underscore.to_sym}
|
43
|
+
if klasses.uniq.length == 1
|
44
|
+
return "#{klasses.first}_collection".to_sym
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
if method_name
|
49
|
+
return "#{method_name.to_s.singularize}_collection"
|
50
|
+
else
|
51
|
+
return :unknown_collection
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
def create_nodes
|
56
|
+
nodes = []
|
57
|
+
node_options = {
|
58
|
+
depth: depth,
|
59
|
+
editable: editable?
|
60
|
+
}
|
61
|
+
collection.each do |collection_item|
|
62
|
+
if collection_item.is_a?(ActiveRecord::Base)
|
63
|
+
nodes << ModelNode.new(collection_item, node_options)
|
64
|
+
else
|
65
|
+
nodes << DataNode.new(collection_item, node_options)
|
66
|
+
end
|
67
|
+
end
|
68
|
+
return nodes
|
69
|
+
end
|
70
|
+
|
71
|
+
end
|
72
|
+
end
|
@@ -0,0 +1,69 @@
|
|
1
|
+
module Upmin::Graph
|
2
|
+
class Upmin::Graph::DataNode
|
3
|
+
def initialize(data, options = {})
|
4
|
+
@data = data
|
5
|
+
@options = options
|
6
|
+
end
|
7
|
+
|
8
|
+
def data
|
9
|
+
return @data
|
10
|
+
end
|
11
|
+
alias_method :object, :data
|
12
|
+
|
13
|
+
def options
|
14
|
+
return @options
|
15
|
+
end
|
16
|
+
|
17
|
+
def depth
|
18
|
+
return options[:depth] ||= 0
|
19
|
+
end
|
20
|
+
|
21
|
+
def editable?
|
22
|
+
return options[:editable] unless options[:editable].nil?
|
23
|
+
return options[:editable] = false
|
24
|
+
end
|
25
|
+
|
26
|
+
def type
|
27
|
+
return options[:type] ||= determine_type
|
28
|
+
end
|
29
|
+
|
30
|
+
def method_name
|
31
|
+
return options[:method_name] || nil
|
32
|
+
end
|
33
|
+
|
34
|
+
def parent_name
|
35
|
+
return options[:parent_name] || nil
|
36
|
+
end
|
37
|
+
|
38
|
+
def form_name
|
39
|
+
return "#{parent_name}[#{method_name}]"
|
40
|
+
end
|
41
|
+
|
42
|
+
def form_id
|
43
|
+
return "#{parent_name}_#{method_name}"
|
44
|
+
end
|
45
|
+
|
46
|
+
|
47
|
+
|
48
|
+
private
|
49
|
+
|
50
|
+
def determine_type
|
51
|
+
# Preferably this gets set by the model, but in the case that it isn't we try to determine it with the data
|
52
|
+
class_name = data.class.to_s.underscore.to_sym
|
53
|
+
if class_name == :false_class || class_name == :true_class
|
54
|
+
return :boolean
|
55
|
+
elsif class_name == :nil_class
|
56
|
+
return :unknown
|
57
|
+
elsif class_name == :fixnum
|
58
|
+
return :integer
|
59
|
+
elsif class_name == :big_decimal
|
60
|
+
return :decimal
|
61
|
+
elsif class_name == :"active_support/time_with_zone"
|
62
|
+
return :datetime
|
63
|
+
else
|
64
|
+
# TODO(jon): Determine if we need more for things like binary, date, timestamp, etc.
|
65
|
+
return class_name
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
@@ -0,0 +1,151 @@
|
|
1
|
+
module Upmin::Graph
|
2
|
+
class ModelNode
|
3
|
+
def initialize(model, options = {})
|
4
|
+
@model = model
|
5
|
+
@options = options
|
6
|
+
end
|
7
|
+
|
8
|
+
def model
|
9
|
+
return @model
|
10
|
+
end
|
11
|
+
alias_method :object, :model
|
12
|
+
|
13
|
+
def options
|
14
|
+
return @options
|
15
|
+
end
|
16
|
+
|
17
|
+
def depth
|
18
|
+
return options[:depth] ||= 0
|
19
|
+
end
|
20
|
+
|
21
|
+
def editable?
|
22
|
+
return options[:editable] if options[:editable]
|
23
|
+
return options[:editable] = true
|
24
|
+
end
|
25
|
+
|
26
|
+
def type
|
27
|
+
return options[:type] ||= determine_type
|
28
|
+
end
|
29
|
+
|
30
|
+
def method_name
|
31
|
+
return options[:method_name] || nil
|
32
|
+
end
|
33
|
+
|
34
|
+
def name
|
35
|
+
return model.upmin_name(:singular)
|
36
|
+
end
|
37
|
+
|
38
|
+
def title
|
39
|
+
# TODO(jon): Add block option for custom defined titles
|
40
|
+
return "#{name} # #{model.id}"
|
41
|
+
end
|
42
|
+
|
43
|
+
def color
|
44
|
+
return model.upmin_color
|
45
|
+
end
|
46
|
+
|
47
|
+
def path_hash
|
48
|
+
return {
|
49
|
+
model_name: model.class.to_s,
|
50
|
+
id: model.id
|
51
|
+
}
|
52
|
+
end
|
53
|
+
|
54
|
+
# TODO(jon): Add the following methods:
|
55
|
+
|
56
|
+
|
57
|
+
def attributes
|
58
|
+
return @attributes ||= create_attributes
|
59
|
+
end
|
60
|
+
|
61
|
+
def children
|
62
|
+
if depth >= 1
|
63
|
+
return [] # nothing beyond a depth of 2
|
64
|
+
else
|
65
|
+
return @children ||= create_children
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
def singletons
|
70
|
+
return @singletons if @singletons
|
71
|
+
create_children # backfill this if not defined
|
72
|
+
return @singletons
|
73
|
+
end
|
74
|
+
|
75
|
+
def collections
|
76
|
+
return @collections if @collections
|
77
|
+
create_children # backfill this if not defined
|
78
|
+
return @collections
|
79
|
+
end
|
80
|
+
|
81
|
+
def type_prefix
|
82
|
+
name = model.class.to_s.underscore
|
83
|
+
return name
|
84
|
+
end
|
85
|
+
|
86
|
+
def type_suffix
|
87
|
+
if depth == 0
|
88
|
+
return "_model"
|
89
|
+
elsif depth >= 1
|
90
|
+
return "_model_nested"
|
91
|
+
# else
|
92
|
+
# return "_model_badge"
|
93
|
+
end
|
94
|
+
end
|
95
|
+
|
96
|
+
private
|
97
|
+
def determine_type
|
98
|
+
return "#{type_prefix}#{type_suffix}".to_sym
|
99
|
+
end
|
100
|
+
|
101
|
+
def create_attributes
|
102
|
+
attributes = {}
|
103
|
+
editable = (depth == 0)
|
104
|
+
|
105
|
+
model.upmin_attributes.each do |u_attr|
|
106
|
+
attributes[u_attr] = DataNode.new(
|
107
|
+
model.upmin_get_attr(u_attr), {
|
108
|
+
depth: depth + 1,
|
109
|
+
editable: editable && model.upmin_attr_editable?(u_attr),
|
110
|
+
type: model.upmin_attr_type(u_attr),
|
111
|
+
method_name: u_attr,
|
112
|
+
parent_name: model.class.to_s.underscore
|
113
|
+
})
|
114
|
+
end
|
115
|
+
return attributes
|
116
|
+
end
|
117
|
+
|
118
|
+
def create_children
|
119
|
+
singletons = {}
|
120
|
+
collections = {}
|
121
|
+
|
122
|
+
model.upmin_associations.each do |association|
|
123
|
+
puts "Association=#{association}"
|
124
|
+
v = model.upmin_get_assoc(association)
|
125
|
+
puts "Value for assoc is: #{v} #{v.inspect}"
|
126
|
+
options = {
|
127
|
+
depth: depth + 1,
|
128
|
+
editable: (depth == 0),
|
129
|
+
method_name: association.to_sym
|
130
|
+
}
|
131
|
+
puts options.inspect
|
132
|
+
puts options.inspect
|
133
|
+
puts options.inspect
|
134
|
+
puts options.inspect
|
135
|
+
|
136
|
+
if v.nil?
|
137
|
+
singletons[association] = DataNode.new(nil, options.merge(type: :unknown))
|
138
|
+
elsif v.is_a?(ActiveRecord::Base)
|
139
|
+
singletons[association] = ModelNode.new(v, options)
|
140
|
+
else
|
141
|
+
collections[association] = CollectionNode.new(v, options)
|
142
|
+
end
|
143
|
+
end
|
144
|
+
|
145
|
+
@singletons = singletons
|
146
|
+
@collections = collections
|
147
|
+
return @singletons.merge(@collections)
|
148
|
+
end
|
149
|
+
|
150
|
+
end
|
151
|
+
end
|
@@ -0,0 +1,98 @@
|
|
1
|
+
# module Upmin
|
2
|
+
# module Graph
|
3
|
+
# end
|
4
|
+
# end
|
5
|
+
|
6
|
+
# class Upmin::Graph::Node
|
7
|
+
# def initialize(model, depth = 0)
|
8
|
+
# @model = model
|
9
|
+
# @depth = depth
|
10
|
+
# end
|
11
|
+
|
12
|
+
# def model
|
13
|
+
# return @model
|
14
|
+
# end
|
15
|
+
|
16
|
+
# def depth
|
17
|
+
# return @depth
|
18
|
+
# end
|
19
|
+
|
20
|
+
# def attributes
|
21
|
+
# return @attributes ||= create_attributes
|
22
|
+
# end
|
23
|
+
|
24
|
+
# def children
|
25
|
+
# if @depth >= 2
|
26
|
+
# return [] # nothing beyond a depth of 2
|
27
|
+
# else
|
28
|
+
# return @children ||= create_children
|
29
|
+
# end
|
30
|
+
# end
|
31
|
+
|
32
|
+
# private
|
33
|
+
# def create_attributes
|
34
|
+
# attributes = []
|
35
|
+
# model.upmin_attributes.each do |u_attr|
|
36
|
+
# attributes << {
|
37
|
+
# name: u_attr.to_sym,
|
38
|
+
# value: model.upmin_get(u_attr),
|
39
|
+
# editable: depth == 0 && model.upmin_attr_editable?(u_attr),
|
40
|
+
# type: model.upmin_attr_type(u_attr)
|
41
|
+
# }
|
42
|
+
# end
|
43
|
+
# return attributes
|
44
|
+
# end
|
45
|
+
|
46
|
+
# def create_children
|
47
|
+
# @singletons = []
|
48
|
+
# @collections = []
|
49
|
+
# model.upmin_associations.each do |association|
|
50
|
+
# puts "Association=#{association}"
|
51
|
+
# v = model.upmin_get_assoc(association)
|
52
|
+
# puts "Value for assoc is: #{v} #{v.inspect}"
|
53
|
+
# options = {
|
54
|
+
# depth: depth + 1,
|
55
|
+
# editable: false
|
56
|
+
# }
|
57
|
+
|
58
|
+
# if v.nil?
|
59
|
+
# @singletons << DataNode.new(nil, depth: depth + 1)
|
60
|
+
# elsif true
|
61
|
+
|
62
|
+
# else
|
63
|
+
|
64
|
+
# end
|
65
|
+
|
66
|
+
# hash = {
|
67
|
+
# name: association.to_sym,
|
68
|
+
# }
|
69
|
+
# if v.nil?
|
70
|
+
# # TODO(jon): Make this work better
|
71
|
+
# @singletons << hash.merge({
|
72
|
+
# value: nil,
|
73
|
+
# editable: false,
|
74
|
+
# type: :nil
|
75
|
+
# })
|
76
|
+
# elsif v.is_a?(ActiveRecord::Base)
|
77
|
+
# @singletons << hash.merge({
|
78
|
+
# value: Node.new(v, depth + 1),
|
79
|
+
# editable: false,
|
80
|
+
# type: v.class.to_s.underscore.to_sym
|
81
|
+
# })
|
82
|
+
# else # Assume it is a collection or nil
|
83
|
+
# type = :nil
|
84
|
+
# type = v.first.class.to_s.underscore if v.any?
|
85
|
+
# type = "#{type}_collection".to_sym
|
86
|
+
|
87
|
+
# @collections << hash.merge({
|
88
|
+
# value: "",
|
89
|
+
# editable: false,
|
90
|
+
# type: type
|
91
|
+
# })
|
92
|
+
# end
|
93
|
+
# end
|
94
|
+
|
95
|
+
# return @singletons + @collections
|
96
|
+
# end
|
97
|
+
|
98
|
+
# end
|