RUIC 0.4.0 → 0.4.1

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
  SHA1:
3
- metadata.gz: 172da4856dff2f533cc1ed9d3473f843b7021436
4
- data.tar.gz: 101a76825e44c714cfc3493f99eb9f8c8ea4d642
3
+ metadata.gz: b8faba5ee217a4ec85f9986a016652df690681d9
4
+ data.tar.gz: 5759ccdd5bf4f3366d106156c860ea4a8c583a48
5
5
  SHA512:
6
- metadata.gz: ba253c60367dd684ee31e07c0eff9dad75146b269175f9bce99168f01aab16c80f5a1d66cad9c26914892001b1e1b1da60663cd170ef70f25a62ff8c8f80c469
7
- data.tar.gz: 3129ac7e2d073eb79950374296f3e6c67dca6e21df7c5caf85dc9ed6bcee41ea1a0e00cbb630f312a934f501d5f4f0fd73a7d40bac579f6a7f5503b46991d159
6
+ metadata.gz: c33fb1178fe11f5e862368348ed61523bc2fbfb3273c42062a641e91051a4a43ab8b90503728c0ac3f361982ec5891db405ea17c9dc8c8facfde8b590835ebf8
7
+ data.tar.gz: 892b9bac7372753daddec28e41560afbcc75733b7ecdc0ae759605fe6f7795808eec4b048baa1d642f8f7ba7115208a68497f39399a893b963fb0dd471d180cd
data/README.md CHANGED
@@ -1,267 +1,270 @@
1
- # What is RUIC?
2
- RUIC is a Ruby API for reading, analyzing, and manipulating application assets created by NVIDIA's [UI Composer][1]. Among other things, it allows you to:
3
-
4
- * See if an application is missing any assets (e.g. images or meshes) and what parts of the application are looking for those.
5
- * See if there are any files in the application folder that you can delete (e.g. images or materials that are no longer being used).
6
- * Read and modify the attributes of elements on different slides.
7
- * Batch change attributes (e.g. change all usage of one font or color to another).
8
- * Procedurally generate many models with automated placement in your scene.
9
-
10
- _Some of the features above are planned, but not yet implemented; see Known Limitations below._
11
-
12
- ## Table of Contents
13
- * [Installing RUIC](#installing-ruic)
14
- * [Using the RUIC DSL](#using-the-ruic-dsl)
15
- * [Creating and Accessing Applications](#creating-and-accessing-applications)
16
- * [Working with Presentations](#working-with-presentations)
17
- * [Finding Many Assets](#finding-many-assets)
18
- * [Working with References](#working-with-references)
19
- * [Writing Assertions](#writing-assertions)
20
- * [Locating MetaData.xml](#locating-metadataxml)
21
- * [Interactive RUIC](#interactive-ruic)
22
- * [Known Limitations (aka TODO)](#known-limitations-aka-todo)
23
- * [History](#history)
24
- * [License & Contact](#license--contact)
25
-
26
-
27
-
28
- # Installing RUIC
29
- RUIC can be installed via RubyGems (part of Ruby) via the command:
30
-
31
- gem install ruic # May need `sudo gem install ruic` depending on your setup
32
-
33
- Although RUIC is a pure-Ruby library, it relies on [Nokogiri][2] for all the XML processing and manipulation. Installing RUIC will also automatically install Nokogiri, which may require some compilation.
34
-
35
-
36
-
37
- # Using the RUIC DSL
38
-
39
- RUIC scripts are pure Ruby with a few convenience methods added. You run them via the `ruic` command-line script, e.g.
40
-
41
- ruic myscript.ruic # or .rb extension, for syntax highlighting while editing
42
-
43
-
44
- ## Creating and Accessing Applications
45
- RUIC scripts must start with `uia` commands to load an application and all its assets.
46
- After this you can access the application as `app`:
47
-
48
- ```ruby
49
- uia '../MyApp.uia' # Relative to the ruic script file, or absolute
50
-
51
- show app.file #=> /var/projects/UIC/MyApp/main/MyApp.uia
52
- show app.filename #=> MyApp.uia
53
-
54
- show app.assets.count #=> 7
55
- # You can ask for app.behaviors, app.presentations, app.statemachines, and app.renderplugins
56
- # for arrays of specific asset types
57
- ```
58
-
59
- _The `show` command prints the result; it is simply a nicer alias for `puts`._
60
-
61
- If you need to load multiple applications in the same script, subsequent `uia` commands will create
62
- `app2`, `app3`, etc. for you to use.
63
-
64
- ```ruby
65
- uia '../MyApp.uia' # Available as 'app'
66
- uia '../../v1/MyApp.uia' # Available as 'app2'
67
- ```
68
-
69
-
70
- ## Working with Presentations
71
-
72
- ```ruby
73
- uia '../MyApp.uia'
74
-
75
- main = app.main_presentation # The presentation displayed as the main presentation (regardless of id)
76
- sub = app['#nav'] # You can ask for an asset based on the id in the .uia...
77
- sub = app['Navigation.uip'] # or based on the path to the file (relative to the .uia)
78
-
79
-
80
- car = sub/"Scene.Vehicle.Group.Car" # Find elements in a presentation by presentation path…
81
- car = app/"nav:Scene.Vehicle.Group.Car" # …or absolute application path
82
-
83
- show car.name #=> Car
84
- show car.type #=> Model # Scene, Layer, Camera, Light, Group, Model, Material,
85
- # Image, Behavior, Effect, ReferencedMaterial, Text,
86
- # RenderPlugin, Component, (custom materials)
87
-
88
- show car.component? #=> false # Ask if an element is a component
89
- assert car.component==sub.scene # Ask for the owning component; may be the scene
90
- ```
91
-
92
- ## Finding Many Assets
93
-
94
- ```ruby
95
- uia 'MyApp.uia'
96
- main = app.main_presentation
97
-
98
- every_asset = main.find # Array of matching assets
99
- master_assets = main.find master:true # Test for master/nonmaster
100
- models = main.find type:'Model' # …or based on type
101
- gamecovers = main.find name:'Game Cover' # …or based on name
102
- slide2_assets = main.find slide:2 # …or presence on slide
103
- rectangles = main.find attr:{sourcepath:'#Rectangle'} # …or attribute values
104
-
105
- # Combine tests to get more specific
106
- master_models = main.find type:'Model', master:true
107
- slide2_rects = main.find type:'Model', slide:2, attr:{sourcepath:'#Rectangle'}
108
- nonmaster_s2 = main.find slide:2, master:false
109
- red_materials = main.find type:'Material', attr:{ diffuse:[1,0,0] }
110
-
111
- # You can match values more loosely
112
- pistons = main.find name:/^Piston/ # Regex for batch finding
113
- bottom_row = main.find attr:{position:[nil,-200,nil]} # nil for wildcards in vectors
114
-
115
- # Restrict the search to a sub-tree
116
- group = main/"Scene.Layer.Group"
117
- group_models = group.find type:'Model' # Orig asset is never included
118
- group_models = main.find under:group, type:'Model' # Or use `under` for sub-tree
119
-
120
- # Iterate the results as they are found
121
- main.find type:'Model', name:/^Piston/ do |model, index| # Using the index is optional
122
- show "Model #{index} is named #{model.name}"
123
- end
124
- ```
125
-
126
- Notes:
127
- * `nil` inside an array is a "wildcard" value, allowing you to test only specific values
128
- * Numbers (both in vectors/colors/rotations and float/long values) must only be within `0.001` to match.
129
- * _For example, `attr:{diffuse:[1,0,0]}` will match a color with `diffuse=".9997 0.0003 0"`_
130
- * Results of `find` are always in scene-graph order.
131
-
132
-
133
- ## Working with References
134
-
135
- ```ruby
136
- uia 'MyApp.uia'
137
- mat1 = app/"main:Scene.Layer.Sphere.Material" # A normal UIC Material
138
- mat2 = app/"main:Scene.Layer.Cube.Material" # A normal UIC Material
139
- p mat2.type #=> "Material"
140
- ref = mat2.replace_with_referenced_material # A very specific method :)
141
- p ref.properties['referencedmaterial'].type #=> "ObjectRef"
142
- p ref['referencedmaterial',0].object #=> nil
143
- p ref['referencedmaterial',0].type #=> :absolute
144
- ref['referencedmaterial',0].object = mat1 #=> Sets an absolute reference
145
- ref['referencedmaterial',0].type = :path #=> Use a relative path instead
146
-
147
- # Alternatively, you can omit the .object when setting the reference:
148
- # ref['referencedmaterial',0] = mat1
149
-
150
- mat3 = ref['referencedmaterial',1].object #=> Get the asset pointed to
151
- assert mat1 == mat3 #=> They are the same! It worked!
152
-
153
- app.save_all! #=> Write presentations in place
154
- ```
155
-
156
- ## Writing Assertions
157
-
158
-
159
- ## Locating MetaData.xml
160
- RUIC needs access to a UIC `MetaData.xml` file to understand the properties in the various XML files.
161
- By default RUIC will look in the location specified by `RUIC::DEFAULTMETADATA`, e.g.
162
- `C:/Program Files (x86)/NVIDIA Corporation/UI Composer 8.0/res/DataModelMetadata/en-us/MetaData.xml`
163
-
164
- If this file is in another location, you can tell the script where to find it either:
165
-
166
- * on the command line: `ruic -m path/to/MetaData.xml myscript.ruic`
167
- * in your ruic script: `metadata 'path/to/MetaData.xml' # before any 'app' commands`
168
-
169
-
170
- # Interactive RUIC
171
- In addition to executing a standalone script, RUIC also has a REPL (like IRB) that allows you to
172
- interactively execute and test changes to your application/presentations before saving.
173
- There are two ways to enter interactive mode:
174
-
175
- * If you invoke the `ruic` binary with a `.uia` file as the argument the interpreter will load
176
- the application and enter the REPL:
177
- ```
178
- $ ruic myapp.uia
179
- (RUIC v0.2.2 interactive session; 'quit' or ctrl-d to end)
180
-
181
- uia "test/projects/SimpleScene/SimpleScene.uia"
182
- #=> <UIC::Application 'SimpleScene.uia'>
183
- ```
184
-
185
- * Alternatively, you can have RUIC execute a script and then enter the interactive REPL
186
- by supplying the `-i` command-line switch:
187
- ```
188
- $ ruic -i test/referencematerials.ruic
189
- (RUIC v0.2.2 interactive session; 'quit' or ctrl-d to end)
190
-
191
- app
192
- #=> <UIC::Application 'ReferencedMaterials.uia'>
193
-
194
- cubemat
195
- #=> <asset Material#Material_002>
196
- ```
197
- As shown above, all local variables created by the script continue to be available
198
- in the interactive session.
199
-
200
-
201
- # Known Limitations (aka TODO)
202
- _In decreasing priority…_
203
-
204
- - Report on image assets, their sizes
205
- - Report used assets (and where they are used)
206
- - Report unused assets (in a format suitable for automated destruction)
207
- - Report missing assets (and who was looking for them)
208
- - Gobs more unit tests
209
- - Parse .lua headers (in case one references an image)
210
- - Parse render plugins
211
- - Read/edit animation tracks
212
- - Find all colors, and where they are used
213
- - Visual actions for State Machines
214
- - Create new presentation assets (e.g. add a new sphere)
215
- - Modify the scene graph of presentations
216
- - Create new presentations/applications from code
217
- - Report on image asset file formats (e.g. find PNGs, find DXT1 vs DXT3 vs DXT Luminance…)
218
-
219
-
220
- # History
221
-
222
- ## v0.3.0 - 2014-Nov-10
223
- * Switch attribute filtering to use `attr:{ }` instead of `attributes:{ }`
224
- * Attribute matching now requires that a requested attribute be present, or else the asset matching fails.
225
- * _For example, `main.find attr:{ diffusecolor:[nil,nil,nil] }` will now only find assets with a `diffusecolor` attribute._
226
-
227
- ## v0.2.5 - 2014-Nov-10
228
- * Re-adds blank line after REPL result.
229
-
230
- ## v0.2.4 - 2014-Nov-10
231
- * Fix bug with history editing in REPL (prompts no longer have a blank line before)
232
- * Add temporary hack to make projects using Float2 load correctly
233
-
234
- ## v0.2.3 - 2014-Nov-7
235
- * Cleaner mechanism for creating a truly blank binding
236
-
237
- ## v0.2.2 - 2014-Nov-7
238
- * REPL shows version number when it starts
239
-
240
- ## v0.2.1 - 2014-Nov-7
241
- * REPL mode after script maintains binding of script (all local variables remain available)
242
- * Customized `.irbrc` files will not cause warnings
243
-
244
- ## v0.2.0 - 2014-Nov-7
245
- * Add Presentation#save_as
246
- * REPL working directory is same as .uia
247
-
248
- ## v0.1.0 - 2014-Nov-7
249
- * Add REPL mode for ruic binary
250
-
251
- ## v0.0.1 - 2014-Nov-7
252
- * Initial gem release
253
- * Crawl presentations and modify attributes
254
- * Batch find assets
255
- * Save presentation changes back to disk
256
-
257
-
258
-
259
- # License & Contact
260
- RUIC is copyright ©2014 by Gavin Kistner and is licensed under the [MIT License][3]. See the `LICENSE` file for more details.
261
-
262
- For bugs or feature requests please open [issues on GitHub][4]. For other communication you can [email the author directly](mailto:!@phrogz.net?subject=RUIC).
263
-
264
- [1]: http://uicomposer.nvidia.com
265
- [2]: http://nokogiri.org
266
- [3]: http://opensource.org/licenses/MIT
267
- [4]: https://github.com/Phrogz/RUIC/issues
1
+ # What is RUIC?
2
+ RUIC is a Ruby API for reading, analyzing, and manipulating application assets created by NVIDIA's [UI Composer][1]. Among other things, it allows you to:
3
+
4
+ * See if an application is missing any assets (e.g. images or meshes) and what parts of the application are looking for those.
5
+ * See if there are any files in the application folder that you can delete (e.g. images or materials that are no longer being used).
6
+ * Read and modify the attributes of elements on different slides.
7
+ * Batch change attributes (e.g. change all usage of one font or color to another).
8
+ * Procedurally generate many models with automated placement in your scene.
9
+
10
+ _Some of the features above are planned, but not yet implemented; see Known Limitations below._
11
+
12
+ ## Table of Contents
13
+ * [Installing RUIC](#installing-ruic)
14
+ * [Using the RUIC DSL](#using-the-ruic-dsl)
15
+ * [Creating and Accessing Applications](#creating-and-accessing-applications)
16
+ * [Working with Presentations](#working-with-presentations)
17
+ * [Finding Many Assets](#finding-many-assets)
18
+ * [Working with References](#working-with-references)
19
+ * [Writing Assertions](#writing-assertions)
20
+ * [Locating MetaData.xml](#locating-metadataxml)
21
+ * [Interactive RUIC](#interactive-ruic)
22
+ * [Known Limitations (aka TODO)](#known-limitations-aka-todo)
23
+ * [History](#history)
24
+ * [License & Contact](#license--contact)
25
+
26
+
27
+
28
+ # Installing RUIC
29
+ RUIC can be installed via RubyGems (part of Ruby) via the command:
30
+
31
+ gem install ruic # May need `sudo gem install ruic` depending on your setup
32
+
33
+ Although RUIC is a pure-Ruby library, it relies on [Nokogiri][2] for all the XML processing and manipulation. Installing RUIC will also automatically install Nokogiri, which may require some compilation.
34
+
35
+
36
+
37
+ # Using the RUIC DSL
38
+
39
+ RUIC scripts are pure Ruby with a few convenience methods added. You run them via the `ruic` command-line script, e.g.
40
+
41
+ ruic myscript.ruic # or .rb extension, for syntax highlighting while editing
42
+
43
+
44
+ ## Creating and Accessing Applications
45
+ RUIC scripts must start with `uia` commands to load an application and all its assets.
46
+ After this you can access the application as `app`:
47
+
48
+ ```ruby
49
+ uia '../MyApp.uia' # Relative to the ruic script file, or absolute
50
+
51
+ show app.file #=> /var/projects/UIC/MyApp/main/MyApp.uia
52
+ show app.filename #=> MyApp.uia
53
+
54
+ show app.assets.count #=> 7
55
+ # You can ask for app.behaviors, app.presentations, app.statemachines, and app.renderplugins
56
+ # for arrays of specific asset types
57
+ ```
58
+
59
+ _The `show` command prints the result; it is simply a nicer alias for `puts`._
60
+
61
+ If you need to load multiple applications in the same script, subsequent `uia` commands will create
62
+ `app2`, `app3`, etc. for you to use.
63
+
64
+ ```ruby
65
+ uia '../MyApp.uia' # Available as 'app'
66
+ uia '../../v1/MyApp.uia' # Available as 'app2'
67
+ ```
68
+
69
+
70
+ ## Working with Presentations
71
+
72
+ ```ruby
73
+ uia '../MyApp.uia'
74
+
75
+ main = app.main_presentation # The presentation displayed as the main presentation (regardless of id)
76
+ sub = app['#nav'] # You can ask for an asset based on the id in the .uia...
77
+ sub = app['Navigation.uip'] # or based on the path to the file (relative to the .uia)
78
+
79
+
80
+ car = sub/"Scene.Vehicle.Group.Car" # Find elements in a presentation by presentation path…
81
+ car = app/"nav:Scene.Vehicle.Group.Car" # …or absolute application path
82
+
83
+ show car.name #=> Car
84
+ show car.type #=> Model # Scene, Layer, Camera, Light, Group, Model, Material,
85
+ # Image, Behavior, Effect, ReferencedMaterial, Text,
86
+ # RenderPlugin, Component, (custom materials)
87
+
88
+ show car.component? #=> false # Ask if an element is a component
89
+ assert car.component==sub.scene # Ask for the owning component; may be the scene
90
+ ```
91
+
92
+ ## Finding Many Assets
93
+
94
+ ```ruby
95
+ uia 'MyApp.uia'
96
+ main = app.main_presentation
97
+
98
+ every_asset = main.find # Array of matching assets
99
+ master_assets = main.find _master:true # Test for master/nonmaster
100
+ models = main.find _type:'Model' # …or based on type
101
+ slide2_assets = main.find _slide:2 # …or presence on slide
102
+ rectangles = main.find sourcepath:'#Rectangle' # …or attribute values
103
+ gamecovers = main.find name:'Game Cover' # …including the name
104
+
105
+ # Combine tests to get more specific
106
+ master_models = main.find _type:'Model', _master:true
107
+ slide2_rects = main.find _type:'Model', _slide:2, sourcepath:'#Rectangle'
108
+ nonmaster_s2 = main.find _slide:2, _master:false
109
+ red_materials = main.find _type:'Material', diffuse:[1,0,0]
110
+
111
+ # You can match values more loosely
112
+ pistons = main.find name:/^Piston/ # Regex for batch finding
113
+ bottom_row = main.find position:[nil,-200,nil] # nil for wildcards in vectors
114
+
115
+ # Restrict the search to a sub-tree
116
+ group = main/"Scene.Layer.Group"
117
+ group_models = group.find _type:'Model' # Orig asset is never included
118
+ group_models = main.find _under:group, _type:'Model' # Or, use `_under` to limit
119
+
120
+ # Iterate the results as they are found
121
+ main.find _type:'Model', name:/^Piston/ do |model, index| # Using the index is optional
122
+ show "Model #{index} is named #{model.name}"
123
+ end
124
+ ```
125
+
126
+ Notes:
127
+ * `nil` inside an array is a "wildcard" value, allowing you to test only specific values
128
+ * Numbers (both in vectors/colors/rotations and float/long values) must only be within `0.001` to match.
129
+ * _For example, `attr:{diffuse:[1,0,0]}` will match a color with `diffuse=".9997 0.0003 0"`_
130
+ * Results of `find` are always in scene-graph order.
131
+
132
+
133
+ ## Working with References
134
+
135
+ ```ruby
136
+ uia 'MyApp.uia'
137
+ mat1 = app/"main:Scene.Layer.Sphere.Material" # A normal UIC Material
138
+ mat2 = app/"main:Scene.Layer.Cube.Material" # A normal UIC Material
139
+ p mat2.type #=> "Material"
140
+ ref = mat2.replace_with_referenced_material # A very specific method :)
141
+ p ref.properties['referencedmaterial'].type #=> "ObjectRef"
142
+ p ref['referencedmaterial',0].object #=> nil
143
+ p ref['referencedmaterial',0].type #=> :absolute
144
+ ref['referencedmaterial',0].object = mat1 #=> Sets an absolute reference
145
+ ref['referencedmaterial',0].type = :path #=> Use a relative path instead
146
+
147
+ # Alternatively, you can omit the .object when setting the reference:
148
+ # ref['referencedmaterial',0] = mat1
149
+
150
+ mat3 = ref['referencedmaterial',1].object #=> Get the asset pointed to
151
+ assert mat1 == mat3 #=> They are the same! It worked!
152
+
153
+ app.save_all! #=> Write presentations in place
154
+ ```
155
+
156
+ ## Writing Assertions
157
+
158
+
159
+ ## Locating MetaData.xml
160
+ RUIC needs access to a UIC `MetaData.xml` file to understand the properties in the various XML files.
161
+ By default RUIC will look in the location specified by `RUIC::DEFAULTMETADATA`, e.g.
162
+ `C:/Program Files (x86)/NVIDIA Corporation/UI Composer 8.0/res/DataModelMetadata/en-us/MetaData.xml`
163
+
164
+ If this file is in another location, you can tell the script where to find it either:
165
+
166
+ * on the command line: `ruic -m path/to/MetaData.xml myscript.ruic`
167
+ * in your ruic script: `metadata 'path/to/MetaData.xml' # before any 'app' commands`
168
+
169
+
170
+ # Interactive RUIC
171
+ In addition to executing a standalone script, RUIC also has a REPL (like IRB) that allows you to
172
+ interactively execute and test changes to your application/presentations before saving.
173
+ There are two ways to enter interactive mode:
174
+
175
+ * If you invoke the `ruic` binary with a `.uia` file as the argument the interpreter will load
176
+ the application and enter the REPL:
177
+ ```
178
+ $ ruic myapp.uia
179
+ (RUIC v0.2.2 interactive session; 'quit' or ctrl-d to end)
180
+
181
+ uia "test/projects/SimpleScene/SimpleScene.uia"
182
+ #=> <UIC::Application 'SimpleScene.uia'>
183
+ ```
184
+
185
+ * Alternatively, you can have RUIC execute a script and then enter the interactive REPL
186
+ by supplying the `-i` command-line switch:
187
+ ```
188
+ $ ruic -i test/referencematerials.ruic
189
+ (RUIC v0.2.2 interactive session; 'quit' or ctrl-d to end)
190
+
191
+ app
192
+ #=> <UIC::Application 'ReferencedMaterials.uia'>
193
+
194
+ cubemat
195
+ #=> <asset Material#Material_002>
196
+ ```
197
+ As shown above, all local variables created by the script continue to be available
198
+ in the interactive session.
199
+
200
+
201
+ # Known Limitations (aka TODO)
202
+ _In decreasing priority…_
203
+
204
+ - Report on image assets, their sizes
205
+ - Report used assets (and where they are used)
206
+ - Report unused assets (in a format suitable for automated destruction)
207
+ - Report missing assets (and who was looking for them)
208
+ - Gobs more unit tests
209
+ - Parse .lua headers (in case one references an image)
210
+ - Parse render plugins
211
+ - Read/edit animation tracks
212
+ - Find all colors, and where they are used
213
+ - Visual actions for State Machines
214
+ - Create new presentation assets (e.g. add a new sphere)
215
+ - Modify the scene graph of presentations
216
+ - Create new presentations/applications from code
217
+ - Report on image asset file formats (e.g. find PNGs, find DXT1 vs DXT3 vs DXT Luminance…)
218
+
219
+
220
+ # History
221
+
222
+ ## v0.4.0 - 2014-Nov-11
223
+ * Switch attribute filtering again; now all attributes are inline in the `find()` hash, and the four special keys are prefixed with an underscore: `_type`, `_slide`, `_master`, and `_under`.
224
+
225
+ ## v0.3.0 - 2014-Nov-10
226
+ * Switch attribute filtering to use `attr:{ … }` instead of `attributes:{ … }`
227
+ * Attribute matching now requires that a requested attribute be present, or else the asset matching fails.
228
+ * _For example, `main.find attr:{ diffusecolor:[nil,nil,nil] }` will now only find assets with a `diffusecolor` attribute._
229
+
230
+ ## v0.2.5 - 2014-Nov-10
231
+ * Re-adds blank line after REPL result.
232
+
233
+ ## v0.2.4 - 2014-Nov-10
234
+ * Fix bug with history editing in REPL (prompts no longer have a blank line before)
235
+ * Add temporary hack to make projects using Float2 load correctly
236
+
237
+ ## v0.2.3 - 2014-Nov-7
238
+ * Cleaner mechanism for creating a truly blank binding
239
+
240
+ ## v0.2.2 - 2014-Nov-7
241
+ * REPL shows version number when it starts
242
+
243
+ ## v0.2.1 - 2014-Nov-7
244
+ * REPL mode after script maintains binding of script (all local variables remain available)
245
+ * Customized `.irbrc` files will not cause warnings
246
+
247
+ ## v0.2.0 - 2014-Nov-7
248
+ * Add Presentation#save_as
249
+ * REPL working directory is same as .uia
250
+
251
+ ## v0.1.0 - 2014-Nov-7
252
+ * Add REPL mode for ruic binary
253
+
254
+ ## v0.0.1 - 2014-Nov-7
255
+ * Initial gem release
256
+ * Crawl presentations and modify attributes
257
+ * Batch find assets
258
+ * Save presentation changes back to disk
259
+
260
+
261
+
262
+ # License & Contact
263
+ RUIC is copyright ©2014 by Gavin Kistner and is licensed under the [MIT License][3]. See the `LICENSE` file for more details.
264
+
265
+ For bugs or feature requests please open [issues on GitHub][4]. For other communication you can [email the author directly](mailto:!@phrogz.net?subject=RUIC).
266
+
267
+ [1]: http://uicomposer.nvidia.com
268
+ [2]: http://nokogiri.org
269
+ [3]: http://opensource.org/licenses/MIT
270
+ [4]: https://github.com/Phrogz/RUIC/issues