push_type_core 0.5.0.alpha.2 → 0.5.0.alpha.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (45) hide show
  1. checksums.yaml +4 -4
  2. data/app/fields/push_type/asset_field.rb +5 -16
  3. data/app/fields/push_type/date_field.rb +2 -9
  4. data/app/fields/push_type/markdown_field.rb +4 -12
  5. data/app/fields/push_type/matrix_field.rb +11 -11
  6. data/app/fields/push_type/node_field.rb +22 -0
  7. data/app/fields/push_type/number_field.rb +3 -9
  8. data/app/fields/push_type/repeater_field.rb +7 -9
  9. data/app/fields/push_type/select_field.rb +7 -10
  10. data/app/fields/push_type/tag_list_field.rb +5 -11
  11. data/app/fields/push_type/taxonomy_field.rb +6 -47
  12. data/app/fields/push_type/text_field.rb +3 -3
  13. data/app/fields/push_type/time_field.rb +2 -9
  14. data/app/models/concerns/push_type/customizable.rb +8 -8
  15. data/db/migrate/20150531183944_add_field_store_default_values.rb +6 -0
  16. data/lib/generators/push_type/field/templates/field.rb +1 -1
  17. data/lib/push_type/field_type.rb +9 -53
  18. data/lib/push_type/fields/arrays.rb +23 -0
  19. data/lib/push_type/fields/base.rb +65 -0
  20. data/lib/push_type/fields/class_methods.rb +21 -0
  21. data/lib/push_type/fields/relations.rb +39 -0
  22. data/lib/push_type/fields/ui.rb +16 -0
  23. data/lib/push_type/version.rb +1 -1
  24. data/test/dummy/config/initializers/push_type.rb +1 -1
  25. data/test/dummy/config/secrets.yml +2 -2
  26. data/test/dummy/db/migrate/20150601132822_add_field_store_default_values.push_type.rb +7 -0
  27. data/test/dummy/db/schema.rb +7 -7
  28. data/test/dummy/log/test.log +2390 -2383
  29. data/test/dummy/tmp/cache/assets/test/sprockets/v3.0/-Sjd8yE8radAZWLZz1Hn9eTc5vPZke6_-U1eg-KNjy8.cache +0 -0
  30. data/test/dummy/tmp/cache/assets/test/sprockets/v3.0/RwmiAHIoiRN917L4TQ8saQaj1DsQgMpS97RYvkK2D5M.cache +0 -0
  31. data/test/dummy/tmp/generators/app/models/category.rb +6 -0
  32. data/test/dummy/tmp/generators/app/views/taxonomies/category.html.erb +3 -0
  33. data/test/lib/push_type/field_type_test.rb +0 -8
  34. data/test/models/concerns/push_type/customizable_test.rb +1 -1
  35. metadata +31 -21
  36. data/app/fields/push_type/array_field.rb +0 -15
  37. data/test/dummy/tmp/generators/app/presenters/page_presenter.rb +0 -12
  38. /data/test/dummy/db/migrate/{20150429164551_create_push_type_users.push_type.rb → 20150601132816_create_push_type_users.push_type.rb} +0 -0
  39. /data/test/dummy/db/migrate/{20150429164552_create_push_type_nodes.push_type.rb → 20150601132817_create_push_type_nodes.push_type.rb} +0 -0
  40. /data/test/dummy/db/migrate/{20150429164553_create_push_type_node_hierarchies.push_type.rb → 20150601132818_create_push_type_node_hierarchies.push_type.rb} +0 -0
  41. /data/test/dummy/db/migrate/{20150429164554_create_push_type_assets.push_type.rb → 20150601132819_create_push_type_assets.push_type.rb} +0 -0
  42. /data/test/dummy/db/migrate/{20150429164555_create_push_type_taxonomies.push_type.rb → 20150601132820_create_push_type_taxonomies.push_type.rb} +0 -0
  43. /data/test/dummy/db/migrate/{20150429164556_create_push_type_taxonomy_hierarchies.push_type.rb → 20150601132821_create_push_type_taxonomy_hierarchies.push_type.rb} +0 -0
  44. /data/test/dummy/tmp/cache/assets/test/sprockets/v3.0/{BL-JC9Mha5EbAlzAR0-4qZvqO8u_54SF5Z2ZaoDjlfw.cache → H_FtcM4uZms6K7jOADXRW2-Q5luNbbboPJ8haQyA17A.cache} +0 -0
  45. /data/test/dummy/tmp/cache/assets/test/sprockets/v3.0/{OC9Pezno0-bFKhuLASN_oxeMelP7hAYHfMDOdC916tY.cache → khjpnuHaHw24GnTbWlsRS6uIuTqIkrfvc2dY1aZWtpk.cache} +0 -0
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 8ccc2d89b2a7564b64c4162a769cbc709729962b
4
- data.tar.gz: 6d9442afef9ed0a0db080fd9cadbf30344a2a564
3
+ metadata.gz: b12033b0e730c01d39ed6a7d667dcb0009418897
4
+ data.tar.gz: 09ef26e24eff460828285fdeef96107b39a1b160
5
5
  SHA512:
6
- metadata.gz: a1ffa5d3b0f954aad8295d8ce1b940e1348ce3ce2c6beb47499d0adb897327494a7fbb30d4a4a83992ed5f4327b8ddbc930d438fc145f72558d26b07cea02acf
7
- data.tar.gz: d6584a69f40548a537488fbc6986ff1aeeb99c0a9548fd3aa5c281b3128ec62032a57ea0daf09660bd7fdf4e867222df67f5b33c1bf1e1c8a86882e7f27ad63c
6
+ metadata.gz: 73d086627daf27c656e4b655cb76f5bf7c4d7183052d749db2f014c332762c6724e43ff4b4f22ad515c3b8af3d40b888a40dce7735e406220097c2ba672cd65e
7
+ data.tar.gz: 53e698227a5f563102d8478bfbcb20a7514f1b355df91cfd0f93531a850de316dd4f8c6d2e1b12fb3900587df201ae4e33e61cebe4685d75b3f34a8cdb6ea6a4
@@ -1,32 +1,21 @@
1
1
  module PushType
2
2
  class AssetField < PushType::FieldType
3
3
 
4
- def template
5
- @opts[:template] || 'asset'
6
- end
4
+ include PushType::Fields::Relations
5
+
6
+ options template: 'asset'
7
7
 
8
8
  def id_attr
9
9
  "#{ name }-asset-modal"
10
10
  end
11
11
 
12
- def from_json(val)
13
- return if val.blank?
14
- PushType::Asset.find(val)
15
- end
16
-
17
12
  initialized_on_node do |object, field|
18
13
  object.class_eval do
19
-
20
- define_method field.relation_id_method do
21
- field_store[field.name]
14
+ define_method field.name.to_sym do
15
+ PushType::Asset.find send(field.json_key) if send(field.json_key).present?
22
16
  end
23
-
24
17
  end
25
18
  end
26
19
 
27
- def relation_id_method
28
- (name + '_id').to_sym
29
- end
30
-
31
20
  end
32
21
  end
@@ -1,17 +1,10 @@
1
1
  module PushType
2
2
  class DateField < PushType::FieldType
3
3
 
4
- def template
5
- @opts[:template] || 'date'
6
- end
7
-
8
- def form_helper
9
- @opts[:form_helper] || :date_field
10
- end
4
+ options template: 'date', form_helper: :date_field
11
5
 
12
6
  def from_json(val)
13
- return if val.blank?
14
- val.to_date
7
+ val.to_date if val.present?
15
8
  end
16
9
 
17
10
  end
@@ -3,7 +3,7 @@ require 'redcarpet'
3
3
  module PushType
4
4
  class MarkdownField < PushType::FieldType
5
5
 
6
- DEFAULT_EXTENSIONS = {
6
+ options form_helper: :text_area, renderer: Redcarpet::Render::HTML, render_options: {}, extensions: {
7
7
  autolink: true,
8
8
  fenced_code_blocks: true,
9
9
  no_intra_emphasis: true,
@@ -18,26 +18,18 @@ module PushType
18
18
  end
19
19
 
20
20
  def markdown
21
- @markdown ||= Redcarpet::Markdown.new(renderer, extensions)
21
+ @markdown ||= Redcarpet::Markdown.new(renderer, @opts[:extensions])
22
22
  end
23
23
 
24
24
  def renderer
25
- ( @opts[:renderer] || Redcarpet::Render::HTML ).new render_options
26
- end
27
-
28
- def render_options
29
- @opts[:render_options] || {}
30
- end
31
-
32
- def extensions
33
- DEFAULT_EXTENSIONS.merge(@opts[:extensions] || {})
25
+ @opts[:renderer].new @opts[:render_options]
34
26
  end
35
27
 
36
28
  initialized_on_node do |object, field|
37
29
  object.presenter_class.class_eval do
38
30
 
39
31
  define_method field.name.to_sym do
40
- fields[field.name.to_sym].markdown.render super()
32
+ fields[field.json_key].markdown.render super()
41
33
  end
42
34
 
43
35
  end
@@ -1,20 +1,24 @@
1
1
  module PushType
2
- class MatrixField < ArrayField
2
+ class MatrixField < PushType::FieldType
3
+
4
+ include PushType::Fields::Arrays
5
+
6
+ options template: :matrix, mapping: [:key, :value]
3
7
 
4
8
  def param
5
- { name.to_sym => mapping.keys }
6
- end
7
-
8
- def template
9
- @opts[:template] || :matrix
9
+ { json_key => mapping.keys }
10
10
  end
11
11
 
12
12
  def mapping
13
- @mapping ||= (@opts[:mapping] || []).reduce({}) do |h, col|
13
+ @mapping ||= @opts[:mapping].reduce({}) do |h, col|
14
14
  col.is_a?(Hash) ? h.merge(col) : h.update(col => form_helper)
15
15
  end
16
16
  end
17
17
 
18
+ def struct
19
+ @struct ||= Struct.new *mapping.keys
20
+ end
21
+
18
22
  def to_json(val)
19
23
  return if val.blank?
20
24
  super.reject { |v| v.blank? or v.values.all?(&:blank?) }
@@ -25,9 +29,5 @@ module PushType
25
29
  super.reject { |v| v.blank? or v.values.all?(&:blank?) }.map { |h| struct.new(*h.values) }
26
30
  end
27
31
 
28
- def struct
29
- @struct ||= Struct.new *mapping.keys
30
- end
31
-
32
32
  end
33
33
  end
@@ -0,0 +1,22 @@
1
+ module PushType
2
+ class NodeField < SelectField
3
+
4
+ include PushType::Fields::Relations
5
+
6
+ options template: 'relation', field_options: {}, root: '/'
7
+
8
+ def relation_root
9
+ root = @opts[:root] == '/' ? PushType::Node : PushType::Node.find_by_path(@opts[:root].split('/'))
10
+ root or raise "Cannot find root node at path '#{ @opts[:root] }'"
11
+ end
12
+
13
+ initialized_on_node do |object, field|
14
+ object.class_eval do
15
+ define_method field.name.to_sym do
16
+ field.relation_class.find send(field.json_key) if send(field.json_key).present?
17
+ end
18
+ end
19
+ end
20
+
21
+ end
22
+ end
@@ -1,17 +1,11 @@
1
1
  module PushType
2
2
  class NumberField < PushType::FieldType
3
- def form_helper
4
- @opts[:form_helper] || :number_field
5
- end
3
+
4
+ options form_helper: :number_field
6
5
 
7
6
  def to_json(val)
8
- return if val.blank?
9
- val.to_i
7
+ val.to_i if val.present?
10
8
  end
11
9
 
12
- def from_json(val)
13
- return if val.blank?
14
- val.to_i
15
- end
16
10
  end
17
11
  end
@@ -1,18 +1,16 @@
1
1
  module PushType
2
- class RepeaterField < ArrayField
3
-
4
- def template
5
- @opts[:template] || :repeater
6
- end
2
+ class RepeaterField < FieldType
3
+
4
+ include PushType::Fields::Arrays
5
+
6
+ options template: :repeater
7
7
 
8
8
  def to_json(val)
9
- return if val.blank?
10
- super.reject(&:blank?)
9
+ super.reject(&:blank?) if val.present?
11
10
  end
12
11
 
13
12
  def from_json(val)
14
- return if val.blank?
15
- super.reject(&:blank?)
13
+ super.reject(&:blank?) if val.present?
16
14
  end
17
15
 
18
16
  end
@@ -1,16 +1,17 @@
1
1
  module PushType
2
2
  class SelectField < PushType::FieldType
3
3
 
4
- def param
5
- multiple? ? { name.to_sym => [] } : super
4
+ options template: 'select', choices: [], field_options: { include_blank: 'Please select...' }, multiple: false
5
+
6
+ def multiple?
7
+ @opts[:multiple]
6
8
  end
7
9
 
8
- def template
9
- @opts[:template] || 'select'
10
+ def param
11
+ multiple? ? { json_key => [] } : super
10
12
  end
11
13
 
12
14
  def choices
13
- return [] unless @opts[:choices]
14
15
  if @opts[:choices].respond_to? :call
15
16
  @opts[:choices].call
16
17
  else
@@ -19,7 +20,7 @@ module PushType
19
20
  end
20
21
 
21
22
  def field_options
22
- { include_blank: 'Please select...' }.merge(@opts[:field_options] || {})
23
+ @opts[:field_options]
23
24
  end
24
25
 
25
26
  def html_options
@@ -36,9 +37,5 @@ module PushType
36
37
  multiple? ? Array(val).reject(&:blank?) : super
37
38
  end
38
39
 
39
- def multiple?
40
- @opts[:multiple] || false
41
- end
42
-
43
40
  end
44
41
  end
@@ -1,24 +1,18 @@
1
1
  require 'push_type/tag_list_query'
2
2
 
3
3
  module PushType
4
- class TagListField < ArrayField
4
+ class TagListField < PushType::FieldType
5
5
 
6
- def template
7
- @opts[:template] || 'tag_list'
8
- end
6
+ include PushType::Fields::Arrays
9
7
 
10
- def html_options
11
- { multiple: true, placeholder: 'Tags...' }.merge(super)
12
- end
8
+ options template: 'tag_list', html_options: { multiple: true, placeholder: 'Tags...' }
13
9
 
14
10
  def to_json(val)
15
- return if val.blank?
16
- super.reject(&:blank?)
11
+ super.reject(&:blank?) if val.present?
17
12
  end
18
13
 
19
14
  def from_json(val)
20
- return if val.blank?
21
- super.reject(&:blank?)
15
+ super.reject(&:blank?) if val.present?
22
16
  end
23
17
 
24
18
  initialized_on_node do |object, field|
@@ -1,62 +1,21 @@
1
1
  module PushType
2
2
  class TaxonomyField < SelectField
3
3
 
4
- def template
5
- @opts[:template] || 'taxonomy'
6
- end
4
+ include PushType::Fields::Relations
7
5
 
8
- def choices
9
- []
10
- end
6
+ options template: 'relation', field_options: {}
11
7
 
12
- def from_json(val)
13
- return if val.blank?
14
- ids = multiple? ? Array(val).reject(&:blank?) : super
15
- taxonomy_class.find(ids)
8
+ def relation_option
9
+ @opts[:taxonomy_class]
16
10
  end
17
11
 
18
12
  initialized_on_node do |object, field|
19
13
  object.class_eval do
20
-
21
- define_method field.relation_id_method do
22
- field_store[field.name]
14
+ define_method field.name.to_sym do
15
+ field.relation_class.find send(field.json_key) if send(field.json_key).present?
23
16
  end
24
-
25
17
  end
26
18
  end
27
19
 
28
- def singular_name
29
- multiple? ? name.singularize : name
30
- end
31
-
32
- def taxonomy_class
33
- (@opts[:taxonomy_class] || singular_name).to_s.classify.constantize
34
- end
35
-
36
- def taxonomy_tree_to_json
37
- flatten_tree taxonomy_class.hash_tree
38
- end
39
-
40
- def relation_id_method
41
- suffix = multiple? ? '_ids' : '_id'
42
- (singular_name + suffix).to_sym
43
- end
44
-
45
- private
46
-
47
- def flatten_tree(hash_tree, d = 0)
48
- hash_tree.flat_map do |parent, children|
49
- [
50
- {
51
- value: parent.id,
52
- text: parent.title,
53
- depth: d
54
- },
55
- flatten_tree(children, d+1)
56
- ]
57
- end.flatten
58
- end
59
-
60
-
61
20
  end
62
21
  end
@@ -1,7 +1,7 @@
1
1
  module PushType
2
2
  class TextField < PushType::FieldType
3
- def form_helper
4
- @opts[:form_helper] || :text_area
5
- end
3
+
4
+ options form_helper: :text_area
5
+
6
6
  end
7
7
  end
@@ -1,17 +1,10 @@
1
1
  module PushType
2
2
  class TimeField < PushType::FieldType
3
3
 
4
- def template
5
- @opts[:template] || 'date'
6
- end
7
-
8
- def form_helper
9
- @opts[:form_helper] || :time_field
10
- end
4
+ options template: 'date', form_helper: :time_field
11
5
 
12
6
  def from_json(val)
13
- return if val.blank?
14
- val.to_time
7
+ val.to_time if val.present?
15
8
  end
16
9
 
17
10
  end
@@ -26,15 +26,15 @@ module PushType
26
26
  else [ :string, {} ]
27
27
  end
28
28
 
29
- fields[name] = field_factory(kind).new(name, opts)
30
- store_accessor :field_store, name
29
+ _field = fields[name] = field_factory(kind).new(name, opts)
30
+ store_accessor :field_store, _field.json_key
31
31
 
32
- validates name, opts[:validates] if opts[:validates]
32
+ validates _field.json_key, opts[:validates] if opts[:validates]
33
33
 
34
- override_accessor fields[name]
34
+ override_accessor _field
35
35
 
36
- if block = field_factory(kind).initialized_blk
37
- block.call(self, fields[name])
36
+ if block = _field.class.initialized_blk
37
+ block.call(self, _field)
38
38
  end
39
39
  end
40
40
 
@@ -49,10 +49,10 @@ module PushType
49
49
  end
50
50
 
51
51
  def override_accessor(f)
52
- define_method "#{f.name}=".to_sym do |val|
52
+ define_method "#{ f.json_key }=".to_sym do |val|
53
53
  super f.to_json(val)
54
54
  end
55
- define_method f.name do
55
+ define_method f.json_key do
56
56
  f.from_json super()
57
57
  end
58
58
  end
@@ -0,0 +1,6 @@
1
+ class AddFieldStoreDefaultValues < ActiveRecord::Migration
2
+ def change
3
+ change_column :push_type_nodes, :field_store, :jsonb, default: {}, null: false
4
+ change_column :push_type_users, :field_store, :jsonb, default: {}, null: false
5
+ end
6
+ end
@@ -1,4 +1,4 @@
1
- class <%= class_name %>Field < PushType::FieldType
1
+ class <%= class_name %>Field < PushType::FieldType::Base
2
2
 
3
3
  # Override built-in methods to extend functionality
4
4
  # See PushType::FieldType Rdoc for methods to Override
@@ -1,60 +1,16 @@
1
+ require 'push_type/fields/class_methods'
2
+ require 'push_type/fields/base'
3
+ require 'push_type/fields/ui'
4
+ require 'push_type/fields/arrays'
5
+ require 'push_type/fields/relations'
6
+
1
7
  module PushType
2
8
  class FieldType
3
9
 
4
- attr_reader :name
5
-
6
- class << self
7
- attr_reader :initialized_blk
8
- def initialized_on_node(&block)
9
- @initialized_blk = block
10
- end
11
- end
12
-
13
- def initialize(name, opts = {})
14
- @name = name.to_s
15
- @opts = opts
16
- end
17
-
18
- def param
19
- name.to_sym
20
- end
21
-
22
- def kind
23
- self.class.name.demodulize.underscore.gsub(/_(field|type)$/, '')
24
- end
25
-
26
- def template
27
- @opts[:template] || 'default'
28
- end
29
-
30
- def label
31
- @opts[:label] || name.humanize
32
- end
33
-
34
- def html_options
35
- @opts[:html_options] || {}
36
- end
37
-
38
- def form_helper
39
- @opts[:form_helper] || :text_field
40
- end
41
-
42
- def column_class
43
- case @opts[:colspan]
44
- when 2 then 'medium-6'
45
- when 3 then 'medium-4'
46
- when 3 then 'medium-3'
47
- else nil
48
- end
49
- end
50
-
51
- def to_json(val)
52
- val
53
- end
10
+ extend PushType::Fields::ClassMethods
54
11
 
55
- def from_json(val)
56
- val
57
- end
12
+ include PushType::Fields::Base
13
+ include PushType::Fields::Ui
58
14
 
59
15
  end
60
16
  end
@@ -0,0 +1,23 @@
1
+ module PushType
2
+ module Fields
3
+ module Arrays
4
+
5
+ def param
6
+ { json_key => [] }
7
+ end
8
+
9
+ def multiple?
10
+ true
11
+ end
12
+
13
+ def to_json(val)
14
+ Array(val)
15
+ end
16
+
17
+ def from_json(val)
18
+ Array(val)
19
+ end
20
+
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,65 @@
1
+ module PushType
2
+ module Fields
3
+ module Base
4
+
5
+ attr_reader :name
6
+
7
+ def initialize(name, opts = {})
8
+ @name = name.to_s
9
+ @opts = [defaults, self.class.options, opts].compact.inject(&:merge)
10
+ end
11
+
12
+ def kind
13
+ self.class.kind
14
+ end
15
+
16
+ def json_key
17
+ name.to_sym
18
+ end
19
+
20
+ def param
21
+ json_key
22
+ end
23
+
24
+ def multiple?
25
+ false
26
+ end
27
+
28
+ def template
29
+ @opts[:template]
30
+ end
31
+
32
+ def label
33
+ @opts[:label]
34
+ end
35
+
36
+ def html_options
37
+ @opts[:html_options]
38
+ end
39
+
40
+ def form_helper
41
+ @opts[:form_helper]
42
+ end
43
+
44
+ def to_json(val)
45
+ val
46
+ end
47
+
48
+ def from_json(val)
49
+ val
50
+ end
51
+
52
+ private
53
+
54
+ def defaults
55
+ {
56
+ template: 'default',
57
+ label: name.humanize,
58
+ form_helper: :text_field,
59
+ html_options: {}
60
+ }
61
+ end
62
+
63
+ end
64
+ end
65
+ end
@@ -0,0 +1,21 @@
1
+ module PushType
2
+ module Fields
3
+ module ClassMethods
4
+
5
+ attr_reader :initialized_blk
6
+
7
+ def options(*opts)
8
+ @options ||= opts.first
9
+ end
10
+
11
+ def initialized_on_node(&block)
12
+ @initialized_blk = block
13
+ end
14
+
15
+ def kind
16
+ self.name.demodulize.underscore.gsub(/_(field|type)$/, '')
17
+ end
18
+
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,39 @@
1
+ module PushType
2
+ module Fields
3
+ module Relations
4
+
5
+ def json_key
6
+ suffix = multiple? ? '_ids' : 'id'
7
+ (name.singularize + suffix).to_sym
8
+ end
9
+
10
+ def relation_option
11
+ @opts[:relation_class]
12
+ end
13
+
14
+ def relation_root
15
+ (relation_option || name.singularize).to_s.classify.constantize
16
+ end
17
+
18
+ def relation_tree
19
+ flatten_tree relation_root.hash_tree
20
+ end
21
+
22
+ private
23
+
24
+ def flatten_tree(hash_tree, d = 0)
25
+ hash_tree.flat_map do |parent, children|
26
+ [
27
+ {
28
+ value: parent.id,
29
+ text: parent.title,
30
+ depth: d
31
+ },
32
+ flatten_tree(children, d+1)
33
+ ]
34
+ end.flatten
35
+ end
36
+
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,16 @@
1
+ module PushType
2
+ module Fields
3
+ module Ui
4
+
5
+ def column_class
6
+ case @opts[:colspan]
7
+ when 2 then 'medium-6'
8
+ when 3 then 'medium-4'
9
+ when 3 then 'medium-3'
10
+ else nil
11
+ end
12
+ end
13
+
14
+ end
15
+ end
16
+ end