lutaml 0.2.0 → 0.4.0

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: dd52cb5d4a4e29687299339e3cd9af05720f81348d5a307ae1d07bf2514bd022
4
- data.tar.gz: 373158747e92e76c14efd7bbfc6d42a9ecebe164ebb5d14f035840a85666ce5d
3
+ metadata.gz: 84bb179e752bc157f0de4a59ea8cf88e9bd1fe4430726dcefcf63269d12c86fb
4
+ data.tar.gz: a5f8917e80a33814b9cc6a9e3556b335da72fe05fd73e4d54dc294d1c4b6a27f
5
5
  SHA512:
6
- metadata.gz: ad0a113798e024375f25c0f580c09b8e17f1b8d8ea60ab1edc67dbfb5250ae9cb6151b44a4f6cd090159d177d08c40361c7b536a1832053f01a5784d580f91da
7
- data.tar.gz: 6f0e0043a0c0a240763c95d0041ff6ccb462fb81773ecc1f4c5d4dc376942fdebe39f6c9fc5c30df96e8a95a061147cfa2b139dda968aabd6161abeb216f7a66
6
+ metadata.gz: 64b11704d20aff55c53cb6b1d857d346a6e9016b84b091581372c38b100a3d21d499685550e8d5a8b132e4cc7de5e8da37c3efd14ae325d119a207a76fc0feea
7
+ data.tar.gz: f9800bc7e40536370807a3e4a3429d60dfa1f2fd728054adf6c9a8e73ba813b20bad80e22c85323309089eb41e1455806381513c139de1a99cc804ebb37378f2
@@ -0,0 +1,41 @@
1
+ name: macos
2
+
3
+ on:
4
+ push:
5
+ branches: [ master ]
6
+ pull_request:
7
+ paths-ignore:
8
+ - .github/workflows/ubuntu.yml
9
+ - .github/workflows/windows.yml
10
+
11
+ jobs:
12
+ test-macos:
13
+ name: Test on Ruby ${{ matrix.ruby }} macOS
14
+ runs-on: macos-latest
15
+ continue-on-error: ${{ matrix.experimental }}
16
+ strategy:
17
+ fail-fast: false
18
+ matrix:
19
+ ruby: [ '2.6', '2.5' ]
20
+ experimental: [false]
21
+ include:
22
+ - ruby: '2.7'
23
+ experimental: true
24
+ steps:
25
+ - uses: actions/checkout@master
26
+ - name: Install build tools
27
+ run: |
28
+ brew install automake libtool
29
+ - name: Use Ruby
30
+ uses: actions/setup-ruby@v1
31
+ with:
32
+ ruby-version: ${{ matrix.ruby }}
33
+ - name: Install Grpahviz macOS
34
+ run: brew install graphviz
35
+ - name: Update gems
36
+ run: |
37
+ sudo gem install bundler --force
38
+ bundle install --jobs 4 --retry 3
39
+ - name: Run specs
40
+ run: |
41
+ bundle exec rake
@@ -0,0 +1,40 @@
1
+ name: ubuntu
2
+
3
+ on:
4
+ push:
5
+ branches: [ master ]
6
+ tags:
7
+ - '*'
8
+ pull_request:
9
+ paths-ignore:
10
+ - .github/workflows/macos.yml
11
+ - .github/workflows/windows.yml
12
+
13
+ jobs:
14
+ test-linux:
15
+ name: Test on Ruby ${{ matrix.ruby }} Ubuntu
16
+ runs-on: ubuntu-latest
17
+ continue-on-error: ${{ matrix.experimental }}
18
+ strategy:
19
+ fail-fast: false
20
+ matrix:
21
+ ruby: [ '2.6', '2.5' ]
22
+ experimental: [false]
23
+ include:
24
+ - ruby: '2.7'
25
+ experimental: true
26
+ steps:
27
+ - uses: actions/checkout@master
28
+ - name: Use Ruby
29
+ uses: actions/setup-ruby@v1
30
+ with:
31
+ ruby-version: ${{ matrix.ruby }}
32
+ - name: Install Grpahviz Ubuntu
33
+ run: sudo apt-get install graphviz
34
+ - name: Update gems
35
+ run: |
36
+ gem install bundler
37
+ bundle install --jobs 4 --retry 3
38
+ - name: Run specs
39
+ run: |
40
+ bundle exec rake
@@ -0,0 +1,48 @@
1
+ name: windows
2
+
3
+ on:
4
+ push:
5
+ branches: [ master ]
6
+ pull_request:
7
+ paths-ignore:
8
+ - .github/workflows/macos.yml
9
+ - .github/workflows/ubuntu.yml
10
+
11
+ jobs:
12
+ test-windows:
13
+ name: Test on Ruby ${{ matrix.ruby }} Windows
14
+ runs-on: windows-latest
15
+ continue-on-error: ${{ matrix.experimental }}
16
+ strategy:
17
+ fail-fast: false
18
+ matrix:
19
+ ruby: [ '2.6', '2.5' ]
20
+ experimental: [false]
21
+ # Does not supported yet:
22
+ # Ruby (< 2.7.dev, >= 2.3), which is required by gem 'nokogiri (~> 1.10)', is not
23
+ # available in the local ruby installation
24
+ # include:
25
+ # - ruby: '2.7'
26
+ # experimental: true
27
+ steps:
28
+ - uses: actions/checkout@master
29
+ - name: Use Ruby
30
+ uses: actions/setup-ruby@v1
31
+ with:
32
+ ruby-version: ${{ matrix.ruby }}
33
+ - name: Install graphviz
34
+ uses: nick-invision/retry@v1
35
+ with:
36
+ polling_interval_seconds: 5
37
+ timeout_minutes: 5
38
+ max_attempts: 3
39
+ command: choco install --no-progress graphviz --version 2.38.0.20190211
40
+ - name: Update gems
41
+ shell: pwsh
42
+ run: |
43
+ gem install bundler
44
+ bundle config --local path vendor/bundle
45
+ bundle install --jobs 4 --retry 3
46
+ - name: Run specs
47
+ run: |
48
+ bundle exec rake
data/Gemfile CHANGED
@@ -2,6 +2,3 @@ source "https://rubygems.org"
2
2
 
3
3
  # Specify your gem's dependencies in lutaml.gemspec
4
4
  gemspec
5
-
6
- gem "rake", "~> 12.0"
7
- gem "rspec", "~> 3.0"
@@ -0,0 +1,72 @@
1
+ = Lutaml
2
+
3
+ == Functionality
4
+
5
+ Entry point for lutaml extensions.
6
+
7
+ === Installation
8
+
9
+ With bundler:
10
+
11
+ [source,ruby]
12
+ ----
13
+ # Gemfile
14
+ gem "lutaml"
15
+ ----
16
+
17
+ Then in console:
18
+
19
+ [source,console]
20
+ ----
21
+ $ bundle
22
+ ----
23
+
24
+ With RubyGems:
25
+
26
+ [source,console]
27
+ ----
28
+ $ gem install lutaml
29
+ ----
30
+
31
+ === Usage
32
+
33
+ == From ruby
34
+
35
+ In order to parse files supported by lutaml extensions, use Lutaml::Parser.parse method.
36
+
37
+ [source,ruby]
38
+ ----
39
+ # example.exp is an EXPRESS repository file
40
+ Lutaml::Parser.parse(File.new("example.exp")) # will produce Lutaml::LutamlPath::DocumentWrapper object with serialized express repository
41
+ ----
42
+
43
+ == With cli tool
44
+
45
+ There is a cli tool available for parsing lutaml/exp files(also yaml datastruct files are supported).
46
+
47
+ [source,bash]
48
+ ----
49
+ # Will generate `test.dot` file in the current directory
50
+ $: lutaml -o . test.lutaml
51
+
52
+ # Will generate `test.png` file in the `assets` directory
53
+ $: lutaml -o assets -t png test.lutaml
54
+ ----
55
+
56
+ For additional info refer to `lutaml --help output`
57
+
58
+
59
+ == Development
60
+
61
+ After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake spec` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
62
+
63
+ To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
64
+
65
+ ## Contributing
66
+
67
+ Bug reports and pull requests are welcome on GitHub at https://github.com/[USERNAME]/lutaml. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the [code of conduct](https://github.com/[USERNAME]/lutaml/blob/master/CODE_OF_CONDUCT.md).
68
+
69
+
70
+ == Code of Conduct
71
+
72
+ Everyone interacting in the Lutaml::Uml project's codebases, issue trackers, chat rooms and mailing lists is expected to follow the [code of conduct](https://github.com/[USERNAME]/lutaml/blob/master/CODE_OF_CONDUCT.md).
@@ -0,0 +1,22 @@
1
+ #!/usr/bin/env ruby
2
+ # encoding: UTF-8
3
+ # frozen_string_literal: true
4
+
5
+ # resolve bin path, ignoring symlinks
6
+ require "pathname"
7
+ bin_file = Pathname.new(__FILE__).realpath
8
+
9
+ # add self to libpath
10
+ $:.unshift File.expand_path("../../lib", bin_file)
11
+
12
+ # Fixes https://github.com/rubygems/rubygems/issues/1420
13
+ require "rubygems/specification"
14
+
15
+ class Gem::Specification
16
+ def this; self; end
17
+ end
18
+
19
+ require "lutaml"
20
+ require "lutaml/command_line"
21
+
22
+ Lutaml::CommandLine.run(ARGV.dup, STDOUT)
@@ -1,7 +1,5 @@
1
1
  require "lutaml/version"
2
- require "lutaml/lutaml_path/document_wrapper"
2
+ require "lutaml/parser"
3
3
 
4
4
  module Lutaml
5
- class Error < StandardError; end
6
- # Your code goes here...
7
5
  end
@@ -0,0 +1,261 @@
1
+ require "optparse"
2
+ require "pathname"
3
+ require "lutaml/formatter"
4
+ require "lutaml/uml/has_attributes"
5
+ require "lutaml/uml/parsers/attribute"
6
+ require "lutaml/uml/parsers/dsl"
7
+ require "lutaml/uml/parsers/yaml"
8
+
9
+ module Lutaml
10
+ class CommandLine
11
+ class Error < StandardError; end
12
+ class FileError < Error; end
13
+ class NotSupportedInputFormat < Error; end
14
+
15
+ include ::Lutaml::Uml::HasAttributes
16
+
17
+ SUPPORTED_FORMATS = %w[yaml lutaml exp].freeze
18
+ DEFAULT_INPUT_FORMAT = "lutaml".freeze
19
+
20
+ def self.run(args, out_object, attributes = {})
21
+ new(attributes, out_object).run(args)
22
+ end
23
+
24
+ def initialize(attributes = {}, out_object = STDOUT)
25
+ @formatter = ::Lutaml::Formatter::Graphviz.new
26
+ @verbose = false
27
+ @option_parser = OptionParser.new
28
+ @out_object = out_object
29
+
30
+ setup_parser_options
31
+
32
+ # rubocop:disable Rails/ActiveRecordAliases
33
+ update_attributes(attributes)
34
+ # rubocop:enable Rails/ActiveRecordAliases
35
+ end
36
+
37
+ def output_path=(value)
38
+ @output_path = determine_output_path_value(value)
39
+ end
40
+
41
+ def determine_output_path_value(value)
42
+ unless value.nil? || @output_path = value.is_a?(Pathname)
43
+ return Pathname.new(value.to_s)
44
+ end
45
+
46
+ value
47
+ end
48
+
49
+ def paths=(values)
50
+ @paths = values.to_a.map { |path| Pathname.new(path) }
51
+ end
52
+
53
+ def formatter=(value)
54
+ value = value.to_s.strip.downcase.to_sym
55
+ value = Lutaml::Uml::Formatter.find_by(name: value)
56
+ raise Error, "Formatter not found: #{value}" if value.nil?
57
+
58
+ @formatter = value
59
+ end
60
+
61
+ def input_format=(value)
62
+ if value.nil?
63
+ @input_format = DEFAULT_INPUT_FORMAT
64
+ return
65
+ end
66
+
67
+ @input_format = SUPPORTED_FORMATS.detect { |n| n == value }
68
+ raise(NotSupportedInputFormat, value) if @input_format.nil?
69
+ end
70
+
71
+ def run(original_args)
72
+ args = original_args.dup
73
+ @option_parser.parse!(args) rescue nil
74
+ @paths = args
75
+ @formatter.type = @type
76
+
77
+ if @output_path&.file? && @paths.length > 1
78
+ raise Error,
79
+ 'Output path must be a directory \
80
+ if multiple input files are given'
81
+ end
82
+
83
+ @paths.each do |input_path_string|
84
+ input_path = Pathname.new(input_path_string)
85
+ unless input_path.exist?
86
+ raise FileError, "File does not exist: #{input_path}"
87
+ end
88
+
89
+ document = Lutaml::Parser
90
+ .parse_into_document(File.new(input_path), @input_format)
91
+ result = @formatter.format(document)
92
+
93
+ if @output_path
94
+ output_path = @output_path
95
+ if output_path.directory?
96
+ output_path = output_path.join(input_path
97
+ .basename(".*").to_s +
98
+ ".#{@formatter.type}")
99
+ end
100
+
101
+ output_path.open("w+") { |file| file.write(result) }
102
+ else
103
+ @out_object.puts(result)
104
+ end
105
+ end
106
+ end
107
+
108
+ protected
109
+
110
+ def text_bold(body = nil)
111
+ text_effect(1, body)
112
+ end
113
+
114
+ def text_italic(body = nil)
115
+ text_effect(3, body)
116
+ end
117
+
118
+ def text_bold_italic(body = nil)
119
+ text_bold(text_italic(body))
120
+ end
121
+
122
+ def text_underline(body = nil)
123
+ text_effect(4, body)
124
+ end
125
+
126
+ def text_effect(num, body = nil)
127
+ result = "\e[#{num}m"
128
+ result << "#{body}#{text_reset}" unless body.nil?
129
+
130
+ result
131
+ end
132
+
133
+ def text_reset
134
+ "\e[0m"
135
+ end
136
+
137
+ def setup_parser_options
138
+ @option_parser.banner = ""
139
+ format_desc = "The output formatter (Default: '#{@formatter.name}')"
140
+ @option_parser
141
+ .on("-f",
142
+ "--formatter VALUE",
143
+ format_desc) do |value|
144
+ @formatter = value
145
+ end
146
+ @option_parser
147
+ .on("-t", "--type VALUE", "The output format type") do |value|
148
+ @type = value
149
+ end
150
+ @option_parser
151
+ .on("-o", "--output VALUE", "The output path") do |value|
152
+ @output_path = Pathname.new(value)
153
+ end
154
+ @option_parser
155
+ .on("-i", "--input-format VALUE", "The input format") do |value|
156
+ @input_format = value
157
+ end
158
+ @option_parser
159
+ .on("-h", "--help", "Prints this help") do
160
+ print_help
161
+ exit
162
+ end
163
+ @option_parser.on("-g", "--graph VALUE") do |value|
164
+ Parsers::Attribute.parse(value).each do |key, attr_value|
165
+ @formatter.graph[key] = attr_value
166
+ end
167
+ end
168
+
169
+ @option_parser.on("-e", "--edge VALUE") do |value|
170
+ Parsers::Attribute.parse(value).each do |key, attr_value|
171
+ @formatter.edge[key] = attr_value
172
+ end
173
+ end
174
+
175
+ @option_parser.on("-n", "--node VALUE") do |value|
176
+ Parsers::Attribute.parse(value).each do |key, attr_value|
177
+ @formatter.node[key] = attr_value
178
+ end
179
+ end
180
+
181
+ @option_parser.on("-a", "--all VALUE") do |value|
182
+ Parsers::Attribute.parse(value).each do |key, attr_value|
183
+ @formatter.graph[key] = attr_value
184
+ @formatter.edge[key] = attr_value
185
+ @formatter.node[key] = attr_value
186
+ end
187
+ end
188
+ end
189
+
190
+ def print_help
191
+ @out_object.puts <<~HELP
192
+ #{text_bold('Usage:')} lutaml [options] PATHS
193
+
194
+ #{text_bold('Overview:')} Generate output from Supplied language files if supported
195
+
196
+ #{text_bold('Options:')}
197
+ #{@option_parser}
198
+ #{text_bold('Paths:')}
199
+
200
+ LUTAML can accept multiple paths for parsing for easier batch processing.
201
+
202
+ The location of the output by default is standard output.
203
+
204
+ The output can be directed to a path with #{text_bold_italic('--output')}, which can be a file or a directory.
205
+ If the output path is a directory, then the filename will be the same as the input filename,
206
+ with it's file extension substituted with the #{text_bold_italic('--type')}.
207
+
208
+ #{text_underline('Examples')}
209
+
210
+ `lutaml project.lutaml`
211
+
212
+ Produces DOT notation, sent to standard output
213
+
214
+ `lutaml -o . project.lutaml`
215
+
216
+ Produces DOT notation, written to #{text_italic('./project.dot')}
217
+
218
+ `lutaml -o ./diagram.dot project.lutaml`
219
+
220
+ Produces DOT notation, written to #{text_italic('./diagram.dot')}
221
+
222
+ `lutaml -o ./diagram.png project.lutaml`
223
+
224
+ Produces PNG image, written to #{text_italic('./diagram.png')}
225
+
226
+ `lutaml -t png -o . project.lutaml`
227
+
228
+ Produces PNG image, written to #{text_italic('./project.png')}
229
+
230
+ `lutaml -t png -o . project.lutaml core_ext.lutaml`
231
+
232
+ Produces PNG images, written to #{text_italic('./project.png')} and #{text_italic('./core_ext.png')}
233
+
234
+ #{text_bold('Inputs:')}
235
+
236
+ #{text_underline('Lutaml')}
237
+
238
+ Lutaml dsl syntax files, supports diagram generation(image or dot files) with Graphviz
239
+
240
+ #{text_bold('Formatters:')}
241
+
242
+ #{text_underline('Graphviz')}
243
+
244
+ Generates DOT notation and can use the DOT notation to generate any format Graphviz can produce.
245
+
246
+ The output format is based on #{text_bold_italic('--type')}, which by default is "dot".
247
+ If #{text_bold_italic('--type')} is not given and #{text_bold_italic('--output')} is, the file extension of the #{text_bold_italic('--output')} path will be used.
248
+
249
+ Valid types/extensions are: #{Lutaml::Formatter::Graphviz::VALID_TYPES.join(', ')}
250
+
251
+ #{text_bold('Options:')}
252
+
253
+ -g, --graph VALUE The graph attributes
254
+ -e, --edge VALUE The edge attributes
255
+ -n, --node VALUE The node attributes
256
+ -a, --all VALUE Set attributes for graph, edge, and node
257
+
258
+ HELP
259
+ end
260
+ end
261
+ end