sutty-cli 0.2.1 → 0.3.0rc

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 (36) hide show
  1. checksums.yaml +4 -4
  2. data/lib/sutty/cli/cli.rb +42 -35
  3. data/lib/sutty/cli/commands/container.rb +4 -1
  4. data/lib/sutty/cli/commands/field.rb +94 -38
  5. data/lib/sutty/cli/commands/layout.rb +34 -21
  6. data/lib/sutty/cli/commands/theme.rb +9 -5
  7. data/lib/sutty/cli/i18n.rb +12 -0
  8. data/lib/sutty/cli/version.rb +1 -1
  9. data/lib/sutty/drop_stub.rb +10 -0
  10. data/lib/sutty/schema.rb +250 -0
  11. metadata +49 -29
  12. data/lib/sutty/cli/templates/field/array.yml.erb +0 -14
  13. data/lib/sutty/cli/templates/field/belongs_to.yml.erb +0 -16
  14. data/lib/sutty/cli/templates/field/boolean.yml.erb +0 -11
  15. data/lib/sutty/cli/templates/field/color.yml.erb +0 -11
  16. data/lib/sutty/cli/templates/field/content.yml.erb +0 -14
  17. data/lib/sutty/cli/templates/field/date.yml.erb +0 -11
  18. data/lib/sutty/cli/templates/field/email.yml.erb +0 -14
  19. data/lib/sutty/cli/templates/field/encrypted_text.yml.erb +0 -11
  20. data/lib/sutty/cli/templates/field/event.yml.erb +0 -40
  21. data/lib/sutty/cli/templates/field/file.yml.erb +0 -19
  22. data/lib/sutty/cli/templates/field/geo.yml.erb +0 -17
  23. data/lib/sutty/cli/templates/field/has_and_belongs_to_many.yml.erb +0 -16
  24. data/lib/sutty/cli/templates/field/has_many.yml.erb +0 -16
  25. data/lib/sutty/cli/templates/field/image.yml.erb +0 -19
  26. data/lib/sutty/cli/templates/field/locales.yml.erb +0 -11
  27. data/lib/sutty/cli/templates/field/markdown.yml.erb +0 -14
  28. data/lib/sutty/cli/templates/field/markdown_content.yml.erb +0 -14
  29. data/lib/sutty/cli/templates/field/number.yml.erb +0 -11
  30. data/lib/sutty/cli/templates/field/order.yml.erb +0 -11
  31. data/lib/sutty/cli/templates/field/predefined_array.yml.erb +0 -18
  32. data/lib/sutty/cli/templates/field/related_posts.yml.erb +0 -15
  33. data/lib/sutty/cli/templates/field/string.yml.erb +0 -14
  34. data/lib/sutty/cli/templates/field/tel.yml.erb +0 -14
  35. data/lib/sutty/cli/templates/field/text.yml.erb +0 -14
  36. data/lib/sutty/cli/templates/field/url.yml.erb +0 -14
@@ -6,6 +6,8 @@ require 'tty-command'
6
6
  module Sutty
7
7
  module Cli
8
8
  module Commands
9
+ # Genera una plantilla nueva, a partir de sutty-base-jekyll-theme
10
+ # y realiza la configuración inicial del repositorio.
9
11
  class Theme < Sutty::Cli::Command
10
12
  attr_reader :name
11
13
 
@@ -21,26 +23,28 @@ module Sutty
21
23
  cmd.run('git remote rename origin upstream')
22
24
  cmd.run('git remote add origin', origin)
23
25
  cmd.run('git push -u origin master')
24
- cmd.run('bundle install')
25
- cmd.run('yarn install')
26
26
  cmd.run('git mv sutty-base-jekyll-theme.gemspec', gemspec)
27
27
  end
28
28
  end
29
29
 
30
30
  private
31
31
 
32
+ # @return [String]
32
33
  def theme_name
33
- @theme_name ||= name + '-jekyll-theme'
34
+ @theme_name ||= "#{name}-jekyll-theme"
34
35
  end
35
36
 
37
+ # @return [String]
36
38
  def origin
37
- @origin ||= 'git@0xacab.org:sutty/jekyll/' + theme_name + '.git'
39
+ @origin ||= "git@0xacab.org:sutty/jekyll/#{theme_name}.git"
38
40
  end
39
41
 
42
+ # @return [String]
40
43
  def gemspec
41
- @gemspec ||= theme_name + '.gemspec'
44
+ @gemspec ||= "#{theme_name}.gemspec"
42
45
  end
43
46
 
47
+ # @return [TTY::Command]
44
48
  def cmd
45
49
  @cmd ||= TTY::Command.new
46
50
  end
@@ -0,0 +1,12 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'i18n'
4
+
5
+ locale = ENV['LANG'].split('_', 2).first.to_sym
6
+ locales = Dir["#{File.expand_path(File.join(__dir__, '..', '..', '..', 'config', 'locales'))}/*.yml"]
7
+
8
+ I18n::Backend::Simple.include(I18n::Backend::Memoize)
9
+ I18n.load_path = locales
10
+ I18n.available_locales = locales.map { |l| File.basename(l, '.yml') }.map(&:to_sym)
11
+ I18n.default_locale = :es
12
+ I18n.locale = I18n.available_locales.include?(locale) ? locale : :es
@@ -2,6 +2,6 @@
2
2
 
3
3
  module Sutty
4
4
  module Cli
5
- VERSION = "0.2.1"
5
+ VERSION = "0.3.0rc"
6
6
  end
7
7
  end
@@ -0,0 +1,10 @@
1
+ # frozen_string_literal: true
2
+
3
+ # A veces necesitamos una versión falsa de esto para Jekyll::Utils
4
+ unless Object.const_defined? 'Jekyll::Drops::Drop'
5
+ module Jekyll
6
+ module Drops
7
+ class Drop ; end
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,250 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'jekyll/utils'
4
+
5
+ module Sutty
6
+ # Genera definiciones de campos para Sutty
7
+ class Schema
8
+ class << self
9
+ ATTRIBUTES = %i[type required private writable inverse filter]
10
+
11
+ # Definición base.
12
+ #
13
+ # Se eliminan los valores que son falsos o están vacíos.
14
+ #
15
+ # @return [Hash]
16
+ def base(**args)
17
+ validate_field_type(args[:type])
18
+
19
+ args.slice(*ATTRIBUTES).transform_keys(&:to_s).reject do |_, v|
20
+ v == false || v.nil?
21
+ end.merge(t(**args))
22
+ end
23
+
24
+ def create(type:, **args)
25
+ validate_field_type(type)
26
+
27
+ public_send :"#{type}_field", **args
28
+ end
29
+
30
+ # Aplica traducciones
31
+ #
32
+ # @param :type [String]
33
+ # @param :name [String]
34
+ # @return [Hash] traducciones
35
+ def t(**args)
36
+ require_relative 'drop_stub'
37
+
38
+ I18n.available_locales.map do |locale|
39
+ I18n.with_locale(locale) do
40
+ %i[name type].map do |translation|
41
+ translation = I18n.t("fields.common_by_#{translation}.#{args[translation]}")
42
+
43
+ next if translation.is_a? String
44
+
45
+ translation
46
+ end.compact.first
47
+ end
48
+ end.compact.reduce({}) do |t, l|
49
+ Jekyll::Utils.deep_merge_hashes(t, l)
50
+ end
51
+ end
52
+
53
+ # Texto de una sola línea
54
+ #
55
+ # @return [Hash]
56
+ def string_field(name:, **args)
57
+ { name => base(type: 'string', name: name, **args) }
58
+ end
59
+
60
+ # Texto de varias líneas
61
+ #
62
+ # @return [Hash]
63
+ def text_field(name:, **args)
64
+ { name => base(type: 'text', name: name, **args) }
65
+ end
66
+
67
+ # Números
68
+ #
69
+ # @return [Hash]
70
+ def number_field(name:, **args)
71
+ { name => base(type: 'number', name: name, **args) }
72
+ end
73
+
74
+ # URL
75
+ #
76
+ # @return [Hash]
77
+ def url_field(name:, **args)
78
+ { name => base(type: 'url', name: name, **args) }
79
+ end
80
+
81
+ # E-mail
82
+ #
83
+ # @return [Hash]
84
+ def email_field(name:, **args)
85
+ { name => base(type: 'email', name: name, **args) }
86
+ end
87
+
88
+ # Teléfono
89
+ #
90
+ # @return [Hash]
91
+ def tel_field(name:, **args)
92
+ { name => base(type: 'tel', name: name, **args) }
93
+ end
94
+
95
+ # Color
96
+ #
97
+ # @return [Hash]
98
+ def color_field(name:, **args)
99
+ { name => base(type: 'color', name: name, **args) }
100
+ end
101
+
102
+ # SKU
103
+ #
104
+ # @return [Hash]
105
+ def sku_field(name:, **args)
106
+ { name => base(type: 'sku', name: name, **args) }
107
+ end
108
+
109
+ # Precio. Los precios se escriben una sola vez.
110
+ #
111
+ # @return [Hash]
112
+ def price_field(name:, **args)
113
+ { name => base(type: 'price', name: name, writable: 'once', **args) }
114
+ end
115
+
116
+ # Permalinks
117
+ #
118
+ # @return [Hash]
119
+ def permalink_field(name:, **args)
120
+ { name => base(type: 'permalink', name: name, **args) }
121
+ end
122
+
123
+ # Orden
124
+ #
125
+ # @return [Hash]
126
+ def order_field(name:, **args)
127
+ { name => base(type: 'order', name: name, **args) }
128
+ end
129
+
130
+ # Verdadero/falso
131
+ #
132
+ # @return [Hash]
133
+ def boolean_field(name:, **args)
134
+ { name => base(type: 'boolean', name: name, **args) }
135
+ end
136
+
137
+ # Contenido
138
+ #
139
+ # @return [Hash]
140
+ def content_field(name:, **args)
141
+ { name => base(type: 'content', name: name, **args) }
142
+ end
143
+
144
+ # HTML
145
+ #
146
+ # @return [Hash]
147
+ def html_field(name:, **args)
148
+ { name => base(type: 'html', name: name, **args) }
149
+ end
150
+
151
+ # Oculto
152
+ #
153
+ # @return [Hash]
154
+ def hidden_field(name:, **args)
155
+ { name => base(type: 'hidden', name: name, **args) }
156
+ end
157
+
158
+ # Fecha
159
+ #
160
+ # @return [Hash]
161
+ def date_field(name:, **args)
162
+ { name => base(type: 'date', name: name, **args) }
163
+ end
164
+
165
+ # Coordenadas geográficas
166
+ #
167
+ # @return [Hash]
168
+ def geo_field(name:, **args)
169
+ { name => base(type: 'geo', name: name, **args) }
170
+ end
171
+
172
+ # Archivo
173
+ #
174
+ # @return [Hash]
175
+ def file_field(name:, **args)
176
+ { name => base(type: 'file', name: name, **args) }
177
+ end
178
+
179
+ # Imagen
180
+ #
181
+ # @return [Hash]
182
+ def image_field(name:, **args)
183
+ { name => base(type: 'image', name: name, **args) }
184
+ end
185
+
186
+ # Array
187
+ #
188
+ # @return [Hash]
189
+ def array_field(name:, **args)
190
+ { name => base(type: 'array', name: name, **args) }
191
+ end
192
+
193
+ # Relacionados sin relación recíproca
194
+ #
195
+ # @return [Hash]
196
+ def related_posts_field(name:, **args)
197
+ { name => base(type: 'related_posts', name: name, **args) }
198
+ end
199
+
200
+ # Relación de muchos a uno, la relación recíproca es has_many
201
+ #
202
+ # @return [Hash]
203
+ def belongs_to_field(name:, filter:, value:, **args)
204
+ { name => base(type: 'belongs_to', name: name, filter: { filter => value }, **args) }
205
+ end
206
+
207
+ # Relación de uno a muchos, la relación recíproca es belongs_to
208
+ #
209
+ # @return [Hash]
210
+ def has_many_field(name:, filter:, value:, **args)
211
+ { name => base(type: 'has_many', name: name, filter: { filter => value }, **args) }
212
+ end
213
+
214
+ # Relación de muchos a muchos, la relación recíproca es
215
+ # has_and_belongs_to_many.
216
+ #
217
+ # @return [Hash]
218
+ def has_and_belongs_to_many_field(name:, filter:, value:, **args)
219
+ { name => base(type: 'has_and_belongs_to_many', name: name, filter: { filter => value }, **args) }
220
+ end
221
+
222
+ # Los tipos de campos válidos son los que esta clase define como
223
+ # métodos terminados en _field
224
+ #
225
+ # @return [Array]
226
+ def field_types
227
+ @field_types ||= self.public_methods.select do |m|
228
+ m.to_s.end_with? '_field'
229
+ end.map do |m|
230
+ m.to_s.sub(/_field\z/, '').to_sym
231
+ end.sort
232
+ end
233
+
234
+ # Valida si el tipo de campo está definido
235
+ #
236
+ # @param [String,Symbol]
237
+ # @return [Boolean]
238
+ def field_type?(type)
239
+ self.respond_to? :"#{type}_field"
240
+ end
241
+
242
+ # Devuelve un error si el tipo del campo no es válido
243
+ #
244
+ # @return [Nil]
245
+ def validate_field_type(type)
246
+ raise ArgumentError, "#{type} must be one of #{field_types.map(&:to_s).join(', ')}" unless field_type? type
247
+ end
248
+ end
249
+ end
250
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sutty-cli
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.1
4
+ version: 0.3.0rc
5
5
  platform: ruby
6
6
  authors:
7
7
  - f
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2020-10-21 00:00:00.000000000 Z
11
+ date: 2021-06-02 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: tty-command
@@ -94,6 +94,20 @@ dependencies:
94
94
  - - "~>"
95
95
  - !ruby/object:Gem::Version
96
96
  version: '2.14'
97
+ - !ruby/object:Gem::Dependency
98
+ name: activesupport
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - "~>"
102
+ - !ruby/object:Gem::Version
103
+ version: 6.1.3
104
+ type: :runtime
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - "~>"
109
+ - !ruby/object:Gem::Version
110
+ version: 6.1.3
97
111
  - !ruby/object:Gem::Dependency
98
112
  name: tty
99
113
  requirement: !ruby/object:Gem::Requirement
@@ -122,6 +136,34 @@ dependencies:
122
136
  - - "~>"
123
137
  - !ruby/object:Gem::Version
124
138
  version: '0'
139
+ - !ruby/object:Gem::Dependency
140
+ name: minitest
141
+ requirement: !ruby/object:Gem::Requirement
142
+ requirements:
143
+ - - "~>"
144
+ - !ruby/object:Gem::Version
145
+ version: '5.14'
146
+ type: :development
147
+ prerelease: false
148
+ version_requirements: !ruby/object:Gem::Requirement
149
+ requirements:
150
+ - - "~>"
151
+ - !ruby/object:Gem::Version
152
+ version: '5.14'
153
+ - !ruby/object:Gem::Dependency
154
+ name: rake
155
+ requirement: !ruby/object:Gem::Requirement
156
+ requirements:
157
+ - - "~>"
158
+ - !ruby/object:Gem::Version
159
+ version: '12.3'
160
+ type: :development
161
+ prerelease: false
162
+ version_requirements: !ruby/object:Gem::Requirement
163
+ requirements:
164
+ - - "~>"
165
+ - !ruby/object:Gem::Version
166
+ version: '12.3'
125
167
  description: Tools to develop Sutty's themes and plugins
126
168
  email:
127
169
  - f@sutty.nl
@@ -143,32 +185,10 @@ files:
143
185
  - lib/sutty/cli/commands/layout.rb
144
186
  - lib/sutty/cli/commands/post.rb
145
187
  - lib/sutty/cli/commands/theme.rb
146
- - lib/sutty/cli/templates/field/array.yml.erb
147
- - lib/sutty/cli/templates/field/belongs_to.yml.erb
148
- - lib/sutty/cli/templates/field/boolean.yml.erb
149
- - lib/sutty/cli/templates/field/color.yml.erb
150
- - lib/sutty/cli/templates/field/content.yml.erb
151
- - lib/sutty/cli/templates/field/date.yml.erb
152
- - lib/sutty/cli/templates/field/email.yml.erb
153
- - lib/sutty/cli/templates/field/encrypted_text.yml.erb
154
- - lib/sutty/cli/templates/field/event.yml.erb
155
- - lib/sutty/cli/templates/field/file.yml.erb
156
- - lib/sutty/cli/templates/field/geo.yml.erb
157
- - lib/sutty/cli/templates/field/has_and_belongs_to_many.yml.erb
158
- - lib/sutty/cli/templates/field/has_many.yml.erb
159
- - lib/sutty/cli/templates/field/image.yml.erb
160
- - lib/sutty/cli/templates/field/locales.yml.erb
161
- - lib/sutty/cli/templates/field/markdown.yml.erb
162
- - lib/sutty/cli/templates/field/markdown_content.yml.erb
163
- - lib/sutty/cli/templates/field/number.yml.erb
164
- - lib/sutty/cli/templates/field/order.yml.erb
165
- - lib/sutty/cli/templates/field/predefined_array.yml.erb
166
- - lib/sutty/cli/templates/field/related_posts.yml.erb
167
- - lib/sutty/cli/templates/field/string.yml.erb
168
- - lib/sutty/cli/templates/field/tel.yml.erb
169
- - lib/sutty/cli/templates/field/text.yml.erb
170
- - lib/sutty/cli/templates/field/url.yml.erb
188
+ - lib/sutty/cli/i18n.rb
171
189
  - lib/sutty/cli/version.rb
190
+ - lib/sutty/drop_stub.rb
191
+ - lib/sutty/schema.rb
172
192
  homepage: https://0xacab.org/sutty/sutty-cli
173
193
  licenses:
174
194
  - MIT
@@ -196,9 +216,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
196
216
  version: 2.6.0
197
217
  required_rubygems_version: !ruby/object:Gem::Requirement
198
218
  requirements:
199
- - - ">="
219
+ - - ">"
200
220
  - !ruby/object:Gem::Version
201
- version: '0'
221
+ version: 1.3.1
202
222
  requirements: []
203
223
  rubygems_version: 3.1.2
204
224
  signing_key:
@@ -1,14 +0,0 @@
1
- <%= name %>:
2
- type: 'array'
3
- <% if required %>
4
- required: true
5
- <% end %>
6
- <% if private %>
7
- private: true
8
- <% end %>
9
- label:
10
- es: 'Nombre'
11
- en: 'Name'
12
- help:
13
- es: 'Ayuda'
14
- en: 'Ayuda'