ipynbdiff 0.4.4 → 0.4.7

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: ef1021a6b462ff49958069aea089dabfacd7ded6858bfc49c581dfcc03330405
4
- data.tar.gz: 93ecedada6270a3f217349ef073b8f52950793e2f2197d2a0ca3254a5c2acd02
3
+ metadata.gz: '09eee5bd0bb92f76cdabc67bd9b4ac1050756f952f9b5a3b91aaef984f860b87'
4
+ data.tar.gz: d89a1289023f1c44af159847a91f9139746a9c0846de169494f6438917754ca4
5
5
  SHA512:
6
- metadata.gz: 29cedcb6c846d5d320425e9edf0f5f1a30bbbcdbcfaeb648b6568a6c884d60120c40926a8b30632eeff7d5892654c8b0ebe0433e9a8f03d14d2b8e6ad407ce4d
7
- data.tar.gz: 85b7b9e9b3390f1484426bdb75143aebbf1f7bd2083b0c939df7d4e1e83a43f9346231c25f925ef9187ce54612ab7d202327f197c0cdb8916457913d226c9807
6
+ metadata.gz: 24b0b3fa46237a5b2fff8ef253b1dc2b90d5c8650c406097dd86e525e3e8bd5d89568b9280897d85c88444eb993ce3f490b15b0c741dd57dbea6e227dce2abea
7
+ data.tar.gz: a61bedd1f3b227f1b06dc97ed40ba19136fe4b157b9c0767887bbf22ee036bbbdfb21db3311c4b07a0e7ba39310f4cf8abd37dc8e7973c2035462478428bdd75
data/README.md CHANGED
@@ -1,19 +1,18 @@
1
1
  # IpynbDiff: Better diff for Jupyter Notebooks
2
2
 
3
- This is a simple diff tool that cleans up jupyter notebooks, transforming each [notebook](example/1/from.ipynb)
3
+ This is a simple diff tool that cleans up Jupyter notebooks, transforming each [notebook](example/1/from.ipynb)
4
4
  into a [readable markdown file](example/1/from_html.md), keeping the output of cells, and running the
5
5
  diff after. Markdowns are generated using an opinionated Jupyter to Markdown conversion. This means
6
6
  that the entire file is readable on the diff.
7
7
 
8
8
  The result are diffs that are much easier to read:
9
9
 
10
- | Diff | | IpynbDiff |
11
- | ------ | ------ |
12
- | [Here](example/diff.txt) | [Here](example/ipynbdiff_percent.txt) |
13
- | ![](example/img/diff.png) | ![](example/img/ipynbdiff_percent.png) |
10
+ | Diff | IpynbDiff |
11
+ | ----------------------------------- | ----------------------------------------------------- |
12
+ | [Diff text](example/diff.txt) | [IpynbDiff text](example/ipynbdiff_percent.txt) |
13
+ | ![Diff image](example/img/diff.png) | ![IpynbDiff image](example/img/ipynbdiff_percent.png) |
14
14
 
15
-
16
- This started as a port of This is a port of [ipynbdiff](https://gitlab.com/gitlab-org/incubation-engineering/mlops/ipynbdiff),
15
+ This started as a port of [ipynbdiff](https://gitlab.com/gitlab-org/incubation-engineering/mlops/poc/ipynbdiff),
17
16
  but now has extended functionality although not working as git driver.
18
17
 
19
18
  ## Usage
@@ -27,6 +27,8 @@ module IpynbDiff
27
27
  end
28
28
 
29
29
  def parse(prefix = '.')
30
+ raise_if_file_ended
31
+
30
32
  skip_whitespaces
31
33
 
32
34
  if (c = current_char) == '"'
@@ -50,6 +52,8 @@ module IpynbDiff
50
52
  current_should_be '['
51
53
 
52
54
  loop do
55
+ raise_if_file_ended
56
+
53
57
  break if skip_beginning(']')
54
58
 
55
59
  new_prefix = "#{prefix}.#{i}"
@@ -68,6 +72,8 @@ module IpynbDiff
68
72
  current_should_be '{'
69
73
 
70
74
  loop do
75
+ raise_if_file_ended
76
+
71
77
  break if skip_beginning('}')
72
78
 
73
79
  prop_name = parse_string(return_value: true)
@@ -97,9 +103,9 @@ module IpynbDiff
97
103
  loop do
98
104
  increment_char_index
99
105
 
100
- break if @char_idx > @chars.length
106
+ raise_if_file_ended
101
107
 
102
- if current_char == '"' && prev_char != '\\'
108
+ if current_char == '"' && !prev_backslash?
103
109
  init_idx += 1
104
110
  break
105
111
  end
@@ -113,11 +119,12 @@ module IpynbDiff
113
119
  end
114
120
 
115
121
  def parse_value
116
- increment_char_index until VALUE_STOPPERS.include?(current_char)
122
+ increment_char_index until raise_if_file_ended || VALUE_STOPPERS.include?(current_char)
117
123
  end
118
124
 
119
125
  def skip_whitespaces
120
126
  while WHITESPACE_CHARS.include?(current_char)
127
+ raise_if_file_ended
121
128
  check_for_new_line
122
129
  increment_char_index
123
130
  end
@@ -133,11 +140,13 @@ module IpynbDiff
133
140
  end
134
141
 
135
142
  def current_char
143
+ raise_if_file_ended
144
+
136
145
  @chars[@char_idx]
137
146
  end
138
147
 
139
- def prev_char
140
- @chars[@char_idx - 1]
148
+ def prev_backslash?
149
+ @chars[@char_idx - 1] == '\\' && @chars[@char_idx - 2] != '\\'
141
150
  end
142
151
 
143
152
  def current_should_be(another_char)
@@ -148,7 +157,13 @@ module IpynbDiff
148
157
  @current_line += 1 if current_char == "\n"
149
158
  end
150
159
 
160
+ def raise_if_file_ended
161
+ @char_idx >= @chars.size && raise(InvalidTokenError)
162
+ end
163
+
151
164
  def skip
165
+ raise_if_file_ended
166
+
152
167
  skip_whitespaces
153
168
 
154
169
  if (c = current_char) == '"'
@@ -164,6 +179,8 @@ module IpynbDiff
164
179
 
165
180
  def skip_array
166
181
  loop do
182
+ raise_if_file_ended
183
+
167
184
  break if skip_beginning(']')
168
185
 
169
186
  skip
@@ -173,6 +190,8 @@ module IpynbDiff
173
190
  def skip_object
174
191
 
175
192
  loop do
193
+ raise_if_file_ended
194
+
176
195
  break if skip_beginning('}')
177
196
 
178
197
  parse_string
data/lib/ipynbdiff.rb CHANGED
@@ -5,18 +5,18 @@ module IpynbDiff
5
5
  require 'transformer'
6
6
  require 'diff'
7
7
 
8
- def self.diff(from, to, raise_if_invalid_nb: false, include_frontmatter: false, diffy_opts: {})
9
- transformer = Transformer.new(include_frontmatter: include_frontmatter)
8
+ def self.diff(from, to, raise_if_invalid_nb: false, include_frontmatter: false, hide_images: false, diffy_opts: {})
9
+ transformer = Transformer.new(include_frontmatter: include_frontmatter, hide_images: hide_images)
10
10
 
11
11
  Diff.new(transformer.transform(from), transformer.transform(to), diffy_opts)
12
12
  rescue InvalidNotebookError
13
13
  raise if raise_if_invalid_nb
14
14
  end
15
15
 
16
- def self.transform(notebook, raise_errors: false, include_frontmatter: true)
16
+ def self.transform(notebook, raise_errors: false, include_frontmatter: true, hide_images: false)
17
17
  return unless notebook
18
18
 
19
- Transformer.new(include_frontmatter: include_frontmatter).transform(notebook).as_text
19
+ Transformer.new(include_frontmatter: include_frontmatter, hide_images: hide_images).transform(notebook).as_text
20
20
  rescue InvalidNotebookError
21
21
  raise if raise_errors
22
22
  end
@@ -6,12 +6,18 @@ module IpynbDiff
6
6
  require 'symbolized_markdown_helper'
7
7
  include SymbolizedMarkdownHelper
8
8
 
9
+ HIDDEN_IMAGE_OUTPUT = ' [Hidden Image Output]'
10
+
9
11
  ORDERED_KEYS = {
10
12
  'execute_result' => %w[image/png image/svg+xml image/jpeg text/markdown text/latex text/plain],
11
13
  'display_data' => %w[image/png image/svg+xml image/jpeg text/markdown text/latex],
12
14
  'stream' => %w[text]
13
15
  }.freeze
14
16
 
17
+ def initialize(hide_images: false)
18
+ @hide_images = hide_images
19
+ end
20
+
15
21
  def transform(output, symbol)
16
22
  transformed = case (output_type = output['output_type'])
17
23
  when 'error'
@@ -52,24 +58,22 @@ module IpynbDiff
52
58
  new_symbol = symbol_prefix / output_type
53
59
  case output_type
54
60
  when 'image/png', 'image/jpeg'
55
- transform_image(output_type, output_element, new_symbol)
61
+ transform_image(output_type + ';base64', output_element, new_symbol)
56
62
  when 'image/svg+xml'
57
- transform_svg(output_element, new_symbol)
63
+ transform_image(output_type + ';utf8', output_element, new_symbol)
58
64
  when 'text/markdown', 'text/latex', 'text/plain', 'text'
59
65
  transform_text(output_element, new_symbol)
60
66
  end
61
67
  end
62
68
 
63
69
  def transform_image(image_type, image_content, symbol)
64
- _(symbol, " ![](data:#{image_type};base64,#{image_content.gsub("\n", '')})")
65
- end
70
+ return _(nil, HIDDEN_IMAGE_OUTPUT) if @hide_images
66
71
 
67
- def transform_svg(image_content, symbol)
68
72
  lines = image_content.is_a?(Array) ? image_content : [image_content]
69
73
 
70
74
  single_line = lines.map(&:strip).join.gsub(/\s+/, ' ')
71
75
 
72
- _(symbol, " ![](data:image/svg+xml;utf8,#{single_line})")
76
+ _(symbol, " ![](data:#{image_type},#{single_line})")
73
77
  end
74
78
 
75
79
  def transform_text(text_content, symbol)
data/lib/transformer.rb CHANGED
@@ -17,9 +17,10 @@ module IpynbDiff
17
17
  @include_frontmatter = true
18
18
  @objects_to_ignore = ['application/javascript', 'application/vnd.holoviews_load.v0+json']
19
19
 
20
- def initialize(include_frontmatter: true)
20
+ def initialize(include_frontmatter: true, hide_images: false)
21
21
  @include_frontmatter = include_frontmatter
22
- @output_transformer = OutputTransformer.new
22
+ @hide_images = hide_images
23
+ @output_transformer = OutputTransformer.new(hide_images: hide_images)
23
24
  end
24
25
 
25
26
  def validate_notebook(notebook)
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.4"
4
+ VERSION = "0.4.7"
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.4
4
+ version: 0.4.7
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-03-07 00:00:00.000000000 Z
11
+ date: 2022-05-16 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: diffy