spiderfw 0.6.23 → 0.6.24
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.
- data/CHANGELOG +10 -1
- data/README.rdoc +1 -1
- data/VERSION +1 -1
- data/apps/config_editor/_init.rb +1 -2
- data/apps/config_editor/controllers/config_editor_controller.rb +1 -7
- data/apps/core/admin/controllers/admin_controller.rb +1 -1
- data/apps/core/admin/public/css/sass/admin.css +35 -31
- data/apps/core/admin/public/sass/admin.scss +6 -1
- data/apps/core/components/widgets/crud/crud.shtml +2 -2
- data/apps/core/components/widgets/table/table.rb +5 -5
- data/apps/core/forms/tags/element_row.erb +15 -10
- data/apps/core/forms/widgets/form/form.rb +35 -22
- data/apps/core/forms/widgets/inputs/checkbox/checkbox.shtml +2 -2
- data/apps/core/forms/widgets/inputs/date_time/date_time.shtml +2 -2
- data/apps/core/forms/widgets/inputs/file_input/file_input.shtml +2 -2
- data/apps/core/forms/widgets/inputs/html_area/html_area.shtml +2 -2
- data/apps/core/forms/widgets/inputs/input/input.shtml +2 -2
- data/apps/core/forms/widgets/inputs/password/password.shtml +2 -2
- data/apps/core/forms/widgets/inputs/search_select/search_select.shtml +1 -1
- data/apps/core/forms/widgets/inputs/select/select.shtml +2 -2
- data/apps/core/forms/widgets/inputs/text/text.shtml +2 -2
- data/apps/core/forms/widgets/inputs/text_area/text_area.shtml +2 -2
- data/apps/core/forms/widgets/inputs/time_span/time_span.shtml +1 -1
- data/blueprints/home/config.ru +8 -0
- data/lib/spiderfw/app.rb +416 -224
- data/lib/spiderfw/cmd/commands/app.rb +243 -239
- data/lib/spiderfw/cmd/commands/cert.rb +421 -417
- data/lib/spiderfw/cmd/commands/config.rb +85 -82
- data/lib/spiderfw/cmd/commands/console.rb +64 -40
- data/lib/spiderfw/cmd/commands/content.rb +29 -25
- data/lib/spiderfw/cmd/commands/create.rb +58 -54
- data/lib/spiderfw/cmd/commands/model.rb +118 -114
- data/lib/spiderfw/cmd/commands/setup.rb +55 -51
- data/lib/spiderfw/cmd/commands/test.rb +63 -59
- data/lib/spiderfw/cmd/commands/webserver.rb +56 -51
- data/lib/spiderfw/config/options/spider.rb +4 -3
- data/lib/spiderfw/controller/controller.rb +2 -0
- data/lib/spiderfw/controller/http_controller.rb +1 -2
- data/lib/spiderfw/controller/mixins/static_content.rb +3 -3
- data/lib/spiderfw/controller/mixins/visual.rb +30 -15
- data/lib/spiderfw/controller/response.rb +84 -0
- data/lib/spiderfw/controller/session/file_session.rb +2 -2
- data/lib/spiderfw/http/adapters/rack.rb +12 -13
- data/lib/spiderfw/http/server.rb +80 -46
- data/lib/spiderfw/i18n/cldr.rb +6 -9
- data/lib/spiderfw/model/base_model.rb +103 -23
- data/lib/spiderfw/model/condition.rb +110 -25
- data/lib/spiderfw/model/mappers/db_mapper.rb +14 -6
- data/lib/spiderfw/model/mappers/mapper.rb +440 -197
- data/lib/spiderfw/model/model.rb +105 -21
- data/lib/spiderfw/model/model_hash.rb +9 -1
- data/lib/spiderfw/model/query.rb +50 -9
- data/lib/spiderfw/model/query_set.rb +211 -44
- data/lib/spiderfw/model/request.rb +28 -21
- data/lib/spiderfw/model/storage/base_storage.rb +125 -10
- data/lib/spiderfw/model/storage/db/db_storage.rb +7 -4
- data/lib/spiderfw/model/storage.rb +8 -1
- data/lib/spiderfw/setup/spider_setup_wizard.rb +9 -7
- data/lib/spiderfw/spider.rb +270 -43
- data/lib/spiderfw/templates/layout.rb +9 -4
- data/lib/spiderfw/templates/resources/sass.rb +3 -2
- data/lib/spiderfw/templates/template.rb +1 -0
- data/lib/spiderfw/utils/annotations.rb +3 -1
- data/lib/spiderfw/utils/logger.rb +1 -1
- data/lib/spiderfw/utils/monkey/symbol.rb +4 -2
- data/lib/spiderfw/utils/shared_store/file_shared_store.rb +2 -2
- data/lib/spiderfw/utils/thread_out.rb +3 -1
- data/public/css/error_page.css +83 -0
- data/public/js/error_page.js +5 -0
- data/spider.gemspec +4 -1
- data/templates/email/error.erb +9 -0
- metadata +28 -12
- data/apps/config_editor/widgets/edit_bool/edit_bool.rb +0 -8
- data/apps/config_editor/widgets/edit_bool/edit_bool.shtml +0 -5
@@ -6,6 +6,7 @@ require 'iconv'
|
|
6
6
|
|
7
7
|
module Spider; module Model
|
8
8
|
|
9
|
+
# @abtract
|
9
10
|
# The main class for interacting with data.
|
10
11
|
# When not dealing with legacy storages, subclasses should use Managed instead, which provides an id and
|
11
12
|
# other conveniences.
|
@@ -50,8 +51,6 @@ module Spider; module Model
|
|
50
51
|
# => 2
|
51
52
|
# p salmon_lovers[0].name
|
52
53
|
# => 'Cat'
|
53
|
-
|
54
|
-
|
55
54
|
class BaseModel
|
56
55
|
include Spider::Logger
|
57
56
|
include DataTypes
|
@@ -60,40 +59,61 @@ module Spider; module Model
|
|
60
59
|
# include StateMachine
|
61
60
|
|
62
61
|
# The BaseModel class itself. Used when dealing with proxy objects.
|
62
|
+
# @return [Class<BaseModel]
|
63
63
|
attr_reader :model
|
64
64
|
# An Hash of loaded elements
|
65
|
+
# @return [Hash]
|
65
66
|
attr_reader :loaded_elements
|
67
|
+
# @private
|
66
68
|
# Model instance or QuerySet containing the object
|
69
|
+
# @return [BaseModel|QuerySet]
|
67
70
|
attr_accessor :_parent
|
71
|
+
# @private
|
68
72
|
# If _parent is a model instance, which element points to this one
|
73
|
+
# @return [Symbol]
|
69
74
|
attr_accessor :_parent_element
|
70
|
-
#
|
75
|
+
# @private
|
76
|
+
# If true, forces the mapper to check for existance of the object in the storage
|
77
|
+
# @return [bool]
|
71
78
|
attr_accessor :_check_if_saved
|
72
79
|
|
80
|
+
# @private
|
73
81
|
# If this object is used as a superclass in class_table_inheritance, points to the current subclass
|
82
|
+
# @return [Class<BaseModel]
|
74
83
|
attr_accessor :_subclass_object
|
84
|
+
# @private
|
75
85
|
# This object won't be put into the identity mapper
|
86
|
+
# @return [bool]
|
76
87
|
attr_accessor :_no_identity_mapper
|
88
|
+
# @private
|
77
89
|
# Elements that were modified since a load or a save (note: this only keeps track of changed references on the object;
|
78
90
|
# it doesn't consider if a associated object or QuerySet has changed. Use element_modified? to get that information)
|
91
|
+
# @return [Array]
|
79
92
|
attr_reader :_modified_elements
|
80
93
|
|
81
94
|
class <<self
|
82
95
|
# An Hash of model attributes. They can be used freely.
|
96
|
+
# @return [Hash]
|
83
97
|
attr_reader :attributes
|
84
98
|
# An array of element names, in definition order.
|
99
|
+
# @return [Array]
|
85
100
|
attr_reader :elements_order
|
86
101
|
# An Hash of integrated models => corresponding integrated element name.
|
102
|
+
# @return [Hash]
|
87
103
|
attr_reader :integrated_models
|
88
104
|
# An Hash of polymorphic models => polymorphic params
|
105
|
+
# @return [Hash]
|
89
106
|
attr_reader :polymorphic_models
|
90
107
|
# An Array of named sequences.
|
108
|
+
# @return [Array]
|
91
109
|
attr_reader :sequences
|
92
110
|
end
|
93
111
|
|
94
112
|
|
95
113
|
|
96
114
|
# Copies this class' elements to the subclass.
|
115
|
+
# @param [Class<BaseModel] self
|
116
|
+
# @return [void]
|
97
117
|
def self.inherited(subclass) #:nodoc:
|
98
118
|
# FIXME: might need to clone every element
|
99
119
|
@subclasses ||= []
|
@@ -112,11 +132,14 @@ module Spider; module Model
|
|
112
132
|
super
|
113
133
|
end
|
114
134
|
|
135
|
+
# All known subclasses of this model
|
136
|
+
# @return [Array]
|
115
137
|
def self.subclasses
|
116
138
|
@subclasses || []
|
117
139
|
end
|
118
140
|
|
119
141
|
# Returns the parent Spider::App of the module
|
142
|
+
# @return [Spider::App]
|
120
143
|
def self.app
|
121
144
|
return @app if @app
|
122
145
|
app = self
|
@@ -197,6 +220,11 @@ module Spider; module Model
|
|
197
220
|
#
|
198
221
|
# Other attributes may be used by DataTypes (see #DataType::ClassMethods.take_attributes), and other code.
|
199
222
|
# See also Element.
|
223
|
+
# @yield If a block is given, will be called in the context of the junction model
|
224
|
+
# @param [Symbol] name
|
225
|
+
# @param [Class] type
|
226
|
+
# @param [Hash] attributes
|
227
|
+
# @return [Element]
|
200
228
|
def self.element(name, type, attributes={}, &proc)
|
201
229
|
name = name.to_sym
|
202
230
|
@elements ||= {}
|
@@ -404,6 +432,10 @@ module Spider; module Model
|
|
404
432
|
end
|
405
433
|
|
406
434
|
|
435
|
+
# @private
|
436
|
+
# Helper method that defines getter and setter for an element
|
437
|
+
# @param [Symbol] name Element name
|
438
|
+
# @return [void]
|
407
439
|
def self.define_element_methods(name)
|
408
440
|
ivar = :"@#{ name }"
|
409
441
|
|
@@ -524,10 +556,13 @@ module Spider; module Model
|
|
524
556
|
end
|
525
557
|
end
|
526
558
|
val
|
527
|
-
#extend_element(name)
|
528
559
|
end
|
529
560
|
end
|
530
561
|
|
562
|
+
# @private
|
563
|
+
# Helper method that registers an element with the model
|
564
|
+
# @param [Element] element
|
565
|
+
# @return [void]
|
531
566
|
def self.add_element(el)
|
532
567
|
@elements ||= {}
|
533
568
|
@elements[el.name] = el
|
@@ -546,6 +581,8 @@ module Spider; module Model
|
|
546
581
|
|
547
582
|
|
548
583
|
# Removes a defined element
|
584
|
+
# @param [Symbol|Element] element
|
585
|
+
# @return nil
|
549
586
|
def self.remove_element(el)
|
550
587
|
return unless @elements
|
551
588
|
el = el.name if el.is_a?(Element)
|
@@ -571,6 +608,9 @@ module Spider; module Model
|
|
571
608
|
# end
|
572
609
|
end
|
573
610
|
|
611
|
+
# @private
|
612
|
+
# Called when an element is defined
|
613
|
+
# @return [void]
|
574
614
|
def self.element_defined(el)
|
575
615
|
if (@on_element_defined && @on_element_defined[el.name])
|
576
616
|
@on_element_defined[el.name].each do |proc|
|
@@ -579,6 +619,11 @@ module Spider; module Model
|
|
579
619
|
end
|
580
620
|
end
|
581
621
|
|
622
|
+
# Registers a block that will be called whenever an element is defined.
|
623
|
+
#
|
624
|
+
# The block will be called with the created element as an argument.
|
625
|
+
# @param [Symbol] element_name
|
626
|
+
# @param [Proc] proc A block to execute
|
582
627
|
def self.on_element_defined(el_name, &proc)
|
583
628
|
@on_element_defined ||= {}
|
584
629
|
@on_element_defined[el_name] ||= []
|
@@ -599,6 +644,14 @@ module Spider; module Model
|
|
599
644
|
# end
|
600
645
|
# p = Person.new(...)
|
601
646
|
# p.street == p.address.street
|
647
|
+
# @param [Symbol] element_name
|
648
|
+
# @param [Hash] params Params can be:
|
649
|
+
# * :except Excludes some elements of the integrated model
|
650
|
+
# * :overwrite Allows overwriting this model's elements with the integrated model's ones.
|
651
|
+
# * :keep_pks Integrate the model's primary keys as well
|
652
|
+
# * :hidden Set the :hidden attribute on integrated elements
|
653
|
+
# * :mapping An Hash of new names to assign to integrated elements
|
654
|
+
# @return [void]
|
602
655
|
def self.integrate(element_name, params={})
|
603
656
|
params ||= {}
|
604
657
|
elements[element_name].attributes[:integrated_model] = true
|
@@ -616,11 +669,18 @@ module Spider; module Model
|
|
616
669
|
model.attributes[:integrated_from_elements] << [self, element_name]
|
617
670
|
end
|
618
671
|
|
672
|
+
# @private
|
673
|
+
# Integrates a single element from a model.
|
674
|
+
# See {BaseModel.integrate}
|
675
|
+
# @param [Symbol] element_name
|
676
|
+
# @param [Symbol] element_element The element inside the element's model to integrate
|
677
|
+
# @param [Hash] params See {BaseModel.integrate}
|
678
|
+
# @return [void]
|
619
679
|
def self.integrate_element(element_name, element_element, params={})
|
620
680
|
el = element_element
|
621
681
|
el = self.elements[element_name].model.elements[el] if el.is_a?(Symbol)
|
622
682
|
integrated_attributes = {}
|
623
|
-
integrated_attributes[:primary_key] = false if params[:no_pks]
|
683
|
+
integrated_attributes[:primary_key] = false if params[:no_pks] # deprecated
|
624
684
|
integrated_attributes[:hidden] = params[:hidden] unless (params[:hidden].nil?)
|
625
685
|
|
626
686
|
integrated_attributes[:primary_key] = false unless (params[:keep_pks])
|
@@ -634,6 +694,10 @@ module Spider; module Model
|
|
634
694
|
define_element_methods(name)
|
635
695
|
end
|
636
696
|
|
697
|
+
# Undoes an integration
|
698
|
+
# See {BaseModel.integrate}
|
699
|
+
# @param [Symbol|Element] element
|
700
|
+
# @return [void]
|
637
701
|
def self.remove_integrate(element_name)
|
638
702
|
element = element_name.is_a?(Element) ? element_name : self.elements[element_name]
|
639
703
|
model = element.model
|
@@ -645,8 +709,12 @@ module Spider; module Model
|
|
645
709
|
|
646
710
|
# Sets additional attributes on the element
|
647
711
|
#
|
648
|
-
#
|
712
|
+
# **Warning:** for attributes which are parsed by the BaseModel during element definition,
|
649
713
|
# this will not have the desired effect; remove and redefine the element instead.
|
714
|
+
#
|
715
|
+
# @param [Symbol] element_name
|
716
|
+
# @param [Hash] attributes Attributes to set
|
717
|
+
# @return [void]
|
650
718
|
def self.element_attributes(element_name, attributes)
|
651
719
|
elements[element_name].attributes = elements[element_name].attributes.merge(attributes)
|
652
720
|
if attributes[:primary_key] && !@primary_keys.include?(elements[element_name])
|
@@ -658,6 +726,12 @@ module Spider; module Model
|
|
658
726
|
|
659
727
|
# Defines a multiple element. Equivalent to calling
|
660
728
|
# element(name, type, :multiple => true, :association => :many, ...)
|
729
|
+
# See also {BaseModel.element}.
|
730
|
+
# @param [Symbol] name
|
731
|
+
# @param [Class] type
|
732
|
+
# @param [Hash] attributes
|
733
|
+
# @param [Proc] proc
|
734
|
+
# @return [Element]
|
661
735
|
def self.many(name, type, attributes={}, &proc)
|
662
736
|
attributes[:multiple] = true
|
663
737
|
attributes[:association] ||= :many
|
@@ -665,7 +739,12 @@ module Spider; module Model
|
|
665
739
|
end
|
666
740
|
|
667
741
|
# Defines an element with choice association. Shorthand for
|
668
|
-
# element(name, type, :association => :choice, ...)
|
742
|
+
# element(name, type, :association => :choice, ...)
|
743
|
+
# @param [Symbol] name
|
744
|
+
# @param [Class] type
|
745
|
+
# @param [Hash] attributes
|
746
|
+
# @param [Proc] proc
|
747
|
+
# @return [Element]
|
669
748
|
def self.choice(name, type, attributes={}, &proc)
|
670
749
|
attributes[:association] = :choice
|
671
750
|
element(name, type, attributes, &proc)
|
@@ -678,6 +757,10 @@ module Spider; module Model
|
|
678
757
|
many(name, type, attributes, &proc)
|
679
758
|
end
|
680
759
|
|
760
|
+
# Defines an element which returns a query on another one.
|
761
|
+
# @param [Symbol] name Name of the new element
|
762
|
+
# @param [Sybmol] element_name Name of the element to run the query on
|
763
|
+
# @param [Hash] attributes Attributes for the new elements. Must have a :condition attribute.
|
681
764
|
def self.element_query(name, element_name, attributes={})
|
682
765
|
orig_element = self.elements[element_name]
|
683
766
|
set_el_query = lambda do
|
@@ -704,15 +787,12 @@ module Spider; module Model
|
|
704
787
|
end
|
705
788
|
|
706
789
|
|
707
|
-
#
|
708
|
-
#
|
709
|
-
#
|
710
|
-
|
711
|
-
|
712
|
-
|
713
|
-
|
714
|
-
# Creates an inline model
|
715
|
-
def self.create_inline_model(name, hash, attributes={}) #:nodoc:
|
790
|
+
# @private
|
791
|
+
# Creates an element with an {InlineModel} as type.
|
792
|
+
# @param [Symbol] name Element name
|
793
|
+
# @param [Hash] hash The hash to create the inline model from
|
794
|
+
# @param [Hash] attributes Attributes for the new element
|
795
|
+
def self.create_inline_model(name, hash, attributes={})
|
716
796
|
model = self.const_set(Spider::Inflector.camelize(name), Class.new(InlineModel))
|
717
797
|
model.instance_eval do
|
718
798
|
if attributes[:inline_model]
|
@@ -737,11 +817,13 @@ module Spider; module Model
|
|
737
817
|
end
|
738
818
|
|
739
819
|
# An array of other models this class points to.
|
820
|
+
# @return [Array] An array of models which are referenced by this one's elements.
|
740
821
|
def self.submodels
|
741
822
|
elements.select{ |name, el| el.model? }.map{ |name, el| el.model }
|
742
823
|
end
|
743
824
|
|
744
825
|
|
826
|
+
# @return [void]
|
745
827
|
def self.extend_model(model, params={}) #:nodoc:
|
746
828
|
if (model == superclass) # first undo table per class inheritance
|
747
829
|
@elements = {}
|
@@ -778,10 +860,11 @@ module Spider; module Model
|
|
778
860
|
end
|
779
861
|
|
780
862
|
# Externalizes the superclass elements making the superclass an external integrated element.
|
781
|
-
# Parameters may be:
|
782
|
-
#
|
783
|
-
#
|
784
|
-
#
|
863
|
+
# @param [Hash] params Parameters may be:
|
864
|
+
# * :name (symbol) name of the created element
|
865
|
+
# * :delete_cascade (bool) delete cascade the superclass instance. True by default.
|
866
|
+
# * :no_local_pk (bool) do not define an id for this class
|
867
|
+
# @return [void]
|
785
868
|
def self.class_table_inheritance(params={})
|
786
869
|
self.extend_model(superclass, params)
|
787
870
|
end
|
@@ -1872,9 +1955,6 @@ module Spider; module Model
|
|
1872
1955
|
val = instance_variable_get("@#{el_name}")
|
1873
1956
|
val.modified = false if val.is_a?(QuerySet)
|
1874
1957
|
end
|
1875
|
-
self.class.elements_array.select{ |el| el.attributes[:integrated_model] && self.element_has_value?(el) }.each do |el|
|
1876
|
-
self.get(el).reset_modified_elements(*elements)
|
1877
|
-
end
|
1878
1958
|
|
1879
1959
|
nil
|
1880
1960
|
end
|