ipynbdiff 0.4.1 → 0.4.4

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 97969c0adb99db01eecef0831de1cbdb6eb1d2bfc58233195c76d475c8c4a97f
4
- data.tar.gz: e04aa8f6b704f85d539eb6b59021f67ad3ca1c032a8fd3051115545828ad2c67
3
+ metadata.gz: ef1021a6b462ff49958069aea089dabfacd7ded6858bfc49c581dfcc03330405
4
+ data.tar.gz: 93ecedada6270a3f217349ef073b8f52950793e2f2197d2a0ca3254a5c2acd02
5
5
  SHA512:
6
- metadata.gz: 9699f6249f6c47df87d0854069da21a484a91ef5974cd58570660e48bee7cadda633c7497396875e21d83221b00eaa8b8eb7d1e502340b0dec78718e7735d8b0
7
- data.tar.gz: 63a1153092296010189a76dc3c9eadb6cf421603b6199189a9d8681048820fc607123aa41a65c08169a8497e7a28795a0325f790fd792105374268d0996e5e0a
6
+ metadata.gz: 29cedcb6c846d5d320425e9edf0f5f1a30bbbcdbcfaeb648b6568a6c884d60120c40926a8b30632eeff7d5892654c8b0ebe0433e9a8f03d14d2b8e6ad407ce4d
7
+ data.tar.gz: 85b7b9e9b3390f1484426bdb75143aebbf1f7bd2083b0c939df7d4e1e83a43f9346231c25f925ef9187ce54612ab7d202327f197c0cdb8916457913d226c9807
data/.gitlab-ci.yml CHANGED
@@ -1,42 +1,43 @@
1
+ # You can override the included template(s) by including variable overrides
2
+ # SAST customization: https://docs.gitlab.com/ee/user/application_security/sast/#customizing-the-sast-settings
3
+ # Secret Detection customization: https://docs.gitlab.com/ee/user/application_security/secret_detection/#customizing-settings
4
+ # Dependency Scanning customization: https://docs.gitlab.com/ee/user/application_security/dependency_scanning/#customizing-the-dependency-scanning-settings
5
+ # Note that environment variables can be set in several places
6
+ # See https://docs.gitlab.com/ee/ci/variables/#cicd-variable-precedence
1
7
  image: ruby:2.7
2
-
3
8
  stages:
4
- - test
5
- - build
6
- - rubygems
7
-
9
+ - test
10
+ - build
11
+ - rubygems
8
12
  specs:
9
13
  stage: test
10
14
  script:
11
- - bundle install
12
- - bundle exec rspec
13
-
15
+ - bundle install
16
+ - bundle exec rspec
14
17
  build-gem:
15
18
  stage: build
16
19
  script:
17
- - bundle install
18
- - cat .VERSION.TMPL | sed s/GEM_VERSION/0.0.0/ > lib/version.rb
19
- - gem build ipynbdiff.gemspec
20
+ - bundle install
21
+ - cat .VERSION.TMPL | sed s/GEM_VERSION/0.0.0/ > lib/version.rb
22
+ - gem build ipynbdiff.gemspec
20
23
  artifacts:
21
24
  paths:
22
25
  - ipynbdiff-0.0.0.gem
23
26
  needs:
24
- - specs
25
-
27
+ - specs
26
28
  deploy-gem:
27
29
  stage: rubygems
28
30
  script:
29
- - bundle install
30
- - cat .VERSION.TMPL | sed s/GEM_VERSION/$CI_COMMIT_TAG/ > lib/version.rb
31
- - gem build ipynbdiff.gemspec
32
- - gem push ipynbdiff-$CI_COMMIT_TAG.gem
31
+ - bundle install
32
+ - cat .VERSION.TMPL | sed s/GEM_VERSION/$CI_COMMIT_TAG/ > lib/version.rb
33
+ - gem build ipynbdiff.gemspec
34
+ - gem push ipynbdiff-$CI_COMMIT_TAG.gem
33
35
  only:
34
- - tags
36
+ - tags
35
37
  except:
36
- - branches
37
- needs:
38
- - build-gem
38
+ - branches
39
+ needs:
40
+ - build-gem
39
41
  when: manual
40
-
41
-
42
-
42
+ include:
43
+ - template: Security/Dependency-Scanning.gitlab-ci.yml
data/ipynbdiff.gemspec CHANGED
@@ -1,6 +1,9 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative 'lib/version'
3
+ lib = File.expand_path('lib/..', __dir__)
4
+ $LOAD_PATH.unshift lib unless $LOAD_PATH.include?(lib)
5
+
6
+ require 'lib/version'
4
7
 
5
8
  Gem::Specification.new do |s|
6
9
  s.name = 'ipynbdiff'
@@ -7,8 +7,8 @@ module IpynbDiff
7
7
  # Creates a symbol map for a ipynb file (JSON format)
8
8
  class IpynbSymbolMap
9
9
  class << self
10
- def parse(notebook)
11
- IpynbSymbolMap.new(notebook).parse('')
10
+ def parse(notebook, objects_to_ignore = [])
11
+ IpynbSymbolMap.new(notebook, objects_to_ignore).parse('')
12
12
  end
13
13
  end
14
14
 
@@ -18,11 +18,12 @@ module IpynbDiff
18
18
 
19
19
  VALUE_STOPPERS = [',', '[', ']', '{', '}', *WHITESPACE_CHARS].freeze
20
20
 
21
- def initialize(notebook)
21
+ def initialize(notebook, objects_to_ignore = [])
22
22
  @chars = notebook.chars
23
23
  @current_line = 0
24
24
  @char_idx = 0
25
25
  @results = {}
26
+ @objects_to_ignore = objects_to_ignore
26
27
  end
27
28
 
28
29
  def parse(prefix = '.')
@@ -69,11 +70,7 @@ module IpynbDiff
69
70
  loop do
70
71
  break if skip_beginning('}')
71
72
 
72
- prop_name = parse_string
73
-
74
- new_prefix = "#{prefix}.#{prop_name}"
75
-
76
- add_result(new_prefix, current_line)
73
+ prop_name = parse_string(return_value: true)
77
74
 
78
75
  next_and_skip_whitespaces
79
76
 
@@ -81,24 +78,34 @@ module IpynbDiff
81
78
 
82
79
  next_and_skip_whitespaces
83
80
 
84
- parse(new_prefix)
81
+ if @objects_to_ignore.include? prop_name
82
+ skip
83
+ else
84
+ new_prefix = "#{prefix}.#{prop_name}"
85
+
86
+ add_result(new_prefix, current_line)
87
+
88
+ parse(new_prefix)
89
+ end
85
90
  end
86
91
  end
87
92
 
88
- def parse_string
89
- value = ''
90
- prev_char = nil
91
-
93
+ def parse_string(return_value: false)
92
94
  current_should_be '"'
95
+ init_idx = @char_idx
93
96
 
94
97
  loop do
95
98
  increment_char_index
96
- break if (c = current_char) == '"' && prev_char != '\\'
97
99
 
98
- value += (prev_char = c)
100
+ break if @char_idx > @chars.length
101
+
102
+ if current_char == '"' && prev_char != '\\'
103
+ init_idx += 1
104
+ break
105
+ end
99
106
  end
100
107
 
101
- value
108
+ @chars[init_idx...@char_idx].join if return_value
102
109
  end
103
110
 
104
111
  def add_result(key, line_number)
@@ -129,6 +136,10 @@ module IpynbDiff
129
136
  @chars[@char_idx]
130
137
  end
131
138
 
139
+ def prev_char
140
+ @chars[@char_idx - 1]
141
+ end
142
+
132
143
  def current_should_be(another_char)
133
144
  raise InvalidTokenError unless current_char == another_char
134
145
  end
@@ -137,6 +148,45 @@ module IpynbDiff
137
148
  @current_line += 1 if current_char == "\n"
138
149
  end
139
150
 
151
+ def skip
152
+ skip_whitespaces
153
+
154
+ if (c = current_char) == '"'
155
+ parse_string
156
+ elsif c == '['
157
+ skip_array
158
+ elsif c == '{'
159
+ skip_object
160
+ else
161
+ parse_value
162
+ end
163
+ end
164
+
165
+ def skip_array
166
+ loop do
167
+ break if skip_beginning(']')
168
+
169
+ skip
170
+ end
171
+ end
172
+
173
+ def skip_object
174
+
175
+ loop do
176
+ break if skip_beginning('}')
177
+
178
+ parse_string
179
+
180
+ next_and_skip_whitespaces
181
+
182
+ current_should_be ':'
183
+
184
+ next_and_skip_whitespaces
185
+
186
+ skip
187
+ end
188
+ end
189
+
140
190
  def skip_beginning(closing_char)
141
191
 
142
192
  check_for_new_line
@@ -8,7 +8,8 @@ module IpynbDiff
8
8
 
9
9
  ORDERED_KEYS = {
10
10
  'execute_result' => %w[image/png image/svg+xml image/jpeg text/markdown text/latex text/plain],
11
- 'display_data' => %w[image/png image/svg+xml image/jpeg text/markdown text/latex]
11
+ 'display_data' => %w[image/png image/svg+xml image/jpeg text/markdown text/latex],
12
+ 'stream' => %w[text]
12
13
  }.freeze
13
14
 
14
15
  def transform(output, symbol)
@@ -17,15 +18,17 @@ module IpynbDiff
17
18
  transform_error(output['traceback'], symbol / 'traceback')
18
19
  when 'execute_result', 'display_data'
19
20
  transform_non_error(ORDERED_KEYS[output_type], output['data'], symbol / 'data')
21
+ when 'stream'
22
+ transform_element('text', output['text'], symbol)
20
23
  end
21
24
 
22
- decorate_output(transformed, output, symbol) if transformed
25
+ transformed ? decorate_output(transformed, output, symbol) : []
23
26
  end
24
27
 
25
28
  def decorate_output(output_rows, output, symbol)
26
29
  [
27
30
  _,
28
- symbol, %(%%%% Output: #{output['output_type']}),
31
+ _(symbol, %(%%%% Output: #{output['output_type']})),
29
32
  _,
30
33
  *output_rows
31
34
  ]
@@ -34,7 +37,7 @@ module IpynbDiff
34
37
  def transform_error(traceback, symbol)
35
38
  traceback.map.with_index do |t, idx|
36
39
  t.split("\n").map do |l|
37
- [symbol / idx, l.gsub(/\[[0-9][0-9;]*m/, '').sub("\u001B", ' ').gsub(/\u001B/, '').rstrip]
40
+ _(symbol / idx, l.gsub(/\[[0-9][0-9;]*m/, '').sub("\u001B", ' ').gsub(/\u001B/, '').rstrip)
38
41
  end
39
42
  end
40
43
  end
@@ -52,13 +55,13 @@ module IpynbDiff
52
55
  transform_image(output_type, output_element, new_symbol)
53
56
  when 'image/svg+xml'
54
57
  transform_svg(output_element, new_symbol)
55
- when 'text/markdown', 'text/latex', 'text/plain'
58
+ when 'text/markdown', 'text/latex', 'text/plain', 'text'
56
59
  transform_text(output_element, new_symbol)
57
60
  end
58
61
  end
59
62
 
60
63
  def transform_image(image_type, image_content, symbol)
61
- [symbol, " ![](data:#{image_type};base64,#{image_content.gsub("\n", '')})"]
64
+ _(symbol, " ![](data:#{image_type};base64,#{image_content.gsub("\n", '')})")
62
65
  end
63
66
 
64
67
  def transform_svg(image_content, symbol)
@@ -66,7 +69,7 @@ module IpynbDiff
66
69
 
67
70
  single_line = lines.map(&:strip).join.gsub(/\s+/, ' ')
68
71
 
69
- [symbol, " ![](data:image/svg+xml;utf8,#{single_line})"]
72
+ _(symbol, " ![](data:image/svg+xml;utf8,#{single_line})")
70
73
  end
71
74
 
72
75
  def transform_text(text_content, symbol)
@@ -4,8 +4,8 @@ module IpynbDiff
4
4
  # Helper functions
5
5
  module SymbolizedMarkdownHelper
6
6
 
7
- def _(content = '')
8
- [nil, content]
7
+ def _(symbol = nil, content = '')
8
+ { symbol: symbol, content: content }
9
9
  end
10
10
 
11
11
  def array_if_not_array(thing)
@@ -14,9 +14,9 @@ module IpynbDiff
14
14
 
15
15
  def symbolize_array(symbol, content, &block)
16
16
  if content.is_a?(Array)
17
- content.map.with_index { |l, idx| [symbol / idx, block.call(l)] }
17
+ content.map.with_index { |l, idx| _(symbol / idx, block.call(l)) }
18
18
  else
19
- [symbol, content]
19
+ _(symbol, content)
20
20
  end
21
21
  end
22
22
  end
@@ -11,9 +11,9 @@ module IpynbDiff
11
11
 
12
12
  private
13
13
 
14
- def initialize(lines = [], symbols = [], symbol_map = {})
15
- @blocks = lines.zip(symbols).map do |line, symbol|
16
- { content: line, source_symbol: symbol, source_line: symbol && symbol_map[symbol] }
14
+ def initialize(lines = [], symbol_map = {})
15
+ @blocks = lines.map do |line|
16
+ { content: line[:content], source_symbol: (symbol = line[:symbol]), source_line: symbol && symbol_map[symbol] }
17
17
  end
18
18
  end
19
19
  end
data/lib/transformer.rb CHANGED
@@ -15,6 +15,7 @@ module IpynbDiff
15
15
  include SymbolizedMarkdownHelper
16
16
 
17
17
  @include_frontmatter = true
18
+ @objects_to_ignore = ['application/javascript', 'application/vnd.holoviews_load.v0+json']
18
19
 
19
20
  def initialize(include_frontmatter: true)
20
21
  @include_frontmatter = include_frontmatter
@@ -38,13 +39,7 @@ module IpynbDiff
38
39
  transformed = transform_document(notebook_json)
39
40
  symbol_map = IpynbSymbolMap.parse(notebook)
40
41
 
41
- symbols, lines = if transformed && !transformed.empty?
42
- transformed.partition.each_with_index { |_el, i| i.even? }
43
- else
44
- [[], []]
45
- end
46
-
47
- TransformedNotebook.new(lines, symbols, symbol_map)
42
+ TransformedNotebook.new(transformed, symbol_map)
48
43
  end
49
44
 
50
45
  def transform_document(notebook)
@@ -63,9 +58,9 @@ module IpynbDiff
63
58
  type = cell['cell_type'] || 'raw'
64
59
 
65
60
  [
66
- symbol, %(%% Cell type:#{type} id:#{cell['id']} tags:#{tags&.join(',')}),
61
+ _(symbol, %(%% Cell type:#{type} id:#{cell['id']} tags:#{tags&.join(',')})),
67
62
  _,
68
- *rows,
63
+ rows,
69
64
  _
70
65
  ]
71
66
  end
@@ -76,9 +71,9 @@ module IpynbDiff
76
71
 
77
72
  def transform_code_cell(cell, notebook, symbol)
78
73
  [
79
- symbol / 'source', %(``` #{notebook.dig('metadata', 'kernelspec', 'language') || ''}),
74
+ _(symbol / 'source', %(``` #{notebook.dig('metadata', 'kernelspec', 'language') || ''})),
80
75
  symbolize_array(symbol / 'source', cell['source'], &:rstrip),
81
- _('```'),
76
+ _(nil, '```'),
82
77
  cell['outputs'].map.with_index do |output, idx|
83
78
  @output_transformer.transform(output, symbol / ['outputs', idx])
84
79
  end
@@ -99,7 +94,7 @@ module IpynbDiff
99
94
  }
100
95
  }.to_yaml
101
96
 
102
- as_yaml.split("\n").map { |l| _(l) }.append(_('---'), _)
97
+ as_yaml.split("\n").map { |l| _(nil, l) }.append(_(nil, '---'), _)
103
98
  end
104
99
  end
105
100
  end
data/lib/version.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  # lib/emoticon/version.rb
2
2
 
3
3
  module IpynbDiff
4
- VERSION = "0.4.1"
4
+ VERSION = "0.4.4"
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ipynbdiff
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.1
4
+ version: 0.4.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Eduardo Bonet
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2022-01-27 00:00:00.000000000 Z
11
+ date: 2022-03-07 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: diffy