sutty-cli 0.2.1 → 0.3.0rc3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (38) hide show
  1. checksums.yaml +4 -4
  2. data/config/locales/en.yml +290 -0
  3. data/config/locales/es.yml +285 -0
  4. data/lib/sutty/cli/cli.rb +43 -35
  5. data/lib/sutty/cli/commands/container.rb +4 -1
  6. data/lib/sutty/cli/commands/field.rb +94 -38
  7. data/lib/sutty/cli/commands/layout.rb +34 -21
  8. data/lib/sutty/cli/commands/theme.rb +18 -7
  9. data/lib/sutty/cli/i18n.rb +12 -0
  10. data/lib/sutty/cli/version.rb +1 -1
  11. data/lib/sutty/drop_stub.rb +10 -0
  12. data/lib/sutty/schema.rb +250 -0
  13. metadata +51 -29
  14. data/lib/sutty/cli/templates/field/array.yml.erb +0 -14
  15. data/lib/sutty/cli/templates/field/belongs_to.yml.erb +0 -16
  16. data/lib/sutty/cli/templates/field/boolean.yml.erb +0 -11
  17. data/lib/sutty/cli/templates/field/color.yml.erb +0 -11
  18. data/lib/sutty/cli/templates/field/content.yml.erb +0 -14
  19. data/lib/sutty/cli/templates/field/date.yml.erb +0 -11
  20. data/lib/sutty/cli/templates/field/email.yml.erb +0 -14
  21. data/lib/sutty/cli/templates/field/encrypted_text.yml.erb +0 -11
  22. data/lib/sutty/cli/templates/field/event.yml.erb +0 -40
  23. data/lib/sutty/cli/templates/field/file.yml.erb +0 -19
  24. data/lib/sutty/cli/templates/field/geo.yml.erb +0 -17
  25. data/lib/sutty/cli/templates/field/has_and_belongs_to_many.yml.erb +0 -16
  26. data/lib/sutty/cli/templates/field/has_many.yml.erb +0 -16
  27. data/lib/sutty/cli/templates/field/image.yml.erb +0 -19
  28. data/lib/sutty/cli/templates/field/locales.yml.erb +0 -11
  29. data/lib/sutty/cli/templates/field/markdown.yml.erb +0 -14
  30. data/lib/sutty/cli/templates/field/markdown_content.yml.erb +0 -14
  31. data/lib/sutty/cli/templates/field/number.yml.erb +0 -11
  32. data/lib/sutty/cli/templates/field/order.yml.erb +0 -11
  33. data/lib/sutty/cli/templates/field/predefined_array.yml.erb +0 -18
  34. data/lib/sutty/cli/templates/field/related_posts.yml.erb +0 -15
  35. data/lib/sutty/cli/templates/field/string.yml.erb +0 -14
  36. data/lib/sutty/cli/templates/field/tel.yml.erb +0 -14
  37. data/lib/sutty/cli/templates/field/text.yml.erb +0 -14
  38. data/lib/sutty/cli/templates/field/url.yml.erb +0 -14
@@ -6,8 +6,10 @@ 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
- attr_reader :name
12
+ attr_reader :name, :options
11
13
 
12
14
  def initialize(name, options)
13
15
  @name = name
@@ -20,27 +22,36 @@ module Sutty
20
22
  Dir.chdir theme_name do
21
23
  cmd.run('git remote rename origin upstream')
22
24
  cmd.run('git remote add origin', origin)
23
- cmd.run('git push -u origin master')
24
- cmd.run('bundle install')
25
- cmd.run('yarn install')
25
+ cmd.run('git lfs fetch --all upstream')
26
+
27
+ unless options[:no_push]
28
+ cmd.run('git lfs push --all origin')
29
+ cmd.run('git push -u origin master')
30
+ end
31
+
26
32
  cmd.run('git mv sutty-base-jekyll-theme.gemspec', gemspec)
33
+ cmd.run('make install')
27
34
  end
28
35
  end
29
36
 
30
37
  private
31
38
 
39
+ # @return [String]
32
40
  def theme_name
33
- @theme_name ||= name + '-jekyll-theme'
41
+ @theme_name ||= "#{name}-jekyll-theme"
34
42
  end
35
43
 
44
+ # @return [String]
36
45
  def origin
37
- @origin ||= 'git@0xacab.org:sutty/jekyll/' + theme_name + '.git'
46
+ @origin ||= "git@0xacab.org:sutty/jekyll/#{theme_name}.git"
38
47
  end
39
48
 
49
+ # @return [String]
40
50
  def gemspec
41
- @gemspec ||= theme_name + '.gemspec'
51
+ @gemspec ||= "#{theme_name}.gemspec"
42
52
  end
43
53
 
54
+ # @return [TTY::Command]
44
55
  def cmd
45
56
  @cmd ||= TTY::Command.new
46
57
  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.0rc3"
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.0rc3
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-08-26 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
@@ -134,6 +176,8 @@ extra_rdoc_files:
134
176
  files:
135
177
  - LICENSE.txt
136
178
  - README.md
179
+ - config/locales/en.yml
180
+ - config/locales/es.yml
137
181
  - exe/sutty-cli
138
182
  - lib/sutty/cli.rb
139
183
  - lib/sutty/cli/cli.rb
@@ -143,32 +187,10 @@ files:
143
187
  - lib/sutty/cli/commands/layout.rb
144
188
  - lib/sutty/cli/commands/post.rb
145
189
  - 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
190
+ - lib/sutty/cli/i18n.rb
171
191
  - lib/sutty/cli/version.rb
192
+ - lib/sutty/drop_stub.rb
193
+ - lib/sutty/schema.rb
172
194
  homepage: https://0xacab.org/sutty/sutty-cli
173
195
  licenses:
174
196
  - MIT
@@ -196,9 +218,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
196
218
  version: 2.6.0
197
219
  required_rubygems_version: !ruby/object:Gem::Requirement
198
220
  requirements:
199
- - - ">="
221
+ - - ">"
200
222
  - !ruby/object:Gem::Version
201
- version: '0'
223
+ version: 1.3.1
202
224
  requirements: []
203
225
  rubygems_version: 3.1.2
204
226
  signing_key: