baltix 0.1.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (52) hide show
  1. checksums.yaml +7 -0
  2. data/.github/workflows/ci.yml +44 -0
  3. data/.gitignore +10 -0
  4. data/Gemfile +8 -0
  5. data/LICENSE +8 -0
  6. data/README.md +60 -0
  7. data/Rakefile +8 -0
  8. data/TODO +84 -0
  9. data/baltix.gemspec +39 -0
  10. data/bin/console +14 -0
  11. data/bin/setup +8 -0
  12. data/exe/baltix +4 -0
  13. data/lib/baltix/actor/copy.rb +19 -0
  14. data/lib/baltix/actor/link.rb +20 -0
  15. data/lib/baltix/actor/spec.rb +25 -0
  16. data/lib/baltix/actor/touch.rb +17 -0
  17. data/lib/baltix/actor.rb +75 -0
  18. data/lib/baltix/cli.rb +173 -0
  19. data/lib/baltix/deps.rb +280 -0
  20. data/lib/baltix/dsl.rb +311 -0
  21. data/lib/baltix/extensions.rb +536 -0
  22. data/lib/baltix/i18n.rb +64 -0
  23. data/lib/baltix/loader/cmake.rb +11 -0
  24. data/lib/baltix/loader/git-version-gen.rb +36 -0
  25. data/lib/baltix/loader/mast.rb +139 -0
  26. data/lib/baltix/loader/pom.rb +27 -0
  27. data/lib/baltix/loader/rookbook.rb +26 -0
  28. data/lib/baltix/loader/yaml.rb +18 -0
  29. data/lib/baltix/loader.rb +192 -0
  30. data/lib/baltix/log.rb +73 -0
  31. data/lib/baltix/rake.rb +57 -0
  32. data/lib/baltix/scheme.erb.yaml +20 -0
  33. data/lib/baltix/source/base.rb +438 -0
  34. data/lib/baltix/source/fake.rb +17 -0
  35. data/lib/baltix/source/gem.rb +407 -0
  36. data/lib/baltix/source/gemfile.rb +35 -0
  37. data/lib/baltix/source/rakefile.rb +24 -0
  38. data/lib/baltix/source.rb +57 -0
  39. data/lib/baltix/space/spec.rb +11 -0
  40. data/lib/baltix/space.rb +424 -0
  41. data/lib/baltix/spec/rpm/name.rb +155 -0
  42. data/lib/baltix/spec/rpm/parser.rb +412 -0
  43. data/lib/baltix/spec/rpm/secondary.rb +170 -0
  44. data/lib/baltix/spec/rpm/spec_core.rb +580 -0
  45. data/lib/baltix/spec/rpm.erb +188 -0
  46. data/lib/baltix/spec/rpm.rb +822 -0
  47. data/lib/baltix/spec.rb +48 -0
  48. data/lib/baltix/version.rb +3 -0
  49. data/lib/baltix.rb +19 -0
  50. data/locale/en_US.UTF-8.yaml +27 -0
  51. data/locale/ru_RU.UTF-8.yaml +23 -0
  52. metadata +216 -0
@@ -0,0 +1,822 @@
1
+ require "erb"
2
+
3
+ require 'baltix/spec'
4
+ require 'baltix/i18n'
5
+
6
+ class Baltix::Spec::Rpm
7
+ attr_reader :spec, :comment, :space
8
+
9
+ %w(Name Parser Secondary SpecCore).reduce({}) do |types, name|
10
+ autoload(:"#{name}", File.dirname(__FILE__) + "/rpm/#{name.tableize.singularize}")
11
+ end
12
+
13
+ OPTIONS = %w(source conflicts uri vcs maintainer_name maintainer_email
14
+ source_files patches build_pre_requires context comment
15
+ readme executables ignored_names main_source dependencies
16
+ valid_sources available_gem_list rootdir aliased_names
17
+ time_stamp devel_dep_setup use_gem_version_list use_gem_obsolete_list)
18
+
19
+ PARTS = {
20
+ lib: nil,
21
+ exec: :has_executables?,
22
+ doc: :has_docs?,
23
+ devel: :has_devel?,
24
+ }
25
+
26
+ STATE_CHANGE_NAMES = %w(name version summaries licenses group uri vcs
27
+ packager build_arch source_files build_pre_requires descriptions secondaries
28
+ prep build install check file_list)
29
+
30
+ STATE = {
31
+ name: {
32
+ seq: %w(of_options of_state of_source of_default _name _global_rename),
33
+ default: "",
34
+ },
35
+ pre_name: {
36
+ seq: %w(of_options of_state of_default _pre_name),
37
+ default: "",
38
+ },
39
+ epoch: {
40
+ seq: %w(of_options of_source of_state),
41
+ default: nil,
42
+ },
43
+ version: {
44
+ seq: %w(of_options of_source of_state of_default _version),
45
+ default: ->(this) { this.options.time_stamp || Time.now.strftime("%Y%m%d") },
46
+ },
47
+ release: {
48
+ seq: %w(of_options of_state _release),
49
+ default: "alt1",
50
+ },
51
+ build_arch: {
52
+ seq: %w(of_options of_state of_source),
53
+ default: "noarch",
54
+ },
55
+ summaries: {
56
+ seq: %w(of_options of_state of_source of_default _summaries),
57
+ default: ""
58
+ },
59
+ group: {
60
+ seq: %w(of_options of_state of_source),
61
+ default: ->(this) { t("spec.rpm.#{this.kind}.group") },
62
+ },
63
+ requires: {
64
+ seq: %w(of_options of_state of_default _filter_out_obsolete _requires_plain_only _requires),
65
+ default: [],
66
+ },
67
+ conflicts: {
68
+ seq: %w(of_options of_state of_default _conflicts_plain_only _conflicts),
69
+ default: [],
70
+ },
71
+ provides: {
72
+ seq: %w(of_options of_state of_default _provides),
73
+ default: [],
74
+ },
75
+ obsoletes: {
76
+ seq: %w(of_options of_state of_default _obsoletes),
77
+ default: [],
78
+ },
79
+ file_list: {
80
+ seq: %w(of_options of_state of_source),
81
+ default: "",
82
+ },
83
+ licenses: {
84
+ seq: %w(of_options of_state _licenses),
85
+ default: [],
86
+ },
87
+ uri: {
88
+ seq: %w(of_options of_state of_source),
89
+ default: nil,
90
+ },
91
+ vcs: {
92
+ seq: %w(of_options of_state of_source _vcs),
93
+ default: nil,
94
+ },
95
+ packager: {
96
+ seq: %w(of_options of_state),
97
+ default: ->(this) do
98
+ OpenStruct.new(
99
+ name: this.options.maintainer_name || "Spec Author",
100
+ email: this.options.maintainer_email || "author@example.org"
101
+ )
102
+ end
103
+ },
104
+ source_files: {
105
+ seq: %w(of_options of_state of_default _source_files),
106
+ default: { "0": "%name-%version.tar" }.to_os,
107
+ },
108
+ patches: {
109
+ seq: %w(of_options of_state),
110
+ default: {}.to_os,
111
+ },
112
+ build_dependencies: {
113
+ seq: %w(of_options of_state of_default _build_dependencies _build_dependencies_sort),
114
+ default: [],
115
+ },
116
+ build_requires: {
117
+ seq: %w(of_options of_state of_default _filter_out_build_auto_requires _filter_out_obsolete _build_requires),
118
+ default: [],
119
+ },
120
+ build_conflicts: {
121
+ seq: %w(of_options of_state of_default _build_conflicts),
122
+ default: [],
123
+ },
124
+ build_pre_requires: {
125
+ seq: %w(of_options of_state of_default _build_pre_requires),
126
+ default: [ "rpm-build-ruby" ],
127
+ },
128
+ changes: {
129
+ seq: %w(of_options of_state of_source of_default _changes),
130
+ default: ->(this) do
131
+ version = this.version
132
+ description = Baltix::I18n.t("spec.rpm.change.new", binding: binding)
133
+ release = this.of_options(:release) || this.of_state(:release) || "alt1"
134
+
135
+ [ OpenStruct.new(
136
+ date: Date.today.strftime("%a %b %d %Y"),
137
+ author: this.packager.name,
138
+ email: this.packager.email,
139
+ version: version,
140
+ release: release,
141
+ description: description) ]
142
+ end,
143
+ },
144
+ prep: {
145
+ seq: %w(of_options of_state),
146
+ default: "%setup",
147
+ },
148
+ build: {
149
+ seq: %w(of_options of_state),
150
+ default: "%ruby_build",
151
+ },
152
+ install: {
153
+ seq: %w(of_options of_state),
154
+ default: "%ruby_install",
155
+ },
156
+ check: {
157
+ seq: %w(of_options of_state),
158
+ default: "%ruby_test",
159
+ },
160
+ secondaries: {
161
+ seq: %w(of_options of_state of_default _secondaries),
162
+ default: [],
163
+ },
164
+ context: {
165
+ seq: %w(of_options of_state),
166
+ default: {},
167
+ },
168
+ comment: {
169
+ seq: %w(of_options of_state),
170
+ default: nil,
171
+ },
172
+ spec_template: {
173
+ seq: %w(of_options of_state),
174
+ default: ->(_) { IO.read(File.join(File.dirname(__FILE__), "rpm.erb")) },
175
+ },
176
+ compilables: {
177
+ seq: %w(of_options of_state of_source),
178
+ default: [],
179
+ },
180
+ descriptions: {
181
+ seq: %w(of_options of_state of_source of_default _proceed_description _descriptions _format_descriptions),
182
+ default: {}.to_os
183
+ },
184
+ valid_sources: {
185
+ seq: %w(of_state of_space of_default),
186
+ default: []
187
+ },
188
+ readme: {
189
+ seq: %w(of_options of_source _readme of_state),
190
+ default: nil,
191
+ },
192
+ executables: {
193
+ seq: %w(of_options of_source of_state),
194
+ default: [],
195
+ },
196
+ docs: {
197
+ seq: %w(of_options _docs of_state),
198
+ default: nil,
199
+ },
200
+ devel: {
201
+ seq: %w(of_options _devel of_state),
202
+ default: nil,
203
+ },
204
+ devel_requires: {
205
+ seq: %w(of_options of_state _devel_requires),
206
+ default: nil,
207
+ },
208
+ devel_conflicts: {
209
+ seq: %w(of_options of_state _devel_conflicts),
210
+ default: nil,
211
+ },
212
+ devel_sources: {
213
+ seq: %w(of_options _devel_sources of_state),
214
+ default: [],
215
+ },
216
+ files: {
217
+ seq: %w(of_options _files of_state),
218
+ default: []
219
+ },
220
+ dependencies: {
221
+ seq: %w(of_options of_state of_source),
222
+ default: []
223
+ },
224
+ development_dependencies: {
225
+ seq: %w(of_options of_state of_source),
226
+ default: []
227
+ },
228
+ ruby_alias_names: {
229
+ seq: %w(of_options of_state _ruby_alias_names _ruby_alias_names_local),
230
+ default: []
231
+ },
232
+ gem_versionings: {
233
+ seq: %w(of_options of_state _gem_versionings_with_use),
234
+ default: []
235
+ },
236
+ ignored_names: {
237
+ seq: %w(of_options of_state),
238
+ default: []
239
+ },
240
+ aliased_names: {
241
+ seq: %w(of_options of_state),
242
+ default: []
243
+ },
244
+ available_gem_list: {
245
+ seq: %w(of_options of_state _available_gem_list),
246
+ default: {}
247
+ },
248
+ versioned_gem_list: {
249
+ seq: %w(of_options of_state _versioned_gem_list),
250
+ default: {}
251
+ },
252
+ available_gem_ranges: {
253
+ seq: %w(of_options of_state _available_gem_ranges),
254
+ default: {}.to_os
255
+ },
256
+ use_gem_version_list: {
257
+ seq: %w(of_options of_state _use_gem_version_list),
258
+ default: {}.to_os
259
+ },
260
+ use_gem_obsolete_list: {
261
+ seq: %w(of_options of_state),
262
+ default: {}.to_os
263
+ },
264
+ rootdir: {
265
+ seq: %w(of_options of_state),
266
+ default: nil
267
+ },
268
+ rake_build_tasks: {
269
+ seq: %w(of_options of_source of_state of_default _rake_build_tasks),
270
+ default: ""
271
+ }
272
+ }.to_os(hash: true)
273
+
274
+ include Baltix::Spec::Rpm::SpecCore
275
+ include Baltix::I18n
276
+
277
+ def render spec = nil
278
+ b = binding
279
+
280
+ ERB.new(spec || spec_template, trim_mode: "<>-", eoutvar: "@spec").result(b).strip
281
+ end
282
+
283
+ def macros name
284
+ [ context.__macros[name] ].flatten(1).map { |x| "%#{name} #{x}" }.join("\n")
285
+ end
286
+
287
+ def is_same_source? source_in
288
+ source_in && source == source_in
289
+ end
290
+
291
+ def kind
292
+ @kind ||= source.is_a?(Baltix::Source::Gem) && :lib || :app
293
+ end
294
+
295
+ def state_kind
296
+ @state_kind ||= options.main_source.is_a?(Baltix::Source::Gem) && "lib" || state['file_list'].blank? && "app" || pre_name&.kind
297
+ end
298
+
299
+ def default_state_kind
300
+ "app"
301
+ end
302
+
303
+ def assign_space space
304
+ @space = space
305
+
306
+ #TODO clean variables
307
+
308
+ space
309
+ end
310
+
311
+ # +assign_state_sources+ infers all the unassigned state to convert to sources main and secondaries from the state
312
+ def assign_state_to_sources sources
313
+ packages = [ self ] | of_state(:secondaries)
314
+
315
+ packages.map do |package|
316
+ # binding.pry
317
+ package.options&.main_source ||
318
+ case package.state_kind || package.name.kind || default_state_kind
319
+ when "lib"
320
+ spec = Gem::Specification.new do |s|
321
+ s.name = package.name.autoname
322
+ s.version, s.summary =
323
+ if package.state
324
+ [ package.state["version"], package.state["summaries"]&.[]("") ]
325
+ elsif package.source
326
+ [ package.source.version, package.source.summary ]
327
+ else
328
+ [ package.version, package.summaries&.[]("") ]
329
+ end
330
+ end
331
+ # binding.pry
332
+
333
+ Baltix::Source::Gem.new({"spec" => spec})
334
+ when "app"
335
+ #name = package.of_options(:name) ||
336
+ # package.of_state(:name) ||
337
+ # rootdir && rootdir.split("/").last
338
+ name = package.pre_name
339
+
340
+ Baltix::Source::Gemfile.new({
341
+ "rootdir" => rootdir,
342
+ "name" => name.to_s,
343
+ "version" => of_options(:version) || of_state(:version)
344
+ })
345
+ end
346
+ end.compact
347
+ end
348
+
349
+ def state_sources
350
+ packages = [ self ] | (of_state(:secondaries) || of_default(:secondaries))
351
+
352
+ packages.map do |package|
353
+ package.options&.main_source ||
354
+ case package.state_kind || package.name.kind || default_state_kind
355
+ when "lib"
356
+ #binding.pry
357
+ spec = Gem::Specification.new do |s|
358
+ s.name = (package.is_a?(OpenStruct) ? package.name : package.pre_name).autoname
359
+ s.version, s.summary =
360
+ if package.state
361
+ [ package.state["version"], package.state["summaries"]&.[]("") ]
362
+ elsif package.source
363
+ [ package.source.version, package.source.summary ]
364
+ else
365
+ [ package.version, package.summaries&.[]("") ]
366
+ end
367
+ end
368
+ # binding.pry
369
+
370
+ Baltix::Source::Gem.new({"spec" => spec})
371
+ when "app"
372
+ #name = package.of_options(:name) ||
373
+ # package.of_state(:name) ||
374
+ # rootdir && rootdir.split("/").last
375
+ name = package.pre_name
376
+
377
+ if rootdir
378
+ Baltix::Source::Gemfile.new({
379
+ "rootdir" => rootdir,
380
+ "name" => name.to_s,
381
+ "version" => of_options(:version) || of_state(:version)
382
+ })
383
+ elsif space&.valid_sources&.first
384
+ space&.valid_sources&.first
385
+ else
386
+ Baltix::Source::Fake.new({
387
+ "rootdir" => rootdir,
388
+ "name" => name.to_s,
389
+ "version" => of_options(:version) || of_state(:version)
390
+ })
391
+ end
392
+ end
393
+ end.compact
394
+ end
395
+
396
+ def pure_build_requires
397
+ build_requires.select {|r| r !~ /^gem\(.*\)/ }
398
+ end
399
+
400
+ def pure_build_conflicts
401
+ build_conflicts.select {|r| r !~ /^gem\(.*\)/ }
402
+ end
403
+
404
+ def gem_build_requires
405
+ build_requires.select {|r| r =~ /^gem\(.*\)/ }
406
+ end
407
+
408
+ def gem_build_conflicts
409
+ build_conflicts.select {|r| r =~ /^gem\(.*\)/ }
410
+ end
411
+
412
+ def has_gem_build_requires?
413
+ gem_build_requires.any?
414
+ end
415
+
416
+ def has_gem_build_conflicts?
417
+ gem_build_conflicts.any?
418
+ end
419
+
420
+ def source
421
+ @source ||= space&.main_source || sources.find {|source_in| pre_name == source_in.name }
422
+ end
423
+
424
+ def sources
425
+ @sources ||=
426
+ state_sources.reduce(valid_sources) do |res, source_in|
427
+ ignore = ignored_names.any? { |x| x === source_in.name }
428
+
429
+ ignore || res.find { |x| Name.parse(x.name) == Name.parse(source_in.name) } ? res : res | [ source_in ]
430
+ end
431
+ end
432
+
433
+ def valid_secondaries
434
+ @valid_secondaries ||= secondaries.select do |s|
435
+ s.source&.source_file
436
+ end
437
+ end
438
+
439
+ protected
440
+
441
+ def ruby_build
442
+ @ruby_build ||= variables.ruby_build&.split(/\s+/) || []
443
+ end
444
+
445
+ def _versioned_gem_list value_in
446
+ dep_list = dep_list_intersect(value_in.to_os, available_gem_ranges, gem_versionings)
447
+
448
+ dep_list.select do |n, dep_in|
449
+ dependencies.select { |dep| dep.name == n.to_s }.any? do |dep|
450
+ dep_ver = combine_deps(dep, dep_in)
451
+ dep_ver.requirement.requirements != dep.requirement.expand.requirements
452
+ end
453
+ end
454
+ end
455
+
456
+ def _global_rename value_in
457
+ case source
458
+ when Baltix::Source::Gem
459
+ value_in.class.parse(value_in, prefix: value_in.class.default_prefix)
460
+ when Baltix::Source::Gemfile, Baltix::Source::Rakefile
461
+ value_in.class.parse(value_in, prefix: nil, kind: "app", name: value_in.original_fullname)
462
+ else
463
+ value_in
464
+ end
465
+ end
466
+
467
+ def _gem_versionings_with_use value_in
468
+ dep_list_merge(_gem_versionings(value_in), use_gem_version_list)
469
+ end
470
+
471
+ def _ruby_alias_names value_in
472
+ @ruby_alias_names ||= (value_in || []) | ruby_build.reduce([]) do |res, line|
473
+ case line
474
+ when /--use=(.*)/
475
+ res << [ $1 ]
476
+ when /--alias=(.*)/
477
+ res.last << $1
478
+ end
479
+
480
+ res
481
+ end.map do |aliases|
482
+ aliases |
483
+ [ aliased_names, [ autoaliases ]].map do |a|
484
+ a.reject { |x| (x & aliases).blank? }
485
+ end.flatten
486
+ end
487
+ end
488
+
489
+ def autoaliases
490
+ @autoaliases =
491
+ [ secondaries.map do |sec|
492
+ sec.name.name
493
+ end, secondaries.map do |sec|
494
+ sec.name.support_name&.name
495
+ end ].transpose.select do |x|
496
+ x.compact.uniq.size > 1
497
+ end.flatten
498
+ end
499
+
500
+ def _ruby_alias_names_local value_in
501
+ return @ruby_alias_names_local if @ruby_alias_names_local
502
+
503
+ names =
504
+ if source.kind_of?(Baltix::Source::Gem)
505
+ [ source&.name, name&.name ]
506
+ else
507
+ [ source&.name, name&.fullname ]
508
+ end.compact.uniq
509
+
510
+ @ruby_alias_names_local = value_in | (names.size > 1 && [ names ] || [])
511
+ end
512
+
513
+ def _use_gem_version_list value_in
514
+ value_in && value_in.map do |name, v|
515
+ Gem::Dependency.new(name.to_s, Gem::Requirement.new(v))
516
+ end
517
+ end
518
+
519
+ def _secondaries value_in
520
+ names = value_in.map { |x| x.name }
521
+
522
+ # binding.pry
523
+ to_ignore = (names | [source&.name] | ignored_names).compact
524
+ secondaries = sources.reject do |source_in|
525
+ to_ignore.any? { |i| i === source_in.name }
526
+ end.map do |source|
527
+ sec = Secondary.new(source: source,
528
+ spec: self,
529
+ state: { context: context },
530
+ options: { name_prefix: name.prefix,
531
+ gem_versionings: gem_versionings,
532
+ available_gem_list: available_gem_list })
533
+
534
+ secondary_parts_for(sec, source)
535
+ end.concat(secondary_parts_for(self, source, )).flatten.uniq {|x| x.name.fullname }
536
+
537
+ # secondaries = secondaries.map do |sec|
538
+ # if presec = names.delete(sec.name)
539
+ # sub_sec = of_state(:secondaries).find do |osec|
540
+ # osec.name == presec
541
+ # end
542
+ #
543
+ # if sub_sec.is_a?(Secondary)
544
+ # sub_sec.resourced_from(sec)
545
+ # elsif sub_sec.is_a?(OpenStruct)
546
+ # #sec.state = sub_sec
547
+ # binding.pry
548
+ # sec
549
+ # end
550
+ # else
551
+ # sec
552
+ # end
553
+ # end
554
+ #
555
+ #binding.pry
556
+ secondaries =
557
+ names.reduce(secondaries) do |secs, an|
558
+ next secs if secs.find { |sec| sec.name == an }
559
+ sec = value_in.find { |sec| sec.name == an }
560
+
561
+ if sec.is_a?(Secondary)
562
+ secs | [sec]
563
+ elsif sec.is_a?(OpenStruct)
564
+ source = sources.find { |s| sec.name == s.name }
565
+ host = secs.find { |sec_in| sec_in.name.eql_by?(:name, sec.name) }
566
+
567
+ secs | [Secondary.new(spec: self,
568
+ kind: sec.name.kind,#an.kind
569
+ host: host,
570
+ state: sec,
571
+ source: source,
572
+ options: { name: sec.name,
573
+ gem_versionings: gem_versionings,
574
+ available_gem_list: available_gem_list })]
575
+ else
576
+ secs
577
+ end
578
+ end
579
+
580
+ #binding.pry
581
+ secondaries.select do |sec|
582
+ sec.kind != :devel || options.devel_dep_setup != :skip
583
+ end
584
+ end
585
+
586
+ def _build_dependencies value_in
587
+ deps_pre = value_in.map do |dep|
588
+ if !m = dep.match(/gem\((.*)\) ([>=<]+) ([\w\d\.\-]+)/)
589
+ dep
590
+ #Gem::Dependency.new(m[1], Gem::Requirement.new(["#{m[2]} #{m[3]}"]), :runtime)
591
+ end
592
+ end.compact | development_dependencies
593
+
594
+ dep_hash = deps_pre.group_by {|x|x.name}.map {|n, x| [n, x.reduce {|res, y| res.merge(y) } ] }.to_h
595
+ deps_all = secondaries.reduce(dep_hash.dup) do |res, x|
596
+ next res unless x.source# && !provide_names.any? {|y|x.name === y}
597
+
598
+ x.source.deps.reduce(res.dup) do |r, x|
599
+ r[x.name] = r[x.name] ? r[x.name].merge(x) : x
600
+
601
+ r
602
+ end
603
+ end.values
604
+
605
+ #TODO move fo filter options
606
+ provide_names = secondaries.filter_map { |x| x.source&.provide&.name }.uniq
607
+ filtered = replace_versioning(deps_all).reject do |dep|
608
+ if dep.is_a?(Gem::Dependency)
609
+ dep.type == :development && options.devel_dep_setup == :skip || provide_names.include?(dep.name)
610
+ end
611
+ end
612
+
613
+ reqs =
614
+ append_versioning(filtered).reject do |n_in|
615
+ n = n_in.is_a?(Gem::Dependency) && n_in.name || n_in
616
+ name.eql?(n, true)
617
+ end
618
+ end
619
+
620
+ def _build_dependencies_sort value_in
621
+ value_in.sort
622
+ end
623
+
624
+ def _filter_out_build_auto_requires value_in
625
+ value_in.reject do |value|
626
+ value.is_a?(String) and /^(#{Baltix::Spec::Rpm::Name::PREFICES.join('|')})[\-(]/ =~ value
627
+ end
628
+ end
629
+
630
+ def _build_requires value_in
631
+ render_deps(build_dependencies) | value_in
632
+ end
633
+
634
+ def _build_conflicts value_in
635
+ render_deps(build_dependencies, :negate)
636
+ end
637
+
638
+ def _vcs value_in
639
+ pre = URL_MATCHER.reduce(value_in) do |res, (rule, e)|
640
+ res || uri && (match = uri.match(rule)) && e[match] || nil
641
+ end
642
+ vcs = /github.com/ =~ pre.to_s && pre.gsub(/http:/, "https:") || pre
643
+
644
+ vcs && "#{vcs}#{/\.git/ !~ vcs && ".git" || ""}".downcase || nil
645
+ end
646
+
647
+ def _source_files value_in
648
+ source_files = value_in.dup
649
+ defaults = of_default(:source_files)[:"0"]
650
+
651
+ source_files[:"0"] = defaults if source_files[:"0"] != defaults
652
+
653
+ source_files
654
+ end
655
+
656
+ def _build_pre_requires value_in
657
+ build_pre_requires = value_in.dup || []
658
+ stated_name = of_state(:name)
659
+
660
+ if stated_name && stated_name.prefix != name.prefix
661
+ default = of_default(:build_pre_requires)[0]
662
+
663
+ build_pre_requires.unshift(default) unless build_pre_requires.include?(default)
664
+ end
665
+
666
+ build_pre_requires
667
+ end
668
+
669
+ def _licenses value_in
670
+ list = sources.map do |source|
671
+ source.licenses
672
+ end.flatten.uniq
673
+
674
+ !list.blank? && list || value_in.blank? && ["Unlicense"] || value_in
675
+ end
676
+
677
+ def state_changed?
678
+ @state_changed = STATE_CHANGE_NAMES.any? do |property|
679
+ if property == "secondary"
680
+ [ of_state(property), self.send(property) ].transpose.any? do |(first, second)|
681
+ first.name != second.name
682
+ end
683
+ else
684
+ of_state(property) != self.send(property)
685
+ end
686
+ #
687
+ # when String, Name, Gem::Version, NilClass,
688
+ # binding.prya
689
+ # when Array
690
+ # binding.pry
691
+ # of_state(property) == self.send(property)
692
+ # when OpenStruct
693
+ # binding.pry
694
+ # of_state(property) == self.send(property)
695
+ # else
696
+ # binding.pry
697
+ # end
698
+ #
699
+ # true
700
+ end
701
+ end
702
+
703
+ def _changes value_in
704
+ new_change =
705
+ if of_state(:version)
706
+ if self.version != of_state(:version)
707
+ # TODO move to i18n and settings file
708
+ previous_version = of_state(:version)
709
+ version = self.version
710
+ description = t("spec.rpm.change.upgrade", binding: binding)
711
+ release = "alt1"
712
+ elsif state_changed?
713
+ version = self.version
714
+ description = t("spec.rpm.change.fix", binding: binding)
715
+ release_version_bump =
716
+ # TODO suffix
717
+ /alt(?<release_version>.*)/ =~ of_state(:release)
718
+ release_version_bump =
719
+ if release_version && release_version.split(".").size > 1
720
+ Gem::Version.new(release_version).bump.to_s
721
+ elsif release_version
722
+ release_version + '.1'
723
+ else
724
+ "1"
725
+ end
726
+ release = "alt" + release_version_bump
727
+ end
728
+
729
+ packager_name = options.maintainer_name || packager.name
730
+ packager_email = options.maintainer_email || packager.email
731
+ OpenStruct.new(
732
+ date: Date.today.strftime("%a %b %d %Y"),
733
+ author: packager_name,
734
+ email: packager_email,
735
+ epoch: epoch,
736
+ version: version,
737
+ release: release,
738
+ description: description
739
+ )
740
+ end
741
+
742
+ value_in | [ new_change ].compact
743
+ end
744
+
745
+ def _release value_in
746
+ changes.last.release
747
+ end
748
+
749
+ def _rake_build_tasks value_in
750
+ /--pre=(?<list>[^\s]*)/ =~ %w(context __macros ruby_build).reduce(state) {|r, a| r&.[](a) }
751
+
752
+ value_in.split(",") | (of_state(:ruby_on_build_rake_tasks) || list || "").split(",")
753
+ end
754
+
755
+ def secondary_parts_for object, source
756
+ context_in = { context: context }.to_os
757
+ secondaries_in = of_state(:secondaries) || []
758
+ a=
759
+ PARTS.map do |(kind, func)|
760
+ next object.is_a?(Secondary) && object || nil if !func
761
+
762
+ if object.send(func)
763
+ # secondaries = secondaries.map do |sec|
764
+ # if presec = names.delete(sec.name)
765
+ # sub_sec = of_state(:secondaries).find do |osec|
766
+ # osec.name == presec
767
+ # end
768
+ #
769
+ # if sub_sec.is_a?(Secondary)
770
+ # sub_sec.resourced_from(sec)
771
+ # elsif sub_sec.is_a?(OpenStruct)
772
+ # #sec.state = sub_sec
773
+ # binding.pry
774
+ # sec
775
+ # end
776
+ # else
777
+ # sec
778
+ # end
779
+ # end
780
+ presec =
781
+ Secondary.new(source: source,
782
+ spec: self,
783
+ kind: kind,
784
+ host: object,
785
+ state: context_in,
786
+ options: { name_prefix: kind != :exec && name.prefix || nil,
787
+ gem_versionings: gem_versionings,
788
+ available_gem_list: available_gem_list })
789
+
790
+ state = secondaries_in.find { |osec| osec.name == presec }
791
+ presec.state = state if state
792
+
793
+ presec
794
+ end
795
+ end.compact
796
+ a
797
+ end
798
+
799
+ def initialize state: {}, options: {}, space: nil
800
+ @state = state
801
+ @options = options.to_os.merge(space.options)
802
+ @space = space || raise
803
+ end
804
+
805
+ class << self
806
+ def match? source_in
807
+ Parser.match?(source_in)
808
+ end
809
+
810
+ def parse source_in, options = {}.to_os, space = nil
811
+ state = Parser.new.parse(source_in, options)
812
+ space ||= options[:space]
813
+
814
+ Baltix::Spec::Rpm.new(state: state, options: options, space: space)
815
+ end
816
+
817
+ def render space, spec_in = nil
818
+ spec = space.spec || self.new(space: space)
819
+ spec.render(spec_in)
820
+ end
821
+ end
822
+ end