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

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 (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