Class: Squared::Workspace::Project::Base

Inherits:
Object
  • Object
show all
Extended by:
Rake::DSL, Common::Task
Includes:
Rake::DSL, Shell, Common, System, Task
Defined in:
lib/squared/workspace/project/base.rb

Direct Known Subclasses

Git

Constant Summary collapse

SEM_VER =
/^(\d+)(\.)(\d+)(?:(\.)(\d+))?$/.freeze
0
@@tasks =
{}

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(name, path, workspace, group: nil, log: nil, common: true, **kwargs) ⇒ Base

Returns a new instance of Base.



52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
# File 'lib/squared/workspace/project/base.rb', line 52

def initialize(name, path, workspace, *, group: nil, log: nil, common: true, **kwargs)
  @name = name.to_s
  @path = workspace.root_path(path.to_s)
  @project = @path.basename.to_s
  @workspace = workspace
  @group = group&.to_s
  @depend = kwargs[:depend]
  @doc = kwargs[:doc]
  @test = kwargs[:test]
  @output = [kwargs[:run], nil]
  @copy = kwargs[:copy]
  @clean = kwargs[:clean]
  @warning = workspace.warning
  @theme = if !workspace.verbose
             {}
           elsif common
             workspace.theme
           else
             __get__(:theme)[:project][to_sym] ||= {}
           end
  log = { file: log } unless log.is_a?(::Hash)
  if (logfile = env('LOG_FILE')).nil? && (auto = env('LOG_AUTO'))
    logfile = case auto
              when 'y', 'year'
                "#{@name}-#{Date.today.year}.log"
              when 'm', 'month'
                "#{@name}-#{Date.today.strftime('%Y-%m')}.log"
              when 'd', 'day', '1'
                "#{@name}-#{Date.today}.log"
              end
  end
  if logfile ||= log[:file]
    logfile = Date.today.strftime(logfile)
    logfile = (dir = env('LOG_DIR')) ? Pathname.new(dir).join(logfile) : Pathname.new(logfile)
    begin
      logfile.realdirpath
    rescue StandardError => e
      logfile = nil
      warn e if @warning
    end
  end
  @log = Logger.new(logfile, progname: @name, level: env('LOG_LEVEL') || log[:level] || Logger::INFO)
end

Instance Attribute Details

#groupObject (readonly)

Returns the value of attribute group.



49
50
51
# File 'lib/squared/workspace/project/base.rb', line 49

def group
  @group
end

#logObject (readonly)

Returns the value of attribute log.



49
50
51
# File 'lib/squared/workspace/project/base.rb', line 49

def log
  @log
end

#nameObject (readonly)

Returns the value of attribute name.



49
50
51
# File 'lib/squared/workspace/project/base.rb', line 49

def name
  @name
end

#pathObject (readonly)

Returns the value of attribute path.



49
50
51
# File 'lib/squared/workspace/project/base.rb', line 49

def path
  @path
end

#projectObject (readonly)

Returns the value of attribute project.



49
50
51
# File 'lib/squared/workspace/project/base.rb', line 49

def project
  @project
end

#themeObject (readonly)

Returns the value of attribute theme.



49
50
51
# File 'lib/squared/workspace/project/base.rb', line 49

def theme
  @theme
end

#warningObject

Returns the value of attribute warning.



50
51
52
# File 'lib/squared/workspace/project/base.rb', line 50

def warning
  @warning
end

#workspaceObject (readonly)

Returns the value of attribute workspace.



49
50
51
# File 'lib/squared/workspace/project/base.rb', line 49

def workspace
  @workspace
end

Class Method Details

.as_path(val) ⇒ Object



28
29
30
31
32
33
34
35
# File 'lib/squared/workspace/project/base.rb', line 28

def as_path(val)
  case val
  when ::Pathname
    val
  when ::String
    Pathname.new(val)
  end
end

.populateObject



22
# File 'lib/squared/workspace/project/base.rb', line 22

def populate(*); end

.tasksObject



24
25
26
# File 'lib/squared/workspace/project/base.rb', line 24

def tasks
  [].freeze
end

.to_sObject



37
38
39
# File 'lib/squared/workspace/project/base.rb', line 37

def to_s
  super.to_s.match(/[^:]+$/)[0]
end

.to_symObject



41
42
43
# File 'lib/squared/workspace/project/base.rb', line 41

def to_sym
  to_s.downcase.to_sym
end

Instance Method Details

#base_path(*args) ⇒ Object



215
216
217
# File 'lib/squared/workspace/project/base.rb', line 215

def base_path(*args)
  path.join(*args)
end

#build(*args, sync: true) ⇒ Object



136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
# File 'lib/squared/workspace/project/base.rb', line 136

def build(*args, sync: true)
  if args.empty?
    cmd, opts = @output
    opts &&= shell_escape(opts)
  else
    cmd = args.shift
    opts = sanitize_args(*args)
  end
  if cmd
    if opts
      cmd = "#{cmd} #{opts}"
    elsif cmd.is_a?(::Array)
      cmd = cmd.join(' && ')
    end
    banner = verbose?
  else
    return unless respond_to?(:compose)

    cmd = compose(opts)
    banner = env('REPO_BUILD') == 'verbose'
  end
  run(cmd, exception: workspace.exception, banner: banner, sync: sync)
end

#build?Boolean

Returns:

  • (Boolean)


239
240
241
# File 'lib/squared/workspace/project/base.rb', line 239

def build?
  !!@output[0]
end

#cleanObject



186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
# File 'lib/squared/workspace/project/base.rb', line 186

def clean
  return unless @clean

  if @clean.is_a?(::String)
    run_s(@clean, sync: invoked_sync?('clean'))
  else
    @clean.each do |val|
      val = val.to_s
      if val =~ %r{[\\/]$}
        dir = Pathname.new(val)
        dir = base_path(dir) unless dir.absolute?
        next unless dir.directory?

        log.warn "rm -rf #{dir}"
        dir.rmtree(verbose: true)
      else
        files = val.include?('*') ? Dir[base_path(val)] : [base_path(val)]
        files.each do |file|
          begin
            File.delete(file) if File.file?(file)
          rescue StandardError => e
            log.error e
          end
        end
      end
    end
  end
end

#clean?Boolean

Returns:

  • (Boolean)


263
264
265
# File 'lib/squared/workspace/project/base.rb', line 263

def clean?
  !!@clean
end

#copyObject



174
175
176
# File 'lib/squared/workspace/project/base.rb', line 174

def copy(*)
  run_s(@copy, sync: invoked_sync?('copy'))
end

#copy?Boolean

Returns:

  • (Boolean)


259
260
261
# File 'lib/squared/workspace/project/base.rb', line 259

def copy?
  @copy.is_a?(::String)
end

#dependObject



170
171
172
# File 'lib/squared/workspace/project/base.rb', line 170

def depend(*)
  run(@depend, exception: workspace.exception, sync: invoked_sync?('depend')) if @depend
end

#depend?Boolean

Returns:

  • (Boolean)


247
248
249
# File 'lib/squared/workspace/project/base.rb', line 247

def depend?
  !!@depend
end

#docObject



178
179
180
# File 'lib/squared/workspace/project/base.rb', line 178

def doc
  build(@doc, sync: invoked_sync?('doc')) if @doc
end

#doc?Boolean

Returns:

  • (Boolean)


251
252
253
# File 'lib/squared/workspace/project/base.rb', line 251

def doc?
  !!@doc
end

#enabled?Boolean

Returns:

  • (Boolean)


231
232
233
# File 'lib/squared/workspace/project/base.rb', line 231

def enabled?
  path.directory? && !path.empty?
end

#has?(method) ⇒ Boolean

Returns:

  • (Boolean)


235
236
237
# File 'lib/squared/workspace/project/base.rb', line 235

def has?(method)
  respond_to?(m = :"#{method}?") && __send__(m)
end

#initialize_build(ref, **kwargs) ⇒ Object



96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
# File 'lib/squared/workspace/project/base.rb', line 96

def initialize_build(ref, **kwargs)
  initialize_script(ref)
  if (val = env('BUILD', strict: true))
    @output[0] = val
  elsif @script && @output[0] != false
    @output[0] ||= @script[:run]
  end
  @dev = kwargs.delete(:dev)
  if env('BUILD', suffix: 'DEV', equals: '0')
    @dev = false
  elsif env('BUILD', suffix: 'DEV')
    @dev = true
  elsif @dev.nil?
    @dev = workspace.dev?
  end
end

#initialize_script(ref) ⇒ Object



113
114
115
116
117
118
119
120
121
# File 'lib/squared/workspace/project/base.rb', line 113

def initialize_script(ref)
  return unless (script = workspace.script(group: group, ref: ref))

  @depend = script[:depend] if @depend.nil?
  @doc = script[:doc] if @doc.nil?
  @test = script[:test] if @test.nil?
  @clean = script[:clean] if @clean.nil?
  @script = script
end

#inspectObject



219
220
221
# File 'lib/squared/workspace/project/base.rb', line 219

def inspect
  "#<#{self.class}: #{name} => #{self}>"
end

#populateObject



123
124
125
126
127
128
129
130
131
132
133
134
# File 'lib/squared/workspace/project/base.rb', line 123

def populate(*)
  namespace name do
    workspace.series.each_key do |key|
      next unless Application::WORKSPACE_KEYS.include?(key) ? has?(key) : workspace.task_include?(self, key)

      desc message(name, key)
      task key do
        __send__(key)
      end
    end
  end
end

#refreshObject



160
161
162
163
164
165
166
167
168
# File 'lib/squared/workspace/project/base.rb', line 160

def refresh(*)
  build(sync: invoked_sync?('depend'))
  key = "#{name}:copy"
  if workspace.task_defined?(key)
    invoke key
  else
    copy
  end
end

#refresh?Boolean

Returns:

  • (Boolean)


243
244
245
# File 'lib/squared/workspace/project/base.rb', line 243

def refresh?
  build? && (copy? || workspace.task_defined?("#{name}:copy"))
end

#testObject



182
183
184
# File 'lib/squared/workspace/project/base.rb', line 182

def test
  build(@test, sync: invoked_sync?('test')) if @test
end

#test?Boolean

Returns:

  • (Boolean)


255
256
257
# File 'lib/squared/workspace/project/base.rb', line 255

def test?
  !!@test
end

#to_sObject



223
224
225
# File 'lib/squared/workspace/project/base.rb', line 223

def to_s
  path.to_s
end

#to_symObject



227
228
229
# File 'lib/squared/workspace/project/base.rb', line 227

def to_sym
  name.to_sym
end