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.
Files changed (91) hide show
  1. checksums.yaml +7 -0
  2. data/Rakefile +34 -0
  3. data/app/assets/images/upmin/logo_large.png +0 -0
  4. data/app/assets/images/upmin/logo_small.png +0 -0
  5. data/app/assets/javascripts/upmin/application.js +38 -0
  6. data/app/assets/javascripts/upmin/jquery-clockpicker.js +729 -0
  7. data/app/assets/javascripts/upmin/models.js +23 -0
  8. data/app/assets/javascripts/upmin/pikaday.js +997 -0
  9. data/app/assets/stylesheets/upmin/application.css +16 -0
  10. data/app/assets/stylesheets/upmin/base.css.scss +24 -0
  11. data/app/assets/stylesheets/upmin/button_mixins.scss +37 -0
  12. data/app/assets/stylesheets/upmin/colors.scss +20 -0
  13. data/app/assets/stylesheets/upmin/instances.css.scss +91 -0
  14. data/app/assets/stylesheets/upmin/jquery-clockpicker.css +370 -0
  15. data/app/assets/stylesheets/upmin/models.css.scss +207 -0
  16. data/app/assets/stylesheets/upmin/pikaday.css +196 -0
  17. data/app/controllers/upmin/application_controller.rb +4 -0
  18. data/app/controllers/upmin/models_controller.rb +94 -0
  19. data/app/helpers/upmin/application_helper.rb +17 -0
  20. data/app/helpers/upmin/instances_helper.rb +13 -0
  21. data/app/helpers/upmin/models_helper.rb +4 -0
  22. data/app/views/layouts/upmin/_navbar.html.haml +15 -0
  23. data/app/views/layouts/upmin/application.html.haml +24 -0
  24. data/app/views/upmin/models/_search_result.html.haml +25 -0
  25. data/app/views/upmin/models/dashboard.html.haml +9 -0
  26. data/app/views/upmin/models/search.html.haml +20 -0
  27. data/app/views/upmin/models/show.html.haml +21 -0
  28. data/app/views/upmin/search_boxes/_unknown.html.haml +31 -0
  29. data/app/views/upmin/search_fields/_string.html.haml +3 -0
  30. data/app/views/upmin/types/_datetime.html.haml +95 -0
  31. data/app/views/upmin/types/_integer.html.haml +6 -0
  32. data/app/views/upmin/types/_string.html.haml +7 -0
  33. data/app/views/upmin/types/_unknown.html.haml +2 -0
  34. data/app/views/upmin/types/_unknown_collection.html.haml +18 -0
  35. data/app/views/upmin/types/_unknown_model.html.haml +57 -0
  36. data/app/views/upmin/types/_unknown_model_badge.html.haml +3 -0
  37. data/app/views/upmin/types/_unknown_model_nested.html.haml +24 -0
  38. data/app/views/upmin/types/_unknown_model_search_result.html.haml +31 -0
  39. data/config/routes.rb +19 -0
  40. data/lib/tasks/accordive_rails_tasks.rake +4 -0
  41. data/lib/tasks/upmin_tasks.rake +4 -0
  42. data/lib/upmin.rb +44 -0
  43. data/lib/upmin/engine.rb +7 -0
  44. data/lib/upmin/graph/collection_node.rb +72 -0
  45. data/lib/upmin/graph/data_node.rb +69 -0
  46. data/lib/upmin/graph/model_node.rb +151 -0
  47. data/lib/upmin/graph/node.rb +98 -0
  48. data/lib/upmin/model.rb +131 -0
  49. data/lib/upmin/railtie.rb +19 -0
  50. data/lib/upmin/railties/active_record.rb +156 -0
  51. data/lib/upmin/railties/render.rb +56 -0
  52. data/lib/upmin/railties/render_helpers.rb +57 -0
  53. data/lib/upmin/version.rb +3 -0
  54. data/test/controllers/upmin/model_controller_test.rb +11 -0
  55. data/test/dummy/README.rdoc +28 -0
  56. data/test/dummy/Rakefile +6 -0
  57. data/test/dummy/app/assets/javascripts/application.js +13 -0
  58. data/test/dummy/app/assets/stylesheets/application.css +15 -0
  59. data/test/dummy/app/controllers/application_controller.rb +5 -0
  60. data/test/dummy/app/helpers/application_helper.rb +2 -0
  61. data/test/dummy/app/views/layouts/application.html.erb +14 -0
  62. data/test/dummy/bin/bundle +3 -0
  63. data/test/dummy/bin/rails +4 -0
  64. data/test/dummy/bin/rake +4 -0
  65. data/test/dummy/config.ru +4 -0
  66. data/test/dummy/config/application.rb +23 -0
  67. data/test/dummy/config/boot.rb +5 -0
  68. data/test/dummy/config/database.yml +25 -0
  69. data/test/dummy/config/environment.rb +5 -0
  70. data/test/dummy/config/environments/development.rb +37 -0
  71. data/test/dummy/config/environments/production.rb +83 -0
  72. data/test/dummy/config/environments/test.rb +39 -0
  73. data/test/dummy/config/initializers/backtrace_silencers.rb +7 -0
  74. data/test/dummy/config/initializers/cookies_serializer.rb +3 -0
  75. data/test/dummy/config/initializers/filter_parameter_logging.rb +4 -0
  76. data/test/dummy/config/initializers/inflections.rb +16 -0
  77. data/test/dummy/config/initializers/mime_types.rb +4 -0
  78. data/test/dummy/config/initializers/session_store.rb +3 -0
  79. data/test/dummy/config/initializers/wrap_parameters.rb +14 -0
  80. data/test/dummy/config/locales/en.yml +23 -0
  81. data/test/dummy/config/routes.rb +4 -0
  82. data/test/dummy/config/secrets.yml +22 -0
  83. data/test/dummy/public/404.html +67 -0
  84. data/test/dummy/public/422.html +67 -0
  85. data/test/dummy/public/500.html +66 -0
  86. data/test/dummy/public/favicon.ico +0 -0
  87. data/test/helpers/upmin/model_helper_test.rb +6 -0
  88. data/test/integration/navigation_test.rb +10 -0
  89. data/test/test_helper.rb +15 -0
  90. data/test/upmin_test.rb +7 -0
  91. metadata +253 -0
@@ -0,0 +1,131 @@
1
+ module Upmin
2
+ class Model
3
+
4
+ attr_accessor :rails_model
5
+ attr_accessor :color
6
+
7
+ def initialize(rails_model, options = {})
8
+ self.rails_model = rails_model
9
+
10
+ if options[:color]
11
+ self.color = options[:color]
12
+ end
13
+ end
14
+
15
+ def to_s
16
+ return rails_model.to_s
17
+ end
18
+
19
+ def name
20
+ return rails_model.name
21
+ end
22
+
23
+ def u_name
24
+ return rails_model.upmin_name
25
+ end
26
+
27
+ def form_name
28
+ return rails_model.name.underscore
29
+ end
30
+ alias_method :partial_name, :form_name
31
+
32
+ # Wrapper methods that the normal model would have access to
33
+ def find(id)
34
+ return rails_model.find(id)
35
+ end
36
+
37
+ def search(*args)
38
+ return self.rails_model.ransack(*args)
39
+ end
40
+ alias_method :ransack, :search
41
+
42
+ def upmin_methods
43
+ return self.rails_model.upmin_methods
44
+ end
45
+
46
+
47
+ # Methods that perform actions on an instance but require some prep and logic ahead of time that shouldn't be injected into the active record.
48
+ def perform_action(instance, method, arguments)
49
+ raise "Invalid method: #{method}" unless upmin_methods.include?(method.to_sym)
50
+
51
+ params = instance.method(method).parameters
52
+ args_to_send = []
53
+ params.each do |type, name|
54
+ if type == :req
55
+ raise "Missing argument: #{name}" unless arguments[name]
56
+ args_to_send << arguments[name]
57
+ puts "Added: #{arguments[name].inspect}"
58
+ elsif type == :opt
59
+ puts arguments.inspect
60
+ args_to_send << arguments[name] if arguments[name]
61
+ puts "Added: #{arguments[name].inspect}"
62
+ else # :block or ??
63
+ next
64
+ end
65
+ end
66
+ return instance.send(method, *args_to_send)
67
+ end
68
+
69
+
70
+ # Methods for determinining attributes, and their types.
71
+ def attributes
72
+ return @attributes if defined?(@attributes)
73
+
74
+ attributes = {}
75
+ rails_model.upmin_attributes.each do |u_attr|
76
+ attributes[u_attr] = {}
77
+ attributes[u_attr][:type] = get_attr_type(u_attr)
78
+ end
79
+
80
+ return @attributes = attributes
81
+ end
82
+
83
+ def get_attr_type(attr_name)
84
+ if uc = rails_model.columns_hash[attr_name.to_s]
85
+ return uc.type
86
+ else
87
+ return :unknown
88
+ end
89
+ end
90
+
91
+
92
+ ## Generic Class Methods
93
+ def Model.find(name)
94
+ return all.select{|a| a.to_s == name.to_s}.first
95
+ end
96
+
97
+ # TODO(jon): Store this in the future so it doesn't have to be looked up every call.
98
+ def Model.all
99
+ return @models_array if defined?(@models_array)
100
+ models_array = []
101
+ colors = [
102
+ :light_blue,
103
+ :blue_green,
104
+ :red,
105
+ :yellow,
106
+ :orange,
107
+ :purple,
108
+ :dark_blue,
109
+ :dark_red,
110
+ :green
111
+ ]
112
+
113
+ rails_models.each_with_index do |rails_model, i|
114
+ ac_model = Model.new(rails_model, color: colors[i % colors.length])
115
+ models_array << ac_model
116
+ end
117
+
118
+ return @models_array = models_array
119
+ end
120
+
121
+ def Model.rails_models
122
+ ::Rails.application.eager_load!
123
+ rails_models = ::ActiveRecord::Base.descendants.select do |m|
124
+ m.to_s != "ActiveRecord::SchemaMigration"
125
+ end
126
+
127
+ return rails_models
128
+ end
129
+
130
+ end
131
+ end
@@ -0,0 +1,19 @@
1
+ module Upmin
2
+ require 'rails'
3
+ class Railtie < Rails::Railtie
4
+ initializer('upmin.insert_into_active_record') do
5
+ ActiveSupport.on_load(:active_record) do
6
+ ::ActiveRecord::Base.send(:include, Upmin::Railties::ActiveRecord)
7
+ # ::ActiveRecord::Relation.send(:include, Upmin::ActiveRecordRelation)
8
+ end
9
+
10
+ ActiveSupport.on_load(:action_controller) do
11
+ ::ActionController::Base.send(:include, Upmin::Railties::Render)
12
+ end
13
+
14
+ ActiveSupport.on_load(:action_view) do
15
+ ::ActionView::Base.send(:include, Upmin::Railties::Render)
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,156 @@
1
+ require 'active_support/concern'
2
+
3
+ module Upmin::Railties
4
+ module ActiveRecord
5
+ extend ::ActiveSupport::Concern
6
+
7
+ included do
8
+ after_save :notify_upmin_of_save
9
+ end
10
+
11
+ def notify_upmin_of_save
12
+ # TODO(jon): Add after_save notifications.
13
+ end
14
+
15
+ def upmin_attributes
16
+ return self.class.upmin_attributes
17
+ end
18
+
19
+ def upmin_associations
20
+ return self.class.upmin_associations
21
+ end
22
+
23
+ def upmin_collection_reflections
24
+ return self.class.upmin_collection_reflections
25
+ end
26
+
27
+ def upmin_name(type = :plural)
28
+ return self.class.upmin_name(type)
29
+ end
30
+
31
+ def upmin_color
32
+ return self.class.upmin_color
33
+ end
34
+
35
+ def upmin_attr_editable?(attr_name)
36
+ return false if attr_name.to_sym == :id
37
+ return false if attr_name.to_sym == :created_at
38
+ return false if attr_name.to_sym == :updated_at
39
+ # TODO(jon): Add a way to lock this later
40
+ return self.respond_to?("#{attr_name}=")
41
+ end
42
+
43
+ def upmin_attr_type(attr_name)
44
+ if uc = self.class.columns_hash[attr_name.to_s]
45
+ return uc.type
46
+ else
47
+ return :unknown
48
+ end
49
+ end
50
+
51
+ def upmin_get_attr(attr_name)
52
+ return send(attr_name)
53
+ end
54
+
55
+ def upmin_get_assoc(assoc_name)
56
+ assoc_name = assoc_name.to_sym
57
+ if upmin_collection_reflections.include?(assoc_name)
58
+ return send(assoc_name).limit(5)
59
+ else
60
+ return send(assoc_name)
61
+ end
62
+ end
63
+
64
+ module ClassMethods
65
+
66
+ def upmin_attributes(*attributes)
67
+ if attributes.any?
68
+ @upmin_attributes = attributes.map{|a| a.to_sym}
69
+ end
70
+ @upmin_attributes ||= attribute_names.map{|a| a.to_sym}
71
+ return @upmin_attributes
72
+ end
73
+
74
+ def upmin_actions(*actions)
75
+ if actions.any?
76
+ @upmin_actions = actions.map{|a| a.to_sym}
77
+ end
78
+ return @upmin_actions
79
+ end
80
+
81
+ # Alias for upmin_actions
82
+ def upmin_methods(*methods)
83
+ return upmin_actions(*methods)
84
+ end
85
+
86
+
87
+ def upmin_associations(*associations)
88
+ if associations.any?
89
+ @upmin_associations = associations.map{|a| a.to_sym}
90
+ end
91
+ return @upmin_associations if defined?(@upmin_associations)
92
+
93
+ # TODO(jon): Make this handle through relationships and ignore those.
94
+ upmin_associations = []
95
+ ignored_associations = []
96
+ self.reflect_on_all_associations.each do |reflection|
97
+ upmin_associations << reflection.name.to_sym
98
+ if reflection.is_a?(::ActiveRecord::Reflection::ThroughReflection)
99
+ ignored_associations << reflection.options[:through]
100
+ end
101
+ end
102
+ return @upmin_associations = upmin_associations - ignored_associations
103
+ end
104
+
105
+ def upmin_collection_reflections
106
+ return @upmin_collection_reflections if defined?(@upmin_collection_reflections)
107
+ collections = self.reflect_on_all_associations.select do |r|
108
+ r.collection?
109
+ end.map do |r|
110
+ r.name
111
+ end
112
+ return @upmin_collection_reflections = collections
113
+ end
114
+
115
+ # def upmin_collections(*collections)
116
+ # if collections.any?
117
+ # @upmin_collections = collections.map{|a| a.to_sym}
118
+ # end
119
+ # return @upmin_collections if defined?(@upmin_collections)
120
+
121
+ # @upmin_collections = []
122
+ # ignored_collections
123
+ # self.reflect_on_all_associations.each do |reflection|
124
+ # @upmin_collections.name.to_sym << if reflection.collection?
125
+ # if reflection.is_a?(ActiveRecord::Reflection::ThroughReflection)
126
+ # # We need to figure out what collection to ignore.
127
+ # @upmin_collections.name.to_sym
128
+ # end
129
+ # end
130
+ # return @upmin_collections
131
+ # end
132
+
133
+ def upmin_actions(*actions)
134
+ if actions.any?
135
+ @upmin_actions = actions.map{|a| a.to_sym}
136
+ end
137
+ @upmin_actions ||= []
138
+ return @upmin_actions
139
+ end
140
+
141
+ def upmin_name(type = :plural)
142
+ names = name.split(/(?=[A-Z])/)
143
+ if type == :plural
144
+ names[names.length-1] = names.last.pluralize
145
+ end
146
+ return names.join(" ")
147
+ end
148
+
149
+ def upmin_color
150
+ return @upmin_color if defined?(@upmin_color)
151
+ return @upmin_color = Upmin::Model.find(self.name).color
152
+ end
153
+
154
+ end
155
+ end
156
+ end
@@ -0,0 +1,56 @@
1
+
2
+ module Upmin::Railties
3
+ module Render
4
+ def upmin_render(model_or_node, options = {})
5
+ if model_or_node.is_a?(::ActiveRecord::Base)
6
+ upmin_render_node(Upmin::Graph::ModelNode.new(model_or_node), options)
7
+
8
+ else # is a node
9
+ upmin_render_node(model_or_node, options)
10
+ end
11
+ end
12
+
13
+ def upmin_render_search_box(upmin_model, options = {})
14
+ partials = RenderHelpers.partials_for_search_box(upmin_model, options)
15
+
16
+ partials.each do |partial|
17
+ begin
18
+ return render(
19
+ partial: partial,
20
+ object: upmin_model, # this doesn't work with nil
21
+ locals: {
22
+ upmin_model: upmin_model,
23
+ options: options
24
+ }
25
+ )
26
+ rescue ActionView::MissingTemplate => e
27
+ end
28
+ end
29
+ raise "Failed to find a matching partial, even with fallback :unknown partials"
30
+ end
31
+
32
+
33
+
34
+ def upmin_render_node(node, options = {})
35
+ partials = RenderHelpers.partials_for(node, options)
36
+
37
+ # TODO(jon): Update this to use something like https://coderwall.com/p/ftbmsa instead of a rescue
38
+ partials.each do |partial|
39
+ puts "Trying #{partial}"
40
+ begin
41
+ return render(
42
+ partial: partial,
43
+ object: node.object, # this doesn't work with nil
44
+ locals: {
45
+ node: node,
46
+ options: options,
47
+ RenderHelpers.object_name(partial) => node.object
48
+ }
49
+ )
50
+ rescue ActionView::MissingTemplate => e
51
+ end
52
+ end
53
+ raise "Failed to find a matching partial, even with fallback :unknown partials"
54
+ end
55
+ end
56
+ end
@@ -0,0 +1,57 @@
1
+
2
+ module Upmin::Railties
3
+ module RenderHelpers
4
+ def RenderHelpers.partials_for(node, options)
5
+ partials = []
6
+ partials << options[:partial] if options[:partial]
7
+ partials << build_path(options[:as]) if options[:as]
8
+ partials << build_path(node.type)
9
+
10
+ if node.is_a?(Upmin::Graph::ModelNode)
11
+ partials << build_path("unknown#{node.type_suffix}")
12
+ elsif node.is_a?(Upmin::Graph::CollectionNode)
13
+ # TODO(jon): Maybe add in support for method_name later
14
+ if node.type != :unknown_collection
15
+ partials << build_path(:unknown_collection)
16
+ end
17
+ elsif node.is_a?(Upmin::Graph::DataNode)
18
+ # TODO(jon): Maybe add in support for method_name later
19
+ if node.type != :unknown
20
+ partials << build_path(:unknown)
21
+ end
22
+ else
23
+ # WTF? Add unknown as a backup, but this likely isn't even a node.
24
+ partials << build_path(:unknown)
25
+ end
26
+
27
+ return partials
28
+ end
29
+
30
+ def RenderHelpers.partials_for_search_box(upmin_model, options)
31
+ partials = []
32
+ partials << options[:partial] if options[:partial]
33
+ partials << build_search_box_path(options[:as]) if options[:as]
34
+ partials << build_search_box_path(upmin_model.partial_name)
35
+ partials << build_search_box_path(:unknown)
36
+ return partials
37
+ end
38
+
39
+ def RenderHelpers.build_path(partial)
40
+ return "upmin/types/#{partial}"
41
+ end
42
+
43
+
44
+ def RenderHelpers.build_search_box_path(partial)
45
+ return "upmin/search_boxes/#{partial}"
46
+ end
47
+
48
+ def RenderHelpers.object_name(partial)
49
+ if match = partial.match(/.*\/(.*)/)
50
+ return match.captures.first
51
+ else
52
+ raise "Unable to match object name for the partial #{partial}."
53
+ end
54
+ end
55
+
56
+ end
57
+ end
@@ -0,0 +1,3 @@
1
+ module Upmin
2
+ VERSION = "0.0.34"
3
+ end
@@ -0,0 +1,11 @@
1
+ require 'test_helper'
2
+
3
+ module Upmin
4
+ class ModelControllerTest < ActionController::TestCase
5
+ test "should get updated_since" do
6
+ get :updated_since
7
+ assert_response :success
8
+ end
9
+
10
+ end
11
+ end
@@ -0,0 +1,28 @@
1
+ == README
2
+
3
+ This README would normally document whatever steps are necessary to get the
4
+ application up and running.
5
+
6
+ Things you may want to cover:
7
+
8
+ * Ruby version
9
+
10
+ * System dependencies
11
+
12
+ * Configuration
13
+
14
+ * Database creation
15
+
16
+ * Database initialization
17
+
18
+ * How to run the test suite
19
+
20
+ * Services (job queues, cache servers, search engines, etc.)
21
+
22
+ * Deployment instructions
23
+
24
+ * ...
25
+
26
+
27
+ Please feel free to use a different markup language if you do not plan to run
28
+ <tt>rake doc:app</tt>.