upmin 0.0.34
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 +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
|